12 #include <wpi/Compiler.h>
13 #include <wpi/UidVector.h>
14 #include <wpi/spinlock.h>
16 #include "mockdata/NotifyListener.h"
17 #include "mockdata/SimCallbackRegistry.h"
22 template <
typename T, HAL_Value (*MakeValue)(T)>
27 LLVM_ATTRIBUTE_ALWAYS_INLINE
void CancelCallback(int32_t uid) { Cancel(uid); }
30 std::lock_guard<wpi::recursive_spinlock> lock(m_mutex);
34 LLVM_ATTRIBUTE_ALWAYS_INLINE
operator T()
const {
return Get(); }
37 std::lock_guard<wpi::recursive_spinlock> lock(m_mutex);
45 int32_t DoRegisterCallback(HAL_NotifyCallback callback,
void* param,
46 HAL_Bool initialNotify,
const char* name) {
47 std::unique_lock<wpi::recursive_spinlock> lock(m_mutex);
48 int32_t newUid = DoRegister(reinterpret_cast<RawFunctor>(callback), param);
49 if (newUid == -1)
return -1;
54 callback(name, param, &value);
59 void DoSet(T value,
const char* name) {
60 std::lock_guard<wpi::recursive_spinlock> lock(this->m_mutex);
61 if (m_value != value) {
65 for (
auto&& cb : *m_callbacks)
66 reinterpret_cast<HAL_NotifyCallback
>(cb.callback)(name, cb.param,
86 template <
typename T,
HAL_Value (*MakeValue)(T),
const char* (*GetName)(),
87 T (*GetDefault)() =
nullptr>
92 GetDefault !=
nullptr ? GetDefault() : T()) {}
96 LLVM_ATTRIBUTE_ALWAYS_INLINE int32_t RegisterCallback(
97 HAL_NotifyCallback callback,
void* param, HAL_Bool initialNotify) {
98 return this->DoRegisterCallback(callback, param, initialNotify, GetName());
101 LLVM_ATTRIBUTE_ALWAYS_INLINE
void Set(T value) {
102 this->DoSet(value, GetName());
105 LLVM_ATTRIBUTE_ALWAYS_INLINE
SimDataValue& operator=(T value) {
116 #define HAL_SIMDATAVALUE_DEFINE_NAME(NAME) \
117 static LLVM_ATTRIBUTE_ALWAYS_INLINE constexpr const char* \
118 Get##NAME##Name() { \
139 #define HAL_SIMDATAVALUE_DEFINE_CAPI(TYPE, NS, CAPINAME, DATA, LOWERNAME) \
140 int32_t NS##_Register##CAPINAME##Callback( \
141 int32_t index, HAL_NotifyCallback callback, void* param, \
142 HAL_Bool initialNotify) { \
143 return DATA[index].LOWERNAME.RegisterCallback(callback, param, \
147 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) { \
148 DATA[index].LOWERNAME.CancelCallback(uid); \
151 TYPE NS##_Get##CAPINAME(int32_t index) { return DATA[index].LOWERNAME; } \
153 void NS##_Set##CAPINAME(int32_t index, TYPE LOWERNAME) { \
154 DATA[index].LOWERNAME = LOWERNAME; \
174 #define HAL_SIMDATAVALUE_DEFINE_CAPI_CHANNEL(TYPE, NS, CAPINAME, DATA, \
176 int32_t NS##_Register##CAPINAME##Callback( \
177 int32_t index, int32_t channel, HAL_NotifyCallback callback, \
178 void* param, HAL_Bool initialNotify) { \
179 return DATA[index].LOWERNAME[channel].RegisterCallback(callback, param, \
183 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t channel, \
185 DATA[index].LOWERNAME[channel].CancelCallback(uid); \
188 TYPE NS##_Get##CAPINAME(int32_t index, int32_t channel) { \
189 return DATA[index].LOWERNAME[channel]; \
192 void NS##_Set##CAPINAME(int32_t index, int32_t channel, TYPE LOWERNAME) { \
193 DATA[index].LOWERNAME[channel] = LOWERNAME; \
212 #define HAL_SIMDATAVALUE_DEFINE_CAPI_NOINDEX(TYPE, NS, CAPINAME, DATA, \
214 int32_t NS##_Register##CAPINAME##Callback( \
215 HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify) { \
216 return DATA->LOWERNAME.RegisterCallback(callback, param, initialNotify); \
219 void NS##_Cancel##CAPINAME##Callback(int32_t uid) { \
220 DATA->LOWERNAME.CancelCallback(uid); \
223 TYPE NS##_Get##CAPINAME(void) { return DATA->LOWERNAME; } \
225 void NS##_Set##CAPINAME(TYPE LOWERNAME) { DATA->LOWERNAME = LOWERNAME; }
Definition: SimCallbackRegistry.h:23
A recursive spinlock mutex.
Definition: spinlock.h:46
Definition: SimDataValue.h:23
HAL Entry Value.
Definition: HAL_Value.h:25
WPILib Hardware Abstraction Layer (HAL) namespace.
Definition: SimDataValue.h:19
Simulation data value wrapper.
Definition: SimDataValue.h:88