From 6e8b64cea46e38b623e670bcd96ba144471b6bcb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 24 Apr 2019 16:03:28 +0200 Subject: [PATCH] Rework BIND to share code with OTA update --- radio/src/gui/128x64/model_setup.cpp | 49 +++--- radio/src/gui/480x272/radio_sdmanager.cpp | 104 ++++++------- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 146 ++++++++++-------- radio/src/opentx.cpp | 9 ++ radio/src/opentx.h | 17 +- radio/src/pulses/pulses.h | 22 +++ radio/src/pulses/pxx2.cpp | 14 +- radio/src/telemetry/frsky_pxx2.cpp | 22 +-- 8 files changed, 213 insertions(+), 170 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index ab93a7544..7ced4f024 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -260,19 +260,19 @@ const char * STR_BIND_FLEX_915 = "Flex 915MHz"; void onPXX2R9MBindModeMenu(const char * result) { if (result == STR_BIND_8CH_WITH_TELEM) { - reusableBuffer.moduleSetup.pxx2.bindLbtMode = 0; + reusableBuffer.moduleSetup.bindInformation.lbtMode = 0; } else if (result == STR_BIND_16CH_WITH_TELEM) { - reusableBuffer.moduleSetup.pxx2.bindLbtMode = 1; + reusableBuffer.moduleSetup.bindInformation.lbtMode = 1; } else if (result == STR_BIND_16CH_WITHOUT_TELEM) { - reusableBuffer.moduleSetup.pxx2.bindLbtMode = 2; + reusableBuffer.moduleSetup.bindInformation.lbtMode = 2; } else if (result == STR_BIND_FLEX_868) { - reusableBuffer.moduleSetup.pxx2.bindFlexMode = 0; + reusableBuffer.moduleSetup.bindInformation.flexMode = 0; } else if (result == STR_BIND_FLEX_915) { - reusableBuffer.moduleSetup.pxx2.bindFlexMode = 1; + reusableBuffer.moduleSetup.bindInformation.flexMode = 1; } else { // the user pressed [Exit] @@ -285,13 +285,14 @@ void onPXX2R9MBindModeMenu(const char * result) #if defined(SIMU) uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); - memcpy(g_model.moduleData[moduleIdx].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.bindReceiverIndex], reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], PXX2_LEN_RX_NAME); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + memcpy(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[reusableBuffer.moduleSetup.bindInformation.selectedReceiverIndex], PXX2_LEN_RX_NAME); storageDirty(EE_MODEL); moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; + reusableBuffer.moduleSetup.bindInformation.step = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); #else - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OPTIONS_SELECTED; + reusableBuffer.moduleSetup.bindInformation.step = BIND_OPTIONS_SELECTED; #endif } @@ -299,29 +300,30 @@ void onPXX2BindMenu(const char * result) { if (result != STR_EXIT) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); - reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex = (result - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0]); + reusableBuffer.moduleSetup.bindInformation.selectedReceiverIndex = (result - reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[0]) / sizeof(reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[0]); if (isModuleR9M2(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_EU) { - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; + reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; POPUP_MENU_ADD_ITEM(STR_BIND_8CH_WITH_TELEM); POPUP_MENU_ADD_ITEM(STR_BIND_16CH_WITH_TELEM); POPUP_MENU_ADD_ITEM(STR_BIND_16CH_WITHOUT_TELEM); POPUP_MENU_START(onPXX2R9MBindModeMenu); } else if (isModuleR9M2(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_FLEX) { - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_RX_NAME_SELECTED; + reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; POPUP_MENU_ADD_ITEM(STR_BIND_FLEX_868); POPUP_MENU_ADD_ITEM(STR_BIND_FLEX_915); POPUP_MENU_START(onPXX2R9MBindModeMenu); } else { #if defined(SIMU) - memcpy(g_model.moduleData[moduleIdx].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.bindReceiverIndex], result, PXX2_LEN_RX_NAME); + uint8_t receiverIdx = CURRENT_RECEIVER_EDITED(menuVerticalPosition - HEADER_LINE); + memcpy(g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx], result, PXX2_LEN_RX_NAME); storageDirty(EE_MODEL); moduleState[moduleIdx].mode = MODULE_MODE_NORMAL; - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; + reusableBuffer.moduleSetup.bindInformation.step = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); #else - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OPTIONS_SELECTED; + reusableBuffer.moduleSetup.bindInformation.step = BIND_OPTIONS_SELECTED; #endif } } @@ -356,13 +358,8 @@ void onPXX2ReceiverMenu(const char * result) pushMenu(menuModelReceiverOptions); } else if (result == STR_BIND) { - memclear(&reusableBuffer.moduleSetup.pxx2, sizeof(reusableBuffer.moduleSetup.pxx2)); - reusableBuffer.moduleSetup.pxx2.bindReceiverIndex = receiverIdx; -#if defined(SIMU) - reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount = 2; - strcpy(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[0], "SimuRX1"); - strcpy(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[1], "SimuRX2"); -#endif + memclear(&reusableBuffer.moduleSetup.bindInformation, sizeof(BindInformation)); + reusableBuffer.moduleSetup.bindInformation.rxUid = receiverIdx; if (isModuleR9M2(moduleIdx)) { #if defined(SIMU) reusableBuffer.moduleSetup.pxx2.moduleInformation.information.modelID = 1; @@ -372,7 +369,7 @@ void onPXX2ReceiverMenu(const char * result) #endif } else { - moduleState[moduleIdx].mode = MODULE_MODE_BIND; + moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); } s_editMode = 1; } @@ -1408,7 +1405,7 @@ void menuModelSetup(event_t event) if (s_editMode && isModuleR9M2(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.modelID) { reusableBuffer.moduleSetup.pxx2.moduleInformation.information.modelID = 0; - moduleState[moduleIdx].mode = MODULE_MODE_BIND; + moduleState[moduleIdx].startBind(&reusableBuffer.moduleSetup.bindInformation); } if (attr && (moduleState[moduleIdx].mode == 0 || s_editMode == 0)) { @@ -1422,10 +1419,10 @@ void menuModelSetup(event_t event) } if (moduleState[moduleIdx].mode == MODULE_MODE_BIND) { - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount > 0) { - popupMenuItemsCount = min(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + if (reusableBuffer.moduleSetup.bindInformation.step == BIND_START && reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount > 0) { + popupMenuItemsCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i=0; i reusableBuffer.sdmanager.offset) { - memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); - memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0xff, SD_SCREEN_FILE_LENGTH); - NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = 1; + else if (menuVerticalOffset > reusableBuffer.sdManager.offset) { + memmove(reusableBuffer.sdManager.lines[0], reusableBuffer.sdManager.lines[1], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdManager.lines[0])); + memset(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1], 0xff, SD_SCREEN_FILE_LENGTH); + NODE_TYPE(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1]) = 1; } else { - memmove(reusableBuffer.sdmanager.lines[1], reusableBuffer.sdmanager.lines[0], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); - memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); + memmove(reusableBuffer.sdManager.lines[1], reusableBuffer.sdManager.lines[0], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdManager.lines[0])); + memset(reusableBuffer.sdManager.lines[0], 0, sizeof(reusableBuffer.sdManager.lines[0])); } - reusableBuffer.sdmanager.count = 0; + reusableBuffer.sdManager.count = 0; FRESULT res = f_opendir(&dir, "."); // Open the directory if (res == FR_OK) { @@ -303,46 +303,46 @@ bool menuRadioSdManager(event_t _event) if (fno.fattrib & AM_HID) continue; /* Ignore Windows hidden files */ if (fno.fname[0] == '.' && fno.fname[1] != '.') continue; /* Ignore UNIX hidden files, but not .. */ - reusableBuffer.sdmanager.count++; + reusableBuffer.sdManager.count++; bool isfile = !(fno.fattrib & AM_DIR); if (menuVerticalOffset == 0) { for (uint8_t i=0; i=0; i--) { - char *line = reusableBuffer.sdmanager.lines[i]; + char *line = reusableBuffer.sdManager.lines[i]; if (line[0] == '\0' || isFilenameGreater(isfile, fno.fname, line)) { - if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i); - memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0])); + if (i > 0) memmove(reusableBuffer.sdManager.lines[0], reusableBuffer.sdManager.lines[1], sizeof(reusableBuffer.sdManager.lines[0]) * i); + memset(line, 0, sizeof(reusableBuffer.sdManager.lines[0])); strcpy(line, fno.fname); NODE_TYPE(line) = isfile; break; } } } - else if (menuVerticalOffset > reusableBuffer.sdmanager.offset) { - if (isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-2]) && isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1])) { - memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], fno.fname); - NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = isfile; + else if (menuVerticalOffset > reusableBuffer.sdManager.offset) { + if (isFilenameGreater(isfile, fno.fname, reusableBuffer.sdManager.lines[NUM_BODY_LINES-2]) && isFilenameLower(isfile, fno.fname, reusableBuffer.sdManager.lines[NUM_BODY_LINES-1])) { + memset(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1], 0, sizeof(reusableBuffer.sdManager.lines[0])); + strcpy(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1], fno.fname); + NODE_TYPE(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1]) = isfile; } } else { - if (isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[1]) && isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[0])) { - memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(reusableBuffer.sdmanager.lines[0], fno.fname); - NODE_TYPE(reusableBuffer.sdmanager.lines[0]) = isfile; + if (isFilenameLower(isfile, fno.fname, reusableBuffer.sdManager.lines[1]) && isFilenameGreater(isfile, fno.fname, reusableBuffer.sdManager.lines[0])) { + memset(reusableBuffer.sdManager.lines[0], 0, sizeof(reusableBuffer.sdManager.lines[0])); + strcpy(reusableBuffer.sdManager.lines[0], fno.fname); + NODE_TYPE(reusableBuffer.sdManager.lines[0]) = isfile; } } } @@ -350,49 +350,49 @@ bool menuRadioSdManager(event_t _event) } } - reusableBuffer.sdmanager.offset = menuVerticalOffset; + reusableBuffer.sdManager.offset = menuVerticalOffset; for (uint8_t i=0; igetHeight(); diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index c430e6be0..9706e594c 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -21,7 +21,7 @@ #include "opentx.h" #include "io/frsky_device_firmware_update.h" -#define REFRESH_FILES() do { reusableBuffer.sdmanager.offset = 65535; menuVerticalPosition = 0; } while(0) +#define REFRESH_FILES() do { reusableBuffer.sdManager.offset = 65535; menuVerticalPosition = 0; } while(0) #define NODE_TYPE(fname) fname[SD_SCREEN_FILE_LENGTH+1] #define IS_DIRECTORY(fname) ((bool)(!NODE_TYPE(fname))) #define IS_FILE(fname) ((bool)(NODE_TYPE(fname))) @@ -66,7 +66,25 @@ void getSelectionFullPath(char * lfn) { f_getcwd(lfn, _MAX_LFN); strcat(lfn, "/"); - strcat(lfn, reusableBuffer.sdmanager.lines[menuVerticalPosition - HEADER_LINE - menuVerticalOffset]); + strcat(lfn, reusableBuffer.sdManager.lines[menuVerticalPosition - HEADER_LINE - menuVerticalOffset]); +} + +const char * STR_FLASH_RECEIVER_OTA = "Flash receiver OTA"; + +void onSdFormatConfirm(const char * result) +{ + if (result == STR_OK) { + showMessageBox(STR_FORMATTING); + logsClose(); +#if defined(PCBSKY9X) + Card_state = SD_ST_DATA; +#endif + audioQueue.stopSD(); + if (sdCardFormat()) { + f_chdir("/"); + REFRESH_FILES(); + } + } } void onSdManagerMenu(const char * result) @@ -76,13 +94,13 @@ void onSdManagerMenu(const char * result) // TODO possible buffer overflows here! uint8_t index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; - char * line = reusableBuffer.sdmanager.lines[index]; + char * line = reusableBuffer.sdManager.lines[index]; if (result == STR_SD_INFO) { pushMenu(menuRadioSdManagerInfo); } else if (result == STR_SD_FORMAT) { - POPUP_CONFIRMATION(STR_CONFIRM_FORMAT, nullptr); + POPUP_CONFIRMATION(STR_CONFIRM_FORMAT, onSdFormatConfirm); } else if (result == STR_COPY_FILE) { clipboard.type = CLIPBOARD_TYPE_SD_FILE; @@ -102,7 +120,7 @@ void onSdManagerMenu(const char * result) } } else if (result == STR_RENAME_FILE) { - memcpy(reusableBuffer.sdmanager.originalName, line, sizeof(reusableBuffer.sdmanager.originalName)); + memcpy(reusableBuffer.sdManager.originalName, line, sizeof(reusableBuffer.sdManager.originalName)); uint8_t fnlen = 0, extlen = 0; getFileExtension(line, 0, LEN_FILE_EXTENSION_MAX, &fnlen, &extlen); // write spaces to allow extending the length of a filename @@ -156,6 +174,11 @@ void onSdManagerMenu(const char * result) DeviceFirmwareUpdate device(SPORT_MODULE); device.flashFile(lfn); } + else if (result == STR_FLASH_RECEIVER_OTA) { + getSelectionFullPath(lfn); + moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_BIND; + // TODO + } #endif #if defined(LUA) else if (result == STR_EXECUTE_FILE) { @@ -167,26 +190,12 @@ void onSdManagerMenu(const char * result) void menuRadioSdManager(event_t _event) { - if (warningResult) { - warningResult = 0; - showMessageBox(STR_FORMATTING); - logsClose(); -#if defined(PCBSKY9X) - Card_state = SD_ST_DATA; -#endif - audioQueue.stopSD(); - if (sdCardFormat()) { - f_chdir("/"); - REFRESH_FILES(); - } - } - #if LCD_DEPTH > 1 int lastPos = menuVerticalPosition; #endif event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); - SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabGeneral, MENU_RADIO_SD_MANAGER, HEADER_LINE + reusableBuffer.sdmanager.count); + SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabGeneral, MENU_RADIO_SD_MANAGER, HEADER_LINE + reusableBuffer.sdManager.count); switch (_event) { case EVT_ENTRY: @@ -198,7 +207,7 @@ void menuRadioSdManager(event_t _event) break; case EVT_ENTRY_UP: - menuVerticalOffset = reusableBuffer.sdmanager.offset; + menuVerticalOffset = reusableBuffer.sdManager.offset; break; #if defined(PCBX9) || defined(PCBX7) || defined(PCBX3) // TODO NO_MENU_KEY @@ -226,8 +235,8 @@ void menuRadioSdManager(event_t _event) } else { int index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; - if (IS_DIRECTORY(reusableBuffer.sdmanager.lines[index])) { - f_chdir(reusableBuffer.sdmanager.lines[index]); + if (IS_DIRECTORY(reusableBuffer.sdManager.lines[index])) { + f_chdir(reusableBuffer.sdManager.lines[index]); menuVerticalOffset = 0; menuVerticalPosition = HEADER_LINE; REFRESH_FILES(); @@ -250,7 +259,7 @@ void menuRadioSdManager(event_t _event) if (SD_CARD_PRESENT() && s_editMode <= 0) { killEvents(_event); int index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; - char * line = reusableBuffer.sdmanager.lines[index]; + char * line = reusableBuffer.sdManager.lines[index]; if (!strcmp(line, "..")) { break; // no menu for parent dir } @@ -287,6 +296,9 @@ void menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE); POPUP_MENU_ADD_ITEM(STR_FLASH_INTERNAL_MODULE); POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MODULE); +#if defined(PXX2) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA); +#endif } #endif } @@ -305,29 +317,29 @@ void menuRadioSdManager(event_t _event) } if (SD_CARD_PRESENT()) { - if (reusableBuffer.sdmanager.offset != menuVerticalOffset) { + if (reusableBuffer.sdManager.offset != menuVerticalOffset) { FILINFO fno; DIR dir; if (menuVerticalOffset == 0) { - reusableBuffer.sdmanager.offset = 0; - memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); + reusableBuffer.sdManager.offset = 0; + memset(reusableBuffer.sdManager.lines, 0, sizeof(reusableBuffer.sdManager.lines)); } - else if (menuVerticalOffset == reusableBuffer.sdmanager.count-NUM_BODY_LINES) { - reusableBuffer.sdmanager.offset = menuVerticalOffset; - memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); + else if (menuVerticalOffset == reusableBuffer.sdManager.count-NUM_BODY_LINES) { + reusableBuffer.sdManager.offset = menuVerticalOffset; + memset(reusableBuffer.sdManager.lines, 0, sizeof(reusableBuffer.sdManager.lines)); } - else if (menuVerticalOffset > reusableBuffer.sdmanager.offset) { - memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); - memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0xff, SD_SCREEN_FILE_LENGTH); - NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = 1; + else if (menuVerticalOffset > reusableBuffer.sdManager.offset) { + memmove(reusableBuffer.sdManager.lines[0], reusableBuffer.sdManager.lines[1], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdManager.lines[0])); + memset(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1], 0xff, SD_SCREEN_FILE_LENGTH); + NODE_TYPE(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1]) = 1; } else { - memmove(reusableBuffer.sdmanager.lines[1], reusableBuffer.sdmanager.lines[0], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdmanager.lines[0])); - memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); + memmove(reusableBuffer.sdManager.lines[1], reusableBuffer.sdManager.lines[0], (NUM_BODY_LINES-1)*sizeof(reusableBuffer.sdManager.lines[0])); + memset(reusableBuffer.sdManager.lines[0], 0, sizeof(reusableBuffer.sdManager.lines[0])); } - reusableBuffer.sdmanager.count = 0; + reusableBuffer.sdManager.count = 0; FRESULT res = f_opendir(&dir, "."); // Open the directory if (res == FR_OK) { @@ -339,46 +351,46 @@ void menuRadioSdManager(event_t _event) if (fno.fattrib & AM_HID) continue; /* Ignore Windows hidden files */ if (fno.fname[0] == '.' && fno.fname[1] != '.') continue; /* Ignore UNIX hidden files, but not .. */ - reusableBuffer.sdmanager.count++; + reusableBuffer.sdManager.count++; bool isfile = !(fno.fattrib & AM_DIR); if (menuVerticalOffset == 0) { for (uint8_t i=0; i=0; i--) { - char * line = reusableBuffer.sdmanager.lines[i]; + char * line = reusableBuffer.sdManager.lines[i]; if (line[0] == '\0' || isFilenameGreater(isfile, fno.fname, line)) { - if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i); - memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0])); + if (i > 0) memmove(reusableBuffer.sdManager.lines[0], reusableBuffer.sdManager.lines[1], sizeof(reusableBuffer.sdManager.lines[0]) * i); + memset(line, 0, sizeof(reusableBuffer.sdManager.lines[0])); strcpy(line, fno.fname); NODE_TYPE(line) = isfile; break; } } } - else if (menuVerticalOffset > reusableBuffer.sdmanager.offset) { - if (isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-2]) && isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1])) { - memset(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1], fno.fname); - NODE_TYPE(reusableBuffer.sdmanager.lines[NUM_BODY_LINES-1]) = isfile; + else if (menuVerticalOffset > reusableBuffer.sdManager.offset) { + if (isFilenameGreater(isfile, fno.fname, reusableBuffer.sdManager.lines[NUM_BODY_LINES-2]) && isFilenameLower(isfile, fno.fname, reusableBuffer.sdManager.lines[NUM_BODY_LINES-1])) { + memset(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1], 0, sizeof(reusableBuffer.sdManager.lines[0])); + strcpy(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1], fno.fname); + NODE_TYPE(reusableBuffer.sdManager.lines[NUM_BODY_LINES-1]) = isfile; } } else { - if (isFilenameLower(isfile, fno.fname, reusableBuffer.sdmanager.lines[1]) && isFilenameGreater(isfile, fno.fname, reusableBuffer.sdmanager.lines[0])) { - memset(reusableBuffer.sdmanager.lines[0], 0, sizeof(reusableBuffer.sdmanager.lines[0])); - strcpy(reusableBuffer.sdmanager.lines[0], fno.fname); - NODE_TYPE(reusableBuffer.sdmanager.lines[0]) = isfile; + if (isFilenameLower(isfile, fno.fname, reusableBuffer.sdManager.lines[1]) && isFilenameGreater(isfile, fno.fname, reusableBuffer.sdManager.lines[0])) { + memset(reusableBuffer.sdManager.lines[0], 0, sizeof(reusableBuffer.sdManager.lines[0])); + strcpy(reusableBuffer.sdManager.lines[0], fno.fname); + NODE_TYPE(reusableBuffer.sdManager.lines[0]) = isfile; } } } @@ -386,47 +398,47 @@ void menuRadioSdManager(event_t _event) } } - reusableBuffer.sdmanager.offset = menuVerticalOffset; + reusableBuffer.sdManager.offset = menuVerticalOffset; int index = menuVerticalPosition - HEADER_LINE - menuVerticalOffset; for (uint8_t i=0; i 1 - const char * ext = getFileExtension(reusableBuffer.sdmanager.lines[index]); + const char * ext = getFileExtension(reusableBuffer.sdManager.lines[index]); if (ext && isExtensionMatching(ext, BITMAPS_EXT)) { if (lastPos != menuVerticalPosition) { - if (!lcdLoadBitmap(modelBitmap, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) { + if (!lcdLoadBitmap(modelBitmap, reusableBuffer.sdManager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) { memcpy(modelBitmap, logo_taranis, MODEL_BITMAP_SIZE); } } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 55b80bea3..8efc95903 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1932,6 +1932,15 @@ void simuMain() int main() #endif { + TRACE("reusableBuffer: modelSel=%d, moduleSetup=%d, calib=%d, sdManager=%d, hardwareAndSettings=%d, spectrumAnalyser=%d, usb=%d", + sizeof(reusableBuffer.modelsel), + sizeof(reusableBuffer.moduleSetup), + sizeof(reusableBuffer.calib), + sizeof(reusableBuffer.sdManager), + sizeof(reusableBuffer.hardwareAndSettings), + sizeof(reusableBuffer.spectrumAnalyser), + sizeof(reusableBuffer.MSC_BOT_Data)); + // G: The WDT remains active after a WDT reset -- at maximum clock speed. So it's // important to disable it before commencing with system initialisation (or // we could put a bunch more wdt_reset()s in. But I don't like that approach diff --git a/radio/src/opentx.h b/radio/src/opentx.h index a1e5e08e9..c790babd2 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1128,25 +1128,18 @@ union ReusableBuffer struct { char msg[64]; uint8_t r9mPower; + BindInformation bindInformation; struct { union { uint8_t registerStep; - uint8_t bindStep; uint8_t resetStep; }; - uint32_t bindWaitTimeout; uint8_t registerPopupVerticalPosition; uint8_t registerPopupHorizontalPosition; int8_t registerPopupEditMode; char registerRxName[PXX2_LEN_RX_NAME]; uint8_t registerLoopIndex; // will be removed later - char bindCandidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; - uint8_t bindCandidateReceiversCount; - uint8_t bindReceiverIndex; - uint8_t bindLbtMode; - uint8_t bindFlexMode; union { - uint8_t bindSelectedReceiverIndex; uint8_t shareReceiverIndex; uint8_t resetReceiverIndex; }; @@ -1185,7 +1178,13 @@ union ReusableBuffer uint16_t offset; uint16_t count; char originalName[SD_SCREEN_FILE_LENGTH+1]; - } sdmanager; + struct { + uint8_t step; + char candidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; + uint8_t candidateReceiversCount; + uint8_t receiverIndex; + } otaUpdate; + } sdManager; #endif struct { diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 2c47220d5..719e459ad 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -122,6 +122,17 @@ struct ReceiverSettings { uint8_t outputsMapping[24]; }; +struct BindInformation { + uint8_t step; + uint32_t timeout; + char candidateReceiversNames[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME + 1]; + uint8_t candidateReceiversCount; + uint8_t selectedReceiverIndex; + uint8_t rxUid; + uint8_t lbtMode; + uint8_t flexMode; +}; + PACK(struct ModuleState { uint8_t protocol:4; uint8_t mode:4; @@ -131,7 +142,18 @@ PACK(struct ModuleState { union { ModuleInformation * moduleInformation; ModuleSettings * moduleSettings; + BindInformation * bindInformation; }; + void startBind(BindInformation * destination) + { + bindInformation = destination; + mode = MODULE_MODE_BIND; +#if defined(SIMU) + bindInformation->candidateReceiversCount = 2; + strcpy(bindInformation->candidateReceiversNames[0], "SimuRX1"); + strcpy(bindInformation->candidateReceiversNames[1], "SimuRX2"); +#endif + } void readModuleInformation(ModuleInformation * destination, int8_t first, int8_t last) { moduleInformation = destination; diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index a61b1d909..6fc47c966 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -222,10 +222,12 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) void Pxx2Pulses::setupBindFrame(uint8_t module) { - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_WAIT) { - if (get_tmr10ms() > reusableBuffer.moduleSetup.pxx2.bindWaitTimeout) { + BindInformation * destination = moduleState[module].bindInformation; + + if (destination->step == BIND_WAIT) { + if (get_tmr10ms() > destination->timeout) { moduleState[module].mode = MODULE_MODE_NORMAL; - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_OK; + destination->step = BIND_OK; POPUP_INFORMATION(STR_BIND_OK); } return; @@ -233,12 +235,12 @@ void Pxx2Pulses::setupBindFrame(uint8_t module) addFrameType(PXX2_TYPE_C_MODULE, PXX2_TYPE_ID_BIND); - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_OPTIONS_SELECTED) { + if (destination->step == BIND_OPTIONS_SELECTED) { Pxx2Transport::addByte(0x01); for (uint8_t i=0; icandidateReceiversNames[destination->selectedReceiverIndex][i]); } - Pxx2Transport::addByte((reusableBuffer.moduleSetup.pxx2.bindLbtMode << 6) + (reusableBuffer.moduleSetup.pxx2.bindFlexMode << 4) + reusableBuffer.moduleSetup.pxx2.bindReceiverIndex); // RX_UID is the slot index (which is unique and never moved) + Pxx2Transport::addByte((destination->lbtMode << 6) + (destination->flexMode << 4) + destination->rxUid); // RX_UID is the slot index (which is unique and never moved) Pxx2Transport::addByte(g_model.header.modelId[module]); } else { diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index f017c97be..54e0c27fb 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -137,29 +137,31 @@ void processBindFrame(uint8_t module, uint8_t * frame) return; } + BindInformation * destination = moduleState[module].bindInformation; + switch(frame[3]) { case 0x00: - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_START) { + if (destination->step == BIND_START) { bool found = false; - for (uint8_t i=0; icandidateReceiversCount; i++) { + if (memcmp(destination->candidateReceiversNames[i], &frame[4], PXX2_LEN_RX_NAME) == 0) { found = true; break; } } - if (!found && reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount < PXX2_MAX_RECEIVERS_PER_MODULE) { - memcpy(reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversCount++], &frame[4], PXX2_LEN_RX_NAME); + if (!found && destination->candidateReceiversCount < PXX2_MAX_RECEIVERS_PER_MODULE) { + memcpy(destination->candidateReceiversNames[destination->candidateReceiversCount++], &frame[4], PXX2_LEN_RX_NAME); } } break; case 0x01: - if (reusableBuffer.moduleSetup.pxx2.bindStep == BIND_OPTIONS_SELECTED) { - if (memcmp(&reusableBuffer.moduleSetup.pxx2.bindCandidateReceiversNames[reusableBuffer.moduleSetup.pxx2.bindSelectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { - memcpy(g_model.moduleData[module].pxx2.receiverName[reusableBuffer.moduleSetup.pxx2.bindReceiverIndex], &frame[4], PXX2_LEN_RX_NAME); + if (destination->step == BIND_OPTIONS_SELECTED) { + if (memcmp(&destination->candidateReceiversNames[destination->selectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { + memcpy(g_model.moduleData[module].pxx2.receiverName[destination->rxUid], &frame[4], PXX2_LEN_RX_NAME); storageDirty(EE_MODEL); - reusableBuffer.moduleSetup.pxx2.bindStep = BIND_WAIT; - reusableBuffer.moduleSetup.pxx2.bindWaitTimeout = get_tmr10ms() + 30; + destination->step = BIND_WAIT; + destination->timeout = get_tmr10ms() + 30; } } break;