fix: 滑动切换图片时自动跳过解码失败的无效图片
1、update_ui_ImgBle 返回类型 void → bool,解码成功返回 true,失败返回 false; 2、左滑/右滑手势回调添加 for 循环,解码失败自动跳到下一张(最多尝试 10 张防死循环); Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
ba9f5b9aeb
commit
304c7f928a
@ -915,15 +915,15 @@ void pages_cleanup_gif(void) {
|
|||||||
#endif // LV_USE_GIF
|
#endif // LV_USE_GIF
|
||||||
|
|
||||||
// 更新ui_ImgBle控件的图片(支持 JPEG)
|
// 更新ui_ImgBle控件的图片(支持 JPEG)
|
||||||
void update_ui_ImgBle(const char *img_name) {
|
bool update_ui_ImgBle(const char *img_name) {
|
||||||
if(!img_name) {
|
if(!img_name) {
|
||||||
ESP_LOGE("IMG_UI", "图片名为空");
|
ESP_LOGE("IMG_UI", "图片名为空");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ui_ImgBle) {
|
if(!ui_ImgBle) {
|
||||||
ESP_LOGE("IMG_UI", "ui_ImgBle控件不存在");
|
ESP_LOGE("IMG_UI", "ui_ImgBle控件不存在");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t *ui_img_data = NULL;
|
static uint8_t *ui_img_data = NULL;
|
||||||
@ -937,7 +937,7 @@ void update_ui_ImgBle(const char *img_name) {
|
|||||||
struct stat file_stat;
|
struct stat file_stat;
|
||||||
if(stat(img_path, &file_stat) != 0) {
|
if(stat(img_path, &file_stat) != 0) {
|
||||||
ESP_LOGE("IMG_UI", "文件不存在: %s", img_path);
|
ESP_LOGE("IMG_UI", "文件不存在: %s", img_path);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
ESP_LOGI("IMG_UI", "文件大小: %ld 字节", file_stat.st_size);
|
ESP_LOGI("IMG_UI", "文件大小: %ld 字节", file_stat.st_size);
|
||||||
|
|
||||||
@ -961,13 +961,13 @@ void update_ui_ImgBle(const char *img_name) {
|
|||||||
FILE *gif_file = fopen(img_path, "rb");
|
FILE *gif_file = fopen(img_path, "rb");
|
||||||
if (!gif_file) {
|
if (!gif_file) {
|
||||||
ESP_LOGE("IMG_UI", "GIF文件打开失败: %s", img_path);
|
ESP_LOGE("IMG_UI", "GIF文件打开失败: %s", img_path);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
gif_psram_buf = heap_caps_malloc(file_stat.st_size, MALLOC_CAP_SPIRAM);
|
gif_psram_buf = heap_caps_malloc(file_stat.st_size, MALLOC_CAP_SPIRAM);
|
||||||
if (!gif_psram_buf) {
|
if (!gif_psram_buf) {
|
||||||
ESP_LOGE("IMG_UI", "PSRAM分配失败: %ld 字节", file_stat.st_size);
|
ESP_LOGE("IMG_UI", "PSRAM分配失败: %ld 字节", file_stat.st_size);
|
||||||
fclose(gif_file);
|
fclose(gif_file);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
fread(gif_psram_buf, 1, file_stat.st_size, gif_file);
|
fread(gif_psram_buf, 1, file_stat.st_size, gif_file);
|
||||||
fclose(gif_file);
|
fclose(gif_file);
|
||||||
@ -978,13 +978,14 @@ void update_ui_ImgBle(const char *img_name) {
|
|||||||
ESP_LOGE("IMG_UI", "gifdec 打开失败: %s", img_name);
|
ESP_LOGE("IMG_UI", "gifdec 打开失败: %s", img_name);
|
||||||
free(gif_psram_buf);
|
free(gif_psram_buf);
|
||||||
gif_psram_buf = NULL;
|
gif_psram_buf = NULL;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启动自定义 GIF 播放器(Palette LUT + 双缓冲流水线)
|
// 启动自定义 GIF 播放器(Palette LUT + 双缓冲流水线)
|
||||||
gif_player_start();
|
gif_player_start();
|
||||||
|
|
||||||
ESP_LOGI("IMG_UI", "GIF显示启动(优化): %s", img_name);
|
ESP_LOGI("IMG_UI", "GIF显示启动(优化): %s", img_name);
|
||||||
|
return true;
|
||||||
} else
|
} else
|
||||||
#endif // LV_USE_GIF
|
#endif // LV_USE_GIF
|
||||||
{
|
{
|
||||||
@ -1017,7 +1018,7 @@ void update_ui_ImgBle(const char *img_name) {
|
|||||||
|
|
||||||
if(ui_img_data == NULL) {
|
if(ui_img_data == NULL) {
|
||||||
ESP_LOGE("IMG_UI", "解码数据为空");
|
ESP_LOGE("IMG_UI", "解码数据为空");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 配置图片数据
|
// 配置图片数据
|
||||||
@ -1034,9 +1035,12 @@ void update_ui_ImgBle(const char *img_name) {
|
|||||||
lvgl_port_unlock();
|
lvgl_port_unlock();
|
||||||
|
|
||||||
ESP_LOGI("IMG_UI", "JPEG图片更新成功: %s", img_name);
|
ESP_LOGI("IMG_UI", "JPEG图片更新成功: %s", img_name);
|
||||||
|
return true;
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGE("IMG_UI", "图片解码失败,错误码: %d", ret);
|
ESP_LOGE("IMG_UI", "图片解码失败,错误码: %d", ret);
|
||||||
ui_img_data = NULL;
|
ui_img_data = NULL;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@ void free_spiffs_image_list(void); // 重置图片列表
|
|||||||
bool set_image_index_by_name(const char *name); // 根据文件名设置当前图片索引
|
bool set_image_index_by_name(const char *name); // 根据文件名设置当前图片索引
|
||||||
const char* get_next_image(void); // 获取下一张图片
|
const char* get_next_image(void); // 获取下一张图片
|
||||||
const char* get_prev_image(void); // 获取上一张图片
|
const char* get_prev_image(void); // 获取上一张图片
|
||||||
void update_ui_ImgBle(const char *img_name); // 更新ui_ImgBle控件的图片
|
bool update_ui_ImgBle(const char *img_name); // 更新ui_ImgBle控件的图片,成功返回true
|
||||||
void ble_image_navigate(const char *filename); // BLE接收后导航到ScreenImg显示
|
void ble_image_navigate(const char *filename); // BLE接收后导航到ScreenImg显示
|
||||||
void ble_image_navigate_with_data(const char *filename, uint8_t *data, size_t data_size); // BLE接收后直通显示(跳过SPIFFS重读)
|
void ble_image_navigate_with_data(const char *filename, uint8_t *data, size_t data_size); // BLE接收后直通显示(跳过SPIFFS重读)
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include "esp_log.h" // 用于日志输出
|
#include "esp_log.h" // 用于日志输出
|
||||||
|
|
||||||
extern void init_spiffs_image_list(void);
|
extern void init_spiffs_image_list(void);
|
||||||
extern void update_ui_ImgBle(const char *img_name);
|
extern bool update_ui_ImgBle(const char *img_name);
|
||||||
extern void free_spiffs_image_list(void);
|
extern void free_spiffs_image_list(void);
|
||||||
extern const char* get_next_image(void);
|
extern const char* get_next_image(void);
|
||||||
extern const char* get_prev_image(void);
|
extern const char* get_prev_image(void);
|
||||||
@ -124,16 +124,22 @@ lv_indev_wait_release(lv_indev_get_act());
|
|||||||
}
|
}
|
||||||
if ( event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_LEFT ) {
|
if ( event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_LEFT ) {
|
||||||
lv_indev_wait_release(lv_indev_get_act());
|
lv_indev_wait_release(lv_indev_get_act());
|
||||||
const char *next_img = get_next_image();
|
// 解码失败时自动跳过,最多尝试全部图片避免死循环
|
||||||
if(next_img) {
|
for(int try = 0; try < 10; try++) {
|
||||||
update_ui_ImgBle(next_img);
|
const char *next_img = get_next_image();
|
||||||
|
if(!next_img) break;
|
||||||
|
if(update_ui_ImgBle(next_img)) break;
|
||||||
|
ESP_LOGW("ScreenImg", "跳过无效图片,继续下一张");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_RIGHT ) {
|
if ( event_code == LV_EVENT_GESTURE && lv_indev_get_gesture_dir(lv_indev_get_act()) == LV_DIR_RIGHT ) {
|
||||||
lv_indev_wait_release(lv_indev_get_act());
|
lv_indev_wait_release(lv_indev_get_act());
|
||||||
const char *prev_img = get_prev_image();
|
// 解码失败时自动跳过,最多尝试全部图片避免死循环
|
||||||
if(prev_img) {
|
for(int try = 0; try < 10; try++) {
|
||||||
update_ui_ImgBle(prev_img);
|
const char *prev_img = get_prev_image();
|
||||||
|
if(!prev_img) break;
|
||||||
|
if(update_ui_ImgBle(prev_img)) break;
|
||||||
|
ESP_LOGW("ScreenImg", "跳过无效图片,继续上一张");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,7 +21,7 @@ extern lv_obj_t *ui_ImageDel;
|
|||||||
extern lv_obj_t *ui_ImageReturn;
|
extern lv_obj_t *ui_ImageReturn;
|
||||||
|
|
||||||
extern void init_spiffs_image_list(void);
|
extern void init_spiffs_image_list(void);
|
||||||
extern void update_ui_ImgBle(const char *img_name);
|
extern bool update_ui_ImgBle(const char *img_name);
|
||||||
extern void free_spiffs_image_list(void);
|
extern void free_spiffs_image_list(void);
|
||||||
extern const char* get_next_image(void);
|
extern const char* get_next_image(void);
|
||||||
extern const char* get_prev_image(void);
|
extern const char* get_prev_image(void);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user