espressif/esp-iot-solution

iot_button_get_event无法获取到BUTTON_SINGLE_CLICK,BUTTON_DOUBLE_CLICK事件 (AEGHB-693)

vgegok opened this issue · 7 comments

Answers checklist.

  • I have read the documentation ESP-IDF Programming Guide and the issue is not addressed there.
  • I have updated my IDF branch (master or release) to the latest version and checked that the issue is present there.
  • I have searched the issue tracker for a similar issue and not found a similar issue.

IDF version.

已测试的版本5.2.1/5.2.2

Espressif SoC revision.

ESP32 S3

Operating System used.

Windows

How did you build your project?

VS Code IDE

If you are using Windows, please specify command line type.

None

Development Kit.

ESP32S3 DEV Module

Steps to reproduce.

在lvgl的indev的read_cb函数中读取button事件,并且打印事件编号:

static void keyboard_read_cb(lv_indev_t *indev, lv_indev_data_t *data)
{
    button_event_t btn_event = iot_button_get_event(btn_handle);
    if (btn_event != BUTTON_NONE_PRESS)
    {
        ESP_LOGI(TAG, "iot_button_get_event %d", btn_event);
    }
}

或者使用定时器读取事件,也可以使用while(1)循环读取。

只能得到其他中间事件,无法得到BUTTON_SINGLE_CLICK和BUTTON_DOUBLE_CLICK;

