21#include <units/base.h>
22#include <units/frequency.h>
23#include <units/time.h>
63 std::function<
void()> checkFirmVersFunction
98 double timeoutSeconds);
125 double timeoutSeconds);
136 template <
typename Arr>
139 if (signals.size() < 1)
149 const std::string &network = signals[0]->deviceIdentifier.network;
151 for (
auto signal : signals)
154 if (network != signal->deviceIdentifier.network)
167 for (
auto signal : signals)
169 signal->_checkFirmVersFunction();
173 ctre::phoenix::StatusCode retval = Status_WaitForAll(signals.data(), signals.size(), network.c_str(), timeoutSeconds.to<
double>());
176 if (
false == retval.
IsOK())
189 template <
typename... Signals>
191 std::conjunction<std::is_base_of<BaseStatusSignal, std::remove_reference_t<Signals>>...>
197 template <
typename... Signals>
231 template <
typename... Signals,
typename = std::enable_if_t<is_all_status_signal_v<Signals...>>>
234 return WaitForAll(timeoutSeconds,
268 constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::WaitForAll";
269 return WaitForAllImpl(kLocation, timeoutSeconds, signals);
303 constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::WaitForAll";
304 return WaitForAllImpl(kLocation, timeoutSeconds, signals);
320 template <
typename... Signals,
typename = std::enable_if_t<is_all_status_signal_v<Signals...>>>
323 return RefreshAll(std::array<
BaseStatusSignal *,
sizeof...(Signals)>{(&signals)...});
341 constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::RefreshAll";
342 return WaitForAllImpl(kLocation, 0_s, signals);
361 constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::RefreshAll";
362 return WaitForAllImpl(kLocation, 0_s, signals);
387 template <
typename U,
typename U_PER_SEC>
390 static_assert(units::traits::is_unit_t_v<U>,
"signal must be a unit signal");
391 static_assert(units::traits::is_unit_t_v<U_PER_SEC>,
"signalSlope must be a unit signal");
392 using lhs =
typename units::traits::unit_t_traits<U>::unit_type;
393 using rhs =
typename units::traits::unit_t_traits<U_PER_SEC>::unit_type;
394 static_assert(units::traits::is_convertible_unit_v<lhs, units::compound_unit<rhs, units::seconds>>,
395 "Compensation can only be performed on a signal with its derivative");
397 const U nonCompensatedSignal = signal.
GetValue();
398 const U_PER_SEC changeInSignal = signalSlope.
GetValue();
400 if (maxLatencySeconds > 0_s && latency > maxLatencySeconds) {
401 latency = maxLatencySeconds;
403 return nonCompensatedSignal + (changeInSignal * latency);
412 template <
typename... Signals,
typename = std::enable_if_t<is_all_status_signal_v<Signals...>>>
415 return IsAllGood(std::array<
BaseStatusSignal *,
sizeof...(Signals)>{(&signals)...});
423 static bool IsAllGood(
const std::vector<BaseStatusSignal *> &signals)
425 for (
auto signal : signals)
427 if (!signal->GetStatus().IsOK()) {
440 static bool IsAllGood(
const std::array<BaseStatusSignal *, N> &signals)
442 for (
auto signal : signals)
444 if (!signal->GetStatus().IsOK()) {
466 template <
typename... Signals,
typename = std::enable_if_t<is_all_status_signal_v<Signals...>>>
469 return SetUpdateFrequencyForAll(frequencyHz, std::array<
BaseStatusSignal *,
sizeof...(Signals)>{(&signals)...});
488 return Status_SetUpdateFrequencyForAll(signals.data(), signals.size(), frequencyHz.to<
double>(), 0.100);
508 return Status_SetUpdateFrequencyForAll(signals.data(), signals.size(), frequencyHz.to<
double>(), 0.100);
526 return Status_SetUpdateFrequency(
527 this->deviceIdentifier.
network.c_str(),
528 this->deviceIdentifier.deviceHash,
530 frequencyHz.to<
double>(),
531 timeoutSeconds.to<
double>()
546 return units::frequency::hertz_t{
547 Status_GetAppliedUpdateFrequency(
548 this->deviceIdentifier.
network.c_str(),
549 this->deviceIdentifier.deviceHash,
560 const std::string &
GetName()
const {
return signalName; }
566 const std::string &
GetUnits()
const {
return units; }
611 auto const ×tamp = GetAllTimestamps().GetSystemTimestamp();
612 if (timestamp.IsValid())
615 if (_lastTimestamp != timestamp.GetTime())
617 _lastTimestamp = timestamp.GetTime();
628 template <
typename L>
654 template <
typename T>
657 std::map<uint16_t, std::string> _unitStrings;
660 void RefreshValue(
bool block, units::time::second_t timeout,
bool ReportOnError)
662 _checkFirmVersFunction();
664 this->error = Status_Get(
665 *
this, this->deviceIdentifier.network.c_str(),
666 block, timeout.to<
double>()
669 if (ReportOnError && !(this->error.IsOK()))
671 std::stringstream location;
672 location << this->deviceIdentifier.ToString() <<
" Status Signal " << this->signalName;
682 std::function<
void()> checkFirmVersFunction,
683 std::string signalName
694 std::function<
void()> checkFirmVersFunction,
695 std::function<std::map<uint16_t, std::string>()> mapFiller,
696 std::string signalName
699 _unitStrings{mapFiller()},
702 for (
auto &unitString : _unitStrings) {
703 unitString.second = Status_GetUnits(unitString.first);
709 BaseStatusSignal{error},
718 if (_unitsKey != unitsKey) {
719 auto const it = _unitStrings.find(unitsKey);
720 if (it != _unitStrings.end()) {
722 _unitsKey = unitsKey;
733 if constexpr(units::traits::is_unit_t_v<T>)
735 os << data.GetValue().value() <<
" " << data.GetUnits();
739 os << data.GetValue() <<
" " << data.GetUnits();
745 std::stringstream ss;
760 if constexpr(units::traits::is_unit_t_v<T>)
762 return units::make_unit<T>(this->baseValue);
766 return static_cast<T
>(this->baseValue);
787 RefreshValue(
false, 0_s, ReportOnError);
804 RefreshValue(
true, timeoutSec, ReportOnError);
819 toRet.
value = GetValue();
820 toRet.
status = GetStatus();
821 toRet.
units = GetUnits();
822 toRet.
timestamp = GetTimestamp().GetTime();
833 return [
this]() {
return Refresh().GetValue(); };
CTREXPORT void c_ctre_phoenix_report_error(int isError, int32_t errorCode, int isLVCode, const char *details, const char *location, const char *callStack)
A collection of timestamps for a received signal.
Definition Timestamp.hpp:133
Class that provides operations to retrieve information about a status signal.
Definition StatusSignal.hpp:40
std::string signalName
Definition StatusSignal.hpp:50
units::time::second_t _lastTimestamp
Definition StatusSignal.hpp:54
const AllTimestamps & GetAllTimestamps() const
Get the timestamps of this signals.
Definition StatusSignal.hpp:578
AllTimestamps timestamps
Definition StatusSignal.hpp:47
ctre::phoenix::StatusCode error
Definition StatusSignal.hpp:49
static ctre::phoenix::StatusCode WaitForAll(units::time::second_t timeoutSeconds, const std::vector< BaseStatusSignal * > &signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:265
static ctre::phoenix::StatusCode Status_WaitForAll(BaseStatusSignal *const *signals, size_t count, const char *network, double timeoutSeconds)
Wait for multiple signals to arrive.
uint16_t spn
Definition StatusSignal.hpp:45
static ctre::phoenix::StatusCode SetUpdateFrequencyForAll(units::frequency::hertz_t frequencyHz, Signals &... signals)
Sets the update frequency of all specified status signals to the provided common frequency.
Definition StatusSignal.hpp:467
static std::string Status_GetUnits(uint32_t signal)
Gets signal units.
static bool IsAllGood(Signals &... signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:413
static ctre::phoenix::StatusCode RefreshAll(const std::array< BaseStatusSignal *, N > &signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:358
static ctre::phoenix::StatusCode RefreshAll(Signals &... signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:321
std::string units
Definition StatusSignal.hpp:46
static bool IsAllGood(const std::vector< BaseStatusSignal * > &signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:423
static double Status_GetAppliedUpdateFrequency(const char *canbus, uint32_t deviceHash, uint16_t spn)
ctre::phoenix::StatusCode SetUpdateFrequency(units::frequency::hertz_t frequencyHz, units::time::second_t timeoutSeconds=100_ms)
Sets the rate at which the device will publish this signal.
Definition StatusSignal.hpp:524
ctre::phoenix::StatusCode GetStatus() const
Get the error code from when we last received this signal.
Definition StatusSignal.hpp:598
static ctre::phoenix::StatusCode WaitForAllImpl(const char *location, units::time::second_t timeoutSeconds, const Arr &signals)
Implementation of the WaitForAll API.
Definition StatusSignal.hpp:137
static ctre::phoenix::StatusCode SetUpdateFrequencyForAll(units::frequency::hertz_t frequencyHz, const std::array< BaseStatusSignal *, N > &signals)
Sets the update frequency of all specified status signals to the provided common frequency.
Definition StatusSignal.hpp:506
static U GetLatencyCompensatedValue(StatusSignal< U > &signal, StatusSignal< U_PER_SEC > &signalSlope, units::time::second_t maxLatencySeconds=0.300_s)
Performs latency compensation on signal using the signalSlope and signal's latency to determine the m...
Definition StatusSignal.hpp:388
virtual void UpdateUnits(uint16_t spn)=0
std::function< void()> _checkFirmVersFunction
Definition StatusSignal.hpp:52
bool HasUpdated()
Check whether the signal has been updated since the last check.
Definition StatusSignal.hpp:607
static ctre::phoenix::StatusCode SetUpdateFrequencyForAll(units::frequency::hertz_t frequencyHz, const std::vector< BaseStatusSignal * > &signals)
Sets the update frequency of all specified status signals to the provided common frequency.
Definition StatusSignal.hpp:486
BaseStatusSignal(ctre::phoenix::StatusCode error)
Definition StatusSignal.hpp:74
const std::string & GetUnits() const
Gets the units for this signal.
Definition StatusSignal.hpp:566
static ctre::phoenix::StatusCode WaitForAll(units::time::second_t timeoutSeconds, Signals &... signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:232
static ctre::phoenix::StatusCode Status_SetUpdateFrequency(const char *canbus, uint32_t deviceHash, uint16_t spn, double frequencyHz, double timeoutSeconds)
units::frequency::hertz_t GetAppliedUpdateFrequency() const
Gets the rate at which the device will publish this signal.
Definition StatusSignal.hpp:544
static bool IsAllGood(const std::array< BaseStatusSignal *, N > &signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:440
double baseValue
Definition StatusSignal.hpp:48
const std::string & GetName() const
Gets the name of this signal.
Definition StatusSignal.hpp:560
virtual ~BaseStatusSignal()=0
double GetValueAsDouble() const
Gets the value of this signal as a double.
Definition StatusSignal.hpp:572
hardware::DeviceIdentifier deviceIdentifier
Definition StatusSignal.hpp:44
static ctre::phoenix::StatusCode Status_SetUpdateFrequencyForAll(BaseStatusSignal *const *signals, size_t count, double frequencyHz, double timeoutSeconds)
static ctre::phoenix::StatusCode WaitForAll(units::time::second_t timeoutSeconds, const std::array< BaseStatusSignal *, N > &signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:300
const Timestamp & GetTimestamp() const
Get the most accurate timestamp available for this signal.
Definition StatusSignal.hpp:592
BaseStatusSignal(hardware::DeviceIdentifier deviceIdentifier, uint16_t spn, std::string signalName, std::function< void()> checkFirmVersFunction)
Definition StatusSignal.hpp:59
static ctre::phoenix::StatusCode RefreshAll(const std::vector< BaseStatusSignal * > &signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:338
static ctre::phoenix::StatusCode Status_Get(BaseStatusSignal &signal, const char *network, bool bWaitForUpdate, double timeoutSeconds)
Get signal update.
Represents a status signal with data of type T, and operations available to retrieve information abou...
Definition StatusSignal.hpp:656
friend std::ostream & operator<<(std::ostream &os, const StatusSignal< T > &data)
Definition StatusSignal.hpp:728
std::string ToString() const
Definition StatusSignal.hpp:743
T GetValue() const
Gets the cached value from this status signal.
Definition StatusSignal.hpp:758
void UpdateUnits(uint16_t unitsKey) override
Definition StatusSignal.hpp:716
StatusSignal< T > & Refresh(bool ReportOnError=true)
Refreshes the value of this status signal.
Definition StatusSignal.hpp:785
SignalMeasurement< T > GetDataCopy() const
Get a basic data-only container with this information, to be used for things such as data logging.
Definition StatusSignal.hpp:816
std::function< T()> AsSupplier()
Returns a lambda that calls Refresh and GetValue on this object.
Definition StatusSignal.hpp:831
StatusSignal< T > & WaitForUpdate(units::time::second_t timeoutSec, bool ReportOnError=true)
Waits up to timeoutSec to get the up-to-date status signal value.
Definition StatusSignal.hpp:802
Information about the timestamp of a signal.
Definition Timestamp.hpp:20
units::time::second_t GetLatency() const
Get the latency of this timestamp compared to now.
Definition Timestamp.hpp:115
Definition DeviceIdentifier.hpp:19
std::string network
Definition DeviceIdentifier.hpp:21
Parent class for all devices.
Definition ParentDevice.hpp:28
Status codes reported by APIs, including OK, warnings, and errors.
Definition StatusCodes.h:27
constexpr const char * GetDescription() const
Gets the description of this StatusCode.
Definition StatusCodes.h:1066
static constexpr int InvalidParamValue
An invalid argument was passed into the function/VI, such as a null pointer.
Definition StatusCodes.h:368
constexpr bool IsOK() const
Definition StatusCodes.h:859
constexpr bool IsError() const
Definition StatusCodes.h:851
static constexpr int InvalidNetwork
InvalidNetwork.
Definition StatusCodes.h:636
static constexpr int SigNotUpdated
No new response to update signal.
Definition StatusCodes.h:418
Definition MotionMagicExpoTorqueCurrentFOC.hpp:18
Type trait to verify that all types passed in are subclasses of BaseStatusSignal.
Definition StatusSignal.hpp:192
Information from a single measurement of a status signal.
Definition StatusSignal.hpp:630
std::string units
Units that correspond to this point.
Definition StatusSignal.hpp:646
units::time::second_t timestamp
Timestamp of when the data point was taken.
Definition StatusSignal.hpp:638
L value
The value of the signal.
Definition StatusSignal.hpp:634
ctre::phoenix::StatusCode status
Status code response of getting the data.
Definition StatusSignal.hpp:642