21#include <units/frequency.h>
22#include <units/math.h>
23#include <units/time.h>
44 std::function<void()> _checkFirmVersFunction;
46 std::map<uint16_t, std::string> _unitStrings{};
49 units::time::second_t _lastTimestamp{0_s};
60 std::string signalName,
61 std::function<
void()> checkFirmVersFunction
63 deviceIdentifier{std::move(deviceIdentifier)},
65 name{std::move(signalName)},
66 _checkFirmVersFunction{std::move(checkFirmVersFunction)},
75 std::string signalName,
76 std::function<
void()> checkFirmVersFunction,
77 std::function<std::map<uint16_t, std::string>()>
const &unitsGenerator
79 deviceIdentifier{std::move(deviceIdentifier)},
81 name{std::move(signalName)},
82 _checkFirmVersFunction{std::move(checkFirmVersFunction)},
83 _unitStrings{unitsGenerator()},
87 for (
auto &unitString : _unitStrings) {
94 deviceIdentifier{hardware::DeviceIdentifier{}},
97 _checkFirmVersFunction{[] {}},
109 double timeoutSeconds);
111 std::span<BaseStatusSignal* const> signals,
113 double timeoutSeconds);
120 double timeoutSeconds);
122 std::span<BaseStatusSignal* const> signals,
124 double timeoutSeconds);
128 char const *location,
129 units::time::second_t timeoutSeconds,
130 std::span<BaseStatusSignal* const> signals);
132 void RefreshValue(
bool waitForUpdate, units::time::second_t timeout,
bool ReportOnError);
143 std::string
const &
GetName()
const {
return name; }
149 std::string
const &
GetUnits()
const {
return units; }
194 auto const ×tamp = GetAllTimestamps().GetSystemTimestamp();
195 if (timestamp.IsValid()) {
197 if (_lastTimestamp != timestamp.GetTime()) {
198 _lastTimestamp = timestamp.GetTime();
221 return Status_SetUpdateFrequency(
222 this->deviceIdentifier.
network.c_str(),
223 this->deviceIdentifier.deviceHash,
225 frequencyHz.to<
double>(),
226 timeoutSeconds.to<
double>()
241 return units::frequency::hertz_t{
242 Status_GetAppliedUpdateFrequency(
243 this->deviceIdentifier.
network.c_str(),
244 this->deviceIdentifier.deviceHash,
272 template <
typename U,
typename U_PER_SEC>
273 requires units::traits::is_unit_t_v<U> && units::traits::is_unit_t_v<U_PER_SEC> &&
274 units::traits::is_convertible_unit_v<
275 typename units::traits::unit_t_traits<U>::unit_type,
276 units::compound_unit<typename units::traits::unit_t_traits<U_PER_SEC>::unit_type, units::seconds>
280 U
const nonCompensatedSignal = signal.
GetValue();
281 U_PER_SEC
const changeInSignal = signalSlope.
GetValue();
283 if (maxLatencySeconds > 0_s && latency > maxLatencySeconds) {
284 latency = maxLatencySeconds;
286 return nonCompensatedSignal + (changeInSignal * latency);
317 template <std::derived_from<BaseStatusSignal>... Signals>
356 constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::WaitForAll";
357 return WaitForAllImpl(kLocation, timeoutSeconds, signals);
373 template <std::derived_from<BaseStatusSignal>... Signals>
376 return RefreshAll(std::array<
BaseStatusSignal *,
sizeof...(Signals)>{(&signals)...});
394 constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::RefreshAll";
395 return WaitForAllImpl(kLocation, 0_s, signals);
404 template <std::derived_from<BaseStatusSignal>... Signals>
407 return IsAllGood(std::array<
BaseStatusSignal const *,
sizeof...(Signals)>{(&signals)...});
415 static bool IsAllGood(std::span<BaseStatusSignal const *const> signals)
417 for (
auto signal : signals) {
418 if (!signal->GetStatus().IsOK()) {
441 template <std::derived_from<BaseStatusSignal>... Signals>
444 return SetUpdateFrequencyForAll(frequencyHz, std::array<
BaseStatusSignal *,
sizeof...(Signals)>{(&signals)...});
464 return Status_SetUpdateFrequencyForAll(signals, frequencyHz.to<
double>(), 0.100);
473 template <
typename T>
480 std::string signalName,
481 std::function<
void()> checkFirmVersFunction
484 std::move(deviceIdentifier),
485 spn, std::move(signalName),
486 std::move(checkFirmVersFunction)
494 std::string signalName,
495 std::function<
void()> checkFirmVersFunction,
496 std::function<std::map<uint16_t, std::string>()>
const &unitsGenerator
499 std::move(deviceIdentifier),
500 spn, std::move(signalName),
501 std::move(checkFirmVersFunction),
509 BaseStatusSignal{error}
524 if constexpr(units::traits::is_unit_t_v<T>) {
525 return units::make_unit<T>(this->baseValue);
527 return static_cast<T
>(this->baseValue);
548 RefreshValue(
false, 0_s, ReportOnError);
565 RefreshValue(
true, timeoutSec, ReportOnError);
578 requires (std::same_as<T, double>)
580 return fabs(GetValue() - target) <= tolerance;
592 requires (units::traits::is_unit_t_v<T>)
594 return units::math::abs(GetValue() - target) <= tolerance;
607 toRet.
name = GetName();
608 toRet.
value = GetValue();
609 toRet.
timestamp = GetTimestamp().GetTime();
610 toRet.
units = GetUnits();
611 toRet.
status = GetStatus();
622 return [
this]() {
return Refresh().GetValue(); };
630 if constexpr(units::traits::is_unit_t_v<T>) {
631 os << data.GetValue().value() <<
" " << data.GetUnits();
633 os << data.GetValue() <<
" " << data.GetUnits();
639 std::stringstream ss;
A collection of timestamps for a received signal.
Definition Timestamp.hpp:125
Class that provides operations to retrieve information about a status signal.
Definition StatusSignal.hpp:39
AllTimestamps timestamps
Definition StatusSignal.hpp:54
AllTimestamps const & GetAllTimestamps() const
Gets the timestamps of this signals.
Definition StatusSignal.hpp:161
ctre::phoenix::StatusCode error
Definition StatusSignal.hpp:55
static std::string Status_GetUnits(uint32_t signal)
static double Status_GetAppliedUpdateFrequency(char const *canbus, uint32_t deviceHash, uint16_t spn)
static ctre::phoenix::StatusCode RefreshAll(std::span< BaseStatusSignal *const > signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:391
static ctre::phoenix::StatusCode Status_SetUpdateFrequency(char const *canbus, uint32_t deviceHash, uint16_t spn, double frequencyHz, double timeoutSeconds)
std::string units
Definition StatusSignal.hpp:52
static ctre::phoenix::StatusCode SetUpdateFrequencyForAll(units::frequency::hertz_t frequencyHz, std::span< BaseStatusSignal *const > signals)
Sets the update frequency of all specified status signals to the provided common frequency.
Definition StatusSignal.hpp:462
std::string const & GetName() const
Gets the name of this signal.
Definition StatusSignal.hpp:143
BaseStatusSignal(hardware::DeviceIdentifier deviceIdentifier, uint16_t spn, std::string signalName, std::function< void()> checkFirmVersFunction, std::function< std::map< uint16_t, std::string >()> const &unitsGenerator)
Definition StatusSignal.hpp:72
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:219
ctre::phoenix::StatusCode GetStatus() const
Gets the error code from when we last received this signal.
Definition StatusSignal.hpp:181
void RefreshValue(bool waitForUpdate, units::time::second_t timeout, bool ReportOnError)
static ctre::phoenix::StatusCode WaitForAll(units::time::second_t timeoutSeconds, std::span< BaseStatusSignal *const > signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:353
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:318
static ctre::phoenix::StatusCode Status_Get(BaseStatusSignal &signal, char const *network, bool bWaitForUpdate, double timeoutSeconds)
static bool IsAllGood(Signals const &... signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:405
bool HasUpdated()
Checks whether the signal has been updated since the last check.
Definition StatusSignal.hpp:190
BaseStatusSignal(ctre::phoenix::StatusCode error)
Definition StatusSignal.hpp:93
units::frequency::hertz_t GetAppliedUpdateFrequency() const
Gets the rate at which the device will publish this signal.
Definition StatusSignal.hpp:239
double baseValue
Definition StatusSignal.hpp:53
std::string const & GetUnits() const
Gets the units for this signal.
Definition StatusSignal.hpp:149
static U GetLatencyCompensatedValue(StatusSignal< U > const &signal, StatusSignal< U_PER_SEC > const &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:278
virtual ~BaseStatusSignal()=0
static ctre::phoenix::StatusCode Status_WaitForAll(std::span< BaseStatusSignal *const > signals, char const *network, double timeoutSeconds)
static ctre::phoenix::StatusCode RefreshAll(Signals &... signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:374
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:442
double GetValueAsDouble() const
Gets the value of this signal as a double.
Definition StatusSignal.hpp:155
static bool IsAllGood(std::span< BaseStatusSignal const *const > signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:415
Timestamp const & GetTimestamp() const
Gets the most accurate timestamp available for this signal.
Definition StatusSignal.hpp:175
BaseStatusSignal(hardware::DeviceIdentifier deviceIdentifier, uint16_t spn, std::string signalName, std::function< void()> checkFirmVersFunction)
Definition StatusSignal.hpp:57
void UpdateUnits(uint16_t unitsKey)
static ctre::phoenix::StatusCode Status_SetUpdateFrequencyForAll(std::span< BaseStatusSignal *const > signals, double frequencyHz, double timeoutSeconds)
static ctre::phoenix::StatusCode WaitForAllImpl(char const *location, units::time::second_t timeoutSeconds, std::span< BaseStatusSignal *const > signals)
Represents a status signal with data of type T, and operations available to retrieve information abou...
Definition StatusSignal.hpp:474
std::string ToString() const
Definition StatusSignal.hpp:637
T GetValue() const
Gets the cached value from this status signal.
Definition StatusSignal.hpp:522
friend std::ostream & operator<<(std::ostream &os, StatusSignal< T > const &data)
Definition StatusSignal.hpp:625
StatusSignal< T > & Refresh(bool ReportOnError=true)
Refreshes the value of this status signal.
Definition StatusSignal.hpp:546
SignalMeasurement< T > GetDataCopy() const
Get a basic data-only container with a copy of the current signal data.
Definition StatusSignal.hpp:604
bool IsNear(T target, T tolerance) const
Checks whether the signal is near a target value within the given tolerance.
Definition StatusSignal.hpp:591
std::function< T()> AsSupplier()
Returns a lambda that calls Refresh and GetValue on this object.
Definition StatusSignal.hpp:620
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:563
bool IsNear(T target, T tolerance) const
Checks whether the signal is near a target value within the given tolerance.
Definition StatusSignal.hpp:577
Information about the timestamp of a signal.
Definition Timestamp.hpp:17
units::time::second_t GetLatency() const
Get the latency of this timestamp compared to now.
Definition Timestamp.hpp:107
Definition DeviceIdentifier.hpp:16
std::string network
Definition DeviceIdentifier.hpp:18
Parent class for all devices.
Definition ParentDevice.hpp:23
Status codes reported by APIs, including OK, warnings, and errors.
Definition StatusCodes.h:28
static constexpr int SigNotUpdated
No new response to update signal.
Definition StatusCodes.h:419
Definition motor_constants.h:14
Information from a single measurement of a status signal.
Definition SignalMeasurement.hpp:20
T value
The value of the signal.
Definition SignalMeasurement.hpp:28
std::string units
The units of the signal measurement.
Definition SignalMeasurement.hpp:36
ctre::phoenix::StatusCode status
Status code response of getting the data.
Definition SignalMeasurement.hpp:40
units::time::second_t timestamp
Timestamp of when the data point was taken.
Definition SignalMeasurement.hpp:32
std::string_view name
The name of the signal.
Definition SignalMeasurement.hpp:24