I (756) main_task: Returned from app_main()
I (7846) TEST: iot_button_get_event 0
I (7876) TEST: iot_button_get_event 0
I (7916) TEST: iot_button_get_event 0
I (7946) TEST: iot_button_get_event 0
I (7986) TEST: iot_button_get_event 1
I (8016) TEST: iot_button_get_event 1
I (8056) TEST: iot_button_get_event 1
I (8086) TEST: iot_button_get_event 1
I (8126) TEST: iot_button_get_event 1
I (8966) TEST: iot_button_get_event 0
I (8996) TEST: iot_button_get_event 0
I (9036) TEST: iot_button_get_event 0
I (9066) TEST: iot_button_get_event 0
I (9106) TEST: iot_button_get_event 0
I (9136) TEST: iot_button_get_event 0
I (9176) TEST: iot_button_get_event 0
I (9206) TEST: iot_button_get_event 0
I (9246) TEST: iot_button_get_event 0
I (9276) TEST: iot_button_get_event 0
I (9316) TEST: iot_button_get_event 0
I (9346) TEST: iot_button_get_event 0
I (9386) TEST: iot_button_get_event 0
I (9416) TEST: iot_button_get_event 0
I (9456) TEST: iot_button_get_event 0
I (9486) TEST: iot_button_get_event 0
I (9526) TEST: iot_button_get_event 0
I (9556) TEST: iot_button_get_event 0
I (9596) TEST: iot_button_get_event 0
I (9626) TEST: iot_button_get_event 0
I (9666) TEST: iot_button_get_event 0
I (9696) TEST: iot_button_get_event 0
I (9736) TEST: iot_button_get_event 0
I (9766) TEST: iot_button_get_event 0
I (9806) TEST: iot_button_get_event 0
I (9836) TEST: iot_button_get_event 0
I (9876) TEST: iot_button_get_event 0
I (9906) TEST: iot_button_get_event 0
I (9946) TEST: iot_button_get_event 0
I (9976) TEST: iot_button_get_event 0
I (10016) TEST: iot_button_get_event 0
I (10046) TEST: iot_button_get_event 0
I (10086) TEST: iot_button_get_event 0
I (10116) TEST: iot_button_get_event 0
I (10156) TEST: iot_button_get_event 0
I (10186) TEST: iot_button_get_event 0
I (10226) TEST: iot_button_get_event 0
I (10256) TEST: iot_button_get_event 0
I (10296) TEST: iot_button_get_event 0
I (10326) TEST: iot_button_get_event 0
I (10366) TEST: iot_button_get_event 0
I (10396) TEST: iot_button_get_event 0
I (10436) TEST: iot_button_get_event 0
I (10466) TEST: iot_button_get_event 7
I (10506) TEST: iot_button_get_event 8
I (10536) TEST: iot_button_get_event 8
I (10576) TEST: iot_button_get_event 8
I (10606) TEST: iot_button_get_event 8
I (10646) TEST: iot_button_get_event 8
I (10676) TEST: iot_button_get_event 8
I (10716) TEST: iot_button_get_event 8
I (10746) TEST: iot_button_get_event 8
I (10786) TEST: iot_button_get_event 8
I (10816) TEST: iot_button_get_event 8
I (10856) TEST: iot_button_get_event 8
I (10886) TEST: iot_button_get_event 8
I (10926) TEST: iot_button_get_event 8
I (10956) TEST: iot_button_get_event 8
I (10996) TEST: iot_button_get_event 8
I (11026) TEST: iot_button_get_event 8
I (11066) TEST: iot_button_get_event 8
I (11096) TEST: iot_button_get_event 8
I (11136) TEST: iot_button_get_event 8
I (11166) TEST: iot_button_get_event 8
I (11206) TEST: iot_button_get_event 8
I (11236) TEST: iot_button_get_event 8
I (11276) TEST: iot_button_get_event 8
I (11306) TEST: iot_button_get_event 8
I (11346) TEST: iot_button_get_event 8
I (11376) TEST: iot_button_get_event 8
I (11416) TEST: iot_button_get_event 8
I (11446) TEST: iot_button_get_event 8
I (11486) TEST: iot_button_get_event 8
I (11516) TEST: iot_button_get_event 8
I (11556) TEST: iot_button_get_event 8
I (11586) TEST: iot_button_get_event 1
I (12356) TEST: iot_button_get_event 0
I (12396) TEST: iot_button_get_event 0
I (12426) TEST: iot_button_get_event 0
I (12466) TEST: iot_button_get_event 1
I (12496) TEST: iot_button_get_event 1
I (12536) TEST: iot_button_get_event 1
I (12566) TEST: iot_button_get_event 1
I (12606) TEST: iot_button_get_event 2
I (12636) TEST: iot_button_get_event 2
I (12676) TEST: iot_button_get_event 2
I (12706) TEST: iot_button_get_event 1
I (12746) TEST: iot_button_get_event 1
I (12776) TEST: iot_button_get_event 1
I (12816) TEST: iot_button_get_event 1
I (12846) TEST: iot_button_get_event 1
I (13936) TEST: iot_button_get_event 0
I (13966) TEST: iot_button_get_event 0
I (14006) TEST: iot_button_get_event 0
I (14036) TEST: iot_button_get_event 0
I (14076) TEST: iot_button_get_event 1
I (14106) TEST: iot_button_get_event 1
I (14146) TEST: iot_button_get_event 1
I (14176) TEST: iot_button_get_event 2
I (14216) TEST: iot_button_get_event 2
I (14246) TEST: iot_button_get_event 2
I (14286) TEST: iot_button_get_event 1
I (14316) TEST: iot_button_get_event 1
I (14356) TEST: iot_button_get_event 1
I (14386) TEST: iot_button_get_event 1
I (14426) TEST: iot_button_get_event 1
I (15196) TEST: iot_button_get_event 0
I (15226) TEST: iot_button_get_event 0
I (15266) TEST: iot_button_get_event 0
I (15296) TEST: iot_button_get_event 0
I (15336) TEST: iot_button_get_event 0
I (15366) TEST: iot_button_get_event 0
I (15406) TEST: iot_button_get_event 0
I (15436) TEST: iot_button_get_event 0
I (15476) TEST: iot_button_get_event 0
I (15506) TEST: iot_button_get_event 0
I (15546) TEST: iot_button_get_event 0
I (15576) TEST: iot_button_get_event 0
I (15616) TEST: iot_button_get_event 0
I (15646) TEST: iot_button_get_event 0
I (15686) TEST: iot_button_get_event 0
I (15716) TEST: iot_button_get_event 0
I (15756) TEST: iot_button_get_event 0
I (15786) TEST: iot_button_get_event 0
I (15826) TEST: iot_button_get_event 0
I (15856) TEST: iot_button_get_event 0
I (15896) TEST: iot_button_get_event 0
I (15926) TEST: iot_button_get_event 0
I (15966) TEST: iot_button_get_event 0
I (15996) TEST: iot_button_get_event 0
I (16036) TEST: iot_button_get_event 0
I (16066) TEST: iot_button_get_event 0
I (16106) TEST: iot_button_get_event 0
I (16136) TEST: iot_button_get_event 0
I (16176) TEST: iot_button_get_event 0
I (16206) TEST: iot_button_get_event 0
I (16246) TEST: iot_button_get_event 0
I (16276) TEST: iot_button_get_event 0
I (16316) TEST: iot_button_get_event 0
I (16346) TEST: iot_button_get_event 0
I (16386) TEST: iot_button_get_event 1
I (16416) TEST: iot_button_get_event 1
I (16456) TEST: iot_button_get_event 1
I (16486) TEST: iot_button_get_event 1
I (16526) TEST: iot_button_get_event 1
I (17156) TEST: iot_button_get_event 0
I (17186) TEST: iot_button_get_event 0
I (17226) TEST: iot_button_get_event 0
I (17256) TEST: iot_button_get_event 1
I (17296) TEST: iot_button_get_event 1
I (17326) TEST: iot_button_get_event 1
I (17366) TEST: iot_button_get_event 2
I (17396) TEST: iot_button_get_event 2
I (17436) TEST: iot_button_get_event 2
I (17466) TEST: iot_button_get_event 1
I (17506) TEST: iot_button_get_event 1
I (17536) TEST: iot_button_get_event 1
I (17576) TEST: iot_button_get_event 1
I (17606) TEST: iot_button_get_event 1
I (17956) TEST: iot_button_get_event 0
I (17996) TEST: iot_button_get_event 0
I (18026) TEST: iot_button_get_event 0
I (18066) TEST: iot_button_get_event 0
I (18096) TEST: iot_button_get_event 0
I (18136) TEST: iot_button_get_event 0
I (18166) TEST: iot_button_get_event 0
I (18206) TEST: iot_button_get_event 0
I (18236) TEST: iot_button_get_event 0
I (18276) TEST: iot_button_get_event 0
I (18306) TEST: iot_button_get_event 0
I (18346) TEST: iot_button_get_event 0
I (18376) TEST: iot_button_get_event 0
I (18416) TEST: iot_button_get_event 0
I (18446) TEST: iot_button_get_event 0
I (18486) TEST: iot_button_get_event 0
I (18516) TEST: iot_button_get_event 0
I (18556) TEST: iot_button_get_event 0
I (18586) TEST: iot_button_get_event 0
I (18626) TEST: iot_button_get_event 0
I (18656) TEST: iot_button_get_event 0
I (18696) TEST: iot_button_get_event 0
I (18726) TEST: iot_button_get_event 0
I (18766) TEST: iot_button_get_event 0
I (18796) TEST: iot_button_get_event 0
I (18836) TEST: iot_button_get_event 0
I (18866) TEST: iot_button_get_event 0
I (18906) TEST: iot_button_get_event 0
I (18936) TEST: iot_button_get_event 0
I (18976) TEST: iot_button_get_event 0
I (19006) TEST: iot_button_get_event 0
I (19046) TEST: iot_button_get_event 0
I (19076) TEST: iot_button_get_event 0
I (19116) TEST: iot_button_get_event 0
I (19146) TEST: iot_button_get_event 0
I (19186) TEST: iot_button_get_event 0
I (19216) TEST: iot_button_get_event 0
I (19256) TEST: iot_button_get_event 0
I (19286) TEST: iot_button_get_event 0
I (19326) TEST: iot_button_get_event 0
I (19356) TEST: iot_button_get_event 1
I (19396) TEST: iot_button_get_event 1
I (19426) TEST: iot_button_get_event 1
I (19466) TEST: iot_button_get_event 1
I (19496) TEST: iot_button_get_event 1
I (19606) TEST: iot_button_get_event 0
I (19636) TEST: iot_button_get_event 0
I (19676) TEST: iot_button_get_event 1
I (19706) TEST: iot_button_get_event 1
I (19746) TEST: iot_button_get_event 1
I (19776) TEST: iot_button_get_event 2
I (19816) TEST: iot_button_get_event 2
I (19846) TEST: iot_button_get_event 2
I (19886) TEST: iot_button_get_event 1
I (19916) TEST: iot_button_get_event 1
I (19956) TEST: iot_button_get_event 1
I (19986) TEST: iot_button_get_event 1
I (20026) TEST: iot_button_get_event 1
I (21106) TEST: iot_button_get_event 0
I (21146) TEST: iot_button_get_event 0
I (21176) TEST: iot_button_get_event 0
I (21216) TEST: iot_button_get_event 0
I (21246) TEST: iot_button_get_event 0
I (21286) TEST: iot_button_get_event 0
I (21316) TEST: iot_button_get_event 0
I (21356) TEST: iot_button_get_event 0
I (21386) TEST: iot_button_get_event 0
I (21426) TEST: iot_button_get_event 0
I (21456) TEST: iot_button_get_event 0
I (21496) TEST: iot_button_get_event 0
I (21526) TEST: iot_button_get_event 0
I (21566) TEST: iot_button_get_event 0
I (21596) TEST: iot_button_get_event 0
I (21636) TEST: iot_button_get_event 0
I (21666) TEST: iot_button_get_event 0
I (21706) TEST: iot_button_get_event 0
I (21736) TEST: iot_button_get_event 0
I (21776) TEST: iot_button_get_event 0
I (21806) TEST: iot_button_get_event 0
I (21846) TEST: iot_button_get_event 0
I (21876) TEST: iot_button_get_event 0
I (21916) TEST: iot_button_get_event 0
I (21946) TEST: iot_button_get_event 0
I (21986) TEST: iot_button_get_event 0
I (22016) TEST: iot_button_get_event 0
I (22056) TEST: iot_button_get_event 0
I (22086) TEST: iot_button_get_event 0
I (22126) TEST: iot_button_get_event 0
I (22156) TEST: iot_button_get_event 0
I (22196) TEST: iot_button_get_event 0
I (22226) TEST: iot_button_get_event 1
I (22266) TEST: iot_button_get_event 1
I (22296) TEST: iot_button_get_event 1
I (22336) TEST: iot_button_get_event 1
I (22366) TEST: iot_button_get_event 1
I (22406) TEST: iot_button_get_event 1
I (22476) TEST: iot_button_get_event 0
I (22506) TEST: iot_button_get_event 0
I (22546) TEST: iot_button_get_event 0
I (22576) TEST: iot_button_get_event 1
I (22616) TEST: iot_button_get_event 1
I (22646) TEST: iot_button_get_event 2
I (22686) TEST: iot_button_get_event 2
I (22716) TEST: iot_button_get_event 1
I (22756) TEST: iot_button_get_event 1
I (22786) TEST: iot_button_get_event 2
I (22826) TEST: iot_button_get_event 2
I (22856) TEST: iot_button_get_event 1
I (22896) TEST: iot_button_get_event 1
I (22926) TEST: iot_button_get_event 1
I (22966) TEST: iot_button_get_event 1
I (22996) TEST: iot_button_get_event 1
I (23106) TEST: iot_button_get_event 0
I (23136) TEST: iot_button_get_event 0
I (23176) TEST: iot_button_get_event 1
I (23206) TEST: iot_button_get_event 1
I (23246) TEST: iot_button_get_event 1
I (23276) TEST: iot_button_get_event 2
I (23316) TEST: iot_button_get_event 2
I (23346) TEST: iot_button_get_event 1
I (23386) TEST: iot_button_get_event 1
I (23416) TEST: iot_button_get_event 1
I (23456) TEST: iot_button_get_event 1
I (23486) TEST: iot_button_get_event 1
I (23596) TEST: iot_button_get_event 0
I (23626) TEST: iot_button_get_event 0
I (23666) TEST: iot_button_get_event 1
I (23696) TEST: iot_button_get_event 1
I (23736) TEST: iot_button_get_event 1
I (23766) TEST: iot_button_get_event 2
I (23806) TEST: iot_button_get_event 2
I (23836) TEST: iot_button_get_event 1
I (23876) TEST: iot_button_get_event 1
I (23906) TEST: iot_button_get_event 1
I (23946) TEST: iot_button_get_event 2
I (23976) TEST: iot_button_get_event 2
I (24016) TEST: iot_button_get_event 1
I (24046) TEST: iot_button_get_event 1
I (24086) TEST: iot_button_get_event 1
I (24116) TEST: iot_button_get_event 2
I (24156) TEST: iot_button_get_event 2
I (24186) TEST: iot_button_get_event 1
I (24226) TEST: iot_button_get_event 1
I (24256) TEST: iot_button_get_event 1
I (24296) TEST: iot_button_get_event 2
I (24326) TEST: iot_button_get_event 2
I (24366) TEST: iot_button_get_event 1
I (24396) TEST: iot_button_get_event 1
I (24436) TEST: iot_button_get_event 2
I (24466) TEST: iot_button_get_event 2
I (24506) TEST: iot_button_get_event 2
I (24536) TEST: iot_button_get_event 1
I (24576) TEST: iot_button_get_event 1
I (24606) TEST: iot_button_get_event 1
I (24646) TEST: iot_button_get_event 1
I (24676) TEST: iot_button_get_event 1

