1
0
mirror of https://github.com/s00500/ESPUI.git synced 2025-07-04 11:20:19 +00:00

11 Commits
1.6.0 ... 1.6.1

Author SHA1 Message Date
b21c5d3b2c 1.6.1 2018-12-27 11:37:50 +01:00
98d1215d7a #44 Adding define to reenable WS BasicAuth 2018-12-27 11:34:28 +01:00
7a10457f99 #44 Adding Basic Auth
- Also authing websockets
- Implemented on begin and beginSpiffs
- Added notes to Gui example
2018-12-26 13:38:38 +01:00
f31575b50c #43 Sending Initial GUI as one big array
- Added new  INITIAL_GUI Type
- spliting GUI Blob to events in controls js
- formating the json in jsonDom into one big array
2018-12-26 12:35:35 +01:00
980e20818f Merge pull request #42 from don41382/patch-2
udpateSlider implementation with label was missing
2018-12-02 14:22:43 +01:00
e9aca78c9c udpateSlider implementation with label was missing 2018-12-02 11:41:45 +01:00
a56f5decc7 Update issue templates 2018-11-29 11:49:18 +01:00
02a21ec747 Update README.md 2018-11-27 22:21:39 +01:00
24258da42d Update README.md 2018-11-27 22:20:51 +01:00
37bb44066b Merge pull request #38 from orithena/feature-style-input
Input style now similar to switches, fixed max-width
2018-11-27 22:18:51 +01:00
1d7da26dcd Input style now similar to switches, fixed max-width 2018-11-27 22:01:59 +01:00
14 changed files with 382 additions and 185 deletions

35
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,35 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -78,6 +78,8 @@ Now you are set to go and use any code you want to with this library
- Control pad - Control pad
- Control pad with center button - Control pad with center button
- Slider - Slider
- Text Input (updateable)
- Numberinput (updateable)
Checkout the example for the usage Checkout the example for the usage
@ -100,11 +102,12 @@ Now you are set to go and use any code you want to with this library
- ~~Multiline Labels~~ - ~~Multiline Labels~~
- ~~GZip Files and serve from memory~~ - ~~GZip Files and serve from memory~~
- Datagraph output -> *WIP* - Datagraph output -> *WIP*
- Number input -> *WIP* - ~~Number input ~~
- Text input -> *WIP* - ~~Text input ~~
- Dokumentation for Text and number widget
- Number min and max value
- proper return value (as int and not as string) for slider - proper return value (as int and not as string) for slider
- Maybe a slider range setting, meanwhile please use *map()* - Maybe a slider range setting, meanwhile please use *map()*
- Improve slider stability
## Documentation ## Documentation

View File

