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 <jayanta.gogoi525@gmail.com>
This commit is contained in:
Jayantajit Gogoi 2021-07-19 16:58:17 +05:30 committed by GitHub
parent f64ca2e084
commit db4e7667af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 3 deletions

View File

@ -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() { void loop() {
// wait for WiFi connection // wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) { 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 // 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.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"); t_httpUpdate_return ret = httpUpdate.update(client, "http://server/file.bin");
// Or: // Or:
//t_httpUpdate_return ret = httpUpdate.update(client, "server", 80, "/file.bin"); //t_httpUpdate_return ret = httpUpdate.update(client, "server", 80, "/file.bin");

View File

@ -1,19 +1,19 @@
####################################### #######################################
# Syntax Coloring Map For ESP8266httpUpdate # Syntax Coloring Map For HTTPUpdate
####################################### #######################################
####################################### #######################################
# Library (KEYWORD3) # Library (KEYWORD3)
####################################### #######################################
ESP8266httpUpdate KEYWORD3 RESERVED_WORD ESP32httpUpdate KEYWORD3 RESERVED_WORD
####################################### #######################################
# Datatypes (KEYWORD1) # Datatypes (KEYWORD1)
####################################### #######################################
HTTPUpdateResult KEYWORD1 DATA_TYPE HTTPUpdateResult KEYWORD1 DATA_TYPE
ESPhttpUpdate KEYWORD1 DATA_TYPE httpUpdate KEYWORD1 DATA_TYPE
####################################### #######################################
# Methods and Functions (KEYWORD2) # Methods and Functions (KEYWORD2)

View File

@ -284,6 +284,10 @@ HTTPUpdateResult HTTPUpdate::handleUpdate(HTTPClient& http, const String& curren
_lastError = HTTP_UE_TOO_LESS_SPACE; _lastError = HTTP_UE_TOO_LESS_SPACE;
ret = HTTP_UPDATE_FAILED; ret = HTTP_UPDATE_FAILED;
} else { } else {
// Warn main app we're starting up...
if (_cbStart) {
_cbStart();
}
WiFiClient * tcp = http.getStreamPtr(); WiFiClient * tcp = http.getStreamPtr();
@ -338,6 +342,10 @@ HTTPUpdateResult HTTPUpdate::handleUpdate(HTTPClient& http, const String& curren
ret = HTTP_UPDATE_OK; ret = HTTP_UPDATE_OK;
log_d("Update ok\n"); log_d("Update ok\n");
http.end(); http.end();
// Warn main app we're all done
if (_cbEnd) {
_cbEnd();
}
if(_rebootOnUpdate && !spiffs) { if(_rebootOnUpdate && !spiffs) {
ESP.restart(); ESP.restart();
@ -389,6 +397,10 @@ bool HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command)
StreamString error; StreamString error;
if (_cbProgress) {
Update.onProgress(_cbProgress);
}
if(!Update.begin(size, command, _ledPin, _ledOn)) { if(!Update.begin(size, command, _ledPin, _ledOn)) {
_lastError = Update.getError(); _lastError = Update.getError();
Update.printError(error); Update.printError(error);
@ -397,6 +409,10 @@ bool HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command)
return false; return false;
} }
if (_cbProgress) {
_cbProgress(0, size);
}
if(md5.length()) { if(md5.length()) {
if(!Update.setMD5(md5.c_str())) { if(!Update.setMD5(md5.c_str())) {
_lastError = HTTP_UE_SERVER_FAULTY_MD5; _lastError = HTTP_UE_SERVER_FAULTY_MD5;
@ -415,6 +431,10 @@ bool HTTPUpdate::runUpdate(Stream& in, uint32_t size, String md5, int command)
return false; return false;
} }
if (_cbProgress) {
_cbProgress(size, size);
}
if(!Update.end()) { if(!Update.end()) {
_lastError = Update.getError(); _lastError = Update.getError();
Update.printError(error); Update.printError(error);

View File

@ -52,6 +52,11 @@ enum HTTPUpdateResult {
typedef HTTPUpdateResult t_httpUpdate_return; // backward compatibility typedef HTTPUpdateResult t_httpUpdate_return; // backward compatibility
using HTTPUpdateStartCB = std::function<void()>;
using HTTPUpdateEndCB = std::function<void()>;
using HTTPUpdateErrorCB = std::function<void(int)>;
using HTTPUpdateProgressCB = std::function<void(int, int)>;
class HTTPUpdate class HTTPUpdate
{ {
public: public:
@ -91,6 +96,12 @@ public:
t_httpUpdate_return updateSpiffs(HTTPClient &httpClient, const String &currentVersion = ""); t_httpUpdate_return updateSpiffs(HTTPClient &httpClient, const String &currentVersion = "");
// 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); int getLastError(void);
String getLastErrorString(void); String getLastErrorString(void);
@ -98,12 +109,25 @@ protected:
t_httpUpdate_return handleUpdate(HTTPClient& http, const String& currentVersion, bool spiffs = false); 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); 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; int _lastError;
bool _rebootOnUpdate = true; bool _rebootOnUpdate = true;
private: private:
int _httpClientTimeout; int _httpClientTimeout;
followRedirects_t _followRedirects; followRedirects_t _followRedirects;
// Callbacks
HTTPUpdateStartCB _cbStart;
HTTPUpdateEndCB _cbEnd;
HTTPUpdateErrorCB _cbError;
HTTPUpdateProgressCB _cbProgress;
int _ledPin; int _ledPin;
uint8_t _ledOn; uint8_t _ledOn;
}; };