[hal,wpilib] Add Touchpad support (#8401)

This commit is contained in:
Thad House
2025-11-21 13:57:11 -08:00
committed by GitHub
parent 8546d301e3
commit 32fc543dc8
34 changed files with 1319 additions and 437 deletions

View File

@@ -42,6 +42,7 @@ struct JoystickDataCache {
HAL_JoystickAxes axes[kJoystickPorts];
HAL_JoystickPOVs povs[kJoystickPorts];
HAL_JoystickButtons buttons[kJoystickPorts];
HAL_JoystickTouchpads touchpads[kJoystickPorts];
HAL_AllianceStationID allianceStation;
double matchTime;
HAL_ControlWord controlWord;
@@ -64,6 +65,7 @@ void JoystickDataCache::Update() {
SimDriverStationData->GetJoystickAxes(i, &axes[i]);
SimDriverStationData->GetJoystickPOVs(i, &povs[i]);
SimDriverStationData->GetJoystickButtons(i, &buttons[i]);
SimDriverStationData->GetJoystickTouchpads(i, &touchpads[i]);
}
allianceStation = SimDriverStationData->allianceStationId;
matchTime = SimDriverStationData->matchTime;
@@ -266,9 +268,21 @@ int32_t HAL_GetJoystickButtons(int32_t joystickNum,
return 0;
}
int32_t HAL_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads) {
if (gShutdown) {
return INCOMPATIBLE_STATE;
}
CHECK_JOYSTICK_NUMBER(joystickNum);
std::scoped_lock lock{driverStation->cacheMutex};
*touchpads = currentRead->touchpads[joystickNum];
return 0;
}
void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
HAL_JoystickPOVs* povs,
HAL_JoystickButtons* buttons) {
HAL_JoystickButtons* buttons,
HAL_JoystickTouchpads* touchpads) {
if (gShutdown) {
return;
}
@@ -276,6 +290,7 @@ void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
*axes = currentRead->axes[joystickNum];
*povs = currentRead->povs[joystickNum];
*buttons = currentRead->buttons[joystickNum];
*touchpads = currentRead->touchpads[joystickNum];
}
int32_t HAL_GetJoystickDescriptor(int32_t joystickNum,

View File

@@ -44,6 +44,7 @@ void DriverStationData::ResetData() {
m_joystickData[i].povs = HAL_JoystickPOVs{};
m_joystickData[i].buttons = HAL_JoystickButtons{};
m_joystickData[i].descriptor = HAL_JoystickDescriptor{};
m_joystickData[i].touchpads = HAL_JoystickTouchpads{};
m_joystickData[i].outputs.leds = 0;
m_joystickData[i].outputs.leftRumble = 0;
m_joystickData[i].outputs.rightRumble = 0;
@@ -105,6 +106,7 @@ void DriverStationData::ResetData() {
DEFINE_CPPAPI(Axes, axes, )
DEFINE_CPPAPI(POVs, povs, )
DEFINE_CPPAPI(Buttons, buttons, )
DEFINE_CPPAPI(Touchpads, touchpads, )
DEFINE_CPPAPI_CALLBACKS(Descriptor, descriptor, )
@@ -372,6 +374,42 @@ void DriverStationData::GetJoystickAvailables(int32_t stick,
*povsAvailable = m_joystickData[stick].povs.available;
}
void DriverStationData::SetJoystickTouchpadCounts(int32_t stick,
uint8_t touchpadCount,
const uint8_t* fingerCount) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
m_joystickData[stick].touchpads.count = touchpadCount;
for (uint8_t i = 0; i < touchpadCount; i++) {
m_joystickData[stick].touchpads.touchpads[i].count = fingerCount[i];
}
m_joystickTouchpadsCallbacks(stick, &m_joystickData[stick].touchpads);
}
void DriverStationData::SetJoystickTouchpadFinger(int32_t stick,
int32_t touchpad,
int32_t finger, HAL_Bool down,
double x, double y) {
if (stick < 0 || stick >= kNumJoysticks) {
return;
}
if (touchpad < 0 || touchpad >= HAL_kMaxJoystickTouchpads) {
return;
}
if (finger < 0 || finger >= HAL_kMaxJoystickTouchpadFingers) {
return;
}
std::scoped_lock lock(m_joystickDataMutex);
HAL_JoystickTouchpad& tp =
m_joystickData[stick].touchpads.touchpads[touchpad];
tp.fingers[finger].down = down;
tp.fingers[finger].x = x;
tp.fingers[finger].y = y;
m_joystickTouchpadsCallbacks(stick, &m_joystickData[stick].touchpads);
}
void DriverStationData::SetJoystickIsGamepad(int32_t stick,
HAL_Bool isGamepad) {
if (stick < 0 || stick >= kNumJoysticks) {
@@ -490,6 +528,7 @@ DEFINE_CAPI(double, MatchTime, matchTime)
DEFINE_CAPI(Axes, axes)
DEFINE_CAPI(POVs, povs)
DEFINE_CAPI(Buttons, buttons)
DEFINE_CAPI(Touchpads, touchpads)
DEFINE_CAPI(Descriptor, descriptor)
int32_t HALSIM_RegisterJoystickLedsCallback(int32_t joystickNum,
@@ -607,6 +646,19 @@ void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
buttonsAvailable, povsAvailable);
}
void HALSIM_SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount) {
SimDriverStationData->SetJoystickTouchpadCounts(stick, touchpadCount,
fingerCount);
}
void HALSIM_SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y) {
SimDriverStationData->SetJoystickTouchpadFinger(stick, touchpad, finger, down,
x, y);
}
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad) {
SimDriverStationData->SetJoystickIsGamepad(stick, isGamepad);
}

