Firmware: OTA client, dual-board build (devkit/XIAO), version reporting, XIAO fixes
Build and push server image / build-and-push (push) Successful in 36s

- version.txt + esp_app_desc_t version reporting (X-Frame-Version header);
  new ota_update.c checks the server's advertised version against the
  running one and streams+applies an update via esp_https_ota, gated by
  bootloader rollback (marks the image valid only after a full successful
  cycle, so a bad update can't brick a wall-mounted frame).
- Dual-OTA partition tables: partitions.csv (8MB dev board, 2MB slots) and
  new partitions_xiao.csv (4MB XIAO, 1.875MB slots -- the dev board's
  table doesn't fit the XIAO's flash). New build_for_board.sh gives each
  board its own build dir + generated sdkconfig via SDKCONFIG_DEFAULTS
  layering, so switching boards never clobbers the other's config.
- fetch_photo_info()/fetch_face_labels() were using the short
  reachability-check timeout even though the manage-menu path can be the
  first (cold, TLS-handshake-paying) request of a wake cycle -- switched
  to the longer fetch timeout to stop spurious ESP_ERR_HTTP_CONNECT
  failures.
- XIAO: the RF switch that selects onboard vs. external antenna
  (GPIO3/14) isn't initialized by plain ESP-IDF the way Seeed's Arduino
  package does it, leaving WiFi unable to reliably reach the antenna at
  all -- new board_antenna.c powers the switch and selects the onboard
  antenna, gated behind FRAME_XIAO_ANTENNA_INIT (on by default in
  sdkconfig.xiao). Also remaps the EPD DC/RST/BUSY pins, since the dev
  board's defaults (GPIO9/10/11) aren't physically exposed on the XIAO.
This commit is contained in:
2026-07-20 22:24:15 -04:00
parent f7eaadcbed
commit a3ab6c5f13
17 changed files with 402 additions and 15 deletions
+19
View File
@@ -0,0 +1,19 @@
#pragma once
#include "wifi_provisioning.h"
/**
* If server_version is non-empty and differs from the running firmware's
* embedded version (esp_app_desc), streams the server's uploaded image
* (GET /frame/firmware) into the idle OTA slot via esp_https_ota and
* restarts into it -- so this only returns when there's nothing to do or
* the update failed (logged, retried on a later wake). Plain string
* inequality, deliberately: uploading an older image downgrades, which
* is a feature.
*
* Rollback safety is handled elsewhere: the freshly-booted image is
* marked valid in frame_client_run() only after a full successful
* fetch/display cycle (CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE) -- until
* then, any reboot reverts to the previous slot.
*/
void ota_update_if_available(const frame_config_t *cfg, const char *server_version);