mirror of
https://github.com/ruvnet/RuView
synced 2026-07-26 18:01:48 +00:00
7994af8221
Phase 6 of #513: C-side wiring for the on-device temporal head. Builds cleanly with feature OFF (default); 8MB binary delta is +96 bytes vs v0.6.4-esp32 — that's the no-op shim path. Feature ON depends on the Rust component (Phase 5, currently blocked by upstream esp-rs nightly). Files: - main/temporal_task.{c,h} — owns the FreeRTOS task lifecycle. Per ADR-095 §3.3 the task has its own 16 KB stack pinned to Core 1 and is fed via a 32-deep FreeRTOS queue. With feature OFF the .c file collapses to three ESP_ERR_NOT_SUPPORTED stubs so callers don't need #ifdefs at every call site. - main/temporal_task.h — defines rv_temporal_pkt_t (40 bytes, magic 0xC5110007 — next free in the existing 0xC5110001..0006 family) and the task lifecycle API. Build-time _Static_assert pins the wire format. - main/Kconfig.projbuild — new menu "On-device temporal head (ADR-095, #513)" with CONFIG_CSI_TEMPORAL_HEAD_ENABLED (default n) plus four runtime-tuneable knobs: TEMPORAL_INPUT_DIM (16), TEMPORAL_WINDOW_LEN (256), TEMPORAL_N_CLASSES (4), and TEMPORAL_CLASSIFY_PERIOD_MS (1000). - main/CMakeLists.txt — adds temporal_task.c to SRCS unconditionally (the .c file feature-gates internally), and adds ruv_temporal to REQUIRES only when the feature is enabled so default builds don't pull in the Rust component. - main/adaptive_controller.c — fast_loop_cb now extracts the 9 feature floats from the pkt it just built and pushes them into temporal_task_push_frame after the existing stream_sender_send. Non-blocking; queue-full drops are coalesced and logged 1/sec. - main/main.c — temporal_task_start() called right after adaptive_controller_init(). Wrapped in #ifdef so feature-off builds don't reference the (no-op-anyway) function. - components/ruv_temporal/CMakeLists.txt — restructured. Top-level Kconfig guard registers an empty component when the feature is off (avoids running cargo without a working toolchain). add_custom_command moved AFTER idf_component_register so it doesn't fire in script mode (required by ESP-IDF v5.4). Validation: - Firmware builds clean with default config (feature OFF) on ESP-IDF v5.4 / esp32s3 target. Binary 1062 KiB / 2 MiB partition, 48 % free. - Static assertion catches wire-format drift (rv_temporal_pkt_t size). - Host-side `cargo test -p wifi-densepose-temporal` still 5/5 from the earlier commit (no regression, this commit only touches firmware/). Phase 7 (flash to COM8 + soak) deferred this iteration — board is currently not enumerating on COM8; will pick up next iteration when the ESP32 is reattached. Co-Authored-By: claude-flow <ruv@ruv.net>
41 lines
1.2 KiB
CMake
41 lines
1.2 KiB
CMake
set(SRCS
|
|
"main.c" "csi_collector.c" "stream_sender.c" "nvs_config.c"
|
|
"edge_processing.c" "ota_update.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-095 / #513 — on-device temporal head (no-op shims when CONFIG_CSI_TEMPORAL_HEAD_ENABLED off)
|
|
"temporal_task.c"
|
|
)
|
|
|
|
set(REQUIRES "")
|
|
|
|
# ADR-095: link the Rust ruv_temporal staticlib only when the feature is on,
|
|
# so the default firmware build doesn't depend on the (currently blocked)
|
|
# esp Rust toolchain.
|
|
if(CONFIG_CSI_TEMPORAL_HEAD_ENABLED)
|
|
list(APPEND REQUIRES ruv_temporal)
|
|
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")
|
|
set(REQUIRES esp_lcd esp_lcd_touch lvgl)
|
|
endif()
|
|
|
|
idf_component_register(
|
|
SRCS ${SRCS}
|
|
INCLUDE_DIRS "."
|
|
REQUIRES ${REQUIRES}
|
|
)
|