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 {
48 std::unique_ptr<StatusSignal<int>> _compliancy;
53 void ReportIfTooOld();
56 std::shared_ptr<FirmwareVersChecker> _versChecker;
57 StatusSignal<int> _resetSignal;
60 StatusSignal<T> &LookupCommon(
61 uint16_t spn, std::string signalName,
62 std::function<std::map<uint16_t, std::string>()> mapFiller,
63 bool reportOnConstruction,
bool refresh)
67 BaseStatusSignal *toFind;
70 std::lock_guard<std::recursive_mutex> lock{_signalValuesLck};
73 auto iter = _signalValues.find(spn);
74 if (iter != _signalValues.end()) {
76 toFind = iter->second.get();
78 reportOnConstruction =
true;
82 _signalValues.emplace(spn,
83 std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
85 std::move(signalName),
86 [versChecker=_versChecker]()
mutable {
87 versChecker->ReportIfTooOld();
92 _signalValues.emplace(spn,
93 std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
95 std::move(signalName),
96 [versChecker=_versChecker]()
mutable {
97 versChecker->ReportIfTooOld();
105 iter = _signalValues.find(spn);
106 toFind = iter->second.get();
111 StatusSignal<T> *ret =
dynamic_cast<StatusSignal<T> *
>(toFind);
113 if (ret ==
nullptr) {
119 ret->Refresh(reportOnConstruction);
201 return _resetSignal.Refresh(
false).HasUpdated();
209 return [resetSignal=_resetSignal]()
mutable {
210 return resetSignal.Refresh(
false).HasUpdated();
223 bool IsConnected(units::second_t maxLatencySeconds = 500_ms)
final
225 return _versChecker->_compliancy &&
226 _versChecker->_compliancy->Refresh(
false).GetTimestamp().GetLatency() <= maxLatencySeconds;
289 template <std::derived_from<traits::CommonDevice>... Devices>
350 template <std::derived_from<traits::CommonDevice>... Devices>
385 for (
auto device : devices) {
386 auto const err = device->OptimizeBusUtilization(optimizedFreqHz);
418 template <std::derived_from<traits::CommonDevice>... Devices>
439 for (
auto device : devices) {
440 auto const err = device->ResetSignalFrequencies();
451 template <
typename T>
454 return LookupCommon<T>(spn, std::move(signalName),
nullptr, reportOnConstruction, refresh);
457 template <
typename T>
460 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:474
Common interface implemented by all control requests.
Definition ControlRequest.hpp:27
Generic Empty Control class used to do nothing.
Definition ControlRequest.hpp:65
Definition DeviceIdentifier.hpp:16
int deviceID
Definition DeviceIdentifier.hpp:20
uint32_t deviceHash
Definition DeviceIdentifier.hpp:21
std::string network
Definition DeviceIdentifier.hpp:18
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:143
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:458
static ctre::phoenix::StatusCode ResetSignalFrequenciesForAll(Devices &... devices)
Resets the update frequencies of all the devices' status signals to the defaults.
Definition ParentDevice.hpp:419
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:157
StatusSignal< T > & LookupStatusSignal(uint16_t spn, std::string signalName, bool reportOnConstruction, bool refresh)
Definition ParentDevice.hpp:452
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:223
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:436
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:290
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:319
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:382
int GetDeviceID() const final
Definition ParentDevice.hpp:135
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:207
std::shared_ptr< controls::ControlRequest const > GetAppliedControl() const final
Get the latest applied control.
Definition ParentDevice.hpp:174
StatusSignal< double > & GetGenericSignal(uint32_t signal, bool refresh=true)
This is a reserved routine for internal testing.
Definition ParentDevice.hpp:236
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:351
std::shared_ptr< controls::ControlRequest > GetAppliedControl() final
Get the latest applied control.
Definition ParentDevice.hpp:191
ParentDevice & operator=(ParentDevice const &)=delete
bool HasResetOccurred() final
Definition ParentDevice.hpp:199
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:369
static constexpr int CouldNotRetrieveV6Firmware
Device firmware could not be retrieved.
Definition StatusCodes.h:723
constexpr bool IsOK() const
Definition StatusCodes.h:858
CTREXPORT double GetCurrentTimeSeconds()
Get the current timestamp in seconds.
Definition motor_constants.h:14