diff --git a/app/src/api/core.js b/app/src/api/core.js index bbe0aa6..7dd5a1c 100644 --- a/app/src/api/core.js +++ b/app/src/api/core.js @@ -3,11 +3,17 @@ */ const _settings = { + // connected wifi "wifi_ssid": "", + // oparation mode "device_mode": "active", - // deep sleep + // Set rotation setting for display + // 0 thru 3 corresponding to 4 cardinal rotations + "device_rotation": 0, + + // deep sleep timer "cloud_refresh": 97 } diff --git a/src/app.cpp b/src/app.cpp index 5c7b2cb..3381271 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -3,12 +3,17 @@ #include "ESPAsyncWebServer.h" #include "AsyncJson.h" #include "ArduinoJson.h" +#include "settings.h" // https://techtutorialsx.com/2018/09/17/esp32-arduino-web-server-serving-external-css-file/ // https://docs.platformio.org/en/latest/platforms/espressif8266.html#uploading-files-to-file-system-spiffs AsyncWebServer server(80); +void setupSettingsGet(); +void setupSettingsPost(); +void setupWifiScan(); +void setupWifiConnect(); void setupApp() { @@ -21,6 +26,7 @@ void setupApp() // @see https://github.com/me-no-dev/ESPAsyncWebServer + // @see https://arduinojson.org/v6/assistant/ // serve static files server @@ -29,6 +35,11 @@ void setupApp() .setCacheControl("max-age=600") ; + setupSettingsGet(); + setupSettingsPost(); + setupWifiScan(); + setupWifiConnect(); + // TODO response server.on("/test", HTTP_GET, [] (AsyncWebServerRequest *request) { @@ -43,16 +54,127 @@ void setupApp() }); - // TODO request - AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/rest/endpoint", [](AsyncWebServerRequest *request, JsonVariant &json) { + // 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["heap"] = ESP.getFreeHeap(); + // NVS.getString("wifi_ssid"); + root["wifi_ssid"] = NVS.getString("wifi_ssid"); // WiFi.SSID(); + root["device_mode"] = "active"; + root["device_rotation"] = 0; + root["cloud_refresh"] = 97; // aktueller sleep timer + + serializeJson(root, *response); + request->send(response); + }); + +} + + +void setupSettingsPost() +{ + AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/api/settings", [](AsyncWebServerRequest *request, JsonVariant &json) { JsonObject jsonObj = json.to(); + Serial.println("/api/settings"); + + NVS.setString("wifi_ssid", jsonObj["wifi_ssid"], true); + + +/* + char hostname[64]; + + strlcpy(hostname, // <- destination + jsonObj["wifi_ssid"] | "example.com", // <- source + sizeof(hostname)); // <- destination's capacity +*/ + Serial.println(NVS.getString("wifi_ssid")); + // ... }); server.addHandler(handler); - server.begin(); +} - Serial.println("setup configure - done"); + +void setupCurrentImage() +{ + server.on("/current-image", HTTP_GET, [] (AsyncWebServerRequest *request) { + + + AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/currentImage.bin", "image/vnd.wap.wbmp"); + //response->addHeader("Content-Encoding", "gzip"); + + + request->send(response); + }); + +} + + +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(); + }); +} + + +void setupWifiConnect() +{ + AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/api/wifi/connect", [](AsyncWebServerRequest *request, JsonVariant &json) { + //JsonObject jsonObj = json.to(); + // TODO save settings + + + AsyncResponseStream *response = request->beginResponseStream("application/json"); + + DynamicJsonDocument root(1024); + root["status"] = true; + root["message"] = ""; + + serializeJson(root, *response); + request->send(response); + + // ist ein restart wichtig? + //ESP.restart(); + + }); + server.addHandler(handler); } \ No newline at end of file diff --git a/src/cloud.cpp b/src/cloud.cpp index 651dd9d..c519d7a 100644 --- a/src/cloud.cpp +++ b/src/cloud.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "settings.h" #include "display.h" @@ -9,7 +10,7 @@ // TODO SMART SIGN CONFIG ======== #define config_PullServer "http://paperdash.sonic.da-tom.com/gateway.php/" // pull server address -String config_UUID = "22805938-2280-8022-3822-385980225980"; // TODO +String config_UUID = "22805938-2280-8022-3822-385980225980"; // TODO //String config_PullServer; //String config_UUID; @@ -20,8 +21,7 @@ const char *setting_HeaderKeys[] = { // update deep sleep interval "DeepSleepInterval", // execute firmware update url - "UpdateFirmware" -}; + "UpdateFirmware"}; //#include //#define FRAME_BUFFERBUFFE_SIZE GxEPD2_750::WIDTH *GxEPD2_750::HEIGHT / 8 @@ -31,7 +31,6 @@ HTTPClient http; void pullData(); - void setupCloud() { Serial.println("setup cloud"); @@ -40,7 +39,6 @@ void setupCloud() //config_PullServer = NVS.getString("cloud_gateway"); config_UUID = NVS.getString("cloud_uuid"); - http.useHTTP10(true); // http1.1 chunked übertragung funktioniert irgendwie nicht http.setTimeout(7000); http.collectHeaders(setting_HeaderKeys, sizeof(setting_HeaderKeys) / sizeof(char *)); @@ -50,7 +48,7 @@ void setupCloud() void loopCloud() { - pullData(); + pullData(); } /** @@ -90,7 +88,6 @@ void pullData() deviceSetSleepInterval(DeepSleepInterval.toInt()); } - // update to new firmware String UpdateFirmware = http.header("UpdateFirmware"); if (UpdateFirmware.length() > 0) @@ -116,6 +113,13 @@ void pullData() int imageBufferOffset = 0; displayOpenFramebuffer(); + // persist image to display + File file = SPIFFS.open("/currentImage.bin", FILE_WRITE); + if (!file) + { + Serial.println("Failed to open file for writing"); + } + // read all data from server while (http.connected() && (len > 0 || len == -1)) { @@ -127,9 +131,16 @@ void pullData() // read up to 128 byte int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); + // write to storage + if (file) + { + file.write(buff, c); + } + + // write display frame displayWriteFramebuffer(imageBufferOffset, buff, c); imageBufferOffset += c; -/* + /* for (int i = 0; i < c; i++) { // write to display buffer @@ -163,6 +174,11 @@ void pullData() delay(1); } + if (file) + { + file.close(); + } + // done displayFlushFramebuffer(); } diff --git a/src/settings.cpp b/src/settings.cpp index 858c46c..ec98b62 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1,5 +1,8 @@ #include "settings.h" +// setting keys +const char *config_DeviceCurrentImage = "/currentImage.bin"; + void setupSettings() {