21#include <wpi/units/frequency.hpp>
22#include <wpi/units/math.hpp>
23#include <wpi/units/time.hpp>
44 std::function<void()> _checkFirmVersFunction;
46 std::map<uint16_t, std::string> _unitStrings{};
49 wpi::units::second_t _lastTimestamp{0_s};
60 std::string signalName,
61 std::function<
void()> checkFirmVersFunction,
62 std::function<std::map<uint16_t, std::string>()>
const &unitsGenerator = {}
64 deviceIdentifier{std::move(deviceIdentifier)},
66 name{std::move(signalName)},
67 _checkFirmVersFunction{std::move(checkFirmVersFunction)},
72 _unitStrings = unitsGenerator();
73 for (
auto &unitString : _unitStrings) {
90 std::span<BaseStatusSignal* const>
signals,
91 double timeoutSeconds);
96 std::span<BaseStatusSignal* const>
signals,
98 double timeoutSeconds);
101 char const *location,
102 wpi::units::second_t timeoutSeconds,
104 std::span<BaseStatusSignal* const>
signals);
106 void RefreshValue(
bool waitForUpdate, wpi::units::second_t timeout,
bool reportError);
117 std::string
const &
GetName()
const {
return name; }
129 std::string
const &
GetUnits()
const {
return units; }
169 if (timestamp.IsValid()) {
171 if (_lastTimestamp != timestamp.GetTime()) {
172 _lastTimestamp = timestamp.GetTime();
234 template <
typename U,
typename U_PER_SEC>
235 requires wpi::units::traits::is_unit_t_v<U> && wpi::units::traits::is_unit_t_v<U_PER_SEC> &&
236 wpi::units::traits::is_convertible_unit_v<
237 typename wpi::units::traits::unit_t_traits<U>::unit_type,
238 wpi::units::compound_unit<typename wpi::units::traits::unit_t_traits<U_PER_SEC>::unit_type, wpi::units::seconds>
243 if (maxLatencySeconds > 0_s && latency > maxLatencySeconds) {
244 latency = maxLatencySeconds;
275 template <std::derived_from<BaseStatusSignal>... Signals>
338 template <std::derived_from<BaseStatusSignal>... Signals>
376 static constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::WaitForAll";
390 template <std::derived_from<BaseStatusSignal>... Signals>
421 template <std::derived_from<BaseStatusSignal>... Signals>
439 static constexpr char kLocation[] =
"ctre::phoenix6::BaseStatusSignal::RefreshAll";
449 template <std::derived_from<BaseStatusSignal>... Signals>
463 if (!signal->GetStatus().IsOK()) {
486 template <std::derived_from<BaseStatusSignal>... Signals>
522 template <
typename T>
529 std::string signalName,
530 std::function<
void()> checkFirmVersFunction,
531 std::function<std::map<uint16_t, std::string>()>
const &unitsGenerator = {}
534 std::move(deviceIdentifier),
535 spn, std::move(signalName),
536 std::move(checkFirmVersFunction),
543 BaseStatusSignal{error}
557 if constexpr(wpi::units::traits::is_unit_t_v<T>) {
578 StatusSignal<T> &
Refresh(
bool reportError =
true)
594 StatusSignal<T> &
WaitForUpdate(wpi::units::second_t timeoutSec,
bool reportError =
true)
609 requires (std::same_as<T, double>)
611 return fabs(
GetValue() - target) <= tolerance;
623 requires (wpi::units::traits::is_unit_t_v<T>)
625 return wpi::units::math::abs(
GetValue() - target) <= tolerance;
653 return [
this]() {
return Refresh().GetValue(); };
656 friend std::ostream &
operator<<(std::ostream &os, StatusSignal<T>
const &data)
658 if constexpr(wpi::units::traits::is_unit_t_v<T>) {
667 std::stringstream ss;
Collection of objects that can report alerts.
Definition Alertable.hpp:109
A collection of timestamps for a received signal.
Definition Timestamp.hpp:123
Class that provides operations to retrieve information about a status signal.
Definition StatusSignal.hpp:39
ctre::phoenix::StatusCode SetUpdateFrequency(wpi::units::hertz_t frequencyHz, wpi::units::second_t timeoutSeconds=100_ms)
Sets the rate at which the device will publish this signal.
Definition StatusSignal.hpp:193
void RefreshValue(bool waitForUpdate, wpi::units::second_t timeout, bool reportError)
static ctre::phoenix::StatusCode WaitForAll(wpi::units::second_t timeoutSeconds, bool reportError, std::span< BaseStatusSignal *const > signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:374
static U GetLatencyCompensatedValue(StatusSignal< U > const &signal, StatusSignal< U_PER_SEC > const &signalSlope, wpi::units::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:240
AllTimestamps const & GetAllTimestamps() const
Gets the timestamps of this signals.
Definition StatusSignal.hpp:135
static ctre::phoenix::StatusCode WaitForAll(wpi::units::second_t timeoutSeconds, bool reportError, Signals &... signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:339
static ctre::phoenix::StatusCode WaitForAll(wpi::units::second_t timeoutSeconds, std::span< BaseStatusSignal *const > signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:306
static std::string Status_GetUnits(uint32_t signal)
static ctre::phoenix::StatusCode RefreshAll(std::span< BaseStatusSignal *const > signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:405
static ctre::phoenix::StatusCode WaitForAllImpl(char const *location, wpi::units::second_t timeoutSeconds, bool reportError, std::span< BaseStatusSignal *const > signals)
std::string const & GetName() const
Gets the name of this signal.
Definition StatusSignal.hpp:117
ctre::phoenix::StatusCode GetStatus() const
Gets the status code of the last time this signal was refreshed.
Definition StatusSignal.hpp:155
wpi::units::hertz_t GetAppliedUpdateFrequency() const
Gets the rate at which the device will publish this signal.
Definition StatusSignal.hpp:207
static bool IsAllGood(Signals const &... signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:450
bool HasUpdated()
Checks whether the signal has been updated since the last check.
Definition StatusSignal.hpp:164
static ctre::phoenix::StatusCode RefreshAll(bool reportError, std::span< BaseStatusSignal *const > signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:437
BaseStatusSignal(ctre::phoenix::StatusCode error)
Definition StatusSignal.hpp:80
static ctre::phoenix::StatusCode SetUpdateFrequencyForAll(wpi::units::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:507
std::string const & GetUnits() const
Gets the units for this signal.
Definition StatusSignal.hpp:129
virtual ~BaseStatusSignal()=0
static ctre::phoenix::StatusCode SetUpdateFrequencyForAll(wpi::units::hertz_t frequencyHz, Signals &... signals)
Sets the update frequency of all specified status signals to the provided common frequency.
Definition StatusSignal.hpp:487
static ctre::phoenix::StatusCode RefreshAll(Signals &... signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:391
static ctre::phoenix::StatusCode WaitForAll(wpi::units::second_t timeoutSeconds, Signals &... signals)
Waits for new data on all provided signals up to timeout.
Definition StatusSignal.hpp:276
static ctre::phoenix::StatusCode RefreshAll(bool reportError, Signals &... signals)
Performs a non-blocking refresh on all provided signals.
Definition StatusSignal.hpp:422
ctre::phoenix::StatusCode Status_SetUpdateFrequency(double frequencyHz, double timeoutSeconds) const
double GetValueAsDouble() const
Gets the value of this signal as a double.
Definition StatusSignal.hpp:123
static ctre::phoenix::StatusCode Status_WaitForAll(std::span< BaseStatusSignal *const > signals, double timeoutSeconds)
static bool IsAllGood(std::span< BaseStatusSignal const *const > signals)
Checks if all signals have an OK error code.
Definition StatusSignal.hpp:460
ctre::phoenix::StatusCode Status_Get(bool bWaitForUpdate, double timeoutSeconds)
Timestamp const & GetTimestamp() const
Gets the most accurate timestamp available for this signal.
Definition StatusSignal.hpp:149
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:57
void UpdateUnits(uint16_t unitsKey)
void RegisterAlerts(AlertableCollection &collection) override
Registers all alerts for this type to the provided collection.
double Status_GetAppliedUpdateFrequency() const
static ctre::phoenix::StatusCode Status_SetUpdateFrequencyForAll(std::span< BaseStatusSignal *const > signals, double frequencyHz, double timeoutSeconds)
Interface for all types that can report a Phoenix alert.
Definition Alertable.hpp:21
Represents a status signal with data of type T, and operations available to retrieve information abou...
Definition StatusSignal.hpp:523
std::string ToString() const
Definition StatusSignal.hpp:665
StatusSignal< T > & Refresh(bool reportError=true)
Refreshes the value of this status signal.
Definition StatusSignal.hpp:578
T GetValue() const
Gets the cached value from this status signal.
Definition StatusSignal.hpp:555
friend std::ostream & operator<<(std::ostream &os, StatusSignal< T > const &data)
Definition StatusSignal.hpp:656
bool IsNear(T target, T tolerance) const
Checks whether the signal is near a target value within the given tolerance.
Definition StatusSignal.hpp:622
StatusSignal< T > & WaitForUpdate(wpi::units::second_t timeoutSec, bool reportError=true)
Waits up to timeoutSec to get the up-to-date status signal value.
Definition StatusSignal.hpp:594
SignalMeasurement< T > GetDataCopy() const
Get a basic data-only container with a copy of the current signal data.
Definition StatusSignal.hpp:635
std::function< T()> AsSupplier()
Returns a lambda that calls Refresh and GetValue on this object.
Definition StatusSignal.hpp:651
bool IsNear(T target, T tolerance) const
Checks whether the signal is near a target value within the given tolerance.
Definition StatusSignal.hpp:608
Information about the timestamp of a signal.
Definition Timestamp.hpp:17
wpi::units::second_t GetLatency() const
Gets the latency of this timestamp compared to now.
Definition Timestamp.hpp:114
The unique identifier for a device.
Definition DeviceIdentifier.hpp:19
Parent class for all devices.
Definition ParentDevice.hpp:25
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:420
Definition ExternalFeedbackConfigs.hpp:17
Definition SpnEnums.hpp:16
Definition ExternalFeedbackConfigs.hpp:16
Definition motor_constants.h:14
Information from a single measurement of a status signal.
Definition SignalMeasurement.hpp:25
T value
The value of the signal.
Definition SignalMeasurement.hpp:33
wpi::units::second_t timestamp
Timestamp of when the data point was taken.
Definition SignalMeasurement.hpp:37
std::string units
The units of the signal measurement.
Definition SignalMeasurement.hpp:41
ctre::phoenix::StatusCode status
Status code response of getting the data.
Definition SignalMeasurement.hpp:45
std::string_view name
The name of the signal.
Definition SignalMeasurement.hpp:29