}
+static bool check_abort(void)
+{
+ bool ret = ctrlc();
+
+ if (ret)
+ printf_P(PSTR("Abort\n"));
+
+ return ret;
+}
+
+
static const FLASH char * const FLASH rc_names[] = {
FSTR("OK"),
FSTR("DISK_ERR"),
static
void put_rc (FRESULT rc)
{
+ if (rc < ARRAY_SIZE(rc_names)) {
#if GCC_BUG_61443
- printf_P(PSTR("rc=%u FR_"), rc);
- my_puts_P(rc_names[rc]);
- my_puts_P(PSTR("\n"));
+ printf_P(PSTR("rc=%u FR_"), rc);
+ my_puts_P(rc_names[rc]);
+ my_puts_P(PSTR("\n"));
#else
- printf_P(PSTR("rc=%u FR_%S\n"), rc, rc_names[rc]);
+ printf_P(PSTR("rc=%u FR_%S\n"), rc, rc_names[rc]);
#endif
+ }
+}
+
+
+static void swirl(void)
+{
+ static const FLASH char swirlchar[] = { '-','\\','|','/' };
+ static uint_fast8_t cnt;
+ static uint32_t tstamp;
+
+ if (get_timer(0) > tstamp) {
+ printf_P(PSTR("\b%c"), swirlchar[cnt]);
+ cnt = (cnt+1) % ARRAY_SIZE(swirlchar);
+ tstamp = get_timer(0) + 250;
+ }
}
/* Work register for fs command */
-static DWORD AccSize;
-static WORD AccFiles, AccDirs;
-#if _USE_LFN
-char Lfname[_MAX_LFN+1];
-FILINFO Finfo = {
- .lfname = Lfname,
- .lfsize = sizeof Lfname
- };
-#else
-FILINFO Finfo;
-#endif
+struct stat_dat_s {
+ DWORD AccSize;
+ WORD AccFiles, AccDirs;
+ FILINFO Finfo;
+};
static
FRESULT scan_files (
- char* path /* Pointer to the working buffer with start path */
+ char *path, /* Pointer to the working buffer with start path */
+ struct stat_dat_s *statp
)
{
DIR dirs;
char *fn;
res = f_opendir(&dirs, path);
-
+ swirl();
if (res == FR_OK) {
i = strlen(path);
- while (((res = f_readdir(&dirs, &Finfo)) == FR_OK) && Finfo.fname[0]) {
- if (_FS_RPATH && Finfo.fname[0] == '.') continue;
-#if _USE_LFN
- fn = *Finfo.lfname ? Finfo.lfname : Finfo.fname;
-#else
- fn = Finfo.fname;
-#endif
- if (Finfo.fattrib & AM_DIR) {
- AccDirs++;
- path[i] = '/'; strcpy(path+i+1, fn);
- res = scan_files(path);
+ while (((res = f_readdir(&dirs, &statp->Finfo)) == FR_OK) &&
+ statp->Finfo.fname[0]) {
+ if (_FS_RPATH && statp->Finfo.fname[0] == '.')
+ continue;
+ fn = statp->Finfo.fname;
+ if (statp->Finfo.fattrib & AM_DIR) {
+ statp->AccDirs++;
+ path[i] = '/';
+ strcpy(path+i+1, fn);
+ res = scan_files(path, statp);
path[i] = '\0';
- if (res != FR_OK) break;
+ if (res != FR_OK)
+ break;
} else {
-// printf_P(PSTR("%s/%s\n"), path, fn);
- AccFiles++;
- AccSize += Finfo.fsize;
+ //printf_P(PSTR("%s/%s\n"), path, fn);
+ statp->AccFiles++;
+ statp->AccSize += statp->Finfo.fsize;
+ }
+ if (check_abort()) {
+ res = 255;
+ break;
}
}
}
FATFS *FatFs, *fs;
DWORD nfreeclst;
FRESULT res;
- char *buffer;
+ char *path;
+ struct stat_dat_s statp;
(void) cmdtp; (void) flag; (void) argc;
FatFs = (FATFS *) malloc(sizeof (FATFS));
- buffer = (char *) malloc(BUFFER_SIZE);
- if (FatFs == NULL || buffer == NULL) {
+ path = (char *) malloc(BUFFER_SIZE);
+ if (FatFs == NULL || path == NULL) {
printf_P(PSTR("fatstat: Out of Memory!\n"));
- free(buffer);
+ free(path);
free(FatFs);
return CMD_RET_FAILURE;
}
}
#endif
if (!res) {
- my_puts_P(PSTR("\n..."));
- AccSize = AccFiles = AccDirs = 0;
-
- strcpy(buffer, argv[1]);
+ my_puts_P(PSTR("\nCounting... "));
+ statp.AccSize = statp.AccFiles = statp.AccDirs = 0;
+ strcpy(path, argv[1]);
- res = scan_files(buffer);
+ res = scan_files(path, &statp);
}
if (!res) {
printf_P(PSTR("\r%u files, %lu bytes.\n%u folders.\n"
"%lu KB total disk space.\n%lu KB available.\n"),
- AccFiles, AccSize, AccDirs,
+ statp.AccFiles, statp.AccSize, statp.AccDirs,
(fs->n_fatent - 2) * (fs->csize / 2), nfreeclst * (fs->csize / 2)
);
}
}
}
- f_mount(NULL, argv[1], 0);
- free(buffer);
+ free(path);
free(FatFs);
+ f_mount(NULL, argv[1], 0);
if (res) {
put_rc(res);
return CMD_RET_FAILURE;
#else
printf_P(PSTR("%s\n"), Finfo.fname);
#endif
+ if (check_abort())
+ break;
}
if (res == FR_OK) {
printf_P(PSTR("Disk full?\n"));
break;
}
- if (ctrlc()) {
- printf_P(PSTR("Abort\n"));
+ if (check_abort())
break;
- }
}
FRESULT fr = f_close(&File);