feat: 修复BLE蓝牙传图全链路问题 + 实现图片导航显示

1. BLE通信修复:
   - 补充服务UUID长度字段(ESP_UUID_LEN_16),修复APP端发现服务失败
   - 添加WRITE_NR属性,支持writeNoResponse提升传输速度
   - 文件写入改为二进制模式"wb",防止数据损坏
   - 添加数据完整性校验日志

2. JPEG解码修复:
   - 移除过严的FFD9结束标记校验(兼容Android JPEG编码器)

3. 图片导航功能(新增):
   - ble_image_navigate():BLE接收后自动导航到ScreenImg显示新图片
   - set_image_index_by_name():按文件名定位图片列表索引
   - 智能检测当前界面:不在ScreenImg则切换,已在则直接更新
   - 修复update_ui_ImgBle解码失败时double-free崩溃

4. ScreenImg界面优化:
   - 每次进入界面都显示当前图片,支持BLE导航和手势切换场景

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Rdzleo 2026-02-25 18:15:41 +08:00
parent 58fb9aab86
commit 811559be49
8 changed files with 74 additions and 328 deletions

3
.gitignore vendored
View File

@ -1,5 +1,8 @@
# 忽略根目录下的 build 文件夹(包括其所有子文件/子文件夹)
/build
# 忽略根目录下的uniapp_code文件夹这是APP端的业务
/uniapp_code
# 忽略 macOS 系统文件
.DS_Store

View File

