diff --git a/main/main.c b/main/main.c index 8372867..61536c2 100644 --- a/main/main.c +++ b/main/main.c @@ -26,9 +26,7 @@ static const char *TAG = "main"; // RGB LED GPIO pin configuration #if CONFIG_IDF_TARGET_ESP32S3 - // ESP32-S3-DevKitC-1 v1.0 uses GPIO48, v1.1 uses GPIO38 - // Default to GPIO48 for backward compatibility, but you may need GPIO38 - #define RGB_LED_GPIO 48 // Change to 38 if you have v1.1 board + #define RGB_LED_GPIO 48 #elif CONFIG_IDF_TARGET_ESP32C5 #define RGB_LED_GPIO 27 #elif CONFIG_IDF_TARGET_ESP32C6 @@ -51,10 +49,10 @@ static bool has_config = false; // LED states typedef enum { - LED_STATE_NO_CONFIG, // Yellow - no WiFi config in NVS - LED_STATE_WAITING, // Blue slow blink - trying to connect - LED_STATE_CONNECTED, // Blue solid - connected successfully - LED_STATE_FAILED // Red fast blink - connection failed + LED_STATE_NO_CONFIG, + LED_STATE_WAITING, + LED_STATE_CONNECTED, + LED_STATE_FAILED } led_state_t; static led_state_t current_led_state = LED_STATE_NO_CONFIG; @@ -67,7 +65,7 @@ static void rgb_led_init(void) }; led_strip_rmt_config_t rmt_config = { - .resolution_hz = 10 * 1000 * 1000, // 10MHz + .resolution_hz = 10 * 1000 * 1000, }; ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); @@ -89,34 +87,30 @@ static void led_task(void *arg) while(1) { switch(current_led_state) { case LED_STATE_NO_CONFIG: - // Yellow solid - no WiFi config - set_led_color(255, 255, 0); // Red + Green = Yellow + set_led_color(255, 255, 0); vTaskDelay(pdMS_TO_TICKS(1000)); break; case LED_STATE_WAITING: - // Blue slow blink - waiting for WiFi if (blink_state) { - set_led_color(0, 0, 255); // Blue + set_led_color(0, 0, 255); } else { - set_led_color(0, 0, 0); // Off + set_led_color(0, 0, 0); } blink_state = !blink_state; vTaskDelay(pdMS_TO_TICKS(1000)); break; case LED_STATE_CONNECTED: - // Blue solid - connected successfully - set_led_color(0, 255, 0); // Green + set_led_color(0, 255, 0); vTaskDelay(pdMS_TO_TICKS(1000)); break; case LED_STATE_FAILED: - // Red fast blink - connection failed if (blink_state) { - set_led_color(255, 0, 0); // Red + set_led_color(255, 0, 0); } else { - set_led_color(0, 0, 0); // Off + set_led_color(0, 0, 0); } blink_state = !blink_state; vTaskDelay(pdMS_TO_TICKS(200)); @@ -127,9 +121,9 @@ static void led_task(void *arg) // --- CSI support --------------------------------------------------- static bool s_csi_enabled = false; +static uint32_t s_csi_packet_count = 0; static void csi_dump_task(void *arg) { - // Wait some time to accumulate CSI records, then dump them over UART vTaskDelay(pdMS_TO_TICKS(20000)); csi_log_dump_over_uart(); vTaskDelete(NULL); @@ -137,8 +131,13 @@ static void csi_dump_task(void *arg) { static void csi_cb(void *ctx, wifi_csi_info_t *info) { - // Just log to flash; no heavy work here csi_log_append_record(info); + + s_csi_packet_count++; + + if ((s_csi_packet_count % 100) == 0) { + ESP_LOGI("CSI", "Captured %lu CSI packets", (unsigned long)s_csi_packet_count); + } } static void wifi_enable_csi_once(void) { @@ -148,56 +147,71 @@ static void wifi_enable_csi_once(void) { esp_err_t err; + // Wait for WiFi to stabilize + ESP_LOGI("CSI", "Waiting 500ms for WiFi to stabilize..."); + vTaskDelay(pdMS_TO_TICKS(500)); + + // Disable power save for CSI + err = esp_wifi_set_ps(WIFI_PS_NONE); + if (err != ESP_OK) { + ESP_LOGW("CSI", "Failed to disable power save: %s", esp_err_to_name(err)); + } else { + ESP_LOGI("CSI", "WiFi power save disabled"); + } + wifi_csi_config_t csi_cfg; #if CONFIG_IDF_TARGET_ESP32C5 - /* ------------------------- - * ESP32-C5 (Wi-Fi 6) CSI API - * Only supports .enable - * ------------------------- */ memset(&csi_cfg, 0, sizeof(csi_cfg)); csi_cfg.enable = true; #elif CONFIG_IDF_TARGET_ESP32S3 - /* ------------------------- - * ESP32-S3 CSI API (legacy) - * ------------------------- */ memset(&csi_cfg, 0, sizeof(csi_cfg)); csi_cfg.lltf_en = true; csi_cfg.htltf_en = true; csi_cfg.stbc_htltf2_en = true; csi_cfg.ltf_merge_en = true; - csi_cfg.channel_filter_en = true; + csi_cfg.channel_filter_en = false; csi_cfg.manu_scale = false; csi_cfg.shift = 0; #else -#warning "CSI not supported for this target; building without CSI" +#warning "CSI not supported for this target" return; #endif err = esp_wifi_set_csi_config(&csi_cfg); if (err != ESP_OK) { - ESP_LOGW("CSI", "esp_wifi_set_csi_config failed: %s", esp_err_to_name(err)); + ESP_LOGE("CSI", "esp_wifi_set_csi_config failed: %s (0x%x)", esp_err_to_name(err), err); return; } + ESP_LOGI("CSI", "CSI config applied successfully"); err = esp_wifi_set_csi_rx_cb(csi_cb, NULL); if (err != ESP_OK) { - ESP_LOGW("CSI", "esp_wifi_set_csi_rx_cb failed: %s", esp_err_to_name(err)); + ESP_LOGE("CSI", "esp_wifi_set_csi_rx_cb failed: %s", esp_err_to_name(err)); return; } + ESP_LOGI("CSI", "CSI callback registered"); err = esp_wifi_set_csi(true); if (err != ESP_OK) { - ESP_LOGW("CSI", "esp_wifi_set_csi(true) failed: %s", esp_err_to_name(err)); + ESP_LOGE("CSI", "esp_wifi_set_csi(true) failed: %s", esp_err_to_name(err)); return; } + ESP_LOGI("CSI", "CSI capture enabled"); - ESP_LOGI("CSI", "CSI enabled"); + ESP_LOGI("CSI", "CSI fully enabled and capturing!"); s_csi_enabled = true; } +static void csi_init_task(void *arg) { + vTaskDelay(pdMS_TO_TICKS(1000)); + ESP_LOGI("CSI", "Starting CSI initialization..."); + wifi_enable_csi_once(); + vTaskDelete(NULL); +} + static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { @@ -232,8 +246,8 @@ static void event_handler(void* arg, esp_event_base_t event_base, current_led_state = LED_STATE_CONNECTED; ESP_LOGI(TAG, "WiFi CONNECTED - BLUE LED solid"); - // Enable CSI once we know Wi-Fi is fully up - wifi_enable_csi_once(); + // Enable CSI in separate task + xTaskCreate(csi_init_task, "csi_init", 4096, NULL, 5, NULL); // Auto-start iperf server vTaskDelay(pdMS_TO_TICKS(1000)); @@ -246,11 +260,8 @@ static void event_handler(void* arg, esp_event_base_t event_base, iperf_start(&cfg); ESP_LOGI(TAG, "iperf TCP server started on port 5001"); - // Schedule CSI dump after 20 seconds of capture - BaseType_t task_ok = xTaskCreate(csi_dump_task, "csi_dump_task", 4096, NULL, 5, NULL); - if (task_ok != pdPASS) { - ESP_LOGE("CSI", "Failed to create csi_dump_task"); - } + // Schedule CSI dump + xTaskCreate(csi_dump_task, "csi_dump_task", 4096, NULL, 5, NULL); } } @@ -258,24 +269,18 @@ void app_main(void) { ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); - // Initialize CSI flash logging ESP_ERROR_CHECK(csi_log_init()); - // Initialize RGB LED rgb_led_init(); - // Start LED task xTaskCreate(led_task, "led_task", 4096, NULL, 5, NULL); - // Register WiFi events ESP_ERROR_CHECK(esp_event_handler_instance_register( - WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL)); + WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL)); ESP_ERROR_CHECK(esp_event_handler_instance_register( - IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL)); + IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL)); - // Initialize WiFi config wifi_cfg_init(); - // Try to load config from NVS if (wifi_cfg_apply_from_nvs()) { has_config = true; current_led_state = LED_STATE_WAITING;