@ -786,3 +786,26 @@
} }
*/ */
/* --------------------------------------------------------------
* Text and number inputs
*--------------------------------------------------------------- */
input {
margin: 0 auto 1.2rem auto;
padding: 2px 5px;
width: 100%;
box-sizing: border-box;
border: none;
border-radius: 4px;
box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background: rgba(255, 255, 255, 0.8);
}
input[id^="num"] {
max-width: 6em;
width:auto;
text-align: right;
font-weight: bold;
font-size: 115%;
}

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,4 @@
const UI_INITIAL_GUI = 100;
const UI_TITEL = 0; const UI_TITEL = 0;
const UI_LABEL = 1; const UI_LABEL = 1;
@ -118,20 +119,31 @@ function start() {
$("#conStatus").text("Connected"); $("#conStatus").text("Connected");
websockConnected = true; websockConnected = true;
}; };
websock.onclose = function (evt) { websock.onclose = function (evt) {
console.log("websock close"); console.log("websock close");
conStatusError(); conStatusError();
}; };
websock.onerror = function (evt) { websock.onerror = function (evt) {
console.log(evt); console.log(evt);
conStatusError(); conStatusError();
}; };
websock.onmessage = function(evt) {
console.log(evt); var handleEvent = function (evt) {
//console.log(evt);
var data = JSON.parse(evt.data); var data = JSON.parse(evt.data);
var e = document.body; var e = document.body;
var center = ""; var center = "";
switch (data.type) { switch (data.type) {
case UI_INITIAL_GUI:
data.controls.forEach(element => {
var fauxEvent = {
data: JSON.stringify(element)
};
handleEvent(fauxEvent);
});
break;
case UI_TITEL: case UI_TITEL:
document.title = data.label; document.title = data.label;
$("#mainHeader").html(data.label); $("#mainHeader").html(data.label);
@ -418,6 +430,8 @@ function start() {
break; break;
} }
}; };
websock.onmessage = handleEvent;
} }
function numberchange(number) { function numberchange(number) {

View File

@ -1,8 +1,8 @@
const UI_TITEL=0;const UI_LABEL=1;const UPDATE_LABEL=6;const UI_BUTTON=2;const UI_SWITCHER=3;const UPDATE_SWITCHER=7;const UI_PAD=4;const UI_CPAD=5;const UI_SLIDER=8;const UPDATE_SLIDER=9;const UI_NUMBER=10;const UPDATE_NUMBER=11;const UI_TEXT_INPUT=12;const UPDATE_TEXT_INPUT=13;const UI_GRAPH=14;const CLEAR_GRAPH=15;const ADD_GRAPH_POINT=16;const FOR=0;const BACK=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_NONE=7;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";break;case C_EMERALD:return"emerald";break;case C_PETERRIVER:return"peterriver";break;case C_WETASPHALT:return"wetasphalt";break;case C_SUNFLOWER:return"sunflower";break;case C_CARROT:return"carrot";break;case C_ALIZARIN:return"alizarin";break;case C_NONE:return"";break;default:return"";}} const UI_INITIAL_GUI=100;const UI_TITEL=0;const UI_LABEL=1;const UPDATE_LABEL=6;const UI_BUTTON=2;const UI_SWITCHER=3;const UPDATE_SWITCHER=7;const UI_PAD=4;const UI_CPAD=5;const UI_SLIDER=8;const UPDATE_SLIDER=9;const UI_NUMBER=10;const UPDATE_NUMBER=11;const UI_TEXT_INPUT=12;const UPDATE_TEXT_INPUT=13;const UI_GRAPH=14;const CLEAR_GRAPH=15;const ADD_GRAPH_POINT=16;const FOR=0;const BACK=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_NONE=7;function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";break;case C_EMERALD:return"emerald";break;case C_PETERRIVER:return"peterriver";break;case C_WETASPHALT:return"wetasphalt";break;case C_SUNFLOWER:return"sunflower";break;case C_CARROT:return"carrot";break;case C_ALIZARIN:return"alizarin";break;case C_NONE:return"";break;default:return"";}}
var websock;var websockConnected=false;function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();} var websock;var websockConnected=false;function restart(){$(document).add("*").off();$("#row").html("");websock.close();start();}
function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart});} function conStatusError(){websockConnected=false;$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart});}
function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}} function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}}
function start(){document.addEventListener("visibilitychange",handleVisibilityChange,false);websock=new WebSocket("ws://"+window.location.hostname+"/ws");websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;};websock.onclose=function(evt){console.log("websock close");conStatusError();};websock.onerror=function(evt){console.log(evt);conStatusError();};websock.onmessage=function(evt){console.log(evt);var data=JSON.parse(evt.data);var e=document.body;var center="";switch(data.type){case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:$("#row").append("<div class='two columns card tcenter "+ function start(){document.addEventListener("visibilitychange",handleVisibilityChange,false);websock=new WebSocket("ws://"+window.location.hostname+"/ws");websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;};websock.onclose=function(evt){console.log("websock close");conStatusError();};websock.onerror=function(evt){console.log(evt);conStatusError();};var handleEvent=function(evt){var data=JSON.parse(evt.data);var e=document.body;var center="";switch(data.type){case UI_INITIAL_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element)};handleEvent(fauxEvent);});break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case UI_LABEL:$("#row").append("<div class='two columns card tcenter "+
colorClass(data.color)+ colorClass(data.color)+
"'><h5 id='"+ "'><h5 id='"+
data.id+ data.id+
@ -134,7 +134,7 @@ data.value+
"' onchange='textchange("+ "' onchange='textchange("+
data.id+ data.id+
")' />"+ ")' />"+
"</div>");break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);break;default:console.error("Unknown type or event");break;}};} "</div>");break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);break;default:console.error("Unknown type or event");break;}};websock.onmessage=handleEvent;}
function numberchange(number){var val=$("#num"+number).val();websock.send("nvalue:"+val+":"+number);console.log(val);} function numberchange(number){var val=$("#num"+number).val();websock.send("nvalue:"+val+":"+number);console.log(val);}
function textchange(number){var val=$("#text"+number).val();websock.send("tvalue:"+val+":"+number);console.log(val);} function textchange(number){var val=$("#text"+number).val();websock.send("tvalue:"+val+":"+number);console.log(val);}
function buttonclick(number,isdown){if(isdown)websock.send("bdown:"+number);else websock.send("bup:"+number);} function buttonclick(number,isdown){if(isdown)websock.send("bdown:"+number);else websock.send("bup:"+number);}

