Newer
Older
smart-home-server / devices / relay / relay_esp8266 / WebHandlers.h
#ifndef WEB_HANDLERS_H
#define WEB_HANDLERS_H

#include "Config.h"

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Updater.h>
#include <EEPROM.h>

#include "Global.h"
#include "WebPages.h"

// -------------------- ROOT --------------------
inline void handleRoot() {
  if (WiFi.getMode() == WIFI_AP)
    return server.send(200, "text/html", wifiSetupPage);

  String msg = "ESP8266 (-01S) WiFi Relay\nID: " + getUniqueID() + "\nVersion: ";
  msg += FW_VERSION;

  msg += "\nGo to /panel";
  server.send(200, "text/plain", msg);
}

// -------------------- SAVE WIFI --------------------
inline void handleSaveWiFi() {
  String ssid = server.arg("ssid");
  String pass = server.arg("pass");

  savedSSID = ssid;
  savedPASS = pass;
  saveWiFiConfig(savedSSID, savedPASS);

  server.send(200, "text/plain", "Saved! Rebooting...");
  delay(800);
  ESP.restart();
}

// -------------------- OTA PAGES --------------------
inline void handleUpdateGet() {
  server.send(200, "text/html", updatePage);
}

inline void handleUpdateUpload() {
  HTTPUpload& upload = server.upload();

  if (upload.status == UPLOAD_FILE_START) {
    Serial.printf("OTA start: %s\n", upload.filename.c_str());

    size_t sketchSpace = (ESP.getFreeSketchSpace() - 0x2000) & 0xFFFFF000;

    if (!Update.begin(sketchSpace)) { // более безопасный вариант
      Update.printError(Serial);
    }
  }
  else if (upload.status == UPLOAD_FILE_WRITE) {
    if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
      Update.printError(Serial);
    }
  }
  else if (upload.status == UPLOAD_FILE_END) {
    if (!Update.end(true)) {   // true = сразу перезаписать раздел
      Update.printError(Serial);
    }
  }
}

inline void handleUpdatePost() {
  if (Update.hasError()) server.send(200, "text/plain", "Update Failed!");
  else                   server.send(200, "text/plain", "Update OK! Rebooting...");

  delay(800);
  ESP.restart();
}

// -------------------- PANEL (GET) --------------------
inline void handlePanelGet() {
  if (WiFi.getMode() == WIFI_AP)
    return server.send(200, "text/html", wifiSetupPage);

  String html = panelPageHeader;

  html += "<script>";
  html += "let powerStatus = " + String(isOn ? 1 : 0) + ";";
  html += "</script>";
  html += panelPageFooter;

  server.send(200, "text/html", html);
}

// -------------------- PANEL (POST) --------------------
inline void handlePanelPost() {
  bool turnOn = isOn;  // значение по умолчанию — текущее состояние

  if (server.hasArg("powerState")) {
    String val = server.arg("powerState");
    turnOn = (val == "1" || val == "on" || val == "true" || val == "yes");

    setOn(turnOn);
    Serial.println(turnOn ? "ON via Web" : "OFF via Web");
  }

  // TODO: блок с device_name потом поправишь/уберёшь

  // сохраняем состояние в EEPROM
  saveIsOn(turnOn);

  server.sendHeader("Location", "/panel");
  server.send(303);
}

// -------------------- Регистрация роутов веб-панели --------------------
inline void registerWebUiRoutes() {
  server.on("/",          HTTP_GET,  handleRoot);
  server.on("/save_wifi", HTTP_POST, handleSaveWiFi);
  server.on("/update",    HTTP_GET,  handleUpdateGet);
  server.on("/update",    HTTP_POST, handleUpdatePost, handleUpdateUpload);
  server.on("/panel",     HTTP_GET,  handlePanelGet);
  server.on("/panel",     HTTP_POST, handlePanelPost);
}

#endif // WEB_HANDLERS_H