Lvgl sd卡文件查看器的代码

时间: 2024-01-22 09:02:17 浏览: 38
以下是基于LVGL的SD卡文件查看器的代码示例: ```c #include "lvgl/lvgl.h" #include "lvgl_helpers.h" #include "ff.h" #include <stdio.h> #include <string.h> #define MAX_PATH_LEN 128 #define MAX_FILE_NAME_LEN 32 #define MAX_FILE_SIZE 1024 /* UI elements */ static lv_obj_t *file_list; static lv_obj_t *file_name_label; static lv_obj_t *file_content_label; /* File system */ static FATFS fs; static DIR dir; static FILINFO fno; static FIL file; /* Buffers */ static char path_buf[MAX_PATH_LEN]; static char file_name_buf[MAX_FILE_NAME_LEN]; static char file_content_buf[MAX_FILE_SIZE]; /* Current state */ static char current_dir[MAX_PATH_LEN]; static char current_file[MAX_FILE_NAME_LEN]; /* List of supported file extensions */ static const char *supported_extensions[] = {".txt", ".log", ".cfg", NULL}; /* Forward declaration of functions */ static void list_files(const char *path); /* Callback for file list */ static lv_res_t file_list_cb(lv_obj_t *list, const char *txt) { lv_obj_set_hidden(file_content_label, true); if (txt[0] == '/') { /* Open new directory */ if (f_opendir(&dir, txt) != FR_OK) { lv_label_set_text(file_name_label, "[Error]"); return LV_RES_OK; } strcpy(current_dir, txt); list_files(current_dir); } else { /* Open file */ snprintf(path_buf, sizeof(path_buf), "%s/%s", current_dir, txt); if (f_open(&file, path_buf, FA_READ) != FR_OK) { lv_label_set_text(file_name_label, "[Error]"); return LV_RES_OK; } strcpy(current_file, txt); /* Read file content */ UINT bytes_read = 0; f_read(&file, file_content_buf, sizeof(file_content_buf), &bytes_read); file_content_buf[bytes_read] = '\0'; /* Set UI elements */ lv_label_set_text(file_name_label, current_file); lv_label_set_text(file_content_label, file_content_buf); lv_obj_set_hidden(file_content_label, false); } return LV_RES_OK; } /* List files in directory */ static void list_files(const char *path) { lv_obj_clean(file_list); /* Add parent directory */ if (strcmp(path, "/") != 0) { lv_obj_t *parent = lv_list_add(file_list, LV_SYMBOL_DIRECTORY, ".."); lv_obj_set_event_cb(parent, file_list_cb); } /* Open directory */ if (f_opendir(&dir, path) != FR_OK) { lv_label_set_text(file_name_label, "[Error]"); return; } /* Iterate over directory entries */ while (f_readdir(&dir, &fno) == FR_OK && fno.fname[0] != 0) { if (fno.fattrib & AM_DIR) { /* Add directory */ lv_obj_t *dir_obj = lv_list_add(file_list, LV_SYMBOL_DIRECTORY, fno.fname); snprintf(path_buf, sizeof(path_buf), "%s/%s", path, fno.fname); lv_obj_set_event_cb(dir_obj, file_list_cb); } else { /* Check if file extension is supported */ const char *ext = strrchr(fno.fname, '.'); if (ext != NULL && strcasecmp(ext, ".txt") == 0) { /* Add file */ lv_obj_t *file_obj = lv_list_add(file_list, LV_SYMBOL_FILE, fno.fname); lv_obj_set_event_cb(file_obj, file_list_cb); } } } f_closedir(&dir); } /* Initialize UI */ static void init_ui(lv_obj_t *parent) { /* Create file list */ file_list = lv_list_create(parent, NULL); lv_obj_set_size(file_list, LV_HOR_RES - 20, LV_VER_RES - 100); lv_obj_align(file_list, NULL, LV_ALIGN_IN_TOP_LEFT, 10, 10); /* Create file name label */ file_name_label = lv_label_create(parent, NULL); lv_label_set_text(file_name_label, ""); lv_obj_align(file_name_label, file_list, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); /* Create file content label */ file_content_label = lv_label_create(parent, NULL); lv_label_set_text(file_content_label, ""); lv_obj_set_size(file_content_label, LV_HOR_RES - 20, LV_VER_RES - 100); lv_obj_align(file_content_label, file_list, LV_ALIGN_IN_TOP_LEFT, 10, 10); lv_obj_set_hidden(file_content_label, true); } /* Initialize file system */ static void init_fs() { f_mount(&fs, "", 0); list_files("/"); } int main(int argc, char **argv) { /* Initialize LVGL */ lv_init(); /* Initialize display */ lvgl_driver_init(); /* Create main screen */ lv_obj_t *scr = lv_obj_create(NULL, NULL); lv_scr_load(scr); /* Initialize UI */ init_ui(scr); /* Initialize file system */ init_fs(); /* Event loop */ while (1) { lv_task_handler(); SDL_Delay(5); } return 0; } ``` 这是一个简单的SD卡文件查看器,它使用LVGL作为UI库,FatFs作为文件系统库。该程序支持打开.txt、.log、.cfg等文件类型。在UI上,它使用了一个列表来显示当前目录的文件和子目录,选择文件后会在UI上显示文件名和内容。

相关推荐

最新推荐

recommend-type

在 Visual Studio 中查看反汇编代码

主要介绍了在 Visual Studio 中查看反汇编代码的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

linux使用lsof命令查看文件打开情况

主要给大家介绍了关于在linux中利用lsof命令如何查看文件打开情况的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

详解linux less命令查看大文件

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。本文主要给大家介绍linux less命令查看大文件的相关知识,感兴趣的朋友一起看看吧
recommend-type

Android开发之简单文件管理器实现方法

主要介绍了Android开发之简单文件管理器实现方法,简单实现了Android的文件目录查看,文件重命名,打开,删除等功能,需要的朋友可以参考下
recommend-type

vue生成文件本地打开查看效果的实例

今天小编就为大家分享一篇vue生成文件本地打开查看效果的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。