View File

@ -157,11 +157,19 @@ void setup(void) {
/* /*
.begin loads and serves all files from PROGMEM directly. .begin loads and serves all files from PROGMEM directly.
If you want to serve the files from SPIFFS use .beginSPIFFS If you want to serve the files from SPIFFS use ESPUI.beginSPIFFS
(.prepareFileSystem has to be run in an empty sketch before) (.prepareFileSystem has to be run in an empty sketch before)
*/ */
dnsServer.start(DNS_PORT, "*", apIP); dnsServer.start(DNS_PORT, "*", apIP);
/*
* Optionally you can use HTTP BasicAuth. Keep in mind that this is NOT a
SECURE way of limiting access.
* Anyone who is able to sniff traffic will be able to intercept your password
since it is transmitted in cleartext ESPUI.begin("ESPUI Control", "myuser",
"mypassword");
*/
ESPUI.begin("ESPUI Control"); ESPUI.begin("ESPUI Control");
} }

View File

@ -6,16 +6,13 @@
"type": "git", "type": "git",
"url": "https://github.com/s00500/ESPUI.git" "url": "https://github.com/s00500/ESPUI.git"
}, },
"authors": [ "authors": [{
{
"name": "Lukas Bachschwell", "name": "Lukas Bachschwell",
"email": "lukas@lbsfilm.at", "email": "lukas@lbsfilm.at",
"url": "https://lbsfilm.at", "url": "https://lbsfilm.at",
"maintainer": true "maintainer": true
} }],
], "dependencies": [{
"dependencies": [
{
"name": "ESP Async WebServer", "name": "ESP Async WebServer",
"authors": "Hristo Gochkov", "authors": "Hristo Gochkov",
"frameworks": "arduino" "frameworks": "arduino"
@ -26,7 +23,7 @@
"frameworks": "arduino" "frameworks": "arduino"
} }
], ],
"version": "1.6.0", "version": "1.6.1",
"frameworks": "arduino", "frameworks": "arduino",
"platforms": "*" "platforms": "*"
} }

View File

@ -1,5 +1,5 @@
name=ESPUI name=ESPUI
version=1.6.0 version=1.6.1
author=Lukas Bachschwell author=Lukas Bachschwell
maintainer=Lukas Bachschwell <lukas@lbsfilm.at> maintainer=Lukas Bachschwell <lukas@lbsfilm.at>
sentence=ESP32 and ESP8266 Web Interface Library sentence=ESP32 and ESP8266 Web Interface Library

