diff --git a/components/app_console/app_console.c b/components/app_console/app_console.c index ac3c1ee..1c77147 100644 --- a/components/app_console/app_console.c +++ b/components/app_console/app_console.c @@ -8,10 +8,14 @@ // Dependencies #include "wifi_controller.h" -#include "csi_manager.h" #include "status_led.h" #include "gps_sync.h" +// 1. GUARDED INCLUDE +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED +#include "csi_manager.h" +#endif + // --- Command Handlers --- static int cmd_mode_monitor(int argc, char **argv) { @@ -53,8 +57,13 @@ static int cmd_mode_status(int argc, char **argv) { printf("GPS synced: %s\n", gps_is_synced() ? "Yes" : "No"); if (mode == WIFI_CTL_MODE_STA) { + // 2. GUARDED STATUS PRINT +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED printf("CSI Enabled: %s\n", csi_mgr_is_enabled() ? "Yes" : "No"); printf("CSI Packets: %lu\n", (unsigned long)csi_mgr_get_packet_count()); +#else + printf("CSI Support: Disabled in build\n"); +#endif } else { printf("Monitor Ch: %d\n", wifi_ctl_get_monitor_channel()); printf("Captured: %lu frames\n", (unsigned long)wifi_ctl_get_monitor_frame_count()); @@ -67,8 +76,15 @@ static int cmd_csi_dump(int argc, char **argv) { printf("Error: CSI only available in STA mode\n"); return 1; } + + // 3. GUARDED DUMP ACTION +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED printf("Scheduling CSI dump...\n"); csi_mgr_schedule_dump(); +#else + printf("Error: CSI feature is disabled in this firmware build.\n"); +#endif + return 0; } diff --git a/components/csi_log/CMakeLists.txt b/components/csi_log/CMakeLists.txt index 8eced1d..c2ba57f 100644 --- a/components/csi_log/CMakeLists.txt +++ b/components/csi_log/CMakeLists.txt @@ -1,5 +1,11 @@ +set(srcs "") + +if(CONFIG_ESP_WIFI_CSI_ENABLED) + list(APPEND srcs "csi_log.c") +endif() + idf_component_register( - SRCS "csi_log.c" + SRCS ${srcs} INCLUDE_DIRS "." REQUIRES esp_wifi esp_partition ) diff --git a/components/csi_manager/CMakeLists.txt b/components/csi_manager/CMakeLists.txt index 562232b..e5b4542 100644 --- a/components/csi_manager/CMakeLists.txt +++ b/components/csi_manager/CMakeLists.txt @@ -1,4 +1,12 @@ -idf_component_register(SRCS "csi_manager.c" +# Define sources list +set(srcs "") + +# Only add the source file if the feature is enabled in menuconfig +if(CONFIG_ESP_WIFI_CSI_ENABLED) + list(APPEND srcs "csi_manager.c") +endif() + +idf_component_register(SRCS ${srcs} INCLUDE_DIRS "." REQUIRES esp_wifi freertos PRIV_REQUIRES csi_log log nvs_flash) diff --git a/components/iperf/iperf.c b/components/iperf/iperf.c index 1400e9c..bc80521 100644 --- a/components/iperf/iperf.c +++ b/components/iperf/iperf.c @@ -209,7 +209,8 @@ static void iperf_read_nvs_config(iperf_cfg_t *cfg) { nvs_close(my_handle); } -#if 0 +#if defined(CONFIG_FREERTOS_USE_TRACE_FACILITY) && defined(CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS) +// Note: You must ensure CONFIG_FREERTOS_USE_TRACE_FACILITY and CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS are enabled in your menuconfig for vTaskList to work. If they aren't, this function will be empty or not compile. If you can't change menuconfig, let me know, and I can give you a simpler way to just check the current task's priority. static void print_all_task_priorities(void) { char *task_list_buffer = malloc(1024); // Allocate buffer for list if (task_list_buffer) { @@ -221,8 +222,6 @@ static void print_all_task_priorities(void) { ESP_LOGE(TAG, "Failed to allocate buffer for task list"); } } - -// Note: You must ensure CONFIG_FREERTOS_USE_TRACE_FACILITY and CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS are enabled in your menuconfig for vTaskList to work. If they aren't, this function will be empty or not compile. If you can't change menuconfig, let me know, and I can give you a simpler way to just check the current task's priority. #endif static void __attribute__((unused)) socket_send(int sockfd, const uint8_t *buffer, int len) {} @@ -261,7 +260,7 @@ static esp_err_t iperf_start_udp_client(iperf_ctrl_t *ctrl) double total_mbps = (double)((uint64_t)burst_count * payload_len * 8 * (1000000.0 / pacing_period_us)) / 1000000.0; ESP_LOGI(TAG, "Pacing: %" PRIu32 " pkts every %" PRIu32 " us (Approx %.2f Mbps)", burst_count, pacing_period_us, total_mbps); -#if 0 +#if defined(CONFIG_FREERTOS_USE_TRACE_FACILITY) && defined(CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS) print_all_task_priorities(); #endif // Force LED to Purple immediately diff --git a/components/wifi_cfg/wifi_cfg.c b/components/wifi_cfg/wifi_cfg.c index e239946..a719f5e 100644 --- a/components/wifi_cfg/wifi_cfg.c +++ b/components/wifi_cfg/wifi_cfg.c @@ -15,7 +15,11 @@ #include "wifi_cfg.h" #include "cmd_transport.h" // Now uses the transport component + +// GUARDED INCLUDE +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED #include "csi_manager.h" // For CSI enable/disable +#endif static const char *TAG = "wifi_cfg"; static esp_netif_t *sta_netif = NULL; @@ -148,7 +152,6 @@ bool wifi_cfg_apply_from_nvs(void) { } wifi_config_t wcfg = {0}; - // Note: strlcpy takes the FULL buffer size and handles the -1 internally strlcpy((char*)wcfg.sta.ssid, ssid, sizeof(wcfg.sta.ssid)); strlcpy((char*)wcfg.sta.password, pass, sizeof(wcfg.sta.password)); wcfg.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; @@ -160,7 +163,7 @@ bool wifi_cfg_apply_from_nvs(void) { esp_wifi_set_mode(WIFI_MODE_STA); - // Protocol selection based on target + // Protocol selection #if CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6 wifi_protocols_t protocols = { .ghz_2g = WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N, @@ -214,7 +217,11 @@ static void on_cfg_line(const char *line, char *ssid, char *pass, char *ip, char if (strncmp(line, "MODE:",5)==0){ strncpy(mode, line+5, 15); mode[15]=0; return; } if (strncmp(line, "MON_CH:",7)==0){ *mon_ch = atoi(line+7); return; } if (strncmp(line, "DHCP:",5)==0){ *dhcp = atoi(line+5) ? true:false; return; } + +// GUARDED CSI PARSING +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED if (strncmp(line, "CSI:",4)==0){ *csi_enable = atoi(line+4) ? true:false; return; } +#endif } static bool wifi_cfg_cmd_handler(const char *line, cmd_reply_func_t reply_func, void *reply_ctx) { @@ -247,6 +254,8 @@ static bool wifi_cfg_cmd_handler(const char *line, cmd_reply_func_t reply_func, save_cfg(ssid, pass, ip, mask, gw, dhcp, band, bw, powersave, mode, mon_ch); +// GUARDED SAVE LOGIC +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED // Save CSI enable state esp_err_t err = csi_mgr_save_enable_state(csi_enable); if (err == ESP_OK) { @@ -254,6 +263,7 @@ static bool wifi_cfg_cmd_handler(const char *line, cmd_reply_func_t reply_func, } else { printf("Failed to save CSI state: %s\n", esp_err_to_name(err)); } +#endif if (reply_func) reply_func("OK\n", reply_ctx); wifi_cfg_apply_from_nvs(); diff --git a/components/wifi_controller/wifi_controller.c b/components/wifi_controller/wifi_controller.c index 0b261af..53f48b0 100644 --- a/components/wifi_controller/wifi_controller.c +++ b/components/wifi_controller/wifi_controller.c @@ -7,11 +7,15 @@ // Dependencies #include "iperf.h" -#include "csi_manager.h" #include "status_led.h" #include "wifi_monitor.h" #include "gps_sync.h" +// 1. GUARDED INCLUDE +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED +#include "csi_manager.h" +#endif + static const char *TAG = "WIFI_CTL"; static wifi_ctl_mode_t s_current_mode = WIFI_CTL_MODE_STA; @@ -107,7 +111,10 @@ esp_err_t wifi_ctl_switch_to_monitor(uint8_t channel, wifi_bandwidth_t bandwidth vTaskDelay(pdMS_TO_TICKS(500)); // 2. Disable CSI (hardware conflict) + // 2. GUARDED CALL +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED csi_mgr_disable(); +#endif // 3. Teardown Station esp_wifi_disconnect(); @@ -172,8 +179,6 @@ esp_err_t wifi_ctl_switch_to_sta(wifi_band_mode_t band_mode) { esp_wifi_get_config(WIFI_IF_STA, &wifi_config); wifi_config.sta.channel = 0; // Auto channel scan - // Note: band_mode preference logic would go here if using scan filters - esp_wifi_set_config(WIFI_IF_STA, &wifi_config); esp_wifi_start(); vTaskDelay(pdMS_TO_TICKS(500)); @@ -183,13 +188,10 @@ esp_err_t wifi_ctl_switch_to_sta(wifi_band_mode_t band_mode) { s_current_mode = WIFI_CTL_MODE_STA; status_led_set_state(LED_STATE_WAITING); - // Note: csi_mgr_enable is handled by GOT_IP event in main.c - return ESP_OK; } void wifi_ctl_auto_monitor_start(uint8_t channel) { - // Pass channel as value-in-pointer (it fits in void*) xTaskCreate(auto_monitor_task_func, "auto_monitor", 4096, (void*)(uintptr_t)channel, 5, NULL); } diff --git a/main/main.c b/main/main.c index 6282ca4..f7b4086 100644 --- a/main/main.c +++ b/main/main.c @@ -17,12 +17,16 @@ #include "status_led.h" #include "gps_sync.h" #include "wifi_cfg.h" -#include "csi_log.h" -#include "csi_manager.h" #include "wifi_controller.h" #include "app_console.h" #include "iperf.h" +// GUARDED INCLUDE: Prevents issues if csi_manager types aren't available +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED +#include "csi_log.h" +#include "csi_manager.h" +#endif + static const char *TAG = "MAIN"; // --- Event Handler ------------------------------------------------- @@ -49,6 +53,8 @@ static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_ status_led_set_state(LED_STATE_CONNECTED); +// GUARDED CSI STARTUP LOGIC +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED // Start App Services - Only enable CSI if configured in NVS if (csi_mgr_should_enable()) { ESP_LOGI(TAG, "CSI enabled in config - starting capture"); @@ -57,6 +63,7 @@ static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_ } else { ESP_LOGI(TAG, "CSI disabled in config - skipping capture"); } +#endif // Always start iperf server iperf_cfg_t cfg = { .flag = IPERF_FLAG_SERVER | IPERF_FLAG_TCP, .sport = 5001 }; @@ -72,7 +79,10 @@ void app_main(void) { ESP_ERROR_CHECK(esp_event_loop_create_default()); // 2. Hardware/Driver Init +// GUARDED LOG INIT +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED ESP_ERROR_CHECK(csi_log_init()); +#endif status_led_init(RGB_LED_GPIO, HAS_RGB_LED); const gps_sync_config_t gps_cfg = { @@ -84,7 +94,10 @@ void app_main(void) { gps_sync_init(&gps_cfg, true); // 3. Subsystem Init +// GUARDED MANAGER INIT +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED csi_mgr_init(); +#endif wifi_ctl_init(); wifi_cfg_init(); // Starts cmd_transport (UART/USB) @@ -107,8 +120,11 @@ void app_main(void) { // 6. Application Start // Display CSI config status +// GUARDED PRINT +#ifdef CONFIG_ESP_WIFI_CSI_ENABLED bool csi_enabled = csi_mgr_should_enable(); ESP_LOGI(TAG, "CSI Capture: %s", csi_enabled ? "ENABLED" : "DISABLED"); +#endif if (wifi_cfg_apply_from_nvs()) { status_led_set_state(LED_STATE_WAITING); @@ -123,8 +139,7 @@ void app_main(void) { ESP_LOGW(TAG, "No Config Found. Waiting for setup..."); } - // 7. Enter Console Loop (CRITICAL FIX) - // This keeps the main task alive to process UART commands from the Python script + // 7. Enter Console Loop ESP_LOGI(TAG, "Initialization complete. Entering console loop."); const char* prompt = LOG_COLOR_I "esp32> " LOG_RESET_COLOR; @@ -139,7 +154,6 @@ void app_main(void) { } while (true) { - // This blocks until a line is received from UART char* line = linenoise(prompt); if (line == NULL) { /* Break on EOF or error */ break; @@ -147,8 +161,6 @@ void app_main(void) { if (strlen(line) > 0) { linenoiseHistoryAdd(line); - - // Try to run the command int ret; esp_err_t err = esp_console_run(line, &ret); if (err == ESP_ERR_NOT_FOUND) { @@ -159,7 +171,6 @@ void app_main(void) { printf("Internal error: %s\n", esp_err_to_name(err)); } } - linenoiseFree(line); } }