[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

@@ -36,6 +36,11 @@ static_assert(org_wpilib_hardware_hal_DriverStationJNI_kMaxJoystickPOVs ==
HAL_kMaxJoystickPOVs);
static_assert(org_wpilib_hardware_hal_DriverStationJNI_kMaxJoysticks ==
HAL_kMaxJoysticks);
static_assert(org_wpilib_hardware_hal_DriverStationJNI_kMaxJoystickTouchpads ==
HAL_kMaxJoystickTouchpads);
static_assert(
org_wpilib_hardware_hal_DriverStationJNI_kMaxJoystickTouchpadFingers ==
HAL_kMaxJoystickTouchpadFingers);
using namespace wpi::hal;
using namespace wpi::util::java;
@@ -137,36 +142,55 @@ Java_org_wpilib_hardware_hal_DriverStationJNI_nativeGetAllianceStation
/*
* Class: org_wpilib_hardware_hal_DriverStationJNI
* Method: getAllJoystickData
* Signature: (I[F[S[B[J)V
* Signature: (I[F[S[B[F[J)V
*/
JNIEXPORT void JNICALL
Java_org_wpilib_hardware_hal_DriverStationJNI_getAllJoystickData
(JNIEnv* env, jclass cls, jint stick, jfloatArray axesArray,
jshortArray rawAxesArray, jbyteArray povsArray,
jlongArray buttonsAndMetadataArray)
jfloatArray touchpadFingersData, jlongArray buttonsAndMetadataArray)
{
HAL_JoystickAxes axes;
HAL_JoystickPOVs povs;
HAL_JoystickButtons buttons;
HAL_JoystickTouchpads touchpads;
HAL_GetAllJoystickData(stick, &axes, &povs, &buttons);
HAL_GetAllJoystickData(stick, &axes, &povs, &buttons, &touchpads);
CriticalJSpan<jfloat> jAxes(env, axesArray);
CriticalJSpan<jshort> jRawAxes(env, rawAxesArray);
CriticalJSpan<jbyte> jPovs(env, povsArray);
CriticalJSpan<jfloat> jTouchpadFingers(env, touchpadFingersData);
CriticalJSpan<jlong> jButtons(env, buttonsAndMetadataArray);
static_assert(sizeof(jAxes[0]) == sizeof(axes.axes[0]));
static_assert(sizeof(jRawAxes[0]) == sizeof(axes.raw[0]));
static_assert(sizeof(jPovs[0]) == sizeof(povs.povs[0]));
static_assert(sizeof(jTouchpadFingers[0]) ==
sizeof(touchpads.touchpads[0].fingers[0].x));
std::memcpy(&jAxes[0], axes.axes, sizeof(axes.axes));
std::memcpy(&jRawAxes[0], axes.raw, sizeof(axes.raw));
std::memcpy(&jPovs[0], povs.povs, sizeof(povs.povs));
jTouchpadFingers[0] = touchpads.touchpads[0].fingers[0].x;
jTouchpadFingers[1] = touchpads.touchpads[0].fingers[0].y;
jTouchpadFingers[2] = touchpads.touchpads[0].fingers[1].x;
jTouchpadFingers[3] = touchpads.touchpads[0].fingers[1].y;
jTouchpadFingers[4] = touchpads.touchpads[1].fingers[0].x;
jTouchpadFingers[5] = touchpads.touchpads[1].fingers[0].y;
jTouchpadFingers[6] = touchpads.touchpads[1].fingers[1].x;
jTouchpadFingers[7] = touchpads.touchpads[1].fingers[1].y;
jButtons[0] = axes.available;
jButtons[1] = povs.available;
jButtons[2] = buttons.available;
jButtons[3] = buttons.buttons;
jButtons[4] = touchpads.count;
jButtons[5] = (touchpads.touchpads[0].fingers[0].down ? 1 : 0) |
(touchpads.touchpads[0].fingers[1].down ? 2 : 0) |
(touchpads.touchpads[0].count << 2);
jButtons[6] = (touchpads.touchpads[1].fingers[0].down ? 1 : 0) |
(touchpads.touchpads[1].fingers[1].down ? 2 : 0) |
(touchpads.touchpads[1].count << 2);
}
/*

View File

@@ -710,6 +710,38 @@ Java_org_wpilib_hardware_hal_simulation_DriverStationDataJNI_setJoystickButtonsA
HALSIM_SetJoystickButtonsAvailable(stick, available);
}
/*
* Class: org_wpilib_hardware_hal_simulation_DriverStationDataJNI
* Method: setTouchpadCounts
* Signature: (II[I)V
*/
JNIEXPORT void JNICALL
Java_org_wpilib_hardware_hal_simulation_DriverStationDataJNI_setTouchpadCounts
(JNIEnv* env, jclass, jint stick, jint touchpadCount, jintArray fingerCounts)
{
JSpan<const jint> jArrayRef(env, fingerCounts);
uint8_t fingerCountsLocal[2];
size_t toCopy = (std::min)(jArrayRef.size(), static_cast<size_t>(2));
for (size_t i = 0; i < toCopy; ++i) {
fingerCountsLocal[i] = static_cast<uint8_t>(jArrayRef[i]);
}
HALSIM_SetJoystickTouchpadCounts(stick, touchpadCount, fingerCountsLocal);
}
/*
* Class: org_wpilib_hardware_hal_simulation_DriverStationDataJNI
* Method: setTouchpadFinger
* Signature: (IIIZFF)V
*/
JNIEXPORT void JNICALL
Java_org_wpilib_hardware_hal_simulation_DriverStationDataJNI_setTouchpadFinger
(JNIEnv*, jclass, jint stick, jint touchpadIndex, jint fingerIndex,
jboolean down, jfloat x, jfloat y)
{
HALSIM_SetJoystickTouchpadFinger(stick, touchpadIndex, fingerIndex, down, x,
y);
}
/*
* Class: org_wpilib_hardware_hal_simulation_DriverStationDataJNI
* Method: setJoystickIsGamepad

View File

@@ -111,6 +111,7 @@ bool wpi::util::Protobuf<mrc::ControlData>::Pack(
std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
InputStream& Stream) {
wpi::util::UnpackCallback<int16_t, MRC_MAX_NUM_AXES> AxesCb;
wpi::util::UnpackCallback<mrc::Touchpad, MRC_MAX_NUM_TOUCHPADS> TouchpadCb;
mrc_proto_ProtobufJoystickData Msg{
.AvailableButtons = 0,
@@ -119,6 +120,7 @@ std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
.Axes = AxesCb.Callback(),
.POVCount = 0,
.POVs = 0,
.Touchpads = TouchpadCb.Callback(),
};
if (!Stream.Decode(Msg)) {
@@ -126,6 +128,7 @@ std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
}
auto Axes = AxesCb.Items();
auto Touchpads = TouchpadCb.Items();
mrc::Joystick Joystick;
Joystick.Axes.SetAvailable(Msg.AvailableAxes);
@@ -147,12 +150,18 @@ std::optional<mrc::Joystick> wpi::util::Protobuf<mrc::Joystick>::Unpack(
Joystick.Povs.Povs()[i] = Val;
}
Joystick.Touchpads.SetTouchpadCount(static_cast<uint8_t>(Touchpads.size()));
for (size_t i = 0; i < Joystick.Touchpads.GetTouchpadCount(); i++) {
Joystick.Touchpads.Touchpads()[i] = std::move(Touchpads[i]);
}
return Joystick;
}
bool wpi::util::Protobuf<mrc::Joystick>::Pack(OutputStream& Stream,
const mrc::Joystick& Value) {
wpi::util::PackCallback AxesCb{Value.Axes.Axes()};
wpi::util::PackCallback TouchpadCb{Value.Touchpads.Touchpads()};
uint32_t PovsStore = 0;
for (int i = static_cast<int>(Value.Povs.GetCount()) - 1; i >= 0; i--) {
@@ -167,6 +176,72 @@ bool wpi::util::Protobuf<mrc::Joystick>::Pack(OutputStream& Stream,
.Axes = AxesCb.Callback(),
.POVCount = static_cast<uint32_t>(Value.Povs.GetCount()),
.POVs = PovsStore,
.Touchpads = TouchpadCb.Callback(),
};
return Stream.Encode(Msg);
}
std::optional<mrc::TouchpadFinger>
wpi::util::Protobuf<mrc::TouchpadFinger>::Unpack(InputStream& Stream) {
mrc_proto_ProtobufFingerData Msg{
.X = 0,
.Y = 0,
.Down = false,
};
if (!Stream.Decode(Msg)) {
return {};
}
return mrc::TouchpadFinger{
.Down = Msg.Down,
.X = static_cast<uint16_t>(Msg.X),
.Y = static_cast<uint16_t>(Msg.Y),
};
}
bool wpi::util::Protobuf<mrc::TouchpadFinger>::Pack(
OutputStream& Stream, const mrc::TouchpadFinger& Value) {
mrc_proto_ProtobufFingerData Msg{
.X = Value.X,
.Y = Value.Y,
.Down = Value.Down,
};
return Stream.Encode(Msg);
}
std::optional<mrc::Touchpad> wpi::util::Protobuf<mrc::Touchpad>::Unpack(
InputStream& Stream) {
wpi::util::UnpackCallback<mrc::TouchpadFinger, MRC_MAX_NUM_TOUCHPAD_FINGERS>
FingersCb;
mrc_proto_ProtobufTouchpadData Msg{
.Fingers = FingersCb.Callback(),
};
if (!Stream.Decode(Msg)) {
return {};
}
auto Fingers = FingersCb.Items();
mrc::Touchpad Touchpad;
Touchpad.SetFingerCount(Fingers.size());
for (size_t i = 0; i < Touchpad.GetFingerCount(); i++) {
Touchpad.Fingers()[i] = Fingers[i];
}
return Touchpad;
}
bool wpi::util::Protobuf<mrc::Touchpad>::Pack(OutputStream& Stream,
const mrc::Touchpad& Value) {
wpi::util::PackCallback FingersCb{Value.Fingers()};
mrc_proto_ProtobufTouchpadData Msg{
.Fingers = FingersCb.Callback(),
};
return Stream.Encode(Msg);

View File

@@ -100,9 +100,28 @@ int32_t HAL_GetJoystickPOVs(int32_t joystickNum, HAL_JoystickPOVs* povs);
int32_t HAL_GetJoystickButtons(int32_t joystickNum,
HAL_JoystickButtons* buttons);
/**
* Gets the touchpads of a specific joystick.
* @param joystickNum the joystick number
* @param touchpads the touchpad values (output)
* @return the error code, or 0 for success
*/
int32_t HAL_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads);
/**
* Gets all the data of a specific joystick.
*
* @param joystickNum the joystick number
* @param axes the axes values (output)
* @param povs the POV values (output)
* @param buttons the button values (output)
* @param touchpads the touchpad values (output)
*/
void HAL_GetAllJoystickData(int32_t joystickNum, HAL_JoystickAxes* axes,
HAL_JoystickPOVs* povs,
HAL_JoystickButtons* buttons);
HAL_JoystickButtons* buttons,
HAL_JoystickTouchpads* touchpads);
/**
* Retrieves the Joystick Descriptor for particular slot.

View File

@@ -50,6 +50,20 @@ HAL_ENUM(HAL_MatchType) {
HAL_kMatchType_elimination,
};
/**
* The maximum number of touchpads that will be stored in a single
* HAL_JoystickTouchpads struct. This is used for allocating buffers, not
* bounds checking, since there are usually less touchpads in practice.
*/
#define HAL_kMaxJoystickTouchpads 2
/**
* The maximum number of fingers that will be stored in a single
* HAL_JoystickTouchpad struct. This is used for allocating buffers, not
* bounds checking, since there are usually less fingers in practice.
*/
#define HAL_kMaxJoystickTouchpadFingers 2
/**
* The maximum number of axes that will be stored in a single HAL_JoystickAxes
* struct. This is used for allocating buffers, not bounds checking, since there
@@ -107,6 +121,25 @@ struct HAL_JoystickButtons {
};
typedef struct HAL_JoystickButtons HAL_JoystickButtons;
struct HAL_JoystickTouchpadFinger {
uint8_t down;
float x;
float y;
};
typedef struct HAL_JoystickTouchpadFinger HAL_JoystickTouchpadFinger;
struct HAL_JoystickTouchpad {
uint8_t count;
HAL_JoystickTouchpadFinger fingers[HAL_kMaxJoystickTouchpadFingers];
};
typedef struct HAL_JoystickTouchpad HAL_JoystickTouchpad;
struct HAL_JoystickTouchpads {
uint8_t count;
HAL_JoystickTouchpad touchpads[HAL_kMaxJoystickTouchpads];
};
typedef struct HAL_JoystickTouchpads HAL_JoystickTouchpads;
struct HAL_JoystickDescriptor {
uint8_t isGamepad;
uint8_t gamepadType;

View File

@@ -27,3 +27,21 @@ struct wpi::util::Protobuf<mrc::Joystick> {
static std::optional<mrc::Joystick> Unpack(InputStream& Stream);
static bool Pack(OutputStream& Stream, const mrc::Joystick& Value);
};
template <>
struct wpi::util::Protobuf<mrc::TouchpadFinger> {
using MessageStruct = mrc_proto_ProtobufFingerData;
using InputStream = wpi::util::ProtoInputStream<mrc::TouchpadFinger>;
using OutputStream = wpi::util::ProtoOutputStream<mrc::TouchpadFinger>;
static std::optional<mrc::TouchpadFinger> Unpack(InputStream& Stream);
static bool Pack(OutputStream& Stream, const mrc::TouchpadFinger& Value);
};
template <>
struct wpi::util::Protobuf<mrc::Touchpad> {
using MessageStruct = mrc_proto_ProtobufTouchpadData;
using InputStream = wpi::util::ProtoInputStream<mrc::Touchpad>;
using OutputStream = wpi::util::ProtoOutputStream<mrc::Touchpad>;
static std::optional<mrc::Touchpad> Unpack(InputStream& Stream);
static bool Pack(OutputStream& Stream, const mrc::Touchpad& Value);
};

View File

@@ -20,6 +20,9 @@ typedef void (*HAL_JoystickPOVsCallback)(const char* name, void* param,
typedef void (*HAL_JoystickButtonsCallback)(const char* name, void* param,
int32_t joystickNum,
const HAL_JoystickButtons* buttons);
typedef void (*HAL_JoystickTouchpadsCallback)(
const char* name, void* param, int32_t joystickNum,
const HAL_JoystickTouchpads* touchpads);
typedef void (*HAL_JoystickDescriptorCallback)(
const char* name, void* param, int32_t joystickNum,
const HAL_JoystickDescriptor* descriptor);
@@ -113,6 +116,15 @@ void HALSIM_GetJoystickButtons(int32_t joystickNum,
void HALSIM_SetJoystickButtons(int32_t joystickNum,
const HAL_JoystickButtons* buttons);
int32_t HALSIM_RegisterJoystickTouchpadsCallback(
int32_t joystickNum, HAL_JoystickTouchpadsCallback callback, void* param,
HAL_Bool initialNotify);
void HALSIM_CancelJoystickTouchpadsCallback(int32_t uid);
void HALSIM_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads);
void HALSIM_SetJoystickTouchpads(int32_t joystickNum,
const HAL_JoystickTouchpads* touchpads);
int32_t HALSIM_RegisterJoystickDescriptorCallback(
int32_t joystickNum, HAL_JoystickDescriptorCallback callback, void* param,
HAL_Bool initialNotify);
@@ -157,6 +169,11 @@ void HALSIM_SetJoystickButtonsAvailable(int32_t stick, uint64_t available);
void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
uint64_t* buttonsAvailable,
uint8_t* povsAvailable);
void HALSIM_SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount);
void HALSIM_SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y);
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad);
void HALSIM_SetJoystickGamepadType(int32_t stick, int32_t type);

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;
};

View File

@@ -45,6 +45,8 @@ static_assert(sizeof(int32_t) >= sizeof(int),
static_assert(MRC_MAX_NUM_AXES == HAL_kMaxJoystickAxes);
static_assert(MRC_MAX_NUM_POVS == HAL_kMaxJoystickPOVs);
static_assert(MRC_MAX_NUM_JOYSTICKS == HAL_kMaxJoysticks);
static_assert(MRC_MAX_NUM_TOUCHPADS == HAL_kMaxJoystickTouchpads);
static_assert(MRC_MAX_NUM_TOUCHPAD_FINGERS == HAL_kMaxJoystickTouchpadFingers);
namespace {
struct JoystickDataCache {
@@ -54,6 +56,7 @@ struct JoystickDataCache {
HAL_JoystickAxes axes[HAL_kMaxJoysticks];
HAL_JoystickPOVs povs[HAL_kMaxJoysticks];
HAL_JoystickButtons buttons[HAL_kMaxJoysticks];
HAL_JoystickTouchpads touchpads[HAL_kMaxJoysticks];
HAL_AllianceStationID allianceStation;
float matchTime;
HAL_ControlWord controlWord;
@@ -275,6 +278,19 @@ void JoystickDataCache::Update(const mrc::ControlData& data) {
buttons[count].available = newStick.Buttons.GetAvailable();
buttons[count].buttons = newStick.Buttons.Buttons;
touchpads[count].count = newStick.Touchpads.GetTouchpadCount();
const auto& newTouchpads = newStick.Touchpads.Touchpads();
for (size_t i = 0; i < newTouchpads.size(); i++) {
const auto& touchpadFingers = newTouchpads[i].Fingers();
touchpads[count].touchpads[i].count = touchpadFingers.size();
for (size_t j = 0; j < touchpadFingers.size(); j++) {
auto& finger = touchpadFingers[j];
touchpads[count].touchpads[i].fingers[j].down = finger.Down ? 1 : 0;
touchpads[count].touchpads[i].fingers[j].x = finger.X;
touchpads[count].touchpads[i].fingers[j].y = finger.Y;
}
}
}
}
@@ -484,13 +500,23 @@ int32_t HAL_GetJoystickButtons(int32_t joystickNum,
return 0;
}
int32_t HAL_GetJoystickTouchpads(int32_t joystickNum,
HAL_JoystickTouchpads* touchpads) {
CHECK_JOYSTICK_NUMBER(joystickNum);
std::scoped_lock lock{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) {
std::scoped_lock lock{cacheMutex};
*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

@@ -41,6 +41,7 @@ DEFINE_CAPI(double, MatchTime, 0)
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,
@@ -115,6 +116,13 @@ void HALSIM_GetJoystickAvailables(int32_t stick, uint16_t* axesAvailable,
*povsAvailable = 0;
}
void HALSIM_SetJoystickTouchpadCounts(int32_t stick, uint8_t touchpadCount,
const uint8_t* fingerCount) {}
void HALSIM_SetJoystickTouchpadFinger(int32_t stick, int32_t touchpad,
int32_t finger, HAL_Bool down, double x,
double y) {}
void HALSIM_SetJoystickIsGamepad(int32_t stick, HAL_Bool isGamepad) {}
void HALSIM_SetJoystickGamepadType(int32_t stick, int32_t type) {}