diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index a1e980874..1dfa1d24d 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -74,6 +74,7 @@ void menuRadioTools(event_t event); void menuRadioSpectrumAnalyser(event_t event); void menuRadioPowerMeter(event_t event); void menuRadioCalibration(event_t event); +void menuGhostModuleConfig(event_t event); static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { #if defined(RADIO_TOOLS) diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index bdfb8f591..f39cdc71b 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -76,6 +76,7 @@ void menuRadioTools(event_t event); void menuRadioCalibration(event_t event); void menuRadioSpectrumAnalyser(event_t event); void menuRadioPowerMeter(event_t event); +void menuGhostModuleConfig(event_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index ce558404c..82227a3bc 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -224,6 +224,7 @@ bool menuRadioHardware(event_t event); bool menuRadioCalibration(event_t event); bool menuRadioSpectrumAnalyser(event_t event); bool menuRadioPowerMeter(event_t event); +bool menuGhostModuleConfig(event_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; diff --git a/radio/src/gui/480x272/radio_ghost_menu.cpp b/radio/src/gui/480x272/radio_ghost_menu.cpp new file mode 100644 index 000000000..db71cf393 --- /dev/null +++ b/radio/src/gui/480x272/radio_ghost_menu.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +bool menuGhostModuleConfig(event_t event) +{ + switch (event) { + case EVT_ENTRY: + memclear(&reusableBuffer.ghostMenu, sizeof(reusableBuffer.ghostMenu)); + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_NONE; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_OPEN; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_ROTARY_LEFT: + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYUP; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_ROTARY_RIGHT: + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYDOWN; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_KEY_FIRST(KEY_ENTER): + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYPRESS; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_KEY_BREAK(KEY_EXIT): + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYLEFT; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_KEY_LONG(KEY_EXIT): + menuVerticalOffset = 0; + memclear(&reusableBuffer.ghostMenu, sizeof(reusableBuffer.ghostMenu)); + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_NONE; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_CLOSE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + RTOS_WAIT_MS(10); + popMenu(); + break; + } + + if (reusableBuffer.ghostMenu.menuAction == GHST_MENU_CTRL_CLOSE) { + popMenu(); + } + + drawMenuTemplate(STR_GHOST_MENU_LABEL, ICON_OPENTX, nullptr, OPTION_MENU_NO_SCROLLBAR); + + constexpr coord_t xOffset = 140; + constexpr coord_t xOffset2 = 260; + constexpr coord_t yOffset = 55; + constexpr coord_t lineSpacing = 25; + LcdFlags flags = 0; + + for (uint8_t line = 0; line < GHST_MENU_LINES; line++) { + flags = 0; + if (reusableBuffer.ghostMenu.line[line].splitLine) { + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_LABEL_SELECT) + flags = INVERS; + lcdDrawText(xOffset, yOffset + line * lineSpacing, reusableBuffer.ghostMenu.line[line].menuText, flags); + + flags = 0; + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_VALUE_SELECT) + flags |= INVERS; + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_VALUE_EDIT) + flags |= BLINK; + lcdDrawText(xOffset2, yOffset + line * lineSpacing, &reusableBuffer.ghostMenu.line[line].menuText[reusableBuffer.ghostMenu.line[line].splitLine], flags); + } + else { + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_LABEL_SELECT) + flags = INVERS; + lcdDrawText(xOffset, yOffset + line * lineSpacing, reusableBuffer.ghostMenu.line[line].menuText, flags); + } + } + + return true; +} diff --git a/radio/src/gui/480x272/radio_tools.cpp b/radio/src/gui/480x272/radio_tools.cpp index 21cabf522..3964337a1 100644 --- a/radio/src/gui/480x272/radio_tools.cpp +++ b/radio/src/gui/480x272/radio_tools.cpp @@ -132,6 +132,11 @@ bool menuRadioTools(event_t event) addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); #endif +#if defined(GHOST) + if (isModuleGhost(EXTERNAL_MODULE)) + addRadioModuleTool(index++, "Ghost Menu", menuGhostModuleConfig, EXTERNAL_MODULE); +#endif + if (index == 0) { lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); } diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index f20235ced..e4ff8f403 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -41,6 +41,13 @@ if(PXX2) ) endif() +if(GHOST) + set(GUI_SRC + ${GUI_SRC} + ../common/stdlcd/radio_ghost_menu.cpp + ) +endif() + if(PXX2 OR MULTIMODULE) set(GUI_SRC ${GUI_SRC} diff --git a/radio/src/gui/common/stdlcd/radio_ghost_menu.cpp b/radio/src/gui/common/stdlcd/radio_ghost_menu.cpp new file mode 100644 index 000000000..d710c35d5 --- /dev/null +++ b/radio/src/gui/common/stdlcd/radio_ghost_menu.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +void menuGhostModuleConfig(event_t event) +{ + switch (event) { + case EVT_ENTRY: + memclear(&reusableBuffer.ghostMenu, sizeof(reusableBuffer.ghostMenu)); + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_NONE; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_OPEN; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_LEFT: +#elif defined(KEYS_GPIO_REG_UP) + case EVT_KEY_BREAK(KEY_UP): +#elif defined(KEYS_GPIO_REG_PLUS) + case EVT_KEY_BREAK(KEY_PLUS): +#endif + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYUP; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_RIGHT: +#elif defined(KEYS_GPIO_REG_DOWN) + case EVT_KEY_BREAK(KEY_DOWN): +#elif defined(KEYS_GPIO_REG_MINUS) + case EVT_KEY_BREAK(KEY_MINUS): +#endif + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYDOWN; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + + case EVT_KEY_FIRST(KEY_ENTER): + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYPRESS; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_KEY_BREAK(KEY_EXIT): + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_JOYLEFT; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_NONE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + break; + + case EVT_KEY_LONG(KEY_EXIT): + menuVerticalOffset = 0; + memclear(&reusableBuffer.ghostMenu, sizeof(reusableBuffer.ghostMenu)); + reusableBuffer.ghostMenu.buttonAction = GHST_BTN_NONE; + reusableBuffer.ghostMenu.menuAction = GHST_MENU_CTRL_CLOSE; + moduleState[EXTERNAL_MODULE].counter = GHST_MENU_CONTROL; + RTOS_WAIT_MS(10); + popMenu(); + break; + } + + if (reusableBuffer.ghostMenu.menuAction == GHST_MENU_CTRL_CLOSE) { + popMenu(); + } + + constexpr coord_t xOffset = LCD_W / 3 - 15; + constexpr coord_t xOffset2 = LCD_W / 3 + LCD_W / 4; + constexpr coord_t yOffset = 6; + LcdFlags flags = 0; + + for (uint8_t line = 0; line < GHST_MENU_LINES; line++) { + flags = 0; + if (reusableBuffer.ghostMenu.line[line].splitLine) { + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_LABEL_SELECT) + flags = INVERS; + lcdDrawText(xOffset, yOffset + line * FH, reusableBuffer.ghostMenu.line[line].menuText, flags); + + flags = 0; + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_VALUE_SELECT) + flags |= INVERS; + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_VALUE_EDIT) + flags |= BLINK; + lcdDrawText(xOffset2, yOffset + line * FH, &reusableBuffer.ghostMenu.line[line].menuText[reusableBuffer.ghostMenu.line[line].splitLine], flags); + } + else { + if (reusableBuffer.ghostMenu.line[line].lineFlags & GHST_LINE_FLAGS_LABEL_SELECT) + flags = INVERS; + lcdDrawText(xOffset, yOffset + line * FH, reusableBuffer.ghostMenu.line[line].menuText, flags); + } + } +} diff --git a/radio/src/gui/common/stdlcd/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp index d5bfd12d4..056b80a59 100644 --- a/radio/src/gui/common/stdlcd/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -129,6 +129,11 @@ void menuRadioTools(event_t event) addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); #endif +#if defined(GHOST) + if (isModuleGhost(EXTERNAL_MODULE)) + addRadioModuleTool(index++, "Ghost Menu", menuGhostModuleConfig, EXTERNAL_MODULE); +#endif + if (index == 0) { lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 67158e075..284048491 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1128,6 +1128,14 @@ union ReusableBuffer uint8_t moduleOFF; } spectrumAnalyser; +#if defined(GHOST) + struct { + GhostMenuData line[GHST_MENU_LINES + 1]; + uint8_t menuAction; + uint8_t buttonAction; + } ghostMenu; +#endif + struct { uint32_t freq; int16_t power; diff --git a/radio/src/pulses/ghost.cpp b/radio/src/pulses/ghost.cpp index 03f098fe2..1847976e2 100755 --- a/radio/src/pulses/ghost.cpp +++ b/radio/src/pulses/ghost.cpp @@ -20,6 +20,31 @@ #include "opentx.h" +uint8_t createGhostMenuControlFrame(uint8_t * frame, int16_t * pulses) +{ + moduleState[EXTERNAL_MODULE].counter = GHST_FRAME_CHANNEL; + + uint8_t * buf = frame; +#if SPORT_MAX_BAUDRATE < 400000 + *buf++ = g_eeGeneral.telemetryBaudrate == GHST_TELEMETRY_RATE_400K ? GHST_ADDR_MODULE_SYM : GHST_ADDR_MODULE_ASYM; +#else + *buf++ = GHST_ADDR_MODULE_SYM; +#endif + + *buf++ = GHST_UL_RC_CHANS_SIZE; + uint8_t * crc_start = buf; + *buf++ = GHST_UL_MENU_CTRL; + *buf++ = reusableBuffer.ghostMenu.buttonAction; // Joystick states, Up, Down, Left, Right, Press + *buf++ = reusableBuffer.ghostMenu.menuAction; // menu control, open, close, etc. + + for (uint8_t i = 0; i < 8; i++) + *buf++ = 0; // padding to make this the same size as the pulses packet + + *buf++ = crc8(crc_start, GHST_UL_RC_CHANS_SIZE - 1); + + return buf - frame; +} + // Range for pulses (channels output) is [-1024:+1024] uint8_t createGhostChannelsFrame(uint8_t * frame, int16_t * pulses) { @@ -89,6 +114,9 @@ void setupPulsesGhost() { if (telemetryProtocol == PROTOCOL_TELEMETRY_GHOST) { uint8_t * pulses = extmodulePulsesData.ghost.pulses; - extmodulePulsesData.ghost.length = createGhostChannelsFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]); + if (moduleState[EXTERNAL_MODULE].counter == GHST_MENU_CONTROL) + extmodulePulsesData.ghost.length = createGhostMenuControlFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]); + else + extmodulePulsesData.ghost.length = createGhostChannelsFrame(pulses, &channelOutputs[g_model.moduleData[EXTERNAL_MODULE].channelsStart]); } } diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 06327589b..798c0e230 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -211,6 +211,10 @@ if(PXX2) set(GUI_SRC ${GUI_SRC} radio_power_meter.cpp) endif() +if(GHOST) + set(GUI_SRC ${GUI_SRC} radio_ghost_menu.cpp) +endif() + if(DISK_CACHE) set(SRC ${SRC} disk_cache.cpp) add_definitions(-DDISK_CACHE) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index fc2948be0..d440d2623 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -635,7 +635,11 @@ void sportUpdatePowerInit(); #endif // Aux serial port driver -#define DEBUG_BAUDRATE 115200 +#if defined(RADIO_TX16S) + #define DEBUG_BAUDRATE 250000 +#else + #define DEBUG_BAUDRATE 115200 +#endif #if defined(AUX_SERIAL_GPIO) extern uint8_t auxSerialMode; void auxSerialInit(unsigned int mode, unsigned int protocol); diff --git a/radio/src/telemetry/ghost.cpp b/radio/src/telemetry/ghost.cpp index 406db73d0..10928da21 100755 --- a/radio/src/telemetry/ghost.cpp +++ b/radio/src/telemetry/ghost.cpp @@ -175,6 +175,29 @@ void processGhostTelemetryFrame() processGhostTelemetryValueString(sensor, vtxBandString); break; } + + case GHST_DL_MENU_DESC: + { + GhostMenuFrame * packet; + GhostMenuData * lineData; + + packet = (GhostMenuFrame * ) telemetryRxBuffer; + lineData = (GhostMenuData *) &reusableBuffer.ghostMenu.line[packet->lineIndex]; + lineData->splitLine = 0; + reusableBuffer.ghostMenu.menuAction = packet->menuFlags; + lineData->lineFlags = packet->lineFlags; + for (uint8_t i = 0; i < GHST_MENU_CHARS; i++) { + if (packet->menuText[i] == 0x7C) { + lineData->menuText[i] = '\0'; + lineData->splitLine = i + 1; + } + else { + lineData->menuText[i] = packet->menuText[i]; + } + } + lineData->menuText[GHST_MENU_CHARS] = '\0'; + break; + } } } diff --git a/radio/src/telemetry/ghost.h b/radio/src/telemetry/ghost.h index 9fcd54120..77ced179f 100755 --- a/radio/src/telemetry/ghost.h +++ b/radio/src/telemetry/ghost.h @@ -38,10 +38,12 @@ #define GHST_UL_RC_CHANS_HS4_9TO12 0x11 // High Speed 4 channel (12 bits), plus CH9-12 (8 bits) #define GHST_UL_RC_CHANS_HS4_13TO16 0x12 // High Speed 4 channel (12 bits), plus CH13-16 (8 bits) #define GHST_UL_RC_CHANS_SIZE 12 // 1 (type) + 10 (data) + 1 (crc) +#define GHST_UL_MENU_CTRL 0x13 #define GHST_DL_OPENTX_SYNC 0x20 #define GHST_DL_LINK_STAT 0x21 #define GHST_DL_VTX_STAT 0x22 +#define GHST_DL_MENU_DESC 0x24 #define GHST_RC_CTR_VAL_12BIT 0x7C0 // 0x3e0 << 1 #define GHST_RC_CTR_VAL_8BIT 0x7C @@ -113,4 +115,62 @@ enum GhostTelemetryBaudrates #define GHOST_BAUDRATE 400000 #define GHOST_PERIOD 4 +enum GhostLineFlags +{ + GHST_LINE_FLAGS_NONE = 0x00, + GHST_LINE_FLAGS_LABEL_SELECT = 0x01, + GHST_LINE_FLAGS_VALUE_SELECT = 0x02, + GHST_LINE_FLAGS_VALUE_EDIT = 0x04, +}; + +enum GhostButtons +{ + GHST_BTN_NONE = 0x00, + GHST_BTN_JOYPRESS = 0X01, + GHST_BTN_JOYUP = 0X02, + GHST_BTN_JOYDOWN = 0X04, + GHST_BTN_JOYLEFT = 0X08, + GHST_BTN_JOYRIGHT = 0X10, + GHST_BTN_BIND = 0X20 // future, for no-UI Ghost +}; + +enum GhostMenuControl +{ + GHST_MENU_CTRL_NONE = 0X00, + GHST_MENU_CTRL_OPEN = 0X01, + GHST_MENU_CTRL_CLOSE = 0X02, + GHST_MENU_CTRL_REDRAW = 0X04, +}; + + +enum GhostFrames +{ + GHST_FRAME_CHANNEL, + GHST_MENU_CONTROL +}; + +constexpr uint8_t GHST_MENU_LINES = 6; +constexpr uint8_t GHST_MENU_CHARS = 20; + +// GHST_DL_MENU_DESC (27 bytes) +struct GhostMenuFrame +{ + uint8_t address; + uint8_t length ; + uint8_t packetId; + uint8_t menuFlags; // GHST_MENU_CTRL + uint8_t lineFlags; // Carat states, Inverse, Bold for each of Menu Label, and Value + uint8_t lineIndex; // 0 = first line + unsigned char menuText[GHST_MENU_CHARS]; + uint8_t crc; +}; + +struct GhostMenuData +{ + uint8_t menuFlags; // Update Line, Clear Menu, etc. + uint8_t lineFlags; // Carat states, Inverse, Bold for each of Menu Label, and Value + uint8_t splitLine; // Store beginning of Value substring + char menuText[GHST_MENU_CHARS + 1]; +}; + #endif // _GHOST_H_ diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 7d5ebf278..5cc6b5141 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -183,6 +183,7 @@ const char STR_MINUTEBEEP[] = TR_MINUTEBEEP; const char STR_BEEPCOUNTDOWN[] = TR_BEEPCOUNTDOWN; const char STR_PERSISTENT[] = TR_PERSISTENT; const char STR_BACKLIGHT_LABEL[] = TR_BACKLIGHT_LABEL; +const char STR_GHOST_MENU_LABEL[] = TR_GHOST_MENU_LABEL; const char STR_BLDELAY[] = TR_BLDELAY; const char STR_RXCHANNELORD[] = TR_RXCHANNELORD; const char STR_STICKS[] = TR_STICKS; diff --git a/radio/src/translations.h b/radio/src/translations.h index 3812ba40b..b5770fbf5 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -300,6 +300,7 @@ extern const char STR_MINUTEBEEP[]; extern const char STR_BEEPCOUNTDOWN[]; extern const char STR_PERSISTENT[]; extern const char STR_BACKLIGHT_LABEL[]; +extern const char STR_GHOST_MENU_LABEL[]; extern const char STR_BLDELAY[]; #if defined(PWM_BACKLIGHT) || defined(COLORLCD) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 2c9fbdbd7..18824b89e 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -524,6 +524,7 @@ #define TR_BEEPCOUNTDOWN INDENT"Odpočet" #define TR_PERSISTENT INDENT"Trvalé" #define TR_BACKLIGHT_LABEL "Podsvětlení" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT"Zhasnout po" #define TR_BLONBRIGHTNESS TR3(INDENT"Jas Zap.", INDENT"Jas Zap.", INDENT"Jas zapnutého LCD") #define TR_BLOFFBRIGHTNESS TR3(INDENT"Jas Vyp.", INDENT"Jas Vyp.", INDENT"Jas vypnutého LCD") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 2630a74fb..b3be56a75 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -526,6 +526,7 @@ #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Permanent", INDENT "Permanent") #define TR_BACKLIGHT_LABEL "LCD-Beleuchtung" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Dauer" #define TR_BLONBRIGHTNESS INDENT "An-Helligkeit" #define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index bda4e8a9d..3da18fe66 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -525,6 +525,7 @@ #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistent") #define TR_BACKLIGHT_LABEL "Backlight" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Duration" #define TR_BLONBRIGHTNESS INDENT "ON brightness" #define TR_BLOFFBRIGHTNESS INDENT "OFF brightness" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 3af6b1a5d..2ede6bba4 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -524,6 +524,7 @@ #define TR_BEEPCOUNTDOWN TR(INDENT"Cta. atrás", INDENT"Cuenta atrás") #define TR_PERSISTENT TR(INDENT"Persisten.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL "Luz fondo" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT"Duración" #define TR_BLONBRIGHTNESS INDENT"MAS brillo" #define TR_BLOFFBRIGHTNESS INDENT"MENOS brillo" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index ec06cb50b..b2cf9f79c 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -538,6 +538,7 @@ #define TR_BEEPCOUNTDOWN INDENT"Countdown" #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistent") #define TR_BACKLIGHT_LABEL "Backlight" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT"Duration" #define TR_BLONBRIGHTNESS INDENT"ON Brightness" #define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 762e65bb3..5725219be 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -544,6 +544,7 @@ #define TR_BEEPCOUNTDOWN TR(INDENT "Bip fin", INDENT "Compte à rebours") #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistant") #define TR_BACKLIGHT_LABEL "Rétroéclairage" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Durée" #define TR_BLONBRIGHTNESS INDENT "Luminosité ON" #define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index dd6919244..4b0f83550 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -546,6 +546,7 @@ #define TR_BEEPCOUNTDOWN TR(INDENT "Conto rov", INDENT "Conto rovescia") #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistente") #define TR_BACKLIGHT_LABEL TR("Retroillu.", "Retroilluminazione") +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Durata" #define TR_BLONBRIGHTNESS TR(INDENT "Lumin. ON", INDENT "Luminosità ON") #define TR_BLOFFBRIGHTNESS TR(INDENT "Lumin. OFF", INDENT "Luminosità OFF") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 8cb0f9433..5288cc49e 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -527,6 +527,7 @@ #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Vasth.", INDENT "Vasthouden") #define TR_BACKLIGHT_LABEL "LCD-Verlichting" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Duur" #define TR_BLONBRIGHTNESS INDENT "Aan-Helderheid" #define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 2b88a8103..342114fcf 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -545,6 +545,7 @@ #define TR_BEEPCOUNTDOWN INDENT "Odliczanie" #define TR_PERSISTENT TR(INDENT "Dokł.", INDENT "Dokładny") #define TR_BACKLIGHT_LABEL "Podświetl" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT"Czas trwania" #define TR_BLONBRIGHTNESS INDENT"Jasnośc wł." #define TR_BLOFFBRIGHTNESS INDENT"Jasność wył." diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index b55071de6..d0f4649ea 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -542,6 +542,7 @@ #define TR_BEEPCOUNTDOWN INDENT "Beep Regressivo" #define TR_PERSISTENT INDENT "Persist." #define TR_BACKLIGHT_LABEL "Backlight" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Tempo Backlight" #define TR_BLONBRIGHTNESS INDENT "ON Brightness" #define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index c28fce6d9..1bf474532 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -544,6 +544,7 @@ #define TR_BEEPCOUNTDOWN INDENT "Nedräkning" #define TR_PERSISTENT TR("Jämt på ", INDENT"Alltid På") #define TR_BACKLIGHT_LABEL "Belysning" +#define TR_GHOST_MENU_LABEL "GHOST MENU" #define TR_BLDELAY INDENT "Av efter" #define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka" #define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka"