Switched to me-no-dev's ESPAsyncWebserver

This commit is contained in:
2021-01-02 20:43:46 +01:00
parent 19f2d43cf6
commit 4453cf5d4c
3 changed files with 82 additions and 80 deletions

View File

@ -20,6 +20,7 @@ platform_packages =
lib_deps = lib_deps =
TFT_eSPI TFT_eSPI
https://github.com/Ferdi265/cxx-ring-buffer https://github.com/Ferdi265/cxx-ring-buffer
https://github.com/0xFEEDC0DE64/ESPAsyncWebServer
lib_compat_mode = strict lib_compat_mode = strict
build_unflags = build_unflags =
@ -151,8 +152,8 @@ build_flags =
-DDEFAULT_GASMAX=3700 -DDEFAULT_GASMAX=3700
-DDEFAULT_BREMSMIN=1300 -DDEFAULT_BREMSMIN=1300
-DDEFAULT_BREMSMAX=4000 -DDEFAULT_BREMSMAX=4000
; -DFEATURE_BLUETOOTH -DFEATURE_BLUETOOTH
; -DFEATURE_BMS -DFEATURE_BMS
; -DFEATURE_GAMETRAK ; -DFEATURE_GAMETRAK
; -DPINS_GAMETRAKX=34 ; -DPINS_GAMETRAKX=34
; -DPINS_GAMETRAKY=39 ; -DPINS_GAMETRAKY=39

View File

