| 50 | // ============================================================================ |
| 51 | |
| 52 | static bool initWifiAP() { |
| 53 | if (s_net_state.wifi_ap_active) { |
| 54 | return true; // Already active |
| 55 | } |
| 56 | |
| 57 | // Initialize TCP/IP stack (safe to call multiple times) |
| 58 | esp_err_t err = esp_netif_init(); |
| 59 | if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { |
| 60 | FL_WARN("[NET] esp_netif_init failed: " << esp_err_to_name(err)); |
| 61 | return false; |
| 62 | } |
| 63 | |
| 64 | // Create default event loop (safe to call multiple times) |
| 65 | if (!s_event_loop_initialized) { |
| 66 | err = esp_event_loop_create_default(); |
| 67 | if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { |
| 68 | FL_WARN("[NET] esp_event_loop_create_default failed: " << esp_err_to_name(err)); |
| 69 | return false; |
| 70 | } |
| 71 | s_event_loop_initialized = true; |
| 72 | } |
| 73 | |
| 74 | // Create default WiFi AP netif |
| 75 | if (!s_netif_ap) { |
| 76 | s_netif_ap = esp_netif_create_default_wifi_ap(); |
| 77 | if (!s_netif_ap) { |
| 78 | FL_WARN("[NET] esp_netif_create_default_wifi_ap failed"); |
| 79 | return false; |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | // Initialize WiFi with default config |
| 84 | if (!s_wifi_initialized) { |
| 85 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); |
| 86 | err = esp_wifi_init(&cfg); |
| 87 | if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { |
| 88 | FL_WARN("[NET] esp_wifi_init failed: " << esp_err_to_name(err)); |
| 89 | return false; |
| 90 | } |
| 91 | s_wifi_initialized = true; |
| 92 | } |
| 93 | |
| 94 | // Configure AP |
| 95 | wifi_config_t wifi_config = {}; |
| 96 | memcpy(wifi_config.ap.ssid, AUTORESEARCH_NET_SSID, strlen(AUTORESEARCH_NET_SSID)); |
| 97 | wifi_config.ap.ssid_len = strlen(AUTORESEARCH_NET_SSID); |
| 98 | memcpy(wifi_config.ap.password, AUTORESEARCH_NET_PASSWORD, strlen(AUTORESEARCH_NET_PASSWORD)); |
| 99 | wifi_config.ap.max_connection = AUTORESEARCH_NET_MAX_CONNECTIONS; |
| 100 | wifi_config.ap.authmode = WIFI_AUTH_WPA2_PSK; |
| 101 | wifi_config.ap.channel = 1; |
| 102 | |
| 103 | err = esp_wifi_set_mode(WIFI_MODE_AP); |
| 104 | if (err != ESP_OK) { |
| 105 | FL_WARN("[NET] esp_wifi_set_mode failed: " << esp_err_to_name(err)); |
| 106 | return false; |
| 107 | } |
| 108 | |
| 109 | err = esp_wifi_set_config(WIFI_IF_AP, &wifi_config); |
no test coverage detected