diff options
Diffstat (limited to 'src/libs/lvgl/src/lv_misc/lv_fs.c')
-rw-r--r-- | src/libs/lvgl/src/lv_misc/lv_fs.c | 642 |
1 files changed, 0 insertions, 642 deletions
diff --git a/src/libs/lvgl/src/lv_misc/lv_fs.c b/src/libs/lvgl/src/lv_misc/lv_fs.c deleted file mode 100644 index a23081ce..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_fs.c +++ /dev/null @@ -1,642 +0,0 @@ -/** - * @file lv_fs.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_fs.h" -#if LV_USE_FILESYSTEM - -#include "../lv_core/lv_debug.h" -#include "lv_ll.h" -#include <string.h> -#include "lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ - -/* "free" is used as a function pointer (in lv_fs_drv_t). - * We must make sure "free" was not defined to a platform specific - * free function, otherwise compilation would fail. - */ -#ifdef free -#undef free -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static const char * lv_fs_get_real_path(const char * path); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the File system interface - */ -void lv_fs_init(void) -{ - lv_ll_init(&LV_GC_ROOT(_lv_drv_ll), sizeof(lv_fs_drv_t)); -} - -/** - * Test if a drive is rady or not. If the `ready` function was not initialized `true` will be - * returned. - * @param letter letter of the drive - * @return true: drive is ready; false: drive is not ready - */ -bool lv_fs_is_ready(char letter) -{ - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(drv == NULL) return false; /*An unknown driver in not ready*/ - - if(drv->ready_cb == NULL) return true; /*Assume the driver is always ready if no handler provided*/ - - return drv->ready_cb(drv); -} - -/** - * Open a file - * @param file_p pointer to a lv_fs_file_t variable - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode) -{ - file_p->drv = NULL; - file_p->file_d = NULL; - - if(path == NULL) return LV_FS_RES_INV_PARAM; - - char letter = path[0]; - - file_p->drv = lv_fs_get_drv(letter); - - if(file_p->drv == NULL) { - file_p->file_d = NULL; - return LV_FS_RES_NOT_EX; - } - - if(file_p->drv->ready_cb != NULL) { - if(file_p->drv->ready_cb(file_p->drv) == false) { - file_p->drv = NULL; - file_p->file_d = NULL; - return LV_FS_RES_HW_ERR; - } - } - - file_p->file_d = lv_mem_alloc(file_p->drv->file_size); - LV_ASSERT_MEM(file_p->file_d); - if(file_p->file_d == NULL) { - file_p->drv = NULL; - return LV_FS_RES_OUT_OF_MEM; /* Out of memory */ - } - - if(file_p->drv->open_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - const char * real_path = lv_fs_get_real_path(path); - lv_fs_res_t res = file_p->drv->open_cb(file_p->drv, file_p->file_d, real_path, mode); - - if(res != LV_FS_RES_OK) { - lv_mem_free(file_p->file_d); - file_p->file_d = NULL; - file_p->drv = NULL; - } - - return res; -} - -/** - * Close an already opened file - * @param file_p pointer to a lv_fs_file_t variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->close_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); - - lv_mem_free(file_p->file_d); /*Clean up*/ - file_p->file_d = NULL; - file_p->drv = NULL; - file_p->file_d = NULL; - - return res; -} - -/** - * Delete a file - * @param path path of the file to delete - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_remove(const char * path) -{ - if(path == NULL) return LV_FS_RES_INV_PARAM; - lv_fs_drv_t * drv = NULL; - - char letter = path[0]; - - drv = lv_fs_get_drv(letter); - if(drv == NULL) return LV_FS_RES_NOT_EX; - if(drv->ready_cb != NULL) { - if(drv->ready_cb(drv) == false) return LV_FS_RES_HW_ERR; - } - - if(drv->remove_cb == NULL) return LV_FS_RES_NOT_IMP; - - const char * real_path = lv_fs_get_real_path(path); - lv_fs_res_t res = drv->remove_cb(drv, real_path); - - return res; -} - -/** - * Read from a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer where the read bytes are stored - * @param btr Bytes To Read - * @param br the number of real read bytes (Bytes Read). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - if(br != NULL) *br = 0; - if(file_p->drv == NULL) return LV_FS_RES_INV_PARAM; - if(file_p->drv->read_cb == NULL) return LV_FS_RES_NOT_IMP; - - uint32_t br_tmp = 0; - lv_fs_res_t res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buf, btr, &br_tmp); - if(br != NULL) *br = br_tmp; - - return res; -} - -/** - * Write into a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btr Bytes To Write - * @param br the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - if(bw != NULL) *bw = 0; - - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->write_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - uint32_t bw_tmp = 0; - lv_fs_res_t res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, &bw_tmp); - if(bw != NULL) *bw = bw_tmp; - - return res; -} - -/** - * Set the position of the 'cursor' (read write pointer) in a file - * @param file_p pointer to a lv_fs_file_t variable - * @param pos the new position expressed in bytes index (0: start of file) - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->seek_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos); - - return res; -} - -/** - * Give the position of the read write pointer - * @param file_p pointer to a lv_fs_file_t variable - * @param pos_p pointer to store the position of the read write pointer - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos) -{ - if(file_p->drv == NULL) { - pos = 0; - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->tell_cb == NULL) { - pos = 0; - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, pos); - - return res; -} - -/** - * Truncate the file size to the current position of the read write pointer - * @param file_p pointer to an 'ufs_file_t' variable. (opened with lv_fs_open ) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_trunc(lv_fs_file_t * file_p) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->tell_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->trunc_cb(file_p->drv, file_p->file_d); - - return res; -} -/** - * Give the size of a file bytes - * @param file_p pointer to a lv_fs_file_t variable - * @param size pointer to a variable to store the size - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_size(lv_fs_file_t * file_p, uint32_t * size) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->size_cb == NULL) return LV_FS_RES_NOT_IMP; - - if(size == NULL) return LV_FS_RES_INV_PARAM; - - lv_fs_res_t res = file_p->drv->size_cb(file_p->drv, file_p->file_d, size); - - return res; -} - -/** - * Rename a file - * @param oldname path to the file - * @param newname path with the new name - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_rename(const char * oldname, const char * newname) -{ - if(!oldname || !newname) return LV_FS_RES_INV_PARAM; - - char letter = oldname[0]; - - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(!drv) { - return LV_FS_RES_NOT_EX; - } - - if(drv->ready_cb != NULL) { - if(drv->ready_cb(drv) == false) { - return LV_FS_RES_HW_ERR; - } - } - - if(drv->rename_cb == NULL) return LV_FS_RES_NOT_IMP; - - const char * old_real = lv_fs_get_real_path(oldname); - const char * new_real = lv_fs_get_real_path(newname); - - lv_fs_res_t res = drv->rename_cb(drv, old_real, new_real); - - return res; -} - -/** - * Initialize a 'fs_read_dir_t' variable for directory reading - * @param rddir_p pointer to a 'fs_read_dir_t' variable - * @param path path to a directory - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) -{ - if(path == NULL) return LV_FS_RES_INV_PARAM; - - char letter = path[0]; - - rddir_p->drv = lv_fs_get_drv(letter); - - if(rddir_p->drv == NULL) { - rddir_p->dir_d = NULL; - return LV_FS_RES_NOT_EX; - } - - rddir_p->dir_d = lv_mem_alloc(rddir_p->drv->rddir_size); - LV_ASSERT_MEM(rddir_p->dir_d); - if(rddir_p->dir_d == NULL) { - rddir_p->dir_d = NULL; - return LV_FS_RES_OUT_OF_MEM; /* Out of memory */ - } - - if(rddir_p->drv->dir_open_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - const char * real_path = lv_fs_get_real_path(path); - - lv_fs_res_t res = rddir_p->drv->dir_open_cb(rddir_p->drv, rddir_p->dir_d, real_path); - - return res; -} - -/** - * Read the next filename form a directory. - * The name of the directories will begin with '/' - * @param rddir_p pointer to an initialized 'fs_read_dir_t' variable - * @param fn pointer to a buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn) -{ - if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { - fn[0] = '\0'; - return LV_FS_RES_INV_PARAM; - } - - if(rddir_p->drv->dir_read_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn); - - return res; -} - -/** - * Close the directory reading - * @param rddir_p pointer to an initialized 'fs_read_dir_t' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) -{ - if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { - return LV_FS_RES_INV_PARAM; - } - - lv_fs_res_t res; - - if(rddir_p->drv->dir_close_cb == NULL) { - res = LV_FS_RES_NOT_IMP; - } else { - res = rddir_p->drv->dir_close_cb(rddir_p->drv, rddir_p->dir_d); - } - - lv_mem_free(rddir_p->dir_d); /*Clean up*/ - rddir_p->dir_d = NULL; - rddir_p->drv = NULL; - rddir_p->dir_d = NULL; - - return res; -} - -/** - * Get the free and total size of a driver in kB - * @param letter the driver letter - * @param total_p pointer to store the total size [kB] - * @param free_p pointer to store the free size_cb [kB] - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_free_space(char letter, uint32_t * total_p, uint32_t * free_p) -{ - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - lv_fs_res_t res; - - if(drv->free_space_cb == NULL) { - res = LV_FS_RES_NOT_IMP; - } else { - uint32_t total_tmp = 0; - uint32_t free_tmp = 0; - res = drv->free_space_cb(drv, &total_tmp, &free_tmp); - - if(total_p != NULL) *total_p = total_tmp; - if(free_p != NULL) *free_p = free_tmp; - } - - return res; -} - -/** - * Initialize a file system driver with default values. - * It is used to surly have known values in the fields ant not memory junk. - * After it you can set the fields. - * @param drv pointer to driver variable to initialize - */ -void lv_fs_drv_init(lv_fs_drv_t * drv) -{ - memset(drv, 0, sizeof(lv_fs_drv_t)); -} - -/** - * Add a new drive - * @param drv_p pointer to an lv_fs_drv_t structure which is inited with the - * corresponding function pointers. The data will be copied so the variable can be local. - */ -void lv_fs_drv_register(lv_fs_drv_t * drv_p) -{ - /*Save the new driver*/ - lv_fs_drv_t * new_drv; - new_drv = lv_ll_ins_head(&LV_GC_ROOT(_lv_drv_ll)); - LV_ASSERT_MEM(new_drv); - if(new_drv == NULL) return; - - memcpy(new_drv, drv_p, sizeof(lv_fs_drv_t)); -} - -/** - * Give a pointer to a driver from its letter - * @param letter the driver letter - * @return pointer to a driver or NULL if not found - */ -lv_fs_drv_t * lv_fs_get_drv(char letter) -{ - lv_fs_drv_t * drv; - - LV_LL_READ(LV_GC_ROOT(_lv_drv_ll), drv) - { - if(drv->letter == letter) { - return drv; - } - } - - return NULL; -} -/** - * Fill a buffer with the letters of existing drivers - * @param buf buffer to store the letters ('\0' added after the last letter) - * @return the buffer - */ -char * lv_fs_get_letters(char * buf) -{ - lv_fs_drv_t * drv; - uint8_t i = 0; - - LV_LL_READ(LV_GC_ROOT(_lv_drv_ll), drv) - { - buf[i] = drv->letter; - i++; - } - - buf[i] = '\0'; - - return buf; -} - -/** - * Return with the extension of the filename - * @param fn string with a filename - * @return pointer to the beginning extension or empty string if no extension - */ -const char * lv_fs_get_ext(const char * fn) -{ - size_t i; - for(i = strlen(fn); i > 0; i--) { - if(fn[i] == '.') { - return &fn[i + 1]; - } else if(fn[i] == '/' || fn[i] == '\\') { - return ""; /*No extension if a '\' or '/' found*/ - } - } - - return ""; /*Empty string if no '.' in the file name. */ -} - -/** - * Step up one level - * @param path pointer to a file name - * @return the truncated file name - */ -char * lv_fs_up(char * path) -{ - size_t len = strlen(path); - if(len == 0) return path; - - len--; /*Go before the trailing '\0'*/ - - /*Ignore trailing '/' or '\'*/ - while(path[len] == '/' || path[len] == '\\') { - path[len] = '\0'; - if(len > 0) - len--; - else - return path; - } - - size_t i; - for(i = len; i > 0; i--) { - if(path[i] == '/' || path[i] == '\\') break; - } - - if(i > 0) path[i] = '\0'; - - return path; -} - -/** - * Get the last element of a path (e.g. U:/folder/file -> file) - * @param path a character sting with the path to search in - * @return pointer to the beginning of the last element in the path - */ -const char * lv_fs_get_last(const char * path) -{ - size_t len = strlen(path); - if(len == 0) return path; - - len--; /*Go before the trailing '\0'*/ - - /*Ignore trailing '/' or '\'*/ - while(path[len] == '/' || path[len] == '\\') { - if(len > 0) - len--; - else - return path; - } - - size_t i; - for(i = len; i > 0; i--) { - if(path[i] == '/' || path[i] == '\\') break; - } - - /*No '/' or '\' in the path so return with path itself*/ - if(i == 0) return path; - - return &path[i + 1]; -} -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Leave the driver letters and / or \ letters from beginning of the path - * @param path path string (E.g. S:/folder/file.txt) - * @return pointer to the beginning of the real path (E.g. folder/file.txt) - */ -static const char * lv_fs_get_real_path(const char * path) -{ - /* Example path: "S:/folder/file.txt" - * Leave the letter and the : / \ characters*/ - - path++; /*Ignore the driver letter*/ - - while(*path != '\0') { - if(*path == ':' || *path == '\\' || *path == '/') { - path++; - } else { - break; - } - } - - return path; -} - -#endif /*LV_USE_FILESYSTEM*/ |