Build Logs.

No response

More Information.

我还使用MacOS构建代码,同样的效果

我测试了这个,确实是这样,原因是单击和双击的事件很快会被 BUTTON_PRESS_REPEAT_DONE 事件给覆盖掉。

轮询的方式确实会丢事件,这个是不可避免的,建议使用 iot_button_register_cb 接口,通过软件回调去做

image

没有轮询到 BUTTON_SINGLE_CLICK 事件

我测试这个,确实是这样,既然单击并且双击的事件很快会被 BUTTON_PRESS_REPEAT_DONE 事件给覆盖掉。

轮询方式实例会丢失事件,这个是核心,建议使用iot_button_register_cb接口,通过软件回调函数

你确定是被覆盖掉了吗?我觉得根本没有发送这个事件,我尝试了一个周末都没有任何一次获得BUTTON_SINGLE_CLICK 事件;

我在lvgl中作为输入设备使用,如果使用iot_button_register_cb的话我就得实现button和lv_indev_cb两个回调函数,这样显得过于复杂。不过如你建议,我正在参考esp的官方代码进行iot_button_register_cb的测试;

但是,如果可以直接在lv_indev的read_cb中直接获取iot_button的事件,那最好不过了。

如果在lvgl中使用iot_button,我觉得会过于复杂,如果有多个按键,就会更繁琐,我看了官方相关代码,都很复杂,不像单纯使用gpio实现的按键那么简单。

iot_button需要对不同按键的GPIO分别创建button,并且对每个按键的不同事件注册和实现回调函数,这确实太复杂了。

我现在的做法是,将iot_botton的单击,双击,长按等事件在lv_indev_read_cb中映射到LV_KEY_XXXX(也就是LVGL支持的某个按键的单击事件),然后在lvgl的obj事件中处理LVGL的事件就可以了。但是我无法获取到我需要的BUTTON_SINGLE_CLICK,BUTTON_DOUBLE_CLICK事件。

我觉得这样才是对LVGL最友好的做法,不知道你怎么认为?

single click 确实是被覆盖掉了。可以参考这个组件的实现 https://github.dev/bienxanh1901/esp-bsp/tree/master/components/esp_lvgl_port 函数 lvgl_port_add_navigation_buttons

通过 button 的事件回调修改掉一个全局变量,然后再 lvgl 的轮询回调中处理这个全局变量。

可以了