30 std::map<uint32_t, std::unique_ptr<BaseStatusSignal>> _signalValues;
31 std::recursive_mutex _signalValuesLck;
36 std::shared_ptr<controls::ControlRequest> _controlReq = std::make_shared<controls::EmptyControl>();
37 std::mutex _controlReqLck;
39 struct FirmwareVersChecker {
51 void ReportIfTooOld();
54 std::shared_ptr<FirmwareVersChecker> _versChecker;
59 uint16_t spn, std::string signalName,
60 std::function<std::map<uint16_t, std::string>()> mapFiller,
61 bool reportOnConstruction,
bool refresh)
65 BaseStatusSignal *toFind;
68 std::lock_guard<std::recursive_mutex> lock{_signalValuesLck};
71 auto iter = _signalValues.find(spn);
72 if (iter != _signalValues.end()) {
74 toFind = iter->second.get();
76 reportOnConstruction =
true;
80 _signalValues.emplace(spn,
81 std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
83 std::move(signalName),
84 [versChecker=_versChecker]()
mutable {
85 versChecker->ReportIfTooOld();
90 _signalValues.emplace(spn,
91 std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
93 std::move(signalName),
94 [versChecker=_versChecker]()
mutable {
95 versChecker->ReportIfTooOld();
103 iter = _signalValues.find(spn);
104 toFind = iter->second.get();
109 StatusSignal<T> *ret =
dynamic_cast<StatusSignal<T> *
>(toFind);
111 if (ret ==
nullptr) {
117 ret->Refresh(reportOnConstruction);
199 return _resetSignal.
Refresh(
false).HasUpdated();
207 return [resetSignal=_resetSignal]()
mutable {
208 return resetSignal.Refresh(
false).HasUpdated();
221 bool IsConnected(units::second_t maxLatencySeconds = 500_ms)
final
223 return _versChecker->_compliancy.Refresh(
false).GetTimestamp().GetLatency() <= maxLatencySeconds;
286 template <std::derived_from<traits::CommonDevice>... Devices>
347 template <std::derived_from<traits::CommonDevice>... Devices>
382 for (
auto device : devices) {
383 auto const err = device->OptimizeBusUtilization(optimizedFreqHz);
415 template <std::derived_from<traits::CommonDevice>... Devices>
436 for (
auto device : devices) {
437 auto const err = device->ResetSignalFrequencies();
448 template <
typename T>
451 return LookupCommon<T>(spn, std::move(signalName),
nullptr, reportOnConstruction, refresh);
454 template <
typename T>
457 return LookupCommon<T>(spn, std::move(signalName), std::move(mapFiller), reportOnConstruction, refresh);
Class for getting information about an available CAN bus.
Definition CANBus.hpp:19
Represents a status signal with data of type T, and operations available to retrieve information abou...
Definition StatusSignal.hpp:567
StatusSignal< T > & Refresh(bool reportError=true)
Refreshes the value of this status signal.
Definition StatusSignal.hpp:638
Common interface implemented by all control requests.
Definition ControlRequest.hpp:27
Generic Empty Control class used to do nothing.
Definition ControlRequest.hpp:65
The unique identifier for a device.
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:23
virtual ctre::phoenix::StatusCode SetControlPrivate(controls::ControlRequest const &request)
CANBus GetNetwork() const final
Definition ParentDevice.hpp:141
StatusSignal< T > & LookupStatusSignal(uint16_t spn, std::string signalName, std::function< std::map< uint16_t, std::string >()> mapFiller, bool reportOnConstruction, bool refresh)
Definition ParentDevice.hpp:455
static ctre::phoenix::StatusCode ResetSignalFrequenciesForAll(Devices &... devices)
Resets the update frequencies of all the devices' status signals to the defaults.
Definition ParentDevice.hpp:416
DeviceIdentifier deviceIdentifier
Definition ParentDevice.hpp:27
uint64_t GetDeviceHash() const final
Gets a number unique for this device's hardware type and ID.
Definition ParentDevice.hpp:155
StatusSignal< T > & LookupStatusSignal(uint16_t spn, std::string signalName, bool reportOnConstruction, bool refresh)
Definition ParentDevice.hpp:449
ParentDevice(ParentDevice const &)=delete
bool IsConnected(units::second_t maxLatencySeconds=500_ms) final
Returns whether the device is still connected to the robot.
Definition ParentDevice.hpp:221
ctre::phoenix::StatusCode ResetSignalFrequencies(units::time::second_t timeoutSeconds=100_ms) final
Resets the update frequencies of all the device's status signals to the defaults.
static ctre::phoenix::StatusCode ResetSignalFrequenciesForAll(std::span< traits::CommonDevice *const > devices)
Resets the update frequencies of all the devices' status signals to the defaults.
Definition ParentDevice.hpp:433
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:287
static constexpr controls::EmptyControl _emptyControl
Definition ParentDevice.hpp:25
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(std::span< traits::CommonDevice *const > devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition ParentDevice.hpp:316
virtual ~ParentDevice()=0
static ctre::phoenix::StatusCode OptimizeBusUtilizationForAll(units::frequency::hertz_t optimizedFreqHz, std::span< traits::CommonDevice *const > devices)
Optimizes the bus utilization of the provided devices by reducing the update frequencies of their sta...
Definition ParentDevice.hpp:379
int GetDeviceID() const final
Definition ParentDevice.hpp:133
ParentDevice(int deviceID, std::string model, CANBus canbus)
ctre::phoenix::StatusCode OptimizeBusUtilization(units::frequency::hertz_t optimizedFreqHz=4_Hz, units::time::second_t timeoutSeconds=100_ms) final
Optimizes the device's bus utilization by reducing the update frequencies of its status signals.
std::function< bool()> GetResetOccurredChecker() const final
Definition ParentDevice.hpp:205
std::shared_ptr< controls::ControlRequest const > GetAppliedControl() const final
Get the latest applied control.
Definition ParentDevice.hpp:172
StatusSignal< double > & GetGenericSignal(uint32_t signal, bool refresh=true)
This is a reserved routine for internal testing.
Definition ParentDevice.hpp:233
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:348
std::shared_ptr< controls::ControlRequest > GetAppliedControl() final
Get the latest applied control.
Definition ParentDevice.hpp:189
ParentDevice & operator=(ParentDevice const &)=delete
bool HasResetOccurred() final
Definition ParentDevice.hpp:197
Contains everything common between Phoenix 6 devices.
Definition CommonDevice.hpp:23
Status codes reported by APIs, including OK, warnings, and errors.
Definition StatusCodes.h:28
static constexpr int OK
No Error.
Definition StatusCodes.h:35
static constexpr int InvalidParamValue
An invalid argument was passed into the function/VI, such as a null pointer.
Definition StatusCodes.h:370
static constexpr int CouldNotRetrieveV6Firmware
Device firmware could not be retrieved.
Definition StatusCodes.h:724
constexpr bool IsOK() const
Definition StatusCodes.h:864
CTREXPORT double GetCurrentTimeSeconds()
Get the current timestamp in seconds.
Definition motor_constants.h:14