123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include "lv_omega_fs.h"
- /**
- * Open a file from the PC
- * @param file_p pointer to a FILE* variable
- * @param fn absolute path to the file
- // * @param fn name of the file.
- * @param mode element of 'fs_mode_t' enum or its 'OR' connection (e.g. FS_MODE_WR | FS_MODE_RD)
- * @return LV_FS_RES_OK: no error, the file is opened
- * any error from lv_fs_res_t enum
- */
- /*static*/ lv_fs_res_t pcfs_open (void * file_p, const char * fn, lv_fs_mode_t mode)
- {
- errno = 0;
- const char * flags = "";
- if(mode == LV_FS_MODE_WR) flags = "wb";
- else if(mode == LV_FS_MODE_RD) flags = "rb";
- else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "a+";
- char buf[256];
- // onion.io: set the path to the file based on whether the file is an absolute or relative path
- if (fn[0] == '/') {
- sprintf(buf, "%s", fn);
- }
- else {
- /*Make the path relative to the current directory (the projects root folder)*/
- sprintf(buf, "./%s", fn);
- }
- pc_file_t f = fopen(buf, flags);
- // pc_file_t f = fopen(fn, flags);
- if((long int)f <= 0) {
- // onion.io: tmp debug
- printf("pcfs_open: cannot open file '%s'\n", buf);
- return LV_FS_RES_UNKNOWN;
- }
- else {
- fseek(f, 0, SEEK_SET);
- /* 'file_p' is pointer to a file descriptor and
- * we need to store our file descriptor here*/
- pc_file_t *fp = file_p; /*Just avoid the confusing casings*/
- *fp = f;
- }
- return LV_FS_RES_OK;
- }
- /**
- * Close an opened file
- * @param file_p pointer to a FILE* variable. (opened with lv_ufs_open)
- * @return LV_FS_RES_OK: no error, the file is read
- * any error from lv__fs_res_t enum
- */
- /*static*/ lv_fs_res_t pcfs_close (void * file_p)
- {
- pc_file_t *fp = file_p; /*Just avoid the confusing casings*/
- fclose(*fp);
- return LV_FS_RES_OK;
- }
- /**
- * Read data from an opened file
- * @param file_p pointer to a FILE variable.
- * @param buf pointer to a memory block where to store the read data
- * @param btr number of Bytes To Read
- * @param br the real number of read bytes (Byte Read)
- * @return LV_FS_RES_OK: no error, the file is read
- * any error from lv__fs_res_t enum
- */
- /*static*/ lv_fs_res_t pcfs_read (void * file_p, void * buf, uint32_t btr, uint32_t * br)
- {
- pc_file_t *fp = file_p; /*Just avoid the confusing casings*/
- *br = fread(buf, 1, btr, *fp);
- return LV_FS_RES_OK;
- }
- /**
- * Set the read write pointer. Also expand the file size if necessary.
- * @param file_p pointer to a FILE* variable. (opened with lv_ufs_open )
- * @param pos the new position of read write pointer
- * @return LV_FS_RES_OK: no error, the file is read
- * any error from lv__fs_res_t enum
- */
- /*static*/ lv_fs_res_t pcfs_seek (void * file_p, uint32_t pos)
- {
- pc_file_t *fp = file_p; /*Just avoid the confusing casings*/
- fseek(*fp, pos, SEEK_SET);
- return LV_FS_RES_OK;
- }
- /**
- * Give the position of the read write pointer
- * @param file_p pointer to a FILE* variable.
- * @param pos_p pointer to to store the result
- * @return LV_FS_RES_OK: no error, the file is read
- * any error from lv__fs_res_t enum
- */
- /*static*/ lv_fs_res_t pcfs_tell (void * file_p, uint32_t * pos_p)
- {
- pc_file_t *fp = file_p; /*Just avoid the confusing casings*/
- *pos_p = ftell(*fp);
- return LV_FS_RES_OK;
- }
|