mirror of
https://github.com/ruvnet/RuView
synced 2026-07-24 17:43:20 +00:00
88be283ab0
After 5 systematic experiments confirmed the 802.15.4 RX path is
unfixable from user code in this IDF v5.4 + C6 combination (D1), add a
parallel sync transport over ESP-NOW. Same TS_BEACON protocol, same
public API (c6_sync_espnow_get_epoch_us / is_valid / is_leader), but
runs on the WiFi MAC layer that ESP-IDF fully supports across every
ESP32 family.
The 802.15.4 code stays in source for when the IDF driver is fixed.
ESP-NOW is the working primary today.
Empirical (single-board COM9 — other 3 boards dropped off USB during
the experiment):
- c6_sync_espnow_init() succeeds: "init done local_id=… leader=
yes(candidate) period=100ms"
- TX path 100% reliable: tx#101 fail=0 over ~15s at 100ms cadence
- RX awaiting cross-board test once USB-enumeration is restored
Trade vs. 802.15.4 design:
- Loses: "frees WiFi airtime for CSI" property
- Gains: known-working RX path, cross-target (S3 and C6 both)
- Same API surface — consumers swap transports without code change
Files:
- main/c6_sync_espnow.{h,c} — new module, ~210 lines
- main/CMakeLists.txt — add to SRCS (always built, used on any target)
- main/main.c — init after WiFi STA up, skip on QEMU mock
- test/capture-3board-experiment.py — surface c6_espnow log lines
- docs/WITNESS-LOG-110.md — new §D-workaround documenting the pivot
Ref: ruvnet/RuView#762 / D1 known-issue / draft PR #764
Co-Authored-By: claude-flow <ruv@ruv.net>
68 lines
1.8 KiB
CMake
68 lines
1.8 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-110 — ESP32-C6 capability modules (no-op stubs on other targets via #ifdef)
|
|
"c6_twt.c"
|
|
"c6_timesync.c"
|
|
"c6_lp_core.c"
|
|
# ADR-110 D1 workaround — ESP-NOW cross-node sync (works on S3+C6)
|
|
"c6_sync_espnow.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
|
|
esp_pm
|
|
esp_driver_uart
|
|
esp_driver_gpio
|
|
esp_driver_spi
|
|
esp_driver_i2c
|
|
driver
|
|
lwip
|
|
mbedtls
|
|
)
|
|
|
|
# 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()
|
|
|
|
# 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}
|
|
)
|