diff --git a/radio/sdcard/horus/THEMES/Default/mask_radio_tools.png b/radio/sdcard/horus/THEMES/Default/mask_radio_tools.png new file mode 100755 index 000000000..711d499de Binary files /dev/null and b/radio/sdcard/horus/THEMES/Default/mask_radio_tools.png differ diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index 32c1d8b1b..082424e07 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -23,7 +23,9 @@ const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { menuRadioSetup, menuRadioSdManager, +#if defined(LUA) || defined(PXX2) menuRadioTools, +#endif menuRadioSpecialFunctions, menuRadioTrainer, menuRadioHardware, diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index 20ade3f00..2bbba412f 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -54,7 +54,9 @@ void menuTraceBuffer(event_t event); enum MenuRadioIndexes { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, +#if defined(LUA) || defined(PXX2) MENU_RADIO_TOOLS, +#endif MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_HARDWARE, diff --git a/radio/src/gui/480x272/menu_radio.cpp b/radio/src/gui/480x272/menu_radio.cpp index d39b0f7ef..42327fc6f 100644 --- a/radio/src/gui/480x272/menu_radio.cpp +++ b/radio/src/gui/480x272/menu_radio.cpp @@ -23,6 +23,9 @@ const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { menuRadioSetup, menuRadioSdManager, +#if defined(LUA) || defined(PXX2) + menuRadioTools, +#endif menuRadioSpecialFunctions, menuRadioTrainer, menuRadioHardware, diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index d141a1154..708417b76 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -67,7 +67,8 @@ enum MenuIcons { ICON_OPENTX, ICON_RADIO, ICON_RADIO_SETUP, - ICON_RADIO_SD_BROWSER, + ICON_RADIO_SD_MANAGER, + ICON_RADIO_TOOLS, ICON_RADIO_GLOBAL_FUNCTIONS, ICON_RADIO_TRAINER, ICON_RADIO_HARDWARE, @@ -187,6 +188,9 @@ extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; enum EnumTabRadio { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, +#if defined(LUA) || defined(PXX2) + MENU_RADIO_TOOLS, +#endif MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_HARDWARE, @@ -197,7 +201,10 @@ enum EnumTabRadio { const uint8_t RADIO_ICONS[MENU_RADIO_PAGES_COUNT + 1] = { ICON_RADIO, ICON_RADIO_SETUP, - ICON_RADIO_SD_BROWSER, + ICON_RADIO_SD_MANAGER, +#if defined(LUA) || defined(PXX2) + ICON_RADIO_TOOLS, +#endif ICON_RADIO_GLOBAL_FUNCTIONS, ICON_RADIO_TRAINER, ICON_RADIO_HARDWARE, @@ -212,6 +219,8 @@ bool menuRadioTrainer(event_t event); bool menuRadioVersion(event_t event); bool menuRadioHardware(event_t event); bool menuRadioCalibration(event_t event); +bool menuRadioSpectrumAnalyser(event_t event); +bool menuRadioPowerMeter(event_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; @@ -265,8 +274,6 @@ bool menuAboutView(event_t event); bool menuMainViewChannelsMonitor(event_t event); bool menuTextView(event_t event); bool menuScreensTheme(event_t event); -bool menuRadioSpectrumAnalyser(event_t event); -bool menuRadioPowerMeter(event_t event); extern int8_t checkIncDec_Ret; // global helper vars diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 9923e45ef..9f1ff2060 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -33,7 +33,7 @@ BitmapBuffer * currentBitmap = NULL; bool menuRadioSdManagerInfo(event_t event) { - SIMPLE_SUBMENU(STR_SD_INFO_TITLE, ICON_RADIO_SD_BROWSER, 1); + SIMPLE_SUBMENU(STR_SD_INFO_TITLE, ICON_RADIO_SD_MANAGER, 1); lcdDrawText(MENUS_MARGIN_LEFT, 2*FH, STR_SD_TYPE); lcdDrawText(100, 2*FH, SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD); diff --git a/radio/src/gui/480x272/radio_tools.cpp b/radio/src/gui/480x272/radio_tools.cpp new file mode 100644 index 000000000..d7a7a8f2b --- /dev/null +++ b/radio/src/gui/480x272/radio_tools.cpp @@ -0,0 +1,180 @@ +/* + * 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 +#include "opentx.h" + +extern uint8_t g_moduleIdx; + +bool addRadioTool(uint8_t index, const char * label) +{ + int8_t sub = menuVerticalPosition - HEADER_LINE; + LcdFlags attr = (sub == index ? INVERS : 0); + coord_t y = MENU_HEADER_HEIGHT + 1 + index * FH; + lcdDrawNumber(3, y, index + 1, LEADING0|LEFT, 2); +// BSS lcdDrawText(3*FW, y, label, (sub == index ? INVERS : 0)); + if (attr && s_editMode > 0) { + s_editMode = 0; + killAllEvents(); + return true; + } + return false; +} + +void addRadioModuleTool(uint8_t index, const char * label, bool (* tool)(event_t), uint8_t module) +{ + if (addRadioTool(index, label)) { + g_moduleIdx = module; + pushMenu(tool); + } +} + +#define TOOL_NAME_MAXLEN 16 + +#if defined(LUA) +bool readToolName(const char * filename, char * name) +{ + FIL file; + char buffer[1024]; + UINT count; + + if (f_open(&file, filename, FA_READ) != FR_OK) { + return "Error opening file"; + } + + if (f_read(&file, &buffer, sizeof(buffer), &count) != FR_OK) { + f_close(&file); + return false; + } + + const char * tns = "TNS|"; + auto * start = std::search(buffer, buffer + sizeof(buffer), tns, tns + 4); + if (start >= buffer + sizeof(buffer)) + return false; + + start += 4; + + const char * tne = "|TNE"; + auto * end = std::search(buffer, buffer + sizeof(buffer), tne, tne + 4); + if (end >= buffer + sizeof(buffer) || end <= start) + return false; + + uint8_t len = end - start; + if (len > TOOL_NAME_MAXLEN) + return false; + + strncpy(name, start, len); + memclear(name + len, TOOL_NAME_MAXLEN + 1 - len); + + return true; +} + +void addRadioScriptTool(uint8_t index, const char * path) +{ + char toolName[TOOL_NAME_MAXLEN + 1]; + const char * label; + char * ext = (char *)getFileExtension(path); + if (readToolName(path, toolName)) { + label = toolName; + } + else { + *ext = '\0'; + label = getBasename(path); + } + + if (addRadioTool(index, label)) { + f_chdir("/SCRIPTS/TOOLS/"); + *ext = '.'; + luaExec(path); + } +} + +bool isRadioScriptTool(const char * filename) +{ + const char * ext = getFileExtension(filename); + return ext && !strcasecmp(ext, SCRIPT_EXT); +} +#endif + +bool menuRadioTools(event_t event) +{ + if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { + memclear(&reusableBuffer.radioTools, sizeof(reusableBuffer.radioTools)); +#if defined(PXX2) + for (uint8_t module = 0; module < NUM_MODULES; module++) { + if (isModulePXX2(module) && (module == INTERNAL_MODULE ? IS_INTERNAL_MODULE_ON() : IS_EXTERNAL_MODULE_ON())) { + moduleState[module].readModuleInformation(&reusableBuffer.radioTools.modules[module], PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); + } + } +#endif + } + + SIMPLE_MENU(STR_MENUTOOLS, RADIO_ICONS, menuTabGeneral, MENU_RADIO_TOOLS, HEADER_LINE + reusableBuffer.radioTools.linesCount); + + uint8_t index = 0; + +#if 0 // TODO BSS defined(PXX2) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); +#endif + +#if defined(LUA) + FILINFO fno; + DIR dir; + +#if defined(CROSSFIRE) + if(isFileAvailable(SCRIPTS_TOOLS_PATH "/CROSSFIRE/crossfire.lua")) + addRadioScriptTool(index++, SCRIPTS_TOOLS_PATH "/CROSSFIRE/crossfire.lua"); +#endif + + FRESULT res = f_opendir(&dir, SCRIPTS_TOOLS_PATH); + if (res == FR_OK) { + for (;;) { + TCHAR path[_MAX_LFN+1] = SCRIPTS_TOOLS_PATH "/"; + res = f_readdir(&dir, &fno); /* Read a directory item */ + if (res != FR_OK || fno.fname[0] == 0) break; /* Break on error or end of dir */ + if (fno.fattrib & AM_DIR) continue; /* Skip subfolders */ + if (fno.fattrib & AM_HID) continue; /* Skip hidden files */ + if (fno.fattrib & AM_SYS) continue; /* Skip system files */ + + strcat(path, fno.fname); + if (isRadioScriptTool(fno.fname)) + addRadioScriptTool(index++, path); + } + } +#endif + + if (index == 0) { + lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); + } + + reusableBuffer.radioTools.linesCount = index; + + return true; +} \ No newline at end of file diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 9d2e1cbdb..b79d9c0b4 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -83,7 +83,8 @@ class DarkblueTheme: public Theme loadMenuIcon(ICON_OPENTX, "mask_opentx.png"); loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); - loadMenuIcon(ICON_RADIO_SD_BROWSER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_SD_MANAGER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_TOOLS, "mask_radio_tools.png"); loadMenuIcon(ICON_RADIO_GLOBAL_FUNCTIONS, "mask_radio_global_functions.png"); loadMenuIcon(ICON_RADIO_TRAINER, "mask_radio_trainer.png"); loadMenuIcon(ICON_RADIO_HARDWARE, "mask_radio_hardware.png"); diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index 560b6728c..5172581d8 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -98,7 +98,8 @@ class DefaultTheme: public Theme #endif loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); - loadMenuIcon(ICON_RADIO_SD_BROWSER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_SD_MANAGER, "mask_radio_sd_browser.png"); + loadMenuIcon(ICON_RADIO_TOOLS, "mask_radio_tools.png"); loadMenuIcon(ICON_RADIO_GLOBAL_FUNCTIONS, "mask_radio_global_functions.png"); loadMenuIcon(ICON_RADIO_TRAINER, "mask_radio_trainer.png"); loadMenuIcon(ICON_RADIO_HARDWARE, "mask_radio_hardware.png"); diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index f88c92b1e..ffaeadc74 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -119,6 +119,18 @@ set(GUI_SRC rle.cpp ) +if(PXX2 OR LUA) + set(GUI_SRC ${GUI_SRC} radio_tools.cpp) +endif() + +#if(PXX2) +# set(GUI_SRC +# ${GUI_SRC} +# ../common/stdlcd/radio_spectrum_analyser.cpp +# ../common/stdlcd/radio_power_meter.cpp +# ) +#endif() + if(DISK_CACHE) set(SRC ${SRC} disk_cache.cpp) add_definitions(-DDISK_CACHE)