Skip to content

Commit 27bb995

Browse files
committed
determine image size automatically when image file is given
1 parent 50fcb01 commit 27bb995

File tree

2 files changed

+53
-12
lines changed

2 files changed

+53
-12
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,4 @@ MIT
115115

116116
- [ ] Add more debug output and print SPIFFS debug output
117117
- [ ] Error handling
118-
- [ ] Determine the image size automatically when opening a file
119118
- [ ] Code cleanup

main.cpp

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,11 @@ bool spiffsMount(){
103103
if(SPIFFS_mounted(&s_fs))
104104
return true;
105105
int res = spiffsTryMount();
106-
return (res == SPIFFS_OK);
106+
if (res != SPIFFS_OK) {
107+
std::cerr << "SPIFFS mount failed with error: " << res << std::endl;
108+
return false;
109+
}
110+
return true;
107111
}
108112

109113
bool spiffsFormat(){
@@ -443,6 +447,10 @@ int actionPack() {
443447
std::cerr << "error: can't read source directory" << std::endl;
444448
return 1;
445449
}
450+
451+
if (s_imageSize == 0) {
452+
s_imageSize = 0x10000;
453+
}
446454

447455
s_flashmem.resize(s_imageSize, 0xff);
448456

@@ -462,6 +470,14 @@ int actionPack() {
462470
return result;
463471
}
464472

473+
size_t getFileSize(FILE* fp)
474+
{
475+
fseek(fp, 0L, SEEK_END);
476+
size_t size = (size_t) ftell(fp);
477+
fseek(fp, 0L, SEEK_SET);
478+
return size;
479+
}
480+
465481
/**
466482
* @brief Unpack action.
467483
* @return 0 success, 1 error
@@ -470,7 +486,6 @@ int actionPack() {
470486
*/
471487
int actionUnpack(void) {
472488
int ret = 0;
473-
s_flashmem.resize(s_imageSize, 0xff);
474489

475490
// open spiffs image
476491
FILE* fdsrc = fopen(s_imageName.c_str(), "rb");
@@ -479,14 +494,23 @@ int actionUnpack(void) {
479494
return 1;
480495
}
481496

497+
if (s_imageSize == 0) {
498+
s_imageSize = getFileSize(fdsrc);
499+
}
500+
501+
s_flashmem.resize(s_imageSize, 0xff);
502+
482503
// read content into s_flashmem
483504
fread(&s_flashmem[0], 4, s_flashmem.size()/4, fdsrc);
484505

485-
// close fiel handle
506+
// close file handle
486507
fclose(fdsrc);
487508

488509
// mount file system
489-
spiffsMount();
510+
if (!spiffsMount()) {
511+
std::cerr << "error: failed to mount image" << std::endl;
512+
return 1;
513+
}
490514

491515
// unpack files
492516
if (! unpackFiles(s_dirName)) {
@@ -501,35 +525,53 @@ int actionUnpack(void) {
501525

502526

503527
int actionList() {
504-
s_flashmem.resize(s_imageSize, 0xff);
505-
506528
FILE* fdsrc = fopen(s_imageName.c_str(), "rb");
507529
if (!fdsrc) {
508530
std::cerr << "error: failed to open image file" << std::endl;
509531
return 1;
510532
}
511533

534+
if (s_imageSize == 0) {
535+
s_imageSize = getFileSize(fdsrc);
536+
}
537+
538+
s_flashmem.resize(s_imageSize, 0xff);
539+
512540
fread(&s_flashmem[0], 4, s_flashmem.size()/4, fdsrc);
513541
fclose(fdsrc);
514-
spiffsMount();
542+
543+
if (!spiffsMount()) {
544+
std::cerr << "error: failed to mount image" << std::endl;
545+
return 1;
546+
}
547+
515548
listFiles();
516549
spiffsUnmount();
517550
return 0;
518551
}
519552

520553
int actionVisualize() {
521-
s_flashmem.resize(s_imageSize, 0xff);
522-
523554
FILE* fdsrc = fopen(s_imageName.c_str(), "rb");
524555
if (!fdsrc) {
525556
std::cerr << "error: failed to open image file" << std::endl;
526557
return 1;
527558
}
528559

560+
if (s_imageSize == 0) {
561+
s_imageSize = getFileSize(fdsrc);
562+
}
563+
564+
s_flashmem.resize(s_imageSize, 0xff);
565+
566+
529567
fread(&s_flashmem[0], 4, s_flashmem.size()/4, fdsrc);
530568
fclose(fdsrc);
531569

532-
spiffsMount();
570+
if (!spiffsMount()) {
571+
std::cerr << "error: failed to mount image" << std::endl;
572+
return 1;
573+
}
574+
533575
SPIFFS_vis(&s_fs);
534576
uint32_t total, used;
535577
SPIFFS_info(&s_fs, &total, &used);
@@ -577,7 +619,7 @@ void processArgs(int argc, const char** argv) {
577619
TCLAP::SwitchArg listArg( "l", "list", "list files in spiffs image", false);
578620
TCLAP::SwitchArg visualizeArg( "i", "visualize", "visualize spiffs image", false);
579621
TCLAP::UnlabeledValueArg<std::string> outNameArg( "image_file", "spiffs image file", true, "", "image_file" );
580-
TCLAP::ValueArg<int> imageSizeArg( "s", "size", "fs image size, in bytes", false, 0x10000, "number" );
622+
TCLAP::ValueArg<int> imageSizeArg( "s", "size", "fs image size, in bytes", false, 0, "number" );
581623
TCLAP::ValueArg<int> pageSizeArg( "p", "page", "fs page size, in bytes", false, 256, "number" );
582624
TCLAP::ValueArg<int> blockSizeArg( "b", "block", "fs block size, in bytes", false, 4096, "number" );
583625
TCLAP::SwitchArg addAllFilesArg( "a", "all-files", "when creating an image, include files which are normally ignored; currently only applies to '.DS_Store' files and '.git' directories", false);

0 commit comments

Comments
 (0)