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 SUPPORT_SD_MMC
32# define ESP_SD SD_MMC
33# define ESP_SDFS SD_MMC
34# else // !def SUPPORT_SD_MMC
35extern SdFat sd;
36# define ESP_SD sd
37# define ESP_SDFS SdFile
38# endif // !def SUPPORT_SD_MMC
39#else // !ARDUINO_ARCH_ESP32
40# define ESP_SD sd
41# define ESP_SDFS SdFile
42#endif // !ARDUINO_ARCH_ESP32
43
45{
46public:
47 c_FileMgr ();
48 virtual ~c_FileMgr ();
49
50 typedef uint32_t FileId;
51 const static FileId INVALID_FILE_HANDLE = 0;
52
53 void Begin ();
54 void Poll ();
55 void GetConfig (JsonObject& json);
56 bool SetConfig (JsonObject& json);
57 void GetStatus (JsonObject& json);
58
59 bool handleFileUpload (const String & filename, size_t index, uint8_t * data, size_t len, bool final, uint32_t totalLen);
60 void AbortSdFileUpload();
61
62 typedef std::function<void (JsonDocument& json)> DeserializationHandler;
63
64 typedef enum
65 {
69 } FileMode;
70
71 void DeleteFlashFile (const String & FileName);
72 bool SaveFlashFile (const String & FileName, String & FileData);
73 bool SaveFlashFile (const String & FileName, const char * FileData);
74 bool SaveFlashFile (const String & FileName, JsonDocument & FileData);
75 bool SaveFlashFile (const String & filename, uint32_t index, uint8_t *data, uint32_t len, bool final);
76
77 bool ReadFlashFile (const String & FileName, String & FileData);
78 bool ReadFlashFile (const String & FileName, JsonDocument & FileData);
79 bool ReadFlashFile (const String & FileName, byte * FileData, size_t maxlen);
80 bool LoadFlashFile (const String & FileName, DeserializationHandler Handler);
81 bool FlashFileExists (const String & FileName);
82
85 void DeleteSdFile (const String & FileName);
86 void SaveSdFile (const String & FileName, String & FileData);
87 void SaveSdFile (const String & FileName, JsonVariant & FileData);
88 bool OpenSdFile (const String & FileName, FileMode Mode, FileId & FileHandle, int FileListIndex);
89 uint64_t ReadSdFile (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToRead, uint64_t StartingPosition);
90 bool ReadSdFile (const String & FileName, String & FileData);
91 bool ReadSdFile (const String & FileName, JsonDocument & FileData);
92 uint64_t WriteSdFileBuf (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToWrite);
93 uint64_t WriteSdFile (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToWrite);
94 uint64_t WriteSdFile (const FileId & FileHandle, byte * FileData, uint64_t NumBytesToWrite, uint64_t StartingPosition);
95 void CloseSdFile (FileId & FileHandle);
96 void GetListOfSdFiles (std::vector<String> & Response);
97 uint64_t GetSdFileSize (const String & FileName);
98 uint64_t GetSdFileSize (const FileId & FileHandle);
99 void RenameSdFile (String & OldName, String & NewName);
100 void BuildFseqList (bool DisplayFileNames);
101
102 void GetDriverName (String& Name) { Name = F("FileMgr"); }
103 void NetworkStateChanged (bool NewState);
104 void FindFirstZipFile (String &FileName);
105 int FileListFindSdFileHandle (FileId HandleToFind);
106
107#define SD_BLOCK_SIZE 512
108
109#if defined ARDUINO_ARCH_ESP8266
110# define MAX_SD_BUFFER_SIZE (4 * SD_BLOCK_SIZE)
111#else
112# define MAX_SD_BUFFER_SIZE (14 * SD_BLOCK_SIZE)
113#endif
114
115private:
116 void SetSpiIoPins ();
117 void SetSdSpeed ();
118 void ResetSdCard ();
119 void LockSd();
120 void UnLockSd();
121 bool SeekSdFile(const FileId & FileHandle, uint64_t position, SeekMode Mode);
122 void BuildDefaultFseqList ();
123
124# define SD_CARD_CLK_MHZ SD_SCK_MHZ(37) // 50 MHz SPI clock
125#ifndef MaxSdTransSpeedMHz
126# define MaxSdTransSpeedMHz 200
127#endif // ndef MaxSdTransSpeedMHz
128
129 void listDir (fs::FS& fs, String dirname, uint8_t levels);
130 void DescribeSdCardToUser ();
131 void handleFileUploadNewFile (const String & filename);
132 void printDirectory (FsFile & dir, int numTabs);
133
134 bool SdCardInstalled = false;
143 String FtpUserName = "esps";
144 String FtpPassword = "esps";
145 String WelcomeString = "ESPS V4 FTP";
146 bool FtpEnabled = true;
147 uint64_t SdCardSizeMB = 0;
149 bool FoundZipFile = false;
150 const String FSEQFILELIST = "/fseqfilelist.json";
151
152public: struct __attribute__((__packed__, aligned(4))) CSD {
153 public: union {
154 public: struct __attribute__((__packed__, aligned(1))) {
155 public: enum {
156 CSD_VERSION_1 = 0, // enum CSD version 1.0 - 1.1, Version 2.00/Standard Capacity
157 CSD_VERSION_2 = 1, // enum CSD cersion 2.0, Version 2.00/High Capacity and Extended Capacity
158 } csd_structure : 2; // @127-126 CSD Structure Version as on SD CSD bits
159 unsigned spec_vers : 6; // @125-120 CSD version as on SD CSD bits
160 uint8_t taac; // @119-112 taac as on SD CSD bits
161 uint8_t nsac; // @111-104 nsac as on SD CSD bits
162 uint8_t tran_speed; // @103-96 trans_speed as on SD CSD bits
163 }Decode_0;
164 public: uint32_t Raw32_0; // @127-96 Union to access 32 bits as a uint32_t
165 };
166 public: union {
167 public: struct __attribute__((__packed__, aligned(1))) {
168 unsigned ccc : 12; // @95-84 ccc as on SD CSD bits
169 unsigned read_bl_len : 4; // @83-80 read_bl_len on SD CSD bits
170 unsigned read_bl_partial : 1; // @79 read_bl_partial as on SD CSD bits
171 unsigned write_blk_misalign : 1; // @78 write_blk_misalign as on SD CSD bits
172 unsigned read_blk_misalign : 1; // @77 read_blk_misalign as on SD CSD bits
173 unsigned dsr_imp : 1; // @76 dsr_imp as on SD CSD bits
174 unsigned c_size : 12; // @75-64 Version 1 C_Size as on SD CSD bits
175 };
176 public: uint32_t Raw32_1; // @0-31 Union to access 32 bits as a uint32_t
177 };
178 public: union {
179 public: struct __attribute__((__packed__, aligned(1))) {
180 public: union {
181 public: struct __attribute__((__packed__, aligned(1))) {
182 unsigned vdd_r_curr_min : 3; // @61-59 vdd_r_curr_min as on SD CSD bits
183 unsigned vdd_r_curr_max : 3; // @58-56 vdd_r_curr_max as on SD CSD bits
184 unsigned vdd_w_curr_min : 3; // @55-53 vdd_w_curr_min as on SD CSD bits
185 unsigned vdd_w_curr_max : 3; // @52-50 vdd_w_curr_max as on SD CSD bits
186 unsigned c_size_mult : 3; // @49-47 c_size_mult as on SD CSD bits
187 unsigned reserved0 : 7; // reserved for CSD ver 2.0 size match
188 };
189 unsigned ver2_c_size : 22; // Version 2 C_Size
190 };
191 unsigned erase_blk_en : 1; // @46 erase_blk_en as on SD CSD bits
192 unsigned sector_size : 7; // @45-39 sector_size as on SD CSD bits
193 unsigned reserved1 : 2; // 2 Spares bit unused
194 };
195 public: uint32_t Raw32_2; // @0-31 Union to access 32 bits as a uint32_t
196 };
197 public: union {
198 public: struct __attribute__((__packed__, aligned(1))) {
199 unsigned wp_grp_size : 7; // @38-32 wp_grp_size as on SD CSD bits
200 unsigned wp_grp_enable : 1; // @31 wp_grp_enable as on SD CSD bits
201 unsigned reserved2 : 2; // @30-29 Write as zero read as don't care
202 unsigned r2w_factor : 3; // @28-26 r2w_factor as on SD CSD bits
203 unsigned write_bl_len : 4; // @25-22 write_bl_len as on SD CSD bits
204 unsigned write_bl_partial : 1; // @21 write_bl_partial as on SD CSD bits
205 unsigned default_ecc : 5; // @20-16 default_ecc as on SD CSD bits
206 unsigned file_format_grp : 1; // @15 file_format_grp as on SD CSD bits
207 unsigned copy : 1; // @14 copy as on SD CSD bits
208 unsigned perm_write_protect : 1; // @13 perm_write_protect as on SD CSD bits
209 unsigned tmp_write_protect : 1; // @12 tmp_write_protect as on SD CSD bits
210 public: enum {
211 // FAT_PARTITION_TABLE = 0, // enum SD card is FAT with partition table
212 // FAT_NO_PARTITION_TABLE = 1, // enum SD card is FAT with no partition table
213 // FS_UNIVERSAL = 2, // enum SD card file system is universal
214 // FS_OTHER = 3, // enum SD card file system is other
215 } file_format : 2; // @11-10 File format as on SD CSD bits
216 unsigned ecc : 2; // @9-8 ecc as on SD CSD bits
217 unsigned reserved3 : 1; // 1 spare bit unused
218 };
219 public: uint32_t Raw32_3; // @0-31 Union to access 32 bits as a uint32_t
220 };
221};
222#define MaxOpenFiles 5
224 {
226 FsFile fsFile;
227 uint64_t size = 0;
228 int entryId = -1;
229 String Filename = emptyString;
231 bool IsOpen = false;
232 struct
233 {
234 byte *DataBuffer = nullptr;
235 uint64_t size = 0;
236 uint64_t offset = 0;
238 };
239#define DATABUFFERSIZE (5 * 1024)
240
242 void InitSdFileList ();
243
245 uint32_t LastFileSent = 0;
246 uint32_t expectedIndex = 0;
247
248#ifdef ARDUINO_ARCH_ESP32
249 SemaphoreHandle_t SdAccessSemaphore = NULL;
250#endif // def ARDUINO_ARCH_ESP32
251
252protected:
253
254}; // c_FileMgr
255
256#ifdef DEBUG_FILE_HANDLES
257#define DEBUG_FILE_HANDLE(fh) \
258{ \
259 if (fh == c_FileMgr::INVALID_FILE_HANDLE) \
260 { \
261 DEBUG_V(String(F("Found an invalid file handle before a request to FileMgr. File Handle: ")) + String(fh)); \
262 } \
263 else \
264 { \
265 if (-1 == FileMgr.FileListFindSdFileHandle (fh)) \
266 { \
267 DEBUG_V(String(F("Could not look up File Handle: ")) + String(fh)); \
268 } \
269 } \
270}
271#else
272#define DEBUG_FILE_HANDLE(fh)
273#endif // def DEBUG_FILE_HANDLE
274
275extern c_FileMgr FileMgr;
SdFs sd
Definition FileMgr.cpp:29
c_FileMgr FileMgr
Definition FileMgr.cpp:2180
#define MaxOpenFiles
Definition FileMgr.hpp:222
#define MaxSdTransSpeedMHz
Definition FileMgr.hpp:126
#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:45
FileId CreateSdFileHandle()
Definition FileMgr.cpp:1002
void printDirectory(FsFile &dir, int numTabs)
Definition FileMgr.cpp:1138
void GetListOfSdFiles(std::vector< String > &Response)
Definition FileMgr.cpp:1078
bool FoundZipFile
Definition FileMgr.hpp:149
void SetSdSpeed()
Definition FileMgr.cpp:476
bool SeekSdFile(const FileId &FileHandle, uint64_t position, SeekMode Mode)
Definition FileMgr.cpp:2083
void SaveSdFile(const String &FileName, String &FileData)
Definition FileMgr.cpp:1179
void DeleteFlashFile(const String &FileName)
Definition FileMgr.cpp:563
void BuildDefaultFseqList()
Definition FileMgr.cpp:2064
String fsUploadFileName
Definition FileMgr.hpp:140
void GetConfig(JsonObject &json)
Definition FileMgr.cpp:287
bool OpenSdFile(const String &FileName, FileMode Mode, FileId &FileHandle, int FileListIndex)
Definition FileMgr.cpp:1215
static const FileId INVALID_FILE_HANDLE
Definition FileMgr.hpp:51
void InitSdFileList()
Definition FileMgr.cpp:958
File FileSendDir
Definition FileMgr.hpp:244
c_FileMgr()
< Start up the driver and put it into a safe mode
Definition FileMgr.cpp:134
void Begin()
< Start the module
Definition FileMgr.cpp:154
void DeleteSdFile(const String &FileName)
Definition FileMgr.cpp:1039
uint8_t clk_pin
Definition FileMgr.hpp:137
uint8_t cs_pin
Definition FileMgr.hpp:138
uint32_t LastFileSent
Definition FileMgr.hpp:245
void listDir(fs::FS &fs, String dirname, uint8_t levels)
Definition FileMgr.cpp:579
uint64_t SdCardSizeMB
Definition FileMgr.hpp:147
void GetStatus(JsonObject &json)
Definition FileMgr.cpp:306
void LockSd()
Definition FileMgr.cpp:2136
bool LoadFlashFile(const String &FileName, DeserializationHandler Handler)
Definition FileMgr.cpp:622
int FileListFindSdFileHandle(FileId HandleToFind)
Definition FileMgr.cpp:974
FileListEntry_t FileList[MaxOpenFiles]
Definition FileMgr.hpp:241
uint64_t ReadSdFile(const FileId &FileHandle, byte *FileData, uint64_t NumBytesToRead, uint64_t StartingPosition)
Definition FileMgr.cpp:1405
std::function< void(JsonDocument &json)> DeserializationHandler
Definition FileMgr.hpp:62
const String FSEQFILELIST
Definition FileMgr.hpp:150
uint32_t MaxSdSpeed
Definition FileMgr.hpp:148
void FindFirstZipFile(String &FileName)
Definition FileMgr.cpp:1840
String FtpPassword
Definition FileMgr.hpp:144
virtual ~c_FileMgr()
< deallocate any resources and put the output channels into a safe state
Definition FileMgr.cpp:144
void UnLockSd()
Definition FileMgr.cpp:2148
String WelcomeString
Definition FileMgr.hpp:145
String FtpUserName
Definition FileMgr.hpp:143
uint8_t mosi_pin
Definition FileMgr.hpp:136
bool handleFileUpload(const String &filename, size_t index, uint8_t *data, size_t len, bool final, uint32_t totalLen)
Definition FileMgr.cpp:1913
bool FtpEnabled
Definition FileMgr.hpp:146
void NetworkStateChanged(bool NewState)
Definition FileMgr.cpp:197
uint32_t expectedIndex
Definition FileMgr.hpp:246
void BuildFseqList(bool DisplayFileNames)
Definition FileMgr.cpp:1707
uint64_t WriteSdFileBuf(const FileId &FileHandle, byte *FileData, uint64_t NumBytesToWrite)
Definition FileMgr.cpp:1524
FileMode
Definition FileMgr.hpp:65
@ FileWrite
Definition FileMgr.hpp:67
@ FileAppend
Definition FileMgr.hpp:68
@ FileRead
Definition FileMgr.hpp:66
void SetSpiIoPins()
Definition FileMgr.cpp:348
bool SaveFlashFile(const String &FileName, String &FileData)
Definition FileMgr.cpp:689
void RenameSdFile(String &OldName, String &NewName)
Definition FileMgr.cpp:1687
FileId fsUploadFileHandle
Definition FileMgr.hpp:139
void DescribeSdCardToUser()
Definition FileMgr.cpp:1059
void CloseSdFile(FileId &FileHandle)
Definition FileMgr.cpp:1439
bool SdCardIsInstalled()
Definition FileMgr.hpp:83
bool ReadFlashFile(const String &FileName, String &FileData)
Definition FileMgr.cpp:824
uint32_t fsUploadStartTime
Definition FileMgr.hpp:142
uint64_t GetSdFileSize(const String &FileName)
Definition FileMgr.cpp:1642
void handleFileUploadNewFile(const String &filename)
Definition FileMgr.cpp:2020
uint64_t WriteSdFile(const FileId &FileHandle, byte *FileData, uint64_t NumBytesToWrite)
Definition FileMgr.cpp:1479
bool SdCardInstalled
Definition FileMgr.hpp:134
void ResetSdCard()
Definition FileMgr.cpp:541
bool SetConfig(JsonObject &json)
Definition FileMgr.cpp:234
bool fsUploadFileSavedIsEnabled
Definition FileMgr.hpp:141
uint32_t FileId
Definition FileMgr.hpp:50
void AbortSdFileUpload()
Definition FileMgr.cpp:2159
uint8_t miso_pin
Definition FileMgr.hpp:135
void Poll()
Definition FileMgr.cpp:220
bool FlashFileExists(const String &FileName)
Definition FileMgr.cpp:949
void GetDriverName(String &Name)
Definition FileMgr.hpp:102
char filename[250]
Definition fseq.h:7
struct FSEQParsedRangeEntry __attribute__
Definition FileMgr.hpp:224
uint64_t size
Definition FileMgr.hpp:227
FsFile fsFile
Definition FileMgr.hpp:226
uint64_t offset
Definition FileMgr.hpp:236
String Filename
Definition FileMgr.hpp:229
FileId handle
Definition FileMgr.hpp:225
FileMode mode
Definition FileMgr.hpp:230
int entryId
Definition FileMgr.hpp:228
struct c_FileMgr::FileListEntry_t::@2 buffer
byte * DataBuffer
Definition FileMgr.hpp:234
bool IsOpen
Definition FileMgr.hpp:231