contiki ng與LVGL圖形庫之手動發送事件


 因為我的開發板上沒有觸摸屏,所以要用手動發送一些事件進行測試一下,為了直觀明了,我們以按鍵為例程:

首先,我在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實現,也不糾結這么多了。這是一個坑,要注意


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM