mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
[hal,wpilib] Add Touchpad support (#8401)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user