FastLED 3.9.15
Loading...
Searching...
No Matches
AutoResearchOta.cpp
Go to the documentation of this file.
1// examples/AutoResearch/AutoResearchOta.cpp
2//
3// OTA autoresearch implementation for ESP32.
4// Uses fl::net::OTA for the OTA HTTP server with Basic Auth.
5// Uses ESP-IDF native APIs for WiFi Soft AP.
6// Guarded with FL_IS_ESP32 - no-op stubs on other platforms.
7
8#include "AutoResearchOta.h"
9#include "fl/stl/json.h"
10#include "fl/log/log.h"
11
12// Global OTA state
14
18
19// ============================================================================
20// ESP32 Implementation
21// ============================================================================
22
23#if defined(FL_IS_ESP32)
24
25#include "fl/net/ota.h"
26#include "fl/stl/cstring.h"
27#include "fl/stl/unique_ptr.h"
28#include <Arduino.h>
29
30// ESP-IDF headers for WiFi AP
31// IWYU pragma: begin_keep
32#include <esp_wifi.h>
33#include <esp_netif.h>
34#include <esp_event.h>
35// IWYU pragma: end_keep
36
37// Static handles
39static esp_netif_t* s_ota_netif_ap = nullptr;
40static bool s_ota_event_loop_initialized = false;
41static bool s_ota_wifi_initialized = false;
42
43// ============================================================================
44// WiFi Soft AP Setup (same pattern as AutoResearchNet.cpp::initWifiAP)
45// ============================================================================
46
47static bool initOtaWifiAP() {
48 if (s_ota_state.wifi_ap_active) {
49 return true; // Already active
50 }
51
52 // Initialize TCP/IP stack (safe to call multiple times)
53 esp_err_t err = esp_netif_init();
54 if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
55 FL_WARN("[OTA] esp_netif_init failed: " << esp_err_to_name(err));
56 return false;
57 }
58
59 // Create default event loop (safe to call multiple times)
60 if (!s_ota_event_loop_initialized) {
61 err = esp_event_loop_create_default();
62 if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
63 FL_WARN("[OTA] esp_event_loop_create_default failed: " << esp_err_to_name(err));
64 return false;
65 }
66 s_ota_event_loop_initialized = true;
67 }
68
69 // Create default WiFi AP netif
70 if (!s_ota_netif_ap) {
71 s_ota_netif_ap = esp_netif_create_default_wifi_ap();
72 if (!s_ota_netif_ap) {
73 FL_WARN("[OTA] esp_netif_create_default_wifi_ap failed");
74 return false;
75 }
76 }
77
78 // Initialize WiFi with default config
79 if (!s_ota_wifi_initialized) {
80 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
81 err = esp_wifi_init(&cfg);
82 if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
83 FL_WARN("[OTA] esp_wifi_init failed: " << esp_err_to_name(err));
84 return false;
85 }
86 s_ota_wifi_initialized = true;
87 }
88
89 // Configure AP
90 wifi_config_t wifi_config = {};
92 wifi_config.ap.ssid_len = strlen(AUTORESEARCH_OTA_SSID);
94 wifi_config.ap.max_connection = 4;
95 wifi_config.ap.authmode = WIFI_AUTH_WPA2_PSK;
96 wifi_config.ap.channel = 1;
97
98 err = esp_wifi_set_mode(WIFI_MODE_AP);
99 if (err != ESP_OK) {
100 FL_WARN("[OTA] esp_wifi_set_mode failed: " << esp_err_to_name(err));
101 return false;
102 }
103
104 err = esp_wifi_set_config(WIFI_IF_AP, &wifi_config);
105 if (err != ESP_OK) {
106 FL_WARN("[OTA] esp_wifi_set_config failed: " << esp_err_to_name(err));
107 return false;
108 }
109
110 err = esp_wifi_start();
111 if (err != ESP_OK) {
112 FL_WARN("[OTA] esp_wifi_start failed: " << esp_err_to_name(err));
113 return false;
114 }
115
116 s_ota_state.wifi_ap_active = true;
117 FL_WARN("[OTA] WiFi AP started: SSID=" << AUTORESEARCH_OTA_SSID << " IP=" << AUTORESEARCH_OTA_AP_IP);
118 return true;
119}
120
121// ============================================================================
122// Public API
123// ============================================================================
124
127
128 // Start WiFi AP
129 if (!initOtaWifiAP()) {
130 response.set("success", false);
131 response.set("error", "Failed to start WiFi AP for OTA");
132 return response;
133 }
134
135 // Create and start OTA server
138 response.set("success", false);
139 response.set("error", "Failed to start OTA server");
140 s_ota.reset();
141 return response;
142 }
143
144 s_ota_state.ota_active = true;
145 FL_WARN("[OTA] OTA server started: hostname=" << AUTORESEARCH_OTA_HOSTNAME);
146
147 response.set("success", true);
148 response.set("ssid", AUTORESEARCH_OTA_SSID);
149 response.set("password", AUTORESEARCH_OTA_PASSWORD);
151 response.set("port", static_cast<int64_t>(AUTORESEARCH_OTA_PORT));
152 response.set("ota_password", AUTORESEARCH_OTA_OTA_PASSWORD);
153 response.set("hostname", AUTORESEARCH_OTA_HOSTNAME);
154 return response;
155}
156
159
160 // Stop OTA server
161 if (s_ota.get()) {
162 s_ota.reset();
163 s_ota_state.ota_active = false;
164 FL_WARN("[OTA] OTA server stopped");
165 }
166
167 // Stop WiFi
168 if (s_ota_state.wifi_ap_active) {
169 esp_wifi_stop();
170 s_ota_state.wifi_ap_active = false;
171 FL_WARN("[OTA] WiFi AP stopped");
172 }
173
174 response.set("success", true);
175 return response;
176}
177
178#else // !FL_IS_ESP32
179
180// ============================================================================
181// Stub Implementation for Non-ESP32 Platforms
182// ============================================================================
183
185 fl::json response = fl::json::object();
186 response.set("success", false);
187 response.set("error", "OTA autoresearch only supported on ESP32");
188 return response;
189}
190
192 fl::json response = fl::json::object();
193 response.set("success", true);
194 return response;
195}
196
197#endif // FL_IS_ESP32
AutoResearchOtaState & getOtaState()
Get current OTA autoresearch state.
fl::json stopOta()
Stop OTA server and WiFi AP, release all resources.
static AutoResearchOtaState s_ota_state
fl::json startOta()
Start WiFi Soft AP and OTA HTTP server.
#define AUTORESEARCH_OTA_HOSTNAME
#define AUTORESEARCH_OTA_PASSWORD
#define AUTORESEARCH_OTA_SSID
#define AUTORESEARCH_OTA_AP_IP
#define AUTORESEARCH_OTA_PORT
#define AUTORESEARCH_OTA_OTA_PASSWORD
State for OTA autoresearch.
static json object() FL_NOEXCEPT
Definition json.h:692
pointer get() const FL_NOEXCEPT
Definition unique_ptr.h:97
void reset(pointer p=nullptr) FL_NOEXCEPT
Definition unique_ptr.h:113
FastLED's Elegant JSON Library: fl::json
#define FL_WARN(X)
Definition log.h:276
Centralized logging categories for FastLED hardware interfaces and subsystems.
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
size_t strlen(const char *s) FL_NOEXCEPT
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
Definition unique_ptr.h:261
Minimal, batteries-included OTA (Over-The-Air) update system for ESP32.