refactor: key handling (#4849)

This commit is contained in:
philmoz
2024-05-27 18:33:53 +10:00
committed by GitHub
parent b8a0038c68
commit e807ccbebf
101 changed files with 380 additions and 578 deletions
+27 -11
View File
@@ -58,7 +58,9 @@
#define KSTATE_RPTDELAY 95
#define KSTATE_START 97
#define KSTATE_PAUSE 98
#define KSTATE_KILLED 99
#define KFLAG_KILLED 1
#define KFLAG_LONG_PRESS 2
// global last event
event_t s_evt;
@@ -72,6 +74,7 @@ class Key
uint8_t m_vals = 0;
uint8_t m_cnt = 0;
uint8_t m_state = 0;
uint8_t m_flags = 0;
public:
event_t input(bool val);
@@ -92,16 +95,19 @@ event_t Key::input(bool val)
m_cnt++;
if (m_state && m_vals == 0) {
if ((m_state || m_flags) && m_vals == 0) {
// key is released
if (m_state != KSTATE_KILLED) {
if ((m_flags & (KFLAG_KILLED|KFLAG_LONG_PRESS)) == 0) {
evt = _MSK_KEY_BREAK;
}
m_state = KSTATE_OFF;
m_cnt = 0;
m_flags = 0;
return evt;
}
if (m_flags & KFLAG_KILLED) return evt;
switch (m_state) {
case KSTATE_OFF:
if (m_vals == FILTER_MASK) {
@@ -121,6 +127,7 @@ event_t Key::input(bool val)
if (m_cnt == KEY_LONG_DELAY) {
// generate long key press
evt = _MSK_KEY_LONG;
m_flags |= KFLAG_LONG_PRESS;
}
if (m_cnt == KEY_REPEAT_DELAY) {
m_state = 16;
@@ -150,9 +157,6 @@ event_t Key::input(bool val)
m_cnt = 0;
}
break;
case KSTATE_KILLED: //killed
break;
}
return evt;
@@ -166,8 +170,8 @@ void Key::pauseEvents()
void Key::killEvents()
{
// TRACE("key %d killed", key());
m_state = KSTATE_KILLED;
if (m_state)
m_flags |= KFLAG_KILLED;
}
static Key keys[MAX_KEYS];
@@ -427,10 +431,22 @@ bool keysPollingCycle()
for (int i = 0; i < MAX_KEYS; i++) {
event_t evt = keys[i].input(keys_input & (1 << i));
if (evt) {
// SHIFT key should not trigger REPT events
if (i != KEY_SHIFT || evt != _MSK_KEY_REPT) {
pushEvent(evt | i);
evt |= i;
#if defined(KEYS_GPIO_REG_PAGEDN) && !defined(KEYS_GPIO_REG_PAGEUP)
// Radio with single PAGEDN key
if (evt == EVT_KEY_LONG(KEY_PAGEDN)) {
// Convert long press PAGEDN to short press PAGEUP
evt = EVT_KEY_BREAK(KEY_PAGEUP);
}
#endif
#if defined(KEYS_GPIO_REG_SHIFT)
// SHIFT key should not trigger REPT events
if (evt != EVT_KEY_REPT(KEY_SHIFT)) {
pushEvent(evt);
}
#else
pushEvent(evt);
#endif
}
}