From db4e7667afe0e169c5f00567f4b59ab8e0fc1532 Mon Sep 17 00:00:00 2001 From: Jayantajit Gogoi <30702133+jayanta525@users.noreply.github.com> Date: Mon, 19 Jul 2021 16:58:17 +0530 Subject: [PATCH] add callback to HTTPUpdate (#5408) - add callback function to HTTPUpdate - update example to print httpupdate progress - fix ArduinoIDE syntax coloring Signed-off-by: Jayantajit Gogoi --- .../examples/httpUpdate/httpUpdate.ino | 21 ++++++++++++++++ libraries/HTTPUpdate/keywords.txt | 6 ++--- libraries/HTTPUpdate/src/HTTPUpdate.cpp | 20 ++++++++++++++++ libraries/HTTPUpdate/src/HTTPUpdate.h | 24 +++++++++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/libraries/HTTPUpdate/examples/httpUpdate/httpUpdate.ino b/libraries/HTTPUpdate/examples/httpUpdate/httpUpdate.ino index e98a5851..3a612da7 100644 --- a/libraries/HTTPUpdate/examples/httpUpdate/httpUpdate.ino +++ b/libraries/HTTPUpdate/examples/httpUpdate/httpUpdate.ino @@ -36,6 +36,22 @@ void setup() { } +void update_started() { + Serial.println("CALLBACK: HTTP update process started"); +} + +void update_finished() { + Serial.println("CALLBACK: HTTP update process finished"); +} + +void update_progress(int cur, int total) { + Serial.printf("CALLBACK: HTTP update process at %d of %d bytes...\n", cur, total); +} + +void update_error(int err) { + Serial.printf("CALLBACK: HTTP update fatal error code %d\n", err); +} + void loop() { // wait for WiFi connection if ((WiFiMulti.run() == WL_CONNECTED)) { @@ -50,6 +66,11 @@ void loop() { // value is used to put the LED on. If the LED is on with HIGH, that value should be passed // httpUpdate.setLedPin(LED_BUILTIN, LOW); + httpUpdate.onStart(update_started); + httpUpdate.onEnd(update_finished); + httpUpdate.onProgress(update_progress); + httpUpdate.onError(update_error); + t_httpUpdate_return ret = httpUpdate.update(client, "http://server/file.bin"); // Or: //t_httpUpdate_return ret = httpUpdate.update(client, "server", 80, "/file.bin"); diff --git a/libraries/HTTPUpdate/keywords.txt b/libraries/HTTPUpdate/keywords.txt index 78be600d..a882d8ce 100644 --- a/libraries/HTTPUpdate/keywords.txt +++ b/libraries/HTTPUpdate/keywords.txt @@ -1,19 +1,19 @@ ####################################### -# Syntax Coloring Map For ESP8266httpUpdate +# Syntax Coloring Map For HTTPUpdate ####################################### ####################################### # Library (KEYWORD3) ####################################### -ESP8266httpUpdate KEYWORD3 RESERVED_WORD +ESP32httpUpdate KEYWORD3 RESERVED_WORD ####################################### # Datatypes (KEYWORD1) ####################################### HTTPUpdateResult KEYWORD1 DATA_TYPE -ESPhttpUpdate KEYWORD1 DATA_TYPE +httpUpdate KEYWORD1 DATA_TYPE ####################################### # Methods and Functions (KEYWORD2) diff --git a/libraries/HTTPUpdate/src/HTTPUpdate.cpp b/libraries/HTTPUpdate/src/HTTPUpdate.cpp index d5c65f20..9d1c7822 100644 --- a/libraries/HTTPUpdate/src/HTTPUpdate.cpp +++ b/libraries/HTTPUpdate/src/HTTPUpdate.cpp @@ -284,6 +284,10 @@ HTTPUpdateResult HTTPUpdate::handleUpdate(HTTPClient& http, const String& curren _lastError = HTTP_UE_TOO_LESS_SPACE; ret = HTTP_UPDATE_FAILED; } else { + // Warn main app we're starting up... + if (_cbStart) { + _cbStart(); + } WiFiClient * tcp = http.getStreamPtr(); @@ -338,6 +342,10 @@ HTTPUpdateResult HTTPUpdate::handleUpdate(HTTPClient& http, const String& curren ret = HTTP_UPDATE_OK; log_d("Update ok\n"); http.end(); + // Warn main app we're all done + if (_cbEnd) { + _cbEnd(); + } if(_rebootOnUpdate && !spiffs) { ESP.restart(); @@ -389,6 +397,10 @@ bool HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command) StreamString error; + if (_cbProgress) { + Update.onProgress(_cbProgress); + } + if(!Update.begin(size, command, _ledPin, _ledOn)) { _lastError = Update.getError(); Update.printError(error); @@ -397,6 +409,10 @@ bool HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command) return false; } + if (_cbProgress) { + _cbProgress(0, size); + } + if(md5.length()) { if(!Update.setMD5(md5.c_str())) { _lastError = HTTP_UE_SERVER_FAULTY_MD5; @@ -415,6 +431,10 @@ bool HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command) return false; } + if (_cbProgress) { + _cbProgress(size, size); + } + if(!Update.end()) { _lastError = Update.getError(); Update.printError(error); diff --git a/libraries/HTTPUpdate/src/HTTPUpdate.h b/libraries/HTTPUpdate/src/HTTPUpdate.h index af404e71..ca287399 100644 --- a/libraries/HTTPUpdate/src/HTTPUpdate.h +++ b/libraries/HTTPUpdate/src/HTTPUpdate.h @@ -52,6 +52,11 @@ enum HTTPUpdateResult { typedef HTTPUpdateResult t_httpUpdate_return; // backward compatibility +using HTTPUpdateStartCB = std::function; +using HTTPUpdateEndCB = std::function; +using HTTPUpdateErrorCB = std::function; +using HTTPUpdateProgressCB = std::function; + class HTTPUpdate { public: @@ -91,6 +96,12 @@ public: t_httpUpdate_return updateSpiffs(HTTPClient &httpClient, const String ¤tVersion = ""); + // Notification callbacks + void onStart(HTTPUpdateStartCB cbOnStart) { _cbStart = cbOnStart; } + void onEnd(HTTPUpdateEndCB cbOnEnd) { _cbEnd = cbOnEnd; } + void onError(HTTPUpdateErrorCB cbOnError) { _cbError = cbOnError; } + void onProgress(HTTPUpdateProgressCB cbOnProgress) { _cbProgress = cbOnProgress; } + int getLastError(void); String getLastErrorString(void); @@ -98,12 +109,25 @@ protected: t_httpUpdate_return handleUpdate(HTTPClient& http, const String& currentVersion, bool spiffs = false); bool runUpdate(Stream& in, uint32_t size, String md5, int command = U_FLASH); + // Set the error and potentially use a CB to notify the application + void _setLastError(int err) { + _lastError = err; + if (_cbError) { + _cbError(err); + } + } int _lastError; bool _rebootOnUpdate = true; private: int _httpClientTimeout; followRedirects_t _followRedirects; + // Callbacks + HTTPUpdateStartCB _cbStart; + HTTPUpdateEndCB _cbEnd; + HTTPUpdateErrorCB _cbError; + HTTPUpdateProgressCB _cbProgress; + int _ledPin; uint8_t _ledOn; };