You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
5.0 KiB
C++

#include "app.h"
#include "SPIFFS.h"
#include "ESPAsyncWebServer.h"
#include "AsyncJson.h"
#include "ArduinoJson.h"
#include "settings.h"
#include "device.h"
AsyncWebServer server(80);
void setupSettingsGet();
void setupSettingsPost();
void setupWifiScan();
void setupWifiConnect();
void setupCurrentImage();
void setupApp()
{
Serial.println("setup configure");
if (!SPIFFS.begin())
{
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
// @see https://github.com/me-no-dev/ESPAsyncWebServer
// @see https://arduinojson.org/v6/assistant/
// serve static files
server
.serveStatic("/", SPIFFS, "/dist/")
.setDefaultFile("index.html")
.setCacheControl("max-age=600");
setupSettingsGet();
setupSettingsPost();
setupWifiScan();
setupWifiConnect();
setupCurrentImage();
// TODO response
server.on("/stats", HTTP_GET, [](AsyncWebServerRequest *request) {
AsyncResponseStream *response = request->beginResponseStream("application/json");
DynamicJsonDocument root(1024);
root["heap"] = ESP.getFreeHeap();
root["wifi"] = WiFi.SSID();
root["sleep"] = 97;
serializeJson(root, *response);
request->send(response);
});
// CORS
//DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
server.begin();
Serial.println("setup configure - done");
}
void setupSettingsGet()
{
server.on("/api/settings", HTTP_GET, [](AsyncWebServerRequest *request) {
AsyncResponseStream *response = request->beginResponseStream("application/json");
DynamicJsonDocument root(1024);
//root["wifi_ssid"] = NVS.getString("wifi_ssid");
root["device_mode"] = NVS.getString("device_mode");
root["device_rotation"] = 0;
root["cloud_server"] = NVS.getString("cloud_server");
serializeJson(root, *response);
request->send(response);
});
}
void setupSettingsPost()
{
server.on("/api/settings", HTTP_PUT, [](AsyncWebServerRequest *request) { /* nothing and dont remove it */ }, NULL, [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) {
DynamicJsonDocument doc(1024);
DeserializationError error = deserializeJson(doc, data);
if (error) {
Serial.print(F("deserializeJson() failed with code "));
Serial.println(error.c_str());
request->send(404, "text/plain", "");
}
else
{
if (doc.containsKey("device_mode")) {
NVS.setString("device_mode", doc["device_mode"]);
}
if (doc.containsKey("cloud_server")) {
NVS.setString("cloud_server", doc["cloud_server"]);
//Serial.println(doc["cloud_server"].as<char*>());
}
request->send(200, "application/ld+json; charset=utf-8", "{}");
} });
}
/**
* @todo
*/
void setupCurrentImage()
{
server.on("/current-image", HTTP_GET, [](AsyncWebServerRequest *request) {
Serial.println("/current-image");
request->send(SPIFFS, "/currentImage.bin", "image/x-bmp");
});
/*
server.on("/current-image2", HTTP_GET, [](AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/currentImage.bin", "image/x-bmp"); // image/x-bmp | image/vnd.wap.wbmp
//response->addHeader("Content-Encoding", "gzip");
//response->addHeader("Content-Disposition", "inline; filename=\"image.wbmp\"");
request->send(response);
});
*/
}
/**
* @todo
*/
void setupWifiScan()
{
//First request will return 0 results unless you start scan from somewhere else (loop/setup)
//Do not request more often than 3-5 seconds
server.on("/api/wifi/scan", HTTP_GET, [](AsyncWebServerRequest *request) {
String json = "[";
int n = WiFi.scanComplete();
if (n == -2)
{
WiFi.scanNetworks(true);
}
else if (n)
{
for (int i = 0; i < n; ++i)
{
if (i)
{
json += ",";
}
json += "{";
json += "\"rssi\":" + String(WiFi.RSSI(i));
json += ",\"ssid\":\"" + WiFi.SSID(i) + "\"";
json += ",\"bssid\":\"" + WiFi.BSSIDstr(i) + "\"";
json += ",\"channel\":" + String(WiFi.channel(i));
json += ",\"secure\":" + String(WiFi.encryptionType(i));
json += "}";
}
WiFi.scanDelete();
if (WiFi.scanComplete() == -2)
{
WiFi.scanNetworks(true);
}
}
json += "]";
request->send(200, "application/json", json);
json = String();
});
}
/**
* @todo
*/
void setupWifiConnect()
{
server.on("/api/wifi/connect", HTTP_PUT, [](AsyncWebServerRequest *request) { /* nothing and dont remove it */ }, NULL, [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) {
DynamicJsonDocument doc(1024);
Serial.println("/api/wifi/connect");
DeserializationError error = deserializeJson(doc, data);
if (error) {
Serial.print(F("deserializeJson() failed with code "));
Serial.println(error.c_str());
request->send(404, "text/plain", "");
}
else
{
if (doc.containsKey("user")) {
//NVS.setString("device_mode", doc["device_mode"]);
}
if (doc.containsKey("password")) {
//NVS.setString("cloud_server", doc["cloud_server"]);
//Serial.println(doc["cloud_server"].as<char*>());
}
request->send(200, "application/ld+json; charset=utf-8", "{}");
} });
}