19#include <units/dimensionless.h>
38 template <
typename... Devices>
40 std::conjunction<std::is_base_of<ParentDevice, std::remove_reference_t<Devices>>...>
46 template <
typename... Devices>
50 std::map<uint32_t, std::unique_ptr<BaseStatusSignal>> _signalValues;
51 std::recursive_mutex _signalValuesLck;
56 std::shared_ptr<controls::ControlRequest> _controlReq = std::make_shared<controls::EmptyControl>();
57 std::mutex _controlReqLck;
61 bool _isInitialized =
false;
65 StatusSignal<int> &_compliancy{LookupStatusSignal<int>(ctre::phoenix6::spns::SpnValue::Compliancy_Version,
"Compliancy",
false,
true)};
66 StatusSignal<int> &_resetSignal{LookupStatusSignal<int>(ctre::phoenix6::spns::SpnValue::Startup_ResetFlags,
"ResetFlags",
false,
true)};
68 void ReportIfTooOld();
71 StatusSignal<T> &LookupCommon(uint16_t spn, uint16_t mapper_iter, std::function<std::map<
int, StatusSignal<T>>()> map_filler,
72 std::string signalName,
bool reportOnConstruction,
bool refresh)
76 BaseStatusSignal *toFind;
79 std::lock_guard<std::recursive_mutex> lock{_signalValuesLck};
81 const uint32_t totalHash = spn | ((uint32_t)mapper_iter << 16);
83 auto iter = _signalValues.find(totalHash);
84 if (iter != _signalValues.end())
87 toFind = iter->second.get();
89 reportOnConstruction =
true;
98 _signalValues.emplace(totalHash, std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
100 { ReportIfTooOld(); },
101 std::move(signalName)}});
109 _signalValues.emplace(totalHash, std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
111 { ReportIfTooOld(); },
112 map_filler, std::move(signalName)}});
116 iter = _signalValues.find(totalHash);
117 toFind = iter->second.get();
122 StatusSignal<T> *ret =
dynamic_cast<StatusSignal<T> *
>(toFind);
133 ret->Refresh(reportOnConstruction);
144 _isInitialized =
true;
229 return [resetSignal=_resetSignal]()
mutable {
230 return resetSignal.Refresh(
false).HasUpdated();
243 return LookupStatusSignal<double>((uint16_t)signal,
"Generic",
true, refresh);
291 template <
typename... Devices,
typename = std::enable_if_t<
is_all_device_v<Devices...>>>
377 template <
typename... Devices,
typename = std::enable_if_t<
is_all_device_v<Devices...>>>
411 for (
auto device : devices) {
412 const auto err = device->OptimizeBusUtilization(optimizedFreqHz);
449 for (
auto device : devices) {
450 const auto err = device->OptimizeBusUtilization(optimizedFreqHz);
461 template <
typename T>
464 return LookupCommon<T>(spn, 0,
nullptr, std::move(signalName), reportOnConstruction, refresh);
467 template <
typename T>
470 return LookupCommon<T>(spn, mapper_iter, std::move(map_filler), std::move(signalName), reportOnConstruction, refresh);
474 template <
typename T,
typename U>
477 return StatusSignal<T>{LookupStatusSignal<U>(spn, std::move(signalName),
true, refresh)};
bool HasUpdated()
Check whether the signal has been updated since the last check.
Definition: StatusSignal.hpp:579
StatusSignal< T > & Refresh(bool ReportOnError=true)
Refreshes the value of this status signal.
Definition: StatusSignal.hpp:810
Abstract Control Request class that other control requests extend for use.
Definition: ControlRequest.hpp:29
Generic Empty Control class used to do nothing.
Definition: ControlRequest.hpp:72
Definition: DeviceIdentifier.hpp:19
int deviceID
Definition: DeviceIdentifier.hpp:23
uint32_t deviceHash
Definition: DeviceIdentifier.hpp:24
std::string network
Definition: DeviceIdentifier.hpp:21
Parent class for all devices.
Definition: ParentDevice.hpp:29
static controls::EmptyControl _emptyControl
Definition: ParentDevice.hpp:31
const std::string & GetNetwork() const
Definition: ParentDevice.hpp:163
static constexpr bool is_all_device_v
Whether all types passed in are subclasses of ParentDevice.
Definition: ParentDevice.hpp:47
std::shared_ptr< controls::ControlRequest > GetAppliedControl()
Get the latest applied control.
Definition: ParentDevice.hpp:211
virtual ctre::phoenix::StatusCode SetControlPrivate(controls::ControlRequest &request)
StatusSignal< T > LookupDimensionlessStatusSignal(uint16_t spn, std::string signalName, bool refresh)
Returns a unitless version of the StatusSignal by value.
Definition: ParentDevice.hpp:475
DeviceIdentifier deviceIdentifier
Definition: ParentDevice.hpp:33
StatusSignal< T > & LookupStatusSignal(uint16_t spn, std::string signalName, bool reportOnConstruction, bool refresh)
Definition: ParentDevice.hpp:462
ParentDevice(ParentDevice const &)=delete
std::function< bool()> GetResetOccurredChecker() const
Definition: ParentDevice.hpp:227
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(units::frequency::hertz_t optimizedFreqHz, const std::array< ParentDevice *, N > &devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition: ParentDevice.hpp:446
std::shared_ptr< const controls::ControlRequest > GetAppliedControl() const
Get the latest applied control.
Definition: ParentDevice.hpp:194
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(const std::array< ParentDevice *, N > &devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition: ParentDevice.hpp:347
ctre::phoenix::StatusCode OptimizeBusUtilization(units::frequency::hertz_t optimizedFreqHz=0_Hz, units::time::second_t timeoutSeconds=100_ms)
Optimizes the device's bus utilization by reducing the update frequencies of its status signals.
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(Devices &... devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition: ParentDevice.hpp:292
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(units::frequency::hertz_t optimizedFreqHz, Devices &... devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition: ParentDevice.hpp:378
int GetDeviceID() const
Definition: ParentDevice.hpp:155
ParentDevice(int deviceID, std::string model, std::string canbus)
Definition: ParentDevice.hpp:140
uint64_t GetDeviceHash() const
Gets a number unique for this device's hardware type and ID.
Definition: ParentDevice.hpp:177
virtual ~ParentDevice()=default
bool HasResetOccurred()
Definition: ParentDevice.hpp:219
StatusSignal< T > & LookupStatusSignal(uint16_t spn, uint16_t mapper_iter, std::function< std::map< int, StatusSignal< T > >()> map_filler, std::string signalName, bool reportOnConstruction, bool refresh)
Definition: ParentDevice.hpp:468
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(const std::vector< ParentDevice * > &devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition: ParentDevice.hpp:319
StatusSignal< double > & GetGenericSignal(uint32_t signal, bool refresh=true)
This is a reserved routine for internal testing.
Definition: ParentDevice.hpp:241
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(units::frequency::hertz_t optimizedFreqHz, const std::vector< ParentDevice * > &devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition: ParentDevice.hpp:408
ParentDevice & operator=(ParentDevice const &)=delete
Status codes reported by APIs, including OK, warnings, and errors.
Definition: StatusCodes.h:27
static constexpr int OK
No Error.
Definition: StatusCodes.h:34
static constexpr int InvalidParamValue
An invalid argument was passed into the function/VI, such as a null pointer.
Definition: StatusCodes.h:368
static constexpr int CouldNotRetrieveV6Firmware
Device firmware could not be retrieved.
Definition: StatusCodes.h:717
constexpr bool IsOK() const
Definition: StatusCodes.h:855
CTREXPORT double GetCurrentTimeSeconds()
Get the current timestamp in seconds.
Represents the state of one swerve module.
Definition: StatusCodes.h:18
Type trait to verify that all types passed in are subclasses of ParentDevice.
Definition: ParentDevice.hpp:41