1#ifndef esp_fs_webserver_H
2#define esp_fs_webserver_H
10#define INCLUDE_EDIT_HTM
11#ifdef INCLUDE_EDIT_HTM
15#define INCLUDE_SETUP_HTM
16#ifdef INCLUDE_SETUP_HTM
17#define ARDUINOJSON_USE_LONG_LONG 1
18#include <ArduinoJson.h>
23#include <ESP8266WiFi.h>
24#include <ESP8266WebServer.h>
25#include <ESP8266mDNS.h>
26#include <ESP8266HTTPUpdateServer.h>
27using WebServerClass = ESP8266WebServer;
28using UpdateServerClass = ESP8266HTTPUpdateServer;
34#include <HTTPUpdateServer.h>
35using WebServerClass = WebServer;
36using UpdateServerClass = HTTPUpdateServer;
41#define DBG_OUTPUT_PORT Serial
42#define DEBUG_MODE_WS false
44#define DBG_OUTPUT_PORT DEBUG_ESP_PORT
48#define DebugPrint(x) DBG_OUTPUT_PORT.print(x)
49#define DebugPrintln(x) DBG_OUTPUT_PORT.println(x)
50#define DebugPrintf(fmt, ...) DBG_OUTPUT_PORT.printf(fmt, ##__VA_ARGS__)
51#define DebugPrintf_P(fmt, ...) DBG_OUTPUT_PORT.printf_P(fmt, ##__VA_ARGS__)
54#define DebugPrintln(x)
55#define DebugPrintf(x, ...)
56#define DebugPrintf_P(x, ...)
67#define TEXT_PLAIN "text/plain"
68#define FS_INIT_ERROR "FS INIT ERROR"
69#define FILE_NOT_FOUND "FileNotFound"
81 bool begin(
const char *path =
nullptr);
85 void addHandler(
const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn);
87 void addHandler(
const Uri &uri, WebServerClass::THandlerFunction handler);
91 IPAddress
setAPmode(
const char *ssid,
const char *psk);
93 IPAddress
startWiFi(uint32_t timeout,
const char *apSSID,
const char *apPsw);
97#ifdef INCLUDE_SETUP_HTM
99#define MIN_F -3.4028235E+38
100#define MAX_F 3.4028235E+38
103 File file = m_filesystem->open(
"/config.json",
"r");
107 m_filesystem->remove(
"/config.json");
117 inline void addHTML(
const char* html,
const char*
id) {
118 String elementId =
"raw-html-";
121 String trimmed = html;
122 removeWhiteSpaces(trimmed);
123 addOption(elementId.c_str(), trimmed,
false);
127 String trimmed = css;
128 removeWhiteSpaces(trimmed);
133 String trimmed = script;
134 addOption(
"raw-javascript", trimmed,
true);
137 void addDropdownList(
const char *label,
const char** array,
size_t size);
140 template <
typename T>
141 inline void addOption(fs::FS &fs,
const char *label, T val,
bool hidden =
false)
147 template <
typename T>
148 inline void addOption(
const char *label, T val,
double d_min,
double d_max,
double step)
150 addOption(label, val,
false, d_min, d_max, step);
155 template <
typename T>
156 inline void addOption(
const char *label, T val,
bool hidden =
false,
157 double d_min =
MIN_F,
double d_max =
MAX_F,
double step = 1.0)
159 File file = m_filesystem->open(
"/config.json",
"r");
160 int sz = file.size() * 1.33;
161 int docSize = max(sz, 2048);
162 DynamicJsonDocument doc((
size_t)docSize);
166 DeserializationError error = deserializeJson(doc, file);
169 DebugPrintln(F(
"Failed to deserialize file, may be corrupted"));
178 DebugPrintln(F(
"File not found, will be created new configuration file"));
188 if (key.equals(
"param-box")) {
191 if (key.equals(
"raw-javascript")) {
198 if (doc.containsKey(key.c_str()))
202 if (d_min !=
MIN_F || d_max !=
MAX_F || step != 1.0)
204 JsonObject obj = doc.createNestedObject(key);
205 obj[
"value"] =
static_cast<T
>(val);
211 doc[key] =
static_cast<T
>(val);
214 file = m_filesystem->open(
"/config.json",
"w");
215 if (serializeJsonPretty(doc, file) == 0)
225 template <
typename T>
228 File file = m_filesystem->open(
"/config.json",
"r");
229 DynamicJsonDocument doc(file.size() * 1.33);
232 DeserializationError error = deserializeJson(doc, file);
235 DebugPrintln(F(
"Failed to deserialize file, may be corrupted"));
245 if (doc[label][
"value"])
246 var = doc[label][
"value"].as<T>();
247 else if (doc[label][
"selected"])
248 var = doc[label][
"selected"].as<T>();
250 var = doc[label].as<T>();
254 template <
typename T>
257 File file = m_filesystem->open(
"/config.json",
"w");
258 DynamicJsonDocument doc(file.size() * 1.33);
262 DeserializationError error = deserializeJson(doc, file);
265 DebugPrintln(F(
"Failed to deserialize file, may be corrupted"));
275 if (doc[label][
"value"])
276 doc[label][
"value"] = val;
277 else if (doc[label][
"selected"])
278 doc[label][
"selected"] = val;
289 UpdateServerClass m_httpUpdater;
290 DNSServer m_dnsServer;
291 fs::FS *m_filesystem;
294 bool m_apmode =
false;
295 char *m_apWebpage = (
char *)
"/setup";
296 uint32_t m_timeout = 10000;
299 bool checkDir(
char *dirname, uint8_t levels);
300 void doWifiConnection();
304 void handleRequest();
305#ifdef INCLUDE_SETUP_HTM
306 void removeWhiteSpaces(String& str);
308 uint8_t numOptions = 0;
311 bool handleFileRead(
const String &path);
312 void handleFileUpload();
313 void replyToCLient(
int msg_type,
const char *msg);
314 void checkForUnsupportedPath(String &filename, String &error);
315 void setCrossOrigin();
316 void handleScanNetworks();
317 const char *getContentType(
const char *filename);
318 bool captivePortal();
321#ifdef INCLUDE_EDIT_HTM
322 void handleGetEdit();
323 void handleFileCreate();
324 void handleFileDelete();
326 void handleFileList();
IPAddress startWiFi(uint32_t timeout, const char *apSSID, const char *apPsw)
bool getOptionValue(const char *label, T &var)
void addOption(const char *label, T val, double d_min, double d_max, double step)
void addDropdownList(const char *label, const char **array, size_t size)
WebServerClass * webserver
void addOptionBox(const char *boxTitle)
void addOption(const char *label, T val, bool hidden=false, double d_min=MIN_F, double d_max=MAX_F, double step=1.0)
IPAddress setAPmode(const char *ssid, const char *psk)
void addJavascript(const char *script)
void addCSS(const char *css)
void addOption(fs::FS &fs, const char *label, T val, bool hidden=false)
void addHTML(const char *html, const char *id)
void addHandler(const Uri &uri, HTTPMethod method, WebServerClass::THandlerFunction fn)
WebServerClass * getRequest()
void setCaptiveWebage(const char *url)
bool begin(const char *path=nullptr)
bool saveOptionValue(const char *label, T val)