因为我的开发板上没有触摸屏,所以要用手动发送一些事件进行测试一下,为了直观明了,我们以按键为例程:
首先,我在platform.c的LVGL初始化中,先测试一下看看,发现功能是完全正常的:
/*---------------------------------------------------------------------------*/ static void btn_event_cb(lv_obj_t * obj, lv_event_t event) // 测试 { if (event == LV_EVENT_PRESSED) { //对象被按下时触发,每次按下时只触发一次 //UARTprintf("LV_EVENT_PRESSED\r\n"); __NOP(); } else if (event == LV_EVENT_REFRESH) { //留给用户手动发送触发此事件 uint32_t* data = (uint32_t*)lv_event_get_data(); //UARTprintf("\nLV_EVENT_REFRESH,get data:%x\r\n",*data); __NOP(); } } void platform_init_stage_two(void) { // GPIO_Init(GPIOB, PIN12, 1, 0, 0); //输出,接LED // 图形库初始化 lcd_memory_init(); lv_init(); lv_port_disp_init(); /* ///////////////////////测试开始////////////////////// */ lv_obj_t* scr = lv_scr_act();//获取当前活跃的屏幕对象 //创建一个默认按钮,用来测试事件 lv_obj_t *btn1 = lv_btn_create(scr, NULL); lv_obj_set_pos(btn1, 20, 100);//设置坐标 lv_obj_set_size(btn1, 150, 50);//设置大小 lv_obj_set_event_cb(btn1, btn_event_cb);//设置回调函数 lv_obj_t* label = lv_label_create(btn1, NULL);//给 btn1 添加 label 子对象 lv_label_set_text(label, "Click me");//设置文本 static uint32_t test_data1 = 0x5b; lv_event_send(btn1, LV_EVENT_REFRESH, &test_data1);//内部调用lv_event_send_func // 成功 //lv_event_send_func(btn_event_cb, btn1, LV_EVENT_REFRESH, &test_data1); // 成功 while(1); ///////////////////////测试结束////////////////////// }
不管是用lv_event_send测试,还是lv_event_send_func测试,完成正常的,都能执行到btn_event_cb对应事件部份。
但是在CONTIKI 的ETIMER事件中,就只能这样实现了:
lv_obj_t* scr = lv_scr_act();//获取当前活跃的屏幕对象 //创建一个默认按钮,用来测试事件 lv_obj_t *btn1 = lv_btn_create(scr, NULL); lv_obj_set_pos(btn1, 20, 100);//设置坐标 lv_obj_set_size(btn1, 150, 50);//设置大小 //lv_obj_set_event_cb(btn1, btn_event_cb);//设置回调函数 lv_obj_t* label = lv_label_create(btn1, NULL);//给 btn1 添加 label 子对象 lv_label_set_text(label, "Click me");//设置文本 static uint32_t test_data1 = 0x5b; //lv_event_send(btn1, LV_EVENT_REFRESH, &test_data1);//内部调用lv_event_send_func // 成功 while(1) { PROCESS_WAIT_EVENT();//进行等待 if(ev == PROCESS_EVENT_TIMER) { cpu++; //GPIO_InvBit(GPIOB, PIN12); // 反转LED亮灭状态 lv_label_set_text_fmt(perf_label, "hello world!\nCounter: %d",cpu); // 打印CPU数据 //lv_event_send(btn1, LV_EVENT_REFRESH, &test_data1);//内部调用lv_event_send_func // 不成功 lv_event_send_func(btn_event_cb, btn1, LV_EVENT_REFRESH, &test_data1); // 成功 }//if etimer_reset(&timeout1);//复位时间,周而复始 }//while(1)
上面是测试OK的,lv_event_send_func是完成了lv_obj_set_event_cb与lv_event_send俩大功能,至于为什么lv_event_send不成功,暂时不知道为什么。
可能是OS的调度破坏了LVGL这个lv_event_send功能,不管怎么样,我们可以用lv_event_send_func实现,也不纠结这么多了。这是一个坑,要注意