Implement LITTLEFS as requested by @thomastech in #144

Signed-off-by: Lukas Bachschwell <lukas@lbsfilm.at>
This commit is contained in:
Lukas Bachschwell 2022-01-04 11:35:43 +01:00
parent 3cbae2ff1b
commit e1fe13bac6
Signed by: lbsadmin
GPG Key ID: CCC6AA87CC8DF425
6 changed files with 66 additions and 40 deletions

View File

@ -49,6 +49,7 @@ This library is dependent on the following libraries to function properly.
- (_For ESP8266_) [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP) - (_For ESP8266_) [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP)
- (_For ESP32_) [AsyncTCP](https://github.com/me-no-dev/AsyncTCP) - (_For ESP32_) [AsyncTCP](https://github.com/me-no-dev/AsyncTCP)
- (_For ESP32_) [lorol/LittleFS_esp32](https://github.com/lorol/LITTLEFS)
## How to Install ## How to Install
@ -89,13 +90,13 @@ Go to Sketch>Include Library>Add .zip Library> Select the Downloaded .zip File.
## Getting started ## Getting started
ESPUI serves several files to the browser to build up its web interface. This ESPUI serves several files to the browser to build up its web interface. This
can be achieved in 2 ways: _PROGMEM_ or _SPIFFS_ can be achieved in 2 ways: _PROGMEM_ or _LITTLEFS_
_When `ESPUI.begin()` is called the default is serving files from Memory and _When `ESPUI.begin()` is called the default is serving files from Memory and
ESPUI should work out of the box!_ ESPUI should work out of the box!_
**OPTIONAL:** But if this causes your program to _use too much memory_ you can **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 burn the files into the LITTLEFS 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 do this: you can either use the ESP file upload tool or you use the library
function `ESPUI.prepareFileSystem()` function `ESPUI.prepareFileSystem()`
@ -296,7 +297,7 @@ Then all widgets for the tab need to be added to it by specifying the tab as the
### Initialisation of the UI ### Initialisation of the UI
After all the elements are configured you can use `ESPUI.begin("Some Title");` After all the elements are configured you can use `ESPUI.begin("Some Title");`
to start the UI interface. (Or `ESPUI.beginSPIFFS("Some Title");` respectively) to start the UI interface. (Or `ESPUI.beginLITTLEFS("Some Title");` respectively)
Make sure you setup a working network connection or AccesPoint **before** (See Make sure you setup a working network connection or AccesPoint **before** (See
gui.ino example). The web interface can then be used from multiple devices at once and gui.ino example). The web interface can then be used from multiple devices at once and
also shows an connection status in the top bar. also shows an connection status in the top bar.

View File

@ -21,6 +21,7 @@ slider KEYWORD2
begin KEYWORD2 begin KEYWORD2
beginSPIFFS KEYWORD2 beginSPIFFS KEYWORD2
beginLITTLEFS KEYWORD2
print KEYWORD2 print KEYWORD2
updateSwitcher KEYWORD2 updateSwitcher KEYWORD2
updateSlider KEYWORD2 updateSlider KEYWORD2

View File

@ -6,13 +6,16 @@
"type": "git", "type": "git",
"url": "https://github.com/s00500/ESPUI.git" "url": "https://github.com/s00500/ESPUI.git"
}, },
"authors": [{ "authors": [
"name": "Lukas Bachschwell", {
"email": "lukas@lbsfilm.at", "name": "Lukas Bachschwell",
"url": "https://lbsfilm.at", "email": "lukas@lbsfilm.at",
"maintainer": true "url": "https://lbsfilm.at",
}], "maintainer": true
"dependencies": [{ }
],
"dependencies": [
{
"name": "ESP Async WebServer", "name": "ESP Async WebServer",
"authors": "Hristo Gochkov", "authors": "Hristo Gochkov",
"frameworks": "arduino" "frameworks": "arduino"
@ -21,6 +24,11 @@
"name": "ArduinoJson", "name": "ArduinoJson",
"authors": "Benoit Blanchon", "authors": "Benoit Blanchon",
"frameworks": "arduino" "frameworks": "arduino"
},
{
"name": "LittleFS_esp32",
"authors": "lorol",
"frameworks": "arduino"
} }
], ],
"version": "2.0.2", "version": "2.0.2",

