[hal,wpilib] Switch to new game data (#8584)

Game data is now limited to 8 bytes, and comes through the UDP packets.
This commit is contained in:
Thad House
2026-02-06 21:38:15 -08:00
committed by GitHub
parent ac45c694f3
commit 85adbf990e
45 changed files with 820 additions and 695 deletions

View File

@@ -336,6 +336,33 @@ void DriverStationData::SetMatchInfo(const HAL_MatchInfo* info) {
m_matchInfoCallbacks(info);
}
int32_t DriverStationData::RegisterGameDataCallback(
HAL_GameDataCallback callback, void* param, HAL_Bool initialNotify) {
std::scoped_lock lock(m_gameDataMutex);
int32_t uid = m_gameDataCallbacks.Register(callback, param);
if (initialNotify) {
callback(GetGameDataName(), param, &m_gameData);
}
return uid;
}
void DriverStationData::CancelGameDataCallback(int32_t uid) {
m_gameDataCallbacks.Cancel(uid);
}
void DriverStationData::GetGameData(HAL_GameData* gameData) {
std::scoped_lock lock(m_gameDataMutex);
*gameData = m_gameData;
}
void DriverStationData::SetGameData(std::string_view gameData) {
std::scoped_lock lock(m_gameDataMutex);
auto copied =
gameData.copy(m_gameData.gameData, sizeof(m_gameData.gameData) - 1);
m_gameData.gameData[copied] = '\0';
m_gameDataCallbacks(&m_gameData);
}
int32_t DriverStationData::RegisterNewDataCallback(HAL_NotifyCallback callback,
void* param,
HAL_Bool initialNotify) {
@@ -537,15 +564,6 @@ void DriverStationData::SetJoystickName(int32_t stick, std::string_view name) {
m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
}
void DriverStationData::SetGameSpecificMessage(std::string_view message) {
std::scoped_lock lock(m_matchInfoMutex);
auto copied =
message.copy(reinterpret_cast<char*>(m_matchInfo.gameSpecificMessage),
sizeof(m_matchInfo.gameSpecificMessage));
m_matchInfo.gameSpecificMessageSize = copied;
m_matchInfoCallbacks(&m_matchInfo);
}
void DriverStationData::SetEventName(std::string_view name) {
std::scoped_lock lock(m_matchInfoMutex);
auto copied =
@@ -708,6 +726,24 @@ void HALSIM_SetMatchInfo(const HAL_MatchInfo* info) {
SimDriverStationData->SetMatchInfo(info);
}
int32_t HALSIM_RegisterGameDataCallback(HAL_GameDataCallback callback,
void* param, HAL_Bool initialNotify) {
return SimDriverStationData->RegisterGameDataCallback(callback, param,
initialNotify);
}
void HALSIM_CancelGameDataCallback(int32_t uid) {
SimDriverStationData->CancelGameDataCallback(uid);
}
void HALSIM_GetGameData(HAL_GameData* gameData) {
SimDriverStationData->GetGameData(gameData);
}
void HALSIM_SetGameData(const HAL_GameData* gameData) {
SimDriverStationData->SetGameData(gameData->gameData);
}
int32_t HALSIM_RegisterDriverStationNewDataCallback(HAL_NotifyCallback callback,
void* param,
HAL_Bool initialNotify) {
@@ -788,9 +824,8 @@ void HALSIM_SetJoystickName(int32_t stick, const WPI_String* name) {
SimDriverStationData->SetJoystickName(stick, wpi::util::to_string_view(name));
}
void HALSIM_SetGameSpecificMessage(const WPI_String* message) {
SimDriverStationData->SetGameSpecificMessage(
wpi::util::to_string_view(message));
void HALSIM_SetGameDataString(const WPI_String* message) {
SimDriverStationData->SetGameData(wpi::util::to_string_view(message));
}
void HALSIM_SetEventName(const WPI_String* name) {

View File

@@ -36,6 +36,7 @@ class DriverStationData {
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickRumbles)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickTouchpads)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(MatchInfo)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(GameData)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(NewData)
static LLVM_ATTRIBUTE_ALWAYS_INLINE HAL_Value
@@ -124,6 +125,11 @@ class DriverStationData {
void GetMatchInfo(HAL_MatchInfo* info);
void SetMatchInfo(const HAL_MatchInfo* info);
int32_t RegisterGameDataCallback(HAL_GameDataCallback callback, void* param,
HAL_Bool initialNotify);
void CancelGameDataCallback(int32_t uid);
void GetGameData(HAL_GameData* gameData);
void FreeMatchInfo(const HAL_MatchInfo* info);
int32_t RegisterNewDataCallback(HAL_NotifyCallback callback, void* param,
@@ -154,7 +160,7 @@ class DriverStationData {
void SetJoystickName(int32_t stick, std::string_view message);
void SetJoystickSupportedOutputs(int32_t stick, int32_t supportedOutputs);
void SetGameSpecificMessage(std::string_view message);
void SetGameData(std::string_view message);
void SetEventName(std::string_view name);
void SetMatchType(HAL_MatchType type);
void SetMatchNumber(int32_t matchNumber);
@@ -192,6 +198,8 @@ class DriverStationData {
m_joystickDescriptorCallbacks;
SimCallbackRegistry<HAL_MatchInfoCallback, GetMatchInfoName>
m_matchInfoCallbacks;
SimCallbackRegistry<HAL_GameDataCallback, GetGameDataName>
m_gameDataCallbacks;
SimCallbackRegistry<HAL_NotifyCallback, GetNewDataName> m_newDataCallbacks;
struct JoystickOutputStore {
@@ -218,6 +226,9 @@ class DriverStationData {
wpi::util::spinlock m_matchInfoMutex;
HAL_MatchInfo m_matchInfo;
wpi::util::spinlock m_gameDataMutex;
HAL_GameData m_gameData;
wpi::util::spinlock m_opModeMutex;
std::vector<HAL_OpModeOption> m_opModeOptions;
};