1. 完成了gif的显示测试(使用lvgl当中的gif解码器),测试通过
This commit is contained in:
@@ -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");
|
||||
|
||||
+4
-1
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
+15
-8
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 <esp_log.h>
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user