Closed orange2348 closed 3 years ago
@orange2348 设计上,通过多次扫描才判断出一个按键事件,扫描间隙已经相当于消抖了,您可以测试下,谢谢
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比较特殊,应该是只需要扫描一次就可以得到,请确认下呢?
可以加一个自定义时间的按键消抖配置,方便在出现这样问题的时候进行适配。
后面我项目忙完了才有充足的时间考虑这个,如果您有好的改进策略,欢迎提交代码 :blush: 。
原有的代码里面已经有debounce_tick,但是功能没有实现,目前我是使用这个在检测按下事件前进行查询判断。
@murphyzhao 你好,有一个疑问想请教下,关于按下事件的检测部分我看了好像没有防抖的设计,从代码实现上,只要检测按键按下就立即返回事件,是否应该检测到按键在按下状态持续一段时间后再报按下事件?