@@ -39,31 +39,25 @@ static std::vector<uint8_t> s_spiffsFds;
39
39
static std::vector<uint8_t > s_spiffsCache;
40
40
41
41
42
- static s32_t api_spiffs_read (u32_t addr, u32_t size, u8_t *dst)
43
- {
42
+ static s32_t api_spiffs_read (u32_t addr, u32_t size, u8_t *dst){
44
43
memcpy (dst, &s_flashmem[0 ] + addr, size);
45
44
return SPIFFS_OK;
46
45
}
47
46
48
- static s32_t api_spiffs_write (u32_t addr, u32_t size, u8_t *src)
49
- {
47
+ static s32_t api_spiffs_write (u32_t addr, u32_t size, u8_t *src){
50
48
memcpy (&s_flashmem[0 ] + addr, src, size);
51
49
return SPIFFS_OK;
52
50
}
53
51
54
- static s32_t api_spiffs_erase (u32_t addr, u32_t size)
55
- {
52
+ static s32_t api_spiffs_erase (u32_t addr, u32_t size){
56
53
memset (&s_flashmem[0 ] + addr, 0xff , size);
57
54
return SPIFFS_OK;
58
55
}
59
56
60
- void checkCallback (spiffs_check_type type, spiffs_check_report report,
61
- u32_t arg1, u32_t arg2)
62
- {
63
- }
64
57
65
- void spiffsMount (bool init)
66
- {
58
+ // implementation
59
+
60
+ int spiffsTryMount (){
67
61
spiffs_config cfg = {0 };
68
62
69
63
cfg.phys_addr = 0x0000 ;
@@ -82,35 +76,35 @@ void spiffsMount(bool init)
82
76
s_spiffsFds.resize (32 * maxOpenFiles);
83
77
s_spiffsCache.resize ((32 + s_pageSize) * maxOpenFiles);
84
78
85
-
86
- SPIFFS_mount (&s_fs, &cfg,
79
+ return SPIFFS_mount (&s_fs, &cfg,
87
80
&s_spiffsWorkBuf[0 ],
88
81
&s_spiffsFds[0 ], s_spiffsFds.size (),
89
82
&s_spiffsCache[0 ], s_spiffsCache.size (),
90
83
NULL );
91
-
92
- // debugf("mount res: %d\n", res);
93
- if (init) {
94
- spiffs_file fd = SPIFFS_open (&s_fs, (char *) " tmp" , SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0 );
95
- uint8_t tmp = 0xff ;
96
- SPIFFS_write (&s_fs, fd, &tmp, 1 );
97
- SPIFFS_fremove (&s_fs, fd);
98
- SPIFFS_close (&s_fs, fd);
99
- } else {
100
- s_fs.check_cb_f = &checkCallback;
101
- // SPIFFS_check(&s_fs);
102
- }
103
84
}
104
85
105
- void spiffsUnmount ()
106
- {
86
+ bool spiffsMount (){
87
+ if (SPIFFS_mounted (&s_fs))
88
+ return true ;
89
+ int res = spiffsTryMount ();
90
+ return (res == SPIFFS_OK);
91
+ }
92
+
93
+ bool spiffsFormat (){
94
+ spiffsMount ();
95
+ SPIFFS_unmount (&s_fs);
96
+ int formated = SPIFFS_format (&s_fs);
97
+ if (formated != SPIFFS_OK)
98
+ return false ;
99
+ return (spiffsTryMount () == SPIFFS_OK);
100
+ }
101
+
102
+ void spiffsUnmount (){
103
+ if (SPIFFS_mounted (&s_fs))
107
104
SPIFFS_unmount (&s_fs);
108
105
}
109
106
110
107
int addFile (char * name, const char * path) {
111
- const size_t write_size = 512 ;
112
- uint8_t write_block[write_size];
113
-
114
108
FILE* src = fopen (path, " rb" );
115
109
if (!src) {
116
110
std::cerr << " error: failed to open " << path << " for reading" << std::endl;
@@ -124,30 +118,28 @@ int addFile(char* name, const char* path) {
124
118
fseek (src, 0 , SEEK_SET);
125
119
126
120
size_t left = size;
127
- while (left > 0 )
128
- {
129
- size_t will_write = std::min (left, write_size);
130
- if (will_write != fread (write_block, 1 , will_write, src)) {
121
+ uint8_t data_byte;
122
+ while (left > 0 ){
123
+ if (1 != fread (&data_byte, 1 , 1 , src)) {
131
124
fclose (src);
132
125
SPIFFS_close (&s_fs, dst);
133
126
return 1 ;
134
127
}
135
- int res = SPIFFS_write (&s_fs, dst, write_block, write_size );
128
+ int res = SPIFFS_write (&s_fs, dst, &data_byte, 1 );
136
129
if (res < 0 ) {
137
130
fclose (src);
138
131
SPIFFS_close (&s_fs, dst);
139
132
return 1 ;
140
133
}
141
- left -= will_write ;
134
+ left -= 1 ;
142
135
}
143
136
144
137
SPIFFS_close (&s_fs, dst);
145
138
fclose (src);
146
139
return 0 ;
147
140
}
148
141
149
- int addFiles (const char * dirname)
150
- {
142
+ int addFiles (const char * dirname){
151
143
DIR *dir;
152
144
struct dirent *ent;
153
145
bool error = false ;
@@ -165,8 +157,10 @@ int addFiles(const char* dirname)
165
157
continue ;
166
158
}
167
159
160
+ std::string filepath = " /" ;
161
+ filepath += ent->d_name ;
168
162
std::cout << ent->d_name << std::endl;
169
- if (addFile (ent-> d_name , fullpath.c_str ()) != 0 ) {
163
+ if (addFile (( char *)filepath. c_str () , fullpath.c_str ()) != 0 ) {
170
164
std::cerr << " error adding file!" << std::endl;
171
165
error = true ;
172
166
break ;
@@ -196,7 +190,7 @@ void listFiles() {
196
190
SPIFFS_closedir (&dir);
197
191
}
198
192
199
-
193
+ // Actions
200
194
201
195
int actionPack () {
202
196
s_flashmem.resize (s_imageSize, 0xff );
@@ -207,7 +201,7 @@ int actionPack() {
207
201
return 1 ;
208
202
}
209
203
210
- spiffsMount ( true );
204
+ spiffsFormat ( );
211
205
int result = addFiles (s_dirName.c_str ());
212
206
spiffsUnmount ();
213
207
@@ -229,11 +223,9 @@ int actionList() {
229
223
230
224
fread (&s_flashmem[0 ], 4 , s_flashmem.size ()/4 , fdsrc);
231
225
fclose (fdsrc);
232
-
233
- spiffsMount (false );
226
+ spiffsMount ();
234
227
listFiles ();
235
228
spiffsUnmount ();
236
-
237
229
return 0 ;
238
230
}
239
231
@@ -249,7 +241,7 @@ int actionVisualize() {
249
241
fread (&s_flashmem[0 ], 4 , s_flashmem.size ()/4 , fdsrc);
250
242
fclose (fdsrc);
251
243
252
- spiffsMount (false );
244
+ spiffsMount ();
253
245
SPIFFS_vis (&s_fs);
254
246
uint32_t total, used;
255
247
SPIFFS_info (&s_fs, &total, &used);
@@ -260,7 +252,6 @@ int actionVisualize() {
260
252
}
261
253
262
254
void processArgs (int argc, const char ** argv) {
263
-
264
255
TCLAP::CmdLine cmd (" " , ' ' , VERSION);
265
256
TCLAP::ValueArg<std::string> packArg ( " c" , " create" , " create spiffs image from a directory" , true , " " , " pack_dir" );
266
257
TCLAP::SwitchArg listArg ( " l" , " list" , " list files in spiffs image" , false );
@@ -299,13 +290,11 @@ int main(int argc, const char * argv[]) {
299
290
300
291
try {
301
292
processArgs (argc, argv);
302
- }
303
- catch (...) {
293
+ } catch (...) {
304
294
std::cerr << " Invalid arguments" << std::endl;
305
295
return 1 ;
306
296
}
307
297
308
-
309
298
switch (s_action) {
310
299
case ACTION_PACK: return actionPack ();
311
300
case ACTION_LIST: return actionList ();
0 commit comments