mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-26 01:51:41 +00:00
Change hal sim to use spinlocks (#1291)
This makes callback registration completely thread safe. This patch also uses templates and macros to dramatically reduce the amount of manual boilerplate.
This commit is contained in:
@@ -7,156 +7,46 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
|
||||
#include <wpi/mutex.h>
|
||||
|
||||
#include "mockdata/NotifyListenerVector.h"
|
||||
#include "mockdata/RoboRioData.h"
|
||||
#include "mockdata/SimDataValue.h"
|
||||
|
||||
namespace hal {
|
||||
class RoboRioData {
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(FPGAButton)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(VInVoltage)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(VInCurrent)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserVoltage6V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserCurrent6V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserActive6V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserVoltage5V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserCurrent5V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserActive5V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserVoltage3V3)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserCurrent3V3)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserActive3V3)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserFaults6V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserFaults5V)
|
||||
HAL_SIMDATAVALUE_DEFINE_NAME(UserFaults3V3)
|
||||
|
||||
public:
|
||||
int32_t RegisterFPGAButtonCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelFPGAButtonCallback(int32_t uid);
|
||||
void InvokeFPGAButtonCallback(HAL_Value value);
|
||||
HAL_Bool GetFPGAButton();
|
||||
void SetFPGAButton(HAL_Bool fPGAButton);
|
||||
|
||||
int32_t RegisterVInVoltageCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelVInVoltageCallback(int32_t uid);
|
||||
void InvokeVInVoltageCallback(HAL_Value value);
|
||||
double GetVInVoltage();
|
||||
void SetVInVoltage(double vInVoltage);
|
||||
|
||||
int32_t RegisterVInCurrentCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelVInCurrentCallback(int32_t uid);
|
||||
void InvokeVInCurrentCallback(HAL_Value value);
|
||||
double GetVInCurrent();
|
||||
void SetVInCurrent(double vInCurrent);
|
||||
|
||||
int32_t RegisterUserVoltage6VCallback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserVoltage6VCallback(int32_t uid);
|
||||
void InvokeUserVoltage6VCallback(HAL_Value value);
|
||||
double GetUserVoltage6V();
|
||||
void SetUserVoltage6V(double userVoltage6V);
|
||||
|
||||
int32_t RegisterUserCurrent6VCallback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserCurrent6VCallback(int32_t uid);
|
||||
void InvokeUserCurrent6VCallback(HAL_Value value);
|
||||
double GetUserCurrent6V();
|
||||
void SetUserCurrent6V(double userCurrent6V);
|
||||
|
||||
int32_t RegisterUserActive6VCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelUserActive6VCallback(int32_t uid);
|
||||
void InvokeUserActive6VCallback(HAL_Value value);
|
||||
HAL_Bool GetUserActive6V();
|
||||
void SetUserActive6V(HAL_Bool userActive6V);
|
||||
|
||||
int32_t RegisterUserVoltage5VCallback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserVoltage5VCallback(int32_t uid);
|
||||
void InvokeUserVoltage5VCallback(HAL_Value value);
|
||||
double GetUserVoltage5V();
|
||||
void SetUserVoltage5V(double userVoltage5V);
|
||||
|
||||
int32_t RegisterUserCurrent5VCallback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserCurrent5VCallback(int32_t uid);
|
||||
void InvokeUserCurrent5VCallback(HAL_Value value);
|
||||
double GetUserCurrent5V();
|
||||
void SetUserCurrent5V(double userCurrent5V);
|
||||
|
||||
int32_t RegisterUserActive5VCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelUserActive5VCallback(int32_t uid);
|
||||
void InvokeUserActive5VCallback(HAL_Value value);
|
||||
HAL_Bool GetUserActive5V();
|
||||
void SetUserActive5V(HAL_Bool userActive5V);
|
||||
|
||||
int32_t RegisterUserVoltage3V3Callback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserVoltage3V3Callback(int32_t uid);
|
||||
void InvokeUserVoltage3V3Callback(HAL_Value value);
|
||||
double GetUserVoltage3V3();
|
||||
void SetUserVoltage3V3(double userVoltage3V3);
|
||||
|
||||
int32_t RegisterUserCurrent3V3Callback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserCurrent3V3Callback(int32_t uid);
|
||||
void InvokeUserCurrent3V3Callback(HAL_Value value);
|
||||
double GetUserCurrent3V3();
|
||||
void SetUserCurrent3V3(double userCurrent3V3);
|
||||
|
||||
int32_t RegisterUserActive3V3Callback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserActive3V3Callback(int32_t uid);
|
||||
void InvokeUserActive3V3Callback(HAL_Value value);
|
||||
HAL_Bool GetUserActive3V3();
|
||||
void SetUserActive3V3(HAL_Bool userActive3V3);
|
||||
|
||||
int32_t RegisterUserFaults6VCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelUserFaults6VCallback(int32_t uid);
|
||||
void InvokeUserFaults6VCallback(HAL_Value value);
|
||||
int32_t GetUserFaults6V();
|
||||
void SetUserFaults6V(int32_t userFaults6V);
|
||||
|
||||
int32_t RegisterUserFaults5VCallback(HAL_NotifyCallback callback, void* param,
|
||||
HAL_Bool initialNotify);
|
||||
void CancelUserFaults5VCallback(int32_t uid);
|
||||
void InvokeUserFaults5VCallback(HAL_Value value);
|
||||
int32_t GetUserFaults5V();
|
||||
void SetUserFaults5V(int32_t userFaults5V);
|
||||
|
||||
int32_t RegisterUserFaults3V3Callback(HAL_NotifyCallback callback,
|
||||
void* param, HAL_Bool initialNotify);
|
||||
void CancelUserFaults3V3Callback(int32_t uid);
|
||||
void InvokeUserFaults3V3Callback(HAL_Value value);
|
||||
int32_t GetUserFaults3V3();
|
||||
void SetUserFaults3V3(int32_t userFaults3V3);
|
||||
SimDataValue<HAL_Bool, MakeBoolean, GetFPGAButtonName> fpgaButton{false};
|
||||
SimDataValue<double, MakeDouble, GetVInVoltageName> vInVoltage{0.0};
|
||||
SimDataValue<double, MakeDouble, GetVInCurrentName> vInCurrent{0.0};
|
||||
SimDataValue<double, MakeDouble, GetUserVoltage6VName> userVoltage6V{6.0};
|
||||
SimDataValue<double, MakeDouble, GetUserCurrent6VName> userCurrent6V{0.0};
|
||||
SimDataValue<HAL_Bool, MakeBoolean, GetUserActive6VName> userActive6V{false};
|
||||
SimDataValue<double, MakeDouble, GetUserVoltage5VName> userVoltage5V{5.0};
|
||||
SimDataValue<double, MakeDouble, GetUserCurrent5VName> userCurrent5V{0.0};
|
||||
SimDataValue<HAL_Bool, MakeBoolean, GetUserActive5VName> userActive5V{false};
|
||||
SimDataValue<double, MakeDouble, GetUserVoltage3V3Name> userVoltage3V3{3.3};
|
||||
SimDataValue<double, MakeDouble, GetUserCurrent3V3Name> userCurrent3V3{0.0};
|
||||
SimDataValue<HAL_Bool, MakeBoolean, GetUserActive3V3Name> userActive3V3{
|
||||
false};
|
||||
SimDataValue<int32_t, MakeInt, GetUserFaults6VName> userFaults6V{0};
|
||||
SimDataValue<int32_t, MakeInt, GetUserFaults5VName> userFaults5V{0};
|
||||
SimDataValue<int32_t, MakeInt, GetUserFaults3V3Name> userFaults3V3{0};
|
||||
|
||||
virtual void ResetData();
|
||||
|
||||
private:
|
||||
wpi::mutex m_registerMutex;
|
||||
std::atomic<HAL_Bool> m_fPGAButton{false};
|
||||
std::shared_ptr<NotifyListenerVector> m_fPGAButtonCallbacks = nullptr;
|
||||
std::atomic<double> m_vInVoltage{0.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_vInVoltageCallbacks = nullptr;
|
||||
std::atomic<double> m_vInCurrent{0.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_vInCurrentCallbacks = nullptr;
|
||||
std::atomic<double> m_userVoltage6V{6.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userVoltage6VCallbacks = nullptr;
|
||||
std::atomic<double> m_userCurrent6V{0.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userCurrent6VCallbacks = nullptr;
|
||||
std::atomic<HAL_Bool> m_userActive6V{false};
|
||||
std::shared_ptr<NotifyListenerVector> m_userActive6VCallbacks = nullptr;
|
||||
std::atomic<double> m_userVoltage5V{5.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userVoltage5VCallbacks = nullptr;
|
||||
std::atomic<double> m_userCurrent5V{0.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userCurrent5VCallbacks = nullptr;
|
||||
std::atomic<HAL_Bool> m_userActive5V{false};
|
||||
std::shared_ptr<NotifyListenerVector> m_userActive5VCallbacks = nullptr;
|
||||
std::atomic<double> m_userVoltage3V3{3.3};
|
||||
std::shared_ptr<NotifyListenerVector> m_userVoltage3V3Callbacks = nullptr;
|
||||
std::atomic<double> m_userCurrent3V3{0.0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userCurrent3V3Callbacks = nullptr;
|
||||
std::atomic<HAL_Bool> m_userActive3V3{false};
|
||||
std::shared_ptr<NotifyListenerVector> m_userActive3V3Callbacks = nullptr;
|
||||
std::atomic<int32_t> m_userFaults6V{0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userFaults6VCallbacks = nullptr;
|
||||
std::atomic<int32_t> m_userFaults5V{0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userFaults5VCallbacks = nullptr;
|
||||
std::atomic<int32_t> m_userFaults3V3{0};
|
||||
std::shared_ptr<NotifyListenerVector> m_userFaults3V3Callbacks = nullptr;
|
||||
};
|
||||
extern RoboRioData* SimRoboRioData;
|
||||
} // namespace hal
|
||||
|
||||
Reference in New Issue
Block a user