Added format editor and template engine

This commit is contained in:
Magnus Persson
2022-01-23 11:11:41 +01:00
parent 7b4e95b5ad
commit d3a71da643
23 changed files with 992 additions and 165 deletions

View File

@ -29,6 +29,7 @@ SOFTWARE.
#include <resources.hpp>
#include <tempsensor.hpp>
#include <webserver.hpp>
#include <templating.hpp>
#include <wifi.hpp>
WebServerHandler myWebServerHandler; // My wrapper class fr webserver functions
@ -114,6 +115,7 @@ void WebServerHandler::webHandleUpload() {
doc["device"] = checkHtmlFile(WebServerHandler::HTML_DEVICE);
doc["config"] = checkHtmlFile(WebServerHandler::HTML_CONFIG);
doc["calibration"] = checkHtmlFile(WebServerHandler::HTML_CALIBRATION);
doc["format"] = checkHtmlFile(WebServerHandler::HTML_FORMAT);
doc["about"] = checkHtmlFile(WebServerHandler::HTML_ABOUT);
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
@ -522,7 +524,7 @@ void WebServerHandler::webHandleDeviceParam() {
//
void WebServerHandler::webHandleFormulaRead() {
LOG_PERF_START("webserver-api-formula-read");
Log.notice(F("WEB : webServer callback for /api/formula/get." CR));
Log.notice(F("WEB : webServer callback for /api/formula(get)." CR));
DynamicJsonDocument doc(250);
const RawFormulaData& fd = myConfig.getFormulaData();
@ -583,13 +585,150 @@ void WebServerHandler::webHandleFormulaRead() {
LOG_PERF_STOP("webserver-api-formula-read");
}
//
// Update format template
//
void WebServerHandler::webHandleConfigFormatWrite() {
LOG_PERF_START("webserver-api-config-format-write");
String id = _server->arg(PARAM_ID);
Log.notice(F("WEB : webServer callback for /api/config/format(post)." CR));
if (!id.equalsIgnoreCase(myConfig.getID())) {
Log.error(F("WEB : Wrong ID received %s, expected %s" CR), id.c_str(),
myConfig.getID());
_server->send(400, "text/plain", "Invalid ID.");
LOG_PERF_STOP("webserver-api-config-format-write");
return;
}
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
Log.verbose(F("WEB : %s." CR), getRequestArguments().c_str());
#endif
bool success = false;
// Only one option is posted so we done need to check them all.
if (_server->hasArg(PARAM_FORMAT_HTTP1)) {
success = writeFile(TPL_FNAME_HTTP1, _server->arg(PARAM_FORMAT_HTTP1));
} else if (_server->hasArg(PARAM_FORMAT_HTTP2)) {
success = writeFile(TPL_FNAME_HTTP2, _server->arg(PARAM_FORMAT_HTTP2));
} else if (_server->hasArg(PARAM_FORMAT_INFLUXDB)) {
success = writeFile(TPL_FNAME_INFLUXDB, _server->arg(PARAM_FORMAT_INFLUXDB));
} else if (_server->hasArg(PARAM_FORMAT_MQTT)) {
success = writeFile(TPL_FNAME_MQTT, _server->arg(PARAM_FORMAT_MQTT));
}
/*else if (_server->hasArg(PARAM_FORMAT_BREWFATHER)) {
success = writeFile(TPL_FNAME_BREWFATHER, _server->arg(PARAM_FORMAT_BREWFATHER));
}*/
if (success) {
_server->sendHeader("Location", "/format.htm", true);
_server->send(302, "text/plain", "Format updated");
} else {
Log.error(F("WEB : Unable to store format file" CR));
_server->send(400, "text/plain", "Unable to store format in file.");
}
LOG_PERF_STOP("webserver-api-config-format-write");
}
//
// Write file to disk, if there is no data then delete the current file (if it exists) = reset to default.
//
bool WebServerHandler::writeFile(String fname, String data) {
if (data.length()) {
data = urldecode(data);
File file = LittleFS.open(fname, "w");
if (file) {
Log.notice(F("WEB : Storing template data in %s." CR), fname.c_str());
file.write(data.c_str());
file.close();
return true;
}
} else {
Log.notice(F("WEB : No template data to store in %s, reverting to default." CR), fname.c_str());
LittleFS.remove(fname);
return true;
}
return false;
}
//
// Read file from disk
//
String WebServerHandler::readFile(String fname) {
File file = LittleFS.open(fname, "r");
if (file) {
char buf[file.size()+1];
memset(&buf[0], 0, file.size()+1);
file.readBytes(&buf[0], file.size());
file.close();
Log.notice(F("WEB : Read template data from %s." CR), fname.c_str());
return String(&buf[0]);
}
return "";
}
//
// Get format templates
//
void WebServerHandler::webHandleConfigFormatRead() {
LOG_PERF_START("webserver-api-config-format-read");
Log.notice(F("WEB : webServer callback for /api/config/formula(get)." CR));
DynamicJsonDocument doc(2048);
doc[PARAM_ID] = myConfig.getID();
String s = readFile(TPL_FNAME_HTTP1);
if (s.length())
doc[PARAM_FORMAT_HTTP1] = urlencode(s);
else
doc[PARAM_FORMAT_HTTP1] = urlencode(&iSpindleFormat[0]);
s = readFile(TPL_FNAME_HTTP2);
if (s.length())
doc[PARAM_FORMAT_HTTP2] = urlencode(s);
else
doc[PARAM_FORMAT_HTTP2] = urlencode(&iSpindleFormat[0]);
/*s = readFile(TPL_FNAME_BREWFATHER);
if (s.length())
doc[PARAM_FORMAT_BREWFATHER] = urlencode(s);
else
doc[PARAM_FORMAT_BREWFATHER] = urlencode(&brewfatherFormat[0]);*/
s = readFile(TPL_FNAME_INFLUXDB);
if (s.length())
doc[PARAM_FORMAT_INFLUXDB] = urlencode(s);
else
doc[PARAM_FORMAT_INFLUXDB] = urlencode(&influxDbFormat[0]);
s = readFile(TPL_FNAME_MQTT);
if (s.length())
doc[PARAM_FORMAT_MQTT] = urlencode(s);
else
doc[PARAM_FORMAT_MQTT] = urlencode(&iSpindleFormat[0]);
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
serializeJson(doc, Serial);
Serial.print(CR);
#endif
String out;
serializeJson(doc, out);
_server->send(200, "application/json", out.c_str());
LOG_PERF_STOP("webserver-api-config-format-read");
}
//
// Update hardware settings.
//
void WebServerHandler::webHandleFormulaWrite() {
LOG_PERF_START("webserver-api-formula-write");
String id = _server->arg(PARAM_ID);
Log.notice(F("WEB : webServer callback for /api/formula/post." CR));
Log.notice(F("WEB : webServer callback for /api/formula(post)." CR));
if (!id.equalsIgnoreCase(myConfig.getID())) {
Log.error(F("WEB : Wrong ID received %s, expected %s" CR), id.c_str(),
@ -677,6 +816,8 @@ const char* WebServerHandler::getHtmlFileName(HtmlFile item) {
return "config.min.htm";
case HTML_CALIBRATION:
return "calibration.min.htm";
case HTML_FORMAT:
return "format.min.htm";
case HTML_ABOUT:
return "about.min.htm";
}
@ -727,6 +868,7 @@ bool WebServerHandler::setupWebServer() {
_server->on("/config.htm", std::bind(&WebServerHandler::webReturnConfigHtm, this));
_server->on("/calibration.htm",
std::bind(&WebServerHandler::webReturnCalibrationHtm, this));
_server->on("/format.htm", std::bind(&WebServerHandler::webReturnFormatHtm, this));
_server->on("/about.htm", std::bind(&WebServerHandler::webReturnAboutHtm, this));
#else
// Show files in the filessytem at startup
@ -745,7 +887,7 @@ bool WebServerHandler::setupWebServer() {
// upload page.
if (checkHtmlFile(HTML_INDEX) && checkHtmlFile(HTML_DEVICE) &&
checkHtmlFile(HTML_CONFIG) && checkHtmlFile(HTML_CALIBRATION) &&
checkHtmlFile(HTML_ABOUT)) {
checkHtmlFile(HTML_FORMAT) && checkHtmlFile(HTML_ABOUT)) {
Log.notice(F("WEB : All html files exist, starting in normal mode." CR));
_server->serveStatic("/", LittleFS, "/index.min.htm");
@ -754,6 +896,7 @@ bool WebServerHandler::setupWebServer() {
_server->serveStatic("/config.htm", LittleFS, "/config.min.htm");
_server->serveStatic("/about.htm", LittleFS, "/about.min.htm");
_server->serveStatic("/calibration.htm", LittleFS, "/calibration.min.htm");
_server->serveStatic("/format.htm", LittleFS, "/format.min.htm");
// Also add the static upload view in case we we have issues that needs to
// be fixed.
@ -808,6 +951,12 @@ bool WebServerHandler::setupWebServer() {
_server->on("/api/config/hardware", HTTP_POST,
std::bind(&WebServerHandler::webHandleConfigHardware,
this)); // Change hardware settings
_server->on("/api/config/format", HTTP_GET,
std::bind(&WebServerHandler::webHandleConfigFormatRead,
this)); // Change template formats
_server->on("/api/config/format", HTTP_POST,
std::bind(&WebServerHandler::webHandleConfigFormatWrite,
this)); // Change template formats
_server->on("/api/device/param", HTTP_GET,
std::bind(&WebServerHandler::webHandleDeviceParam,
this)); // Change device params