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:
co-authored by
elecpower
Peter Feerick
parent
b733ec4eae
commit
f40fa1a64b
+115
-17
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user