feat(el18): Use trim hats as keys for navigation (#3894)

Co-authored-by: elecpower <neilh713@tpg.com.au>
Co-authored-by: Peter Feerick <peter.feerick@gmail.com>
This commit is contained in:
Michael
2023-09-29 20:12:54 +10:00
committed by GitHub
co-authored by elecpower Peter Feerick
parent b733ec4eae
commit f40fa1a64b
81 changed files with 1021 additions and 91 deletions
+115 -17
View File
@@ -18,6 +18,9 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#if !defined(BOOT) && defined(USE_HATS_AS_KEYS)
#include "opentx.h"
#endif
#include "keys.h"
@@ -290,27 +293,121 @@ uint8_t keysGetTrimState(uint8_t trim)
return trim_keys[trim].pressed();
}
#if defined(USE_TRIMS_AS_BUTTONS)
#if defined(USE_HATS_AS_KEYS)
#define ROTARY_EMU_KEY_REPEAT_RATE 12 // times 10 [ms]
static bool _trims_as_buttons = false;
static bool _trims_as_buttons_LUA = false;
void setTrimsAsButtons(bool val) { _trims_as_buttons = val; }
bool getTrimsAsButtons() { return _trims_as_buttons; }
void setHatsAsKeys(bool val) { _trims_as_buttons = val; }
bool getHatsAsKeys() { return _trims_as_buttons; }
static uint32_t transpose_trims()
void setTransposeHatsForLUA(bool val) { _trims_as_buttons_LUA = val; }
bool getTransposeHatsForLUA() { return _trims_as_buttons_LUA; }
int16_t getEmuRotaryData()
{
uint32_t keys = 0;
static bool rotaryTrimPressed = false;
static tmr10ms_t timePressed = 0;
if (getHatsAsKeys() || getTransposeHatsForLUA()) {
tmr10ms_t now = get_tmr10ms();
if (rotaryTrimPressed) {
if (now < (timePressed + ROTARY_EMU_KEY_REPEAT_RATE)) return 0;
rotaryTrimPressed = false;
}
auto trims = readTrims();
if (trims & (1 << 4)) {
rotaryTrimPressed = true;
timePressed = now;
return 1;
}
if (trims & (1 << 5)) {
rotaryTrimPressed = true;
timePressed = now;
return -1;
}
}
return 0;
}
static void transpose_trims(uint32_t *keys)
{
#if defined(BOOT)
auto trims = readTrims();
if (trims & (1 << 0)) keys |= 1 << KEY_SYS;
if (trims & (1 << 1)) keys |= 1 << KEY_TELE;
if (trims & (1 << 2)) keys |= 1 << KEY_PAGEUP;
if (trims & (1 << 3)) keys |= 1 << KEY_PAGEDN;
if (trims & (1 << 4)) keys |= 1 << KEY_DOWN;
if (trims & (1 << 5)) keys |= 1 << KEY_UP;
if (trims & (1 << 6)) keys |= 1 << KEY_LEFT;
if (trims & (1 << 7)) keys |= 1 << KEY_RIGHT;
if (trims & (1 << 4)) *keys |= 1 << KEY_DOWN; // right hat, down 0x10
if (trims & (1 << 5)) *keys |= 1 << KEY_UP; // right hat, up 0x20
#else
static uint8_t state = 0;
return keys;
bool allowModeSwitch = ((g_model.hatsMode == HATSMODE_GLOBAL &&
g_eeGeneral.hatsMode == HATSMODE_SWITCHABLE) ||
(g_model.hatsMode == HATSMODE_SWITCHABLE)) &&
!getTransposeHatsForLUA();
if (allowModeSwitch) {
static bool lastExitState = false;
static bool lastEnterState = false;
bool exitState =
*keys & (1 << KEY_EXIT); // edge detection for EXIT and ENTER keys
bool enterState = *keys & (1 << KEY_ENTER);
bool exitPressed = !lastExitState && exitState;
bool exitReleased = lastExitState && !exitState;
bool enterPressed = !lastEnterState && enterState;
lastExitState = exitState;
lastEnterState = enterState;
switch (state) {
case 0: // idle state waiting for EXIT or ENTER key
if (exitPressed) {
state = 1;
}
break;
case 1: // state EXIT received
if (exitReleased) { // if exit released go back to idle state
state = 0;
break;
}
if (enterPressed) { // ENTER received with EXIT still pressed
setHatsAsKeys(!getHatsAsKeys()); // change mode and don't forward
// EXIT and ENTER keys
killEvents(KEY_EXIT);
killEvents(KEY_ENTER);
state = 0; // go to for EXIT to be released
break;
}
break;
}
} else
state = 0; // state machine in idle if not in mode "BOTH"
if (getHatsAsKeys() || // map hats to keys in button mode or LUA active
getTransposeHatsForLUA()) {
auto trims = readTrims();
// spare key in buttons mode: left hat left
// if (trims & (1 << 0)) *keys |= 1 << tbd; // left hat, left 0x01
if (trims & (1 << 1)) *keys |= 1 << KEY_MODEL; // left hat, right 0x02
if (trims & (1 << 2)) *keys |= 1 << KEY_TELE; // left hat, down 0x04
if (trims & (1 << 3)) *keys |= 1 << KEY_SYS; // left hat, up 0x08
if (trims & (1 << 6)) *keys |= 1 << KEY_PAGEUP; // rht, left 0x40
if (trims & (1 << 7)) *keys |= 1 << KEY_PAGEDN; // rht, right 0x80
}
#endif
}
#endif
@@ -319,9 +416,10 @@ bool keysPollingCycle()
uint32_t trims_input;
uint32_t keys_input = readKeys();
#if defined(USE_TRIMS_AS_BUTTONS)
if (getTrimsAsButtons()) {
keys_input |= transpose_trims();
#if defined(USE_HATS_AS_KEYS)
transpose_trims(&keys_input);
if (getHatsAsKeys() || getTransposeHatsForLUA()) {
trims_input = 0;
} else {
trims_input = readTrims();