mirror of
https://github.com/ruvnet/RuView.git
synced 2026-10-19 05:10:13 -05:00
Rollback-enabled nodes (CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y) boot an
OTA'd image as PENDING_VERIFY, but nothing called
esp_ota_mark_app_valid_cancel_rollback(), so every OTA reverted at the next
reset, a second OTA was refused until then, and a bad image was never
deliberately rolled back.
- main/ota_health.{c,h}: at boot, if the running image is PENDING_VERIFY,
poll for STA got-IP and >=1 CSI frame accepted by the stream sender.
Confirm after CONFIG_OTA_HEALTH_MIN_UPTIME_S (30 s) once both are in;
roll back via esp_ota_mark_app_invalid_rollback_and_reboot() if they are
not in by CONFIG_OTA_HEALTH_TIMEOUT_S (120 s from boot). VALID, UNDEFINED,
NEW and no-otadata/factory images are left alone. The decision is a pure
header function, host-tested in test/test_ota_health.c (make host_tests).
- CONFIG_OTA_HEALTH_FORCE_FAIL (test only) rolls back where it would have
confirmed, for proving rollback on hardware.
- GET /ota/status reports ota_state so durability is visible remotely.
- RUNBOOK: replace the nonexistent ota_rollback_boot_check() claim and
document the behaviour and the hardware check (2.1).
Hardware-verified on an ESP32-S3 (push, confirm, hard reset, forced
rollback) and an ESP32-C6 (push, confirm, hard reset); see ADR-379, next in
this series. Host tests: make host_tests passes, including run_ota_health.
Co-Authored-By: claude-flow <ruv@ruv.net>
96 lines
3.0 KiB
CMake
96 lines
3.0 KiB
CMake
set(SRCS
|
|
"main.c" "csi_collector.c" "node_log.c"
|
|
"thermal.c" "stream_sender.c" "nvs_config.c"
|
|
"serial_onboarding.c" "serial_onboarding_protocol.c"
|
|
"edge_processing.c" "ota_update.c" "ota_health.c" "power_mgmt.c"
|
|
"wasm_runtime.c" "wasm_upload.c" "rvf_parser.c"
|
|
"mmwave_sensor.c"
|
|
"swarm_bridge.c"
|
|
# ADR-081 — adaptive CSI mesh firmware kernel
|
|
"rv_radio_ops_esp32.c"
|
|
"rv_feature_state.c"
|
|
"rv_mesh.c"
|
|
"adaptive_controller.c"
|
|
# ADR-110 — ESP32-C6 capability modules (no-op stubs on other targets via #ifdef)
|
|
"c6_twt.c"
|
|
"c6_timesync.c"
|
|
"c6_lp_core.c"
|
|
"c6_antenna_select.c"
|
|
# ADR-110 D1 workaround — ESP-NOW cross-node sync (works on S3+C6)
|
|
"c6_sync_espnow.c"
|
|
# ADR-110 B1/B2 unblock — soft-AP HE/TWT (C6-only when enabled)
|
|
"c6_softap_he.c"
|
|
)
|
|
|
|
# ESP-IDF v6+: headers must resolve via explicit REQUIRES (no implicit deps).
|
|
set(REQUIRES
|
|
esp_wifi
|
|
esp_netif
|
|
esp_event
|
|
nvs_flash
|
|
app_update
|
|
esp_http_server
|
|
esp_http_client
|
|
esp_app_format
|
|
esp_timer
|
|
fatfs # node_log.c: the storage FAT volume
|
|
wear_levelling # node_log.c: wl_mount behind that volume
|
|
espcoredump # coredump-to-flash readback
|
|
esp_pm
|
|
esp_driver_uart
|
|
esp_driver_gpio
|
|
esp_driver_spi
|
|
esp_driver_i2c
|
|
driver
|
|
lwip
|
|
mbedtls
|
|
efuse
|
|
led_strip
|
|
)
|
|
|
|
# ADR-110: C6-only components — pulled in when building for esp32c6.
|
|
# Note: CONFIG_* symbols are not available in main CMakeLists.txt evaluation —
|
|
# we use the IDF_TARGET variable that idf.py sets from sdkconfig.defaults / set-target.
|
|
if(IDF_TARGET STREQUAL "esp32c6")
|
|
list(APPEND REQUIRES ieee802154 ulp esp_hw_support)
|
|
endif()
|
|
|
|
# ESP-IDF 6 split the temperature sensor driver out of the legacy `driver`
|
|
# component. Keep the 5.4 lane working while declaring the v6 dependency.
|
|
if(IDF_VERSION_MAJOR GREATER_EQUAL 6)
|
|
list(APPEND REQUIRES esp_driver_tsens)
|
|
endif()
|
|
|
|
# ADR-061: Mock CSI generator for QEMU testing + ADR-081 mock radio binding
|
|
if(CONFIG_CSI_MOCK_ENABLED)
|
|
list(APPEND SRCS "mock_csi.c" "rv_radio_ops_mock.c")
|
|
endif()
|
|
|
|
# ADR-045: AMOLED display support (compile-time optional)
|
|
if(CONFIG_DISPLAY_ENABLE)
|
|
list(APPEND SRCS "display_hal.c" "display_ui.c" "display_task.c")
|
|
list(APPEND REQUIRES esp_lcd esp_lcd_touch lvgl)
|
|
endif()
|
|
|
|
if(CONFIG_WASM_ENABLE)
|
|
list(APPEND REQUIRES wasm3)
|
|
endif()
|
|
|
|
idf_component_register(
|
|
SRCS ${SRCS}
|
|
INCLUDE_DIRS "."
|
|
REQUIRES ${REQUIRES}
|
|
)
|
|
|
|
# ADR-110 P5 (full): embed the LP-core motion-gate program when enabled.
|
|
# `ulp_embed_binary` compiles lp_core/main.c with the RISC-V LP toolchain
|
|
# and links the resulting binary into the HP image, exposing shared symbols
|
|
# via the auto-generated `ulp_main.h` header.
|
|
if(IDF_TARGET STREQUAL "esp32c6" AND CONFIG_C6_LP_CORE_ENABLE)
|
|
set(ulp_app_name ulp_main)
|
|
set(ulp_sources "lp_core/main.c")
|
|
# Source files in the HP component that include the generated ulp_main.h
|
|
set(ulp_exp_dep_srcs "c6_lp_core.c")
|
|
ulp_embed_binary(${ulp_app_name} "${ulp_sources}" "${ulp_exp_dep_srcs}")
|
|
endif()
|