mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
Add hidTouchCount, hidTouchRead, KEY_TOUCH. Header tweaks.
This commit is contained in:
parent
aa458e59f9
commit
63f91dd215
@ -1,7 +1,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <switch/types.h>
|
#include <switch/types.h>
|
||||||
|
|
||||||
// Begin enums
|
// Begin enums and output structs
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@ -259,6 +259,9 @@ typedef enum
|
|||||||
KEY_SL = BIT(24), ///< SL
|
KEY_SL = BIT(24), ///< SL
|
||||||
KEY_SR = BIT(25), ///< SR
|
KEY_SR = BIT(25), ///< SR
|
||||||
|
|
||||||
|
// Pseudo-key for at least one finger on the touch screen
|
||||||
|
KEY_TOUCH = BIT(26),
|
||||||
|
|
||||||
// Buttons by orientation (for single Joy-Con), also works with Joy-Con pairs, Pro Controller
|
// Buttons by orientation (for single Joy-Con), also works with Joy-Con pairs, Pro Controller
|
||||||
KEY_JOYCON_RIGHT = BIT(0),
|
KEY_JOYCON_RIGHT = BIT(0),
|
||||||
KEY_JOYCON_DOWN = BIT(1),
|
KEY_JOYCON_DOWN = BIT(1),
|
||||||
@ -292,17 +295,26 @@ typedef enum
|
|||||||
CONTROLLER_UNKNOWN = 9,
|
CONTROLLER_UNKNOWN = 9,
|
||||||
} HIDControllerID;
|
} HIDControllerID;
|
||||||
|
|
||||||
// End enums
|
typedef struct touchPosition
|
||||||
|
{
|
||||||
|
u32 px;
|
||||||
|
u32 py;
|
||||||
|
u32 dx;
|
||||||
|
u32 dy;
|
||||||
|
u32 angle;
|
||||||
|
} touchPosition;
|
||||||
|
|
||||||
|
// End enums and output structs
|
||||||
|
|
||||||
// Begin HIDTouchScreen
|
// Begin HIDTouchScreen
|
||||||
|
|
||||||
typedef struct HIDTouchScreenHeader
|
typedef struct HIDTouchScreenHeader
|
||||||
{
|
{
|
||||||
u64 timestamp;
|
u64 timestampTicks;
|
||||||
u64 numEntries;
|
u64 numEntries;
|
||||||
u64 latestEntry;
|
u64 latestEntry;
|
||||||
u64 maxEntryIndex;
|
u64 maxEntryIndex;
|
||||||
u64 timestamp_2;
|
u64 timestamp;
|
||||||
} HIDTouchScreenHeader;
|
} HIDTouchScreenHeader;
|
||||||
static_assert(sizeof(HIDTouchScreenHeader) == 0x28, "HID touch screen header structure has incorrect size");
|
static_assert(sizeof(HIDTouchScreenHeader) == 0x28, "HID touch screen header structure has incorrect size");
|
||||||
|
|
||||||
@ -316,13 +328,14 @@ static_assert(sizeof(HIDTouchScreenEntryHeader) == 0x10, "HID touch screen entry
|
|||||||
typedef struct HIDTouchScreenEntryTouch
|
typedef struct HIDTouchScreenEntryTouch
|
||||||
{
|
{
|
||||||
u64 timestamp;
|
u64 timestamp;
|
||||||
u64 unk_1;
|
u32 padding;
|
||||||
|
u32 touchIndex;
|
||||||
u32 x;
|
u32 x;
|
||||||
u32 y;
|
u32 y;
|
||||||
u32 diameterX;
|
u32 diameterX;
|
||||||
u32 diameterY;
|
u32 diameterY;
|
||||||
u32 angle;
|
u32 angle;
|
||||||
u32 unk_2;
|
u32 padding_2;
|
||||||
} HIDTouchScreenEntryTouch;
|
} HIDTouchScreenEntryTouch;
|
||||||
static_assert(sizeof(HIDTouchScreenEntryTouch) == 0x28, "HID touch screen touch structure has incorrect size");
|
static_assert(sizeof(HIDTouchScreenEntryTouch) == 0x28, "HID touch screen touch structure has incorrect size");
|
||||||
|
|
||||||
@ -330,14 +343,15 @@ typedef struct HIDTouchScreenEntry
|
|||||||
{
|
{
|
||||||
HIDTouchScreenEntryHeader header;
|
HIDTouchScreenEntryHeader header;
|
||||||
HIDTouchScreenEntryTouch touches[16];
|
HIDTouchScreenEntryTouch touches[16];
|
||||||
|
u64 unk;
|
||||||
} HIDTouchScreenEntry;
|
} HIDTouchScreenEntry;
|
||||||
static_assert(sizeof(HIDTouchScreenEntry) == 0x290, "HID touch screen entry structure has incorrect size");
|
static_assert(sizeof(HIDTouchScreenEntry) == 0x298, "HID touch screen entry structure has incorrect size");
|
||||||
|
|
||||||
typedef struct HIDTouchScreen
|
typedef struct HIDTouchScreen
|
||||||
{
|
{
|
||||||
HIDTouchScreenHeader header;
|
HIDTouchScreenHeader header;
|
||||||
HIDTouchScreenEntry entries[17];
|
HIDTouchScreenEntry entries[17];
|
||||||
u8 padding[0x448];
|
u8 padding[0x3c0];
|
||||||
} HIDTouchScreen;
|
} HIDTouchScreen;
|
||||||
static_assert(sizeof(HIDTouchScreen) == 0x3000, "HID touch screen structure has incorrect size");
|
static_assert(sizeof(HIDTouchScreen) == 0x3000, "HID touch screen structure has incorrect size");
|
||||||
|
|
||||||
@ -347,7 +361,7 @@ static_assert(sizeof(HIDTouchScreen) == 0x3000, "HID touch screen structure has
|
|||||||
|
|
||||||
typedef struct HIDMouseHeader
|
typedef struct HIDMouseHeader
|
||||||
{
|
{
|
||||||
u64 timestamp;
|
u64 timestampTicks;
|
||||||
u64 numEntries;
|
u64 numEntries;
|
||||||
u64 latestEntry;
|
u64 latestEntry;
|
||||||
u64 maxEntryIndex;
|
u64 maxEntryIndex;
|
||||||
@ -382,7 +396,7 @@ static_assert(sizeof(HIDMouse) == 0x400, "HID mouse structure has incorrect size
|
|||||||
|
|
||||||
typedef struct HIDKeyboardHeader
|
typedef struct HIDKeyboardHeader
|
||||||
{
|
{
|
||||||
u64 timestamp;
|
u64 timestampTicks;
|
||||||
u64 numEntries;
|
u64 numEntries;
|
||||||
u64 latestEntry;
|
u64 latestEntry;
|
||||||
u64 maxEntryIndex;
|
u64 maxEntryIndex;
|
||||||
@ -436,7 +450,7 @@ static_assert(sizeof(HIDControllerHeader) == 0x28, "HID controller header struct
|
|||||||
|
|
||||||
typedef struct HIDControllerLayoutHeader
|
typedef struct HIDControllerLayoutHeader
|
||||||
{
|
{
|
||||||
u64 timestamp;
|
u64 timestampTicks;
|
||||||
u64 numEntries;
|
u64 numEntries;
|
||||||
u64 latestEntry;
|
u64 latestEntry;
|
||||||
u64 maxEntryIndex;
|
u64 maxEntryIndex;
|
||||||
@ -522,3 +536,6 @@ bool hidKeyboardModifierUp(HIDKeyboardModifier modifier);
|
|||||||
bool hidKeyboardHeld(HIDKeyboardScancode key);
|
bool hidKeyboardHeld(HIDKeyboardScancode key);
|
||||||
bool hidKeyboardDown(HIDKeyboardScancode key);
|
bool hidKeyboardDown(HIDKeyboardScancode key);
|
||||||
bool hidKeyboardUp(HIDKeyboardScancode key);
|
bool hidKeyboardUp(HIDKeyboardScancode key);
|
||||||
|
|
||||||
|
u32 hidTouchCount(void);
|
||||||
|
void hidTouchRead(touchPosition *pos, u32 point_id);
|
||||||
|
@ -137,6 +137,9 @@ void hidScanInput(void) {
|
|||||||
if ((s64)(newTouchEntry->header.timestamp - g_touchTimestamp) > 0) {
|
if ((s64)(newTouchEntry->header.timestamp - g_touchTimestamp) > 0) {
|
||||||
memcpy(&g_touchEntry, newTouchEntry, sizeof(HIDTouchScreenEntry));
|
memcpy(&g_touchEntry, newTouchEntry, sizeof(HIDTouchScreenEntry));
|
||||||
g_touchTimestamp = newTouchEntry->header.timestamp;
|
g_touchTimestamp = newTouchEntry->header.timestamp;
|
||||||
|
|
||||||
|
if (hidTouchCount())
|
||||||
|
g_controllerHeld[CONTROLLER_HANDHELD] |= KEY_TOUCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 latestMouseEntry = sharedMem->mouse.header.latestEntry;
|
u64 latestMouseEntry = sharedMem->mouse.header.latestEntry;
|
||||||
@ -176,7 +179,7 @@ void hidScanInput(void) {
|
|||||||
memcpy(&g_controllerEntries[i], newInputEntry, sizeof(HIDControllerInputEntry));
|
memcpy(&g_controllerEntries[i], newInputEntry, sizeof(HIDControllerInputEntry));
|
||||||
g_controllerTimestamps[i] = newInputEntry->timestamp;
|
g_controllerTimestamps[i] = newInputEntry->timestamp;
|
||||||
|
|
||||||
g_controllerHeld[i] = g_controllerEntries[i].buttons;
|
g_controllerHeld[i] |= g_controllerEntries[i].buttons;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_controllerDown[i] = (~g_controllerOld[i]) & g_controllerHeld[i];
|
g_controllerDown[i] = (~g_controllerOld[i]) & g_controllerHeld[i];
|
||||||
@ -238,6 +241,25 @@ bool hidKeyboardUp(HIDKeyboardScancode key) {
|
|||||||
return g_keyboardUp[key / 32] & (1 << (key % 32));
|
return g_keyboardUp[key / 32] & (1 << (key % 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 hidTouchCount(void) {
|
||||||
|
return g_touchEntry.header.numTouches;
|
||||||
|
}
|
||||||
|
|
||||||
|
void hidTouchRead(touchPosition *pos, u32 point_id) {
|
||||||
|
if (pos) {
|
||||||
|
if (point_id >= g_touchEntry.header.numTouches) {
|
||||||
|
memset(pos, 0, sizeof(touchPosition));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos->px = g_touchEntry.touches[point_id].x;
|
||||||
|
pos->py = g_touchEntry.touches[point_id].y;
|
||||||
|
pos->dx = g_touchEntry.touches[point_id].diameterX;
|
||||||
|
pos->dy = g_touchEntry.touches[point_id].diameterY;
|
||||||
|
pos->angle = g_touchEntry.touches[point_id].angle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static Result _hidCreateAppletResource(Handle sessionhandle, Handle* handle_out, u64 AppletResourceUserId) {
|
static Result _hidCreateAppletResource(Handle sessionhandle, Handle* handle_out, u64 AppletResourceUserId) {
|
||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
ipcInitialize(&c);
|
ipcInitialize(&c);
|
||||||
|
Loading…
Reference in New Issue
Block a user