View File

@@ -28,6 +28,7 @@ class DriverStationData {
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickDescriptor)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickLeds)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickRumbles)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(JoystickTouchpads)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(MatchInfo)
HAL_SIMCALLBACKREGISTRY_DEFINE_NAME(NewData)
@@ -62,6 +63,15 @@ class DriverStationData {
void SetJoystickButtons(int32_t joystickNum,
const HAL_JoystickButtons* buttons);
int32_t RegisterJoystickTouchpadsCallback(
int32_t joystickNum, HAL_JoystickTouchpadsCallback callback, void* param,
HAL_Bool initialNotify);
void CancelJoystickTouchpadsCallback(int32_t uid);
void GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads);
void SetJoystickTouchpads(int32_t joystickNum,
const HAL_JoystickTouchpads* touchpads);
int32_t RegisterJoystickDescriptorCallback(
int32_t joystickNum, HAL_JoystickDescriptorCallback callback, void* param,
HAL_Bool initialNotify);
@@ -113,6 +123,11 @@ class DriverStationData {
void GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable);
void SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount);
void SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y);
void SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad);
void SetJoystickGamepadType(int32_t stick, int32_t type);
@@ -144,6 +159,8 @@ class DriverStationData {
m_joystickPOVsCallbacks;
SimCallbackRegistry<HAL_JoystickButtonsCallback, GetJoystickButtonsName>
m_joystickButtonsCallbacks;
SimCallbackRegistry<HAL_JoystickTouchpadsCallback, GetJoystickTouchpadsName>
m_joystickTouchpadsCallbacks;
SimCallbackRegistry<HAL_JoystickLedsCallback, GetJoystickLedsName>
m_joystickLedsCallbacks;
SimCallbackRegistry<HAL_JoystickRumblesCallback, GetJoystickRumblesName>
@@ -166,6 +183,7 @@ class DriverStationData {
HAL_JoystickAxes axes;
HAL_JoystickPOVs povs;
HAL_JoystickButtons buttons;
HAL_JoystickTouchpads touchpads;
JoystickOutputStore outputs;
HAL_JoystickDescriptor descriptor;
};