76 lines
1.8 KiB
C++
76 lines
1.8 KiB
C++
#ifndef UNIT_TEST
|
|
#include <fetchOTA.h>
|
|
|
|
|
|
#include "Arduino.h"
|
|
#include <ArduinoJson.h>
|
|
#include <HTTPClient.h>
|
|
|
|
#include <vector>
|
|
|
|
|
|
OTA::OTA(String server_url, String currentVersion, String currentDeviceConfiguration) {
|
|
_serverUrl = server_url;
|
|
_currentVersion = parseVersion(currentVersion.c_str());
|
|
_current_device_configuration = currentDeviceConfiguration;
|
|
}
|
|
|
|
|
|
Firmware OTA::getLatestVersionOnServer() {
|
|
HTTPClient http;
|
|
http.begin(_serverUrl);
|
|
int httpCode = http.GET();
|
|
|
|
if (httpCode != 200) {
|
|
return createErrorResponse("HTTP GET request failed with code " + String(httpCode));
|
|
}
|
|
|
|
String payload = http.getString();
|
|
DynamicJsonDocument doc(4096);
|
|
DeserializationError error = deserializeJson(doc, payload);
|
|
|
|
if (error) {
|
|
return createErrorResponse("Failed to deserialize JSON");
|
|
}
|
|
|
|
if (!doc.containsKey("Configurations")) {
|
|
return createErrorResponse("JSON response does not contain a 'Configurations' key");
|
|
}
|
|
|
|
std::vector<Configuration> configs;
|
|
for (JsonObject config : doc["Configurations"].as<JsonArray>()) {
|
|
if (config.containsKey("Version") && config.containsKey("URL")) {
|
|
configs.push_back(Configuration{
|
|
parseVersion(config["Version"]),
|
|
config["URL"],
|
|
config["Board"],
|
|
config["Configuration"]
|
|
});
|
|
}
|
|
}
|
|
|
|
if (configs.empty()) {
|
|
return createErrorResponse("No valid configuration found in the JSON response");
|
|
}
|
|
|
|
Configuration latest = getLatestConfiguration(configs.data(), configs.size());
|
|
return Firmware{
|
|
latest.version,
|
|
latest.url,
|
|
true,
|
|
""
|
|
};
|
|
}
|
|
|
|
Firmware OTA::createErrorResponse(const String& errorMsg) {
|
|
return Firmware{
|
|
Version{0, 0, 0},
|
|
"",
|
|
false,
|
|
errorMsg
|
|
};
|
|
}
|
|
|
|
|
|
|
|
#endif |