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
+7
View File
@@ -658,6 +658,13 @@ enum BluetoothModes {
#endif
};
enum HatsMode {
HATSMODE_TRIMS_ONLY,
HATSMODE_KEYS_ONLY,
HATSMODE_SWITCHABLE,
HATSMODE_GLOBAL
};
enum UartSampleModes {
UART_SAMPLE_MODE_NORMAL = 0,
UART_SAMPLE_MODE_ONEBIT,
+4 -2
View File
@@ -679,7 +679,8 @@ PACK(struct ModelData {
uint8_t disableTelemetryWarning:1;
uint8_t showInstanceIds:1;
uint8_t checklistInteractive:1;
uint8_t spare3:4 SKIP; // padding to 8-bit aligment
NOBACKUP(uint8_t hatsMode:2 ENUM(HatsMode));
uint8_t spare3:2 SKIP; // padding to 8-bit aligment
int8_t customThrottleWarningPosition;
BeepANACenter beepANACenter;
MixData mixData[MAX_MIXERS] NO_IDX;
@@ -841,7 +842,8 @@ PACK(struct RadioData {
// Real attributes
NOBACKUP(uint8_t manuallyEdited:1);
int8_t timezoneMinutes:3; // -3 to +3 ==> (-45 to 45 minutes in 15 minute increments)
NOBACKUP(int8_t spare0:4 SKIP);
NOBACKUP(uint8_t hatsMode:2 ENUM(HatsMode));
NOBACKUP(int8_t spare0:2 SKIP);
CUST_ATTR(semver,nullptr,w_semver);
CUST_ATTR(board,nullptr,w_board);
CalibData calib[MAX_CALIB_ANALOG_INPUTS] NO_IDX;
+21 -1
View File
@@ -235,7 +235,27 @@ extern "C" void touchDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data)
#endif
}
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(USE_HATS_AS_KEYS)
int16_t getEmuRotaryData();
static void rotaryDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data)
{
int16_t diff = getEmuRotaryData();
if(diff != 0) {
reset_inactivity();
audioKeyPress();
data->enc_diff = diff;
data->state = LV_INDEV_STATE_RELEASED;
}
}
// libopenui_depends.h
int8_t rotaryEncoderGetAccel() { return 0; }
#elif defined(ROTARY_ENCODER_NAVIGATION)
extern volatile uint32_t rotencDt;
static int8_t _rotary_enc_accel = 0;
@@ -130,7 +130,7 @@ RadioGhostModuleConfig::RadioGhostModuleConfig(uint8_t moduleIdx) :
lv_group_set_editing(lv_group_get_default(), true);
lv_obj_add_event_cb(lvobj, ghostmoduleconfig_cb, LV_EVENT_KEY, this);
#if defined(TRIMS_EMULATE_BUTTONS)
setTrimsAsButtons(true); // Use trim joysticks to operate menu (e.g. on NV14)
setHatsAsKeys(true); // Use trim joysticks to operate menu (e.g. on NV14)
#endif
}
@@ -156,7 +156,7 @@ void RadioGhostModuleConfig::onEvent(event_t event)
RTOS_WAIT_MS(10);
Page::onEvent(event);
#if defined(TRIMS_EMULATE_BUTTONS)
setTrimsAsButtons(false); // switch trims back to normal
setHatsAsKeys(false); // switch trims back to normal
#endif
break;
}
@@ -175,7 +175,7 @@ void RadioGhostModuleConfig::checkEvents()
RTOS_WAIT_MS(10);
deleteLater();
#if defined(TRIMS_EMULATE_BUTTONS)
setTrimsAsButtons(false); // switch trims back to normal
setHatsAsKeys(false); // switch trims back to normal
#endif
}
}
+8 -1
View File
@@ -803,7 +803,7 @@ void RadioSetupPage::build(FormWindow * window)
new Choice(line, rect_t{}, STR_USBMODES, USB_UNSELECTED_MODE, USB_MAX_MODE,
GET_SET_DEFAULT(g_eeGeneral.USBMode));
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) && !defined(USE_HATS_AS_KEYS)
line = window->newLine(&grid);
new StaticText(line, rect_t{}, STR_ROTARY_ENC_MODE, 0, COLOR_THEME_PRIMARY1);
new Choice(line, rect_t{}, STR_ROTARY_ENC_OPT, ROTARY_ENCODER_MODE_NORMAL,
@@ -811,6 +811,13 @@ void RadioSetupPage::build(FormWindow * window)
GET_SET_DEFAULT(g_eeGeneral.rotEncMode));
#endif
#if defined(USE_HATS_AS_KEYS)
line = window->newLine(&grid);
new StaticText(line, rect_t{}, STR_HATSMODE, 0, COLOR_THEME_PRIMARY1);
new Choice(line, rect_t{}, STR_HATSOPT, HATSMODE_TRIMS_ONLY, HATSMODE_SWITCHABLE,
GET_SET_DEFAULT(g_eeGeneral.hatsMode));
#endif
// RX channel order
line = window->newLine(&grid);
new StaticText(line, rect_t{}, STR_DEF_CHAN_ORD, 0,
+2 -2
View File
@@ -274,7 +274,7 @@ void TabsGroup::onEvent(event_t event)
#if defined(HARDWARE_KEYS)
TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event);
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(KEYS_GPIO_REG_PAGEUP) || defined(USE_HATS_AS_KEYS)
if (event == EVT_KEY_FIRST(KEY_PAGEDN)) {
#else
if (event == EVT_KEY_BREAK(KEY_PAGEDN)) {
@@ -283,7 +283,7 @@ void TabsGroup::onEvent(event_t event)
uint8_t current = header.carousel.getCurrentIndex() + 1;
setCurrentTab(current >= tabs.size() ? 0 : current);
}
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(KEYS_GPIO_REG_PAGEUP) || defined(USE_HATS_AS_KEYS)
else if (event == EVT_KEY_FIRST(KEY_PAGEUP)) {
#else
else if (event == EVT_KEY_LONG(KEY_PAGEDN)) {
+8
View File
@@ -55,6 +55,14 @@ TrimsSetup::TrimsSetup() : Page(ICON_MODEL_SETUP)
auto btn_obj = btn->getLvObj();
lv_obj_set_width(btn_obj, lv_pct(100));
#if defined(USE_HATS_AS_KEYS)
// Hats mode for NV14/EL18
line = body.newLine(&grid);
new StaticText(line, rect_t{}, STR_HATSMODE, 0, COLOR_THEME_PRIMARY1);
new Choice(line, rect_t{}, STR_HATSOPT, HATSMODE_TRIMS_ONLY, HATSMODE_GLOBAL,
GET_SET_DEFAULT(g_model.hatsMode));
#endif
// Trim step
line = body.newLine(&grid);
new StaticText(line, rect_t{}, STR_TRIMINC, 0,
+2 -2
View File
@@ -280,7 +280,7 @@ void ViewMain::onEvent(event_t event)
new ScreenMenu();
break;
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(KEYS_GPIO_REG_PAGEUP) || defined(USE_HATS_AS_KEYS)
case EVT_KEY_FIRST(KEY_PAGEDN):
#else
case EVT_KEY_BREAK(KEY_PAGEDN):
@@ -293,7 +293,7 @@ void ViewMain::onEvent(event_t event)
//TODO: these need to go away!
// -> board code should map the keys as required
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(KEYS_GPIO_REG_PAGEUP) || defined(USE_HATS_AS_KEYS)
case EVT_KEY_FIRST(KEY_PAGEUP):
#else
case EVT_KEY_LONG(KEY_PAGEDN):
+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();
+5 -3
View File
@@ -180,9 +180,11 @@ uint8_t keysGetTrimState(uint8_t trim);
bool keysPollingCycle();
bool rotaryEncoderPollingCycle();
#if defined(USE_TRIMS_AS_BUTTONS)
void setTrimsAsButtons(bool val);
bool getTrimsAsButtons();
#if defined(USE_HATS_AS_KEYS)
void setHatsAsKeys(bool val);
bool getHatsAsKeys();
void setTransposeHatsForLUA(bool val);
bool getTransposeHatsForLUA();
#endif
struct InactivityData
+12 -12
View File
@@ -886,7 +886,7 @@ Return rotary encoder mode
*/
static int luaGetRotEncMode(lua_State * L)
{
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) && !defined(USE_HATS_AS_KEYS)
lua_pushunsigned(L, g_eeGeneral.rotEncMode);
#else
lua_pushunsigned(L, 0);
@@ -3030,7 +3030,7 @@ LROT_BEGIN(etxcst, NULL, 0)
#endif
// Virtual events
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) || defined(USE_TRIMS_AS_BUTTOS)
LROT_NUMENTRY( EVT_VIRTUAL_PREV, EVT_ROTARY_LEFT )
LROT_NUMENTRY( EVT_VIRTUAL_NEXT, EVT_ROTARY_RIGHT )
LROT_NUMENTRY( EVT_VIRTUAL_DEC, EVT_ROTARY_LEFT )
@@ -3090,12 +3090,9 @@ LROT_BEGIN(etxcst, NULL, 0)
LROT_NUMENTRY( EVT_VIRTUAL_ENTER_LONG, EVT_KEY_LONG(KEY_ENTER) )
LROT_NUMENTRY( EVT_VIRTUAL_EXIT, EVT_KEY_BREAK(KEY_EXIT) )
#elif defined(COLORLCD)
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(KEYS_GPIO_REG_PAGEUP) || defined(USE_HATS_AS_KEYS)
LROT_NUMENTRY( EVT_VIRTUAL_PREV_PAGE, EVT_KEY_BREAK(KEY_PAGEUP) )
LROT_NUMENTRY( EVT_VIRTUAL_NEXT_PAGE, EVT_KEY_BREAK(KEY_PAGEDN) )
#elif defined(PCBNV14)
LROT_NUMENTRY( EVT_VIRTUAL_PREV_PAGE, EVT_KEY_BREAK(KEY_LEFT) )
LROT_NUMENTRY( EVT_VIRTUAL_NEXT_PAGE, EVT_KEY_BREAK(KEY_RIGHT) )
#else
LROT_NUMENTRY( EVT_VIRTUAL_PREV_PAGE, EVT_KEY_LONG(KEY_PAGEDN) )
LROT_NUMENTRY( EVT_VIRTUAL_NEXT_PAGE, EVT_KEY_BREAK(KEY_PAGEDN) )
@@ -3107,6 +3104,7 @@ LROT_BEGIN(etxcst, NULL, 0)
LROT_NUMENTRY( EVT_VIRTUAL_EXIT, EVT_KEY_BREAK(KEY_EXIT) )
#endif
// key events
LROT_NUMENTRY( EVT_EXIT_BREAK, EVT_KEY_BREAK(KEY_EXIT) )
#if defined(KEYS_GPIO_REG_ENTER)
@@ -3117,19 +3115,19 @@ LROT_BEGIN(etxcst, NULL, 0)
KEY_EVENTS(MENU, KEY_MENU)
#endif
#if defined(KEYS_GPIO_REG_RIGHT) && defined(COLORLCD)
#if defined(KEYS_GPIO_REG_RIGHT) && defined(COLORLCD) || defined(USE_HATS_AS_KEYS)
KEY_EVENTS(TELEM, KEY_TELE)
#elif defined(KEYS_GPIO_REG_RIGHT)
KEY_EVENTS(RIGHT, KEY_RIGHT)
#endif
#if defined(KEYS_GPIO_REG_UP) && defined(COLORLCD)
#if defined(KEYS_GPIO_REG_UP) && defined(COLORLCD) || defined(USE_HATS_AS_KEYS)
KEY_EVENTS(MODEL, KEY_MODEL)
#elif defined(KEYS_GPIO_REG_UP)
KEY_EVENTS(UP, KEY_UP)
#endif
#if defined(KEYS_GPIO_REG_LEFT) && defined(COLORLCD)
#if defined(KEYS_GPIO_REG_LEFT) && defined(COLORLCD) || defined(USE_HATS_AS_KEYS)
KEY_EVENTS(SYS, KEY_SYS)
#elif defined(KEYS_GPIO_REG_LEFT)
KEY_EVENTS(LEFT, KEY_LEFT)
@@ -3141,11 +3139,11 @@ LROT_BEGIN(etxcst, NULL, 0)
KEY_EVENTS(DOWN, KEY_DOWN)
#endif
#if defined(KEYS_GPIO_REG_PAGEUP)
#if defined(KEYS_GPIO_REG_PAGEUP) || defined(USE_HATS_AS_KEYS)
KEY_EVENTS(PAGEUP, KEY_PAGEUP)
#endif
#if defined(KEYS_GPIO_REG_PAGEDN)
#if defined(KEYS_GPIO_REG_PAGEDN) || defined(USE_HATS_AS_KEYS)
KEY_EVENTS(PAGEDN, KEY_PAGEDN)
#endif
@@ -3165,12 +3163,13 @@ LROT_BEGIN(etxcst, NULL, 0)
KEY_EVENTS(MINUS, KEY_MINUS)
#endif
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) || defined(USE_HATS_AS_KEYS)
KEY_EVENTS(ROT, KEY_ENTER)
LROT_NUMENTRY( EVT_ROT_LEFT, EVT_ROTARY_LEFT )
LROT_NUMENTRY( EVT_ROT_RIGHT, EVT_ROTARY_RIGHT )
#endif
// touch events
#if defined(HARDWARE_TOUCH)
LROT_NUMENTRY( EVT_TOUCH_FIRST, EVT_TOUCH_FIRST )
LROT_NUMENTRY( EVT_TOUCH_BREAK, EVT_TOUCH_BREAK )
@@ -3178,6 +3177,7 @@ LROT_BEGIN(etxcst, NULL, 0)
LROT_NUMENTRY( EVT_TOUCH_TAP, EVT_TOUCH_TAP )
#endif
// misc definitions
#if LCD_DEPTH > 1 && !defined(COLORLCD)
LROT_NUMENTRY( FILL_WHITE, FILL_WHITE )
LROT_NUMENTRY( GREY_DEFAULT, GREY_DEFAULT )
+7 -7
View File
@@ -79,7 +79,7 @@ struct our_longjmp * global_lj = 0;
uint32_t luaExtraMemoryUsage = 0;
#endif
#if defined(USE_TRIMS_AS_BUTTONS)
#if defined(USE_HATS_AS_KEYS)
static bool _is_standalone_script()
{
return scriptInternalData[0].reference == SCRIPT_STANDALONE;
@@ -254,8 +254,8 @@ void luaDisable()
POPUP_WARNING("Lua disabled!");
luaState = INTERPRETER_PANIC;
#if defined(USE_TRIMS_AS_BUTTONS)
if (_is_standalone_script()) setTrimsAsButtons(false);
#if defined(USE_HATS_AS_KEYS)
if (_is_standalone_script()) setTransposeHatsForLUA(false);
#endif
}
@@ -1255,8 +1255,8 @@ bool luaTask(event_t evt, bool allowLcdUsage)
init = true;
luaState = INTERPRETER_LOADING;
#if defined(USE_TRIMS_AS_BUTTONS)
if (_is_standalone_script()) setTrimsAsButtons(false);
#if defined(USE_HATS_AS_KEYS)
if (_is_standalone_script()) setTransposeHatsForLUA(false);
#endif
case INTERPRETER_LOADING:
@@ -1271,8 +1271,8 @@ bool luaTask(event_t evt, bool allowLcdUsage)
init = true;
luaState = INTERPRETER_RUNNING;
#if defined(USE_TRIMS_AS_BUTTONS)
if (_is_standalone_script()) setTrimsAsButtons(true);
#if defined(USE_HATS_AS_KEYS)
if (_is_standalone_script()) setTransposeHatsForLUA(true);
#endif
case INTERPRETER_RUNNING:
+1 -1
View File
@@ -175,7 +175,7 @@ void LuaEventHandler::onEvent(event_t event)
if (event == EVT_KEY_LONG(KEY_EXIT)) {
killEvents(KEY_EXIT);
}
#if !defined(KEYS_GPIO_REG_PAGEUP)
#if !defined(KEYS_GPIO_REG_PAGEUP) && !defined(USE_HATS_AS_KEYS)
else if (event == EVT_KEY_LONG(KEY_PAGEDN)) {
killEvents(KEY_PAGEDN);
}
+31
View File
@@ -268,6 +268,33 @@ void checkSpeakerVolume()
}
}
#if defined(USE_HATS_AS_KEYS)
void checkHatsAsKeys()
{
uint8_t hatsMode = g_model.hatsMode == HATSMODE_GLOBAL ? g_eeGeneral.hatsMode
: g_model.hatsMode;
static bool oldHatsModeKeys = hatsMode == HATSMODE_KEYS_ONLY;
if (hatsMode == HATSMODE_TRIMS_ONLY) {
setHatsAsKeys(false);
}
if (hatsMode == HATSMODE_KEYS_ONLY) {
setHatsAsKeys(true);
}
bool hatsModeKeys = getHatsAsKeys();
if (hatsModeKeys == oldHatsModeKeys) return;
oldHatsModeKeys = !oldHatsModeKeys;
audioKeyPress();
POPUP_BUBBLE(hatsModeKeys ? STR_HATSMODE_KEYS : STR_HATSMODE_TRIMS, 2000);
}
#endif
#if defined(EEPROM)
void checkEeprom()
{
@@ -527,6 +554,10 @@ void perMain()
checkBacklight();
#if defined(USE_HATS_AS_KEYS)
checkHatsAsKeys();
#endif
#if !defined(LIBOPENUI)
event_t evt = getEvent();
#endif
+2
View File
@@ -133,6 +133,8 @@ void applyDefaultTemplate()
g_model.switchWarningState |= (1 << (3 * i));
}
#endif
g_model.hatsMode = HATSMODE_GLOBAL;
}
void setModelDefaults(uint8_t id)
+2
View File
@@ -346,6 +346,8 @@ void generalDefault()
// disable Custom Script
g_eeGeneral.modelCustomScriptsDisabled = true;
g_eeGeneral.hatsMode = HATSMODE_SWITCHABLE;
g_eeGeneral.chkSum = 0xFFFF;
}
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -267,7 +274,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -791,7 +799,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -278,7 +285,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 22, struct_CalibData, NULL),
@@ -814,7 +822,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -267,7 +274,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -789,7 +797,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -267,7 +274,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -789,7 +797,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -286,7 +293,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 22, struct_CalibData, NULL),
@@ -822,7 +830,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -286,7 +293,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 22, struct_CalibData, NULL),
@@ -822,7 +830,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -267,7 +274,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -792,7 +800,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -267,7 +274,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -792,7 +800,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -267,7 +274,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -789,7 +797,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -4,6 +4,13 @@
// Enums first
//
const struct YamlIdStr enum_HatsMode[] = {
{ HATSMODE_TRIMS_ONLY, "TRIMS_ONLY" },
{ HATSMODE_KEYS_ONLY, "KEYS_ONLY" },
{ HATSMODE_SWITCHABLE, "SWITCHABLE" },
{ HATSMODE_GLOBAL, "GLOBAL" },
{ 0, NULL }
};
const struct YamlIdStr enum_BacklightMode[] = {
{ e_backlight_mode_off, "backlight_mode_off" },
{ e_backlight_mode_keys, "backlight_mode_keys" },
@@ -269,7 +276,8 @@ static const struct YamlNode struct_CustomFunctionData[] = {
static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "manuallyEdited", 1 ),
YAML_SIGNED( "timezoneMinutes", 3 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_CUSTOM("board",nullptr,w_board),
YAML_ARRAY("calib", 48, 12, struct_CalibData, NULL),
@@ -795,7 +803,8 @@ static const struct YamlNode struct_ModelData[] = {
YAML_UNSIGNED( "disableTelemetryWarning", 1 ),
YAML_UNSIGNED( "showInstanceIds", 1 ),
YAML_UNSIGNED( "checklistInteractive", 1 ),
YAML_PADDING( 4 ),
YAML_ENUM("hatsMode", 2, enum_HatsMode),
YAML_PADDING( 2 ),
YAML_SIGNED( "customThrottleWarningPosition", 8 ),
YAML_UNSIGNED( "beepANACenter", 16 ),
YAML_ARRAY("mixData", 160, 64, struct_MixData, NULL),
@@ -106,7 +106,7 @@ void per10ms()
keysPollingCycle();
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) && !defined(USE_HATS_AS_KEYS)
static rotenc_t rePreviousValue;
rotenc_t reNewValue = rotaryEncoderGetValue();
@@ -256,7 +256,7 @@ void bootloaderInitApp()
pwrOn();
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) && !defined(USE_HATS_AS_KEYS)
rotaryEncoderInit();
#endif
+1 -1
View File
@@ -39,7 +39,7 @@ set(PCB_RF_BAUD 921600 CACHE STRING "INTERNAL_MODULE_BAUDRATE: ${RF_BAUD_RATE}")
set_property(CACHE PCB_RF_BAUD PROPERTY STRINGS ${RF_BAUD_RATE})
add_definitions(-DPCBNV14 -DPCBFLYSKY -DAFHDS2_BAUDRATE=${PCB_RF_BAUD})
add_definitions(-DBATTERY_CHARGE -DUSE_TRIMS_AS_BUTTONS)
add_definitions(-DBATTERY_CHARGE -DUSE_HATS_AS_KEYS)
if (PCBREV STREQUAL EL18)
set(FLAVOUR el18)
@@ -70,7 +70,7 @@ void bootloaderInitScreen()
lcdInitDisplayDriver();
backlightInit();
backlightEnable(100);
setTrimsAsButtons(true);
setHatsAsKeys(true);
}
static void bootloaderDrawTitle(const char* text)
+3
View File
@@ -517,6 +517,9 @@
#define BLUETOOTH_ON_GPIO GPIOI
#define BLUETOOTH_ON_GPIO_PIN GPIO_Pin_8 // PI.8
//ROTARY emulation for trims as buttons
#define ROTARY_ENCODER_NAVIGATION
// Bluetooth
#define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOH)
#define BT_RCC_APB1Periph (RCC_APB1Periph_USART3)
+1 -1
View File
@@ -298,7 +298,7 @@ extern volatile uint32_t rotencDt;
void OpenTxSimulator::rotaryEncoderEvent(int steps)
{
#if defined(ROTARY_ENCODER_NAVIGATION)
#if defined(ROTARY_ENCODER_NAVIGATION) && !defined(USE_HATS_AS_KEYS)
static uint32_t last_tick = 0;
if (steps != 0) {
if (g_eeGeneral.rotEncMode >= ROTARY_ENCODER_MODE_INVERT_BOTH) steps *= -1;
+2 -2
View File
@@ -448,9 +448,9 @@ void SET_POWER_REASON(uint32_t value) {}
#if defined(TRIMS_EMULATE_BUTTONS)
bool trimsAsButtons = false;
void setTrimsAsButtons(bool val) { trimsAsButtons = val; }
void setHatsAsKeys(bool val) { trimsAsButtons = val; }
bool getTrimsAsButtons()
bool getHatsAsKeys()
{
bool lua = false;
#if defined(LUA)
+8
View File
@@ -66,7 +66,11 @@ void NumberEdit::onEvent(event_t event)
auto step = getStep();
step += (rotaryEncoderGetAccel() * getAccelFactor()) / 8;
do {
#if defined(USE_HATS_AS_KEYS)
value -= step;
#else
value += step;
#endif
} while (isValueAvailable && !isValueAvailable(value) && value <= vmax);
if (value <= vmax) {
setValue(value);
@@ -83,7 +87,11 @@ void NumberEdit::onEvent(event_t event)
auto step = getStep();
step += (rotaryEncoderGetAccel() * getAccelFactor()) / 8;
do {
#if defined(USE_HATS_AS_KEYS)
value += step;
#else
value -= step;
#endif
} while (isValueAvailable && !isValueAvailable(value) && value >= vmin);
if (value >= vmin) {
setValue(value);
-1
View File
@@ -231,4 +231,3 @@ class Window
virtual void invalidate(const rect_t & rect);
};
+8
View File
@@ -537,6 +537,14 @@ const char STR_DATE[] = TR_DATE;
const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR;
const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER;
const char STR_ROTARY_ENC_MODE[] = TR_ROTARY_ENC_MODE;
#if defined(USE_HATS_AS_KEYS)
const char STR_HATSMODE[] = TR_HATSMODE;
ISTR(HATSOPT);
const char STR_HATSMODE_TRIMS[] = TR_HATSMODE_TRIMS;
const char STR_HATSMODE_KEYS[] = TR_HATSMODE_KEYS;
#endif
const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR;
const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG;
const char STR_VIEW_TEXT[] = TR_VIEW_TEXT;
+7
View File
@@ -172,6 +172,13 @@ extern const char* const STR_CYC_VSRCRAW[];
extern const char* const STR_ROTARY_ENC_OPT[];
#if defined(USE_HATS_AS_KEYS)
extern const char STR_HATSMODE[];
extern const char* const STR_HATSOPT[];
extern const char STR_HATSMODE_TRIMS[];
extern const char STR_HATSMODE_KEYS[];
#endif
extern const char* const STR_VTMRMODES[];
extern const char* const STR_VPERSISTENT[];
+7
View File
@@ -156,6 +156,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "按键帽模式"
#define TR_HATSOPT "微调","导航键","可切换","全局"
#define TR_HATSMODE_TRIMS "按键帽: 微调"
#define TR_HATSMODE_KEYS "按键帽: 导航键"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "正常","反向"
#else
+7
View File
@@ -169,6 +169,13 @@
#define TR_ON_ONE_SWITCHES "ZAP","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Režim kloboučků"
#define TR_HATSOPT "Pouze trimy","Pouze tlačítka","Přepinatelné","Globální"
#define TR_HATSMODE_TRIMS "Režim kloboučků: Trimy"
#define TR_HATSMODE_KEYS "Režim kloboučků: Tlačítka"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Invertován"
#else
+7
View File
@@ -164,6 +164,13 @@
#define TR_ON_ONE_SWITCHES "EN","En"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Joystik indstilling"
#define TR_HATSOPT "Kun trim","Kun knap","Trim / Knap", "Global"
#define TR_HATSMODE_TRIMS "Joystik: Trim"
#define TR_HATSMODE_KEYS "Joystik: Knap"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Invers"
#else
+7
View File
@@ -159,6 +159,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Joystick Modus"
#define TR_HATSOPT "Nur Trimmung","Nur Tasten","Umschaltbar","Global"
#define TR_HATSMODE_TRIMS "Joystick Modus: Trimmung"
#define TR_HATSMODE_KEYS "Joystick Modus: Tasten"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inverted"
#else
+7
View File
@@ -161,6 +161,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Hats mode"
#define TR_HATSOPT "Trims only","Keys only","Switchable","Global"
#define TR_HATSMODE_TRIMS "Hats mode: Trims"
#define TR_HATSMODE_KEYS "Hats mode: Keys"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inverted"
#else
+7
View File
@@ -157,6 +157,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Hats mode"
#define TR_HATSOPT "Trims only","Keys only","Switchable","Global"
#define TR_HATSMODE_TRIMS "Hats mode: Trims"
#define TR_HATSMODE_KEYS "Hats mode: Keys"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inverted"
#else
+7
View File
@@ -168,6 +168,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Hats mode"
#define TR_HATSOPT "Trims only","Keys only","Switchable","Global"
#define TR_HATSMODE_TRIMS "Hats mode: Trims"
#define TR_HATSMODE_KEYS "Hats mode: Keys"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inverted"
#else
+7
View File
@@ -169,6 +169,13 @@
#define TR_ON_ONE_SWITCHES "ON","Un"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Mode joystick"
#define TR_HATSOPT "Trims uniquement","Touches uniquement","Commutable","Global"
#define TR_HATSMODE_TRIMS "Mode joystick: trims"
#define TR_HATSMODE_KEYS "Mode joystick: touches"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inversé"
#else
+7
View File
@@ -166,6 +166,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "מצב כובעונים"
#define TR_HATSOPT "קיזוזים בלבד","ניווט בלבד","משולב","גלובאלי"
#define TR_HATSMODE_TRIMS "מצב כובעונים: קיזוזים"
#define TR_HATSMODE_KEYS "מצב כובעונים: ניווט"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "רגיל","הפוך"
#else
+7
View File
@@ -162,6 +162,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Modo joystick"
#define TR_HATSOPT "Solo trims","Solo keys","Commutabile","Globale"
#define TR_HATSMODE_TRIMS "Modo joystick: trims"
#define TR_HATSMODE_KEYS "Modo joystick: keys"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normale","Invertito"
#else
+7
View File
@@ -161,6 +161,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "アナログスティック"
#define TR_HATSOPT "トリムのみ","キーのみ","スイッチ","すべて"
#define TR_HATSMODE_TRIMS "アナログスティック: トリム"
#define TR_HATSMODE_KEYS "アナログスティック: キー"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "標準","リバース"
#else
+7
View File
@@ -158,6 +158,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Hats mode"
#define TR_HATSOPT "Trims only","Keys only","Switchable","Global"
#define TR_HATSMODE_TRIMS "Hats mode: Trims"
#define TR_HATSMODE_KEYS "Hats mode: Keys"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inverted"
#else
+7
View File
@@ -157,6 +157,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Tryb grzybków"
#define TR_HATSOPT "Tylko trymy","Tylko przyciski","Przełączane","Globalne"
#define TR_HATSMODE_TRIMS "Tryb grzybków: trymy"
#define TR_HATSMODE_KEYS "Tryb grzybków: przyciski"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Inverted"
#else
+7
View File
@@ -164,6 +164,13 @@
#define TR_ON_ONE_SWITCHES "LIG","UM"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Hats mode"
#define TR_HATSOPT "Trims only","Keys only","Switchable","Global"
#define TR_HATSMODE_TRIMS "Hats mode: Trims"
#define TR_HATSMODE_KEYS "Hats mode: Keys"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "Normal","Invert"
#else
+7
View File
@@ -179,6 +179,13 @@
#define TR_ON_ONE_SWITCHES "PÅ","Ett"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "Hattläge"
#define TR_HATSOPT "Endast trimm","Endast knapp","Ändringsbar","Global"
#define TR_HATSMODE_TRIMS "Hattläge: Trimmar"
#define TR_HATSMODE_KEYS "Hattläge: Knappar"
#endif
#if defined(IMU)
#define TR_IMU_VSRCRAW "TltX","TltY",
#else
+7
View File
@@ -162,6 +162,13 @@
#define TR_ON_ONE_SWITCHES "ON","One"
#if defined(USE_HATS_AS_KEYS)
#define TR_HATSMODE "按鍵帽模式"
#define TR_HATSOPT "微調","導航鍵","可切換","全局"
#define TR_HATSMODE_TRIMS "按鍵帽: 微調"
#define TR_HATSMODE_KEYS "按鍵帽: 導航鍵"
#endif
#if defined(COLORLCD)
#define TR_ROTARY_ENC_OPT "正常","反向"
#else