diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 2c545c659..64b123751 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -238,12 +238,16 @@ void onSdManagerMenu(const char * result) #if defined(INTERNAL_MODULE_MULTI) else if (result == STR_FLASH_INTERNAL_MULTI) { getSelectionFullPath(lfn); - multiFlashFirmware(INTERNAL_MODULE, lfn); + multiFlashFirmware(INTERNAL_MODULE, lfn, MULTI_TYPE_MULTIMODULE); } #endif else if (result == STR_FLASH_EXTERNAL_MULTI) { getSelectionFullPath(lfn); - multiFlashFirmware(EXTERNAL_MODULE, lfn); + multiFlashFirmware(EXTERNAL_MODULE, lfn, MULTI_TYPE_MULTIMODULE); + } + else if (result == STR_FLASH_EXTERNAL_ELRS) { + getSelectionFullPath(lfn); + multiFlashFirmware(EXTERNAL_MODULE, lfn, MULTI_TYPE_ELRS); } #endif #if defined(PXX2) @@ -437,6 +441,12 @@ bool menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MULTI); } } + + if (!READ_ONLY() && !strcasecmp(ext, ELRS_FIRMWARE_EXT)) { + TCHAR lfn[_MAX_LFN + 1]; + getSelectionFullPath(lfn); + POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_ELRS); + } #endif #if defined(LUA) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index c6cf9f79b..8fe772898 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -224,12 +224,16 @@ void onSdManagerMenu(const char * result) #if defined(INTERNAL_MODULE_MULTI) else if (result == STR_FLASH_INTERNAL_MULTI) { getSelectionFullPath(lfn); - multiFlashFirmware(INTERNAL_MODULE, lfn); + multiFlashFirmware(INTERNAL_MODULE, lfn, MULTI_TYPE_MULTIMODULE); } #endif else if (result == STR_FLASH_EXTERNAL_MULTI) { getSelectionFullPath(lfn); - multiFlashFirmware(EXTERNAL_MODULE, lfn); + multiFlashFirmware(EXTERNAL_MODULE, lfn, MULTI_TYPE_MULTIMODULE); + } + else if (result == STR_FLASH_EXTERNAL_ELRS) { + getSelectionFullPath(lfn); + multiFlashFirmware(EXTERNAL_MODULE, lfn, MULTI_TYPE_ELRS); } #endif #if defined(BLUETOOTH) @@ -399,6 +403,12 @@ void menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MULTI); } } + + if (!READ_ONLY() && !strcasecmp(ext, ELRS_FIRMWARE_EXT)) { + TCHAR lfn[_MAX_LFN + 1]; + getSelectionFullPath(lfn); + POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_ELRS); + } #endif #if defined(PCBTARANIS) if (!READ_ONLY() && !strcasecmp(ext, FIRMWARE_EXT)) { diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 82ad5d81c..2a6e5f149 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -19,6 +19,7 @@ */ #if !defined(DISABLE_MULTI_UPDATE) + #include "opentx.h" #include "multi_firmware_update.h" #include "stk500.h" @@ -30,28 +31,27 @@ class MultiFirmwareUpdateDriver { public: MultiFirmwareUpdateDriver() {} - const char* flashFirmware(FIL* file, const char* label) const; + const char * flashFirmware(FIL * file, const char * label) const; protected: virtual void moduleOn() const = 0; virtual void init(bool inverted) const = 0; - virtual bool getByte(uint8_t& byte) const = 0; + virtual bool getByte(uint8_t & byte) const = 0; virtual void sendByte(uint8_t byte) const = 0; virtual void clear() const = 0; virtual void deinit(bool inverted) const {} private: - bool getRxByte(uint8_t& byte) const; + bool getRxByte(uint8_t & byte) const; bool checkRxByte(uint8_t byte) const; const char * waitForInitialSync(bool& inverted) const; - const char * getDeviceSignature(uint8_t* signature) const; + const char * getDeviceSignature(uint8_t * signature) const; const char * loadAddress(uint32_t offset) const; - const char * progPage(uint8_t* buffer, uint16_t size) const; + const char * progPage(uint8_t * buffer, uint16_t size) const; void leaveProgMode(bool inverted) const; }; #if defined(INTERNAL_MODULE_MULTI) - class MultiInternalUpdateDriver: public MultiFirmwareUpdateDriver { public: @@ -68,7 +68,7 @@ class MultiInternalUpdateDriver: public MultiFirmwareUpdateDriver intmoduleSerialStart(57600, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b); } - bool getByte(uint8_t& byte) const override + bool getByte(uint8_t & byte) const override { return intmoduleFifo.pop(byte); } @@ -90,7 +90,6 @@ class MultiInternalUpdateDriver: public MultiFirmwareUpdateDriver }; static const MultiInternalUpdateDriver multiInternalUpdateDriver; - #endif class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver @@ -122,7 +121,7 @@ class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver telemetryPortInit(57600, TELEMETRY_SERIAL_DEFAULT); } - bool getByte(uint8_t& byte) const override + bool getByte(uint8_t & byte) const override { return telemetryGetByte(&byte); } @@ -150,12 +149,53 @@ class MultiExternalUpdateDriver: public MultiFirmwareUpdateDriver static const MultiExternalUpdateDriver multiExternalUpdateDriver; -bool MultiFirmwareUpdateDriver::getRxByte(uint8_t& byte) const +class MultiExtSportUpdateDriver: public MultiFirmwareUpdateDriver +{ + public: + MultiExtSportUpdateDriver(): MultiFirmwareUpdateDriver() {} + + protected: + void moduleOn() const override + { + EXTERNAL_MODULE_ON(); + } + + void init(bool inverted) const override + { + telemetryPortInit(57600, TELEMETRY_SERIAL_DEFAULT); + } + + bool getByte(uint8_t & byte) const override + { + return telemetryGetByte(&byte); + } + + void sendByte(uint8_t byte) const override + { + sportSendByte(byte); + telemetryPortSetDirectionInput(); + } + + void clear() const override + { + telemetryClearFifo(); + } + + void deinit(bool inverted) const override + { + telemetryPortInit(0, 0); + clear(); + } +}; + +static const MultiExtSportUpdateDriver multiExtSportUpdateDriver; + +bool MultiFirmwareUpdateDriver::getRxByte(uint8_t & byte) const { uint16_t time; - time = getTmr2MHz() ; - while ( (uint16_t) (getTmr2MHz() - time) < 25000 ) { // 12.5mS + time = getTmr2MHz(); + while ((uint16_t) (getTmr2MHz() - time) < 25000) { // 12.5mS if (getByte(byte)) { #if defined(DEBUG_EXT_MODULE_FLASH) @@ -175,11 +215,15 @@ bool MultiFirmwareUpdateDriver::checkRxByte(uint8_t byte) const return getRxByte(rxchar) ? rxchar == byte : false; } -const char * MultiFirmwareUpdateDriver::waitForInitialSync(bool& inverted) const +const char * MultiFirmwareUpdateDriver::waitForInitialSync(bool & inverted) const { uint8_t byte; int retries = 200; +#if defined(DEBUG_EXT_MODULE_FLASH) + TRACE("[Wait for Sync]"); +#endif + clear(); do { @@ -189,7 +233,7 @@ const char * MultiFirmwareUpdateDriver::waitForInitialSync(bool& inverted) const inverted = !inverted; init(inverted); } - + // Send sync request sendByte(STK_GET_SYNC); sendByte(CRC_EOP); @@ -197,24 +241,35 @@ const char * MultiFirmwareUpdateDriver::waitForInitialSync(bool& inverted) const getRxByte(byte); WDG_RESET(); - } while((byte != STK_INSYNC) && --retries); + } while ((byte != STK_INSYNC) && --retries); if (!retries) { return "NoSync"; } if (byte != STK_INSYNC) { +#if defined(DEBUG_EXT_MODULE_FLASH) + TRACE("[byte != STK_INSYNC]"); +#endif return "NoSync"; } if (!checkRxByte(STK_OK)) { +#if defined(DEBUG_EXT_MODULE_FLASH) + TRACE("[!checkRxByte(STK_OK)]"); +#endif return "NoSync"; } + // avoids sending STK_READ_SIGN with STK_OK + // in case the receiver is too slow changing + // to RX mode (half-duplex). + RTOS_WAIT_TICKS(1); + return nullptr; } -const char * MultiFirmwareUpdateDriver::getDeviceSignature(uint8_t* signature) const +const char * MultiFirmwareUpdateDriver::getDeviceSignature(uint8_t * signature) const { // Read signature sendByte(STK_READ_SIGN); @@ -224,7 +279,7 @@ const char * MultiFirmwareUpdateDriver::getDeviceSignature(uint8_t* signature) c if (!checkRxByte(STK_INSYNC)) return "NoSync"; - for (uint8_t i=0; i<4; i++) { + for (uint8_t i = 0; i < 4; i++) { if (!getRxByte(signature[i])) { return "NoSignature"; } @@ -244,10 +299,14 @@ const char * MultiFirmwareUpdateDriver::loadAddress(uint32_t offset) const return "NoSync"; } + // avoids sending next page back-to-back with STK_OK + // in case the receiver is to slow changing to RX mode (half-duplex). + RTOS_WAIT_TICKS(1); + return nullptr; } -const char * MultiFirmwareUpdateDriver::progPage(uint8_t* buffer, uint16_t size) const +const char * MultiFirmwareUpdateDriver::progPage(uint8_t * buffer, uint16_t size) const { sendByte(STK_PROG_PAGE); @@ -258,9 +317,10 @@ const char * MultiFirmwareUpdateDriver::progPage(uint8_t* buffer, uint16_t size) // flash/eeprom flag sendByte(0); - for (uint16_t i=0; i < size; i++) { + for (uint16_t i = 0; i < size; i++) { sendByte(buffer[i]); } + sendByte(CRC_EOP); if (!checkRxByte(STK_INSYNC)) @@ -271,7 +331,7 @@ const char * MultiFirmwareUpdateDriver::progPage(uint8_t* buffer, uint16_t size) do { getRxByte(byte); WDG_RESET(); - } while(!byte && --retries); + } while (!byte && --retries); if (!retries || (byte != STK_OK)) return "NoPageSync"; @@ -289,9 +349,9 @@ void MultiFirmwareUpdateDriver::leaveProgMode(bool inverted) const deinit(inverted); } -const char * MultiFirmwareUpdateDriver::flashFirmware(FIL* file, const char* label) const +const char * MultiFirmwareUpdateDriver::flashFirmware(FIL * file, const char * label) const { - const char* result = nullptr; + const char * result = nullptr; moduleOn(); bool inverted = true; //false; // true @@ -314,7 +374,7 @@ const char * MultiFirmwareUpdateDriver::flashFirmware(FIL* file, const char* lab return result; } - uint8_t buffer[256]; + uint8_t buffer[256]; uint16_t pageSize = 128; uint32_t writeOffset = 0; @@ -332,7 +392,7 @@ const char * MultiFirmwareUpdateDriver::flashFirmware(FIL* file, const char* lab drawProgressScreen(label, STR_WRITING, file->fptr, file->obj.objsize); - UINT count=0; + UINT count = 0; memclear(buffer, pageSize); if (f_read(file, buffer, pageSize, &count) != FR_OK) { result = "Error reading file"; @@ -384,24 +444,24 @@ const char * MultiFirmwareInformation::readV1Signature(const char * buffer) else return "Wrong format"; - if(buffer[MULTI_SIGN_BOOTLOADER_SUPPORT_OFFSET] == 'b') + if (buffer[MULTI_SIGN_BOOTLOADER_SUPPORT_OFFSET] == 'b') optibootSupport = true; else optibootSupport = false; - if(buffer[MULTI_SIGN_BOOTLOADER_CHECK_OFFSET] == 'c') + if (buffer[MULTI_SIGN_BOOTLOADER_CHECK_OFFSET] == 'c') bootloaderCheck = true; else bootloaderCheck = false; - if(buffer[MULTI_SIGN_TELEM_TYPE_OFFSET] == 't') + if (buffer[MULTI_SIGN_TELEM_TYPE_OFFSET] == 't') telemetryType = FIRMWARE_MULTI_TELEM_MULTI_STATUS; else if (buffer[MULTI_SIGN_TELEM_TYPE_OFFSET] == 's') telemetryType = FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY; else telemetryType = FIRMWARE_MULTI_TELEM_NONE; - if(buffer[MULTI_SIGN_TELEM_INVERSION_OFFSET] == 'i') + if (buffer[MULTI_SIGN_TELEM_INVERSION_OFFSET] == 'i') telemetryInversion = true; else telemetryInversion = false; @@ -452,7 +512,7 @@ const char * MultiFirmwareInformation::readMultiFirmwareInformation(const char * if (f_open(&file, filename, FA_READ) != FR_OK) return "Error opening file"; - const char * err = readMultiFirmwareInformation(&file); + const char * err = readMultiFirmwareInformation(&file); f_close(&file); return err; @@ -465,7 +525,7 @@ const char * MultiFirmwareInformation::readMultiFirmwareInformation(FIL * file) if (f_size(file) < MULTI_SIGN_SIZE) return "File too small"; - + f_lseek(file, f_size(file) - MULTI_SIGN_SIZE); if (f_read(file, buffer, MULTI_SIGN_SIZE, &count) != FR_OK || count != MULTI_SIGN_SIZE) { return "Error reading file"; @@ -474,11 +534,11 @@ const char * MultiFirmwareInformation::readMultiFirmwareInformation(FIL * file) if (!memcmp(buffer, "multi-x", 7)) { return readV2Signature(buffer); } - + return readV1Signature(buffer); } -bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) +bool multiFlashFirmware(uint8_t moduleIdx, const char * filename, MultiModuleType type) { FIL file; @@ -487,36 +547,40 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) return false; } - MultiFirmwareInformation firmwareFile; - if (firmwareFile.readMultiFirmwareInformation(&file)) { - f_close(&file); - POPUP_WARNING("Not a valid file"); - return false; - } - f_lseek(&file, 0); - - if (moduleIdx == EXTERNAL_MODULE) { - if (!firmwareFile.isMultiExternalFirmware()) { + if (type == MULTI_TYPE_MULTIMODULE) { + MultiFirmwareInformation firmwareFile; + if (firmwareFile.readMultiFirmwareInformation(&file)) { f_close(&file); - POPUP_WARNING(STR_NEEDS_FILE); - SET_WARNING_INFO(STR_EXT_MULTI_SPEC, strlen(STR_EXT_MULTI_SPEC), 0); + POPUP_WARNING("Not a valid file"); return false; } - } - else { - if (!firmwareFile.isMultiInternalFirmware()) { - f_close(&file); - POPUP_WARNING(STR_NEEDS_FILE); - SET_WARNING_INFO(STR_INT_MULTI_SPEC, strlen(STR_INT_MULTI_SPEC), 0); - return false; + f_lseek(&file, 0); + + if (moduleIdx == EXTERNAL_MODULE) { + if (!firmwareFile.isMultiExternalFirmware()) { + f_close(&file); + POPUP_WARNING(STR_NEEDS_FILE); + SET_WARNING_INFO(STR_EXT_MULTI_SPEC, strlen(STR_EXT_MULTI_SPEC), 0); + return false; + } + } + else { + if (!firmwareFile.isMultiInternalFirmware()) { + f_close(&file); + POPUP_WARNING(STR_NEEDS_FILE); + SET_WARNING_INFO(STR_INT_MULTI_SPEC, strlen(STR_INT_MULTI_SPEC), 0); + return false; + } } } - const MultiFirmwareUpdateDriver* driver = &multiExternalUpdateDriver; + const MultiFirmwareUpdateDriver * driver = &multiExternalUpdateDriver; #if defined(INTERNAL_MODULE_MULTI) if (moduleIdx == INTERNAL_MODULE) driver = &multiInternalUpdateDriver; #endif + if (type == MULTI_TYPE_ELRS) + driver = &multiExtSportUpdateDriver; pausePulses(); @@ -540,7 +604,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) const char * result = driver->flashFirmware(&file, getBasename(filename)); f_close(&file); - AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1 ); + AUDIO_PLAY(AU_SPECIAL_SOUND_BEEP1); BACKLIGHT_ENABLE(); if (result) { @@ -563,7 +627,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) // reset telemetry protocol telemetryInit(255); - + #if defined(HARDWARE_INTERNAL_MODULE) if (intPwr) { INTERNAL_MODULE_ON(); diff --git a/radio/src/io/multi_firmware_update.h b/radio/src/io/multi_firmware_update.h index e13880184..52a39243d 100644 --- a/radio/src/io/multi_firmware_update.h +++ b/radio/src/io/multi_firmware_update.h @@ -101,6 +101,11 @@ class MultiFirmwareInformation { const char * readV2Signature(const char * buffer); }; -bool multiFlashFirmware(uint8_t module, const char * filename); +enum MultiModuleType { + MULTI_TYPE_MULTIMODULE = 0, + MULTI_TYPE_ELRS, +}; + +bool multiFlashFirmware(uint8_t module, const char * filename, MultiModuleType type); #endif //OPENTX_MULTI_FIRMWARE_H diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index c54e185a1..fb586174c 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -72,6 +72,7 @@ const char RADIO_SETTINGS_PATH[] = RADIO_PATH "/radio.bin"; #define SPORT_FIRMWARE_EXT ".frk" #define FRSKY_FIRMWARE_EXT ".frsk" #define MULTI_FIRMWARE_EXT ".bin" +#define ELRS_FIRMWARE_EXT ".elrs" #define LEN_FILE_EXTENSION_MAX 5 // longest used, including the dot, excluding null term. diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 4883d7f58..7d5ebf278 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -436,6 +436,7 @@ const char STR_FLASH_INTERNAL_MODULE[] = TR_FLASH_INTERNAL_MODULE; const char STR_FLASH_INTERNAL_MULTI[] = TR_FLASH_INTERNAL_MULTI; const char STR_FLASH_EXTERNAL_MODULE[] = TR_FLASH_EXTERNAL_MODULE; const char STR_FLASH_EXTERNAL_MULTI[] = TR_FLASH_EXTERNAL_MULTI; +const char STR_FLASH_EXTERNAL_ELRS[] = TR_FLASH_EXTERNAL_ELRS; const char STR_FIRMWARE_UPDATE_ERROR[] = TR_FIRMWARE_UPDATE_ERROR; const char STR_FIRMWARE_UPDATE_SUCCESS[] = TR_FIRMWARE_UPDATE_SUCCESS; const char STR_WRITING[] = TR_WRITING; diff --git a/radio/src/translations.h b/radio/src/translations.h index 8fa8bddb3..3812ba40b 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -672,6 +672,7 @@ extern const char STR_FLASH_INTERNAL_MODULE[]; extern const char STR_FLASH_INTERNAL_MULTI[]; extern const char STR_FLASH_EXTERNAL_MODULE[]; extern const char STR_FLASH_EXTERNAL_MULTI[]; +extern const char STR_FLASH_EXTERNAL_ELRS[]; extern const char STR_FIRMWARE_UPDATE_ERROR[]; extern const char STR_FIRMWARE_UPDATE_SUCCESS[]; extern const char STR_WRITING[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 59b5c72a9..e7f444bc6 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -841,6 +841,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. modulu", "Flash externího zařízení") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("Chyba zápisu FW", "Chyba zápisu firmware") #define TR_FIRMWARE_UPDATE_SUCCESS "Úspěšný zápis FW" #define TR_WRITING "Zapisuji.." diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 544df5277..7aeadda27 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -843,6 +843,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash int. Multimodul") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash ext. Modul") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash ext. Multimodul") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware Updatefehler") #define TR_FIRMWARE_UPDATE_SUCCESS TR3("Flash successful","Flash successful","Update erfolgreich") #define TR_WRITING "Schreibe..." diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index e2f7e4529..e291f6055 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -847,6 +847,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. module", "Flash external module") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update error", "Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "Writing..." diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7d6b6f3b0..2d60db7c6 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -844,6 +844,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Multi int", "Flash Multi interno") #define TR_FLASH_EXTERNAL_MODULE TR("Flash módulo ext", "Flash módulo externo") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Multi ext", "Flash Multi externo") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW", "Error actualiz. firmware") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" #define TR_WRITING "Escribiendo..." diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index cfc84aa1e..6634f3b17 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -860,6 +860,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "Writing..." diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 4ac49e586..b057e6d27 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -862,6 +862,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE TR("Flasher module ext.", "Flasher module externe") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("Erreur màj FW","Erreur de mise à jour") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" #define TR_WRITING "Ecriture..." diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f54d41ad9..1fca66b10 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -858,6 +858,7 @@ #define TR_FLASH_BLUETOOTH_MODULE TR("Prog. mod. BT", INDENT "Prog. modulo Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Prog. PMU", "Programma PMU") #define TR_CURRENT_VERSION TR("Vers. currente ", "Versione corrente: ") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FLASH_INTERNAL_MODULE TR("Prog. modulo int.", "Programma modulo interno") #define TR_FLASH_EXTERNAL_MODULE TR("Prog. modulo est.", "Programma modulo esterno") #define TR_FLASH_INTERNAL_MULTI TR("Prog. MULTI int.", "Programma MULTI interno") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index d007f8626..a53344085 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -848,6 +848,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "Schrijven..." diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 3e3c08ed8..e38d4d7f0 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -861,6 +861,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "Zapis... " diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 35bda6e7e..653ebb650 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -851,6 +851,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "Writing..." diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index aafa32bcb..5bb905ede 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -861,6 +861,7 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") #define TR_FLASH_EXTERNAL_MODULE "Flash external module" #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") +#define TR_FLASH_EXTERNAL_ELRS TR("Flash Ext. ELRS", "Flash External ELRS") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" #define TR_WRITING "Skriver..."