View File

@ -492,6 +492,16 @@ void ESPUIClass::updateSlider(int id, int nValue, int clientId) {
} }
} }
void ESPUIClass::updateSlider(String label, int nValue, int clientId) {
if (!labelExists(label)) {
if (DEBUG_ESPUI)
Serial.println("UI ERROR: Element does not " + String(label) +
" exist, cannot update!");
return;
}
updateSlider(getIdByLabel(label), nValue, clientId);
}
void ESPUIClass::updateSwitcher(int id, bool nValue, int clientId) { void ESPUIClass::updateSwitcher(int id, bool nValue, int clientId) {
if (id < cIndex && controls[id]->type == UI_SWITCHER) { if (id < cIndex && controls[id]->type == UI_SWITCHER) {
controls[id]->value = nValue ? 1 : 0; controls[id]->value = nValue ? 1 : 0;
@ -603,28 +613,48 @@ bool ESPUIClass::labelExists(String label) {
return false; return false;
} }
// Convert & Transfer Arduino elements to JSON elements /*
Convert & Transfer Arduino elements to JSON elements
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) {
for (int i = -1; i < cIndex; i++) {
String json; String json;
StaticJsonBuffer<200> jsonBuffer; DynamicJsonBuffer jsonBuffer(2000);
JsonObject &root = jsonBuffer.createObject(); JsonObject &root = jsonBuffer.createObject();
root["type"] = UI_INITIAL_GUI;
JsonArray &items = jsonBuffer.createArray();
for (int i = -1; i < cIndex; i++) {
JsonObject &item = jsonBuffer.createObject();
if (i == -1) { if (i == -1) {
root["type"] = UI_TITEL; item["type"] = UI_TITEL;
root["label"] = String(ui_title); item["label"] = String(ui_title);
} else { } else {
root["type"] = controls[i]->type; item["type"] = controls[i]->type;
root["label"] = String(controls[i]->label); item["label"] = String(controls[i]->label);
root["value"] = String(controls[i]->value); item["value"] = String(controls[i]->value);
root["color"] = String(controls[i]->color); item["color"] = String(controls[i]->color);
root["id"] = String(i); item["id"] = String(i);
} }
items.add(item);
}
// Send as one big bunch
root["controls"] = items;
root.printTo(json); root.printTo(json);
client->text(json); client->text(json);
} }
}
void ESPUIClass::beginSPIFFS(const char *_title) { void ESPUIClass::beginSPIFFS(const char *_title) {
begin(_title, NULL, NULL);
basicAuth = false;
}
void ESPUIClass::beginSPIFFS(const char *_title, const char *username,
const char *password) {
ui_title = _title; ui_title = _title;
server = new AsyncWebServer(80); server = new AsyncWebServer(80);
ws = new AsyncWebSocket("/ws"); ws = new AsyncWebSocket("/ws");
@ -646,10 +676,29 @@ void ESPUIClass::beginSPIFFS(const char *_title) {
ws->onEvent(onWsEvent); ws->onEvent(onWsEvent);
server->addHandler(ws); server->addHandler(ws);
if (basicAuth && username != NULL && password != NULL) {
basicAuthPassword = password;
basicAuthUsername = username;
basicAuth = true;
if (WS_AUTHENTICATION)
ws->setAuthentication(this->basicAuthUsername, this->basicAuthPassword);
server->serveStatic("/", SPIFFS, "/")
.setDefaultFile("index.htm")
.setAuthentication(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword);
} else if (basicAuth) {
Serial.println(
"Could not enable BasicAuth: Username or password are not set");
} else {
server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm");
}
// Heap for general Servertest // Heap for general Servertest
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) { server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) {
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
ESPUI.basicAuthPassword))
return request->requestAuthentication();
request->send(200, "text/plain", request->send(200, "text/plain",
String(ESP.getFreeHeap()) + " In SPIFFSmode"); String(ESP.getFreeHeap()) + " In SPIFFSmode");
}); });
@ -657,26 +706,50 @@ void ESPUIClass::beginSPIFFS(const char *_title) {
server->onNotFound( server->onNotFound(
[](AsyncWebServerRequest *request) { request->send(404); }); [](AsyncWebServerRequest *request) { request->send(404); });
server->on("/zepto.js", HTTP_GET, [](AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(
200, "application/javascript", JS_ZEPTO_GZIP, sizeof(JS_ZEPTO_GZIP));
response->addHeader("Content-Encoding", "gzip");
request->send(response);
});
server->begin(); server->begin();
if (DEBUG_ESPUI) Serial.println("UI Initialized"); if (DEBUG_ESPUI) Serial.println("UI Initialized");
} }
void ESPUIClass::begin(const char *_title) { void ESPUIClass::begin(const char *_title) {
begin(_title, NULL, NULL);
basicAuth = false;
}
void ESPUIClass::begin(const char *_title, const char *username,
const char *password) {
if (basicAuth && username != NULL && password != NULL) {
basicAuthPassword = password;
basicAuthUsername = username;
basicAuth = true;
} else if (basicAuth) {
Serial.println(
"Could not enable BasicAuth: Username or password are not set");
}
ui_title = _title; ui_title = _title;
server = new AsyncWebServer(80); server = new AsyncWebServer(80);
ws = new AsyncWebSocket("/ws"); ws = new AsyncWebSocket("/ws");
ws->onEvent(onWsEvent); ws->onEvent(onWsEvent);
server->addHandler(ws); server->addHandler(ws);
if (basicAuth && username != NULL && password != NULL) {
basicAuthPassword = password;
basicAuthUsername = username;
basicAuth = true;
if (WS_AUTHENTICATION)
ws->setAuthentication(this->basicAuthUsername, this->basicAuthPassword);
} else if (basicAuth) {
Serial.println(
"Could not enable BasicAuth: Username or password are not set");
}
server->on("/", HTTP_GET, [](AsyncWebServerRequest *request) { server->on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
ESPUI.basicAuthPassword))
return request->requestAuthentication();
AsyncWebServerResponse *response = AsyncWebServerResponse *response =
request->beginResponse_P(200, "text/html", HTML_INDEX); request->beginResponse_P(200, "text/html", HTML_INDEX);
request->send(response); request->send(response);
@ -685,6 +758,9 @@ void ESPUIClass::begin(const char *_title) {
// Javascript files // Javascript files
server->on("/js/zepto.min.js", HTTP_GET, [](AsyncWebServerRequest *request) { 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( AsyncWebServerResponse *response = request->beginResponse_P(
200, "application/javascript", JS_ZEPTO_GZIP, sizeof(JS_ZEPTO_GZIP)); 200, "application/javascript", JS_ZEPTO_GZIP, sizeof(JS_ZEPTO_GZIP));
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
@ -692,6 +768,9 @@ void ESPUIClass::begin(const char *_title) {
}); });
server->on("/js/controls.js", HTTP_GET, [](AsyncWebServerRequest *request) { server->on("/js/controls.js", HTTP_GET, [](AsyncWebServerRequest *request) {
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
ESPUI.basicAuthPassword))
return request->requestAuthentication();
AsyncWebServerResponse *response = AsyncWebServerResponse *response =
request->beginResponse_P(200, "application/javascript", request->beginResponse_P(200, "application/javascript",
JS_CONTROLS_GZIP, sizeof(JS_CONTROLS_GZIP)); JS_CONTROLS_GZIP, sizeof(JS_CONTROLS_GZIP));
@ -700,6 +779,9 @@ void ESPUIClass::begin(const char *_title) {
}); });
server->on("/js/slider.js", HTTP_GET, [](AsyncWebServerRequest *request) { 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( AsyncWebServerResponse *response = request->beginResponse_P(
200, "application/javascript", JS_SLIDER_GZIP, sizeof(JS_SLIDER_GZIP)); 200, "application/javascript", JS_SLIDER_GZIP, sizeof(JS_SLIDER_GZIP));
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
@ -709,6 +791,9 @@ void ESPUIClass::begin(const char *_title) {
// Stylesheets // Stylesheets
server->on("/css/style.css", HTTP_GET, [](AsyncWebServerRequest *request) { 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( AsyncWebServerResponse *response = request->beginResponse_P(
200, "text/css", CSS_STYLE_GZIP, sizeof(CSS_STYLE_GZIP)); 200, "text/css", CSS_STYLE_GZIP, sizeof(CSS_STYLE_GZIP));
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
@ -717,6 +802,9 @@ void ESPUIClass::begin(const char *_title) {
server->on( server->on(
"/css/normalize.css", HTTP_GET, [](AsyncWebServerRequest *request) { "/css/normalize.css", HTTP_GET, [](AsyncWebServerRequest *request) {
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
ESPUI.basicAuthPassword))
return request->requestAuthentication();
AsyncWebServerResponse *response = request->beginResponse_P( AsyncWebServerResponse *response = request->beginResponse_P(
200, "text/css", CSS_NORMALIZE_GZIP, sizeof(CSS_NORMALIZE_GZIP)); 200, "text/css", CSS_NORMALIZE_GZIP, sizeof(CSS_NORMALIZE_GZIP));
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
@ -725,6 +813,9 @@ void ESPUIClass::begin(const char *_title) {
// Heap for general Servertest // Heap for general Servertest
server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) { server->on("/heap", HTTP_GET, [](AsyncWebServerRequest *request) {
if (ESPUI.basicAuth && !request->authenticate(ESPUI.basicAuthUsername,
ESPUI.basicAuthPassword))
return request->requestAuthentication();
request->send(200, "text/plain", request->send(200, "text/plain",
String(ESP.getFreeHeap()) + " In Memorymode"); String(ESP.getFreeHeap()) + " In Memorymode");
}); });

View File

@ -2,6 +2,7 @@
#define ESPUI_h #define ESPUI_h
#define DEBUG_ESPUI true #define DEBUG_ESPUI true
#define WS_AUTHENTICATION false
#include "Arduino.h" #include "Arduino.h"
#include "ArduinoJson.h" #include "ArduinoJson.h"
@ -40,6 +41,7 @@ typedef struct Control {
} Control; } Control;
// Message Types (and control types) // Message Types (and control types)
#define UI_INITIAL_GUI 100
#define UI_TITEL 0 #define UI_TITEL 0
#define UI_LABEL 1 #define UI_LABEL 1
@ -101,7 +103,11 @@ typedef struct Control {
class ESPUIClass { class ESPUIClass {
public: public:
void begin(const char *_title); // Setup servers and page in Memorymode void begin(const char *_title); // Setup servers and page in Memorymode
void begin(const char *_title, const char *username, const char *password);
void beginSPIFFS(const char *_title); // Setup servers and page in SPIFFSmode void beginSPIFFS(const char *_title); // Setup servers and page in SPIFFSmode
void beginSPIFFS(const char *_title, const char *username,
const char *password);
void prepareFileSystem(); // Initially preps the filesystem and loads a lot void prepareFileSystem(); // Initially preps the filesystem and loads a lot
// of stuff into SPIFFS // of stuff into SPIFFS
@ -159,6 +165,9 @@ class ESPUIClass {
bool labelExists(String label); bool labelExists(String label);
private: private:
const char *basicAuthUsername;
const char *basicAuthPassword;
bool basicAuth = true;
AsyncWebServer *server; AsyncWebServer *server;
AsyncWebSocket *ws; AsyncWebSocket *ws;
}; };

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long