#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);
}

// 控件定义在外面,因为回调函数中需要调用
static lv_obj_t * spinbox;

// Spinbox 微调控件:递增事件处理回调函数
static void lv_spinbox_increment_event_cb(lv_obj_t * btn, lv_event_t e)
{
// 这里捕获长按和短按是为了短按增加一个数,长按信不松手不停增加
if(e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) {// 捕获短按和长按事件
lv_spinbox_increment(spinbox);// 递增控件中的值
}
}
// Spinbox 微调控件:递减事件处理回调函数
static void lv_spinbox_decrement_event_cb(lv_obj_t * btn, lv_event_t e)
{
// 这里捕获长按和短按是为了短按减少一个数,长按信不松手不停减少
if(e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) {// 捕获短按和长按事件
lv_spinbox_decrement(spinbox);// 递减控件中的值
}
}

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));




///////////////////////////////////////////////////
///////////////Spinbox 微调控件////////////////////
///////////////////////////////////////////////////
spinbox = lv_spinbox_create(lv_scr_act(), NULL);				// 在主屏幕上创建一个微调控件
lv_spinbox_set_range(spinbox, -1000, 90000);					// 设置微调控件的值范围,可以是负数,这里的数字并不是真的,要根据下面的数字格式
lv_spinbox_set_digit_format(spinbox, 5, 2);						// 设置数字的格式,5代表5位不足前面补0,2代表小数点前面有2位
lv_spinbox_set_value(spinbox,1000);								// 设置初始值1.000
lv_spinbox_set_step(spinbox, 2);								// 设置步进为2,单击+-增加减少2
lv_spinbox_step_prev(spinbox);									// 通过乘以10选择上一个较高的数字,就是光标向左移一位
lv_spinbox_step_prev(spinbox);									// 通过乘以10选择上一个较高的数字
//lv_spinbox_step_next(spinbox);								// 通过除以10选择下一个较低的数字,就是光标向右移一位
lv_obj_set_width(spinbox, 100);									// 设置控件宽度
lv_obj_align(spinbox, NULL, LV_ALIGN_CENTER, 0, 0);				// 对齐到屏幕中心

lv_coord_t h = lv_obj_get_height(spinbox);						// 获取微调控件的高度
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);				// 创建一个按钮
lv_obj_set_size(btn, h, h);										// 设置宽度高度和微调控件的高度一致
lv_obj_align(btn, spinbox, LV_ALIGN_OUT_RIGHT_MID, 5, 0);		// 对齐到微调控件的右边再偏移5
lv_theme_apply(btn, LV_THEME_SPINBOX_BTN);						// 按钮样式设置为微调按钮风格
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_PLUS);	// 本地显示值为+号
lv_obj_set_event_cb(btn, lv_spinbox_increment_event_cb);		// 添加按钮事件回调函数

btn = lv_btn_create(lv_scr_act(), btn);							// 继承上面按钮再创建一个按钮
lv_obj_align(btn, spinbox, LV_ALIGN_OUT_LEFT_MID, -5, 0);		// 对齐到微调控件的左边偏移5
lv_obj_set_event_cb(btn, lv_spinbox_decrement_event_cb);		// 添加按钮事件回调函数
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_MINUS);// 本地显示值为-号

// lv_demo_widgets();

while (1) {
	vTaskDelay(1);
	// 尝试锁定信号量,如果成功,调用处理LVGL任务
	if (xSemaphoreTake(xGuiSemaphore, (TickType_t)10) == pdTRUE) {
		lv_task_handler();					// 处理LVGL任务
		xSemaphoreGive(xGuiSemaphore);		// 释放信号量
	}
}
vTaskDelete(NULL);							// 删除任务

}

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