因為我的開發板上沒有觸摸屏,所以要用手動發送一些事件進行測試一下,為了直觀明了,我們以按鍵為例程:
首先,我在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實現,也不糾結這么多了。這是一個坑,要注意
