#define TAG " LittlevGL Demo"
#define LV_TICK_PERIOD_MS 10
SemaphoreHandle_t xGuiSemaphore; // 创建一个GUI信号量
static void lv_tick_task(void *arg); // LVGL 时钟任务
void guiTask(void *pvParameter); // GUI任务
// LVGL 时钟任务
static void lv_tick_task(void *arg) {
(void) arg;
lv_tick_inc(LV_TICK_PERIOD_MS);
}
// Slider滑动条控件事件回调函数
static void slider_event_cb(lv_obj_t * slider, lv_event_t e)
{
if(e == LV_EVENT_VALUE_CHANGED) { // 捕获值改变事件
if(lv_slider_get_type(slider) == LV_SLIDER_TYPE_NORMAL) { // 滑动条正常模式
static char buf[16];
lv_snprintf(buf, sizeof(buf), “%d”, lv_slider_get_value(slider)); // 获取控件当前的值封装成字符串
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, buf);// 设置显示控件值
} else { // 滑动条范围模式
static char buf[32];
// 获取控件左值和右值
lv_snprintf(buf, sizeof(buf), “%d-%d”, lv_slider_get_left_value(slider), lv_slider_get_value(slider));
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, buf);// 设置显示控件值
}
}
}
void guiTask(void *pvParameter) {
(void) pvParameter;
xGuiSemaphore = xSemaphoreCreateMutex(); // 创建GUI信号量
lv_init(); // 初始化LittlevGL
lvgl_driver_init(); // 初始化液晶SPI驱动 触摸芯片SPI/IIC驱动
// 初始化缓存
static lv_color_t buf1[DISP_BUF_SIZE];
static lv_color_t buf2[DISP_BUF_SIZE];
static lv_disp_buf_t disp_buf;
uint32_t size_in_px = DISP_BUF_SIZE;
lv_disp_buf_init(&disp_buf, buf1, buf2, size_in_px);
// 添加并注册触摸驱动
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = disp_driver_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);
// 添加并注册触摸驱动
ESP_LOGI(TAG,"Add Register Touch Drv");
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.read_cb = touch_driver_read;
indev_drv.type = LV_INDEV_TYPE_POINTER;
lv_indev_drv_register(&indev_drv);
// 定期处理GUI回调
const esp_timer_create_args_t periodic_timer_args = {
.callback = &lv_tick_task,
.name = "periodic_gui"
};
esp_timer_handle_t periodic_timer;
ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
///////////////////////////////////////////////////
///////////////Slider 滑动条控件////////////////////
///////////////////////////////////////////////////
lv_obj_t * slider1 = lv_slider_create(lv_scr_act(), NULL); // 在屏幕上创建一个滑动条控件
lv_slider_set_value(slider1, 40, LV_ANIM_OFF); // 设置当前值,动画模式关闭
lv_obj_set_event_cb(slider1, slider_event_cb); // 设置控件事件回调函数
lv_obj_set_width(slider1, 300); // 设置控件宽度
lv_slider_set_type(slider1, LV_SLIDER_TYPE_NORMAL); // 模式正常模式
lv_slider_set_range(slider1,0,100); // 设置值范围,默认0-100
lv_obj_align(slider1, NULL, LV_ALIGN_CENTER, 0, 60); // 对齐到屏幕中心偏上
// 使用滑动条旋钮样式创建本地风格,拖动时显示,当控件失去焦点时动态消失的动画效果
lv_obj_set_style_local_margin_top(slider1, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_DPX(25)); // 相对顶距离
lv_obj_set_style_local_value_font(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, lv_theme_get_font_small());// 小字体
lv_obj_set_style_local_value_ofs_y(slider1, LV_SLIDER_PART_KNOB, LV_STATE_FOCUSED, - LV_DPX(25));// Y轴偏移,向下消失动画
lv_obj_set_style_local_value_opa(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_OPA_TRANSP);// 默认透明
lv_obj_set_style_local_value_opa(slider1, LV_SLIDER_PART_KNOB, LV_STATE_FOCUSED, LV_OPA_COVER);// 获得焦点时不透明
lv_obj_set_style_local_transition_time(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 300);// 转换时长
lv_obj_set_style_local_transition_prop_5(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_STYLE_VALUE_OFS_Y);// 添加Y轴偏移
lv_obj_set_style_local_transition_prop_6(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_STYLE_VALUE_OPA);// 添加透明度
lv_obj_t * slider2 = lv_slider_create(lv_scr_act(), slider1); // 继承slider1设置在屏幕上创建slider2
lv_slider_set_type(slider2, LV_SLIDER_TYPE_RANGE); // 模式设置为范围模式,关闭动画模式
lv_slider_set_value(slider2, 70, LV_ANIM_OFF); // 设置当前值为70,关闭动画模式
lv_slider_set_left_value(slider2, 30, LV_ANIM_OFF); // 设置当前左边值为30,关闭动画模式
lv_obj_set_style_local_value_ofs_y(slider2, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, - LV_DPX(25));// Y轴偏移
lv_obj_set_style_local_value_font(slider2, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, lv_theme_get_font_small());// 小字体
lv_obj_set_style_local_value_opa(slider2, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_COVER);// 不透明
lv_obj_set_event_cb(slider2, slider_event_cb); // 设置事件回调函数
lv_event_send(slider2, LV_EVENT_VALUE_CHANGED, NULL); // 发送事件:值改变
lv_obj_set_width(slider2, 300); // 设置控件宽度
lv_obj_align(slider1, NULL, LV_ALIGN_CENTER, 0, -60); // 对齐到屏幕中心偏下
// lv_demo_widgets();
while (1) {
vTaskDelay(1);
// 尝试锁定信号量,如果成功,调用处理LVGL任务
if (xSemaphoreTake(xGuiSemaphore, (TickType_t)10) == pdTRUE) {
lv_task_handler(); // 处理LVGL任务
xSemaphoreGive(xGuiSemaphore); // 释放信号量
}
}
vTaskDelete(NULL); // 删除任务
}