diff --git a/libraries/MySensors/MySensor.cpp b/libraries/MySensors/MySensor.cpp index 4f3e930..bdab9c2 100644 --- a/libraries/MySensors/MySensor.cpp +++ b/libraries/MySensors/MySensor.cpp @@ -522,7 +522,7 @@ boolean MySensor::process() { #ifdef MY_OTA_FIRMWARE_FEATURE unsigned long enter = hw_millis(); if (fwUpdateOngoing && (enter - fwLastRequestTime > MY_OTA_RETRY_DELAY)) { - if (fwRetry == 0) { + if (!fwRetry) { debug(PSTR("fw upd fail\n")); // Give up. We have requested MY_OTA_RETRY times without any packet in return. fwUpdateOngoing = false; @@ -746,38 +746,38 @@ boolean MySensor::process() { return false; } else debug(PSTR("fw update skipped\n")); } else if (type == ST_FIRMWARE_RESPONSE) { - // Save block to flash - debug(PSTR("fw block %d\n"), fwBlock); - // extract FW block - ReplyFWBlock *firmwareResponse = (ReplyFWBlock *)msg.data; - // write to flash - flash.writeBytes( ((fwBlock - 1) * FIRMWARE_BLOCK_SIZE) + FIRMWARE_START_OFFSET, firmwareResponse->data, FIRMWARE_BLOCK_SIZE); - // wait until flash written - while ( flash.busy() ); - fwBlock--; - if (!fwBlock) { - // We're finished! Do a checksum and reboot. - if (isValidFirmware()) { - debug(PSTR("fw checksum ok\n")); - // All seems ok, write size and signature to flash (DualOptiboot will pick this up and flash it) - flash.writeBytes(0, "FLXIMG:", 7); - // FW size in flash - uint16_t fwsize = FIRMWARE_BLOCK_SIZE * fc.blocks; - flash.writeByte(7, fwsize >> 8); - flash.writeByte(8, fwsize); - // end of header - flash.writeByte(9, ':'); - // Write the new firmware config to eeprom - hw_writeConfigBlock((void*)&fc, (void*)EEPROM_FIRMWARE_TYPE_ADDRESS, sizeof(NodeFirmwareConfig)); - hw_reboot(); - } else { - debug(PSTR("fw checksum fail\n")); + if (fwUpdateOngoing) { + // Save block to flash + debug(PSTR("fw block %d\n"), fwBlock); + // extract FW block + ReplyFWBlock *firmwareResponse = (ReplyFWBlock *)msg.data; + // write to flash + flash.writeBytes( ((fwBlock - 1) * FIRMWARE_BLOCK_SIZE) + FIRMWARE_START_OFFSET, firmwareResponse->data, FIRMWARE_BLOCK_SIZE); + // wait until flash written + while ( flash.busy() ); + fwBlock--; + if (!fwBlock) { + // We're finished! Do a checksum and reboot. fwUpdateOngoing = false; - } + if (isValidFirmware()) { + debug(PSTR("fw checksum ok\n")); + // All seems ok, write size and signature to flash (DualOptiboot will pick this up and flash it) + uint16_t fwsize = FIRMWARE_BLOCK_SIZE * fc.blocks; + uint8_t OTAbuffer[10] = {'F','L','X','I','M','G',':',(fwsize >> 8),fwsize,':'}; + flash.writeBytes(0, OTAbuffer, 10); + // Write the new firmware config to eeprom + hw_writeConfigBlock((void*)&fc, (void*)EEPROM_FIRMWARE_TYPE_ADDRESS, sizeof(NodeFirmwareConfig)); + hw_reboot(); + } else { + debug(PSTR("fw checksum fail\n")); + } + } + // reset flags + fwRetry = MY_OTA_RETRY+1; + fwLastRequestTime = 0; + } else { + debug(PSTR("No fw update ongoing\n")); } - // reset flags - fwRetry = MY_OTA_RETRY+1; - fwLastRequestTime = 0; return false; }