2022-02-18 20:06:25 +01:00
|
|
|
|
#include "UpgradeFirm.h"
|
|
|
|
|
|
|
|
|
|
|
|
updateFirm update;
|
|
|
|
|
|
|
2023-10-06 01:26:16 +02:00
|
|
|
|
void upgrade_firmware(int type, String path) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
putUserDataToRam();
|
2023-10-11 01:46:12 +02:00
|
|
|
|
// сбросим файл статуса последнего обновления
|
|
|
|
|
|
writeFile("ota.json", "{}");
|
2022-02-18 20:06:25 +01:00
|
|
|
|
|
|
|
|
|
|
// only build
|
|
|
|
|
|
if (type == 1) {
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (upgradeBuild(path)) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
saveUserDataToFlash();
|
|
|
|
|
|
restartEsp();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// only littlefs
|
|
|
|
|
|
else if (type == 2) {
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (upgradeFS(path)) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
saveUserDataToFlash();
|
|
|
|
|
|
restartEsp();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// littlefs and build
|
|
|
|
|
|
else if (type == 3) {
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (upgradeFS(path)) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
saveUserDataToFlash();
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (upgradeBuild(path)) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
restartEsp();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-06 01:26:16 +02:00
|
|
|
|
bool upgradeFS(String path) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
bool ret = false;
|
|
|
|
|
|
WiFiClient wifiClient;
|
2023-10-06 01:26:16 +02:00
|
|
|
|
SerialPrint("!!!", F("Update"), "Start upgrade FS... " + path);
|
2023-10-11 01:46:12 +02:00
|
|
|
|
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (path == "") {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
SerialPrint("E", F("Update"), F("FS Path error"));
|
2023-10-11 01:46:12 +02:00
|
|
|
|
saveUpdeteStatus("fs", PATH_ERROR);
|
2022-02-18 20:06:25 +01:00
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
#ifdef ESP8266
|
|
|
|
|
|
ESPhttpUpdate.rebootOnUpdate(false);
|
2023-10-06 01:26:16 +02:00
|
|
|
|
t_httpUpdate_return retFS = ESPhttpUpdate.updateFS(wifiClient, path + "/littlefs.bin");
|
2022-02-18 20:06:25 +01:00
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef ESP32
|
|
|
|
|
|
httpUpdate.rebootOnUpdate(false);
|
2023-10-06 01:26:16 +02:00
|
|
|
|
// обновляем little fs с помощью метода обновления spiffs!!!!
|
|
|
|
|
|
HTTPUpdateResult retFS = httpUpdate.updateSpiffs(wifiClient, path + "/littlefs.bin");
|
2022-02-18 20:06:25 +01:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2023-06-19 18:04:00 +02:00
|
|
|
|
// если FS обновилась успешно
|
2022-02-18 20:06:25 +01:00
|
|
|
|
if (retFS == HTTP_UPDATE_OK) {
|
2022-02-18 22:26:12 +01:00
|
|
|
|
SerialPrint("!!!", F("Update"), F("FS upgrade done!"));
|
2023-10-11 01:46:12 +02:00
|
|
|
|
saveUpdeteStatus("fs", UPDATE_COMPLETED);
|
2022-02-18 20:06:25 +01:00
|
|
|
|
ret = true;
|
2023-06-19 18:04:00 +02:00
|
|
|
|
} else {
|
2023-10-11 01:46:12 +02:00
|
|
|
|
saveUpdeteStatus("fs", UPDATE_FAILED);
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (retFS == HTTP_UPDATE_FAILED) {
|
|
|
|
|
|
SerialPrint("E", F("Update"), "HTTP_UPDATE_FAILED");
|
|
|
|
|
|
} else if (retFS == HTTP_UPDATE_NO_UPDATES) {
|
|
|
|
|
|
SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES");
|
|
|
|
|
|
}
|
2022-02-18 20:06:25 +01:00
|
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-06 01:26:16 +02:00
|
|
|
|
bool upgradeBuild(String path) {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
bool ret = false;
|
|
|
|
|
|
WiFiClient wifiClient;
|
2023-10-06 01:26:16 +02:00
|
|
|
|
SerialPrint("!!!", F("Update"), "Start upgrade BUILD... " + path);
|
2023-10-11 01:46:12 +02:00
|
|
|
|
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (path == "") {
|
2022-02-18 20:06:25 +01:00
|
|
|
|
SerialPrint("E", F("Update"), F("Build Path error"));
|
2023-10-11 01:46:12 +02:00
|
|
|
|
saveUpdeteStatus("build", PATH_ERROR);
|
2022-02-18 20:06:25 +01:00
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
2023-09-09 12:19:22 +03:00
|
|
|
|
#if defined(esp8266_4mb) || defined(esp8266_16mb) || defined(esp8266_1mb) || defined(esp8266_1mb_ota) || defined(esp8266_2mb) || defined(esp8266_2mb_ota)
|
2022-02-18 20:06:25 +01:00
|
|
|
|
ESPhttpUpdate.rebootOnUpdate(false);
|
2023-10-06 01:26:16 +02:00
|
|
|
|
t_httpUpdate_return retBuild = ESPhttpUpdate.update(wifiClient, path + "/firmware.bin");
|
2022-02-18 20:06:25 +01:00
|
|
|
|
#endif
|
2023-05-27 02:02:33 +03:00
|
|
|
|
#ifdef ESP32
|
2022-02-18 20:06:25 +01:00
|
|
|
|
httpUpdate.rebootOnUpdate(false);
|
2023-10-06 01:26:16 +02:00
|
|
|
|
HTTPUpdateResult retBuild = httpUpdate.update(wifiClient, path + "/firmware.bin");
|
2022-02-18 20:06:25 +01:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2023-06-19 18:04:00 +02:00
|
|
|
|
// если BUILD обновился успешно
|
2022-02-18 20:06:25 +01:00
|
|
|
|
if (retBuild == HTTP_UPDATE_OK) {
|
2022-02-18 22:26:12 +01:00
|
|
|
|
SerialPrint("!!!", F("Update"), F("BUILD upgrade done!"));
|
2023-10-11 01:46:12 +02:00
|
|
|
|
saveUpdeteStatus("build", UPDATE_COMPLETED);
|
2022-02-18 20:06:25 +01:00
|
|
|
|
ret = true;
|
2023-06-19 18:04:00 +02:00
|
|
|
|
} else {
|
2023-10-11 01:46:12 +02:00
|
|
|
|
saveUpdeteStatus("build", UPDATE_FAILED);
|
2023-10-06 01:26:16 +02:00
|
|
|
|
if (retBuild == HTTP_UPDATE_FAILED) {
|
|
|
|
|
|
SerialPrint("E", F("Update"), "HTTP_UPDATE_FAILED");
|
|
|
|
|
|
} else if (retBuild == HTTP_UPDATE_NO_UPDATES) {
|
|
|
|
|
|
SerialPrint("E", F("Update"), "HTTP_UPDATE_NO_UPDATES");
|
|
|
|
|
|
}
|
2022-02-18 20:06:25 +01:00
|
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void restartEsp() {
|
|
|
|
|
|
Serial.println(F("Restart ESP...."));
|
|
|
|
|
|
delay(1000);
|
|
|
|
|
|
ESP.restart();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-06 01:26:16 +02:00
|
|
|
|
// теперь путь к обнавленю прошивки мы получаем из веб интерфейса
|
|
|
|
|
|
// const String getBinPath(String file) {
|
|
|
|
|
|
// String path = "error";
|
|
|
|
|
|
// int targetVersion = 0;
|
|
|
|
|
|
// String serverip;
|
|
|
|
|
|
// if (jsonRead(errorsHeapJson, F("chver"), targetVersion)) {
|
|
|
|
|
|
// if (targetVersion >= 400) {
|
|
|
|
|
|
// if (jsonRead(settingsFlashJson, F("serverip"), serverip)) {
|
|
|
|
|
|
// if (serverip != "") {
|
|
|
|
|
|
// path = jsonReadStr(settingsFlashJson, F("serverip")) + "/iotm/" + String(FIRMWARE_NAME) + "/" + String(targetVersion) + "/" + file;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// SerialPrint("i", F("Update"), "path: " + path);
|
|
|
|
|
|
// return path;
|
|
|
|
|
|
// }
|
2022-02-18 20:06:25 +01:00
|
|
|
|
|
2023-10-25 00:47:46 +02:00
|
|
|
|
// https://t.me/IoTmanager/128814/164752 - убрал ограничение
|
2022-02-18 20:06:25 +01:00
|
|
|
|
void putUserDataToRam() {
|
2023-10-25 00:47:46 +02:00
|
|
|
|
update.configJson = readFile("config.json", 4096 * 4);
|
|
|
|
|
|
update.settingsFlashJson = readFile("settings.json", 4096 * 4);
|
|
|
|
|
|
update.layoutJson = readFile("layout.json", 4096 * 4);
|
|
|
|
|
|
update.scenarioTxt = readFile("scenario.txt", 4096 * 4);
|
2023-10-11 01:46:12 +02:00
|
|
|
|
// update.chartsData = createDataBaseSting();
|
2022-02-18 20:06:25 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void saveUserDataToFlash() {
|
|
|
|
|
|
writeFile("/config.json", update.configJson);
|
|
|
|
|
|
writeFile("/settings.json", update.settingsFlashJson);
|
2022-02-18 23:04:27 +01:00
|
|
|
|
writeFile("/layout.json", update.layoutJson);
|
2022-09-29 22:48:33 +02:00
|
|
|
|
writeFile("/scenario.txt", update.scenarioTxt);
|
2023-10-11 01:46:12 +02:00
|
|
|
|
// writeDataBaseSting(update.chartsData);
|
2022-02-19 23:42:24 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-11 01:46:12 +02:00
|
|
|
|
void saveUpdeteStatus(String key, int val) {
|
|
|
|
|
|
const String path = "ota.json";
|
|
|
|
|
|
String json = readFile(path, 1024);
|
|
|
|
|
|
if (json == "failed") json = "{}";
|
|
|
|
|
|
jsonWriteInt_(json, key, val);
|
|
|
|
|
|
writeFile(path, json);
|
2022-02-18 20:06:25 +01:00
|
|
|
|
}
|