OTA improved (LED flashing, faster buffer closing at end of write)

This commit is contained in:
Klaus K Wilting 2018-11-05 15:28:26 +01:00
parent 9fa2f974c3
commit af0f3a78fd
4 changed files with 48 additions and 15 deletions

View File

@ -11,7 +11,7 @@
#include <BintrayClient.h> #include <BintrayClient.h>
#include <string> #include <string>
bool do_ota_update(); int do_ota_update();
void start_ota_update(); void start_ota_update();
int version_compare(const String v1, const String v2); int version_compare(const String v1, const String v2);
void display(const uint8_t row, const std::string status, void display(const uint8_t row, const std::string status,

View File

@ -41,7 +41,7 @@ class UpdateClass {
Call this to check the space needed for the update Call this to check the space needed for the update
Will return false if there is not enough space Will return false if there is not enough space
*/ */
bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH); bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW);
/* /*
Writes a buffer to the flash and increments the address Writes a buffer to the flash and increments the address
@ -174,6 +174,9 @@ class UpdateClass {
String _target_md5; String _target_md5;
MD5Builder _md5; MD5Builder _md5;
int _ledPin;
uint8_t _ledOn;
}; };
extern UpdateClass Update; extern UpdateClass Update;

View File

@ -26,8 +26,6 @@ const BintrayClient bintray(BINTRAY_USER, BINTRAY_REPO, BINTRAY_PACKAGE);
// Connection port (HTTPS) // Connection port (HTTPS)
const int port = 443; const int port = 443;
const unsigned long STREAM_TIMEOUT = 30000;
// Variables to validate firmware content // Variables to validate firmware content
int volatile contentLength = 0; int volatile contentLength = 0;
bool volatile isValidContentType = false; bool volatile isValidContentType = false;
@ -77,7 +75,7 @@ void start_ota_update() {
WiFi.begin(WIFI_SSID, WIFI_PASS); WiFi.begin(WIFI_SSID, WIFI_PASS);
int i = WIFI_MAX_TRY, j = OTA_MAX_TRY; int i = WIFI_MAX_TRY, j = OTA_MAX_TRY;
bool ret = 1; int ret = 1; // 0 = finished, 1 = retry, -1 = abort
ESP_LOGI(TAG, "Trying to connect to %s", WIFI_SSID); ESP_LOGI(TAG, "Trying to connect to %s", WIFI_SSID);
while (i--) { while (i--) {
@ -110,7 +108,9 @@ end:
} // start_ota_update } // start_ota_update
bool do_ota_update() { // Reads data vom wifi client and flashes it to ota partition
// returns: 0 = finished, 1 = retry, -1 = abort
int do_ota_update() {
char buf[17]; char buf[17];
bool redirect = true; bool redirect = true;
@ -128,7 +128,7 @@ bool do_ota_update() {
} else if (version_compare(latest, cfg.version) <= 0) { } else if (version_compare(latest, cfg.version) <= 0) {
ESP_LOGI(TAG, "Current firmware is up to date"); ESP_LOGI(TAG, "Current firmware is up to date");
display(2, "NO", "no update found"); display(2, "NO", "no update found");
return -2; return -1;
} }
ESP_LOGI(TAG, "New firmware version v%s available", latest.c_str()); ESP_LOGI(TAG, "New firmware version v%s available", latest.c_str());
display(2, "OK", latest.c_str()); display(2, "OK", latest.c_str());
@ -147,7 +147,7 @@ bool do_ota_update() {
WiFiClientSecure client; WiFiClientSecure client;
client.setCACert(bintray.getCertificate(currentHost)); client.setCACert(bintray.getCertificate(currentHost));
//client.setTimeout(RESPONSE_TIMEOUT_MS); // client.setTimeout(RESPONSE_TIMEOUT_MS);
// --> causing error [E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9 // --> causing error [E][WiFiClient.cpp:236] setSocketOption(): 1006 : 9
// so we unfortunately need patched update.cpp which sets the stream timeout // so we unfortunately need patched update.cpp which sets the stream timeout
@ -206,8 +206,7 @@ bool do_ota_update() {
redirect = true; redirect = true;
} else { } else {
ESP_LOGI(TAG, "Could not get firmware download URL"); ESP_LOGI(TAG, "Could not get firmware download URL");
// Unexptected HTTP response. Retry or skip update? goto retry;
redirect = false;
} }
} }
@ -248,7 +247,15 @@ bool do_ota_update() {
goto retry; goto retry;
} }
#ifdef HAS_LED
#ifndef LED_ACTIVE_LOW
if (!Update.begin(contentLength, U_FLASH, HAS_LED, HIGH)) {
#else
if (!Update.begin(contentLength, U_FLASH, HAS_LED, LOW)) {
#endif
#else
if (!Update.begin(contentLength)) { if (!Update.begin(contentLength)) {
#endif
ESP_LOGI(TAG, "Not enough space to start OTA update"); ESP_LOGI(TAG, "Not enough space to start OTA update");
display(4, " E", "disk full"); display(4, " E", "disk full");
goto abort; goto abort;

View File

@ -1,9 +1,9 @@
/* /*
this file copied from esp32-arduino library and patched, see PR this file copied from esp32-arduino library and patched, see PR
https://github.com/espressif/arduino-esp32/pull/1886 https://github.com/espressif/arduino-esp32/pull/1979
*/ */
#include "update.h" #include "Update.h"
#include "Arduino.h" #include "Arduino.h"
#include "esp_spi_flash.h" #include "esp_spi_flash.h"
#include "esp_ota_ops.h" #include "esp_ota_ops.h"
@ -93,6 +93,10 @@ void UpdateClass::_reset() {
_progress = 0; _progress = 0;
_size = 0; _size = 0;
_command = U_FLASH; _command = U_FLASH;
if(_ledPin != -1) {
digitalWrite(_ledPin, !_ledOn); // off
}
} }
bool UpdateClass::canRollBack(){ bool UpdateClass::canRollBack(){
@ -111,12 +115,15 @@ bool UpdateClass::rollBack(){
return _partitionIsBootable(partition) && !esp_ota_set_boot_partition(partition); return _partitionIsBootable(partition) && !esp_ota_set_boot_partition(partition);
} }
bool UpdateClass::begin(size_t size, int command) { bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
if(_size > 0){ if(_size > 0){
log_w("already running"); log_w("already running");
return false; return false;
} }
_ledPin = ledPin;
_ledOn = !!ledOn; // 0(LOW) or 1(HIGH)
_reset(); _reset();
_error = 0; _error = 0;
@ -321,16 +328,32 @@ size_t UpdateClass::writeStream(Stream &data) {
if (_progress_callback) { if (_progress_callback) {
_progress_callback(0, _size); _progress_callback(0, _size);
} }
if(_ledPin != -1) {
pinMode(_ledPin, OUTPUT);
}
while(remaining()) { while(remaining()) {
toRead = data.readBytes(_buffer + _bufferLen, (SPI_FLASH_SEC_SIZE - _bufferLen)); if(_ledPin != -1) {
digitalWrite(_ledPin, _ledOn); // Switch LED on
}
size_t bytesToRead = SPI_FLASH_SEC_SIZE - _bufferLen;
if(bytesToRead > remaining()) {
bytesToRead = remaining();
}
toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) { //Timeout if(toRead == 0) { //Timeout
delay(100); delay(100);
toRead = data.readBytes(_buffer + _bufferLen, (SPI_FLASH_SEC_SIZE - _bufferLen)); toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) { //Timeout if(toRead == 0) { //Timeout
_abort(UPDATE_ERROR_STREAM); _abort(UPDATE_ERROR_STREAM);
return written; return written;
} }
} }
if(_ledPin != -1) {
digitalWrite(_ledPin, !_ledOn); // Switch LED off
}
_bufferLen += toRead; _bufferLen += toRead;
if((_bufferLen == remaining() || _bufferLen == SPI_FLASH_SEC_SIZE) && !_writeBuffer()) if((_bufferLen == remaining() || _bufferLen == SPI_FLASH_SEC_SIZE) && !_writeBuffer())
return written; return written;