murphyzhao / FlexibleButton

灵活的按键处理库(Flexible Button)| 按键驱动 | 支持单击、双击、连击、长按、自动消抖 | 灵活适配中断和低功耗 | 按需实现组合按键
Apache License 2.0
664 stars 283 forks source link

按下事件<FLEX_BTN_PRESS_DOWN>的防抖 #22

Closed orange2348 closed 3 years ago

orange2348 commented 3 years ago

@murphyzhao 你好,有一个疑问想请教下,关于按下事件的检测部分我看了好像没有防抖的设计,从代码实现上,只要检测按键按下就立即返回事件,是否应该检测到按键在按下状态持续一段时间后再报按下事件?

murphyzhao commented 3 years ago

@orange2348 设计上,通过多次扫描才判断出一个按键事件,扫描间隙已经相当于消抖了,您可以测试下,谢谢

orange2348 commented 3 years ago

FLEX_BTN_PRESS_DOWN是BTN_IS_PRESSED(i)判断为真后就发出的事件,

case FLEX_BTN_STAGE_DEFAULT: /* stage: default(button up) */
            if (BTN_IS_PRESSED(i)) /* is pressed */
            {
                target->scan_cnt = 0;
                target->click_cnt = 0;

                EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_DOWN);

BTN_IS_PRESSED的宏定义如下:

#define BTN_IS_PRESSED(i) (g_btn_status_reg & (1 << i))

也就是g_btn_status_reg对应的按键位为真后,其就立即发出按键按下事件。 再向前推,g_btn_status_reg在调用flex_button_read后更新

    for(target = btn_head, i = button_cnt - 1;
        (target != NULL) && (target->usr_button_read != NULL);
        target = target->next, i--)
    {
        raw_data = raw_data | ((target->usr_button_read)(target) << i);
    }

    g_btn_status_reg = (~raw_data) ^ g_logic_level;

如果usr_button_read读取到误触发按键,g_btn_status_reg对应的位会被置位,从而导致触发事件。

其他的事件是多次扫描得出,但是这个FLEX_BTN_PRESS_DOWN比较特殊,应该是只需要扫描一次就可以得到,请确认下呢?

murphyzhao commented 3 years ago

可以加一个自定义时间的按键消抖配置,方便在出现这样问题的时候进行适配。

后面我项目忙完了才有充足的时间考虑这个,如果您有好的改进策略,欢迎提交代码 :blush: 。

orange2348 commented 3 years ago

原有的代码里面已经有debounce_tick,但是功能没有实现,目前我是使用这个在检测按下事件前进行查询判断。