mirror of
https://github.com/s00500/ESPUI.git
synced 2024-12-23 05:50:49 +00:00
Style change again
This commit is contained in:
parent
70288fc69f
commit
218ebc67d9
93
README.md
93
README.md
@ -1,6 +1,7 @@
|
||||
# ESPUI
|
||||
|
||||
![ESPUI](https://github.com/s00500/ESPUI/blob/master/docs/ui_complete.png)
|
||||
![ESPUI](https://github.com/s00500/ESPUI/blob/master/docs/ui_complete.png) //
|
||||
TODO: Update Logo
|
||||
|
||||
ESPUI is a simple library to make a web user interface for your projects using
|
||||
the **ESP8266** or the **ESP32** It uses web sockets and lets you create,
|
||||
@ -14,13 +15,11 @@ So if you either don't know how or just don't want to waste time: this is your
|
||||
simple solution user interface without the need of internet connectivity or any
|
||||
additional servers.
|
||||
|
||||
I completely rewrote the EasyUI Library created by ayushsharma82
|
||||
[Here](https://github.com/ayushsharma82/) Now it uses ESPAsyncWebserver and is
|
||||
mainly to be used with the ESP32 Processor.
|
||||
The Library runs fine on any kind of ESP8266 and ESP32 (NodeMCU Boards, usw)
|
||||
|
||||
# Important notes
|
||||
|
||||
THIS IS THE 2.0.0 development branch
|
||||
THIS IS THE 2.0.0 DEVELOPMENT BRANCH, NOT GUARANTIED TO WORK
|
||||
|
||||
**Roadmap for 2.0.0:**
|
||||
|
||||
@ -35,10 +34,10 @@ THIS IS THE 2.0.0 development branch
|
||||
- Min Max on slider
|
||||
- Accelerometer Widget
|
||||
- Cleanup Example
|
||||
- New Documentation
|
||||
- Numberfield
|
||||
- Textfield
|
||||
- Data directory
|
||||
- Cleanup and extend Documentation
|
||||
- Number field ✅
|
||||
- Text field ✅
|
||||
- Data directory ✅
|
||||
- Graph Usage
|
||||
- Accelerometer
|
||||
- Slider
|
||||
@ -51,10 +50,8 @@ THIS IS THE 2.0.0 development branch
|
||||
This library is dependent on the following libraries to function properly.
|
||||
|
||||
- [ESPAsyncWebserver](https://github.com/me-no-dev/ESPAsyncWebServer)
|
||||
- [ArduinoJson](https://github.com/bblanchon/ArduinoJson) **(VERSIONS 5.x only
|
||||
currently)**
|
||||
|
||||
**Plus for ESP8266**
|
||||
- [ArduinoJson](https://github.com/bblanchon/ArduinoJson) (Last tested with
|
||||
version 6.10.0) **Plus for ESP8266**
|
||||
|
||||
- [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP)
|
||||
|
||||
@ -92,16 +89,16 @@ Go to Sketch>Include Library>Add .zip Library> Select the Downloaded .zip File.
|
||||
|
||||
## Getting started
|
||||
|
||||
ESPUI serves several files to the browser to build up its webinterface. This can
|
||||
be achieved in 2 ways: _PROGMEM_ or _SPIFFS_
|
||||
ESPUI serves several files to the browser to build up its web interface. This
|
||||
can be achieved in 2 ways: _PROGMEM_ or _SPIFFS_
|
||||
|
||||
_When `ESPUI.begin()` is called the default is serving files from Memory and
|
||||
ESPUI should work out of the box!_
|
||||
|
||||
But if this causes your program to _use too much memory_ you can burn the files
|
||||
into the SPIFFS filesystem on the ESP. There are now two ways to do this: you
|
||||
can either use the ESP file upload tool or you use the library function
|
||||
`ESPUI.prepareFileSystem()`
|
||||
**OPTIONAL:** But if this causes your program to _use too much memory_ you can
|
||||
burn the files into the SPIFFS filesystem on the ESP. There are now two ways to
|
||||
do this: you can either use the ESP file upload tool or you use the library
|
||||
function `ESPUI.prepareFileSystem()`
|
||||
|
||||
#### Simple filesystem preparation (_recommended_)
|
||||
|
||||
@ -111,19 +108,8 @@ will create all needed files. Congratulations, you are done, from now on you
|
||||
just need to to this again when there is a library update, or when you want to
|
||||
use another chip :-) Now you can upload your normal sketch, when you do not call
|
||||
the `ESPUI.prepareFileSystem()` function the compiler will strip out all the
|
||||
unnecessary that is already saved in the chip's filesystem and you have more
|
||||
programm memory to work with.
|
||||
|
||||
#### Manual way (mainly for development)
|
||||
|
||||
To do this download and install me-no-devs wonderful
|
||||
[ESP32 sketch data uploader](https://github.com/me-no-dev/arduino-esp32fs-plugin)
|
||||
or for ESP8266
|
||||
[ESP8266 sketch data uploader](https://github.com/esp8266/arduino-esp8266fs-plugin)
|
||||
|
||||
Then open the **gui** example sketch and select "Upload Sketch Data" from the
|
||||
Tools menu for your processor. Now you are set to go and use any code you want
|
||||
to with this library
|
||||
unnecessary strings that are already saved in the chip's filesystem and you have
|
||||
more program memory to work with.
|
||||
|
||||
## User interface Elements
|
||||
|
||||
@ -235,6 +221,28 @@ realtime data, are touch compatible and can be used to for example control a
|
||||
Servo. The current value is shown while the slider is dragged in a little bubble
|
||||
over the handle.
|
||||
|
||||
#### Number Input
|
||||
|
||||
TODO: Add image
|
||||
|
||||
The numberinput can be used to directly input numbers to your program. You can
|
||||
enter a Value into it and when you are done with your change it is sent to the
|
||||
ESP.
|
||||
|
||||
#### Text Input
|
||||
|
||||
TODO: Add image
|
||||
|
||||
The textinput works very similar like the number input but with a string. You
|
||||
can enter a String into it and when you are done with your change it is sent to
|
||||
the ESP.
|
||||
|
||||
#### Using Tabs
|
||||
|
||||
TODO: Add image
|
||||
|
||||
// TODO: add Text for tabs
|
||||
|
||||
#### Initialisation of the UI
|
||||
|
||||
After all the elements are configured you can use `ESPUI.begin(“Some Title”);`
|
||||
@ -244,11 +252,24 @@ example). The web interface can then be used from multiple devices at once and
|
||||
also shows an connection status in the top bar. The library is designed to be
|
||||
easy to use and can still be extended with a lot of more functionality.
|
||||
|
||||
#### Log output
|
||||
|
||||
ESPUI has several different log levels. You can set them using the
|
||||
`ESPUI.setVerbosity(Verbosity::VerboseJSON)` function.
|
||||
|
||||
Loglevels are:
|
||||
|
||||
- Verbosity::Quiet (default)
|
||||
- Verbosity::Verbose
|
||||
- Verbosity::VerboseJSON
|
||||
|
||||
// TODO: Add some more notes here
|
||||
|
||||
# Notes for Development
|
||||
|
||||
If you want to work on the HTML/CSS/JS files, do make changes in the
|
||||
`examples/gui/data` directory. When you need to transfer that code to the ESP,
|
||||
run `tools/prepare_static_ui_sources.py -a` (this script needs python3 with the
|
||||
If you want to work on the HTML/CSS/JS files, do make changes in the `data`
|
||||
directory. When you need to transfer that code to the ESP, run
|
||||
`tools/prepare_static_ui_sources.py -a` (this script needs python3 with the
|
||||
modules htmlmin, jsmin and csscompressor). This will generate a) minified files
|
||||
next to the original files to be uploaded with the ESP32 sketch data uploader
|
||||
mentioned above and b) the C header files in `src` that contain the minified and
|
||||
@ -271,3 +292,5 @@ commits.
|
||||
|
||||
Liked this Library? You can **support** me by sending me a :coffee:
|
||||
[Coffee](https://paypal.me/lukasbachschwell/3).
|
||||
|
||||
Otherwise I really welcome **Pull Requests**.
|
||||
|
465
src/ESPUI.cpp
465
src/ESPUI.cpp
@ -17,7 +17,7 @@ uint16_t Control::idCounter = 0;
|
||||
|
||||
// ################# Spiffs functions
|
||||
#if defined(ESP32)
|
||||
void listDir(const char* dirname, uint8_t levels) {
|
||||
void listDir(const char *dirname, uint8_t levels) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("Listing directory: %s\n", dirname);
|
||||
}
|
||||
@ -66,7 +66,7 @@ void listDir(const char* dirname, uint8_t levels) {
|
||||
}
|
||||
#else
|
||||
|
||||
void listDir(const char* dirname, uint8_t levels) {
|
||||
void listDir(const char *dirname, uint8_t levels) {
|
||||
// ignoring levels for esp8266
|
||||
Serial.printf("Listing directory: %s\n", dirname);
|
||||
|
||||
@ -105,7 +105,7 @@ void ESPUIClass::list() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void deleteFile(const char* path) {
|
||||
void deleteFile(const char *path) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.print(SPIFFS.exists(path));
|
||||
}
|
||||
@ -133,7 +133,7 @@ void deleteFile(const char* path) {
|
||||
}
|
||||
}
|
||||
|
||||
void writeFile(const char* path, const char* data) {
|
||||
void writeFile(const char *path, const char *data) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("Writing file: %s\n", path);
|
||||
}
|
||||
@ -253,148 +253,144 @@ void ESPUIClass::prepareFileSystem() {
|
||||
}
|
||||
|
||||
// Handle Websockets Communication
|
||||
void onWsEvent(AsyncWebSocket* server, AsyncWebSocketClient* client,
|
||||
AwsEventType type, void* arg, uint8_t* data, size_t len) {
|
||||
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
|
||||
switch (type) {
|
||||
case WS_EVT_DISCONNECT: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("Disconnected!\n");
|
||||
}
|
||||
|
||||
break;
|
||||
case WS_EVT_DISCONNECT: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("Disconnected!\n");
|
||||
}
|
||||
|
||||
case WS_EVT_PONG: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("Received PONG!\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case WS_EVT_PONG: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("Received PONG!\n");
|
||||
}
|
||||
|
||||
case WS_EVT_ERROR: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("WebSocket Error!\n");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
case WS_EVT_ERROR: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.printf("WebSocket Error!\n");
|
||||
}
|
||||
|
||||
case WS_EVT_CONNECT: {
|
||||
break;
|
||||
}
|
||||
|
||||
case WS_EVT_CONNECT: {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.print("Connected: ");
|
||||
Serial.println(client->id());
|
||||
}
|
||||
|
||||
ESPUI.jsonDom(client);
|
||||
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.println("JSON Data Sent to Client!");
|
||||
}
|
||||
} break;
|
||||
|
||||
case WS_EVT_DATA: {
|
||||
String msg = "";
|
||||
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
msg += (char)data[i];
|
||||
}
|
||||
|
||||
uint16_t id = msg.substring(msg.lastIndexOf(':') + 1).toInt();
|
||||
|
||||
if (ESPUI.verbosity >= Verbosity::VerboseJSON) {
|
||||
Serial.print("WS rec: ");
|
||||
Serial.println(msg);
|
||||
Serial.print("WS recognised ID: ");
|
||||
Serial.println(id);
|
||||
}
|
||||
|
||||
Control *c = ESPUI.getControl(id);
|
||||
|
||||
if (c == nullptr) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.print("Connected: ");
|
||||
Serial.println(client->id());
|
||||
}
|
||||
|
||||
ESPUI.jsonDom(client);
|
||||
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.println("JSON Data Sent to Client!");
|
||||
}
|
||||
} break;
|
||||
|
||||
case WS_EVT_DATA: {
|
||||
String msg = "";
|
||||
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
msg += (char)data[i];
|
||||
}
|
||||
|
||||
uint16_t id = msg.substring(msg.lastIndexOf(':') + 1).toInt();
|
||||
|
||||
if (ESPUI.verbosity >= Verbosity::VerboseJSON) {
|
||||
Serial.print("WS rec: ");
|
||||
Serial.println(msg);
|
||||
Serial.print("WS recognised ID: ");
|
||||
Serial.print("No control found for ID ");
|
||||
Serial.println(id);
|
||||
}
|
||||
|
||||
Control* c = ESPUI.getControl(id);
|
||||
return;
|
||||
}
|
||||
|
||||
if (c == nullptr) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.print("No control found for ID ");
|
||||
Serial.println(id);
|
||||
}
|
||||
|
||||
return;
|
||||
if (c->callback == nullptr) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.print("No callback found for ID ");
|
||||
Serial.println(id);
|
||||
}
|
||||
|
||||
if (c->callback == nullptr) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.print("No callback found for ID ");
|
||||
Serial.println(id);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
if (msg.startsWith("bdown:")) {
|
||||
c->callback(c, B_DOWN);
|
||||
} else if (msg.startsWith("bup:")) {
|
||||
c->callback(c, B_UP);
|
||||
} else if (msg.startsWith("pfdown:")) {
|
||||
c->callback(c, P_FOR_DOWN);
|
||||
} else if (msg.startsWith("pfup:")) {
|
||||
c->callback(c, P_FOR_UP);
|
||||
} else if (msg.startsWith("pldown:")) {
|
||||
c->callback(c, P_LEFT_DOWN);
|
||||
} else if (msg.startsWith("plup:")) {
|
||||
c->callback(c, P_LEFT_UP);
|
||||
} else if (msg.startsWith("prdown:")) {
|
||||
c->callback(c, P_RIGHT_DOWN);
|
||||
} else if (msg.startsWith("prup:")) {
|
||||
c->callback(c, P_RIGHT_UP);
|
||||
} else if (msg.startsWith("pbdown:")) {
|
||||
c->callback(c, P_BACK_DOWN);
|
||||
} else if (msg.startsWith("pbup:")) {
|
||||
c->callback(c, P_BACK_UP);
|
||||
} else if (msg.startsWith("pcdown:")) {
|
||||
c->callback(c, P_CENTER_DOWN);
|
||||
} else if (msg.startsWith("pcup:")) {
|
||||
c->callback(c, P_CENTER_UP);
|
||||
} else if (msg.startsWith("sactive:")) {
|
||||
ESPUI.updateSwitcher(c->id, true);
|
||||
c->callback(c, S_ACTIVE);
|
||||
} else if (msg.startsWith("sinactive:")) {
|
||||
ESPUI.updateSwitcher(c->id, false);
|
||||
c->callback(c, S_INACTIVE);
|
||||
} else if (msg.startsWith("slvalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
ESPUI.updateControl(c);
|
||||
c->callback(c, SL_VALUE);
|
||||
} else if (msg.startsWith("nvalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
c->callback(c, N_VALUE);
|
||||
} else if (msg.startsWith("tvalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
c->callback(c, T_VALUE);
|
||||
} else if (msg.startsWith("svalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
c->callback(c, S_VALUE);
|
||||
} else {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.println("Malformated message from the websocket");
|
||||
}
|
||||
}
|
||||
} break;
|
||||
|
||||
if (msg.startsWith("bdown:")) {
|
||||
c->callback(c, B_DOWN);
|
||||
} else if (msg.startsWith("bup:")) {
|
||||
c->callback(c, B_UP);
|
||||
} else if (msg.startsWith("pfdown:")) {
|
||||
c->callback(c, P_FOR_DOWN);
|
||||
} else if (msg.startsWith("pfup:")) {
|
||||
c->callback(c, P_FOR_UP);
|
||||
} else if (msg.startsWith("pldown:")) {
|
||||
c->callback(c, P_LEFT_DOWN);
|
||||
} else if (msg.startsWith("plup:")) {
|
||||
c->callback(c, P_LEFT_UP);
|
||||
} else if (msg.startsWith("prdown:")) {
|
||||
c->callback(c, P_RIGHT_DOWN);
|
||||
} else if (msg.startsWith("prup:")) {
|
||||
c->callback(c, P_RIGHT_UP);
|
||||
} else if (msg.startsWith("pbdown:")) {
|
||||
c->callback(c, P_BACK_DOWN);
|
||||
} else if (msg.startsWith("pbup:")) {
|
||||
c->callback(c, P_BACK_UP);
|
||||
} else if (msg.startsWith("pcdown:")) {
|
||||
c->callback(c, P_CENTER_DOWN);
|
||||
} else if (msg.startsWith("pcup:")) {
|
||||
c->callback(c, P_CENTER_UP);
|
||||
} else if (msg.startsWith("sactive:")) {
|
||||
ESPUI.updateSwitcher(c->id, true);
|
||||
c->callback(c, S_ACTIVE);
|
||||
} else if (msg.startsWith("sinactive:")) {
|
||||
ESPUI.updateSwitcher(c->id, false);
|
||||
c->callback(c, S_INACTIVE);
|
||||
} else if (msg.startsWith("slvalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
ESPUI.updateControl(c);
|
||||
c->callback(c, SL_VALUE);
|
||||
} else if (msg.startsWith("nvalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
c->callback(c, N_VALUE);
|
||||
} else if (msg.startsWith("tvalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
c->callback(c, T_VALUE);
|
||||
} else if (msg.startsWith("svalue:")) {
|
||||
c->value = msg.substring(msg.indexOf(':') + 1, msg.lastIndexOf(':'));
|
||||
c->callback(c, S_VALUE);
|
||||
} else {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.println("Malformated message from the websocket");
|
||||
}
|
||||
}
|
||||
} break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t ESPUIClass::addControl(ControlType type, const char* label,
|
||||
String value, ControlColor color,
|
||||
uint16_t parentControl,
|
||||
void (*callback)(Control*, int)) {
|
||||
Control* control =
|
||||
new Control(type, label, callback, value, color, parentControl);
|
||||
uint16_t ESPUIClass::addControl(ControlType type, const char *label, String value, ControlColor color, uint16_t parentControl,
|
||||
void (*callback)(Control *, int)) {
|
||||
Control *control = new Control(type, label, callback, value, color, parentControl);
|
||||
|
||||
if (this->controls == nullptr) {
|
||||
this->controls = control;
|
||||
} else {
|
||||
Control* iterator = this->controls;
|
||||
Control *iterator = this->controls;
|
||||
|
||||
while (iterator->next != nullptr) {
|
||||
iterator = iterator->next;
|
||||
@ -406,57 +402,40 @@ uint16_t ESPUIClass::addControl(ControlType type, const char* label,
|
||||
return control->id;
|
||||
}
|
||||
|
||||
int ESPUIClass::label(const char* label, ControlColor color, String value) {
|
||||
return addControl(ControlType::Label, label, value, color);
|
||||
int ESPUIClass::label(const char *label, ControlColor color, String value) { return addControl(ControlType::Label, label, value, color); }
|
||||
|
||||
int ESPUIClass::graph(const char *label, ControlColor color) { return addControl(ControlType::Graph, label, "", color); }
|
||||
|
||||
int ESPUIClass::slider(const char *label, void (*callback)(Control *, int), ControlColor color, String value) {
|
||||
return addControl(ControlType::Slider, label, "", color, Control::noParent, callback);
|
||||
}
|
||||
|
||||
int ESPUIClass::graph(const char* label, ControlColor color) {
|
||||
return addControl(ControlType::Graph, label, "", color);
|
||||
int ESPUIClass::button(const char *label, void (*callback)(Control *, int), ControlColor color, String value) {
|
||||
return addControl(ControlType::Button, label, value, color, Control::noParent, callback);
|
||||
}
|
||||
|
||||
int ESPUIClass::slider(const char* label, void (*callback)(Control*, int),
|
||||
ControlColor color, String value) {
|
||||
return addControl(ControlType::Slider, label, "", color, Control::noParent,
|
||||
callback);
|
||||
int ESPUIClass::switcher(const char *label, bool startState, void (*callback)(Control *, int), ControlColor color) {
|
||||
return addControl(ControlType::Switcher, label, "", color, Control::noParent, callback);
|
||||
}
|
||||
|
||||
int ESPUIClass::button(const char* label, void (*callback)(Control*, int),
|
||||
ControlColor color, String value) {
|
||||
return addControl(ControlType::Button, label, value, color, Control::noParent,
|
||||
callback);
|
||||
}
|
||||
|
||||
int ESPUIClass::switcher(const char* label, bool startState,
|
||||
void (*callback)(Control*, int), ControlColor color) {
|
||||
return addControl(ControlType::Switcher, label, "", color, Control::noParent,
|
||||
callback);
|
||||
}
|
||||
|
||||
int ESPUIClass::pad(const char* label, bool center,
|
||||
void (*callback)(Control*, int), ControlColor color) {
|
||||
int ESPUIClass::pad(const char *label, bool center, void (*callback)(Control *, int), ControlColor color) {
|
||||
if (center) {
|
||||
return addControl(ControlType::PadWithCenter, label, "", color,
|
||||
Control::noParent, callback);
|
||||
return addControl(ControlType::PadWithCenter, label, "", color, Control::noParent, callback);
|
||||
} else {
|
||||
return addControl(ControlType::Pad, label, "", color, Control::noParent,
|
||||
callback);
|
||||
return addControl(ControlType::Pad, label, "", color, Control::noParent, callback);
|
||||
}
|
||||
}
|
||||
|
||||
int ESPUIClass::number(const char* label, void (*callback)(Control*, int),
|
||||
ControlColor color, int number, int min, int max) {
|
||||
return addControl(ControlType::Number, label, String(number), color,
|
||||
Control::noParent, callback);
|
||||
int ESPUIClass::number(const char *label, void (*callback)(Control *, int), ControlColor color, int number, int min, int max) {
|
||||
return addControl(ControlType::Number, label, String(number), color, Control::noParent, callback);
|
||||
}
|
||||
|
||||
int ESPUIClass::text(const char* label, void (*callback)(Control*, int),
|
||||
ControlColor color, String value) {
|
||||
return addControl(ControlType::Text, label, value, color, Control::noParent,
|
||||
callback);
|
||||
int ESPUIClass::text(const char *label, void (*callback)(Control *, int), ControlColor color, String value) {
|
||||
return addControl(ControlType::Text, label, value, color, Control::noParent, callback);
|
||||
}
|
||||
|
||||
Control* ESPUIClass::getControl(uint16_t id) {
|
||||
Control* control = this->controls;
|
||||
Control *ESPUIClass::getControl(uint16_t id) {
|
||||
Control *control = this->controls;
|
||||
|
||||
while (control != nullptr) {
|
||||
if (control->id == id) {
|
||||
@ -469,7 +448,7 @@ Control* ESPUIClass::getControl(uint16_t id) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ESPUIClass::updateControl(Control* control, int clientId) {
|
||||
void ESPUIClass::updateControl(Control *control, int clientId) {
|
||||
if (!control) {
|
||||
return;
|
||||
}
|
||||
@ -514,19 +493,18 @@ void ESPUIClass::updateControl(Control* control, int clientId) {
|
||||
}
|
||||
|
||||
void ESPUIClass::updateControl(uint16_t id, int clientId) {
|
||||
Control* control = getControl(id);
|
||||
Control *control = getControl(id);
|
||||
|
||||
if (control) {
|
||||
updateControl(control, clientId);
|
||||
} else {
|
||||
if (this->verbosity) {
|
||||
Serial.println(String("Error: There is no control with ID ") +
|
||||
String(id));
|
||||
Serial.println(String("Error: There is no control with ID ") + String(id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ESPUIClass::updateControl(Control* control, String value, int clientId) {
|
||||
void ESPUIClass::updateControl(Control *control, String value, int clientId) {
|
||||
if (!control) {
|
||||
return;
|
||||
}
|
||||
@ -536,43 +514,30 @@ void ESPUIClass::updateControl(Control* control, String value, int clientId) {
|
||||
}
|
||||
|
||||
void ESPUIClass::updateControl(uint16_t id, String value, int clientId) {
|
||||
Control* control = getControl(id);
|
||||
Control *control = getControl(id);
|
||||
|
||||
if (control) {
|
||||
updateControl(control, value, clientId);
|
||||
} else {
|
||||
if (this->verbosity) {
|
||||
Serial.println(String("Error: There is no control with ID ") +
|
||||
String(id));
|
||||
Serial.println(String("Error: There is no control with ID ") + String(id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ESPUIClass::print(uint16_t id, String value) { updateControl(id, value); }
|
||||
|
||||
void ESPUIClass::updateLabel(uint16_t id, String value) {
|
||||
updateControl(id, value);
|
||||
}
|
||||
void ESPUIClass::updateLabel(uint16_t id, String value) { updateControl(id, value); }
|
||||
|
||||
void ESPUIClass::updateSlider(uint16_t id, int nValue, int clientId) {
|
||||
updateControl(id, String(nValue), clientId);
|
||||
}
|
||||
void ESPUIClass::updateSlider(uint16_t id, int nValue, int clientId) { updateControl(id, String(nValue), clientId); }
|
||||
|
||||
void ESPUIClass::updateSwitcher(uint16_t id, bool nValue, int clientId) {
|
||||
updateControl(id, String(nValue ? "1" : "0"), clientId);
|
||||
}
|
||||
void ESPUIClass::updateSwitcher(uint16_t id, bool nValue, int clientId) { updateControl(id, String(nValue ? "1" : "0"), clientId); }
|
||||
|
||||
void ESPUIClass::updateNumber(uint16_t id, int number, int clientId) {
|
||||
updateControl(id, String(number), clientId);
|
||||
}
|
||||
void ESPUIClass::updateNumber(uint16_t id, int number, int clientId) { updateControl(id, String(number), clientId); }
|
||||
|
||||
void ESPUIClass::updateText(uint16_t id, String text, int clientId) {
|
||||
updateControl(id, text, clientId);
|
||||
}
|
||||
void ESPUIClass::updateText(uint16_t id, String text, int clientId) { updateControl(id, text, clientId); }
|
||||
|
||||
void ESPUIClass::updateSelect(uint16_t id, String text, int clientId) {
|
||||
updateControl(id, text, clientId);
|
||||
}
|
||||
void ESPUIClass::updateSelect(uint16_t id, String text, int clientId) { updateControl(id, text, clientId); }
|
||||
|
||||
/*
|
||||
Convert & Transfer Arduino elements to JSON elements
|
||||
@ -580,13 +545,13 @@ Initially this function used to send the control element data individually.
|
||||
Due to a change in the ESPAsyncWebserver library this had top be changed to be
|
||||
sent as one blob at the beginning. Therefore a new type is used as well
|
||||
*/
|
||||
void ESPUIClass::jsonDom(AsyncWebSocketClient* client) {
|
||||
void ESPUIClass::jsonDom(AsyncWebSocketClient *client) {
|
||||
String json;
|
||||
DynamicJsonDocument document(8000);
|
||||
document["type"] = (int)UI_INITIAL_GUI;
|
||||
JsonArray items = document.createNestedArray("controls");
|
||||
|
||||
Control* control = this->controls;
|
||||
Control *control = this->controls;
|
||||
|
||||
JsonObject titleItem = items.createNestedObject();
|
||||
titleItem["type"] = (int)UI_TITLE;
|
||||
@ -628,8 +593,7 @@ void ESPUIClass::jsonDom(AsyncWebSocketClient* client) {
|
||||
client->text(json);
|
||||
}
|
||||
|
||||
void ESPUIClass::beginSPIFFS(const char* _title, const char* username,
|
||||
const char* password) {
|
||||
void ESPUIClass::beginSPIFFS(const char *_title, const char *username, const char *password) {
|
||||
ui_title = _title;
|
||||
this->basicAuthUsername = username;
|
||||
this->basicAuthPassword = password;
|
||||
@ -645,9 +609,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username,
|
||||
|
||||
if (!SPIFFS.begin()) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.println(
|
||||
"SPIFFS Mount Failed, PLEASE CHECK THE README ON HOW TO "
|
||||
"PREPARE YOUR ESP!!!!!!!");
|
||||
Serial.println("SPIFFS Mount Failed, PLEASE CHECK THE README ON HOW TO PREPARE YOUR ESP!!!!!!!");
|
||||
}
|
||||
|
||||
return;
|
||||
@ -659,9 +621,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username,
|
||||
|
||||
if (!SPIFFS.exists("/index.htm")) {
|
||||
if (ESPUI.verbosity) {
|
||||
Serial.println(
|
||||
"Please read the README!!!!!!!, Make sure to "
|
||||
"ESPUI.prepareFileSystem() once in an empty sketch");
|
||||
Serial.println("Please read the README!!!!!!!, Make sure to ESPUI.prepareFileSystem() once in an empty sketch");
|
||||
}
|
||||
|
||||
return;
|
||||
@ -675,27 +635,21 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username,
|
||||
ws->setAuthentication(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword);
|
||||
}
|
||||
|
||||
server->serveStatic("/", SPIFFS, "/")
|
||||
.setDefaultFile("index.htm")
|
||||
.setAuthentication(username, password);
|
||||
|
||||
server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm").setAuthentication(username, password);
|
||||
} else {
|
||||
server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm");
|
||||
}
|
||||
|
||||
// Heap for general Servertest
|
||||
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
request->send(200, "text/plain",
|
||||
String(ESP.getFreeHeap()) + " In SPIFFSmode");
|
||||
request->send(200, "text/plain", String(ESP.getFreeHeap()) + " In SPIFFSmode");
|
||||
});
|
||||
|
||||
server->onNotFound(
|
||||
[](AsyncWebServerRequest* request) { request->send(404); });
|
||||
server->onNotFound([](AsyncWebServerRequest *request) { request->send(404); });
|
||||
|
||||
server->begin();
|
||||
|
||||
@ -704,8 +658,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username,
|
||||
}
|
||||
}
|
||||
|
||||
void ESPUIClass::begin(const char* _title, const char* username,
|
||||
const char* password) {
|
||||
void ESPUIClass::begin(const char *_title, const char *username, const char *password) {
|
||||
basicAuthUsername = username;
|
||||
basicAuthPassword = password;
|
||||
|
||||
@ -723,114 +676,92 @@ void ESPUIClass::begin(const char* _title, const char* username,
|
||||
ws->onEvent(onWsEvent);
|
||||
server->addHandler(ws);
|
||||
|
||||
if (basicAuth && WS_AUTHENTICATION) ws->setAuthentication(username, password);
|
||||
if (basicAuth && WS_AUTHENTICATION)
|
||||
ws->setAuthentication(username, password);
|
||||
|
||||
server->on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response =
|
||||
request->beginResponse_P(200, "text/html", HTML_INDEX);
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", HTML_INDEX);
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
// Javascript files
|
||||
|
||||
server->on("/js/zepto.min.js", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/js/zepto.min.js", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response = request->beginResponse_P(
|
||||
200, "application/javascript", JS_ZEPTO_GZIP, sizeof(JS_ZEPTO_GZIP));
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", JS_ZEPTO_GZIP, sizeof(JS_ZEPTO_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
server->on("/js/controls.js", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/js/controls.js", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response =
|
||||
request->beginResponse_P(200, "application/javascript",
|
||||
JS_CONTROLS_GZIP, sizeof(JS_CONTROLS_GZIP));
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", JS_CONTROLS_GZIP, sizeof(JS_CONTROLS_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
server->on("/js/slider.js", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/js/slider.js", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response = request->beginResponse_P(
|
||||
200, "application/javascript", JS_SLIDER_GZIP, sizeof(JS_SLIDER_GZIP));
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", JS_SLIDER_GZIP, sizeof(JS_SLIDER_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
server->on("/js/tabbedcontent.js", HTTP_GET,
|
||||
[](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth &&
|
||||
!request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
server->on("/js/tabbedcontent.js", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response = request->beginResponse_P(
|
||||
200, "application/javascript", JS_TABBEDCONTENT_GZIP,
|
||||
sizeof(JS_TABBEDCONTENT_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", JS_TABBEDCONTENT_GZIP, sizeof(JS_TABBEDCONTENT_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
// Stylesheets
|
||||
|
||||
server->on("/css/style.css", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/css/style.css", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response = request->beginResponse_P(
|
||||
200, "text/css", CSS_STYLE_GZIP, sizeof(CSS_STYLE_GZIP));
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", CSS_STYLE_GZIP, sizeof(CSS_STYLE_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
server->on(
|
||||
"/css/normalize.css", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth &&
|
||||
!request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
AsyncWebServerResponse* response = request->beginResponse_P(
|
||||
200, "text/css", CSS_NORMALIZE_GZIP, sizeof(CSS_NORMALIZE_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
// Heap for general Servertest
|
||||
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest* request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
|
||||
ESPUI.basicAuthPassword)) {
|
||||
server->on("/css/normalize.css", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
request->send(200, "text/plain",
|
||||
String(ESP.getFreeHeap()) + " In Memorymode");
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", CSS_NORMALIZE_GZIP, sizeof(CSS_NORMALIZE_GZIP));
|
||||
response->addHeader("Content-Encoding", "gzip");
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
server->onNotFound(
|
||||
[](AsyncWebServerRequest* request) { request->send(404); });
|
||||
// Heap for general Servertest
|
||||
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword)) {
|
||||
return request->requestAuthentication();
|
||||
}
|
||||
|
||||
request->send(200, "text/plain", String(ESP.getFreeHeap()) + " In Memorymode");
|
||||
});
|
||||
|
||||
server->onNotFound([](AsyncWebServerRequest *request) { request->send(404); });
|
||||
|
||||
server->begin();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user