From 6ef1dd9d4a1f3f1e0610e5dc289ac113985fdf8d Mon Sep 17 00:00:00 2001 From: TuxSH <1922548+TuxSH@users.noreply.github.com> Date: Thu, 14 May 2020 20:01:30 +0100 Subject: [PATCH] Add hidKeysDownRepeat --- libctru/include/3ds/services/hid.h | 16 ++++++++++++++- libctru/source/services/hid.c | 33 +++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/libctru/include/3ds/services/hid.h b/libctru/include/3ds/services/hid.h index 62a71f2..34510c0 100644 --- a/libctru/include/3ds/services/hid.h +++ b/libctru/include/3ds/services/hid.h @@ -91,6 +91,13 @@ Result hidInit(void); /// Exits HID. void hidExit(void); +/** + * @brief Sets the key repeat parameters for @ref hidKeysRepeat. + * @param delay Initial delay. + * @param interval Repeat interval. + */ +void hidSetRepeatParameters(u32 delay, u32 interval); + /// Scans HID for input data. void hidScanInput(void); @@ -109,7 +116,14 @@ u32 hidKeysHeld(void); u32 hidKeysDown(void); /** -* @brief Returns a bitmask of newly released buttons, this frame. + * @brief Returns a bitmask of newly pressed or repeated buttons, this frame. + * Individual buttons can be extracted using binary AND. + * @return 32-bit bitmask of newly pressed or repeated buttons. + */ +u32 hidKeysDownRepeat(void); + +/** + * @brief Returns a bitmask of newly released buttons, this frame. * Individual buttons can be extracted using binary AND. * @return 32-bit bitmask of newly released buttons. */ diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index 79fb501..683f9b1 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -21,7 +21,8 @@ Handle hidEvents[5]; vu32* hidSharedMem; -static u32 kOld, kHeld, kDown, kUp; +static u32 kOld, kHeld, kDown, kUp, kRepeat; +static u32 kDelay = 30, kInterval = 15, kCount = 30; static touchPosition tPos; static circlePosition cPos; static accelVector aVec; @@ -104,6 +105,14 @@ void hidExit(void) } } +void hidSetRepeatParameters(u32 delay, u32 interval) +{ + kDelay = delay; + kInterval = interval; + kCount = kDelay; + kRepeat = 0; +} + void hidWaitForEvent(HID_Event id, bool nextEvent) { if(id>=HIDEVENT_MAX)return; @@ -195,6 +204,21 @@ void hidScanInput(void) kDown = (~kOld) & kHeld; kUp = kOld & (~kHeld); + if (kDelay) + { + if (kHeld != kOld) + { + kCount = kDelay; + kRepeat = kDown; + } + + if (--kCount == 0) + { + kCount = kInterval; + kRepeat = kHeld; + } + } + Id = hidSharedMem[66 + 4];//Accelerometer if(Id>7)Id=7; if(hidCheckSectionUpdateTime(&hidSharedMem[66], Id)==0) @@ -220,6 +244,13 @@ u32 hidKeysDown(void) return kDown; } +u32 hidKeysDownRepeat(void) +{ + u32 tmp = kRepeat; + kRepeat = 0; + return tmp; +} + u32 hidKeysUp(void) { return kUp;