@ -1,231 +1,233 @@
#pragma once #pragma once
#include <WebServer.h> #include <ESPAsyncWebServer.h>
#include "screens.h" #include "screens.h"
namespace { namespace {
#ifdef FEATURE_WEBSERVER #ifdef FEATURE_WEBSERVER
WebServer webServer{80}; AsyncWebServer webServer{80};
class HtmlTag { class HtmlTag {
public: public:
HtmlTag(const String &tagName, String &content) : HtmlTag(const char *tagName, AsyncResponseStream *response) :
m_tagName{tagName}, m_tagName{tagName},
m_content{content} m_response{response}
{ {
content += "<" + tagName + ">"; m_response->printf("<%s>", m_tagName);
} }
~HtmlTag() ~HtmlTag()
{ {
m_content += "</" + m_tagName + ">"; m_response->printf("</%s>", m_tagName);
} }
private: private:
const String m_tagName; const char * const m_tagName;
String &m_content; AsyncResponseStream * const m_response;
}; };
void initWebserver() void initWebserver()
{ {
webServer.on("/", HTTP_GET, [](){ DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
webServer.sendHeader("Connection", "close");
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}; HtmlTag titleTag{"title", response};
content += "Bobbycar remote"; response->print("Bobbycar remote");
} }
content += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\" />"; response->print("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\" />");
} }
{ {
HtmlTag bodyTag{"body", content}; HtmlTag bodyTag{"body", response};
{ {
HtmlTag h1Tag{"h1", content}; HtmlTag h1Tag{"h1", response};
content += "Bobbycar remote"; response->print("Bobbycar remote");
} }
{ {
HtmlTag pTag{"p", content}; HtmlTag pTag{"p", response};
response->print("<a href=\"/up\">Up</a> "
content += "<a href=\"/up\">Up</a> <a href=\"/down\">Down</a> <a href=\"/confirm\">Confirm</a> <a href=\"/back\">Back</a>"; "<a href=\"/down\">Down</a> "
"<a href=\"/confirm\">Confirm</a> "
"<a href=\"/back\">Back</a>");
} }
if (auto constCurrentDisplay = static_cast<const Display *>(currentDisplay)) if (auto constCurrentDisplay = static_cast<const Display *>(currentDisplay))
{ {
if (const auto *textInterface = constCurrentDisplay->asTextInterface()) if (const auto *textInterface = constCurrentDisplay->asTextInterface())
{ {
HtmlTag h2Tag{"h2", content}; HtmlTag h2Tag{"h2", response};
content += textInterface->text(); response->print(textInterface->text());
} }
if (const auto *menuDisplay = constCurrentDisplay->asMenuDisplay()) if (const auto *menuDisplay = constCurrentDisplay->asMenuDisplay())
{ {
HtmlTag ulTag{"ul", content}; HtmlTag ulTag{"ul", response};
int i{0}; int i{0};
menuDisplay->runForEveryMenuItem([&,selectedIndex=menuDisplay->selectedIndex()](const MenuItem &menuItem){ menuDisplay->runForEveryMenuItem([&,selectedIndex=menuDisplay->selectedIndex()](const MenuItem &menuItem){
content += "<li"; response->print("<li");
if (i == selectedIndex) if (i == selectedIndex)
content += " style=\"border: 1px solid black;\""; response->print(" style=\"border: 1px solid black;\"");
content += "><a href=\"/triggerItem?index="; response->print("><a href=\"/triggerItem?index=");
content += i; response->print(i);
content += "\">"; response->print("\">");
content += menuItem.text(); response->print(menuItem.text());
content += "</a></li>"; response->print("</a></li>");
i++; i++;
}); });
} }
else if (const auto *changeValueDisplay = constCurrentDisplay->asChangeValueDisplayInterface()) else if (const auto *changeValueDisplay = constCurrentDisplay->asChangeValueDisplayInterface())
{ {
content += "<form action=\"/setValue\" method=\"GET\">"; response->print("<form action=\"/setValue\" method=\"GET\">");
content += "<input type=\"number\" name=\"value\" value=\"" + String{changeValueDisplay->shownValue()} + "\" />"; response->print("<input type=\"number\" name=\"value\" value=\"" + String{changeValueDisplay->shownValue()} + "\" />");
content += "<button type=\"submit\">Update</button>"; response->print("<button type=\"submit\">Update</button>");
content += "</form>"; response->print("</form>");
} }
else else
{ {
content += "No web control implemented for current display."; response->print("No web control implemented for current display.");
} }
} }
else 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); InputDispatcher::rotate(-1);
webServer.sendHeader("Connection", "close"); AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok");
webServer.sendHeader("Location", "/"); response->addHeader("Location", "/");
webServer.send(302, "text/html", "ok"); request->send(response);
}); });
webServer.on("/down", HTTP_GET, [](){ webServer.on("/down", HTTP_GET, [](AsyncWebServerRequest *request){
InputDispatcher::rotate(1); InputDispatcher::rotate(1);
webServer.sendHeader("Connection", "close"); AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok");
webServer.sendHeader("Location", "/"); response->addHeader("Location", "/");
webServer.send(302, "text/html", "ok"); request->send(response);
}); });
webServer.on("/confirm", HTTP_GET, [](){ webServer.on("/confirm", HTTP_GET, [](AsyncWebServerRequest *request){
InputDispatcher::confirmButton(true); InputDispatcher::confirmButton(true);
InputDispatcher::confirmButton(false); InputDispatcher::confirmButton(false);
webServer.sendHeader("Connection", "close"); AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok");
webServer.sendHeader("Location", "/"); response->addHeader("Location", "/");
webServer.send(302, "text/html", "ok"); request->send(response);
}); });
webServer.on("/back", HTTP_GET, [](){ webServer.on("/back", HTTP_GET, [](AsyncWebServerRequest *request){
InputDispatcher::backButton(true); InputDispatcher::backButton(true);
InputDispatcher::backButton(false); InputDispatcher::backButton(false);
webServer.sendHeader("Connection", "close"); AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok");
webServer.sendHeader("Location", "/"); response->addHeader("Location", "/");
webServer.send(302, "text/html", "ok"); request->send(response);
}); });
webServer.on("/triggerItem", HTTP_GET, [](){ webServer.on("/triggerItem", HTTP_GET, [](AsyncWebServerRequest *request){
if (!webServer.hasArg("index")) if (!request->hasArg("index"))
{ {
webServer.send(400, "text/plain", "index parameter missing"); request->send(400, "text/plain", "index parameter missing");
return; return;
} }
if (!currentDisplay) if (!currentDisplay)
{ {
webServer.send(400, "text/plain", "currentDisplay is null"); request->send(400, "text/plain", "currentDisplay is null");
return; return;
} }
auto *menuDisplay = currentDisplay->asMenuDisplay(); auto *menuDisplay = currentDisplay->asMenuDisplay();
if (!menuDisplay) 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; return;
} }
const auto indexStr = webServer.arg("index"); const auto indexStr = request->arg("index");
char *ptr; char *ptr;
const auto index = std::strtol(std::begin(indexStr), &ptr, 10); const auto index = std::strtol(std::begin(indexStr), &ptr, 10);
if (ptr != std::end(indexStr)) 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; return;
} }
if (index < 0 || index >= menuDisplay->size()) 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; return;
} }
menuDisplay->getMenuItem(index).triggered(); menuDisplay->getMenuItem(index).triggered();
webServer.sendHeader("Connection", "close"); AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok");
webServer.sendHeader("Location", "/"); response->addHeader("Location", "/");
webServer.send(302, "text/html", "ok"); request->send(response);
}); });
webServer.on("/setValue", HTTP_GET, [](){ webServer.on("/setValue", HTTP_GET, [](AsyncWebServerRequest *request){
if (!webServer.hasArg("value")) if (!request->hasArg("value"))
{ {
webServer.send(400, "text/plain", "value parameter missing"); request->send(400, "text/plain", "value parameter missing");
return; return;
} }
if (!currentDisplay) if (!currentDisplay)
{ {
webServer.send(400, "text/plain", "currentDisplay is null"); request->send(400, "text/plain", "currentDisplay is null");
return; return;
} }
auto *changeValueDisplay = currentDisplay->asChangeValueDisplayInterface(); auto *changeValueDisplay = currentDisplay->asChangeValueDisplayInterface();
if (!changeValueDisplay) 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; return;
} }
const auto valueStr = webServer.arg("value"); const auto valueStr = request->arg("value");
char *ptr; char *ptr;
const auto value = std::strtol(std::begin(valueStr), &ptr, 10); const auto value = std::strtol(std::begin(valueStr), &ptr, 10);
if (ptr != std::end(valueStr)) 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; return;
} }
changeValueDisplay->setShownValue(value); changeValueDisplay->setShownValue(value);
webServer.sendHeader("Connection", "close"); AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "ok");
webServer.sendHeader("Location", "/"); response->addHeader("Location", "/");
webServer.send(302, "text/html", "ok"); request->send(response);
}); });
webServer.begin(); webServer.begin();
@ -233,7 +235,6 @@ void initWebserver()
void handleWebserver() void handleWebserver()
{ {
webServer.handleClient();
} }
#endif #endif
} }

View File

@ -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, // 0x79D0 (31184) pixels
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79E0 (31200) pixels 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x79E0 (31200) pixels
}}; }};
}; }
} }