From 5bac99831a335c83366e304761e8665d1c99559a Mon Sep 17 00:00:00 2001 From: Thomas Ballmann Date: Fri, 13 Nov 2020 18:54:01 +0100 Subject: [PATCH] improve api device code add scan for paperdash devices --- lib/app/app.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/lib/app/app.cpp b/lib/app/app.cpp index 16d8d2c..c79e1dd 100644 --- a/lib/app/app.cpp +++ b/lib/app/app.cpp @@ -2,6 +2,7 @@ #include #include "app.h" #include "ESPAsyncWebServer.h" +#include #include "ArduinoJson.h" #include "settings.h" #include "device.h" @@ -15,6 +16,7 @@ AsyncWebServer server(80); +void setupApiDevice(); void setupSettingsGet(); void setupSettingsPost(); void setupWifiScan(); @@ -45,6 +47,7 @@ void setupApp() ; server.serveStatic("/fs/", SPIFFS, "/"); + setupApiDevice(); setupSettingsGet(); setupSettingsPost(); setupWifiScan(); @@ -225,6 +228,7 @@ void setupSettingsPost() /** * get current screen + * @depricated */ void setupCurrentImage() { @@ -247,7 +251,7 @@ void setupCurrentImage() //index equals the amount of bytes that have been already sent //You will be asked for more data until 0 is returned //Keep in mind that you can not delay or yield waiting for more data! - return displayStreamPrintScreenBMP(buffer, maxLen, index); + return displaySnapshotBMPStream(buffer, maxLen, index); }); response->addHeader("Content-Disposition", "inline; filename=capture.bmp"); @@ -255,6 +259,99 @@ void setupCurrentImage() }); } +void setupApiDevice() +{ + server.on("/api/device/restart", HTTP_GET, [](AsyncWebServerRequest *request) { + request->send(200, "application/json", "{}"); + + ESP.restart(); + }); + + server.on("/api/device/screen", HTTP_GET, [](AsyncWebServerRequest *request) { + AsyncWebServerResponse *response = request->beginChunkedResponse("image/bmp", [](uint8_t *buffer, size_t maxLen, size_t index) -> size_t { + return displaySnapshotBMPStream(buffer, maxLen, index); + }); + + response->addHeader("Content-Disposition", "inline; filename=capture.bmp"); + request->send(response); + }); + + server.on( + "/api/device/screen", HTTP_POST, [](AsyncWebServerRequest *request) { + AsyncResponseStream *response = request->beginResponseStream("application/json"); + DynamicJsonDocument doc(117); // https://arduinojson.org/v6/assistant/ + + // todo + doc["status"] = true; + doc["image"]["format"] = "xxx"; + doc["image"]["width"] = 0; + doc["image"]["height"] = 0; + + serializeJson(doc, *response); + request->send(response); }, + [](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) { + if (!index) + { + Serial.printf("UploadStart: %s\n", filename.c_str()); + bool dither = strcmp(filename.c_str(), "dithering") == 0; + + ImageNew(0, 0, 0, 0, dither); + PlaylistResetTimer(); + } + + ImageWriteBuffer(data, len); + + if (final) + { + Serial.printf("UploadEnd: %s, %u B\n", filename.c_str(), index + len); + ImageFlushBuffer(); + + updateDisplayRequired = true; + } + }); + + server.on("/api/device/scan", HTTP_GET, [](AsyncWebServerRequest *request) { + String json = "["; + Serial.printf("Browsing for service _%s._%s.local. ... ", "http", "tcp"); + int n = MDNS.queryService("http", "tcp"); + if (n == 0) + { + Serial.println("no services found"); + } + else + { + Serial.print(n); + Serial.println(" service(s) found"); + + size_t cnt = 0; + for (size_t i = 0; i < n; ++i) + { + // checking for epd + if (MDNS.hasTxt(i, "paperdash")) + { + if (cnt) + { + json += ","; + } + cnt++; + + json += "{"; + json += "\"host\":\"" + MDNS.hostname(i) + "\""; + json += ",\"ip\":\"" + MDNS.IP(i).toString() + "\""; + json += ",\"port\":" + String(MDNS.port(i)); + json += ",\"type\":\"" + String(MDNS.txt(i, 0)) + "\""; + json += "}"; + } + } + } + Serial.println(); + + json += "]"; + request->send(200, "application/json", json); + json = String(); + }); +} + /** * scan for wifi */ @@ -335,6 +432,9 @@ void setupWifiConnect() } }); } +/** + * @depricated + */ static void handle_update_progress_cb(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) { if (!index) @@ -357,6 +457,9 @@ static void handle_update_progress_cb(AsyncWebServerRequest *request, String fil } } +/** + * @depricated + */ void setupApiFace() { server.on(