From 4453cf5d4c3a67181675b587a807363dc587ed55 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sat, 2 Jan 2021 20:43:46 +0100 Subject: [PATCH] Switched to me-no-dev's ESPAsyncWebserver --- platformio.ini | 5 +- src/bobby_webserver.h | 155 +++++++++++++++++++++--------------------- src/icons/logo.h | 2 +- 3 files changed, 82 insertions(+), 80 deletions(-) diff --git a/platformio.ini b/platformio.ini index ebc57a6..7ddb726 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,6 +20,7 @@ platform_packages = lib_deps = TFT_eSPI https://github.com/Ferdi265/cxx-ring-buffer + https://github.com/0xFEEDC0DE64/ESPAsyncWebServer lib_compat_mode = strict build_unflags = @@ -151,8 +152,8 @@ build_flags = -DDEFAULT_GASMAX=3700 -DDEFAULT_BREMSMIN=1300 -DDEFAULT_BREMSMAX=4000 -; -DFEATURE_BLUETOOTH -; -DFEATURE_BMS + -DFEATURE_BLUETOOTH + -DFEATURE_BMS ; -DFEATURE_GAMETRAK ; -DPINS_GAMETRAKX=34 ; -DPINS_GAMETRAKY=39 diff --git a/src/bobby_webserver.h b/src/bobby_webserver.h index 923b033..6172407 100644 --- a/src/bobby_webserver.h +++ b/src/bobby_webserver.h @@ -1,231 +1,233 @@ #pragma once -#include +#include #include "screens.h" namespace { #ifdef FEATURE_WEBSERVER -WebServer webServer{80}; +AsyncWebServer webServer{80}; class HtmlTag { public: - HtmlTag(const String &tagName, String &content) : + HtmlTag(const char *tagName, AsyncResponseStream *response) : m_tagName{tagName}, - m_content{content} + m_response{response} { - content += "<" + tagName + ">"; + m_response->printf("<%s>", m_tagName); } ~HtmlTag() { - m_content += ""; + m_response->printf("", m_tagName); } private: - const String m_tagName; - String &m_content; + const char * const m_tagName; + AsyncResponseStream * const m_response; }; void initWebserver() { - webServer.on("/", HTTP_GET, [](){ - webServer.sendHeader("Connection", "close"); + DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); - String content; + webServer.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ + AsyncResponseStream *response = request->beginResponseStream("text/html"); { - HtmlTag htmlTag{"html", content}; + HtmlTag htmlTag{"html", response}; { - HtmlTag headTag{"head", content}; + HtmlTag headTag{"head", response}; { - HtmlTag titleTag{"title", content}; - content += "Bobbycar remote"; + HtmlTag titleTag{"title", response}; + response->print("Bobbycar remote"); } - content += ""; + response->print(""); } { - HtmlTag bodyTag{"body", content}; + HtmlTag bodyTag{"body", response}; { - HtmlTag h1Tag{"h1", content}; - content += "Bobbycar remote"; + HtmlTag h1Tag{"h1", response}; + response->print("Bobbycar remote"); } { - HtmlTag pTag{"p", content}; - - content += "Up Down Confirm Back"; + HtmlTag pTag{"p", response}; + response->print("Up " + "Down " + "Confirm " + "Back"); } if (auto constCurrentDisplay = static_cast(currentDisplay)) { if (const auto *textInterface = constCurrentDisplay->asTextInterface()) { - HtmlTag h2Tag{"h2", content}; - content += textInterface->text(); + HtmlTag h2Tag{"h2", response}; + response->print(textInterface->text()); } if (const auto *menuDisplay = constCurrentDisplay->asMenuDisplay()) { - HtmlTag ulTag{"ul", content}; + HtmlTag ulTag{"ul", response}; int i{0}; menuDisplay->runForEveryMenuItem([&,selectedIndex=menuDisplay->selectedIndex()](const MenuItem &menuItem){ - content += "print("print(" style=\"border: 1px solid black;\""); - content += ">"; - content += menuItem.text(); - content += ""; + response->print(">print(i); + response->print("\">"); + response->print(menuItem.text()); + response->print(""); i++; }); } else if (const auto *changeValueDisplay = constCurrentDisplay->asChangeValueDisplayInterface()) { - content += "
"; - content += "shownValue()} + "\" />"; - content += ""; - content += "
"; + response->print("
"); + response->print("shownValue()} + "\" />"); + response->print(""); + response->print("
"); } else { - content += "No web control implemented for current display."; + response->print("No web control implemented for current display."); } } else { - content += "Currently no screen instantiated."; + response->print("Currently no screen instantiated."); } } } - webServer.send(200, "text/html", content); + request->send(response); }); - webServer.on("/up", HTTP_GET, [](){ + webServer.on("/up", HTTP_GET, [](AsyncWebServerRequest *request){ InputDispatcher::rotate(-1); - webServer.sendHeader("Connection", "close"); - webServer.sendHeader("Location", "/"); - webServer.send(302, "text/html", "ok"); + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok"); + response->addHeader("Location", "/"); + request->send(response); }); - webServer.on("/down", HTTP_GET, [](){ + webServer.on("/down", HTTP_GET, [](AsyncWebServerRequest *request){ InputDispatcher::rotate(1); - webServer.sendHeader("Connection", "close"); - webServer.sendHeader("Location", "/"); - webServer.send(302, "text/html", "ok"); + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok"); + response->addHeader("Location", "/"); + request->send(response); }); - webServer.on("/confirm", HTTP_GET, [](){ + webServer.on("/confirm", HTTP_GET, [](AsyncWebServerRequest *request){ InputDispatcher::confirmButton(true); InputDispatcher::confirmButton(false); - webServer.sendHeader("Connection", "close"); - webServer.sendHeader("Location", "/"); - webServer.send(302, "text/html", "ok"); + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok"); + response->addHeader("Location", "/"); + request->send(response); }); - webServer.on("/back", HTTP_GET, [](){ + webServer.on("/back", HTTP_GET, [](AsyncWebServerRequest *request){ InputDispatcher::backButton(true); InputDispatcher::backButton(false); - webServer.sendHeader("Connection", "close"); - webServer.sendHeader("Location", "/"); - webServer.send(302, "text/html", "ok"); + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok"); + response->addHeader("Location", "/"); + request->send(response); }); - webServer.on("/triggerItem", HTTP_GET, [](){ - if (!webServer.hasArg("index")) + webServer.on("/triggerItem", HTTP_GET, [](AsyncWebServerRequest *request){ + if (!request->hasArg("index")) { - webServer.send(400, "text/plain", "index parameter missing"); + request->send(400, "text/plain", "index parameter missing"); return; } if (!currentDisplay) { - webServer.send(400, "text/plain", "currentDisplay is null"); + request->send(400, "text/plain", "currentDisplay is null"); return; } auto *menuDisplay = currentDisplay->asMenuDisplay(); if (!menuDisplay) { - webServer.send(400, "text/plain", "currentDisplay is not a menu display"); + request->send(400, "text/plain", "currentDisplay is not a menu display"); return; } - const auto indexStr = webServer.arg("index"); + const auto indexStr = request->arg("index"); char *ptr; const auto index = std::strtol(std::begin(indexStr), &ptr, 10); if (ptr != std::end(indexStr)) { - webServer.send(400, "text/plain", "index could not be parsed"); + request->send(400, "text/plain", "index could not be parsed"); return; } if (index < 0 || index >= menuDisplay->size()) { - webServer.send(400, "text/plain", "index out of range"); + request->send(400, "text/plain", "index out of range"); return; } menuDisplay->getMenuItem(index).triggered(); - webServer.sendHeader("Connection", "close"); - webServer.sendHeader("Location", "/"); - webServer.send(302, "text/html", "ok"); + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok"); + response->addHeader("Location", "/"); + request->send(response); }); - webServer.on("/setValue", HTTP_GET, [](){ - if (!webServer.hasArg("value")) + webServer.on("/setValue", HTTP_GET, [](AsyncWebServerRequest *request){ + if (!request->hasArg("value")) { - webServer.send(400, "text/plain", "value parameter missing"); + request->send(400, "text/plain", "value parameter missing"); return; } if (!currentDisplay) { - webServer.send(400, "text/plain", "currentDisplay is null"); + request->send(400, "text/plain", "currentDisplay is null"); return; } auto *changeValueDisplay = currentDisplay->asChangeValueDisplayInterface(); if (!changeValueDisplay) { - webServer.send(400, "text/plain", "currentDisplay is not a change value display"); + request->send(400, "text/plain", "currentDisplay is not a change value display"); return; } - const auto valueStr = webServer.arg("value"); + const auto valueStr = request->arg("value"); char *ptr; const auto value = std::strtol(std::begin(valueStr), &ptr, 10); if (ptr != std::end(valueStr)) { - webServer.send(400, "text/plain", "value could not be parsed"); + request->send(400, "text/plain", "value could not be parsed"); return; } changeValueDisplay->setShownValue(value); - webServer.sendHeader("Connection", "close"); - webServer.sendHeader("Location", "/"); - webServer.send(302, "text/html", "ok"); + AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok"); + response->addHeader("Location", "/"); + request->send(response); }); webServer.begin(); @@ -233,7 +235,6 @@ void initWebserver() void handleWebserver() { - webServer.handleClient(); } #endif } diff --git a/src/icons/logo.h b/src/icons/logo.h index 31d0de2..3450bfc 100644 --- a/src/icons/logo.h +++ b/src/icons/logo.h @@ -1956,5 +1956,5 @@ const Icon<240, 130> logo{{ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79D0 (31184) pixels 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79E0 (31200) pixels }}; -}; +} }