hid: Gesture support. Updated HidNpadSystemProperties.

This commit is contained in:
yellows8 2020-11-22 21:16:10 -05:00 committed by fincs
parent 324a835b0c
commit d3838b8e08
No known key found for this signature in database
GPG Key ID: 62C7609ADA219C60
2 changed files with 74 additions and 3 deletions

View File

@ -797,8 +797,8 @@ typedef struct {
u64 bit6 : 1; ///< Unused
u64 bit7 : 1; ///< Unused
u64 bit8 : 1; ///< Unused
u64 is_unsuported_button_pressed_on_npad_system : 1; ///< IsUnsuportedButtonPressedOnNpadSystem
u64 is_unsuported_button_pressed_on_npad_system_ext : 1; ///< IsUnsuportedButtonPressedOnNpadSystemExt
u64 is_unsupported_button_pressed_on_npad_system : 1; ///< IsUnsupportedButtonPressedOnNpadSystem
u64 is_unsupported_button_pressed_on_npad_system_ext : 1; ///< IsUnsupportedButtonPressedOnNpadSystemExt
u64 is_abxy_button_oriented : 1; ///< IsAbxyButtonOriented
u64 is_sl_sr_button_oriented : 1; ///< IsSlSrButtonOriented
@ -878,6 +878,53 @@ typedef struct HidNpad {
// End HidNpad
// Begin HidGesture
/// HidGesturePoint
typedef struct HidGesturePoint {
u32 x; ///< X
u32 y; ///< Y
} HidGesturePoint;
/// HidGestureState
typedef struct HidGestureState {
u64 sampling_number; ///< SamplingNumber
u64 context_number; ///< ContextNumber
u32 type; ///< \ref HidGestureType
u32 direction; ///< \ref HidGestureDirection
u32 x; ///< X
u32 y; ///< Y
s32 delta_x; ///< DeltaX
s32 delta_y; ///< DeltaY
float velocity_x; ///< VelocityX
float velocity_y; ///< VelocityY
u32 attributes; ///< Bitfield of \ref HidGestureAttribute.
u32 scale; ///< Scale
u32 rotation_angle; ///< RotationAngle
s32 point_count; ///< Number of entries in the points array.
HidGesturePoint points[4]; ///< Array of \ref HidGesturePoint with the above count.
} HidGestureState;
/// HidGestureDummyStateAtomicStorage
typedef struct HidGestureDummyStateAtomicStorage {
u64 sampling_number; ///< SamplingNumber
HidGestureState state;
} HidGestureDummyStateAtomicStorage;
/// HidGestureLifo
typedef struct HidGestureLifo {
HidCommonLifoHeader header;
HidGestureDummyStateAtomicStorage storage[17];
} HidGestureLifo;
/// HidGestureSharedMemoryFormat
typedef struct HidGestureSharedMemoryFormat {
HidGestureLifo lifo;
u8 pad[0xF8];
} HidGestureSharedMemoryFormat;
// End HidGesture
/// HidConsoleSixAxisSensor
typedef struct {
u64 sampling_number; ///< SamplingNumber
@ -901,7 +948,7 @@ typedef struct HidSharedMemory {
u8 input_detector[0x800];
u8 unique_pad[0x4000]; ///< [1.0.0-4.1.0] UniquePad
HidNpad npad[10];
u8 gesture[0x800];
HidGestureSharedMemoryFormat gesture;
HidConsoleSixAxisSensor console_six_axis_sensor; ///< [5.0.0+] ConsoleSixAxisSensor
u8 unk_x3C220[0x3DE0];
} HidSharedMemory;
@ -1053,6 +1100,9 @@ size_t hidGetNpadStatesSystem(HidNpadIdType id, HidNpadSystemState *states, size
size_t hidGetSixAxisSensorStates(HidSixAxisSensorHandle handle, HidSixAxisSensorState *states, size_t count);
void hidInitializeGesture(void);
size_t hidGetGestureStates(HidGestureState *states, size_t count);
bool hidIsControllerConnected(HidControllerID id);
u64 hidKeysHeld(HidControllerID id);

View File

@ -44,6 +44,7 @@ static Result _hidActivateTouchScreen(void);
static Result _hidActivateMouse(void);
static Result _hidActivateKeyboard(void);
static Result _hidActivateNpad(void);
static Result _hidActivateGesture(void);
static Result _hidSetDualModeAll(void);
@ -700,6 +701,20 @@ size_t hidGetSixAxisSensorStates(HidSixAxisSensorHandle handle, HidSixAxisSensor
return total;
}
void hidInitializeGesture(void) {
Result rc = _hidActivateGesture();
if (R_FAILED(rc)) diagAbortWithResult(rc);
}
size_t hidGetGestureStates(HidGestureState *states, size_t count) {
HidSharedMemory *sharedmem = (HidSharedMemory*)hidGetSharedmemAddr();
if (sharedmem == NULL)
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_NotInitialized));
size_t total = _hidGetStates(&sharedmem->gesture.lifo.header, sharedmem->gesture.lifo.storage, 17, offsetof(HidGestureDummyStateAtomicStorage,state), offsetof(HidGestureState,sampling_number), states, sizeof(HidGestureState), count);
return total;
}
bool hidIsControllerConnected(HidControllerID id) {
if (id==CONTROLLER_P1_AUTO)
return hidIsControllerConnected(g_controllerP1AutoID);
@ -1121,6 +1136,12 @@ Result hidSetSupportedNpadStyleSet(u32 style_set) {
return _hidCmdInU32AruidNoOut(style_set, 100);
}
static Result _hidActivateGesture(void) {
u32 val=1;
return _hidCmdInU32AruidNoOut(val, 91); // ActivateNpadWithRevision
}
Result hidGetSupportedNpadStyleSet(u32 *style_set) {
u32 tmp=0;
Result rc = _hidCmdOutU32(&tmp, 101);