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 ---- */