20#include <units/dimensionless.h>
37 std::map<uint32_t, std::unique_ptr<BaseStatusSignal>> _signalValues;
38 std::recursive_mutex _signalValuesLck;
43 std::shared_ptr<controls::ControlRequest> _controlReq = std::make_shared<controls::EmptyControl>();
44 std::mutex _controlReqLck;
46 units::time::second_t _resetTimestamp{};
49 StatusSignal<T> &LookupCommon(uint16_t spn, uint16_t mapper_iter, std::function<std::map<
int,
StatusSignal<T>>()> map_filler, std::string signalName,
bool reportOnConstruction)
54 std::lock_guard<std::recursive_mutex> lock{_signalValuesLck};
56 const uint32_t totalHash = spn | ((uint32_t)mapper_iter << 16);
58 auto iter = _signalValues.find(totalHash);
59 if (iter != _signalValues.end())
62 toFind = iter->second.get();
64 reportOnConstruction =
true;
73 _signalValues.emplace(totalHash, std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
76 map_filler, std::move(signalName)}});
81 _signalValues.emplace(totalHash, std::unique_ptr<StatusSignal<T>>{
new StatusSignal<T>{
84 std::move(signalName)}});
88 iter = _signalValues.find(totalHash);
89 toFind = iter->second.get();
94 StatusSignal<T> *ret =
dynamic_cast<StatusSignal<T> *
>(toFind);
105 ret->Refresh(reportOnConstruction);
166 template <
typename T>
169 std::function<std::map<int, StatusSignal<T>>()> emptyMapFiller = []
171 return std::map<int, StatusSignal<T>>{};
173 return LookupCommon<T>(spn, 0, emptyMapFiller, std::move(signalName), reportOnConstruction);
176 template <
typename T>
179 return LookupCommon<T>(spn, mapper_iter, map_filler, std::move(signalName), reportOnConstruction);
183 template <
typename T,
typename U>
186 return StatusSignal<T>{LookupStatusSignal<U>(spn, std::move(signalName),
true)};
@ InvalidParamValue
Incorrect argument passed into function/VI.
Definition: StatusCodes.h:1440
Class that provides operations to retrieve information about a status signal.
Definition: StatusSignal.hpp:44
Represents a status signal with data of type T, and operations available to retrieve information abou...
Definition: StatusSignal.hpp:365
Abstract Control Request class that other control requests extend for use.
Definition: ControlRequest.hpp:65
Definition: DeviceIdentifier.hpp:19
std::string model
Definition: DeviceIdentifier.hpp:22
int deviceID
Definition: DeviceIdentifier.hpp:23
std::string network
Definition: DeviceIdentifier.hpp:21
Parent class for all devices.
Definition: ParentDevice.hpp:30
std::shared_ptr< controls::ControlRequest > GetAppliedControl()
Get the latest applied control.
Definition: ParentDevice.hpp:158
virtual ctre::phoenix::StatusCode SetControlPrivate(controls::ControlRequest &request)
DeviceIdentifier deviceIdentifier
Definition: ParentDevice.hpp:32
StatusSignal< T > & LookupStatusSignal(uint16_t spn, std::string signalName, bool reportOnConstruction)
Definition: ParentDevice.hpp:167
const std::string & GetCANBus() const
Definition: ParentDevice.hpp:128
std::shared_ptr< const controls::ControlRequest > GetAppliedControl() const
Get the latest applied control.
Definition: ParentDevice.hpp:143
StatusSignal< T > LookupDimensionlessStatusSignal(uint16_t spn, std::string signalName)
Returns a unitless version of the StatusSignal by value.
Definition: ParentDevice.hpp:184
int GetDeviceID() const
Definition: ParentDevice.hpp:120
void ReportIfTooOld(int minMajor, int minMinor, int minBugfix, int minBuild)
ParentDevice(int deviceID, std::string model, std::string canbus)
Definition: ParentDevice.hpp:111
static constexpr double kDefaultControlRatePeriodsSec
Definition: ParentDevice.hpp:133
StatusSignal< T > & LookupStatusSignal(uint16_t spn, uint16_t mapper_iter, std::function< std::map< int, StatusSignal< T > >()> map_filler, std::string signalName, bool reportOnConstruction)
Definition: ParentDevice.hpp:177
virtual void ReportIfTooOld()=0
Definition: string_util.hpp:14