Hi ich habe Problem ich wollt diese Projekt machen GitHub - mzashh/HUB75-Pixel-Art-Display: A WIFI enabled LED Pixel Art Display based on HUB75 panels driven by the ESP32
PlatformionIO
Ich habe die Libraries
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/.pio/libdeps/nodemcu-32s
Kopiert und
main.cpp
webpages.h
webserver.ino
sind in /home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src
Wenn ich den Code Build kommt diese Wall auf Text
* Executing task in folder HUB75-Pixel-Art-Display: platformio run
Processing nodemcu-32s (platform: espressif32; board: nodemcu-32s; framework: arduino)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/nodemcu-32s.html
PLATFORM: Espressif 32 (6.10.0) > NodeMCU-32S
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
- framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b
- tool-esptoolpy @ 1.40501.0 (4.5.1)
- toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Converting webserver.ino
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 40 compatible libraries
Scanning dependencies...
Dependency Graph
|-- AnimatedGIF @ 2.2.0
|-- AsyncTCP @ 3.4.2
|-- ESP32 HUB75 LED MATRIX PANEL DMA Display @ 3.0.12
|-- ESPAsyncWebServer @ 3.7.7
|-- GFX_Lite @ 1.0.0
|-- LittleFS @ 2.0.0
|-- WiFi @ 2.0.0
Building in release mode
Compiling .pio/build/nodemcu-32s/src/main.cpp.o
Compiling .pio/build/nodemcu-32s/src/webserver.ino.cpp.o
In file included from src/main.cpp:9:
.pio/libdeps/nodemcu-32s/ESP32-HUB75-MatrixPanel-DMA-master/src/ESP32-HUB75-MatrixPanel-I2S-DMA.h:19:12: fatal error: Adafruit_GFX.h: No such file or directory
**********************************************************************
* Looking for Adafruit_GFX.h dependency? Check our library registry!
*
* CLI > platformio lib search "header:Adafruit_GFX.h"
* Web > https://registry.platformio.org/search?q=header:Adafruit_GFX.h
*
**********************************************************************
#include "Adafruit_GFX.h" // Adafruit class with all the other stuff
^~~~~~~~~~~~~~~~
compilation terminated.
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:3:15: error: variable or field 'notFound' declared void
String processor(const String& var) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:3:15: error: 'AsyncWebServerRequest' was not declared in this scope
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:3:38: error: 'request' was not declared in this scope
String processor(const String& var) {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:3:38: note: suggested alternative: 'renameat'
String processor(const String& var) {
^
renameat
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:4:23: error: 'AsyncWebServerRequest' was not declared in this scope
if (var == "FIRMWARE") {
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:4:47: error: 'request' was not declared in this scope
if (var == "FIRMWARE") {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:4:47: note: suggested alternative: 'renameat'
if (var == "FIRMWARE") {
^
renameat
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:19: error: variable or field 'handleUpload' declared void
return FIRMWARE_VERSION;
^~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:19: error: 'AsyncWebServerRequest' was not declared in this scope
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:42: error: 'request' was not declared in this scope
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:42: note: suggested alternative: 'renameat'
return FIRMWARE_VERSION;
^
renameat
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:58: error: expected primary-expression before 'filename'
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:75: error: expected primary-expression before 'index'
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:90: error: expected primary-expression before '*' token
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:91: error: 'data' was not declared in this scope
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:91: note: suggested alternative: 'atan'
return FIRMWARE_VERSION;
^
atan
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:104: error: expected primary-expression before 'len'
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:109: error: expected primary-expression before 'bool'
return FIRMWARE_VERSION;
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'String processor(const String&)':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:12: error: 'FIRMWARE_VERSION' was not declared in this scope
return FIRMWARE_VERSION;
^~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:5:12: note: suggested alternative: 'ESP_IDF_VERSION'
return FIRMWARE_VERSION;
^~~~~~~~~~~~~~~~
ESP_IDF_VERSION
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:9:31: error: 'LittleFS' was not declared in this scope
return humanReadableSize((LittleFS.totalBytes() - LittleFS.usedBytes()));
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:9:31: note: suggested alternative: 'bitClear'
return humanReadableSize((LittleFS.totalBytes() - LittleFS.usedBytes()));
^~~~~~~~
bitClear
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:9:12: error: 'humanReadableSize' was not declared in this scope
return humanReadableSize((LittleFS.totalBytes() - LittleFS.usedBytes()));
^~~~~~~~~~~~~~~~~
Compiling .pio/build/nodemcu-32s/lib204/GFX_Lite-main/GFX_Lite.cpp.o
*** [.pio/build/nodemcu-32s/src/main.cpp.o] Error 1
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:13:30: error: 'LittleFS' was not declared in this scope
return humanReadableSize(LittleFS.usedBytes());
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:13:30: note: suggested alternative: 'bitClear'
return humanReadableSize(LittleFS.usedBytes());
^~~~~~~~
bitClear
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:13:12: error: 'humanReadableSize' was not declared in this scope
return humanReadableSize(LittleFS.usedBytes());
^~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:17:30: error: 'LittleFS' was not declared in this scope
return humanReadableSize(LittleFS.totalBytes());
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:17:30: note: suggested alternative: 'bitClear'
return humanReadableSize(LittleFS.totalBytes());
^~~~~~~~
bitClear
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:17:12: error: 'humanReadableSize' was not declared in this scope
return humanReadableSize(LittleFS.totalBytes());
^~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:21:12: error: 'sliderValue' was not declared in this scope
return sliderValue;
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:30:3: error: 'server' was not declared in this scope
server->onNotFound(notFound);
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:30:3: note: suggested alternative: 'Server'
server->onNotFound(notFound);
^~~~~~
Server
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:30:22: error: 'notFound' was not declared in this scope
server->onNotFound(notFound);
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:30:22: note: suggested alternative: 'noTone'
server->onNotFound(notFound);
^~~~~~~~
noTone
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:33:24: error: 'handleUpload' was not declared in this scope
server->onFileUpload(handleUpload);
^~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:36:25: error: 'HTTP_GET' was not declared in this scope
server->on("/logout", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:36:25: note: suggested alternative: 'DST_MET'
server->on("/logout", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~
DST_MET
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:36:38: error: 'AsyncWebServerRequest' has not been declared
server->on("/logout", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:37:14: error: request for member 'requestAuthentication' in '* request', which is of non-class type 'int'
request->requestAuthentication();
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:38:14: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(401);
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:42:42: error: 'AsyncWebServerRequest' has not been declared
server->on("/logged-out", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:43:46: error: request for member 'client' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:43:95: error: request for member 'url' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:45:14: error: request for member 'send_P' in '* request', which is of non-class type 'int'
request->send_P(401, "text/html", logout_html, processor);
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:45:39: error: 'logout_html' was not declared in this scope
request->send_P(401, "text/html", logout_html, processor);
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:48:32: error: 'AsyncWebServerRequest' has not been declared
server->on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:49:46: error: request for member 'client' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + + " " + request->url();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:49:97: error: request for member 'url' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + + " " + request->url();
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:51:33: error: 'checkUserWebAuth' cannot be used as a function
if (checkUserWebAuth(request)) {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:54:16: error: request for member 'send_P' in '* request', which is of non-class type 'int'
request->send_P(200, "text/html", index_html, processor);
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:54:41: error: 'index_html' was not declared in this scope
request->send_P(200, "text/html", index_html, processor);
^~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:54:41: note: suggested alternative: 'index'
request->send_P(200, "text/html", index_html, processor);
^~~~~~~~~~
index
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:58:23: error: request for member 'requestAuthentication' in '* request', which is of non-class type 'int'
return request->requestAuthentication();
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:63:44: error: 'AsyncWebServerRequest' has not been declared
server->on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:66:18: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam(PARAM_INPUT)) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:66:27: error: 'PARAM_INPUT' was not declared in this scope
if (request->hasParam(PARAM_INPUT)) {
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:66:27: note: suggested alternative: 'MAX_INPUT'
if (request->hasParam(PARAM_INPUT)) {
^~~~~~~~~~~
MAX_INPUT
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:67:31: error: request for member 'getParam' in '* request', which is of non-class type 'int'
inputMessage = request->getParam(PARAM_INPUT)->value();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:68:7: error: 'sliderValue' was not declared in this scope
sliderValue = inputMessage;
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:69:7: error: 'dma_display' was not declared in this scope
dma_display->setBrightness8(sliderValue.toInt());
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:77:38: error: 'AsyncWebServerRequest' has not been declared
server->on("/reboot", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:78:46: error: request for member 'client' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:78:95: error: request for member 'url' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:80:33: error: 'checkUserWebAuth' cannot be used as a function
if (checkUserWebAuth(request)) {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:81:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/html", reboot_html);
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:81:39: error: 'reboot_html' was not declared in this scope
request->send(200, "text/html", reboot_html);
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:85:7: error: 'shouldReboot' was not declared in this scope
shouldReboot = true;
^~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:89:23: error: request for member 'requestAuthentication' in '* request', which is of non-class type 'int'
return request->requestAuthentication();
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:93:41: error: 'AsyncWebServerRequest' has not been declared
server->on("/listfiles", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:94:46: error: request for member 'client' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:94:95: error: request for member 'url' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:95:33: error: 'checkUserWebAuth' cannot be used as a function
if (checkUserWebAuth(request)) {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:98:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", listFiles(true, 1, maxGIFsPerPage)); // Explicitly pass page and pageSize
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:98:61: error: 'maxGIFsPerPage' was not declared in this scope
request->send(200, "text/plain", listFiles(true, 1, maxGIFsPerPage)); // Explicitly pass page and pageSize
^~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:98:42: error: 'listFiles' was not declared in this scope
request->send(200, "text/plain", listFiles(true, 1, maxGIFsPerPage)); // Explicitly pass page and pageSize
^~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:98:42: note: suggested alternative: 'lutimes'
request->send(200, "text/plain", listFiles(true, 1, maxGIFsPerPage)); // Explicitly pass page and pageSize
^~~~~~~~~
lutimes
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:102:25: error: request for member 'requestAuthentication' in '* request', which is of non-class type 'int'
return request->requestAuthentication();
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:106:36: error: 'AsyncWebServerRequest' has not been declared
server->on("/list", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:108:18: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("page")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:109:25: error: request for member 'getParam' in '* request', which is of non-class type 'int'
page = request->getParam("page")->value().toInt();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:114:45: error: 'maxGIFsPerPage' was not declared in this scope
String fileList = listFiles(true, page, maxGIFsPerPage); // Generate the table content
^~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:114:23: error: 'listFiles' was not declared in this scope
String fileList = listFiles(true, page, maxGIFsPerPage); // Generate the table content
^~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:114:23: note: suggested alternative: 'lutimes'
String fileList = listFiles(true, page, maxGIFsPerPage); // Generate the table content
^~~~~~~~~
lutimes
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:115:14: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/html", fileList);
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:119:40: error: 'AsyncWebServerRequest' has not been declared
server->on("/setColor", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:120:18: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("r") && request->hasParam("g") && request->hasParam("b")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:120:44: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("r") && request->hasParam("g") && request->hasParam("b")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:120:70: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("r") && request->hasParam("g") && request->hasParam("b")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:121:9: error: 'colorR' was not declared in this scope
colorR = request->getParam("r")->value().toInt();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:121:9: note: suggested alternative: 'close'
colorR = request->getParam("r")->value().toInt();
^~~~~~
close
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:121:27: error: request for member 'getParam' in '* request', which is of non-class type 'int'
colorR = request->getParam("r")->value().toInt();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:122:9: error: 'colorG' was not declared in this scope
colorG = request->getParam("g")->value().toInt();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:122:9: note: suggested alternative: 'close'
colorG = request->getParam("g")->value().toInt();
^~~~~~
close
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:122:27: error: request for member 'getParam' in '* request', which is of non-class type 'int'
colorG = request->getParam("g")->value().toInt();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:123:9: error: 'colorB' was not declared in this scope
colorB = request->getParam("b")->value().toInt();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:123:9: note: suggested alternative: 'close'
colorB = request->getParam("b")->value().toInt();
^~~~~~
close
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:123:27: error: request for member 'getParam' in '* request', which is of non-class type 'int'
colorB = request->getParam("b")->value().toInt();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:127:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "Color updated");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:129:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "Missing parameters");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:133:41: error: 'AsyncWebServerRequest' has not been declared
server->on("/toggleGIF", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:134:18: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("state")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:135:33: error: request for member 'getParam' in '* request', which is of non-class type 'int'
String state = request->getParam("state")->value();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:136:9: error: 'gifEnabled' was not declared in this scope
gifEnabled = (state == "on"); // Update the gifEnabled variable
^~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:136:9: note: suggested alternative: 'spiSSEnable'
gifEnabled = (state == "on"); // Update the gifEnabled variable
^~~~~~~~~~
spiSSEnable
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:138:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "GIF playback state updated");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:140:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "Missing 'state' parameter");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:144:44: error: 'AsyncWebServerRequest' has not been declared
server->on("/toggleLoopGif", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:145:16: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("state")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:146:31: error: request for member 'getParam' in '* request', which is of non-class type 'int'
String state = request->getParam("state")->value();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:147:7: error: 'loopGifEnabled' was not declared in this scope
loopGifEnabled = (state == "on");
^~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:147:7: note: suggested alternative: 'spiSSEnable'
loopGifEnabled = (state == "on");
^~~~~~~~~~~~~~
spiSSEnable
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:149:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "Loop GIF state updated");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:151:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "Missing 'state' parameter");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:155:42: error: 'AsyncWebServerRequest' has not been declared
server->on("/toggleClock", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:156:16: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("state")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:157:31: error: request for member 'getParam' in '* request', which is of non-class type 'int'
String state = request->getParam("state")->value();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:158:7: error: 'clockEnabled' was not declared in this scope
clockEnabled = (state == "on");
^~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:158:7: note: suggested alternative: 'clock_nanosleep'
clockEnabled = (state == "on");
^~~~~~~~~~~~
clock_nanosleep
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:160:11: error: 'scrollTextEnabled' was not declared in this scope
scrollTextEnabled = false; // Disable scrolling text if the clock is enabled
^~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:163:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "Clock state updated");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:165:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "Missing 'state' parameter");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:169:46: error: 'AsyncWebServerRequest' has not been declared
server->on("/toggleScrollText", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:170:16: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("state")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:171:31: error: request for member 'getParam' in '* request', which is of non-class type 'int'
String state = request->getParam("state")->value();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:172:7: error: 'scrollTextEnabled' was not declared in this scope
scrollTextEnabled = (state == "on");
^~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:174:11: error: 'clockEnabled' was not declared in this scope
clockEnabled = false; // Disable the clock if scrolling text is enabled
^~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:174:11: note: suggested alternative: 'clock_nanosleep'
clockEnabled = false; // Disable the clock if scrolling text is enabled
^~~~~~~~~~~~
clock_nanosleep
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:177:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "Scrolling text state updated");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:179:16: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "Missing 'state' parameter");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:183:48: error: 'AsyncWebServerRequest' has not been declared
server->on("/updateScrollText", HTTP_GET, [](AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:184:18: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("text") && request->hasParam("fontSize") && request->hasParam("speed")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:184:47: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("text") && request->hasParam("fontSize") && request->hasParam("speed")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:184:80: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("text") && request->hasParam("fontSize") && request->hasParam("speed")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:185:9: error: 'scrollText' was not declared in this scope
scrollText = request->getParam("text")->value();
^~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:185:31: error: request for member 'getParam' in '* request', which is of non-class type 'int'
scrollText = request->getParam("text")->value();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:186:9: error: 'scrollFontSize' was not declared in this scope
scrollFontSize = request->getParam("fontSize")->value().toInt();
^~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:186:35: error: request for member 'getParam' in '* request', which is of non-class type 'int'
scrollFontSize = request->getParam("fontSize")->value().toInt();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:187:9: error: 'scrollSpeed' was not declared in this scope
scrollSpeed = request->getParam("speed")->value().toInt();
^~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:187:32: error: request for member 'getParam' in '* request', which is of non-class type 'int'
scrollSpeed = request->getParam("speed")->value().toInt();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:189:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "Scrolling text updated");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:191:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "Missing parameters");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In function 'void configureWebServer()':
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:195:36: error: 'AsyncWebServerRequest' has not been declared
server->on("/file", HTTP_GET, [](AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: In lambda function:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:196:46: error: request for member 'client' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:196:95: error: request for member 'url' in '* request', which is of non-class type 'int'
String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:197:33: error: 'checkUserWebAuth' cannot be used as a function
if (checkUserWebAuth(request)) {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:201:20: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("name") && request->hasParam("action")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:201:49: error: request for member 'hasParam' in '* request', which is of non-class type 'int'
if (request->hasParam("name") && request->hasParam("action")) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:202:47: error: request for member 'getParam' in '* request', which is of non-class type 'int'
String fileName = "/"+String(request->getParam("name")->value() );
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:203:43: error: request for member 'getParam' in '* request', which is of non-class type 'int'
const char *fileAction = request->getParam("action")->value().c_str();
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:205:43: error: request for member 'client' in '* request', which is of non-class type 'int'
logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url() + "?name=" + String(fileName) + "&action=" + String(fileAction);
^~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:205:92: error: request for member 'url' in '* request', which is of non-class type 'int'
logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url() + "?name=" + String(fileName) + "&action=" + String(fileAction);
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:207:14: error: 'LittleFS' was not declared in this scope
if (!LittleFS.exists(fileName)) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:207:14: note: suggested alternative: 'bitClear'
if (!LittleFS.exists(fileName)) {
^~~~~~~~
bitClear
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:209:20: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "ERROR: file does not exist");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:215:22: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(LittleFS, fileName, "application/octet-stream");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:219:22: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(200, "text/plain", "Deleted File: " + String(fileName));
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:222:13: error: 'requestedGifPath' was not declared in this scope
requestedGifPath = fileName; // Store the requested GIF path
^~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:225:13: error: 'gifFile' was not declared in this scope
gifFile = FILESYSTEM.open(fileName);
^~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:225:23: error: 'FILESYSTEM' was not declared in this scope
gifFile = FILESYSTEM.open(fileName);
^~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:231:22: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(LittleFS, fileName, "image/gif");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:235:22: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "ERROR: invalid action param supplied");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:240:18: error: request for member 'send' in '* request', which is of non-class type 'int'
request->send(400, "text/plain", "ERROR: name and action params required");
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:245:23: error: request for member 'requestAuthentication' in '* request', which is of non-class type 'int'
return request->requestAuthentication();
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino: At global scope:
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:250:15: error: variable or field 'notFound' declared void
void notFound(AsyncWebServerRequest *request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:250:15: error: 'AsyncWebServerRequest' was not declared in this scope
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:250:38: error: 'request' was not declared in this scope
void notFound(AsyncWebServerRequest *request) {
^~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:250:38: note: suggested alternative: 'renameat'
void notFound(AsyncWebServerRequest *request) {
^~~~~~~
renameat
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:257:23: error: redefinition of 'bool checkUserWebAuth'
bool checkUserWebAuth(AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:4:6: note: 'bool checkUserWebAuth' previously defined here
if (var == "FIRMWARE") {
^~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:257:23: error: 'AsyncWebServerRequest' was not declared in this scope
bool checkUserWebAuth(AsyncWebServerRequest * request) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:257:47: error: 'request' was not declared in this scope
bool checkUserWebAuth(AsyncWebServerRequest * request) {
^~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:257:47: note: suggested alternative: 'renameat'
bool checkUserWebAuth(AsyncWebServerRequest * request) {
^~~~~~~
renameat
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:19: error: variable or field 'handleUpload' declared void
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~~~~~~~~~~~~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:19: error: 'AsyncWebServerRequest' was not declared in this scope
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:42: error: 'request' was not declared in this scope
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:42: note: suggested alternative: 'renameat'
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~~~~
renameat
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:58: error: expected primary-expression before 'filename'
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:75: error: expected primary-expression before 'index'
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:90: error: expected primary-expression before '*' token
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:91: error: 'data' was not declared in this scope
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:91: note: suggested alternative: 'atan'
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~
atan
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:104: error: expected primary-expression before 'len'
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~
/home/sascha/Dokumente/PlatformIO/Projects/HUB75-Pixel-Art-Display/src/webserver.ino:268:109: error: expected primary-expression before 'bool'
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
^~~~
*** [.pio/build/nodemcu-32s/src/webserver.ino.cpp.o] Error 1
========================================================================== [FAILED] Took 2.85 seconds ==========================================================================
* The terminal process "platformio 'run'" terminated with exit code: 1.
* Terminal will be reused by tasks, press any key to close it.
Code
#include <Arduino.h>
//By mzashh https://github.com/mzashh
#define FIRMWARE_VERSION "v0.4.5b"
#define FILESYSTEM LittleFS
#include <LittleFS.h>
#include <AnimatedGIF.h>
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <GFX_Layer.hpp>
#include <ESPAsyncWebServer.h>
#include "webpages.h"
#include "time.h"
#define A_PIN 22
#define B_PIN 32
#define C_PIN 33
#define D_PIN 17
#define E_PIN 21
#define PANEL_RES_X 64
#define PANEL_RES_Y 64
#define PANEL_CHAIN 1
MatrixPanel_I2S_DMA *dma_display = nullptr;
uint16_t myBLACK = dma_display->color565(0, 0, 0);
uint16_t myWHITE = dma_display->color565(255, 255, 255);
uint16_t myRED = dma_display->color565(255, 0, 0);
uint16_t myGREEN = dma_display->color565(0, 255, 0);
uint16_t myBLUE = dma_display->color565(0, 0, 255);
uint16_t textWidth = 0; // Width of the scrolling text
uint16_t w, h;
uint8_t colorR = 255; // Default Red value
uint8_t colorG = 255; // Default Green value
uint8_t colorB = 255; // Default Blue value
uint8_t scrollFontSize = 2; // Default font size (1 = small, 2 = normal, 3 = big, 4 = huge)
uint8_t scrollSpeed = 18; // Default scroll speed (1 = fastest, 150 = slowest)
int16_t xOne, yOne;
const String default_ssid = "Pyka"; // Your WiFi SSID
const String default_wifipassword = "N*8fWx.Y3+k"; // Your WiFi password
const String default_httpuser = "admin"; // WebUI login id
const String default_httppassword = "admin"; // WebUI login password
const int default_webserverporthttp = 80;
const char* ntpServer = "pool.ntp.org"; // NTP server
const char* PARAM_INPUT = "value";
const long gmtOffset_sec = 0; // GMT Timezone Offset in seconds (change this to your own)
const int daylightOffset_sec = 0;
const int maxGIFsPerPage = 4; // Change this value to set the maximum number of GIFs per page (keep this at 4)
int textXPosition = 64; // Will start off screen
int textYPosition = 24; // center of screen (half of the text height)
unsigned long lastPixelToggle = 0; // Tracks the last time the second set of pixels was drawn
unsigned long lastScrollUpdate = 0; // Tracks the last time the text was scrolled
unsigned long isAnimationDue;
bool showFirstSet = true; // Default state: Clock divider colon
bool clockEnabled = true; // Default state: Clock is enabled
bool gifEnabled = true; // Default state: GIF playback is enabled
bool scrollTextEnabled = false; // Default state: Scrolling text is disabled
bool loopGifEnabled = true; // Default state: Loop GIF is enabled (reverese logic)
String inputMessage;
String sliderValue = "255"; //Default brightness value
String scrollText = "Hello"; // Default Text String
String currentGifPath = ""; // Store the current GIF file path
String requestedGifPath = ""; // Path of the GIF requested by the user
struct Config {
String ssid; // wifi ssid
String wifipassword; // wifi password
String httpuser; // username to access web admin
String httppassword; // password to access web admin
int webserverporthttp; // http port number for web admin
};
Config config; // configuration
bool shouldReboot = false; // schedule a reboot
AsyncWebServer *server; // initialise webserver
// function defaults
String listFiles(bool ishtml = false);
AnimatedGIF gif;
File f;
int x_offset, y_offset;
void layer_draw_callback(int16_t x, int16_t y, uint8_t r_data, uint8_t g_data, uint8_t b_data) {
dma_display->drawPixel(x,y, dma_display->color565(r_data,g_data,b_data));
}
// Global GFX_Layer object
GFX_Layer gfx_layer_bg(64, 64, layer_draw_callback); // background
GFX_Layer gfx_layer_fg(64, 64, layer_draw_callback); // foreground
GFX_LayerCompositor gfx_compositor(layer_draw_callback);
void GIFDraw(GIFDRAW *pDraw)
{
uint8_t *s;
uint16_t *d, *usPalette, usTemp[320];
int x, y, iWidth;
iWidth = pDraw->iWidth;
if (iWidth > MATRIX_WIDTH)
iWidth = MATRIX_WIDTH;
usPalette = pDraw->pPalette;
y = pDraw->iY + pDraw->y; // current line
s = pDraw->pPixels;
if (pDraw->ucDisposalMethod == 2) // restore to background color
{
for (x=0; x<iWidth; x++)
{
if (s[x] == pDraw->ucTransparent)
s[x] = pDraw->ucBackground;
}
pDraw->ucHasTransparency = 0;
}
if (gifEnabled) // Check if GIF playback is enabled
{
if (pDraw->ucHasTransparency) // if transparency used
{
uint8_t *pEnd, c, ucTransparent = pDraw->ucTransparent;
int x, iCount;
pEnd = s + pDraw->iWidth;
x = 0;
iCount = 0; // count non-transparent pixels
while(x < pDraw->iWidth)
{
c = ucTransparent-1;
d = usTemp;
while (c != ucTransparent && s < pEnd)
{
c = *s++;
if (c == ucTransparent) // done, stop
{
s--; // back up to treat it like transparent
}
else // opaque
{
*d++ = usPalette[c];
iCount++;
}
} // while looking for opaque pixels
if (iCount) // any opaque pixels?
{
for(int xOffset = 0; xOffset < iCount; xOffset++ ){
gfx_layer_bg.drawPixel(x + xOffset, y, usTemp[xOffset]); // 565 Color Format
}
x += iCount;
iCount = 0;
}
// no, look for a run of transparent pixels
c = ucTransparent;
while (c == ucTransparent && s < pEnd)
{
c = *s++;
if (c == ucTransparent)
iCount++;
else
s--;
}
if (iCount)
{
x += iCount; // skip these
iCount = 0;
}
}
}
else // does not have transparency
{
s = pDraw->pPixels;
// Translate the 8-bit pixels through the RGB565 palette (already byte reversed)
for (x=0; x<pDraw->iWidth; x++)
{
gfx_layer_bg.drawPixel(x, y, usPalette[*s++]); // color 565
}
}
}
else
{
gfx_layer_bg.clear(); // Clear the background layer if GIF playback is disabled
}
if (clockEnabled) {
// Request Time from internal RTC
struct tm timeinfo;
//getLocalTime(&timeinfo);
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
}
// Display the time in the format HH:MM (12/24H)
gfx_layer_fg.clear();
gfx_layer_fg.setTextColor(gfx_layer_fg.color565(colorR, colorG, colorB));
gfx_layer_fg.setTextSize(2);
gfx_layer_fg.setCursor(7, 24);
//gfx_layer_fg.print(&timeinfo, "%H"); // print Hours from NTP 24 Hour format (Uncomment this for 24H time vice versa for 12H)
gfx_layer_fg.print(&timeinfo, "%I"); // print Hours from NTP 12 Hour format (Comment this out if you want 24H time vice versa for 12H)
gfx_layer_fg.setCursor(35, 24);
gfx_layer_fg.print(&timeinfo, "%M"); // print Minutes from NTP
// Draw the hh:mm divider
if (millis() - lastPixelToggle >= 1000) // Check if one second has passed
{
showFirstSet = !showFirstSet; // Toggle between the first and second set of pixels
lastPixelToggle = millis(); // Reset the timer
}
if (showFirstSet) {
// Active pixels
gfx_layer_fg.setTextColor(gfx_layer_fg.color565(colorR, colorG, colorB));
gfx_layer_fg.setTextSize(1);
gfx_layer_fg.setCursor(28, 28);
gfx_layer_fg.print(".");
gfx_layer_fg.setCursor(28, 22);
gfx_layer_fg.print(".");
} else {
// Dark pixels
gfx_layer_fg.setTextColor(gfx_layer_fg.color565(0, 0, 0));
gfx_layer_fg.setTextSize(1);
gfx_layer_fg.setCursor(28, 28);
gfx_layer_fg.print(".");
gfx_layer_fg.setCursor(28, 22);
gfx_layer_fg.print(".");
}
}
else {
// Clear the clock display if the clock is disabled
}
if (scrollTextEnabled) {
//gfx_layer_fg.clear(); // Clear the foreground layer
gfx_layer_fg.setTextWrap(false); // Disable text wrapping
if (scrollFontSize == 1) {
textYPosition = 27;
} else if (scrollFontSize == 2) {
textYPosition = 24;
} else if (scrollFontSize == 3) {
textYPosition = 20;
} else if (scrollFontSize == 4) {
textYPosition = 16;
} else {
textYPosition = 24;
}
byte offSet = 25;
unsigned long now = millis();
if (now > isAnimationDue)
{
gfx_layer_fg.setTextSize(scrollFontSize); // size 2 == 16 pixels high
isAnimationDue = now + scrollSpeed;
textXPosition -= 1;
// Checking is the very right of the text off screen to the left
gfx_layer_fg.getTextBounds(scrollText.c_str(), textXPosition, textYPosition, &xOne, &yOne, &w, &h);
if (textXPosition + w <= 0) {
textXPosition = gfx_layer_fg.width() + offSet;
}
gfx_layer_fg.setCursor(textXPosition, textYPosition);
// Clear the area of text to be drawn to
gfx_layer_fg.drawRect(0, textYPosition - 12, gfx_layer_fg.width(), 42, gfx_layer_fg.color565(0, 0, 0));
gfx_layer_fg.fillRect(0, textYPosition - 12, gfx_layer_fg.width(), 42, gfx_layer_fg.color565(0, 0, 0));
uint8_t w = 0;
for (w = 0; w < strlen(scrollText.c_str()); w++) {
gfx_layer_fg.setTextColor(gfx_layer_fg.color565(colorR, colorG, colorB));
gfx_layer_fg.print(scrollText.c_str()[w]);
//Serial.println(textYPosition);
}
}
}
else {
}
if (!scrollTextEnabled && !clockEnabled) { // Both scrollTextEnabled and clockEnabled are false
gfx_layer_fg.clear(); // Clear the foreground layer
}
} /* GIFDraw() */
void * GIFOpenFile(const char *fname, int32_t *pSize)
{
Serial.print("Playing gif: ");
Serial.println(fname);
f = FILESYSTEM.open(fname);
if (f)
{
*pSize = f.size();
return (void *)&f;
}
return NULL;
} /* GIFOpenFile() */
void GIFCloseFile(void *pHandle)
{
File *f = static_cast<File *>(pHandle);
if (f != NULL)
f->close();
} /* GIFCloseFile() */
int32_t GIFReadFile(GIFFILE *pFile, uint8_t *pBuf, int32_t iLen)
{
int32_t iBytesRead;
iBytesRead = iLen;
File *f = static_cast<File *>(pFile->fHandle);
// Note: If you read a file all the way to the last byte, seek() stops working
if ((pFile->iSize - pFile->iPos) < iLen)
iBytesRead = pFile->iSize - pFile->iPos - 1; // <-- ugly work-around
if (iBytesRead <= 0)
return 0;
iBytesRead = (int32_t)f->read(pBuf, iBytesRead);
pFile->iPos = f->position();
return iBytesRead;
} /* GIFReadFile() */
int32_t GIFSeekFile(GIFFILE *pFile, int32_t iPosition)
{
int i = micros();
File *f = static_cast<File *>(pFile->fHandle);
f->seek(iPosition);
pFile->iPos = (int32_t)f->position();
i = micros() - i;
// Serial.printf("Seek time = %d us\n", i);
return pFile->iPos;
} /* GIFSeekFile() */
unsigned long start_tick = 0;
void ShowGIF(char *name)
{
start_tick = millis();
unsigned long lastTimeCheck = millis(); // Timer for getLocalTime
if (gif.open(name, GIFOpenFile, GIFCloseFile, GIFReadFile, GIFSeekFile, GIFDraw))
{
x_offset = (MATRIX_WIDTH - gif.getCanvasWidth())/2;
if (x_offset < 0) x_offset = 0;
y_offset = (MATRIX_HEIGHT - gif.getCanvasHeight())/2;
if (y_offset < 0) y_offset = 0;
Serial.printf("Successfully opened GIF; Canvas size = %d x %d\n", gif.getCanvasWidth(), gif.getCanvasHeight());
Serial.flush();
while (gif.playFrame(true, NULL))
{
gfx_layer_bg.dim(150);
gfx_layer_fg.dim(255);
gfx_compositor.Blend(gfx_layer_bg, gfx_layer_fg); // Combine the bg and the fg layer and draw it onto the panel.
if ( (millis() - start_tick) > 50000) { // we'll get bored after about 50 seconds of the same looping gif
//break; // Will change to the next gif in the list after the set time.
}
}
gif.close();
}
} /* ShowGIF() */
void rebootESP(String message) {
Serial.print("Rebooting ESP32: "); Serial.println(message);
ESP.restart();
}
String listFiles(bool ishtml, int page = 1, int pageSize = maxGIFsPerPage) {
String returnText = "";
int fileIndex = 0;
int startIndex = (page - 1) * pageSize;
int endIndex = startIndex + pageSize;
File root = FILESYSTEM.open("/");
File foundfile = root.openNextFile();
if (ishtml) {
returnText += "<!DOCTYPE HTML><html lang=\"en\"><head>";
returnText += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
returnText += "<meta charset=\"UTF-8\">";
returnText += "</head><body>";
returnText += "<table><tr><th>Name</th><th>Size</th><th>Preview</th><th>Actions</th></tr>";
}
while (foundfile) {
if (fileIndex >= startIndex && fileIndex < endIndex) {
if (ishtml) {
returnText += "<tr><td>" + String(foundfile.name()) + "</td>";
returnText += "<td>" + humanReadableSize(foundfile.size()) + "</td>";
returnText += "<td><img src=\"/file?name=" + String(foundfile.name()) + "&action=show\" width=\"64\"></td>";
returnText += "<td>";
returnText += "<button onclick=\"downloadDeleteButton('" + String(foundfile.name()) + "', 'play')\">Play</button>";
returnText += "<button onclick=\"downloadDeleteButton('" + String(foundfile.name()) + "', 'download')\">Download</button>";
returnText += "<button onclick=\"downloadDeleteButton('" + String(foundfile.name()) + "', 'delete')\">Delete</button>";
returnText += "</td></tr>";
}
}
fileIndex++;
foundfile = root.openNextFile();
}
if (ishtml) {
returnText += "</table>";
// Add the Home button
returnText += "<button onclick=\"window.location.href='/'\">Home</button>";
// Add the Previous button if applicable
if (page > 1) {
returnText += "<button onclick=\"window.location.href='/list?page=" + String(page - 1) + "'\">Previous</button>";
}
// Add the Next button if there are more files
if (fileIndex > endIndex) {
returnText += "<button onclick=\"window.location.href='/list?page=" + String(page + 1) + "'\">Next</button>";
}
// GIF select page
returnText += "<script>";
returnText += "function downloadDeleteButton(filename, action) {";
returnText += " console.log(`downloadDeleteButton called with filename: ${filename}, action: ${action}`);";
returnText += " const url = `/file?name=${filename}&action=${action}`;";
returnText += " if (action === 'delete') {";
returnText += " fetch(url).then(response => response.text()).then(data => {";
returnText += " console.log(data);";
returnText += " alert('File deleted successfully!');";
returnText += " location.reload();";
returnText += " }).catch(error => {";
returnText += " console.error('Error deleting file:', error);";
returnText += " alert('Failed to delete file.');";
returnText += " });";
returnText += " } else if (action === 'download') {";
returnText += " window.open(url, '_blank');";
returnText += " } else if (action === 'play') {";
returnText += " fetch(url).then(response => response.text()).then(data => {";
returnText += " console.log(data);";
returnText += " alert('Playing file...');";
returnText += " }).catch(error => {";
returnText += " console.error('Error playing file:', error);";
returnText += " ";
returnText += " });";
returnText += " }";
returnText += "}";
returnText += "</script>";
returnText += "</body></html>";
}
root.close();
return returnText;
}
String humanReadableSize(const size_t bytes) {
if (bytes < 1024) return String(bytes) + " B";
else if (bytes < (1024 * 1024)) return String(bytes / 1024.0) + " KB";
else if (bytes < (1024 * 1024 * 1024)) return String(bytes / 1024.0 / 1024.0) + " MB";
else return String(bytes / 1024.0 / 1024.0 / 1024.0) + " GB";
}
/************************* Arduino Sketch Setup and Loop() *******************************/
void setup() {
HUB75_I2S_CFG mxconfig(
PANEL_RES_X, // module width
PANEL_RES_Y, // module height
PANEL_CHAIN // Chain length
);
mxconfig.gpio.a = A_PIN;
mxconfig.gpio.b = B_PIN;
mxconfig.gpio.c = C_PIN;
mxconfig.gpio.d = D_PIN;
mxconfig.gpio.e = E_PIN;
mxconfig.clkphase = false;
mxconfig.driver = HUB75_I2S_CFG::FM6126A;
// Display Setup
dma_display = new MatrixPanel_I2S_DMA(mxconfig);
dma_display->setRotation(0); // Flip display by 90°, the value can be 0-4
dma_display->begin();
dma_display->setBrightness8(sliderValue.toInt()); //0-255
dma_display->clearScreen();
Serial.begin(115200);
Serial.print("Firmware: "); Serial.println(FIRMWARE_VERSION);
Serial.println("Booting ...");
Serial.println("Mounting LittleFS ...");
if (!LittleFS.begin(true)) {
// if you have not used LittleFS. before on a ESP32, it will show this error.
// after a reboot LittleFS. will be configured and will happily work.
Serial.println("ERROR: Cannot mount LittleFS, Rebooting");
rebootESP("ERROR: Cannot mount LittleFS, Rebooting");
}
Serial.begin(115200);
Serial.println("Starting AnimatedGIFs Sketch");
dma_display->begin();
Serial.print("Flash Free: "); Serial.println(humanReadableSize((LittleFS.totalBytes() - LittleFS.usedBytes())));
Serial.print("Flash Used: "); Serial.println(humanReadableSize(LittleFS.usedBytes()));
Serial.print("Flash Total: "); Serial.println(humanReadableSize(LittleFS.totalBytes()));
//Serial.println(listFiles(true, 1, maxGIFsPerPage));
Serial.println("Loading Configuration ...");
config.ssid = default_ssid;
config.wifipassword = default_wifipassword;
config.httpuser = default_httpuser;
config.httppassword = default_httppassword;
config.webserverporthttp = default_webserverporthttp;
Serial.print("\nConnecting to Wifi: ");
WiFi.begin(config.ssid.c_str(), config.wifipassword.c_str());
(WiFi.status() != WL_CONNECTED);
//{ delay(500);
//Serial.print("."); //Uncomment the 3 lines if you want the ESP32 to wait until the WIFI is connected
// }
Serial.println("\n\nNetwork Configuration:");
Serial.println("----------------------");
Serial.print(" SSID: "); Serial.println(WiFi.SSID());
Serial.print(" Wifi Status: "); Serial.println(WiFi.status());
Serial.print("Wifi Strength: "); Serial.print(WiFi.RSSI()); Serial.println(" dBm");
Serial.print(" MAC: "); Serial.println(WiFi.macAddress());
Serial.print(" IP: "); Serial.println(WiFi.localIP());
Serial.print(" Subnet: "); Serial.println(WiFi.subnetMask());
Serial.print(" Gateway: "); Serial.println(WiFi.gatewayIP());
Serial.print(" DNS 1: "); Serial.println(WiFi.dnsIP(0));
Serial.print(" DNS 2: "); Serial.println(WiFi.dnsIP(1));
Serial.print(" DNS 3: "); Serial.println(WiFi.dnsIP(2));
Serial.println();
// configure web server
Serial.println("Configuring Webserver ...");
server = new AsyncWebServer(config.webserverporthttp);
configureWebServer(); // start web server
// startup web server
Serial.println("Starting Webserver ...");
server->begin();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // get time from NTP server
dma_display->fillScreen(dma_display->color565(0, 0, 0));
dma_display->setTextSize(1);
delay(1000);
dma_display->print("ID:"); dma_display->print(FIRMWARE_VERSION);
dma_display->setCursor(0, 16);
dma_display->print("IP:"); dma_display->print(WiFi.localIP());
dma_display->setCursor(0, 38);
dma_display->print("RSSI:"); dma_display->println(WiFi.RSSI());
dma_display->setCursor(0, 52);
dma_display->print("SSID:"); dma_display->println(WiFi.SSID());
delay(1000);
dma_display->fillScreen(dma_display->color565(0, 0, 0));
gfx_layer_fg.clear();
gfx_layer_bg.clear();
gif.begin(LITTLE_ENDIAN_PIXELS);
}
String gifDir = "/"; // play all GIFs in this directory on the SD card
char filePath[256] = { 0 };
File root, gifFile;
void loop() {
if (shouldReboot) {
rebootESP("Web Admin Initiated Reboot");
}
while (1) { // Run forever
root = FILESYSTEM.open(gifDir); // Open the root directory
if (root) {
// Check if a new GIF is requested via the play button
if (!requestedGifPath.isEmpty()) {
// Play the requested GIF and set it as the current GIF
currentGifPath = requestedGifPath; // Update the current GIF path
requestedGifPath = ""; // Clear the requested path
// Find and play the requested GIF
while (gifFile = root.openNextFile()) {
if (String(gifFile.path()) == currentGifPath) {
break;
}
}
if (gifFile) {
// Play the requested GIF
memset(filePath, 0x0, sizeof(filePath));
strcpy(filePath, gifFile.path());
ShowGIF(filePath);
// If looping is enabled, continue looping the requested GIF
if (loopGifEnabled) {
continue; // Restart the loop for the same GIF
}
}
} else if (!currentGifPath.isEmpty()) {
// Resume from the last GIF
while (gifFile = root.openNextFile()) {
if (String(gifFile.path()) == currentGifPath) {
break;
}
}
} else {
gifFile = root.openNextFile(); // Open the first file in the directory
}
while (gifFile) {
if (!gifFile.isDirectory()) { // Play the file if it's not a directory
memset(filePath, 0x0, sizeof(filePath));
strcpy(filePath, gifFile.path());
currentGifPath = String(filePath); // Save the current GIF path
// Show the GIF
ShowGIF(filePath);
// If looping is enabled, continue playing the same GIF
if (loopGifEnabled) {
continue; // Restart the loop for the same GIF
}
}
if (!loopGifEnabled) {
// If looping is disabled, move to the next GIF
gifFile.close(); // Close the current GIF file
gifFile = root.openNextFile(); // Open the next file
// If no more files, reset to the first file
if (!gifFile) {
root.close(); // Close the root directory
root = FILESYSTEM.open(gifDir); // Reopen the root directory
gifFile = root.openNextFile(); // Start from the first file again
}
} else {
break; // Exit the loop if looping is disabled
}
}
root.close(); // Close the root directory
}
delay(10); // Pause before restarting
}
}
Danke
