Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
3.2 KiB

#include "AutoOTA.h"
#include <functional>
#include <ArduinoJson.h>
#include <ESP8266httpUpdate.h>
void AutoOTAClass::setServer(String server) {
_server = server;
}
void AutoOTAClass::setModel(String model) {
_model = model;
}
void AutoOTAClass::setVersion(String version) {
_version = version;
}
void AutoOTAClass::onMessage(TMessageFunction fn) {
_callback = fn;
}
String AutoOTAClass::getNewVersion() {
return _newVersion;
}
String AutoOTAClass::getNewFirmware() {
return _newFirmware;
}
String AutoOTAClass::getNewFileSystem() {
return _newFileSystem;
}
int AutoOTAClass::getErrorNumber() {
return _errorNumber;
}
String AutoOTAClass::getErrorString() {
return _errorString;
}
String AutoOTAClass::_getPayload() {
HTTPClient http;
char url[100];
String payload = "";
_callback(AUTO_OTA_START);
sprintf(url, "%s/%s/%s", _server.c_str(), _model.c_str(), _version.c_str());
http.begin(url);
int httpCode = http.GET();
if (httpCode > 0) payload = http.getString();
http.end();
return payload;
}
bool AutoOTAClass::_checkUpdates() {
String payload = _getPayload();
if (payload.length() == 0) {
_callback(AUTO_OTA_NO_RESPONSE_ERROR);
return false;
}
StaticJsonBuffer<500> jsonBuffer;
JsonObject& response = jsonBuffer.parseObject(payload);
if (!response.success()) {
_callback(AUTO_OTA_PARSE_ERROR);
return false;
}
if (response.size() == 0) {
_callback(AUTO_OTA_UPTODATE);
return false;
}
_newVersion = response.get<String>("version");
_newFileSystem = response.get<String>("spiffs");
_newFirmware = response.get<String>("firmware");
_callback(AUTO_OTA_UPDATING);
return true;
}
void AutoOTAClass::_doUpdate() {
char url[100];
bool error = false;
uint8_t updates = 0;
if (_newFileSystem.length() > 0) {
// Update SPIFFS
sprintf(url, "%s/%s", _server.c_str(), _newFileSystem.c_str());
t_httpUpdate_return ret = ESPhttpUpdate.updateSpiffs(url);
if (ret == HTTP_UPDATE_FAILED) {
error = true;
_errorNumber = ESPhttpUpdate.getLastError();
_errorString = ESPhttpUpdate.getLastErrorString();
_callback(AUTO_OTA_FILESYSTEM_UPDATE_ERROR);
} else if (ret == HTTP_UPDATE_OK) {
updates++;
_callback(AUTO_OTA_FILESYSTEM_UPDATED);
}
}
if (!error && (_newFirmware.length() > 0)) {
// Update binary
sprintf(url, "%s%s", _server.c_str(), _newFirmware.c_str());
t_httpUpdate_return ret = ESPhttpUpdate.update(url);
if (ret == HTTP_UPDATE_FAILED) {
error = true;
_errorNumber = ESPhttpUpdate.getLastError();
_errorString = ESPhttpUpdate.getLastErrorString();
_callback(AUTO_OTA_FIRMWARE_UPDATE_ERROR);
} else if (ret == HTTP_UPDATE_OK) {
updates++;
_callback(AUTO_OTA_FIRMWARE_UPDATED);
}
}
if (!error && (updates > 0)) {
_callback(AUTO_OTA_RESET);
ESP.restart();
}
}
void AutoOTAClass::handle() {
_callback(AUTO_OTA_START);
if (_checkUpdates()) _doUpdate();
_callback(AUTO_OTA_END);
}
AutoOTAClass AutoOTA;