木子剑
生命不熄,学习不止!

 因为我的开发板上没有触摸屏,所以要用手动发送一些事件进行测试一下,为了直观明了,我们以按键为例程:

首先,我在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实现,也不纠结这么多了。这是一个坑,要注意
posted on 2021-05-26 22:50  木子剑  阅读(1485)  评论(0编辑  收藏  举报