[hal,wpilib] Use new DS available API from mrccomm (#8302)

Instead of just having a max count for joystick values, there's an available mask of values. This is because in the future we're expecting there to be holes in the list of available buttons and axes. This updates everything to support that scenario.

Also, Joystick buttons, axes, and POVs all now start at 0 instead of 1.
This commit is contained in:
Thad House
2025-10-25 23:03:50 -07:00
committed by GitHub
parent 429698f508
commit 2e10f91e07
62 changed files with 6101 additions and 1066 deletions

View File

@@ -230,9 +230,9 @@ void DriverStationData::SetJoystickButton(int32_t stick, int32_t button,
}
std::scoped_lock lock(m_joystickDataMutex);
if (state) {
m_joystickData[stick].buttons.buttons |= 1 << (button - 1);
m_joystickData[stick].buttons.buttons |= 1llu << button;
} else {
m_joystickData[stick].buttons.buttons &= ~(1 << (button - 1));
m_joystickData[stick].buttons.buttons &= ~(1llu << button);
}
m_joystickButtonsCallbacks(stick, &m_joystickData[stick].buttons);
}
@@ -263,7 +263,7 @@ void DriverStationData::SetJoystickPOV(int32_t stick, int32_t pov,
m_joystickPOVsCallbacks(stick, &m_joystickData[stick].povs);
}
void DriverStationData::SetJoystickButtons(int32_t stick, uint32_t buttons) {
void DriverStationData::SetJoystickButtons(int32_t stick, uint64_t buttons) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
@@ -272,52 +272,50 @@ void DriverStationData::SetJoystickButtons(int32_t stick, uint32_t buttons) {
m_joystickButtonsCallbacks(stick, &m_joystickData[stick].buttons);
}
void DriverStationData::SetJoystickAxisCount(int32_t stick, int32_t count) {
void DriverStationData::SetJoystickAxesAvailable(int32_t stick,
uint16_t available) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
m_joystickData[stick].axes.count = count;
m_joystickData[stick].descriptor.axisCount = count;
m_joystickData[stick].axes.available = available;
m_joystickAxesCallbacks(stick, &m_joystickData[stick].axes);
m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
}
void DriverStationData::SetJoystickPOVCount(int32_t stick, int32_t count) {
void DriverStationData::SetJoystickPOVsAvailable(int32_t stick,
uint8_t available) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
m_joystickData[stick].povs.count = count;
m_joystickData[stick].descriptor.povCount = count;
m_joystickData[stick].povs.available = available;
m_joystickPOVsCallbacks(stick, &m_joystickData[stick].povs);
m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
}
void DriverStationData::SetJoystickButtonCount(int32_t stick, int32_t count) {
void DriverStationData::SetJoystickButtonsAvailable(int32_t stick,
uint64_t available) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
m_joystickData[stick].buttons.count = count;
m_joystickData[stick].descriptor.buttonCount = count;
m_joystickData[stick].buttons.available = available;
m_joystickButtonsCallbacks(stick, &m_joystickData[stick].buttons);
m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
}
void DriverStationData::GetJoystickCounts(int32_t stick, int32_t* axisCount,
int32_t* buttonCount,
int32_t* povCount) {
void DriverStationData::GetJoystickAvailables(int32_t stick,
uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable) {
if (stick < 0 || stick >= kNumJoysticks) {
*axisCount = 0;
*buttonCount = 0;
*povCount = 0;
*axesAvailable = 0;
*buttonsAvailable = 0;
*povsAvailable = 0;
return;
}
std::scoped_lock lock(m_joystickDataMutex);
*axisCount = m_joystickData[stick].axes.count;
*buttonCount = m_joystickData[stick].buttons.count;
*povCount = m_joystickData[stick].povs.count;
*axesAvailable = m_joystickData[stick].axes.available;
*buttonsAvailable = m_joystickData[stick].buttons.available;
*povsAvailable = m_joystickData[stick].povs.available;
}
void DriverStationData::SetJoystickIsGamepad(int32_t stick,
@@ -350,19 +348,6 @@ void DriverStationData::SetJoystickName(int32_t stick, std::string_view name) {
m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
}
void DriverStationData::SetJoystickAxisType(int32_t stick, int32_t axis,
int32_t type) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
if (axis < 0 || axis >= HAL_kMaxJoystickAxes) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
m_joystickData[stick].descriptor.axisTypes[axis] = type;
m_joystickDescriptorCallbacks(stick, &m_joystickData[stick].descriptor);
}
void DriverStationData::SetGameSpecificMessage(std::string_view message) {
std::scoped_lock lock(m_matchInfoMutex);
auto copied =
@@ -511,26 +496,27 @@ void HALSIM_SetJoystickPOV(int32_t stick, int32_t pov, HAL_JoystickPOV value) {
SimDriverStationData->SetJoystickPOV(stick, pov, value);
}
void HALSIM_SetJoystickButtonsValue(int32_t stick, uint32_t buttons) {
void HALSIM_SetJoystickButtonsValue(int32_t stick, uint64_t buttons) {
SimDriverStationData->SetJoystickButtons(stick, buttons);
}
void HALSIM_SetJoystickAxisCount(int32_t stick, int32_t count) {
SimDriverStationData->SetJoystickAxisCount(stick, count);
void HALSIM_SetJoystickAxesAvailable(int32_t stick, uint16_t available) {
SimDriverStationData->SetJoystickAxesAvailable(stick, available);
}
void HALSIM_SetJoystickPOVCount(int32_t stick, int32_t count) {
SimDriverStationData->SetJoystickPOVCount(stick, count);
void HALSIM_SetJoystickPOVsAvailable(int32_t stick, uint8_t available) {
SimDriverStationData->SetJoystickPOVsAvailable(stick, available);
}
void HALSIM_SetJoystickButtonCount(int32_t stick, int32_t count) {
SimDriverStationData->SetJoystickButtonCount(stick, count);
void HALSIM_SetJoystickButtonsAvailable(int32_t stick, uint64_t available) {
SimDriverStationData->SetJoystickButtonsAvailable(stick, available);
}
void HALSIM_GetJoystickCounts(int32_t stick, int32_t* axisCount,
int32_t* buttonCount, int32_t* povCount) {
SimDriverStationData->GetJoystickCounts(stick, axisCount, buttonCount,
povCount);
void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable) {
SimDriverStationData->GetJoystickAvailables(stick, axesAvailable,
buttonsAvailable, povsAvailable);
}
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad) {
@@ -545,10 +531,6 @@ void HALSIM_SetJoystickName(int32_t stick, const WPI_String* name) {
SimDriverStationData->SetJoystickName(stick, wpi::to_string_view(name));
}
void HALSIM_SetJoystickAxisType(int32_t stick, int32_t axis, int32_t type) {
SimDriverStationData->SetJoystickAxisType(stick, axis, type);
}
void HALSIM_SetGameSpecificMessage(const WPI_String* message) {
SimDriverStationData->SetGameSpecificMessage(wpi::to_string_view(message));
}

View File

@@ -98,17 +98,17 @@ class DriverStationData {
void SetJoystickButton(int32_t stick, int32_t button, HAL_Bool state);
void SetJoystickAxis(int32_t stick, int32_t axis, double value);
void SetJoystickPOV(int32_t stick, int32_t pov, HAL_JoystickPOV value);
void SetJoystickButtons(int32_t stick, uint32_t buttons);
void SetJoystickAxisCount(int32_t stick, int32_t count);
void SetJoystickPOVCount(int32_t stick, int32_t count);
void SetJoystickButtonCount(int32_t stick, int32_t count);
void GetJoystickCounts(int32_t stick, int32_t* axisCount,
int32_t* buttonCount, int32_t* povCount);
void SetJoystickButtons(int32_t stick, uint64_t buttons);
void SetJoystickAxesAvailable(int32_t stick, uint16_t available);
void SetJoystickPOVsAvailable(int32_t stick, uint8_t available);
void SetJoystickButtonsAvailable(int32_t stick, uint64_t available);
void GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable);
void SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad);
void SetJoystickType(int32_t stick, int32_t type);
void SetJoystickName(int32_t stick, std::string_view message);
void SetJoystickAxisType(int32_t stick, int32_t axis, int32_t type);
void SetGameSpecificMessage(std::string_view message);
void SetEventName(std::string_view name);