ESP8266 ILI9341 display support code with printf sources, wire-frame viewer and custom fonts  1.0
ESP8266ILI9341DisplayProject
fatfs_tests.c
Go to the documentation of this file.
1 
30 #include "user_config.h"
31 #include "fatfs.h"
32 
33 #ifdef AVR
34 //#include <stdio.h>
35 #include <stdlib.h>
36 #endif
37 
38 #include "lib/time.h"
39 #include "lib/stringsup.h"
40 
41 #include "printf/mathio.h"
42 
46 void fatfs_help( int full)
47 {
48  printf("fatfs help\n");
49 
50  if(full)
51  {
52  printf(
53 #ifdef POSIX_TESTS
54  "Note: fatfs tests MUST start with \"fatfs\" keyword\n"
55 #else
56  "Note: fatfs prefix is optional\n"
57 #endif
58  "fatfs help\n"
59 #ifdef FATFS_UTILS_FULL
60  "fatfs attrib file p1 p2\n"
61  "fatfs cat file\n"
62  "fatfs cd dir\n"
63  "fatfs copy file1 file2\n"
64  "fatfs create file str\n"
65 #endif
66  "fatfs mmc_test\n"
67  "fatfs mmc_init\n"
68  "fatfs ls dir\n"
69 
70 #ifdef FATFS_UTILS_FULL
71  "fatfs mkdir dir\n"
72  "fatfs mkfs\n"
73  "fatfs pwd\n"
74 #endif
75  "fatfs status file\n"
76 
77 #ifdef FATFS_UTILS_FULL
78  "fatfs stat file\n"
79  "fatfs rm file\n"
80  "fatfs rmdir dir\n"
81  "fatfs rename old new\n"
82 #endif
83  "\n"
84  );
85  }
86 
87 }
88 
100 MEMSPACE
101 int fatfs_tests(int argc,char *argv[])
102 {
103  char *ptr;
104  int ind;
105 
106 
107  ind = 0;
108  ptr = argv[ind++];
109 
110  if(!ptr)
111  return(0);
112 
113 // If we have POSIX_TESTS we MUST prefix each test with "fatfs" keyword to avoid name clashing
114 
115  if( MATCH(ptr,"fatfs") )
116  {
117  ptr = argv[ind++];
118  if ( !ptr || MATCH(ptr,"help") )
119  {
120  fatfs_help(1);
121  return(1);
122  }
123  }
124 #ifdef POSIX_TESTS
125  else
126  {
127  return(0);
128  }
129 #endif
130 
131  if (MATCHARGS(ptr,"ls", (ind + 0), argc))
132  {
133  int i;
134  int args = 0;
135  printf("ind:%d,argc:%d\n", ind, argc);
136  for(i=ind;i<argc;++i)
137  {
138  //printf("%d:%s\n", i, argv[i]);
139  fatfs_ls(argv[i]);
140  ++args;
141  }
142  if(!args)
143  {
144  fatfs_ls("");
145  }
146  return(1);
147  }
148 
149  if (MATCHARGS(ptr,"mmc_test",(ind+0),argc ))
150  {
151  mmc_test();
152  return(1);
153  }
154 
155  if (MATCHARGS(ptr,"mmc_init",(ind+0),argc))
156  {
157  mmc_init(1);
158  return(1);
159  }
160 
161  if (MATCHARGS(ptr,"status", (ind + 1), argc))
162  {
163  fatfs_status(argv[ind]);
164  return(1);
165  }
166 
167 #ifdef FATFS_UTILS_FULL
168  if (MATCHARGS(ptr,"attrib",(ind+3),argc))
169  {
170  put_rc( f_chmod(argv[ind],atol(argv[ind+1]),atol(argv[ind+2])) );
171  return(1);
172  }
173 
174  if (MATCHARGS(ptr,"cat", (ind + 1), argc))
175  {
176  fatfs_cat(argv[ind]);
177  return(1);
178  }
179 
180 #if _FS_RPATH
181  if (MATCHARGS(ptr,"cd", (ind + 1), argc))
182  {
183  fatfs_cd(argv[ind]);
184  return(1);
185  }
186 #endif
187 
188  if (MATCHARGS(ptr,"copy", (ind + 2), argc))
189  {
190  fatfs_copy(argv[ind],argv[ind+1]);
191  return(1);
192  }
193 
194  if (MATCHARGS(ptr,"create", (ind + 2), argc))
195  {
196  fatfs_create(argv[ind],argv[ind+1]);
197  return(1);
198  }
199 
200  if (MATCHARGS(ptr,"mkdir", (ind + 1), argc))
201  {
202  fatfs_mkdir(argv[ind]);
203  return(1);
204  }
205 
206  if (MATCHARGS(ptr,"mkfs", (ind + 0), argc))
207  {
208  FATFS fs;
209  uint8_t *mem;
210  int res;
211  /* Register work area to the logical drive 0 */
212  res = f_mount(&fs, "0:", 0);
213  put_rc(res);
214  if (res)
215  return(1);
216  mem = safemalloc(1024);
217  /* Create FAT volume on the logical drive 0. 2nd argument is ignored. */
218  res = f_mkfs("0:", FM_FAT32, 0, mem, 1024);
219  safefree(mem);
220  put_rc(res);
221  return(1);
222  }
223 
224 #if _FS_RPATH
225 #if _FS_RPATH >= 2
226  if (MATCHARGS(ptr,"pwd", (ind + 0), argc))
227  {
228  fatfs_pwd();
229  return(1);
230  }
231 #endif // #if _FS_RPATH >= 2
232 #endif // #if _FS_RPATH
233 
234 
235  if (MATCHARGS(ptr,"rename", (ind + 2), argc))
236  {
237  fatfs_rename(argv[ind],argv[ind+1]);
238  return(1);
239  }
240 
241  if (MATCHARGS(ptr,"rmdir", (ind + 1), argc))
242  {
243  fatfs_rmdir(argv[ind]);
244  return(1);
245  }
246 
247  if (MATCHARGS(ptr,"rm", (ind + 1), argc))
248  {
249  fatfs_rm(argv[ind]);
250  return(1);
251  }
252 
253  if (MATCHARGS(ptr,"stat", (ind + 1), argc))
254  {
255  fatfs_stat(argv[ind]);
256  return(1);
257  }
258 #endif
259 
260  return(0);
261 }
262 
263 
270 MEMSPACE
271 void mmc_test(void)
272 {
273  printf("==============================\n");
274  printf("START MMC TEST\n");
275  fatfs_status("/");
276  printf("MMC Directory List\n");
277  fatfs_ls("/");
278 
279 #ifdef FATFS_UTILS_FULL
280 #if _FS_RPATH
281  fatfs_cd("/");
282 #endif
283  fatfs_create("test.txt","this is a test");
284  fatfs_cat("test.txt");
285  fatfs_ls("/");
286  fatfs_create("test.txt","this is a test");
287  fatfs_cat("test.txt");
288  fatfs_copy("test.txt","test2.txt");
289  fatfs_cat("test2.txt");
290 #if _FS_RPATH
291  fatfs_mkdir("/tmp");
292  fatfs_copy("test.txt","tmp/test3.txt");
293  fatfs_cat("tmp/test3.txt");
294  fatfs_cd("/tmp");
295  fatfs_pwd();
296  fatfs_cat("test3.txt");
297  fatfs_ls("");
298 #endif
299 #endif
300 
301  printf("END MMC TEST\n");
302  printf("==============================\n");
303 }
304 
312 MEMSPACE
313 void fatfs_ls(char *name)
314 {
315  long p1;
316  UINT s1, s2;
317  int res;
318  FILINFO fno;
319  DIR dirs; /* Directory object */
320  FATFS *fs;
321  char buff[256];
322 
323  if(!name || !*name)
324  {
325  strcpy(buff,".");
326  }
327  else
328  {
329  strcpy(buff,name);
330  }
331  printf("Listing:[%s]\n",buff);
332 
333  res = f_opendir(&dirs, buff);
334  if (res) { put_rc(res); return; }
335  p1 = s1 = s2 = 0;
336  while(1)
337  {
338  res = f_readdir(&dirs, &fno);
339  if ((res != FR_OK) || !fno.fname[0]) break;
340  if (fno.fattrib & AM_DIR)
341  {
342  s2++;
343  }
344  else
345  {
346  s1++; p1 += fno.fsize;
347  }
348  fatfs_filinfo_list(&fno);
349 #ifdef ESP8266
350  optimistic_yield(1000);
351  wdt_reset();
352 #endif
353  }
354  printf("%4u File(s),%10lu bytes total\n%4u Dir(s)", s1, p1, s2);
355  if (f_getfree(buff, (DWORD*)&p1, &fs) == FR_OK)
356  printf(", %10luK bytes free\n", p1 * fs->csize / 2);
357 }
358 
359 
360 
361 #ifdef FATFS_UTILS_FULL
362 MEMSPACE
370 void fatfs_cat(char *name)
371 {
372  UINT s1;
373  FIL fp;
374  int res;
375  int i;
376  int ret;
377  long size;
378  char *ptr;
379 
380  printf("Reading[%s]\n", name);
381  res = f_open(&fp, name, FA_OPEN_EXISTING | FA_READ);
382  if (res)
383  {
384  printf("cat error\n");
385  put_rc(res);
386  f_close(&fp);
387  }
388 
389  ptr = safecalloc(512,1);
390  if(!ptr)
391  {
392  printf("Calloc failed!\n");
393  f_close(&fp);
394  }
395 
396  size = 0;
397  while(1)
398  {
400  res = f_read(&fp, ptr, 512, &s1);
401  if(res)
402  {
403  printf("cat read error\n");
404  put_rc(res);
405  break;
406  }
407  ret = s1;
408  if (!s1)
409  {
410  break;
411  }
412  size += ret;
413  for(i=0;i<ret;++i)
414  {
415  //FIXME putchar depends on fdevopen having been called
416  if(stdout)
417  putchar(ptr[i]);
418  else
419  uart_putc(0,ptr[i]);
420  }
421 #ifdef ESP8266
422  optimistic_yield(1000);
423  wdt_reset();
424 #endif
425  }
426  printf("\n");
427  f_close(&fp);
428  safefree(ptr);
429  printf("%lu bytes\n", size);
430 }
431 
432 
441 
442 MEMSPACE
443 void fatfs_copy(char *from,char *to)
444 {
445  UINT s1, s2;
446  FIL file1,file2;
447  int res;
448  long size;
449  char *ptr;
450 #ifdef ESP8266
451 #define MSIZE 4096
452 #else
453 #define MSIZE 512
454 #endif
455  printf("Opening %s\n", from);
456  res = f_open(&file1, from, FA_OPEN_EXISTING | FA_READ);
457  if (res)
458  {
459  put_rc(res);
460  return;
461  }
462  printf("Creating %s\n", to);
463  res = f_open(&file2, to, FA_CREATE_ALWAYS | FA_WRITE);
464  if (res)
465  {
466  put_rc(res);
467  f_close(&file1);
468  return;
469  }
470  ptr = safecalloc(MSIZE,1);
471  if(!ptr)
472  {
473  printf("Calloc failed!\n");
474  f_close(&file1);
475  f_close(&file2);
476  return;
477  }
478  printf("\nCopying...\n");
479  size = 0;
480  for (;;)
481  {
482  res = f_read(&file1, ptr, MSIZE, &s1);
483  if (res || s1 == 0) break; /* error or eof */
484  res = f_write(&file2, ptr, s1, &s2);
485  size += s2;
486  printf("Copied: %08ld\r", size);
487  if (res || s2 < s1) break; /* error or disk full */
488  }
489  if (res)
490  put_rc(res);
491  printf("%lu bytes copied.\n", size);
492  safefree(ptr);
493  f_close(&file1);
494  f_close(&file2);
495 }
496 
505 MEMSPACE
506 void fatfs_create(char *name, char *str)
507 {
508  UINT s1;
509  UINT len;
510  int res;
511  FIL fp;
512  printf("Creating [%s]\n", name);
513  printf("Text[%s]\n", str);
514  res = f_open(&fp, name, FA_CREATE_ALWAYS | FA_WRITE);
515  if (res)
516  {
517  printf("Create error\n");
518  put_rc(res);
519  f_close(&fp);
520  return;
521  }
522 
523  len = strlen(str);
524  res = f_write(&fp, str, (UINT)len, &s1);
525 
526  if (res)
527  {
528  printf("Write error\n");
529  put_rc(res);
530  return;
531  }
532  if (len != s1)
533  {
534  printf("Write error - wanted(%d) got(%d)\n",s1,len);
535  put_rc(res);
536  return;
537  }
538 
539  f_close(&fp);
540 }
541 
542 
543 #if _FS_RPATH >= 2
544 MEMSPACE
552 void fatfs_cd(char *name)
553 {
554  printf("cd [%s]\n", name);
555  put_rc(f_chdir(name));
556 }
557 #endif
558 
559 
560 
568 MEMSPACE
569 void fatfs_mkdir(char *name)
570 {
571  printf("mkdir [%s]\n", name);
572  put_rc(f_mkdir(name));
573 
574 }
575 
576 #if _FS_RPATH >= 2
577 MEMSPACE
583 void fatfs_pwd(void)
584 {
585  int res;
586  char str[128];
587  res = f_getcwd(str, sizeof(str)-2);
588  if (res)
589  put_rc(res);
590  else
591  printf("pwd [%s]\n", str);
592 }
593 #endif
594 
603 MEMSPACE
604 void fatfs_rename(const char *oldpath, const char *newpath)
605 {
606 /* Rename an object */
607  int rc;
608  rc = f_rename(oldpath, newpath);
609  if(rc)
610  {
611  put_rc(rc);
612  }
613 }
614 
622 
623 MEMSPACE
624 void fatfs_rm(char *name)
625 {
626  printf("rm [%s]\n", name);
627  put_rc(f_unlink(name));
628 }
629 
637 MEMSPACE
638 void fatfs_rmdir(char *name)
639 {
640  printf("rmdir [%s]\n", name);
641  put_rc(f_unlink(name));
642 }
643 
644 
652 
653 MEMSPACE
654 void fatfs_stat(char *name)
655 {
656  FILINFO info;
657  int res;
658 
659  printf("stat [%s]\n", name);
660  res = f_stat(name, &info);
661  if(res == FR_OK)
662  {
663  fatfs_filinfo_list(&info);
664  }
665  else
666  {
667  put_rc(res);
668  }
669 }
670 
671 #endif
672 
673 
MEMSPACE size_t WEAK_ATR strlen(const char *str)
String Length.
Definition: stringsup.c:146
MEMSPACE void fatfs_rm(char *name)
MEMSPACE FRESULT f_write(FIL *fp, const void *buff, UINT btw, UINT *bw)
Definition: ff.c:3607
MEMSPACE void fatfs_stat(char *name)
Master include file for project Includes all project includes and defines here.
MEMSPACE void fatfs_cat(char *name)
Common Linux/POSIX time functions.
Definition: ff.h:203
MEMSPACE FRESULT f_chmod(const TCHAR *path, BYTE attr, BYTE mask)
Definition: ff.c:4823
#define MATCH(a, b)
Definition: bdffontutil.h:39
Definition: ff.h:92
MEMSPACE FRESULT f_readdir(DIR *dp, FILINFO *fno)
Definition: ff.c:4260
static struct ip_info info
Definition: network.c:55
MEMSPACE FRESULT f_rename(const TCHAR *path_old, const TCHAR *path_new)
Definition: ff.c:4716
MEMSPACE FRESULT f_getfree(const TCHAR *path, DWORD *nclst, FATFS **fatfs)
Definition: ff.c:4387
MEMSPACE FRESULT f_read(FIL *fp, void *buff, UINT btr, UINT *br)
Definition: ff.c:3506
MEMSPACE FRESULT f_close(FIL *fp)
Definition: ff.c:3808
#define FA_WRITE
Definition: ff.h:331
MEMSPACE FRESULT f_open(FIL *fp, const TCHAR *path, BYTE mode)
Definition: ff.c:3304
#define FA_READ
Definition: ff.h:330
MEMSPACE void mmc_test(void)
Perform key FatFs diagnostics tests.
Definition: fatfs_tests.c:271
#define FA_CREATE_ALWAYS
Definition: ff.h:334
MEMSPACE FRESULT f_opendir(DIR *dp, const TCHAR *path)
Definition: ff.c:4155
MEMSPACE FRESULT f_mkdir(const TCHAR *path)
Definition: ff.c:4622
void optimistic_yield(uint32_t interval_us)
Definition: user_task.c:102
MEMSPACE void fatfs_status(char *ptr)
Compute space used, number of directories and files contained used by a drive.
Definition: fatfs_sup.c:268
MEMSPACE int fatfs_tests(int argc, char *argv[])
FatFs test parser.
Definition: fatfs_tests.c:101
Definition: ff.h:184
unsigned long DWORD
Definition: integer.h:31
int putchar(int c)
put a character to stdout See fdevopen() sets stream->put get for TTY devices
Definition: posix.c:351
MEMSPACE WEAK_ATR char * strcpy(char *dest, const char *src)
copy a string
Definition: stringsup.c:161
MEMSPACE void put_rc(int rc)
display FatFs return code as ascii string
Definition: fatfs_sup.c:145
MEMSPACE void fatfs_rename(const char *oldpath, const char *newpath)
#define FA_OPEN_EXISTING
Definition: ff.h:332
MEMSPACE void * safemalloc(size_t size)
Safe Malloc - Display Error message if Malloc fails.
Definition: system.c:146
MEMSPACE long atol(const char *str)
Convert ASCII string to number in base 10.
Definition: mathio.c:295
MEMSPACE int mmc_init(int verbose)
Initialize MMC and FatFs interface, display diagnostics.
Definition: mmc_hal.c:208
MEMSPACE int uart_putc(uint8 uart_no, char c)
Write a byte from a uart with NL to CR/NL conversion Note: This function waits/blocks util the write ...
Definition: uart.c:323
MEMSPACE void fatfs_cd(char *name)
Math IO functions, and verious conversion code with floating point support.
FSIZE_t fsize
Definition: ff.h:204
int ind
Definition: ili9341.c:373
TCHAR fname[_MAX_LFN+1]
Definition: ff.h:210
Various string and character functions.
MEMSPACE void fatfs_mkdir(char *name)
MEMSPACE void fatfs_filinfo_list(FILINFO *info)
Display FILINFO structure in a readable format.
Definition: fatfs_sup.c:335
MEMSPACE FRESULT f_unlink(const TCHAR *path)
Definition: ff.c:4526
#define stdout
Definition: posix.h:270
MEMSPACE void fatfs_ls(char *name)
Definition: fatfs_tests.c:313
MEMSPACE void fatfs_help(int full)
Display FatFs test diagnostics help menu.
Definition: fatfs_tests.c:46
BYTE fattrib
Definition: ff.h:207
#define MEMSPACE
Definition: cpu.h:25
unsigned int UINT
Definition: integer.h:19
#define FM_FAT32
Definition: ff.h:343
MEMSPACE void wdt_reset(void)
reset watchdog
Definition: system.c:190
MEMSPACE int printf(const char *format,...)
MEMSPACE int MATCHARGS(char *str, char *pat, int min, int argc)
Match two strings and compare argument index Display message if the number of arguments is too few...
Definition: stringsup.c:471
MEMSPACE void fatfs_pwd(void)
MEMSPACE void fatfs_copy(char *from, char *to)
MEMSPACE FRESULT f_stat(const TCHAR *path, FILINFO *fno)
Definition: ff.c:4351
Definition: ff.h:161
MEMSPACE FRESULT f_getcwd(TCHAR *buff, UINT len)
Definition: ff.c:3919
MEMSPACE void safefree(void *p)
Safe free - Only free a pointer if it is in malloc memory range. We want to try to catch frees of sta...
Definition: system.c:165
Definition: ff.h:221
unsigned char uint8_t
Definition: send.c:17
MEMSPACE FRESULT f_chdir(const TCHAR *path)
Definition: ff.c:3866
MEMSPACE void fatfs_rmdir(char *name)
#define AM_DIR
Definition: ff.h:358
MEMSPACE FRESULT f_mount(FATFS *fs, const TCHAR *path, BYTE opt)
Definition: ff.c:3255
MEMSPACE void * safecalloc(size_t nmemb, size_t size)
Safe Calloc - Display Error message if Calloc fails.
Definition: system.c:128
MEMSPACE void fatfs_create(char *name, char *str)
MEMSPACE FRESULT f_mkfs(const TCHAR *path, BYTE opt, DWORD au, void *work, UINT len)
Definition: ff.c:5296
WORD csize
Definition: ff.h:100