From f5df1d473951dfeff7e11fc66f4cc996771e939c Mon Sep 17 00:00:00 2001 From: Misaki Date: Tue, 26 Aug 2025 10:07:46 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=AE=8C=E6=88=90=E4=BA=86gif=E7=9A=84?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=B5=8B=E8=AF=95(=E4=BD=BF=E7=94=A8lvgl?= =?UTF-8?q?=E5=BD=93=E4=B8=AD=E7=9A=84gif=E8=A7=A3=E7=A0=81=E5=99=A8)?= =?UTF-8?q?=EF=BC=8C=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/Bionic_sphere.c | 3 +- main/CMakeLists.txt | 5 +- sdkconfig | 10 +- sdkconfig.old | 23 ++-- test/driver_test/drivers_test.c | 8 +- test/driver_test/drivers_test.h | 3 + test/gif_displat_test/gif_test.c | 178 +++++++++++++++++++++++++++++++ test/gif_displat_test/gif_test.h | 11 ++ 项目开发日志.md | 4 +- 9 files changed, 227 insertions(+), 18 deletions(-) create mode 100644 test/gif_displat_test/gif_test.c create mode 100644 test/gif_displat_test/gif_test.h diff --git a/main/Bionic_sphere.c b/main/Bionic_sphere.c index bd29a5e..b686970 100644 --- a/main/Bionic_sphere.c +++ b/main/Bionic_sphere.c @@ -25,8 +25,9 @@ void app_main(void) // audio_test(); - lcd_touch_lvgl_test(); + // lcd_touch_lvgl_test(); + gif_test(); ESP_GOTO(err); err: ESP_LOGI("app_main", "app_main error"); diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 2e34302..ee38ef7 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -2,6 +2,7 @@ idf_component_register(SRCS "Bionic_sphere.c" "../test/driver_test/drivers_test.c" # 测试用例 "../test/EXIO_Test/TCA9554PWR_Test.c" # 测试用例 "../test/audio_test/audio_test.c" # 测试用例 + "../test/gif_displat_test/gif_test.c" # 测试用例 "../Util/general_err_handle/err_handle.c" # 错误处理库 "../Lib/I2C_Driver/I2C_Driver.c" # IIC底层驱动库 "../Lib/QMI8658/QMI8658.c" # IMU驱动库 @@ -22,6 +23,7 @@ idf_component_register(SRCS "Bionic_sphere.c" "../test/driver_test" "../test/EXIO_Test" "../test/audio_test" + "../test/gif_displat_test" "../Util/general_err_handle" "../Lib/I2C_Driver" "../Lib/QMI8658" @@ -44,7 +46,8 @@ idf_component_register(SRCS "Bionic_sphere.c" esp_wifi nvs_flash esp_adc - fatfs unity esp_lcd + lvgl__lvgl + fatfs ) diff --git a/sdkconfig b/sdkconfig index 9536365..c883bd1 100644 --- a/sdkconfig +++ b/sdkconfig @@ -2484,9 +2484,8 @@ CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 # # Memory settings # -# CONFIG_LV_MEM_CUSTOM is not set -CONFIG_LV_MEM_SIZE_KILOBYTES=48 -CONFIG_LV_MEM_ADDR=0x0 +CONFIG_LV_MEM_CUSTOM=y +CONFIG_LV_MEM_CUSTOM_INCLUDE="stdlib.h" CONFIG_LV_MEM_BUF_MAX_NUM=16 # CONFIG_LV_MEMCPY_MEMSET_STD is not set # end of Memory settings @@ -2551,7 +2550,6 @@ CONFIG_LV_ASSERT_HANDLER_INCLUDE="assert.h" # Others # # CONFIG_LV_USE_PERF_MONITOR is not set -# CONFIG_LV_USE_MEM_MONITOR is not set # CONFIG_LV_USE_REFR_DEBUG is not set # CONFIG_LV_SPRINTF_CUSTOM is not set # CONFIG_LV_SPRINTF_USE_FLOAT is not set @@ -2729,8 +2727,8 @@ CONFIG_LV_USE_GRID=y # CONFIG_LV_USE_PNG is not set # CONFIG_LV_USE_BMP is not set # CONFIG_LV_USE_SJPG is not set -# CONFIG_LV_USE_GIF is not set -# CONFIG_LV_USE_QRCODE is not set +CONFIG_LV_USE_GIF=y +CONFIG_LV_USE_QRCODE=y # CONFIG_LV_USE_FREETYPE is not set # CONFIG_LV_USE_TINY_TTF is not set # CONFIG_LV_USE_RLOTTIE is not set diff --git a/sdkconfig.old b/sdkconfig.old index be82a8e..148dfc7 100644 --- a/sdkconfig.old +++ b/sdkconfig.old @@ -2475,7 +2475,7 @@ CONFIG_LV_COLOR_DEPTH_16=y # CONFIG_LV_COLOR_DEPTH_8 is not set # CONFIG_LV_COLOR_DEPTH_1 is not set CONFIG_LV_COLOR_DEPTH=16 -# CONFIG_LV_COLOR_16_SWAP is not set +CONFIG_LV_COLOR_16_SWAP=y # CONFIG_LV_COLOR_SCREEN_TRANSP is not set CONFIG_LV_COLOR_MIX_ROUND_OFS=128 CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 @@ -2485,7 +2485,7 @@ CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 # Memory settings # # CONFIG_LV_MEM_CUSTOM is not set -CONFIG_LV_MEM_SIZE_KILOBYTES=32 +CONFIG_LV_MEM_SIZE_KILOBYTES=128 CONFIG_LV_MEM_ADDR=0x0 CONFIG_LV_MEM_BUF_MAX_NUM=16 # CONFIG_LV_MEMCPY_MEMSET_STD is not set @@ -2729,8 +2729,8 @@ CONFIG_LV_USE_GRID=y # CONFIG_LV_USE_PNG is not set # CONFIG_LV_USE_BMP is not set # CONFIG_LV_USE_SJPG is not set -# CONFIG_LV_USE_GIF is not set -# CONFIG_LV_USE_QRCODE is not set +CONFIG_LV_USE_GIF=y +CONFIG_LV_USE_QRCODE=y # CONFIG_LV_USE_FREETYPE is not set # CONFIG_LV_USE_TINY_TTF is not set # CONFIG_LV_USE_RLOTTIE is not set @@ -2758,11 +2758,18 @@ CONFIG_LV_BUILD_EXAMPLES=y # # Demos # -# CONFIG_LV_USE_DEMO_WIDGETS is not set -# CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER is not set -# CONFIG_LV_USE_DEMO_BENCHMARK is not set +CONFIG_LV_USE_DEMO_WIDGETS=y +CONFIG_LV_DEMO_WIDGETS_SLIDESHOW=y +CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER=y +CONFIG_LV_USE_DEMO_BENCHMARK=y +# CONFIG_LV_DEMO_BENCHMARK_RGB565A8 is not set # CONFIG_LV_USE_DEMO_STRESS is not set -# CONFIG_LV_USE_DEMO_MUSIC is not set +CONFIG_LV_USE_DEMO_MUSIC=y +# CONFIG_LV_DEMO_MUSIC_SQUARE is not set +# CONFIG_LV_DEMO_MUSIC_LANDSCAPE is not set +# CONFIG_LV_DEMO_MUSIC_ROUND is not set +# CONFIG_LV_DEMO_MUSIC_LARGE is not set +# CONFIG_LV_DEMO_MUSIC_AUTO_PLAY is not set # end of Demos # end of LVGL configuration # end of Component config diff --git a/test/driver_test/drivers_test.c b/test/driver_test/drivers_test.c index ba40777..4c0bf75 100644 --- a/test/driver_test/drivers_test.c +++ b/test/driver_test/drivers_test.c @@ -205,7 +205,6 @@ void exio_text(void) #include "audio_test.h" - void audio_test(void) { run_audio_test(); @@ -243,4 +242,11 @@ void lcd_touch_lvgl_test(void) lv_timer_handler(); vTaskDelay(pdMS_TO_TICKS(10)); } +} + + +#include "gif_test.h" +void gif_test(void) +{ + gif_display_test(); } \ No newline at end of file diff --git a/test/driver_test/drivers_test.h b/test/driver_test/drivers_test.h index 50f377d..702ee6c 100644 --- a/test/driver_test/drivers_test.h +++ b/test/driver_test/drivers_test.h @@ -29,5 +29,8 @@ void audio_test(void); // LCD测试 void lcd_touch_lvgl_test(void); +// GIF测试 +void gif_test(void); + #endif //BIONIC_SPHERE_DRIVERS_TEST_H \ No newline at end of file diff --git a/test/gif_displat_test/gif_test.c b/test/gif_displat_test/gif_test.c new file mode 100644 index 0000000..c160228 --- /dev/null +++ b/test/gif_displat_test/gif_test.c @@ -0,0 +1,178 @@ +// +// Created by misaki on 2025/8/25. +// + + +#include "lvgl.h" +#include "SD_MMC.h" +#include "I2C_Driver.h" +#include "ST77916.h" + +#include +static const char *tTAG = "GIF_TEST"; + +/* 把 GIF 完整读进 RAM,返回 malloc 得到的指针;用完 free */ +static uint8_t *read_whole_file(const char *path, size_t *out_len) +{ + ESP_LOGI(tTAG, "开始读取文件: %s", path); + FILE *fp = Open_File(path); + if (!fp) { + ESP_LOGE(tTAG, "Open_File 失败"); + return NULL; + } + + fseek(fp, 0, SEEK_END); + *out_len = ftell(fp); + fseek(fp, 0, SEEK_SET); + ESP_LOGI(tTAG, "文件大小 %zu 字节", *out_len); + + uint8_t *buf = malloc(*out_len); + if (!buf) { + ESP_LOGE(tTAG, "malloc 失败,需要 %zu 字节", *out_len); + fclose(fp); + return NULL; + } + + size_t readed = fread(buf, 1, *out_len, fp); + fclose(fp); + if (readed != *out_len) { + ESP_LOGE(tTAG, "fread 只读了 %zu/%zu 字节", readed, *out_len); + free(buf); + return NULL; + } + + /* 打印文件头 8 字节,确认是 GIF */ + ESP_LOG_BUFFER_HEX_LEVEL(tTAG, buf, 8, ESP_LOG_INFO); + return buf; +} + +uint8_t * get_gif_data(const char *filename, size_t *gif_len) +{ + char full_path[64]; + snprintf(full_path, sizeof(full_path), "/sdcard/%s", filename); + + uint8_t *gif_data = read_whole_file(full_path, gif_len); + if (!gif_data) { + ESP_LOGE(tTAG, "读取 GIF 数据失败"); + return NULL; + } + + return gif_data; +} + +/* 显示 GIF 并返回对象句柄,便于后续调试 */ +static lv_obj_t *show_gif_from_sd(const char *filename) +{ + size_t gif_len = 0; + char full_path[64]; + snprintf(full_path, sizeof(full_path), "/sdcard/%s", filename); + + ESP_LOGI(tTAG, "准备显示 GIF: %s", full_path); + + uint8_t *gif_data = read_whole_file(full_path, &gif_len); + if (!gif_data) { + ESP_LOGE(tTAG, "读取 GIF 数据失败"); + return NULL; + } + + /* 确认 LVGL 版本支持内存指针 */ +#if LV_VERSION_CHECK(8, 1, 0) + lv_obj_t *gif = lv_gif_create(lv_scr_act()); + lv_gif_set_src(gif, gif_data); // 传内存指针 + ESP_LOGI(tTAG, "GIF 对象创建成功,指针 %p", gif); +#else + lv_obj_t *gif = NULL; + ESP_LOGE(tTAG, "LVGL 版本过低或 GIF 解码器未启用"); +#endif + + if (gif) { + lv_obj_center(gif); + ESP_LOGI(tTAG, "GIF 已显示"); + } else { + ESP_LOGE(tTAG, "GIF 对象创建失败"); + } + + /* 如内存紧张,可在这里 free(gif_data); + 但注意:循环播放时需要保持 data 有效 */ + return gif; +} + +void gif_macro_check(void) +{ + ESP_LOGI("GIF", "LV_USE_GIF=%d (必须是 1)", LV_USE_GIF); + ESP_LOGI("GIF", "LVGL_VERSION=%d.%d.%d", + LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH); +} +static bool get_gif_wh(const uint8_t *raw, uint32_t *w, uint32_t *h) +{ + if (memcmp(raw, "GIF", 3) != 0) /* 简单校验 */ + return false; + + *w = raw[6] | (raw[7] << 8); /* 小端转主机字节序 */ + *h = raw[8] | (raw[9] << 8); + + ESP_LOGI("GIF", "GIF size: %ldx%ld", *w, *h); + + return true; +} + +void red_gif_test(void) +{ + size_t gif_len = 0; + uint8_t *gif_data = get_gif_data("xwzy_m.gif", &gif_len); + + ESP_LOGI("GIF", "GIF 文件大小 %zu 字节", gif_len); + if (!gif_data) return; + + uint32_t w = 0, h = 0; + if (!get_gif_wh(gif_data, &w, &h)) { + ESP_LOGE("GIF", "非法 GIF 文件"); + free(gif_data); + return; + } + + lv_img_dsc_t gif_desc = { + .header.cf = LV_IMG_CF_RAW_CHROMA_KEYED, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = (lv_coord_t)w, + .header.h = (lv_coord_t)h, + .data_size = gif_len, + .data = gif_data, + }; + + gif_macro_check(); + lv_obj_t *gif = lv_gif_create(lv_scr_act()); + lv_gif_set_src(gif, &gif_desc); + lv_obj_center(gif); +} + + +/* 带有完整日志的主测试函数 */ +void gif_display_test(void) +{ + ESP_LOGI(tTAG, "======== GIF 显示测试开始 ========"); + + /* 1. 初始化 SD 卡 */ + ESP_LOGI(tTAG, "1. 初始化 SD 卡..."); + SD_Init(); // 你的挂载函数 + ESP_LOGI(tTAG, " SD 卡挂载完成"); + + + /* 2. 初始化硬件 */ + ESP_LOGI(tTAG, "2. 初始化硬件..."); + I2C_Init(); + LCD_Init(); + LVGL_Init(); + ESP_LOGI(tTAG, " 硬件初始化完成"); + + /* 3. 显示 GIF */ + ESP_LOGI(tTAG, "3. 开始显示 GIF..."); + + red_gif_test(); + /* 4. 主循环 */ + while (1) { + vTaskDelay(pdMS_TO_TICKS(10)); + lv_timer_handler(); + } +} \ No newline at end of file diff --git a/test/gif_displat_test/gif_test.h b/test/gif_displat_test/gif_test.h new file mode 100644 index 0000000..442845f --- /dev/null +++ b/test/gif_displat_test/gif_test.h @@ -0,0 +1,11 @@ +// +// Created by misaki on 2025/8/25. +// + +#ifndef BIONIC_SPHERE_GIF_TEST_H +#define BIONIC_SPHERE_GIF_TEST_H + + +void gif_display_test(void); + +#endif //BIONIC_SPHERE_GIF_TEST_H \ No newline at end of file diff --git a/项目开发日志.md b/项目开发日志.md index e839d20..9b9b437 100644 --- a/项目开发日志.md +++ b/项目开发日志.md @@ -151,4 +151,6 @@ 实际完成任务: - [x] 1. 测试了屏幕驱动,lvgl,触摸,驱动文件在Lib/Display当中。全部通过(修改了sdkconfig,以适配lvgl) -- [x] 2. 新增了优雅的C语言错误处理 \ No newline at end of file +- [x] 2. 新增了优雅的C语言错误处理 + +- [x] 3. 完成了gif的显示测试(使用lvgl当中的gif解码器),测试通过 \ No newline at end of file