From e5f3ec03579148badd531988ce95f31109f7d226 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 21 Aug 2019 14:47:02 +0200 Subject: [PATCH] [X12S] Internal RF Access board now OK --- radio/src/gui/480x272/radio_version.cpp | 196 ++++++++++++++++-- radio/src/gui/common/stdlcd/radio_version.cpp | 3 + radio/src/pulses/pxx2.h | 20 +- radio/src/targets/horus/CMakeLists.txt | 2 + 4 files changed, 189 insertions(+), 32 deletions(-) diff --git a/radio/src/gui/480x272/radio_version.cpp b/radio/src/gui/480x272/radio_version.cpp index b438782a1..33ab73607 100644 --- a/radio/src/gui/480x272/radio_version.cpp +++ b/radio/src/gui/480x272/radio_version.cpp @@ -21,22 +21,171 @@ #include "opentx.h" #include "options.h" +#if defined(PXX2) +constexpr coord_t COLUMN2_X = 200; + +void drawPXX2Version(coord_t x, coord_t y, PXX2Version version) +{ + if (version.major == 0xFF && version.minor == 0x0F && version.revision == 0x0F) { + lcdDrawText(x, y, "---"); + } + else { + lcdDrawNumber(x, y, 1 + version.major, LEFT); + lcdDrawChar(lcdNextPos, y, '.'); + lcdDrawNumber(lcdNextPos, y, version.minor, LEFT); + lcdDrawChar(lcdNextPos, y, '.'); + lcdDrawNumber(lcdNextPos, y, version.revision, LEFT); + } +} + +void drawPXX2FullVersion(coord_t x, coord_t y, PXX2Version hwVersion, PXX2Version swVersion) +{ + drawPXX2Version(x, y, hwVersion); + lcdDrawText(lcdNextPos, y, "/"); + drawPXX2Version(lcdNextPos, y, swVersion); +} + +bool menuRadioModulesVersion(event_t event) +{ + if (menuEvent) { + moduleState[INTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + return false; + } + + drawMenuTemplate(STR_MENU_MODULES_RX_VERSION, 0, RADIO_ICONS, OPTION_MENU_TITLE_BAR); + + if (event == EVT_ENTRY) { + memclear(&reusableBuffer.hardwareAndSettings.modules, sizeof(reusableBuffer.hardwareAndSettings.modules)); + } + + if (event == EVT_ENTRY || get_tmr10ms() >= reusableBuffer.hardwareAndSettings.updateTime) { + if (isModulePXX2(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) { + moduleState[INTERNAL_MODULE].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE], PXX2_HW_INFO_TX_ID, PXX2_MAX_RECEIVERS_PER_MODULE - 1); + } + + if (isModulePXX2(EXTERNAL_MODULE) && IS_EXTERNAL_MODULE_ON()) { + moduleState[EXTERNAL_MODULE].readModuleInformation(&reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE], PXX2_HW_INFO_TX_ID, PXX2_MAX_RECEIVERS_PER_MODULE - 1); + } + + reusableBuffer.hardwareAndSettings.updateTime = get_tmr10ms() + 1000 /* 10s*/; + } + + coord_t y = MENU_BODY_TOP - menuVerticalOffset * FH; + + for (uint8_t module=0; module= MENU_BODY_TOP && y < MENU_FOOTER_TOP) { + if (module == INTERNAL_MODULE) + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_INTERNAL_MODULE); + else if (module == EXTERNAL_MODULE) + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_EXTERNAL_MODULE); + } + y += FH; + + // Module model + if (y >= MENU_BODY_TOP && y < MENU_FOOTER_TOP) { + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE); + if (module == INTERNAL_MODULE) { + if (!IS_INTERNAL_MODULE_ON()) { + lcdDrawText(COLUMN2_X, y, STR_OFF); + y += FH; + continue; + } + if (!isModulePXX2(INTERNAL_MODULE)) { + lcdDrawText(COLUMN2_X, y, STR_NO_INFORMATION); + y += FH; + continue; + } + } + else if (module == EXTERNAL_MODULE) { + if (!IS_EXTERNAL_MODULE_ON()) { + lcdDrawText(COLUMN2_X, y, STR_OFF); + y += FH; + continue; + } + if (!isModulePXX2(EXTERNAL_MODULE)) { + lcdDrawText(COLUMN2_X, y, STR_NO_INFORMATION); + y += FH; + continue; + } + } + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[module].information.modelID; + lcdDrawText(COLUMN2_X, y, getPXX2ModuleName(modelId)); + } + y += FH; + + // Module version + if (y >= MENU_BODY_TOP && y < MENU_FOOTER_TOP) { + if (reusableBuffer.hardwareAndSettings.modules[module].information.modelID) { + drawPXX2FullVersion(COLUMN2_X, y, reusableBuffer.hardwareAndSettings.modules[module].information.hwVersion, reusableBuffer.hardwareAndSettings.modules[module].information.swVersion); + static const char * variants[] = {"FCC", "EU", "FLEX"}; + uint8_t variant = reusableBuffer.hardwareAndSettings.modules[module].information.variant - 1; + if (variant < DIM(variants)) { + lcdDrawText(lcdNextPos + 1, y, variants[variant]); + } + } + } + y += FH; + + for (uint8_t receiver=0; receiver= MENU_BODY_TOP && y < MENU_FOOTER_TOP) { + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER); + lcdDrawNumber(lcdNextPos + 2, y, receiver + 1); + uint8_t modelId = reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.modelID; + lcdDrawText(COLUMN2_X, y, getPXX2ReceiverName(modelId)); + } + y += FH; + + // Receiver version + if (y >= MENU_BODY_TOP && y < MENU_FOOTER_TOP) { + drawPXX2FullVersion(COLUMN2_X, y, reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.hwVersion, reusableBuffer.hardwareAndSettings.modules[module].receivers[receiver].information.swVersion); + } + y += FH; + } + } + } + + uint8_t lines = (y - (FH + 1)) / FH + menuVerticalOffset; + if (lines > NUM_BODY_LINES) { + drawVerticalScrollbar(LCD_W-1, FH, LCD_H-FH, menuVerticalOffset, lines, NUM_BODY_LINES); + } + + switch(event) { + case EVT_ROTARY_LEFT: + if (lines > NUM_BODY_LINES) { + if (menuVerticalOffset-- == 0) + menuVerticalOffset = lines - 1; + } + break; + + case EVT_ROTARY_RIGHT: + if (lines > NUM_BODY_LINES) { + if (++menuVerticalOffset + NUM_BODY_LINES > lines) + menuVerticalOffset = 0; + } + break; + + case EVT_KEY_BREAK(KEY_EXIT): + if (menuVerticalOffset != 0) + menuVerticalOffset = 0; + else + popMenu(); + break; + } + + return true; +} +#endif + bool menuRadioVersion(event_t event) { char id[27]; - -#if 0 - if (warningResult) { - warningResult = 0; - showMessageBox(STR_STORAGE_FORMAT); - storageEraseAll(false); - NVIC_SystemReset(); - } -#endif - getCPUUniqueID(id); - SIMPLE_MENU(STR_MENUVERSION, RADIO_ICONS, menuTabGeneral, MENU_RADIO_VERSION, 0); + SIMPLE_MENU(STR_MENUVERSION, RADIO_ICONS, menuTabGeneral, MENU_RADIO_VERSION, 1); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, vers_stamp); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + FH, date_stamp); @@ -45,15 +194,6 @@ bool menuRadioVersion(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 4*FH, "UID:"); lcdDrawText(MENUS_MARGIN_LEFT + 64, MENU_CONTENT_TOP + 4*FH, id); -#if 0 - if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - // POPUP_MENU_ADD_ITEM(STR_EEBACKUP); - POPUP_MENU_ADD_ITEM(STR_FACTORYRESET); - POPUP_MENU_START(onVersionMenu); - } -#endif - coord_t y = MENU_CONTENT_TOP + 5*FH; lcdDrawText(MENUS_MARGIN_LEFT, y, "OPTS:"); lcdNextPos = MENUS_MARGIN_LEFT + 64; @@ -62,15 +202,27 @@ bool menuRadioVersion(event_t event) const char * option = options[i]; coord_t width = getTextWidth(option); - if((lcdNextPos + 5 + width) > LCD_W) { + if ((lcdNextPos + 5 + width) > LCD_W) { lcdDrawText(lcdNextPos, y, ","); lcdNextPos = MENUS_MARGIN_LEFT; y += FH; } - if (i > 0 && lcdNextPos !=MENUS_MARGIN_LEFT) + if (i > 0 && lcdNextPos !=MENUS_MARGIN_LEFT) { lcdDrawText(lcdNextPos, y, ", "); + } lcdDrawText(lcdNextPos, y, option); } +#if defined(PXX2) + y += FH + FH / 2; + + lcdDrawText(MENUS_MARGIN_LEFT, y, BUTTON(TR_MODULES_RX_VERSION), menuVerticalPosition == 0 ? INVERS : 0); + y += FH; + if (menuVerticalPosition == 0 && event == EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = EDIT_SELECT_FIELD; + pushMenu(menuRadioModulesVersion); + } +#endif + return true; } diff --git a/radio/src/gui/common/stdlcd/radio_version.cpp b/radio/src/gui/common/stdlcd/radio_version.cpp index 92bd94be4..2e2b042b4 100644 --- a/radio/src/gui/common/stdlcd/radio_version.cpp +++ b/radio/src/gui/common/stdlcd/radio_version.cpp @@ -245,7 +245,9 @@ void menuRadioVersion(event_t event) lcdDrawText(lcdNextPos, y, "---", SMLSIZE); y += FH - 1; #endif + y += 2; + #if defined(PCBTARANIS) || defined(PCBHORUS) lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_FIRMWARE_OPTIONS), menuVerticalPosition == ITEM_RADIO_FIRMWARE_OPTIONS ? INVERS : 0); y += FH; @@ -254,6 +256,7 @@ void menuRadioVersion(event_t event) pushMenu(menuRadioFirmwareOptions); } #endif + #if defined(PXX2) lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_MODULES_RX_VERSION), menuVerticalPosition == ITEM_RADIO_MODULES_VERSION ? INVERS : 0); y += FH; diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 49b6c1344..634622b9f 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -119,16 +119,16 @@ static const uint8_t PXX2ModuleOptions[] = { #else 0b00000000, // None = no option available on unknown modules #endif - 0b11110001, // XJT - 0b11110001, // ISRM - 0b11111101, // ISRM-PRO - 0b11110101, // ISRM-S - 0b11110010, // R9M - 0b11110010, // R9MLite - 0b11110110, // R9MLite-PRO - 0b11110100, // ISRM-N - 0b11110100, // ISRM-S-X9 - 0b11110100, // ISRM-S-X10 + 0b00000001, // XJT + 0b00000001, // ISRM + 0b00001101, // ISRM-PRO + 0b00000101, // ISRM-S + 0b00000010, // R9M + 0b00000010, // R9MLite + 0b00000110, // R9MLite-PRO + 0b00000100, // ISRM-N + 0b00000100, // ISRM-S-X9 + 0b00001100, // ISRM-S-X10 }; inline uint8_t getPXX2ModuleOptions(uint8_t modelId) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 2efefe473..846082748 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -49,6 +49,8 @@ if (PCB STREQUAL X10) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) endif() elseif (PCB STREQUAL X12S) + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) set(FLAVOUR x12s) set(PCBREV "13" CACHE STRING "PCB Revision") if(${PCBREV} GREATER 10)