mirror of
https://github.com/switchbrew/libnx.git
synced 2025-08-07 08:39:24 +02:00
hid: Added hidGetKeyboardStates, which hidScanInput now uses.
Struct adjustments.
This commit is contained in:
parent
52bf73e047
commit
d4c1d069f1
@ -530,20 +530,25 @@ typedef struct HidMouseLifo {
|
|||||||
|
|
||||||
// Begin HidKeyboard
|
// Begin HidKeyboard
|
||||||
|
|
||||||
/// HidKeyboardEntry
|
/// HidKeyboardState
|
||||||
typedef struct HidKeyboardEntry {
|
typedef struct HidKeyboardState {
|
||||||
u64 timestamp;
|
u64 timestamp;
|
||||||
u64 timestamp_2;
|
|
||||||
u64 modifier;
|
u64 modifier;
|
||||||
u32 keys[8];
|
u32 keys[8];
|
||||||
} HidKeyboardEntry;
|
} HidKeyboardState;
|
||||||
|
|
||||||
/// HidKeyboard
|
/// HidKeyboardStateAtomicStorage
|
||||||
typedef struct HidKeyboard {
|
typedef struct HidKeyboardStateAtomicStorage {
|
||||||
|
u64 timestamp;
|
||||||
|
HidKeyboardState state;
|
||||||
|
} HidKeyboardStateAtomicStorage;
|
||||||
|
|
||||||
|
/// HidKeyboardLifo
|
||||||
|
typedef struct HidKeyboardLifo {
|
||||||
HidCommonStateHeader header;
|
HidCommonStateHeader header;
|
||||||
HidKeyboardEntry entries[17];
|
HidKeyboardStateAtomicStorage entries[17];
|
||||||
u8 padding[0x28];
|
u8 padding[0x28];
|
||||||
} HidKeyboard;
|
} HidKeyboardLifo;
|
||||||
|
|
||||||
// End HidKeyboard
|
// End HidKeyboard
|
||||||
|
|
||||||
@ -769,7 +774,7 @@ typedef struct HidSharedMemory {
|
|||||||
u8 debug_pad[0x400];
|
u8 debug_pad[0x400];
|
||||||
HidTouchScreenLifo touchscreen;
|
HidTouchScreenLifo touchscreen;
|
||||||
HidMouseLifo mouse;
|
HidMouseLifo mouse;
|
||||||
HidKeyboard keyboard;
|
HidKeyboardLifo keyboard;
|
||||||
u8 digitizer[0x1000]; ///< [10.0.0+] Digitizer [1.0.0-9.2.0] BasicXpad
|
u8 digitizer[0x1000]; ///< [10.0.0+] Digitizer [1.0.0-9.2.0] BasicXpad
|
||||||
u8 home_button[0x200];
|
u8 home_button[0x200];
|
||||||
u8 sleep_button[0x200];
|
u8 sleep_button[0x200];
|
||||||
@ -879,6 +884,8 @@ size_t hidGetTouchScreenStates(HidTouchScreenState *states, size_t count);
|
|||||||
|
|
||||||
size_t hidGetMouseStates(HidMouseState *states, size_t count);
|
size_t hidGetMouseStates(HidMouseState *states, size_t count);
|
||||||
|
|
||||||
|
size_t hidGetKeyboardStates(HidKeyboardState *states, size_t count);
|
||||||
|
|
||||||
/// Gets a bitfield of \ref HidNpadStyleTag for the specified controller.
|
/// Gets a bitfield of \ref HidNpadStyleTag for the specified controller.
|
||||||
u32 hidGetNpadStyleSet(HidNpadIdType id);
|
u32 hidGetNpadStyleSet(HidNpadIdType id);
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ static SharedMemory g_hidSharedmem;
|
|||||||
|
|
||||||
static HidTouchScreenState g_touchScreenState;
|
static HidTouchScreenState g_touchScreenState;
|
||||||
static HidMouseState g_mouseState;
|
static HidMouseState g_mouseState;
|
||||||
static HidKeyboardEntry g_keyboardEntry;
|
static HidKeyboardState g_keyboardState;
|
||||||
static HidNpadStateEntry g_controllerEntries[10];
|
static HidNpadStateEntry g_controllerEntries[10];
|
||||||
|
|
||||||
static u64 g_mouseOld, g_mouseHeld, g_mouseDown, g_mouseUp;
|
static u64 g_mouseOld, g_mouseHeld, g_mouseDown, g_mouseUp;
|
||||||
@ -26,8 +26,6 @@ static u64 g_keyboardModOld, g_keyboardModHeld, g_keyboardModDown, g_keyboardMod
|
|||||||
static u32 g_keyboardOld[8], g_keyboardHeld[8], g_keyboardDown[8], g_keyboardUp[8];
|
static u32 g_keyboardOld[8], g_keyboardHeld[8], g_keyboardDown[8], g_keyboardUp[8];
|
||||||
static u64 g_controllerOld[10], g_controllerHeld[10], g_controllerDown[10], g_controllerUp[10];
|
static u64 g_controllerOld[10], g_controllerHeld[10], g_controllerDown[10], g_controllerUp[10];
|
||||||
|
|
||||||
static u64 g_keyboardTimestamp;
|
|
||||||
|
|
||||||
static HidControllerID g_controllerP1AutoID;
|
static HidControllerID g_controllerP1AutoID;
|
||||||
|
|
||||||
static u8* g_sevenSixAxisSensorBuffer;
|
static u8* g_sevenSixAxisSensorBuffer;
|
||||||
@ -120,7 +118,7 @@ void hidReset(void) {
|
|||||||
// Reset internal state
|
// Reset internal state
|
||||||
memset(&g_touchScreenState, 0, sizeof(HidTouchScreenState));
|
memset(&g_touchScreenState, 0, sizeof(HidTouchScreenState));
|
||||||
memset(&g_mouseState, 0, sizeof(HidMouseState));
|
memset(&g_mouseState, 0, sizeof(HidMouseState));
|
||||||
memset(&g_keyboardEntry, 0, sizeof(HidKeyboardEntry));
|
memset(&g_keyboardState, 0, sizeof(HidKeyboardState));
|
||||||
memset(g_controllerEntries, 0, sizeof(g_controllerEntries));
|
memset(g_controllerEntries, 0, sizeof(g_controllerEntries));
|
||||||
|
|
||||||
g_mouseOld = g_mouseHeld = g_mouseDown = g_mouseUp = 0;
|
g_mouseOld = g_mouseHeld = g_mouseDown = g_mouseUp = 0;
|
||||||
@ -146,8 +144,6 @@ void* hidGetSharedmemAddr(void) {
|
|||||||
void hidScanInput(void) {
|
void hidScanInput(void) {
|
||||||
rwlockWriteLock(&g_hidLock);
|
rwlockWriteLock(&g_hidLock);
|
||||||
|
|
||||||
HidSharedMemory *sharedMem = (HidSharedMemory*)hidGetSharedmemAddr();
|
|
||||||
|
|
||||||
g_mouseOld = g_mouseHeld;
|
g_mouseOld = g_mouseHeld;
|
||||||
g_keyboardModOld = g_keyboardModHeld;
|
g_keyboardModOld = g_keyboardModHeld;
|
||||||
memcpy(g_keyboardOld, g_keyboardHeld, sizeof(g_keyboardOld));
|
memcpy(g_keyboardOld, g_keyboardHeld, sizeof(g_keyboardOld));
|
||||||
@ -159,7 +155,7 @@ void hidScanInput(void) {
|
|||||||
memset(g_controllerHeld, 0, sizeof(g_controllerHeld));
|
memset(g_controllerHeld, 0, sizeof(g_controllerHeld));
|
||||||
memset(&g_touchScreenState, 0, sizeof(HidTouchScreenState));
|
memset(&g_touchScreenState, 0, sizeof(HidTouchScreenState));
|
||||||
memset(&g_mouseState, 0, sizeof(HidMouseState));
|
memset(&g_mouseState, 0, sizeof(HidMouseState));
|
||||||
memset(&g_keyboardEntry, 0, sizeof(HidKeyboardEntry));
|
memset(&g_keyboardState, 0, sizeof(HidKeyboardState));
|
||||||
memset(g_controllerEntries, 0, sizeof(g_controllerEntries));
|
memset(g_controllerEntries, 0, sizeof(g_controllerEntries));
|
||||||
|
|
||||||
if (hidGetTouchScreenStates(&g_touchScreenState, 1)) {
|
if (hidGetTouchScreenStates(&g_touchScreenState, 1)) {
|
||||||
@ -173,22 +169,17 @@ void hidScanInput(void) {
|
|||||||
g_mouseUp = g_mouseOld & (~g_mouseHeld);
|
g_mouseUp = g_mouseOld & (~g_mouseHeld);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 latestKeyboardEntry = sharedMem->keyboard.header.latest_entry;
|
if (hidGetKeyboardStates(&g_keyboardState, 1)) {
|
||||||
HidKeyboardEntry *newKeyboardEntry = &sharedMem->keyboard.entries[latestKeyboardEntry];
|
g_keyboardModHeld = g_keyboardState.modifier;
|
||||||
if ((s64)(newKeyboardEntry->timestamp - g_keyboardTimestamp) >= 0) {
|
|
||||||
memcpy(&g_keyboardEntry, newKeyboardEntry, sizeof(HidKeyboardEntry));
|
|
||||||
g_keyboardTimestamp = newKeyboardEntry->timestamp;
|
|
||||||
|
|
||||||
g_keyboardModHeld = g_keyboardEntry.modifier;
|
|
||||||
for (u32 i = 0; i < 8; i++) {
|
for (u32 i = 0; i < 8; i++) {
|
||||||
g_keyboardHeld[i] = g_keyboardEntry.keys[i];
|
g_keyboardHeld[i] = g_keyboardState.keys[i];
|
||||||
|
}
|
||||||
|
g_keyboardModDown = (~g_keyboardModOld) & g_keyboardModHeld;
|
||||||
|
g_keyboardModUp = g_keyboardModOld & (~g_keyboardModHeld);
|
||||||
|
for (u32 i = 0; i < 8; i++) {
|
||||||
|
g_keyboardDown[i] = (~g_keyboardOld[i]) & g_keyboardHeld[i];
|
||||||
|
g_keyboardUp[i] = g_keyboardOld[i] & (~g_keyboardHeld[i]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
g_keyboardModDown = (~g_keyboardModOld) & g_keyboardModHeld;
|
|
||||||
g_keyboardModUp = g_keyboardModOld & (~g_keyboardModHeld);
|
|
||||||
for (u32 i = 0; i < 8; i++) {
|
|
||||||
g_keyboardDown[i] = (~g_keyboardOld[i]) & g_keyboardHeld[i];
|
|
||||||
g_keyboardUp[i] = g_keyboardOld[i] & (~g_keyboardHeld[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < 10; i++) {
|
for (u32 i = 0; i < 10; i++) {
|
||||||
@ -425,6 +416,15 @@ size_t hidGetMouseStates(HidMouseState *states, size_t count) {
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t hidGetKeyboardStates(HidKeyboardState *states, size_t count) {
|
||||||
|
HidSharedMemory *sharedmem = (HidSharedMemory*)hidGetSharedmemAddr();
|
||||||
|
if (sharedmem == NULL)
|
||||||
|
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_NotInitialized));
|
||||||
|
|
||||||
|
size_t total = _hidGetStates(&sharedmem->keyboard.header, sharedmem->keyboard.entries, offsetof(HidKeyboardState,timestamp), states, sizeof(HidKeyboardState), count);
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t _hidGetNpadStates(HidNpad *npad, u32 layout, HidNpadStateEntry *states, size_t count) {
|
static size_t _hidGetNpadStates(HidNpad *npad, u32 layout, HidNpadStateEntry *states, size_t count) {
|
||||||
HidControllerLayout *states_buf = &npad->layouts[layout];
|
HidControllerLayout *states_buf = &npad->layouts[layout];
|
||||||
if (count > 17) count = 17;
|
if (count > 17) count = 17;
|
||||||
|
Loading…
Reference in New Issue
Block a user