View File

@ -14,3 +14,12 @@ board = nodemcuv2
framework = arduino framework = arduino
lib_extra_dirs = ../../ lib_extra_dirs = ../../
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
lib_extra_dirs = ../../
lib_deps = lorol/LittleFS_esp32

View File

@ -15,7 +15,7 @@
uint16_t Control::idCounter = 1; uint16_t Control::idCounter = 1;
// ################# Spiffs functions // ################# LITTLEFS functions
#if defined(ESP32) #if defined(ESP32)
void listDir(const char* dirname, uint8_t levels) void listDir(const char* dirname, uint8_t levels)
{ {
@ -27,7 +27,7 @@ void listDir(const char* dirname, uint8_t levels)
#endif #endif
#if defined(ESP32) #if defined(ESP32)
File root = SPIFFS.open(dirname); File root = LITTLEFS.open(dirname);
#else #else
File root = LittleFS.open(dirname); File root = LittleFS.open(dirname);
#endif #endif
@ -115,9 +115,9 @@ void listDir(const char* dirname, uint8_t levels)
void ESPUIClass::list() void ESPUIClass::list()
{ {
#if defined(ESP32) #if defined(ESP32)
if (!SPIFFS.begin()) if (!LITTLEFS.begin())
{ {
Serial.println(F("SPIFFS Mount Failed")); Serial.println(F("LITTLEFS Mount Failed"));
return; return;
} }
#else #else
@ -131,8 +131,8 @@ void ESPUIClass::list()
listDir("/", 1); listDir("/", 1);
#if defined(ESP32) #if defined(ESP32)
Serial.println(SPIFFS.totalBytes()); Serial.println(LITTLEFS.totalBytes());
Serial.println(SPIFFS.usedBytes()); Serial.println(LITTLEFS.usedBytes());
#else #else
FSInfo fs_info; FSInfo fs_info;
@ -147,7 +147,7 @@ void ESPUIClass::list()
void deleteFile(const char* path) void deleteFile(const char* path)
{ {
#if defined(ESP32) #if defined(ESP32)
bool exists = SPIFFS.exists(path); bool exists = LITTLEFS.exists(path);
#else #else
bool exists = LittleFS.exists(path); bool exists = LittleFS.exists(path);
#endif #endif
@ -172,7 +172,7 @@ void deleteFile(const char* path)
#endif #endif
#if defined(ESP32) #if defined(ESP32)
bool didRemove = SPIFFS.remove(path); bool didRemove = LITTLEFS.remove(path);
#else #else
bool didRemove = LittleFS.remove(path); bool didRemove = LittleFS.remove(path);
#endif #endif
@ -206,7 +206,7 @@ void writeFile(const char* path, const char* data)
#endif #endif
#if defined(ESP32) #if defined(ESP32)
File file = SPIFFS.open(path, FILE_WRITE); File file = LITTLEFS.open(path, FILE_WRITE);
#else #else
File file = LittleFS.open(path, FILE_WRITE); File file = LittleFS.open(path, FILE_WRITE);
#endif #endif
@ -269,7 +269,7 @@ void writeFile(const char* path, const char* data)
file.close(); file.close();
} }
// end Spiffs functions // end LITTLEFS functions
void ESPUIClass::prepareFileSystem() void ESPUIClass::prepareFileSystem()
{ {
@ -283,14 +283,14 @@ void ESPUIClass::prepareFileSystem()
#endif #endif
#if defined(ESP32) #if defined(ESP32)
SPIFFS.format(); LITTLEFS.format();
if (!SPIFFS.begin(true)) if (!LITTLEFS.begin(true))
{ {
#if defined(DEBUG_ESPUI) #if defined(DEBUG_ESPUI)
if (this->verbosity) if (this->verbosity)
{ {
Serial.println(F("SPIFFS Mount Failed")); Serial.println(F("LITTLEFS Mount Failed"));
} }
#endif #endif
@ -301,7 +301,7 @@ void ESPUIClass::prepareFileSystem()
if (this->verbosity) if (this->verbosity)
{ {
listDir("/", 1); listDir("/", 1);
Serial.println(F("SPIFFS Mount ESP32 Done")); Serial.println(F("LITTLEFS Mount ESP32 Done"));
} }
#endif #endif
@ -312,7 +312,7 @@ void ESPUIClass::prepareFileSystem()
#if defined(DEBUG_ESPUI) #if defined(DEBUG_ESPUI)
if (this->verbosity) if (this->verbosity)
{ {
Serial.println(F("SPIFFS Mount ESP8266 Done")); Serial.println(F("LITTLEFS Mount ESP8266 Done"));
} }
#endif #endif
@ -368,7 +368,7 @@ void ESPUIClass::prepareFileSystem()
#endif #endif
#if defined(ESP32) #if defined(ESP32)
SPIFFS.end(); LITTLEFS.end();
#else #else
LittleFS.end(); LittleFS.end();
#endif #endif
@ -785,7 +785,7 @@ void ESPUIClass::updateControl(Control* control, int clientId)
// function like this and it's clients array is private // function like this and it's clients array is private
int tryId = 0; int tryId = 0;
for (int count = 0; count < this->ws->count();) for (size_t count = 0; count < this->ws->count();)
{ {
if (this->ws->hasClient(tryId)) if (this->ws->hasClient(tryId))
{ {
@ -943,7 +943,7 @@ void ESPUIClass::addGraphPoint(uint16_t id, int nValue, int clientId)
// function like this and it's clients array is private // function like this and it's clients array is private
int tryId = 0; int tryId = 0;
for (int count = 0; count < this->ws->count();) for (size_t count = 0; count < this->ws->count();)
{ {
if (this->ws->hasClient(tryId)) if (this->ws->hasClient(tryId))
{ {
@ -1080,6 +1080,12 @@ void ESPUIClass::jsonReload()
} }
void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const char* password, uint16_t port) void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const char* password, uint16_t port)
{
// Backwards compatibility wrapper
beginLITTLEFS(_title, username, password, port);
}
void ESPUIClass::beginLITTLEFS(const char* _title, const char* username, const char* password, uint16_t port)
{ {
ui_title = _title; ui_title = _title;
this->basicAuthUsername = username; this->basicAuthUsername = username;
@ -1098,7 +1104,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const cha
ws = new AsyncWebSocket("/ws"); ws = new AsyncWebSocket("/ws");
#if defined(ESP32) #if defined(ESP32)
bool fsBegin = SPIFFS.begin(); bool fsBegin = LITTLEFS.begin();
#else #else
bool fsBegin = LittleFS.begin(); bool fsBegin = LittleFS.begin();
#endif #endif
@ -1107,7 +1113,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const cha
#if defined(DEBUG_ESPUI) #if defined(DEBUG_ESPUI)
if (ESPUI.verbosity) if (ESPUI.verbosity)
{ {
Serial.println(F("SPIFFS Mount Failed, PLEASE CHECK THE README ON HOW TO " Serial.println(F("LITTLEFS Mount Failed, PLEASE CHECK THE README ON HOW TO "
"PREPARE YOUR ESP!!!!!!!")); "PREPARE YOUR ESP!!!!!!!"));
} }
#endif #endif
@ -1123,7 +1129,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const cha
#endif #endif
#if defined(ESP32) #if defined(ESP32)
bool indexExists = SPIFFS.exists("/index.htm"); bool indexExists = LITTLEFS.exists("/index.htm");
#else #else
bool indexExists = LittleFS.exists("/index.htm"); bool indexExists = LittleFS.exists("/index.htm");
#endif #endif
@ -1150,7 +1156,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const cha
ws->setAuthentication(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword); ws->setAuthentication(ESPUI.basicAuthUsername, ESPUI.basicAuthPassword);
} }
#if defined(ESP32) #if defined(ESP32)
server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm").setAuthentication(username, password); server->serveStatic("/", LITTLEFS, "/").setDefaultFile("index.htm").setAuthentication(username, password);
#else #else
server->serveStatic("/", LittleFS, "/").setDefaultFile("index.htm").setAuthentication(username, password); server->serveStatic("/", LittleFS, "/").setDefaultFile("index.htm").setAuthentication(username, password);
#endif #endif
@ -1158,7 +1164,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const cha
else else
{ {
#if defined(ESP32) #if defined(ESP32)
server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); server->serveStatic("/", LITTLEFS, "/").setDefaultFile("index.htm");
#else #else
server->serveStatic("/", LittleFS, "/").setDefaultFile("index.htm"); server->serveStatic("/", LittleFS, "/").setDefaultFile("index.htm");
#endif #endif
@ -1171,7 +1177,7 @@ void ESPUIClass::beginSPIFFS(const char* _title, const char* username, const cha
return request->requestAuthentication(); return request->requestAuthentication();
} }
request->send(200, "text/plain", String(ESP.getFreeHeap()) + " In SPIFFSmode"); request->send(200, "text/plain", String(ESP.getFreeHeap()) + " In LITTLEFS mode");
}); });
server->onNotFound([](AsyncWebServerRequest* request) { request->send(404); }); server->onNotFound([](AsyncWebServerRequest* request) { request->send(404); });

View File

@ -11,8 +11,8 @@
#if defined(ESP32) #if defined(ESP32)
#include <AsyncTCP.h> #include <AsyncTCP.h>
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <LITTLEFS.h>
#include "SPIFFS.h"
#include "WiFi.h" #include "WiFi.h"
#else #else
@ -24,7 +24,6 @@
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <Hash.h> #include <Hash.h>
#include <LittleFS.h> #include <LittleFS.h>
#include <SPIFFSEditor.h>
#define FILE_WRITE "w" #define FILE_WRITE "w"
@ -222,11 +221,13 @@ public:
void begin(const char* _title, const char* username = nullptr, const char* password = nullptr, void begin(const char* _title, const char* username = nullptr, const char* password = nullptr,
uint16_t port = 80); // Setup server and page in Memorymode uint16_t port = 80); // Setup server and page in Memorymode
void beginSPIFFS(const char* _title, const char* username = nullptr, const char* password = nullptr, void beginSPIFFS(const char* _title, const char* username = nullptr, const char* password = nullptr,
uint16_t port = 80); // Setup server and page in SPIFFSmode uint16_t port = 80); // Setup server and page in LITTLEFS mode (DEPRECATED, use beginLITTLEFS)
void beginLITTLEFS(const char* _title, const char* username = nullptr, const char* password = nullptr,
uint16_t port = 80); // Setup server and page in LITTLEFS mode
void prepareFileSystem(); // Initially preps the filesystem and loads a lot of void prepareFileSystem(); // Initially preps the filesystem and loads a lot of
// stuff into SPIFFS // stuff into LITTLEFS
void list(); // Lists SPIFFS directory void list(); // Lists LITTLEFS directory
uint16_t addControl(ControlType type, const char* label, const String& value = String(""), uint16_t addControl(ControlType type, const char* label, const String& value = String(""),
ControlColor color = ControlColor::Turquoise, uint16_t parentControl = Control::noParent, ControlColor color = ControlColor::Turquoise, uint16_t parentControl = Control::noParent,
@ -302,7 +303,7 @@ private:
const char* basicAuthPassword = nullptr; const char* basicAuthPassword = nullptr;
bool basicAuth = true; bool basicAuth = true;
Control *prepareJSONChunk(AsyncWebSocketClient* client, Control *control, JsonArray *items); Control* prepareJSONChunk(AsyncWebSocketClient* client, Control* control, JsonArray* items);
}; };
extern ESPUIClass ESPUI; extern ESPUIClass ESPUI;