#include "FS.h"
#include "LittleFS.h"
#define useSerialOutput true
#define FORMAT_LITTLEFS_IF_FAILED true
#define partitionSize 194400 //define a 190kb partition for logos (less 160byte for the setup data)
String filename="/eeprom.dat";
String tempfile="/tempdata.dat";
String HTML_HEADER="";
String HTML_GETMANAGE="";
String HTML_GETLOGO="We have %SPACE% KB left";
String dataFolder="/";
String FNsetup = dataFolder+"setup.txt";
String FNlogo = "logo.jpg";
byte jpgCount;
unsigned long jpgTotalSize;
bool jpgSizeOnly;
void setup() {
Serial.begin(115200);
char dat[5000];
int maxx=4999;
int siz;
long tsize;
if(!LittleFS.begin(FORMAT_LITTLEFS_IF_FAILED)){
Serial.println("LittleFS Mount Failed");
return;
}
// createDir(LittleFS, "/data");
// writeFile(LittleFS, "/data/test1.jpg", "Hello x");
// memset(dat,0,maxx);
// siz=random(1000,maxx);
// memset(dat,64,siz);
// Serial.println("length 2="+String(siz));
// tsize+=siz;
// writeFile(LittleFS, "/data/test2.jpg", dat);
// writeFile(LittleFS, "/data/test3.txt", "Hello x");
// memset(dat,0,maxx);
// siz=random(1000,maxx);
// memset(dat,64,siz);
// Serial.println("length 4="+String(siz));
// writeFile(LittleFS, "/data/test4.jpg", dat);
// tsize+=siz;
// memset(dat,0,maxx);
// siz=random(1000,maxx);
// memset(dat,64,siz);
// Serial.println("length 5="+String(siz));
// writeFile(LittleFS, "/data/test5.jpg", dat);
// tsize+=siz;
// writeFile(LittleFS, "/data/test6.txt", "Hello x");
// memset(dat,0,maxx);
// siz=random(1000,maxx);
// memset(dat,64,siz);
// Serial.println("length 6="+String(siz));
// writeFile(LittleFS, "/data/test6.jpg", dat);
// tsize+=siz;
// writeFile(LittleFS, "/data/test7.bob", "Hello x");
// memset(dat,0,maxx);
// siz=random(1000,maxx);
// memset(dat,64,siz);
// Serial.println("length 8="+String(siz));
// writeFile(LittleFS, "/data/test8.jpg", dat);
// tsize+=siz;
// memset(dat,0,maxx);
// siz=random(1000,maxx);
// memset(dat,64,siz);
// Serial.println("length 9="+String(siz));
// writeFile(LittleFS, "/data/test9.jpg", dat);
// tsize+=siz;
// Serial.println("Complete. Max="+String(tsize));
// jpgSizeOnly=false;
// handle_filemanagement();
// handle_getLogo();
// deleteFile(LittleFS, "/mydir/hello2.txt");
// removeDir(LittleFS, "/mydir");
// listDir(LittleFS, "/", 1);
// writeFile(LittleFS, "/hello.txt", "Hello ");
// appendFile(LittleFS, "/hello.txt", "World!\r\n");
// readFile(LittleFS, "/hello.txt");
// renameFile(LittleFS, "/hello.txt", "/foo.txt");
// readFile(LittleFS, "/foo.txt");
// deleteFile(LittleFS, "/foo.txt");
// testFileIO(LittleFS, "/test.txt");
// deleteFile(LittleFS, "/test.txt");
Serial.println( "Test complete" );
Serial.print("Total size of FS is: ");
Serial.println(LittleFS.totalBytes());
Serial.print("Used size of FS is: ");
Serial.println(LittleFS.usedBytes());
}
void loop(){
}
void handle_getLogo() { //This shows the upload logo button
float spaceLeft;
float divs=1024;
float divs2=100;
jpgSizeOnly=true; //We only want the size and count for now
handle_filemanagement();
jpgSizeOnly=false; //immediately set it back
spaceLeft=float(partitionSize-jpgTotalSize);
spaceLeft=int((spaceLeft/divs)*divs2)/divs2; //to 2 dp in KB
#if (useSerialOutput)
Serial.println("ON get logo file");
#endif
// send the HTTP response body
String html = String(HTML_HEADER) + String(HTML_GETLOGO);
html.replace("%SPACE%", String(spaceLeft)); // Show the space that is left
Serial.println(html);
//server.send(200, "text/html", html);
delay(10);
}
void handle_filemanagement() {
String fData;
String fName;
String fExtn;
String lineData;
String Dsize;
float fSize;
float divs=1024;
float divs2=100;
float totsize;
jpgTotalSize=0;
jpgCount=0;
File root = LittleFS.open("/data");
if(!root){
Serial.println("- failed to open directory");
}
File file = root.openNextFile();
while(file){
if(file.isDirectory()){
// Do nothing
} else {
fName=file.name();
fExtn = fName.substring(fName.length()-3, fName.length());
if (fExtn=="jpg") {
fSize=file.size();
jpgTotalSize+=fSize;
if (!jpgSizeOnly) {
if (fSize<1000) {
Dsize=String(int(fSize))+" bytes";
} else {
fSize=int((fSize/divs)*divs2)/divs2;
Dsize=String(fSize)+" kb"; //Round to 2dp.
}
// <tr><td>%fname1%</td><td>%fsize1%</td><td><input type="checkbox" name="%del1%" id="%del1%"></td></tr>
lineData="<tr><td><input type='hidden' name='%fn"+String(jpgCount)+"%' id='%fn"+String(jpgCount)+"%' value='"+fName+"'>"+fName+"</td><td>"+Dsize+"</td><td><input type='checkbox' name='%DEL"+String(jpgCount)+"' id='%DEL"+String(jpgCount)+"'></td></tr>";
fData+=lineData;
}
jpgCount++;
}
file = root.openNextFile();
}
}
if (!jpgSizeOnly) { //we are just returning the size
//send the HTTP response body
String html = String(HTML_HEADER) + String(HTML_GETMANAGE);
html.replace("%FILEDATA%", String(fData)); // Put in the Teams A name
//server.send(200, "text/html", html);
Serial.println(fData);
delay(10);
}
}
void createDir(fs::FS &fs, const char * path){
Serial.printf("Creating Dir: %s\n", path);
if(fs.mkdir(path)){
Serial.println("Dir created");
} else {
Serial.println("mkdir failed");
}
}
void removeDir(fs::FS &fs, const char * path){
Serial.printf("Removing Dir: %s\n", path);
if(fs.rmdir(path)){
Serial.println("Dir removed");
} else {
Serial.println("rmdir failed");
}
}
void readFile(fs::FS &fs, const char * path){
Serial.printf("Reading file: %s\r\n", path);
File file = fs.open(path);
if(!file || file.isDirectory()){
Serial.println("- failed to open file for reading");
return;
}
Serial.println("- read from file:");
while(file.available()){
Serial.write(file.read());
}
file.close();
}
void writeFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Writing file: %s\r\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("- failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("- file written");
} else {
Serial.println("- write failed");
}
file.close();
}
void appendFile(fs::FS &fs, const char * path, const char * message){
Serial.printf("Appending to file: %s\r\n", path);
File file = fs.open(path, FILE_APPEND);
if(!file){
Serial.println("- failed to open file for appending");
return;
}
if(file.print(message)){
Serial.println("- message appended");
} else {
Serial.println("- append failed");
}
file.close();
}
void renameFile(fs::FS &fs, const char * path1, const char * path2){
Serial.printf("Renaming file %s to %s\r\n", path1, path2);
if (fs.rename(path1, path2)) {
Serial.println("- file renamed");
} else {
Serial.println("- rename failed");
}
}
void deleteFile(fs::FS &fs, const char * path){
Serial.printf("Deleting file: %s\r\n", path);
if(fs.remove(path)){
Serial.println("- file deleted");
} else {
Serial.println("- delete failed");
}
}
// SPIFFS-like write and delete file, better use #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1
void writeFile2(fs::FS &fs, const char * path, const char * message){
if(!fs.exists(path)){
if (strchr(path, '/')) {
Serial.printf("Create missing folders of: %s\r\n", path);
char *pathStr = strdup(path);
if (pathStr) {
char *ptr = strchr(pathStr, '/');
while (ptr) {
*ptr = 0;
fs.mkdir(pathStr);
*ptr = '/';
ptr = strchr(ptr+1, '/');
}
}
free(pathStr);
}
}
Serial.printf("Writing file to: %s\r\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("- failed to open file for writing");
return;
}
if(file.print(message)){
Serial.println("- file written");
} else {
Serial.println("- write failed");
}
file.close();
}
void deleteFile2(fs::FS &fs, const char * path){
Serial.printf("Deleting file and empty folders on path: %s\r\n", path);
if(fs.remove(path)){
Serial.println("- file deleted");
} else {
Serial.println("- delete failed");
}
char *pathStr = strdup(path);
if (pathStr) {
char *ptr = strrchr(pathStr, '/');
if (ptr) {
Serial.printf("Removing all empty folders on path: %s\r\n", path);
}
while (ptr) {
*ptr = 0;
fs.rmdir(pathStr);
ptr = strrchr(pathStr, '/');
}
free(pathStr);
}
}
void testFileIO(fs::FS &fs, const char * path){
Serial.printf("Testing file I/O with %s\r\n", path);
static uint8_t buf[512];
size_t len = 0;
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("- failed to open file for writing");
return;
}
size_t i;
Serial.print("- writing" );
uint32_t start = millis();
for(i=0; i<2048; i++){
if ((i & 0x001F) == 0x001F){
Serial.print(".");
}
file.write(buf, 512);
}
Serial.println("");
uint32_t end = millis() - start;
Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
file.close();
file = fs.open(path);
start = millis();
end = start;
i = 0;
if(file && !file.isDirectory()){
len = file.size();
size_t flen = len;
start = millis();
Serial.print("- reading" );
while(len){
size_t toRead = len;
if(toRead > 512){
toRead = 512;
}
file.read(buf, toRead);
if ((i++ & 0x001F) == 0x001F){
Serial.print(".");
}
len -= toRead;
}
Serial.println("");
end = millis() - start;
Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
file.close();
} else {
Serial.println("- failed to open file for reading");
}
}