Files
esp_jardin/src/network.cpp
T

110 lines
3.7 KiB
C++

#include "network.h"
#include "config.h"
#include <WiFi.h>
#include <ESPmDNS.h>
#include <ArduinoOTA.h>
static uint32_t _dernierRetryMs = 0;
static uint32_t _debutConnexionMs = 0;
static bool _connexionEnCours = false;
// Démarre la tentative de connexion STA (non-bloquant)
static void _demarrerSTA() {
Serial.printf("[WIFI] Connexion STA → SSID: %s\n", WIFI_SSID);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
_debutConnexionMs = millis();
_connexionEnCours = true;
netStatus.modeAP = false; // reset dès la tentative STA
}
static void _demarrerAP() {
Serial.println("[WIFI] Bascule AP → ESP_CHEF_JARDIN");
WiFi.mode(WIFI_AP);
WiFi.softAP(AP_SSID, AP_PASS);
netStatus.modeAP = true;
netStatus.wifiConnecte = false;
netStatus.rssi = 0;
Serial.printf("[WIFI] AP IP: %s\n", WiFi.softAPIP().toString().c_str());
}
static void _configurerMDNS() {
MDNS.end();
if (MDNS.begin(MDNS_NOM)) {
MDNS.addService("http", "tcp", 80);
Serial.printf("[mDNS] Accessible via http://%s.local\n", MDNS_NOM);
}
}
static void _configurerOTA() {
ArduinoOTA.setPassword(OTA_PASS);
ArduinoOTA.onStart([]() {
Serial.println("[OTA] Mise à jour démarrée");
});
ArduinoOTA.onEnd([]() {
Serial.println("[OTA] Terminée — redémarrage");
});
ArduinoOTA.onError([](ota_error_t err) {
Serial.printf("[OTA] Erreur [%u]\n", err);
});
ArduinoOTA.begin();
Serial.println("[OTA] Prêt");
}
void network_init() {
_demarrerSTA();
}
void network_update() {
// ── Gestion OTA ─────────────────────────────────────────────────
if (netStatus.wifiConnecte && !netStatus.modeAP) {
ArduinoOTA.handle();
}
// ── Connexion STA en cours ───────────────────────────────────────
if (_connexionEnCours) {
if (WiFi.status() == WL_CONNECTED) {
_connexionEnCours = false;
netStatus.wifiConnecte = true;
netStatus.modeAP = false;
netStatus.uptimeDemarrage = millis();
Serial.printf("[WIFI] Connecté — IP: %s\n", WiFi.localIP().toString().c_str());
_configurerMDNS();
_configurerOTA();
} else if (millis() - _debutConnexionMs > WIFI_TIMEOUT_MS) {
_connexionEnCours = false;
Serial.println("[WIFI] Timeout STA");
_demarrerAP();
}
return;
}
// ── STA connecté : surveiller les déconnexions ──────────────────
if (netStatus.wifiConnecte && !netStatus.modeAP) {
if (WiFi.status() != WL_CONNECTED) {
netStatus.wifiConnecte = false;
Serial.println("[WIFI] Déconnexion détectée — retry dans 30s");
_dernierRetryMs = millis();
} else {
netStatus.rssi = WiFi.RSSI();
}
return;
}
// ── Mode AP : retry STA toutes les 60s ──────────────────────────
if (netStatus.modeAP) {
if (millis() - _dernierRetryMs > 60000) {
Serial.println("[WIFI] Mode AP — retry STA...");
_dernierRetryMs = millis();
_demarrerSTA();
}
return;
}
// ── STA déconnecté (hors AP) : retry toutes les 30s ─────────────
if (!netStatus.wifiConnecte && millis() - _dernierRetryMs > WIFI_RETRY_MS) {
_dernierRetryMs = millis();
_demarrerSTA();
}
}