ESPixelStick Firmware
Firmware for the ESPixelStick
Loading...
Searching...
No Matches
FileMgr.hpp
Go to the documentation of this file.
1#pragma once
2/*
3* FileMgr.hpp - Output Management class
4*
5* Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver
6* Copyright (c) 2021, 2025 Shelby Merrick
7* http://www.forkineye.com
8*
9* This program is provided free for you to use in any way that you wish,
10* subject to the laws and regulations where you are using it. Due diligence
11* is strongly suggested before using this code. Please give credit where due.
12*
13* The Author makes no warranty of any kind, express or implied, with regard
14* to this program or the documentation contained in this document. The
15* Author shall not be liable in any event for incidental or consequential
16* damages in connection with, or arising out of, the furnishing, performance
17* or use of these programs.
18*
19*/
20
21#include "ESPixelStick.h"
22#include <LittleFS.h>
23#ifdef SUPPORT_SD_MMC
24# include <SD_MMC.h>
25#endif // def SUPPORT_SD_MMC
26#include "SdFat.h"
27#include <map>
28#include <vector>
29
30#ifdef ARDUINO_ARCH_ESP32
31# ifdef SIMULATE_SD
32# define ESP_SD LittleFS
33# define ESP_SDFS LittleFS
34# elif defined (SUPPORT_SD_MMC)
35# define ESP_SD SD_MMC
36# define ESP_SDFS SD_MMC
37# else // !def SUPPORT_SD_MMC
38extern SdFat sd;
39# define ESP_SD sd
40# define ESP_SDFS SdFile
41# endif // !def SUPPORT_SD_MMC
42#else // !ARDUINO_ARCH_ESP32
43# define ESP_SD sd
44# define ESP_SDFS SdFile
45#endif // !ARDUINO_ARCH_ESP32
46
48{
49public:
50 c_FileMgr ();
51 virtual ~c_FileMgr ();
52
53 typedef uint32_t FileId;
54 const static FileId INVALID_FILE_HANDLE = 0;
55
56 void Begin ();
57 void Poll ();
58 void GetConfig (JsonObject& json);
59 bool SetConfig (JsonObject& json);
60 void GetStatus (JsonObject& json);
61 void UpdateFtp ();
62
63 bool handleFileUpload (const String & filename, size_t index, uint8_t * data, size_t len, bool final, uint32_t totalLen);
64 void AbortSdFileUpload();
65
66 typedef std::function<void (JsonDocument& json)> DeserializationHandler;
67
68 typedef enum
69 {
73 } FileMode;
74
75 struct SdInfo
76 {
77 uint64_t MaxSize = 0;
78 uint64_t Available = 0;
79 uint64_t Used = 0;
80 };
81
82 void DeleteFlashFile (String FileName);
83 void RenameFlashFile (String OldName, String NewName);
84 bool SaveFlashFile (const String & FileName, String & FileData);
85 bool SaveFlashFile (const String & FileName, const char * FileData);
86 bool SaveFlashFile (const String & FileName, JsonDocument & FileData);
87 bool SaveFlashFile (const String & filename, uint32_t index, uint8_t *data, uint32_t len, bool final);
88
89 bool ReadFlashFile (const String & FileName, String & FileData);
90 bool ReadFlashFile (const String & FileName, JsonDocument & FileData);
91 bool ReadFlashFile (const String & FileName, byte * FileData, size_t maxlen);
92 bool LoadFlashFile (const String & FileName, DeserializationHandler Handler);
93 bool FlashFileExists (const String & FileName);
94
97 void DeleteSdFile (const String & FileName);
98 void SaveSdFile (const String & FileName, String & FileData);
99 void SaveSdFile (const String & FileName, JsonVariant & FileData);
100 bool OpenSdFile (const String & FileName, FileMode Mode, FileId & FileHandle, int FileListIndex);
101 uint64_t ReadSdFile (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToRead, uint64_t StartingPosition);
102 bool ReadSdFile (const String & FileName, String & FileData);
103 bool ReadSdFile (const String & FileName, JsonDocument & FileData);
104 uint64_t WriteSdFileBuf (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToWrite);
105 uint64_t WriteSdFile (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToWrite);
106 uint64_t WriteSdFile (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToWrite, uint64_t StartingPosition);
107 void CloseSdFile (FileId & FileHandle);
108 void GetListOfSdFiles (std::vector<String> & Response);
109 uint64_t GetSdFileSize (const String & FileName);
110 uint64_t GetSdFileSize (const FileId & FileHandle);
111 void RenameSdFile (const String & OldName, const String & NewName);
112 void BuildFseqList (bool DisplayFileNames);
113
114 void GetDriverName (String& Name) { Name = F("FileMgr"); }
115 void NetworkStateChanged (bool NewState);
116 void FindFirstZipFile (String &FileName);
117 int FileListFindSdFileHandle (FileId HandleToFind);
118 void GetSdInfo(SdInfo & Response);
119
120#define SD_BLOCK_SIZE 512
121
122#if defined ARDUINO_ARCH_ESP8266
123# define MAX_SD_BUFFER_SIZE (4 * SD_BLOCK_SIZE)
124#else
125# define MAX_SD_BUFFER_SIZE (14 * SD_BLOCK_SIZE)
126#endif
127
128#define ConnrectFilename(n) \
129{ \
130 if(0 != n.indexOf("/")) \
131 { \
132 n = String("/") + n; \
133 } \
134}
135
136private:
137 void SetSpiIoPins ();
138 void SetSdSpeed ();
139 void ResetSdCard ();
140 void LockSd();
141 void UnLockSd();
142 bool SeekSdFile(const FileId & FileHandle, uint64_t position, SeekMode Mode);
143 void BuildDefaultFseqList ();
144 bool IsCompressed(String FileName);
145 #ifdef DEFAULT_SD_POWER_PIN
146 void PowerCycleSdCard();
147 #endif // def DEFAULT_SD_POWER_PIN
148
149# define SD_CARD_CLK_MHZ SD_SCK_MHZ(37) // 50 MHz SPI clock
150#ifndef MaxSdTransSpeedMHz
151# define MaxSdTransSpeedMHz 200
152#endif // ndef MaxSdTransSpeedMHz
153
154#ifdef ENABLE_DEDICATED_SPI
155#define ESPS_SPI_MODE DEDICATED_SPI
156#else
157#define ESPS_SPI_MODE SHARED_SPI
158#endif // def DEDICATED_SPI
159
160
161 void StartSdCard ();
162 void listDir (fs::FS& fs, String dirname, uint8_t levels);
163 void DescribeSdCardToUser ();
164 void handleFileUploadNewFile (const String & filename);
165 void printDirectory (FsFile & dir, int numTabs);
166
167 bool SdCardInstalled = false;
172 #ifdef DEFAULT_SD_POWER_PIN
173 uint8_t sd_pwr_pin = DEFAULT_SD_POWER_PIN;
174 uint8_t sd_pwr_on = DEFAULT_SD_POWER_ON;
175 uint16_t sd_pwr_dly = 1000;
176 #endif // def DEFAULT_SD_POWER_PIN
181 char FtpUserName[65] = "esps";
182 char FtpPassword[65] = "esps";
183 char WelcomeString[65] = "ESPS V4 FTP";
184 bool FtpEnabled = true;
185 uint64_t SdCardSize = 0;
187 bool FoundZipFile = false;
188
189public: struct __attribute__((__packed__, aligned(4))) CSD {
190 public: union {
191 public: struct __attribute__((__packed__, aligned(1))) {
192 public: enum {
193 CSD_VERSION_1 = 0, // enum CSD version 1.0 - 1.1, Version 2.00/Standard Capacity
194 CSD_VERSION_2 = 1, // enum CSD cersion 2.0, Version 2.00/High Capacity and Extended Capacity
195 } csd_structure : 2; // @127-126 CSD Structure Version as on SD CSD bits
196 unsigned spec_vers : 6; // @125-120 CSD version as on SD CSD bits
197 uint8_t taac; // @119-112 taac as on SD CSD bits
198 uint8_t nsac; // @111-104 nsac as on SD CSD bits
199 uint8_t tran_speed; // @103-96 trans_speed as on SD CSD bits
200 }Decode_0;
201 public: uint32_t Raw32_0; // @127-96 Union to access 32 bits as a uint32_t
202 };
203 public: union {
204 public: struct __attribute__((__packed__, aligned(1))) {
205 unsigned ccc : 12; // @95-84 ccc as on SD CSD bits
206 unsigned read_bl_len : 4; // @83-80 read_bl_len on SD CSD bits
207 unsigned read_bl_partial : 1; // @79 read_bl_partial as on SD CSD bits
208 unsigned write_blk_misalign : 1; // @78 write_blk_misalign as on SD CSD bits
209 unsigned read_blk_misalign : 1; // @77 read_blk_misalign as on SD CSD bits
210 unsigned dsr_imp : 1; // @76 dsr_imp as on SD CSD bits
211 unsigned c_size : 12; // @75-64 Version 1 C_Size as on SD CSD bits
212 };
213 public: uint32_t Raw32_1; // @0-31 Union to access 32 bits as a uint32_t
214 };
215 public: union {
216 public: struct __attribute__((__packed__, aligned(1))) {
217 public: union {
218 public: struct __attribute__((__packed__, aligned(1))) {
219 unsigned vdd_r_curr_min : 3; // @61-59 vdd_r_curr_min as on SD CSD bits
220 unsigned vdd_r_curr_max : 3; // @58-56 vdd_r_curr_max as on SD CSD bits
221 unsigned vdd_w_curr_min : 3; // @55-53 vdd_w_curr_min as on SD CSD bits
222 unsigned vdd_w_curr_max : 3; // @52-50 vdd_w_curr_max as on SD CSD bits
223 unsigned c_size_mult : 3; // @49-47 c_size_mult as on SD CSD bits
224 unsigned reserved0 : 7; // reserved for CSD ver 2.0 size match
225 };
226 unsigned ver2_c_size : 22; // Version 2 C_Size
227 };
228 unsigned erase_blk_en : 1; // @46 erase_blk_en as on SD CSD bits
229 unsigned sector_size : 7; // @45-39 sector_size as on SD CSD bits
230 unsigned reserved1 : 2; // 2 Spares bit unused
231 };
232 public: uint32_t Raw32_2; // @0-31 Union to access 32 bits as a uint32_t
233 };
234 public: union {
235 public: struct __attribute__((__packed__, aligned(1))) {
236 unsigned wp_grp_size : 7; // @38-32 wp_grp_size as on SD CSD bits
237 unsigned wp_grp_enable : 1; // @31 wp_grp_enable as on SD CSD bits
238 unsigned reserved2 : 2; // @30-29 Write as zero read as don't care
239 unsigned r2w_factor : 3; // @28-26 r2w_factor as on SD CSD bits
240 unsigned write_bl_len : 4; // @25-22 write_bl_len as on SD CSD bits
241 unsigned write_bl_partial : 1; // @21 write_bl_partial as on SD CSD bits
242 unsigned default_ecc : 5; // @20-16 default_ecc as on SD CSD bits
243 unsigned file_format_grp : 1; // @15 file_format_grp as on SD CSD bits
244 unsigned copy : 1; // @14 copy as on SD CSD bits
245 unsigned perm_write_protect : 1; // @13 perm_write_protect as on SD CSD bits
246 unsigned tmp_write_protect : 1; // @12 tmp_write_protect as on SD CSD bits
247 public: enum {
248 // FAT_PARTITION_TABLE = 0, // enum SD card is FAT with partition table
249 // FAT_NO_PARTITION_TABLE = 1, // enum SD card is FAT with no partition table
250 // FS_UNIVERSAL = 2, // enum SD card file system is universal
251 // FS_OTHER = 3, // enum SD card file system is other
252 } file_format : 2; // @11-10 File format as on SD CSD bits
253 unsigned ecc : 2; // @9-8 ecc as on SD CSD bits
254 unsigned reserved3 : 1; // 1 spare bit unused
255 };
256 public: uint32_t Raw32_3; // @0-31 Union to access 32 bits as a uint32_t
257 };
258};
259#define MaxOpenFiles 5
261 {
263 #ifdef SIMULATE_SD
264 File fsFile;
265 #else
266 FsFile fsFile;
267 #endif // def SIMULATE_SD
268 uint64_t size = 0;
269 int entryId = -1;
270 char Filename[65];
272 bool IsOpen = false;
273 struct
274 {
275 byte *DataBuffer = nullptr;
276 uint64_t size = 0;
277 uint64_t offset = 0;
279 };
280#define DATABUFFERSIZE (5 * 1024)
281
283 void InitSdFileList ();
284
286 uint32_t LastFileSent = 0;
287 uint32_t expectedIndex = 0;
288
289#ifdef ARDUINO_ARCH_ESP32
290 SemaphoreHandle_t SdAccessSemaphore = NULL;
291#endif // def ARDUINO_ARCH_ESP32
292
293protected:
294
295}; // c_FileMgr
296
297#ifdef DEBUG_FILE_HANDLES
298#define DEBUG_FILE_HANDLE(fh) \
299{ \
300 if (fh == c_FileMgr::INVALID_FILE_HANDLE) \
301 { \
302 DEBUG_V(String(F("Found an invalid file handle before a request to FileMgr. File Handle: ")) + String(fh)); \
303 } \
304 else \
305 { \
306 if (-1 == FileMgr.FileListFindSdFileHandle (fh)) \
307 { \
308 DEBUG_V(String(F("Could not look up File Handle: ")) + String(fh)); \
309 } \
310 } \
311}
312#else
313#define DEBUG_FILE_HANDLE(fh)
314#endif // def DEBUG_FILE_HANDLE
315
316extern c_FileMgr FileMgr;
SdFs sd
Definition FileMgr.cpp:30
c_FileMgr FileMgr
Definition FileMgr.cpp:2527
#define MaxOpenFiles
Definition FileMgr.hpp:259
#define MaxSdTransSpeedMHz
Definition FileMgr.hpp:151
#define SD_CARD_MISO_PIN
Definition GPIO_Defs_ESP32_Bong69.hpp:42
#define SD_CARD_CS_PIN
Definition GPIO_Defs_ESP32_Bong69.hpp:45
#define SD_CARD_MOSI_PIN
Definition GPIO_Defs_ESP32_Bong69.hpp:43
#define SD_CARD_CLK_PIN
Definition GPIO_Defs_ESP32_Bong69.hpp:44
Definition FileMgr.hpp:48
FileId CreateSdFileHandle()
Definition FileMgr.cpp:1114
void printDirectory(FsFile &dir, int numTabs)
Definition FileMgr.cpp:1298
void GetListOfSdFiles(std::vector< String > &Response)
Definition FileMgr.cpp:1195
void StartSdCard()
Definition FileMgr.cpp:200
bool FoundZipFile
Definition FileMgr.hpp:187
void SetSdSpeed()
Definition FileMgr.cpp:557
bool SeekSdFile(const FileId &FileHandle, uint64_t position, SeekMode Mode)
Definition FileMgr.cpp:2398
void SaveSdFile(const String &FileName, String &FileData)
Definition FileMgr.cpp:1339
void BuildDefaultFseqList()
Definition FileMgr.cpp:2379
String fsUploadFileName
Definition FileMgr.hpp:178
void GetConfig(JsonObject &json)
Definition FileMgr.cpp:349
bool OpenSdFile(const String &FileName, FileMode Mode, FileId &FileHandle, int FileListIndex)
Definition FileMgr.cpp:1375
static const FileId INVALID_FILE_HANDLE
Definition FileMgr.hpp:54
void InitSdFileList()
Definition FileMgr.cpp:1070
File FileSendDir
Definition FileMgr.hpp:285
c_FileMgr()
< Start up the driver and put it into a safe mode
Definition FileMgr.cpp:148
void Begin()
< Start the module
Definition FileMgr.cpp:169
void DeleteSdFile(const String &FileName)
Definition FileMgr.cpp:1151
uint8_t clk_pin
Definition FileMgr.hpp:170
uint8_t cs_pin
Definition FileMgr.hpp:171
uint32_t LastFileSent
Definition FileMgr.hpp:286
void listDir(fs::FS &fs, String dirname, uint8_t levels)
Definition FileMgr.cpp:685
bool IsCompressed(String FileName)
Definition FileMgr.cpp:2488
void GetStatus(JsonObject &json)
Definition FileMgr.cpp:374
void LockSd()
Definition FileMgr.cpp:2451
bool LoadFlashFile(const String &FileName, DeserializationHandler Handler)
Definition FileMgr.cpp:733
int FileListFindSdFileHandle(FileId HandleToFind)
Definition FileMgr.cpp:1086
void RenameSdFile(const String &OldName, const String &NewName)
Definition FileMgr.cpp:1869
FileListEntry_t FileList[MaxOpenFiles]
Definition FileMgr.hpp:282
char FtpUserName[65]
Definition FileMgr.hpp:181
uint64_t ReadSdFile(const FileId &FileHandle, byte *FileData, uint64_t NumBytesToRead, uint64_t StartingPosition)
Definition FileMgr.cpp:1575
std::function< void(JsonDocument &json)> DeserializationHandler
Definition FileMgr.hpp:66
uint32_t MaxSdSpeed
Definition FileMgr.hpp:186
void FindFirstZipFile(String &FileName)
Definition FileMgr.cpp:2096
virtual ~c_FileMgr()
< deallocate any resources and put the output channels into a safe state
Definition FileMgr.cpp:159
void UnLockSd()
Definition FileMgr.cpp:2463
uint8_t mosi_pin
Definition FileMgr.hpp:169
bool handleFileUpload(const String &filename, size_t index, uint8_t *data, size_t len, bool final, uint32_t totalLen)
Definition FileMgr.cpp:2211
bool FtpEnabled
Definition FileMgr.hpp:184
void NetworkStateChanged(bool NewState)
Definition FileMgr.cpp:234
uint32_t expectedIndex
Definition FileMgr.hpp:287
void BuildFseqList(bool DisplayFileNames)
Definition FileMgr.cpp:1893
uint64_t WriteSdFileBuf(const FileId &FileHandle, byte *FileData, uint64_t NumBytesToWrite)
Definition FileMgr.cpp:1702
FileMode
Definition FileMgr.hpp:69
@ FileWrite
Definition FileMgr.hpp:71
@ FileAppend
Definition FileMgr.hpp:72
@ FileRead
Definition FileMgr.hpp:70
void SetSpiIoPins()
Definition FileMgr.cpp:416
bool SaveFlashFile(const String &FileName, String &FileData)
Definition FileMgr.cpp:801
char WelcomeString[65]
Definition FileMgr.hpp:183
FileId fsUploadFileHandle
Definition FileMgr.hpp:177
void DescribeSdCardToUser()
Definition FileMgr.cpp:1176
void CloseSdFile(FileId &FileHandle)
Definition FileMgr.cpp:1613
bool SdCardIsInstalled()
Definition FileMgr.hpp:95
void GetSdInfo(SdInfo &Response)
Definition FileMgr.cpp:2503
bool ReadFlashFile(const String &FileName, String &FileData)
Definition FileMgr.cpp:936
uint32_t fsUploadStartTime
Definition FileMgr.hpp:180
uint64_t GetSdFileSize(const String &FileName)
Definition FileMgr.cpp:1824
void handleFileUploadNewFile(const String &filename)
Definition FileMgr.cpp:2333
uint64_t WriteSdFile(const FileId &FileHandle, byte *FileData, uint64_t NumBytesToWrite)
Definition FileMgr.cpp:1653
bool SdCardInstalled
Definition FileMgr.hpp:167
void ResetSdCard()
Definition FileMgr.cpp:624
bool SetConfig(JsonObject &json)
Definition FileMgr.cpp:275
bool fsUploadFileSavedIsEnabled
Definition FileMgr.hpp:179
uint32_t FileId
Definition FileMgr.hpp:53
void AbortSdFileUpload()
Definition FileMgr.cpp:2474
void UpdateFtp()
Definition FileMgr.cpp:224
uint8_t miso_pin
Definition FileMgr.hpp:168
uint64_t SdCardSize
Definition FileMgr.hpp:185
void DeleteFlashFile(String FileName)
Definition FileMgr.cpp:647
void Poll()
Definition FileMgr.cpp:261
void RenameFlashFile(String OldName, String NewName)
Definition FileMgr.cpp:665
bool FlashFileExists(const String &FileName)
Definition FileMgr.cpp:1061
char FtpPassword[65]
Definition FileMgr.hpp:182
void GetDriverName(String &Name)
Definition FileMgr.hpp:114
char filename[250]
Definition fseq.h:7
struct FSEQParsedRangeEntry __attribute__
Definition FileMgr.hpp:261
uint64_t size
Definition FileMgr.hpp:268
FsFile fsFile
Definition FileMgr.hpp:266
uint64_t offset
Definition FileMgr.hpp:277
FileId handle
Definition FileMgr.hpp:262
FileMode mode
Definition FileMgr.hpp:271
char Filename[65]
Definition FileMgr.hpp:270
int entryId
Definition FileMgr.hpp:269
struct c_FileMgr::FileListEntry_t::@2 buffer
byte * DataBuffer
Definition FileMgr.hpp:275
bool IsOpen
Definition FileMgr.hpp:272
Definition FileMgr.hpp:76
uint64_t Used
Definition FileMgr.hpp:79
uint64_t MaxSize
Definition FileMgr.hpp:77
uint64_t Available
Definition FileMgr.hpp:78