@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user