@ -76,6 +76,7 @@ static esp_attr_control_t control_image_edit = {
// 图片传输服务
static esp_gatt_srvc_id_t server_id_image = {
.id.uuid.len = ESP_UUID_LEN_16,
.id.uuid.uuid.uuid16 = IMAGE_SERVICE_UUID,
.id.inst_id = IMAGE_SERVICE_INSTID,
.is_primary = true,
@ -216,7 +217,7 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
image_service_handle,
&image_write_uuid,
ESP_GATT_PERM_WRITE,
ESP_GATT_CHAR_PROP_BIT_WRITE,
ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_WRITE_NR,
&char_val_image_write,
&control_image_write
);
@ -224,7 +225,7 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
image_service_handle,
&image_edit_uuid,
ESP_GATT_PERM_WRITE,
ESP_GATT_CHAR_PROP_BIT_WRITE,
ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_WRITE_NR,
&char_val_image_edit,
&control_image_edit
);
@ -263,24 +264,27 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
img_data = malloc((int)firstMeg.len);
filepath = malloc(sizeof(char) * 33);
sprintf(filepath,"/spiflash/%s",firstMeg.filename);
file_img = fopen(filepath,"w");
file_img = fopen(filepath,"wb");
ESP_LOGI(CONN_TAG,"传输通道建立成功,数据指针:%p,文件名称:%s,文件大小:%d",img_data,firstMeg.filename,(int)firstMeg.len);
}
}else if(SendStatus.isSend){
ESP_LOGI(CONN_TAG, "获取到数据:第:%d包,是否结束:%d",*value+1,*(value+1));
ESP_LOGI(CONN_TAG, "获取到数据:第:%d包,长度:%d,是否结束:%d",*value+1,(int)param->write.len,*(value+1));
uint8_t isEnd = *(value + 1);
uint8_t port = *(value);
uint8_t *data = value + 2;
memcpy(img_data + SendStatus.port,data,(int)param->write.len-2);
SendStatus.port += param->write.len-2;
if(isEnd){
ESP_LOGI(CONN_TAG,"数据接收完毕,累计:%d字节预期:%d字节首字节:%02X %02X",
(int)SendStatus.port,(int)firstMeg.len,img_data[0],img_data[1]);
fwrite(img_data,sizeof(uint8_t),firstMeg.len,file_img);
fclose(file_img);
SendStatus.isSend = false;
SendStatus.port = 0;
ESP_LOGI(CONN_TAG,"图片接收成功");
nvs_change_img(firstMeg.filename);
app_img_change(firstMeg.filename);
// 导航到ScreenImg显示新图片内部刷新列表+设置索引+切换界面)
ble_image_navigate(firstMeg.filename);
free(img_data);
free(filepath);
}
@ -293,7 +297,7 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
memcpy(imgName, value, 23);
if(type == 0xff){
nvs_change_img(imgName);
app_img_change(imgName);
ble_image_navigate(imgName);
}else if(type == 0xF1){
remove(filepath);
SendStatus.isSend = false;

View File

@ -568,12 +568,6 @@ esp_err_t DecodeImg(char *imgpath,uint8_t** imgData,esp_jpeg_image_output_t *out
free(*imgData);
return ESP_FAIL;
}
if (imgEncoderData[file_stat.st_size - 2] != 0xFF || imgEncoderData[file_stat.st_size - 1] != 0xD9) {
ESP_LOGE(TAG, "JPEG结束标记缺失");
free(imgEncoderData);
free(*imgData);
return ESP_FAIL;
}
fclose(f);
uint32_t outbuf_size = 360 * 360 * sizeof(uint8_t) * 2;
esp_jpeg_image_cfg_t jpeg_cfg = {

View File

@ -15,3 +15,7 @@ uint8_t pwm_get_brightness(void); // 获取当前亮度值
// 图片管理函数
const char* get_current_image(void); // 获取当前图片文件名
bool delete_current_image(void); // 删除当前图片
void init_spiffs_image_list(void); // 初始化/扫描SPIFFS图片列表
void free_spiffs_image_list(void); // 重置图片列表
bool set_image_index_by_name(const char *name); // 根据文件名设置当前图片索引
void ble_image_navigate(const char *filename); // BLE接收后导航到ScreenImg显示

View File

@ -6,6 +6,9 @@
#include "jpeg_decoder.h"
#include "../ui/screens/ui_ScreenImg.h"
#include <inttypes.h>
// 前向声明界面切换函数
extern void _ui_screen_change(lv_obj_t **target, lv_scr_load_anim_t fademode, int spd, int delay, void (*target_init)(void));
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
@ -665,6 +668,48 @@ void free_spiffs_image_list(void) {
ESP_LOGI("IMG_LIST", "图片列表已重置");
}
// 根据文件名设置当前图片索引
bool set_image_index_by_name(const char *name) {
if(!image_list_initialized || spiffs_image_count == 0 || !name) {
return false;
}
for(int i = 0; i < spiffs_image_count; i++) {
if(strcmp(spiffs_image_files[i], name) == 0) {
current_image_index = i;
ESP_LOGI("IMG_LIST", "设置图片索引为 %d: %s", i, name);
return true;
}
}
ESP_LOGW("IMG_LIST", "未找到图片: %s", name);
return false;
}
// BLE接收图片后导航到ScreenImg显示
void ble_image_navigate(const char *filename) {
// 刷新图片列表
free_spiffs_image_list();
init_spiffs_image_list();
// 设置当前索引为新接收的图片
set_image_index_by_name(filename);
// 检查是否已在ScreenImg界面
lvgl_port_lock(0);
bool already_on_screen = (lv_scr_act() == ui_ScreenImg);
if (!already_on_screen) {
// 不在ScreenImg导航过去SCREEN_LOADED事件会触发update_ui_ImgBle
_ui_screen_change(&ui_ScreenImg, LV_SCR_LOAD_ANIM_NONE, 0, 0, &ui_ScreenImg_screen_init);
}
lvgl_port_unlock();
// 已在ScreenImg时_ui_screen_change不会触发SCREEN_LOADED需手动更新图片
if (already_on_screen) {
update_ui_ImgBle(filename);
}
ESP_LOGI("IMG_LIST", "BLE导航到ScreenImg显示: %s", filename);
}
// 获取当前图片文件名
const char* get_current_image(void) {
if(!image_list_initialized || spiffs_image_count == 0) {
@ -788,6 +833,7 @@ void update_ui_ImgBle(const char *img_name) {
ESP_LOGI("IMG_UI", "ui_ImgBle图片更新成功: %s", img_name);
} else {
ESP_LOGE("IMG_UI", "图片解码失败,错误码: %d", ret);
ui_img_data = NULL;
}
}

View File

@ -78,23 +78,17 @@ void ui_event_ImageDel(lv_event_t * e) {
void ui_event_ScreenImg( lv_event_t * e) {
lv_event_code_t event_code = lv_event_get_code(e);
// 界面加载完成事件:首次进入时才初始化图片
// 界面加载完成事件:每次进入都显示当前图片
if ( event_code == LV_EVENT_SCREEN_LOADED ) {
if (first_load) {
first_load = false;
// 初始化图片列表内部有guard不会重复初始化
init_spiffs_image_list();
// 初始化图片列表
init_spiffs_image_list();
// 获取第一张可用图片
const char *first_img = get_current_image();
if (first_img) {
// 显示第一张SPIFFS图片
update_ui_ImgBle(first_img);
} else {
// 没有图片保持显示UI资源图片 ui_img_s1_png
ESP_LOGI("ScreenImg", "SPIFFS无可用图片显示默认UI图片");
}
// 每次进入界面都显示当前图片支持BLE导航和手势切换回来
const char *current_img = get_current_image();
if (current_img) {
update_ui_ImgBle(current_img);
} else {
ESP_LOGI("ScreenImg", "SPIFFS无可用图片显示默认UI图片");
}
// 每次加载界面时检查是否需要显示 ContainerDle

View File

@ -14,7 +14,6 @@ CONFIG_SOC_GDMA_SUPPORTED=y
CONFIG_SOC_AHB_GDMA_SUPPORTED=y
CONFIG_SOC_GPTIMER_SUPPORTED=y
CONFIG_SOC_LCDCAM_SUPPORTED=y
CONFIG_SOC_LCDCAM_CAM_SUPPORTED=y
CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y
CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y
CONFIG_SOC_MCPWM_SUPPORTED=y
@ -102,7 +101,7 @@ CONFIG_SOC_CPU_HAS_FPU=y
CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y
CONFIG_SOC_CPU_BREAKPOINTS_NUM=2
CONFIG_SOC_CPU_WATCHPOINTS_NUM=2
CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=0x40
CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64
CONFIG_SOC_SIMD_PREFERRED_DATA_ALIGNMENT=16
CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096
CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16
@ -209,7 +208,7 @@ CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y
CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y
CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y
CONFIG_SOC_LP_IO_CLOCK_IS_INDEPENDENT=y
CONFIG_SOC_SDM_GROUPS=1
CONFIG_SOC_SDM_GROUPS=y
CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8
CONFIG_SOC_SDM_CLK_SUPPORT_APB=y
CONFIG_SOC_SPI_PERIPH_NUM=3
@ -370,9 +369,6 @@ CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y
CONFIG_SOC_BLUFI_SUPPORTED=y
CONFIG_SOC_ULP_HAS_ADC=y
CONFIG_SOC_PHY_COMBO_MODULE=y
CONFIG_SOC_LCDCAM_CAM_SUPPORT_RGB_YUV_CONV=y
CONFIG_SOC_LCDCAM_CAM_PERIPH_NUM=1
CONFIG_SOC_LCDCAM_CAM_DATA_WIDTH_MAX=16
CONFIG_IDF_CMAKE=y
CONFIG_IDF_TOOLCHAIN="gcc"
CONFIG_IDF_TOOLCHAIN_GCC=y
@ -840,7 +836,6 @@ CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y
CONFIG_BT_BLE_42_DTM_TEST_EN=y
CONFIG_BT_BLE_42_ADV_EN=y
CONFIG_BT_BLE_42_SCAN_EN=y
CONFIG_BT_BLE_VENDOR_HCI_EN=y
# CONFIG_BT_BLE_HIGH_DUTY_ADV_INTERVAL is not set
# CONFIG_BT_ABORT_WHEN_ALLOCATION_FAILS is not set
# end of Bluedroid Options
@ -1062,7 +1057,6 @@ CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y
# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set
# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
# CONFIG_ESP_TLS_INSECURE is not set
CONFIG_ESP_TLS_DYN_BUF_STRATEGY_SUPPORTED=y
# end of ESP-TLS
#
@ -1089,12 +1083,6 @@ CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
CONFIG_ESP_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
# end of Common ESP-related
#
# ESP-Driver:Camera Controller Configurations
#
# CONFIG_CAM_CTLR_DVP_CAM_ISR_CACHE_SAFE is not set
# end of ESP-Driver:Camera Controller Configurations
#
# ESP-Driver:GPIO Configurations
#
@ -1415,11 +1403,8 @@ CONFIG_ESP_PHY_RF_CAL_PARTIAL=y
# CONFIG_ESP_PHY_RF_CAL_NONE is not set
# CONFIG_ESP_PHY_RF_CAL_FULL is not set
CONFIG_ESP_PHY_CALIBRATION_MODE=0
CONFIG_ESP_PHY_PLL_TRACK_PERIOD_MS=1000
# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set
# CONFIG_ESP_PHY_RECORD_USED_TIME is not set
CONFIG_ESP_PHY_IRAM_OPT=y
# CONFIG_ESP_PHY_DEBUG is not set
# end of PHY
#
@ -2099,7 +2084,6 @@ CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set
# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set
CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y
# CONFIG_MBEDTLS_SSL_KEYING_MATERIAL_EXPORT is not set
CONFIG_MBEDTLS_PKCS7_C=y
# end of mbedTLS v3.x related
@ -3083,7 +3067,6 @@ CONFIG_BT_NIMBLE_COEX_PHY_CODED_TX_RX_TLIM_DIS=y
CONFIG_SW_COEXIST_ENABLE=y
CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y
CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y
# CONFIG_CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE is not set
# CONFIG_MCPWM_ISR_IN_IRAM is not set
# CONFIG_EVENT_LOOP_PROFILING is not set
CONFIG_POST_EVENTS_FROM_ISR=y

View File

@ -1,282 +0,0 @@
rdzleo@RdzleodeMac-Studio dzbj % '/Users/rdzleo/.espressif/python_env/idf5.4_py3.13_env/bin/python3' '/Users/rd
zleo/esp/esp-idf/v5.4.2/esp-idf/tools/idf_monitor.py' -p /dev/tty.usbmodem834401 -b 115200 --toolchain-prefix x
tensa-esp32s3-elf- --make ''/Users/rdzleo/.espressif/python_env/idf5.4_py3.13_env/bin/python3' '/Users/rdzleo/e
sp/esp-idf/v5.4.2/esp-idf/tools/idf.py'' --target esp32s3 '/Users/rdzleo/Desktop/dzbj/build/program.elf'
--- Warning: Serial ports accessed as /dev/tty.* will hang gdb if launched.
--- Using /dev/cu.usbmodem834401 instead...
--- esp-idf-monitor 1.8.0 on /dev/cu.usbmodem834401 115200
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
This driver is aESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x15 (USB_UART_CHIP_RESET),boot:0x2b (SPI_FAST_FLASH_BOOT)
Saved PC:0x40048836
--- 0x40048836: uart_tx_one_char_uart in ROM
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce2820,len:0x16d0
load:0x403c8700,len:0x4
load:0x403c8704,len:0xec8
load:0x403cb700,len:0x3160
entry 0x403c8950
I (26) boot: ESP-IDF v5.4.2-dirty 2nd stage bootloader
I (27) boot: compile time Feb 9 2026 10:08:02
I (27) boot: Multicore bootloader
I (27) boot: chip revision: v0.2
I (30) boot: efuse block revision: v1.3
I (34) qio_mode: Enabling default flash chip QIO
I (38) boot.esp32s3: Boot SPI Speed : 80MHz
I (42) boot.esp32s3: SPI Mode : QIO
I (46) boot.esp32s3: SPI Flash Size : 16MB
I (50) boot: Enabling RNG early entropy source...
I (54) boot: Partition Table:
I (57) boot: ## Label Usage Type ST Offset Length
I (63) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (70) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (76) boot: 2 factory factory app 00 00 00010000 00400000
I (83) boot: 3 storage Unknown data 01 82 00410000 00200000
I (89) boot: End of partition table
I (92) esp_image: segment 0: paddr=00010020 vaddr=3c060020 size=78508h (492808) map
I (173) esp_image: segment 1: paddr=00088530 vaddr=3fc98600 size=03688h ( 13960) load
I (176) esp_image: segment 2: paddr=0008bbc0 vaddr=40374000 size=04458h ( 17496) load
I (180) esp_image: segment 3: paddr=00090020 vaddr=42000020 size=5c8ech (379116) map
I (241) esp_image: segment 4: paddr=000ec914 vaddr=40378458 size=1015ch ( 65884) load
I (253) esp_image: segment 5: paddr=000fca78 vaddr=600fe000 size=0001ch ( 28) load
I (262) boot: Loaded app from partition at offset 0x10000
I (262) boot: Disabling RNG early entropy source...
I (272) octal_psram: ECC is enabled
I (272) octal_psram: vendor id : 0x0d (AP)
I (272) octal_psram: dev id : 0x02 (generation 3)
I (273) octal_psram: density : 0x03 (64 Mbit)
I (277) octal_psram: good-die : 0x01 (Pass)
I (282) octal_psram: Latency : 0x01 (Fixed)
I (286) octal_psram: VCC : 0x01 (3V)
I (290) octal_psram: SRF : 0x01 (Fast Refresh)
I (295) octal_psram: BurstType : 0x00 ( Wrap)
I (299) octal_psram: BurstLen : 0x03 (1024 Byte)
I (304) octal_psram: Readlatency : 0x02 (10 cycles@Fixed)
I (309) octal_psram: DriveStrength: 0x00 (1/1)
I (314) MSPI Timing: PSRAM timing tuning index: 5
I (318) esp_psram: Found 8MB PSRAM device
I (322) esp_psram: Speed: 80MHz
I (364) mmu_psram: Read only data copied and mapped to SPIRAM
I (395) mmu_psram: Instructions copied and mapped to SPIRAM
I (396) cpu_start: Multicore app
I (795) esp_psram: SPI SRAM memory test OK
I (803) cpu_start: Pro cpu start user code
I (803) cpu_start: cpu freq: 160000000 Hz
I (803) app_init: Application information:
I (804) app_init: Project name: program
I (807) app_init: App version: 1
I (811) app_init: Compile time: Feb 9 2026 10:07:49
I (816) app_init: ELF file SHA256: fe13bd2c7...
I (820) app_init: ESP-IDF: v5.4.2-dirty
I (824) efuse_init: Min chip rev: v0.0
I (828) efuse_init: Max chip rev: v0.99
I (832) efuse_init: Chip rev: v0.2
I (836) heap_init: Initializing. RAM available for dynamic allocation:
I (842) heap_init: At 3FCACCB0 len 0003CA60 (242 KiB): RAM
I (847) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
I (853) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (858) heap_init: At 600FE01C len 00001FCC (7 KiB): RTCRAM
I (863) esp_psram: Adding pool of 6784K of PSRAM memory to heap allocator
I (870) esp_psram: Adding pool of 30K of PSRAM memory gap generated due to end address alignment of drom to the heap allocator
I (881) spi_flash: detected chip: generic
I (884) spi_flash: flash io: qio
W (888) i2c: This driver is an old driver, please migrate your application code to adapt `driver/i2c_master.h`
I (897) sleep_gpio: Configure to isolate all GPIO pins in sleep state
I (904) sleep_gpio: Enable automatic switching of GPIO sleep configuration
I (910) coexist: coex firmware version: 7b9a184
I (914) coexist: coexist rom version e7ae62f
I (919) main_task: Started on CPU0
I (929) esp_psram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (929) main_task: Calling app_main()
I (929) MAIN: Starting system initialization...
I (939) MAIN: 1. Initializing I2C...
I (939) MAIN: I2C initialized successfully
I (949) MAIN: 2. Initializing NVS...
I (949) MAIN: NVS initialized successfully
I (949) MAIN: 3. Initializing LCD...
I (959) gpio: GPIO[7]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (959) st77916: LCD panel create success, version: 1.0.1
W (1109) st77916: The 3Ah command has been used and will be overwritten by external initialization sequence
I (1229) MAIN: LCD initialized successfully
I (1229) MAIN: 4. Initializing touch controller...
I (1229) gpio: GPIO[4]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:2
I (1229) gpio: GPIO[6]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (1639) CST816S: IC id: 182
I (1639) LCD: Touch controller initialized successfully
I (1639) MAIN: Touch controller initialized
I (1639) MAIN: 5. Initializing LVGL...
I (1639) LVGL: Starting LVGL task
I (1639) LCD: LVGL buffer size: 21600 bytes (W: 360, Lines: 30)
I (1649) LCD: Touch controller added to LVGL
I (1649) MAIN: LVGL initialized successfully
I (1759) MAIN: LVGL task started
I (1759) MAIN: 6. Initializing FATFS...
I (1809) FATFS: SPIFFS: Total size: 1920401, Used: 78061
I (1809) MAIN: FATFS initialized successfully
I (1809) MAIN: 7. Initializing PWM backlight...
I (1809) MAIN: PWM backlight initialized successfully
I (1809) MAIN: 8. Processing SPIFFS...
I (1879) FATFS: 文件名: /spiflash/03.jpg,大小:8805
I (1879) FATFS: 文件名: /spiflash/02.jpg,大小:20498
I (1879) FATFS: 文件名: /spiflash/default.jpg,大小:47430
I (1909) MAIN: 9. Initializing SquareLine UI...
I (1969) MAIN: SquareLine UI initialized
I (1969) MAIN: 10. Waiting for UI rendering...
I (2039) MAIN: Rendering step 1 completed
I (2089) MAIN: Rendering step 2 completed
I (2139) MAIN: Rendering step 3 completed
I (2139) MAIN: UI rendering completed
I (2139) MAIN: System initialization finished successfully!
I (2139) main_task: Returned from app_main()
I (6789) LVGL: Touch detected: x=175, y=36, count=1
I (6819) LVGL: Touch detected: x=178, y=41, count=1
I (6849) LVGL: Touch detected: x=183, y=50, count=1
I (6879) LVGL: Touch detected: x=190, y=65, count=1
I (6929) LVGL: Touch detected: x=208, y=122, count=1
I (6959) LVGL: Touch detected: x=218, y=161, count=1
I (6989) LVGL: Touch detected: x=232, y=201, count=1
I (7019) LVGL: Touch detected: x=251, y=243, count=1
I (7049) LVGL: Touch detected: x=263, y=265, count=1
I (7829) LVGL: Touch detected: x=191, y=328, count=1
I (7859) LVGL: Touch detected: x=192, y=326, count=1
I (7889) LVGL: Touch detected: x=195, y=313, count=1
I (7919) LVGL: Touch detected: x=199, y=287, count=1
I (9389) LVGL: Touch detected: x=200, y=34, count=1
I (9419) LVGL: Touch detected: x=200, y=34, count=1
I (9449) LVGL: Touch detected: x=200, y=34, count=1
I (9479) LVGL: Touch detected: x=201, y=36, count=1
I (9509) LVGL: Touch detected: x=205, y=49, count=1
I (9539) LVGL: Touch detected: x=209, y=66, count=1
I (9579) LVGL: Touch detected: x=217, y=100, count=1
I (9609) LVGL: Touch detected: x=221, y=121, count=1
I (9639) LVGL: Touch detected: x=227, y=141, count=1
I (9669) LVGL: Touch detected: x=235, y=161, count=1
I (9699) LVGL: Touch detected: x=243, y=178, count=1
I (10509) LVGL: Touch detected: x=195, y=326, count=1
I (10539) LVGL: Touch detected: x=195, y=325, count=1
I (10569) LVGL: Touch detected: x=198, y=313, count=1
I (10599) LVGL: Touch detected: x=201, y=290, count=1
I (11409) LVGL: Touch detected: x=10, y=157, count=1
I (11439) LVGL: Touch detected: x=10, y=157, count=1
I (11469) LVGL: Touch detected: x=11, y=157, count=1
I (11499) LVGL: Touch detected: x=23, y=157, count=1
I (11529) LVGL: Touch detected: x=45, y=157, count=1
I (11559) LVGL: Touch detected: x=87, y=157, count=1
I (11589) LVGL: Touch detected: x=142, y=157, count=1
I (11619) LVGL: Touch detected: x=221, y=157, count=1
I (11649) LVGL: Touch detected: x=258, y=157, count=1
I (12189) LVGL: Touch detected: x=352, y=159, count=1
I (12219) LVGL: Touch detected: x=352, y=159, count=1
I (12249) LVGL: Touch detected: x=351, y=159, count=1
I (12279) LVGL: Touch detected: x=332, y=156, count=1
I (12309) LVGL: Touch detected: x=305, y=152, count=1
I (12339) LVGL: Touch detected: x=273, y=146, count=1
I (12369) LVGL: Touch detected: x=245, y=141, count=1
I (12399) LVGL: Touch detected: x=217, y=137, count=1
I (12429) LVGL: Touch detected: x=187, y=132, count=1
I (12969) LVGL: Touch detected: x=165, y=36, count=1
I (12999) LVGL: Touch detected: x=165, y=36, count=1
I (13029) LVGL: Touch detected: x=166, y=40, count=1
I (13059) LVGL: Touch detected: x=171, y=56, count=1
I (13089) LVGL: Touch detected: x=180, y=86, count=1
I (13139) LVGL: Touch detected: x=195, y=137, count=1
I (13169) LVGL: Touch detected: x=205, y=168, count=1
I (13199) LVGL: Touch detected: x=215, y=193, count=1
I (13709) LVGL: Touch detected: x=181, y=321, count=1
I (13739) LVGL: Touch detected: x=179, y=312, count=1
I (13769) LVGL: Touch detected: x=178, y=291, count=1
I (14309) LVGL: Touch detected: x=211, y=25, count=1
I (14339) LVGL: Touch detected: x=211, y=25, count=1
I (14369) LVGL: Touch detected: x=211, y=28, count=1
I (14399) LVGL: Touch detected: x=214, y=39, count=1
I (14429) LVGL: Touch detected: x=221, y=62, count=1
I (14469) LVGL: Touch detected: x=241, y=112, count=1
I (14499) LVGL: Touch detected: x=252, y=139, count=1
I (14529) LVGL: Touch detected: x=262, y=161, count=1
I (14559) LVGL: Touch detected: x=277, y=189, count=1
I (14589) LVGL: Touch detected: x=287, y=203, count=1
I (15279) LVGL: Touch detected: x=173, y=324, count=1
I (15309) LVGL: Touch detected: x=173, y=320, count=1
I (15339) LVGL: Touch detected: x=175, y=309, count=1
I (15369) LVGL: Touch detected: x=178, y=286, count=1
I (15879) LVGL: Touch detected: x=216, y=56, count=1
I (15909) LVGL: Touch detected: x=216, y=56, count=1
I (15939) LVGL: Touch detected: x=216, y=56, count=1
I (15969) LVGL: Touch detected: x=216, y=57, count=1
I (15999) LVGL: Touch detected: x=219, y=64, count=1
I (16029) LVGL: Touch detected: x=227, y=86, count=1
I (16079) LVGL: Touch detected: x=243, y=129, count=1
I (16109) LVGL: Touch detected: x=253, y=156, count=1
I (16139) LVGL: Touch detected: x=262, y=177, count=1
I (16709) LVGL: Touch detected: x=11, y=134, count=1
I (16739) LVGL: Touch detected: x=24, y=136, count=1
I (16769) LVGL: Touch detected: x=52, y=139, count=1
I (16799) LVGL: Touch detected: x=124, y=146, count=1
I (16829) LVGL: Touch detected: x=172, y=151, count=1
I (16859) LVGL: Touch detected: x=217, y=154, count=1
I (16889) LVGL: Touch detected: x=261, y=154, count=1
I (16919) LVGL: Touch detected: x=308, y=153, count=1
I (17699) LVGL: Touch detected: x=203, y=27, count=1
I (17729) LVGL: Touch detected: x=203, y=28, count=1
I (17759) LVGL: Touch detected: x=205, y=36, count=1
I (17789) LVGL: Touch detected: x=207, y=52, count=1
I (17819) LVGL: Touch detected: x=213, y=79, count=1
I (17849) LVGL: Touch detected: x=227, y=116, count=1
I (17879) LVGL: Touch detected: x=241, y=151, count=1
I (18419) LVGL: Touch detected: x=97, y=130, count=1
I (18449) LVGL: Touch detected: x=97, y=130, count=1
I (20399) LVGL: Touch detected: x=196, y=32, count=1
I (20429) LVGL: Touch detected: x=197, y=35, count=1
I (20459) LVGL: Touch detected: x=199, y=42, count=1
I (20489) LVGL: Touch detected: x=201, y=55, count=1
I (20519) LVGL: Touch detected: x=205, y=77, count=1
I (20549) LVGL: Touch detected: x=211, y=104, count=1
I (20579) LVGL: Touch detected: x=233, y=158, count=1
I (20999) LVGL: Touch detected: x=180, y=337, count=1
I (21029) LVGL: Touch detected: x=180, y=333, count=1
I (21059) LVGL: Touch detected: x=179, y=315, count=1
I (25709) LVGL: Touch detected: x=208, y=35, count=1
I (25739) LVGL: Touch detected: x=208, y=35, count=1
I (25769) LVGL: Touch detected: x=208, y=38, count=1
I (25799) LVGL: Touch detected: x=208, y=48, count=1
I (25829) LVGL: Touch detected: x=208, y=66, count=1
I (25869) LVGL: Touch detected: x=212, y=132, count=1
I (25899) LVGL: Touch detected: x=213, y=150, count=1
I (25929) LVGL: Touch detected: x=216, y=195, count=1
I (25959) LVGL: Touch detected: x=218, y=214, count=1
I (25989) LVGL: Touch detected: x=223, y=227, count=1
I (26529) LVGL: Touch detected: x=15, y=118, count=1
I (26559) LVGL: Touch detected: x=15, y=118, count=1
I (26589) LVGL: Touch detected: x=22, y=119, count=1
I (26619) LVGL: Touch detected: x=44, y=123, count=1
I (26649) LVGL: Touch detected: x=85, y=130, count=1
I (26679) LVGL: Touch detected: x=157, y=141, count=1
I (26709) LVGL: Touch detected: x=198, y=148, count=1
I (26739) LVGL: Touch detected: x=233, y=152, count=1
I (27189) LVGL: Touch detected: x=352, y=168, count=1
I (27219) LVGL: Touch detected: x=352, y=168, count=1
I (27249) LVGL: Touch detected: x=348, y=168, count=1
I (27279) LVGL: Touch detected: x=324, y=167, count=1
I (27309) LVGL: Touch detected: x=294, y=164, count=1
I (27339) LVGL: Touch detected: x=252, y=161, count=1
I (27369) LVGL: Touch detected: x=208, y=157, count=1
I (27399) LVGL: Touch detected: x=180, y=153, count=1
I (27429) LVGL: Touch detected: x=161, y=148, count=1
I (27909) LVGL: Touch detected: x=166, y=336, count=1
I (27939) LVGL: Touch detected: x=166, y=328, count=1
I (28479) LVGL: Touch detected: x=199, y=325, count=1
I (28509) LVGL: Touch detected: x=199, y=325, count=1
I (28539) LVGL: Touch detected: x=198, y=322, count=1
I (28569) LVGL: Touch detected: x=196, y=312, count=1
I (28599) LVGL: Touch detected: x=195, y=292, count=1
I (28629) LVGL: Touch detected: x=196, y=254, count=1
I (28659) LVGL: Touch detected: x=201, y=162, count=1
I (29139) LVGL: Touch detected: x=209, y=15, count=1
I (29169) LVGL: Touch detected: x=209, y=16, count=1
I (29199) LVGL: Touch detected: x=209, y=28, count=1
I (29229) LVGL: Touch detected: x=212, y=55, count=1
I (29279) LVGL: Touch detected: x=225, y=123, count=1
I (29309) LVGL: Touch detected: x=235, y=166, count=1
I (29339) LVGL: Touch detected: x=243, y=199, count=1