Merge pull request #147 from tekka007/OTA/20150802

OTA improvements
This commit is contained in:
Henrik Ekblad
2015-08-02 13:47:19 +02:00
+30 -30
View File
@@ -522,7 +522,7 @@ boolean MySensor::process() {
#ifdef MY_OTA_FIRMWARE_FEATURE #ifdef MY_OTA_FIRMWARE_FEATURE
unsigned long enter = hw_millis(); unsigned long enter = hw_millis();
if (fwUpdateOngoing && (enter - fwLastRequestTime > MY_OTA_RETRY_DELAY)) { if (fwUpdateOngoing && (enter - fwLastRequestTime > MY_OTA_RETRY_DELAY)) {
if (fwRetry == 0) { if (!fwRetry) {
debug(PSTR("fw upd fail\n")); debug(PSTR("fw upd fail\n"));
// Give up. We have requested MY_OTA_RETRY times without any packet in return. // Give up. We have requested MY_OTA_RETRY times without any packet in return.
fwUpdateOngoing = false; fwUpdateOngoing = false;
@@ -746,38 +746,38 @@ boolean MySensor::process() {
return false; return false;
} else debug(PSTR("fw update skipped\n")); } else debug(PSTR("fw update skipped\n"));
} else if (type == ST_FIRMWARE_RESPONSE) { } else if (type == ST_FIRMWARE_RESPONSE) {
// Save block to flash if (fwUpdateOngoing) {
debug(PSTR("fw block %d\n"), fwBlock); // Save block to flash
// extract FW block debug(PSTR("fw block %d\n"), fwBlock);
ReplyFWBlock *firmwareResponse = (ReplyFWBlock *)msg.data; // extract FW block
// write to flash ReplyFWBlock *firmwareResponse = (ReplyFWBlock *)msg.data;
flash.writeBytes( ((fwBlock - 1) * FIRMWARE_BLOCK_SIZE) + FIRMWARE_START_OFFSET, firmwareResponse->data, FIRMWARE_BLOCK_SIZE); // write to flash
// wait until flash written flash.writeBytes( ((fwBlock - 1) * FIRMWARE_BLOCK_SIZE) + FIRMWARE_START_OFFSET, firmwareResponse->data, FIRMWARE_BLOCK_SIZE);
while ( flash.busy() ); // wait until flash written
fwBlock--; while ( flash.busy() );
if (!fwBlock) { fwBlock--;
// We're finished! Do a checksum and reboot. if (!fwBlock) {
if (isValidFirmware()) { // We're finished! Do a checksum and reboot.
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"));
fwUpdateOngoing = false; 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; return false;
} }