Newer
Older
smart-home-server / devices / sh_core_esp8266 / src / WebHandlers.cpp
#include "sh_core_esp8266.h"
#include <Updater.h>

static String render_wifi_setup_page() {
  String html = wifi_setup_page;

  if (savedSSID.length() > 0) {
    html.replace("{{LAST_SSID}}", savedSSID);
  } else {
    html.replace("{{LAST_SSID}}", "(не задано)");
  }

  return html;
}


// -------------------- handlers --------------------
static void handleRoot() {
  auto mode = WiFi.getMode();

  if (deviceMode == DEVICE_MODE_SETUP || mode == WIFI_AP || mode == WIFI_AP_STA) {
    server.send(200, "text/html; charset=utf-8", render_wifi_setup_page());
    return;
  }

  String msg = "ESP8266 device\nID: " + getUniqueID() + "\nVersion: ";
  msg += FW_VERSION;

  server.send(200, "text/plain; charset=utf-8", msg);
}

static void handleSaveWiFi() {
  String ssid = server.arg("ssid");
  String pass = server.arg("pass");

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

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

static void handleUpdateGet() {
  server.send(200, "text/html; charset=utf-8", update_page);
}

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

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

    size_t sketch_space = (ESP.getFreeSketchSpace() - 0x2000) & 0xFFFFF000;
    if (!Update.begin(sketch_space)) {
      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)) {
      Update.printError(Serial);
    }
  }
}

static void handleUpdatePost() {
  if (Update.hasError()) server.send(200, "text/plain; charset=utf-8", "Update Failed!");
  else                   server.send(200, "text/plain; charset=utf-8", "Update OK! Rebooting...");

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

static void handleWIFICredsStayConfirmed() {
  server.send(200, "text/plain", "OK, rebooting...");
  delay(200);
  ESP.restart();
}

static void handleSetupGetUi() {
  if (deviceMode != DEVICE_MODE_SETUP) {
    server.send(403, "text/plain; charset=utf-8", "Setup mode is not active");
    return;
  }

  server.send(200, "text/html; charset=utf-8", render_wifi_setup_page());
}

static void handleSetupPostUi() {
  if (deviceMode != DEVICE_MODE_SETUP) {
    server.send(403, "text/plain; charset=utf-8", "Setup mode is not active");
    return;
  }

  String ssid = server.arg("ssid");
  String pass = server.arg("pass");

  ssid.trim();
  pass.trim();

  if (ssid.length() == 0) {
    server.send(400, "text/plain; charset=utf-8", "SSID is required");
    return;
  }

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

  server.send(200, "text/plain; charset=utf-8", "Wi-Fi configured. Rebooting...");
  delay(600);
  ESP.restart();
}


// -------------------- routes register --------------------
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("/wifi_confirm", HTTP_POST, handleWIFICredsStayConfirmed);
  server.on("/setup", HTTP_GET,  handleSetupGetUi);
  server.on("/setup", HTTP_POST, handleSetupPostUi);

}