Switched to me-no-dev's ESPAsyncWebserver
This commit is contained in:
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}};
|
}};
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user