mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-21 10:26:06 +03:00
Utilized UPDATE_ERROR_ERASE, added _setError function and refactored code (#4190)
* Added _setError function in the header file _setError function wraps a few lines to eliminate repetitiveness when debugging for errors. * Added _setError function _setError function wraps a few lines to eliminate repetitiveness when debugging for errors.
This commit is contained in:
parent
b08ff10269
commit
d5c43f0102
@ -52,10 +52,7 @@ bool UpdaterClass::begin(size_t size, int command) {
|
|||||||
*/
|
*/
|
||||||
int boot_mode = (GPI >> 16) & 0xf;
|
int boot_mode = (GPI >> 16) & 0xf;
|
||||||
if (boot_mode == 1) {
|
if (boot_mode == 1) {
|
||||||
_error = UPDATE_ERROR_BOOTSTRAP;
|
_setError(UPDATE_ERROR_BOOTSTRAP);
|
||||||
#ifdef DEBUG_UPDATER
|
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,23 +63,17 @@ bool UpdaterClass::begin(size_t size, int command) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(size == 0) {
|
if(size == 0) {
|
||||||
_error = UPDATE_ERROR_SIZE;
|
_setError(UPDATE_ERROR_SIZE);
|
||||||
#ifdef DEBUG_UPDATER
|
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ESP.checkFlashConfig(false)) {
|
if(!ESP.checkFlashConfig(false)) {
|
||||||
_error = UPDATE_ERROR_FLASH_CONFIG;
|
_setError(UPDATE_ERROR_FLASH_CONFIG);
|
||||||
#ifdef DEBUG_UPDATER
|
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_reset();
|
_reset();
|
||||||
_error = 0;
|
clearError(); // _error = 0
|
||||||
|
|
||||||
wifi_set_sleep_type(NONE_SLEEP_T);
|
wifi_set_sleep_type(NONE_SLEEP_T);
|
||||||
|
|
||||||
@ -105,10 +96,7 @@ bool UpdaterClass::begin(size_t size, int command) {
|
|||||||
|
|
||||||
//make sure that the size of both sketches is less than the total space (updateEndAddress)
|
//make sure that the size of both sketches is less than the total space (updateEndAddress)
|
||||||
if(updateStartAddress < currentSketchSize) {
|
if(updateStartAddress < currentSketchSize) {
|
||||||
_error = UPDATE_ERROR_SPACE;
|
_setError(UPDATE_ERROR_SPACE);
|
||||||
#ifdef DEBUG_UPDATER
|
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,10 +169,7 @@ bool UpdaterClass::end(bool evenIfRemaining){
|
|||||||
_md5.calculate();
|
_md5.calculate();
|
||||||
if(_target_md5.length()) {
|
if(_target_md5.length()) {
|
||||||
if(_target_md5 != _md5.toString()){
|
if(_target_md5 != _md5.toString()){
|
||||||
_error = UPDATE_ERROR_MD5;
|
_setError(UPDATE_ERROR_MD5);
|
||||||
#ifdef DEBUG_UPDATER
|
|
||||||
DEBUG_UPDATER.printf("MD5 Failed: expected:%s, calculated:%s\n", _target_md5.c_str(), _md5.toString().c_str());
|
|
||||||
#endif
|
|
||||||
_reset();
|
_reset();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -194,9 +179,6 @@ bool UpdaterClass::end(bool evenIfRemaining){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!_verifyEnd()) {
|
if(!_verifyEnd()) {
|
||||||
#ifdef DEBUG_UPDATER
|
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
_reset();
|
_reset();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -223,23 +205,24 @@ bool UpdaterClass::end(bool evenIfRemaining){
|
|||||||
|
|
||||||
bool UpdaterClass::_writeBuffer(){
|
bool UpdaterClass::_writeBuffer(){
|
||||||
|
|
||||||
bool result = true;
|
bool eraseResult = true, writeResult = true;
|
||||||
if (_currentAddress % FLASH_SECTOR_SIZE == 0) {
|
if (_currentAddress % FLASH_SECTOR_SIZE == 0) {
|
||||||
if(!_async) yield();
|
if(!_async) yield();
|
||||||
result = ESP.flashEraseSector(_currentAddress/FLASH_SECTOR_SIZE);
|
eraseResult = ESP.flashEraseSector(_currentAddress/FLASH_SECTOR_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result) {
|
if (eraseResult) {
|
||||||
if(!_async) yield();
|
if(!_async) yield();
|
||||||
result = ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen);
|
writeResult = ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen);
|
||||||
|
} else { // if erase was unsuccessful
|
||||||
|
_currentAddress = (_startAddress + _size);
|
||||||
|
_setError(UPDATE_ERROR_ERASE);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!result) {
|
if (!writeResult) {
|
||||||
_error = UPDATE_ERROR_WRITE;
|
|
||||||
_currentAddress = (_startAddress + _size);
|
_currentAddress = (_startAddress + _size);
|
||||||
#ifdef DEBUG_UPDATER
|
_setError(UPDATE_ERROR_WRITE);
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_md5.add(_buffer, _bufferLen);
|
_md5.add(_buffer, _bufferLen);
|
||||||
@ -255,7 +238,7 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) {
|
|||||||
if(len > remaining()){
|
if(len > remaining()){
|
||||||
//len = remaining();
|
//len = remaining();
|
||||||
//fail instead
|
//fail instead
|
||||||
_error = UPDATE_ERROR_SPACE;
|
_setError(UPDATE_ERROR_SPACE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -287,8 +270,8 @@ bool UpdaterClass::_verifyHeader(uint8_t data) {
|
|||||||
if(_command == U_FLASH) {
|
if(_command == U_FLASH) {
|
||||||
// check for valid first magic byte (is always 0xE9)
|
// check for valid first magic byte (is always 0xE9)
|
||||||
if(data != 0xE9) {
|
if(data != 0xE9) {
|
||||||
_error = UPDATE_ERROR_MAGIC_BYTE;
|
|
||||||
_currentAddress = (_startAddress + _size);
|
_currentAddress = (_startAddress + _size);
|
||||||
|
_setError(UPDATE_ERROR_MAGIC_BYTE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -304,15 +287,15 @@ bool UpdaterClass::_verifyEnd() {
|
|||||||
|
|
||||||
uint8_t buf[4];
|
uint8_t buf[4];
|
||||||
if(!ESP.flashRead(_startAddress, (uint32_t *) &buf[0], 4)) {
|
if(!ESP.flashRead(_startAddress, (uint32_t *) &buf[0], 4)) {
|
||||||
_error = UPDATE_ERROR_READ;
|
|
||||||
_currentAddress = (_startAddress);
|
_currentAddress = (_startAddress);
|
||||||
|
_setError(UPDATE_ERROR_READ);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for valid first magic byte
|
// check for valid first magic byte
|
||||||
if(buf[0] != 0xE9) {
|
if(buf[0] != 0xE9) {
|
||||||
_error = UPDATE_ERROR_MAGIC_BYTE;
|
|
||||||
_currentAddress = (_startAddress);
|
_currentAddress = (_startAddress);
|
||||||
|
_setError(UPDATE_ERROR_MAGIC_BYTE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,8 +303,8 @@ bool UpdaterClass::_verifyEnd() {
|
|||||||
|
|
||||||
// check if new bin fits to SPI flash
|
// check if new bin fits to SPI flash
|
||||||
if(bin_flash_size > ESP.getFlashChipRealSize()) {
|
if(bin_flash_size > ESP.getFlashChipRealSize()) {
|
||||||
_error = UPDATE_ERROR_NEW_FLASH_CONFIG;
|
|
||||||
_currentAddress = (_startAddress);
|
_currentAddress = (_startAddress);
|
||||||
|
_setError(UPDATE_ERROR_NEW_FLASH_CONFIG);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,11 +336,8 @@ size_t UpdaterClass::writeStream(Stream &data) {
|
|||||||
delay(100);
|
delay(100);
|
||||||
toRead = data.readBytes(_buffer + _bufferLen, (_bufferSize - _bufferLen));
|
toRead = data.readBytes(_buffer + _bufferLen, (_bufferSize - _bufferLen));
|
||||||
if(toRead == 0) { //Timeout
|
if(toRead == 0) { //Timeout
|
||||||
_error = UPDATE_ERROR_STREAM;
|
|
||||||
_currentAddress = (_startAddress + _size);
|
_currentAddress = (_startAddress + _size);
|
||||||
#ifdef DEBUG_UPDATER
|
_setError(UPDATE_ERROR_STREAM);
|
||||||
printError(DEBUG_UPDATER);
|
|
||||||
#endif
|
|
||||||
_reset();
|
_reset();
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
@ -371,6 +351,13 @@ size_t UpdaterClass::writeStream(Stream &data) {
|
|||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdaterClass::_setError(int error){
|
||||||
|
_error = error;
|
||||||
|
#ifdef DEBUG_UPDATER
|
||||||
|
printError(DEBUG_UPDATER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void UpdaterClass::printError(Print &out){
|
void UpdaterClass::printError(Print &out){
|
||||||
out.printf_P(PSTR("ERROR[%u]: "), _error);
|
out.printf_P(PSTR("ERROR[%u]: "), _error);
|
||||||
if(_error == UPDATE_ERROR_OK){
|
if(_error == UPDATE_ERROR_OK){
|
||||||
@ -388,7 +375,8 @@ void UpdaterClass::printError(Print &out){
|
|||||||
} else if(_error == UPDATE_ERROR_STREAM){
|
} else if(_error == UPDATE_ERROR_STREAM){
|
||||||
out.println(F("Stream Read Timeout"));
|
out.println(F("Stream Read Timeout"));
|
||||||
} else if(_error == UPDATE_ERROR_MD5){
|
} else if(_error == UPDATE_ERROR_MD5){
|
||||||
out.println(F("MD5 Check Failed"));
|
//out.println(F("MD5 Check Failed"));
|
||||||
|
out.printf("MD5 Failed: expected:%s, calculated:%s\n", _target_md5.c_str(), _md5.toString().c_str());
|
||||||
} else if(_error == UPDATE_ERROR_FLASH_CONFIG){
|
} else if(_error == UPDATE_ERROR_FLASH_CONFIG){
|
||||||
out.printf_P(PSTR("Flash config wrong real: %d IDE: %d\n"), ESP.getFlashChipRealSize(), ESP.getFlashChipSize());
|
out.printf_P(PSTR("Flash config wrong real: %d IDE: %d\n"), ESP.getFlashChipRealSize(), ESP.getFlashChipSize());
|
||||||
} else if(_error == UPDATE_ERROR_NEW_FLASH_CONFIG){
|
} else if(_error == UPDATE_ERROR_NEW_FLASH_CONFIG){
|
||||||
|
@ -61,11 +61,11 @@ class UpdaterClass {
|
|||||||
If all bytes are written
|
If all bytes are written
|
||||||
this call will write the config to eboot
|
this call will write the config to eboot
|
||||||
and return true
|
and return true
|
||||||
If there is already an update running but is not finished and !evenIfRemainanig
|
If there is already an update running but is not finished and !evenIfRemaining
|
||||||
or there is an error
|
or there is an error
|
||||||
this will clear everything and return false
|
this will clear everything and return false
|
||||||
the last error is available through getError()
|
the last error is available through getError()
|
||||||
evenIfRemaining is helpfull when you update without knowing the final size first
|
evenIfRemaining is helpful when you update without knowing the final size first
|
||||||
*/
|
*/
|
||||||
bool end(bool evenIfRemaining = false);
|
bool end(bool evenIfRemaining = false);
|
||||||
|
|
||||||
@ -148,6 +148,8 @@ class UpdaterClass {
|
|||||||
bool _verifyHeader(uint8_t data);
|
bool _verifyHeader(uint8_t data);
|
||||||
bool _verifyEnd();
|
bool _verifyEnd();
|
||||||
|
|
||||||
|
void _setError(int error);
|
||||||
|
|
||||||
bool _async;
|
bool _async;
|
||||||
uint8_t _error;
|
uint8_t _error;
|
||||||
uint8_t *_buffer;
|
uint8_t *_buffer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user