65 lines
2.3 KiB
C++
65 lines
2.3 KiB
C++
#pragma once
|
|
|
|
/**
|
|
* @file WifiManager.h
|
|
* @brief WiFi Access Point + Async Web Server for configuration and OTA.
|
|
*
|
|
* Responsibilities:
|
|
* - Start a WPA2 Access Point with credentials from AppConfig.
|
|
* - Host a lightweight web UI on port 80:
|
|
* GET / → configuration page (tile/page editor)
|
|
* GET /api/config → current config as JSON
|
|
* POST /api/config → apply new config (JSON body)
|
|
* POST /api/ble/cmd → forward BLE command (restart, wifi_sta, wifi_ap)
|
|
* GET /api/state → current BoatState as JSON (live data snapshot)
|
|
* POST /update → OTA firmware upload
|
|
* - Signal OTA progress to the display.
|
|
* - Accept a BLE passkey submission from the web UI.
|
|
*/
|
|
|
|
#include "Config.h"
|
|
#include <ESPAsyncWebServer.h>
|
|
|
|
class WifiManager {
|
|
public:
|
|
/**
|
|
* @brief Start the AP and the async web server.
|
|
* Must be called from setup() or on button combo.
|
|
*/
|
|
void begin(const char* ssid, const char* password);
|
|
|
|
/** @brief Stop the AP and server (e.g. when switching back to BLE-only). */
|
|
void stop();
|
|
|
|
/** @brief Returns true when the AP is active and the server is running. */
|
|
bool isActive() const { return _active; }
|
|
|
|
/** @brief IP address of the AP interface (always 192.168.4.1). */
|
|
static constexpr const char* AP_IP = "192.168.4.1";
|
|
|
|
/** @brief Call from loop() — no-op currently, kept for future use. */
|
|
void update();
|
|
|
|
private:
|
|
AsyncWebServer _server{80};
|
|
bool _active = false;
|
|
|
|
void _setupRoutes();
|
|
|
|
// Route handlers
|
|
void _handleRoot (AsyncWebServerRequest*);
|
|
void _handleGetConfig (AsyncWebServerRequest*);
|
|
void _handlePostConfig (AsyncWebServerRequest*, uint8_t*, size_t, size_t, size_t);
|
|
void _handleGetState (AsyncWebServerRequest*);
|
|
void _handleBleCmd (AsyncWebServerRequest*, uint8_t*, size_t, size_t, size_t);
|
|
void _handlePasskey (AsyncWebServerRequest*, uint8_t*, size_t, size_t, size_t);
|
|
void _handleOtaUpload (AsyncWebServerRequest*, const String&, size_t, uint8_t*, size_t, bool);
|
|
void _handleNotFound (AsyncWebServerRequest*);
|
|
|
|
// Serve the embedded HTML (stored in PROGMEM)
|
|
static const char INDEX_HTML[] PROGMEM;
|
|
};
|
|
|
|
// Singleton accessor
|
|
extern WifiManager wifiManager;
|