diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index d5cd82804..0cfb23c62 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -393,17 +393,34 @@ bool Pxx2OtaUpdate::waitStep(uint8_t step, uint8_t timeout) return true; } +const char * Pxx2OtaUpdate::nextStep(uint8_t step, const char * rxName, uint32_t address, const uint8_t * buffer) +{ + OtaUpdateInformation * destination = moduleState[module].otaUpdateInformation; + + destination->step = step; + destination->address = address; + + for (uint8_t retry = 0;; retry++) { + extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + if (waitStep(step + 1, 10)) { + return nullptr; + } + else if (retry == 100) { + return "Transfer failed"; + } + } +} + const char * Pxx2OtaUpdate::doFlashFirmware(const char * filename) { FIL file; uint8_t buffer[32]; UINT count; - OtaUpdateInformation * destination = moduleState[module].otaUpdateInformation; + const char * result; - destination->step = OTA_UPDATE_START; - extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, 0, nullptr); - if (!waitStep(OTA_UPDATE_START_ACK, 10)) { - return "Transfer failed"; + result = nextStep(OTA_UPDATE_START, rxName, 0, nullptr); + if (result) { + return result; } if (f_open(&file, filename, FA_READ) != FR_OK) { @@ -418,25 +435,21 @@ const char * Pxx2OtaUpdate::doFlashFirmware(const char * filename) f_close(&file); return "Read file failed"; } - destination->step = OTA_UPDATE_TRANSFER; - extmodulePulsesData.pxx2.sendOtaUpdate(module, nullptr, done, (char *)buffer); - if (!waitStep(OTA_UPDATE_TRANSFER_ACK, 10)) { - return "Transfer failed"; + + result = nextStep(OTA_UPDATE_TRANSFER, nullptr, done, buffer); + if (result) { + return result; } + if (count < sizeof(buffer)) { f_close(&file); break; } + done += count; } - destination->step = OTA_UPDATE_EOF; - extmodulePulsesData.pxx2.sendOtaUpdate(module, nullptr, done, nullptr); - if (!waitStep(OTA_UPDATE_END, 10)) { - return "Transfer failed"; - } - - return nullptr; + return nextStep(OTA_UPDATE_EOF, nullptr, done, nullptr); } void Pxx2OtaUpdate::flashFirmware(const char * filename) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 4a5ba5d55..db358501e 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -137,7 +137,7 @@ enum PXX2OtaUpdateSteps { OTA_UPDATE_TRANSFER, OTA_UPDATE_TRANSFER_ACK, OTA_UPDATE_EOF, - OTA_UPDATE_END + OTA_UPDATE_EOF_ACK }; enum PXX2ReceiverStatus { @@ -295,6 +295,7 @@ class Pxx2OtaUpdate { const char * doFlashFirmware(const char * filename); bool waitStep(uint8_t step, uint8_t timeout); + const char * nextStep(uint8_t step, const char * rxName, uint32_t address, const uint8_t * buffer); }; #endif diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 7e05082fb..3590c16e6 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -248,7 +248,7 @@ void processOtaUpdateFrame(uint8_t module, uint8_t * frame) OtaUpdateInformation * destination = moduleState[module].otaUpdateInformation; if (destination->step == OTA_UPDATE_START) { - if (frame[3] == 0x00 && memcmp(&destination->candidateReceiversNames[destination->selectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { + if (frame[3] == 0x00 && memcmp(destination->candidateReceiversNames[destination->selectedReceiverIndex], &frame[4], PXX2_LEN_RX_NAME) == 0) { destination->step = OTA_UPDATE_START_ACK; } } @@ -260,7 +260,7 @@ void processOtaUpdateFrame(uint8_t module, uint8_t * frame) } else if (destination->step == OTA_UPDATE_EOF) { if (frame[3] == 0x02) { - destination->step = OTA_UPDATE_END; + destination->step = OTA_UPDATE_EOF_ACK; } } } diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 852cc9cfb..9beff2f9e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -930,7 +930,7 @@ #define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Port", "Flash S.Port device") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") +#define TR_CURRENT_VERSION TR("Curr Vers: ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE TR("Flash int. module", "Flash internal module") #define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. module", "Flash external module") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update error", "Firmware update error")