SolarEnergy/esp32_device/main/ota.c

76 lines
2.3 KiB
C

#include "esp_log.h"
#include "esp_partition.h"
#include "esp_ota_ops.h"
#include "esp_http_client.h"
#include "constants.h"
#include "ota.h"
#include "storage.h"
#include <string.h>
const char *TAG = "ota";
bool ota_perform_update(const char *version)
{
const esp_partition_t *configured = esp_ota_get_boot_partition();
const esp_partition_t *running = esp_ota_get_running_partition();
if (configured != running)
{
ESP_LOGW(TAG, "Configured OTA boot partition at offset 0x%08" PRIx32 ", but running from offset 0x%08" PRIx32,
configured->address, running->address);
ESP_LOGW(TAG, "(This can happen if either the OTA boot data or preferred boot image become corrupted somehow.)");
}
ESP_LOGI(TAG, "Running partition type %d subtype %d (offset 0x%08" PRIx32 ")",
running->type, running->subtype, running->address);
// Determine firmware download URL
char *update_url = calloc(256, 1);
assert(update_url != NULL);
assert(storage_get_secure_origin(update_url) > 0);
strcat(update_url, "/devices_api/ota/Wt32-Eth01/");
strcat(update_url, version);
ESP_LOGI(TAG, "Firmware URL: %s", update_url);
char *root_ca = calloc(1, ROOT_CA_MAX_BYTES);
assert(root_ca);
assert(storage_get_root_ca(root_ca) > 0);
esp_http_client_config_t config = {
.url = update_url,
.cert_pem = root_ca,
.timeout_ms = OTA_REC_TIMEOUT,
.keep_alive_enable = true,
};
esp_http_client_handle_t client = esp_http_client_init(&config);
if (client == NULL)
{
ESP_LOGE(TAG, "Failed to initialise HTTP connection");
free(update_url);
free(root_ca);
return false;
}
int err = esp_http_client_open(client, 0);
free(update_url);
free(root_ca);
if (err != ESP_OK)
{
ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
esp_http_client_cleanup(client);
return false;
}
esp_http_client_fetch_headers(client);
const esp_partition_t *update_partition = esp_ota_get_next_update_partition(NULL);
assert(update_partition != NULL);
ESP_LOGI(TAG, "Writing to partition subtype %d at offset 0x%" PRIx32,
update_partition->subtype, update_partition->address);
return false;
}