image/svg+xml
Brteve's API for EveApps
Version 0.0.1
The reference document for common folder of EveApps project.
 
Loading...
Searching...
No Matches
FileIo.c
Go to the documentation of this file.
1
32// POSIX FatFs | App
33// "r" FA_READ | FILEIO_E_FOPEN_READ
34// "r+" FA_READ | FA_WRITE |
35// "w" FA_CREATE_ALWAYS | FA_WRITE | FILEIO_E_FOPEN_WRITE
36// "w+" FA_CREATE_ALWAYS | FA_WRITE | FA_READ |
37// "a" FA_OPEN_APPEND | FA_WRITE | FILEIO_E_FOPEN_APPEND
38// "a+" FA_OPEN_APPEND | FA_WRITE | FA_READ |
39// "wx" FA_CREATE_NEW | FA_WRITE |
40// "w+x" FA_CREATE_NEW | FA_WRITE | FA_READ |
41
42#include "stdio.h"
43#include "errno.h"
44
45#include "Platform.h"
46#include "FileIo.h"
47
48static long int curPos = 0;
49static long int filesz = 0;
50static int isFOpenning = 0;
51
52#if defined (FT900_PLATFORM) || defined (FT93X_PLATFORM) || defined (RP2040_PLATFORM)
53#include "ff.h"
54FIL fp;
55#else
56FILE *fp;
57#endif
58
59#if defined (FT900_PLATFORM) || defined (FT93X_PLATFORM) || defined (RP2040_PLATFORM)
60
67static FRESULT scan_files(char* path ) {
68 FRESULT res;
69 DIR dir;
70 unsigned int i;
71 static FILINFO fno;
72
73 res = f_opendir(&dir, path); /* Open the directory */
74 if (res == FR_OK) {
75 for (;;) {
76 res = f_readdir(&dir, &fno); /* Read a directory item */
77 if (res != FR_OK || fno.fname[0] == 0)
78 break; /* Break on error or end of dir */
79 if (fno.fattrib & AM_DIR) { /* It is a directory */
80 i = strlen(path);
81 sprintf(&path[i], "/%s", fno.fname);
82 res = scan_files(path); /* Enter the directory */
83 if (res != FR_OK)
84 break;
85 path[i] = 0;
86 } else { /* It is a file. */
87 printf("%s/%s\n", path, fno.fname);
88 }
89 }
90 f_closedir(&dir);
91 }else{
92 printf("Error on open %s, res = %d", path, res);
93 }
94
95 return res;
96}
97
103int FileIO_File_Close() {
104 if (isFOpenning) {
105 f_close(&fp);
106 memset(&fp, 0, sizeof(FIL));
107 curPos = 0;
108 filesz = 0;
109 isFOpenning = 0;
110 printf("Closed file\n");
111 }
112 return 1;
113}
120int FileIO_File_Seek(unsigned long offset) {
121 FRESULT fResult;
122 if (!isFOpenning) {
123 printf("File haven't openned\n");
124 return 0;
125 }
126 fResult = f_lseek(&fp, offset);
127
128 if (fResult != FR_OK) {
129 printf("Seek error, error: %d\n", fResult);
130 return 0;
131 }
132 return 1;
133}
134
140int FileIO_File_Tell() {
141 if (!isFOpenning) {
142 printf("File haven't openned\n");
143 return 0;
144 }
145 return f_tell (&fp);
146}
147
155int FileIO_File_Open(const char *filePath, enum _FILEIO_E_FOPEN e) {
156 FRESULT fResult;
157 BYTE mode;
158
159 switch (e) {
161 mode = FA_READ | FA_OPEN_EXISTING;
162 break;
164 mode = FA_CREATE_ALWAYS | FA_WRITE;
165 break;
167 mode = FA_WRITE;
168 break;
169 default:
170 printf("File open mode is not recognized\n");
171 return -1;
172 }
173 fResult = f_open(&fp, filePath, mode);
174 if (fResult != FR_OK) {
175 printf("Cannot open %s, please check SD card, error: %d\n", filePath,
176 fResult);
178 return -1;
179 }
180
181 filesz = f_size(&fp);
182
183 isFOpenning = 1;
184 curPos = 0;
185
186 if (mode == FILEIO_E_FOPEN_APPEND) {
188 }
189
190 printf("Opened file %s, file size: %d bytes\n", filePath, filesz);
191
192 return filesz;
193}
194
202int FileIO_File_Read(char* buffer, long bytes) {
203 unsigned int bytesread = 0;
204 unsigned int bytescount = 0;
205 unsigned int bytescounts = 0;
206 int chunk_size = 1024;
207 FRESULT fResult;
208
209 if (!isFOpenning) {
210 printf("File haven't opened\n");
211 return 0;
212 }
213 if (curPos >= filesz) { // reached EOF, close the file
214 printf("Reached EOF\n");
215 return 0;
216 }
217
218 while (bytescounts < bytes) {
219 chunk_size = bytes > chunk_size ? chunk_size : bytes;
220 bytesread = (filesz - curPos) > chunk_size ? chunk_size : (filesz - curPos);
221
222 fResult = f_read(&fp, &buffer[bytescounts], bytesread, &bytescount);
223 if (fResult != FR_OK) {
224 printf("Error on f_read\n");
225 return 0;
226 }
227 bytescounts += bytescount;
228
229 if (bytesread != bytescount) {
230 printf("Reached EOF, stop\n");
231 break;
232 }
233
234 curPos += bytescount;
235 if (curPos >= filesz) { // reached EOF, break and return bytescounts
236 printf("Reached EOF\n");
238 return bytescounts;
239 }
240 }
241
242 return bytescounts;
243}
244
252int FileIO_File_Write(const char* buffer, long buffersize) {
253 FRESULT fResult;
254
255 unsigned int written = 0;
256
257 if (!isFOpenning) {
258 printf("File haven't openned\n");
259 return 0;
260 }
261
262 fResult = f_write(&fp, buffer, buffersize, &written);
263
264 if (fResult != FR_OK) {
265 printf("Error on f_write\n");
266 return 0;
267 }
268 if (buffersize != written) {
269 printf("Writting error\n");
271 return 0;
272 }
273
274 return buffersize;
275}
276
283int FileIO_File_List(char* path) {
284 scan_files(path);
285 return 1;
286}
287
293char *FileIO_Read_Line(){
294 static char buffer[1000];
295
296 if(buffer == f_gets(buffer, 255, &fp)){ // When the function succeeded, buff will be returuned.
297 return buffer;
298 }else{
299 printf("Reached Eof\n");
301 return 0;
302 }
303}
304#elif defined (MSVC_PLATFORM) || defined (BT8XXEMU_PLATFORM)
305
311int FileIO_File_Close() {
312 if (isFOpenning) {
313 fclose(fp);
314 fp = NULL;
315 curPos = 0;
316 filesz = 0;
317 isFOpenning = 0;
318 }
319 return 0;
320}
321
328int FileIO_File_Seek(unsigned long offset) {
329 int ret = 0;
330
331 printf("Seeking to %ld\n", offset);
332
333 if (!isFOpenning) {
334 printf("File haven't openned\n");
335 return 0;
336 }
337
338 ret = fseek(fp, offset, SEEK_SET);
339
340 if (ret) {
341 printf("Seek to %lu error, error: %d\n", offset, ret);
342 return 0;
343 }
344 return 1;
345}
346
352int FileIO_File_Tell() {
353 if (!isFOpenning) {
354 printf("File haven't openned\n");
355 return 0;
356 }
357 return ftell (fp);
358}
359
368int FileIO_File_Open(const char *filePath, enum _FILEIO_E_FOPEN e){
369 char mode[3];
370 mode[1] = 'b';
371 mode[2] = 0;
372
374
375 switch (e) {
377 mode[0] = 'r';
378 break;
380 mode[0] = 'w';
381 break;
383 mode[0] = 'a';
384 break;
385 default:
386 printf("File open mode is not recognized\n");
387 return 0;
388 }
389
390#pragma warning(push)
391#pragma warning(disable : 4996)
392 fp = fopen(filePath, mode);
393#pragma warning(pop)
394 if (!fp) {
395 printf("Cannot open %s, please check SD card, error: %d\n", filePath, errno);
396 return 0;
397 }
398
399 fseek(fp, 0, SEEK_END);
400 filesz = ftell(fp);
401 fseek(fp, 0, SEEK_SET);
402 isFOpenning = 1;
403
404 printf("Opened %s, file size: %ld\n", filePath, filesz);
405
406 if (FILEIO_E_FOPEN_READ == e) {
407 return filesz;
408 }
409 else {
410 return 1;
411 }
412}
413
421int FileIO_File_Read(char* buffer, long size) {
422 const int chunkSize = 1024;
423 int blockSize = 0;
424 int byteRead = 0;
425 int offset = 0;
426
427 if (!fp || !isFOpenning) {
428 printf("File is not opening\n");
429 return 0;
430 }
431
432 if (curPos >= filesz) { // reached EOF, close the file
433 printf("Reached EOF\n");
434 return 0;
435 }
436
437 while (size > 0) {
438 blockSize = chunkSize > size ? size : chunkSize;
439
440 byteRead = (int)fread(&buffer[offset], 1, blockSize, fp);
441 curPos += byteRead;
442 offset += byteRead;
443 size -= byteRead;
444
445 if (!feof(fp) && blockSize != byteRead) {
446 printf("Error on f_read\n");
447 return 0;
448 }
449
451 if (feof(fp) || curPos >= filesz) {
452 return offset;
453 }
454 }
455 return offset;
456}
457
465int FileIO_File_Write(const char* buffer, long buffersize) {
466 int written = 0;
467
468 if (!isFOpenning) {
469 printf("File haven't openned\n");
470 return 0;
471 }
472
473 written = (int)fwrite(buffer, 1, buffersize, fp);
474
475 if (written != buffersize) {
476 printf("Writting error: written=%u, Expected=%ld, errno=%d\n", written, buffersize, errno);
478 return 0;
479 }
480
481 return written;
482}
483
484int FileIO_File_List(char* path) {
485 return 1;
486}
487
493char *FileIO_Read_Line(){
494 static char buffer[1000];
495
496 if(fgets(buffer, 255, fp)){
497 return buffer;
498 }else{
499 printf("Reached Eof\n");
501 return 0;
502 }
503}
504#else // defined (MSVC_PLATFORM) || defined (BT8XXEMU_PLATFORM)
505int FileIO_File_Close() { return 0; };
506int FileIO_File_Seek(unsigned long offset) { return 0; };
507int FileIO_File_Tell() { return 0; };
508int FileIO_File_Open(const char* filePath, enum _FILEIO_E_FOPEN e) { return 0; };
509int FileIO_File_Read(char* buffer, long bytes) { return 0; };
510int FileIO_File_Write(const char* buffer, long buffersize) { return 0; };
511int FileIO_File_List(char* path) { return 0; };
512char* FileIO_Read_Line() { return 0; };
513#endif // No platform supported
514
525int FileIO_File_To_Buffer(const char *file, char *buff, long offset, int size, int *byteCount) {
526 int fileSize = 0;
527 int numRead = 0;
528
529 fileSize = FileIO_File_Open(file, FILEIO_E_FOPEN_READ);
530 numRead = fileSize - offset;
531
532 if (offset >= fileSize) {
533 return 0;
534 }
535
536 if (0 >= fileSize) {
537 return 0;
538 }
539
540 if (size > 0 && size < numRead) {
541 numRead = size;
542 }
543
544 // seek file pointer to offset
545 FileIO_File_Seek(offset);
546
547 FileIO_File_Read(buff, numRead);
548
550
551 if (byteCount) {
552 *byteCount = numRead;
553 }
554
555 return 1;
556}
557
566void FileIO_Buffer_To_File(const char *txt, const char *buffer, unsigned long buffersize) {
567 if (-1 == FileIO_File_Open(txt, FILEIO_E_FOPEN_WRITE)) {
568 printf("Error open file\n");
569 return;
570 }
571 FileIO_File_Write(buffer, buffersize);
573}
574
static uint32_t e
Definition Common.c:40
static ft_uint32_t ft_uint8_t * buffer
Definition FT_Gpu_Hal.h:139
static long int filesz
Definition FileIo.c:49
void FileIO_Buffer_To_File(const char *txt, const char *buffer, unsigned long buffersize)
Write a buffer to file.
Definition FileIo.c:566
int FileIO_File_Read(char *buffer, long bytes)
Definition FileIo.c:509
int FileIO_File_List(char *path)
Definition FileIo.c:511
int FileIO_File_Seek(unsigned long offset)
Definition FileIo.c:506
int FileIO_File_Write(const char *buffer, long buffersize)
Definition FileIo.c:510
FILE * fp
Definition FileIo.c:56
int FileIO_File_Tell()
Definition FileIo.c:507
int FileIO_File_Open(const char *filePath, enum _FILEIO_E_FOPEN e)
Definition FileIo.c:508
int FileIO_File_Close()
Definition FileIo.c:505
static int isFOpenning
Definition FileIo.c:50
char * FileIO_Read_Line()
Definition FileIo.c:512
int FileIO_File_To_Buffer(const char *file, char *buff, long offset, int size, int *byteCount)
Read a whole file to a buffer.
Definition FileIo.c:525
static long int curPos
Definition FileIo.c:48
File read-write library for Eve application, support a unique interface for every platform.
_FILEIO_E_FOPEN
Definition FileIo.h:39
@ FILEIO_E_FOPEN_APPEND
Definition FileIo.h:40
@ FILEIO_E_FOPEN_READ
Definition FileIo.h:40
@ FILEIO_E_FOPEN_WRITE
Definition FileIo.h:40
TCHAR * f_gets(TCHAR *buff, int len, FIL *fp)
Definition ff.c:6338
FRESULT f_close(FIL *fp)
Definition ff.c:4152
FRESULT f_lseek(FIL *fp, FSIZE_t ofs)
Definition ff.c:4367
FRESULT f_readdir(DIR *dp, FILINFO *fno)
Definition ff.c:4627
FRESULT f_closedir(DIR *dp)
Definition ff.c:4597
FRESULT f_opendir(DIR *dp, const TCHAR *path)
Definition ff.c:4531
FRESULT f_read(FIL *fp, void *buff, UINT btr, UINT *br)
Definition ff.c:3850
FRESULT f_write(FIL *fp, const void *buff, UINT btw, UINT *bw)
Definition ff.c:3950
FRESULT f_open(FIL *fp, const TCHAR *path, BYTE mode)
Definition ff.c:3653
#define FA_OPEN_EXISTING
Definition ff.h:388
#define FA_READ
Definition ff.h:386
#define f_size(fp)
Definition ff.h:342
#define AM_DIR
Definition ff.h:414
FRESULT
Definition ff.h:276
@ FR_OK
Definition ff.h:277
unsigned char BYTE
Definition ff.h:59
#define f_tell(fp)
Definition ff.h:341
#define FA_WRITE
Definition ff.h:387
#define FA_CREATE_ALWAYS
Definition ff.h:390
Definition ff.h:228
Definition ff.h:205
Definition ff.h:247
BYTE fattrib
Definition ff.h:251
TCHAR fname[FF_LFN_BUF+1]
Definition ff.h:254