From b41681e0792b86246f80067a70c58a8b33b8fd9f Mon Sep 17 00:00:00 2001 From: ruv Date: Sat, 14 Mar 2026 13:33:07 -0400 Subject: [PATCH] fix(firmware): make QEMU mock CSI boot successfully on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tested on Windows with Espressif QEMU 9.0.0 — firmware boots, generates mock CSI frames, runs edge processing. 14/16 validation checks pass. Fixes: - Guard wifi_init_sta() with CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT (QEMU has no RF PHY, WiFi init stalled at calibration) - Guard stream_sender_init_with() (UDP needs network stack) - Guard ota_update_init_ex() (HTTP server needs network) - Guard display_task_start() with CONFIG_DISPLAY_ENABLE (no I2C hardware in QEMU) - Add mock_csi_init() call in main.c when CONFIG_CSI_MOCK_ENABLED - Add #include "sdkconfig.h" to mock_csi.c (ESP-IDF not auto-including) - Suppress unused s_bad_mac warning Co-Authored-By: claude-flow --- firmware/esp32-csi-node/main/main.c | 32 +++++++++++++++++++++++-- firmware/esp32-csi-node/main/mock_csi.c | 4 +++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/firmware/esp32-csi-node/main/main.c b/firmware/esp32-csi-node/main/main.c index 800d4251..2945d79f 100644 --- a/firmware/esp32-csi-node/main/main.c +++ b/firmware/esp32-csi-node/main/main.c @@ -27,6 +27,9 @@ #include "wasm_runtime.h" #include "wasm_upload.h" #include "display_task.h" +#ifdef CONFIG_CSI_MOCK_ENABLED +#include "mock_csi.h" +#endif #include "esp_timer.h" @@ -134,17 +137,35 @@ void app_main(void) ESP_LOGI(TAG, "ESP32-S3 CSI Node (ADR-018) — Node ID: %d", g_nvs_config.node_id); - /* Initialize WiFi STA */ + /* Initialize WiFi STA (skip entirely under QEMU mock — no RF hardware) */ +#ifndef CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT wifi_init_sta(); +#else + ESP_LOGI(TAG, "Mock CSI mode: skipping WiFi init (CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT)"); +#endif /* Initialize UDP sender with runtime target */ +#ifdef CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT + ESP_LOGI(TAG, "Mock CSI mode: skipping UDP sender init (no network)"); +#else if (stream_sender_init_with(g_nvs_config.target_ip, g_nvs_config.target_port) != 0) { ESP_LOGE(TAG, "Failed to initialize UDP sender"); return; } +#endif /* Initialize CSI collection */ +#ifdef CONFIG_CSI_MOCK_ENABLED + /* ADR-061: Start mock CSI generator (replaces real WiFi CSI in QEMU) */ + esp_err_t mock_ret = mock_csi_init(CONFIG_CSI_MOCK_SCENARIO); + if (mock_ret != ESP_OK) { + ESP_LOGE(TAG, "Mock CSI init failed: %s", esp_err_to_name(mock_ret)); + } else { + ESP_LOGI(TAG, "Mock CSI active (scenario=%d)", CONFIG_CSI_MOCK_SCENARIO); + } +#else csi_collector_init(); +#endif /* ADR-039: Initialize edge processing pipeline. */ edge_config_t edge_cfg = { @@ -162,12 +183,17 @@ void app_main(void) esp_err_to_name(edge_ret)); } - /* Initialize OTA update HTTP server. */ + /* Initialize OTA update HTTP server (requires network). */ httpd_handle_t ota_server = NULL; +#ifndef CONFIG_CSI_MOCK_SKIP_WIFI_CONNECT esp_err_t ota_ret = ota_update_init_ex(&ota_server); if (ota_ret != ESP_OK) { ESP_LOGW(TAG, "OTA server init failed: %s", esp_err_to_name(ota_ret)); } +#else + esp_err_t ota_ret = ESP_ERR_NOT_SUPPORTED; + ESP_LOGI(TAG, "Mock CSI mode: skipping OTA server (no network)"); +#endif /* ADR-040: Initialize WASM programmable sensing runtime. */ esp_err_t wasm_ret = wasm_runtime_init(); @@ -205,10 +231,12 @@ void app_main(void) power_mgmt_init(g_nvs_config.power_duty); /* ADR-045: Start AMOLED display task (gracefully skips if no display). */ +#ifdef CONFIG_DISPLAY_ENABLE esp_err_t disp_ret = display_task_start(); if (disp_ret != ESP_OK) { ESP_LOGW(TAG, "Display init returned: %s", esp_err_to_name(disp_ret)); } +#endif ESP_LOGI(TAG, "CSI streaming active → %s:%d (edge_tier=%u, OTA=%s, WASM=%s)", g_nvs_config.target_ip, g_nvs_config.target_port, diff --git a/firmware/esp32-csi-node/main/mock_csi.c b/firmware/esp32-csi-node/main/mock_csi.c index b2a95fce..5cd1d34f 100644 --- a/firmware/esp32-csi-node/main/mock_csi.c +++ b/firmware/esp32-csi-node/main/mock_csi.c @@ -15,6 +15,8 @@ * to nothing on production builds. */ +#include "sdkconfig.h" + #ifdef CONFIG_CSI_MOCK_ENABLED #include "mock_csi.h" @@ -94,7 +96,7 @@ static const uint8_t s_sweep_channels[] = {1, 6, 11, 36}; static const uint8_t s_good_mac[6] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; /** "Wrong" MAC that should be rejected by the filter. */ -static const uint8_t s_bad_mac[6] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; +static const uint8_t s_bad_mac[6] __attribute__((unused)) = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; /* ---- LFSR pseudo-random number generator ---- */