11#include "wpi/util/Compiler.hpp"
17template <
typename T, HAL_Value (*MakeValue)(T)>
29 LLVM_ATTRIBUTE_ALWAYS_INLINE
operator T()
const {
return Get(); }
51 callback(
name, param, &value);
57 std::scoped_lock lock(this->
m_mutex);
84template <
typename T,
HAL_Value (*MakeValue)(T),
const char* (*GetName)(),
85 T (*GetDefault)() =
nullptr>
94#pragma GCC diagnostic push
95#pragma GCC diagnostic ignored "-Waddress"
99 GetDefault != nullptr ? GetDefault() : T()) {}
101#pragma GCC diagnostic pop
111 LLVM_ATTRIBUTE_ALWAYS_INLINE
void Set(T value) {
112 this->
DoSet(value, GetName());
126#define HAL_SIMDATAVALUE_DEFINE_NAME(NAME) \
127 static LLVM_ATTRIBUTE_ALWAYS_INLINE constexpr const char* \
128 Get##NAME##Name() { \
149#define HAL_SIMDATAVALUE_DEFINE_CAPI(TYPE, NS, CAPINAME, DATA, LOWERNAME) \
150 int32_t NS##_Register##CAPINAME##Callback( \
151 int32_t index, HAL_NotifyCallback callback, void* param, \
152 HAL_Bool initialNotify) { \
153 return DATA[index].LOWERNAME.RegisterCallback(callback, param, \
157 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) { \
158 DATA[index].LOWERNAME.CancelCallback(uid); \
161 TYPE NS##_Get##CAPINAME(int32_t index) { \
162 return DATA[index].LOWERNAME; \
165 void NS##_Set##CAPINAME(int32_t index, TYPE LOWERNAME) { \
166 DATA[index].LOWERNAME = LOWERNAME; \
186#define HAL_SIMDATAVALUE_DEFINE_CAPI_CHANNEL(TYPE, NS, CAPINAME, DATA, \
188 int32_t NS##_Register##CAPINAME##Callback( \
189 int32_t index, int32_t channel, HAL_NotifyCallback callback, \
190 void* param, HAL_Bool initialNotify) { \
191 return DATA[index].LOWERNAME[channel].RegisterCallback(callback, param, \
195 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t channel, \
197 DATA[index].LOWERNAME[channel].CancelCallback(uid); \
200 TYPE NS##_Get##CAPINAME(int32_t index, int32_t channel) { \
201 return DATA[index].LOWERNAME[channel]; \
204 void NS##_Set##CAPINAME(int32_t index, int32_t channel, TYPE LOWERNAME) { \
205 DATA[index].LOWERNAME[channel] = LOWERNAME; \
224#define HAL_SIMDATAVALUE_DEFINE_CAPI_NOINDEX(TYPE, NS, CAPINAME, DATA, \
226 int32_t NS##_Register##CAPINAME##Callback( \
227 HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify) { \
228 return DATA->LOWERNAME.RegisterCallback(callback, param, initialNotify); \
231 void NS##_Cancel##CAPINAME##Callback(int32_t uid) { \
232 DATA->LOWERNAME.CancelCallback(uid); \
235 TYPE NS##_Get##CAPINAME(void) { \
236 return DATA->LOWERNAME; \
239 void NS##_Set##CAPINAME(TYPE LOWERNAME) { \
240 DATA->LOWERNAME = LOWERNAME; \
259#define HAL_SIMDATAVALUE_STUB_CAPI(TYPE, NS, CAPINAME, RETURN) \
260 int32_t NS##_Register##CAPINAME##Callback( \
261 int32_t index, HAL_NotifyCallback callback, void* param, \
262 HAL_Bool initialNotify) { \
266 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t uid) {} \
268 TYPE NS##_Get##CAPINAME(int32_t index) { \
272 void NS##_Set##CAPINAME(int32_t index, TYPE) {}
290#define HAL_SIMDATAVALUE_STUB_CAPI_CHANNEL(TYPE, NS, CAPINAME, RETURN) \
291 int32_t NS##_Register##CAPINAME##Callback( \
292 int32_t index, int32_t channel, HAL_NotifyCallback callback, \
293 void* param, HAL_Bool initialNotify) { \
297 void NS##_Cancel##CAPINAME##Callback(int32_t index, int32_t channel, \
300 TYPE NS##_Get##CAPINAME(int32_t index, int32_t channel) { \
304 void NS##_Set##CAPINAME(int32_t index, int32_t channel, TYPE) {}
321#define HAL_SIMDATAVALUE_STUB_CAPI_NOINDEX(TYPE, NS, CAPINAME, RETURN) \
322 int32_t NS##_Register##CAPINAME##Callback( \
323 HAL_NotifyCallback callback, void* param, HAL_Bool initialNotify) { \
327 void NS##_Cancel##CAPINAME##Callback(int32_t uid) {} \
329 TYPE NS##_Get##CAPINAME(void) { \
333 void NS##_Set##CAPINAME(TYPE) {}
void(* HAL_NotifyCallback)(const char *name, void *param, const struct HAL_Value *value)
Definition NotifyListener.h:9
@ name
Definition base.h:690
SimDataValue()
Definition SimDataValue.hpp:97
LLVM_ATTRIBUTE_ALWAYS_INLINE void Set(T value)
Definition SimDataValue.hpp:111
LLVM_ATTRIBUTE_ALWAYS_INLINE int32_t RegisterCallback(HAL_NotifyCallback callback, void *param, HAL_Bool initialNotify)
Definition SimDataValue.hpp:106
SimDataValue(T value)
Definition SimDataValue.hpp:103
LLVM_ATTRIBUTE_ALWAYS_INLINE SimDataValue & operator=(T value)
Definition SimDataValue.hpp:115
Definition SimCallbackRegistry.hpp:19
void(*)() RawFunctor
Definition SimCallbackRegistry.hpp:21
std::unique_ptr< CallbackVector > m_callbacks
Definition SimCallbackRegistry.hpp:61
wpi::util::recursive_spinlock m_mutex
Definition SimCallbackRegistry.hpp:60
int32_t DoRegister(RawFunctor callback, void *param)
Definition SimCallbackRegistry.hpp:43
LLVM_ATTRIBUTE_ALWAYS_INLINE void DoReset()
Definition SimCallbackRegistry.hpp:54
void Cancel(int32_t uid)
Definition SimCallbackRegistry.hpp:28
T m_value
Definition SimDataValue.hpp:70
SimDataValueBase(T value)
Definition SimDataValue.hpp:20
void Reset(T value)
Definition SimDataValue.hpp:31
wpi::util::recursive_spinlock & GetMutex()
Definition SimDataValue.hpp:37
LLVM_ATTRIBUTE_ALWAYS_INLINE void CancelCallback(int32_t uid)
Definition SimDataValue.hpp:22
void DoSet(T value, const char *name)
Definition SimDataValue.hpp:56
int32_t DoRegisterCallback(HAL_NotifyCallback callback, void *param, HAL_Bool initialNotify, const char *name)
Definition SimDataValue.hpp:40
T Get() const
Definition SimDataValue.hpp:24
int32_t HAL_Bool
Definition Types.h:75
Definition SimCallbackRegistry.hpp:17
WPILib Hardware Abstraction Layer (HAL) namespace.
Definition Types.hpp:9
recursive_spinlock1 recursive_spinlock
Definition spinlock.hpp:141
HAL Entry Value.
Definition Value.h:26