#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 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; }