mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-27 02:01: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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {}
|
||||
|
||||
Reference in New Issue
Block a user