修复bug:FlexibleButton id相反问题

这篇具有很好参考价值的文章主要介绍了修复bug:FlexibleButton id相反问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

版本:https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1

问题现象

问题描述

查源码!

注册

读按键

按键处理

小结


版本:https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1

问题现象

static uint8_t common_btn_read(void *arg)
static void common_btn_evt_cb(void *arg)

这两个用户代码中的ID是相反的

问题描述

typedef enum
{
    USER_BUTTON_1 = 0,
    USER_BUTTON_2,
    USER_BUTTON_3,
//    USER_BUTTON_4,
    USER_BUTTON_MAX
} user_button_t;
    case USER_BUTTON_1:
        value = PEin(6);
        break;
    case USER_BUTTON_2:
        value = PCin(7);
        break;
    case USER_BUTTON_3:
        value = PEin(5);
        break;
static void common_btn_evt_cb(void *arg)
{
    flex_button_t *btn = (flex_button_t *)arg;

    DEBUG("id: [%d - %s]  event: [%d - %30s]  repeat: %d\r\n", 
        btn->id, enum_btn_id_string[btn->id],
        btn->event, enum_event_string[btn->event],
        btn->click_cnt);
}

正常逻辑 再回调 id = 0的时候应该对应的是 USER_BUTTON_1 (PE6)

实际测试的情况是 id = 0的时候应该对应的是 USER_BUTTON_3 (PE5)

顺序正好是逆序。其他功能都是正常的,虽然能用但是非常不爽。

查源码!

注册

static void user_button_init(void)
{
    int i;


    memset(&user_button[0], 0x0, sizeof(user_button));
   
    for (i = 0; i < USER_BUTTON_MAX; i ++)
    {
        user_button[i].id = i;
        user_button[i].usr_button_read = common_btn_read;
        user_button[i].cb = common_btn_evt_cb;
        user_button[i].pressed_logic_level = 0;
        user_button[i].short_press_start_tick = FLEX_MS_TO_SCAN_CNT(1500);
        user_button[i].long_press_start_tick = FLEX_MS_TO_SCAN_CNT(3000);
        user_button[i].long_hold_start_tick = FLEX_MS_TO_SCAN_CNT(4500);

        flex_button_register(&user_button[i]);
    }
}
    /**
     * First registered button is at the end of the 'linked list'.
     * btn_head points to the head of the 'linked list'.
    */
    button->next = btn_head;
    button->status = FLEX_BTN_STAGE_DEFAULT;
    button->event = FLEX_BTN_PRESS_NONE;
    button->scan_cnt = 0;
    button->click_cnt = 0;
    button->max_multiple_clicks_interval = MAX_MULTIPLE_CLICKS_INTERVAL;
    btn_head = button;

可以看到原作者这里使用了链表,如下图

修复bug:FlexibleButton id相反问题

读按键

/**
 * @brief Read all key values in one scan cycle
 * 
 * @param void
 * @return none
*/
static void flex_button_read(void)
{
    uint8_t i;
    flex_button_t* target;

    /* The button that was registered first, the button value is in the low position of raw_data */
    btn_type_t raw_data = 0;

    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;
}

重点看这里面的i;

原作者使用了一个32位的变量存放按键值,每个bit对应一个按键值;

typedef uint32_t btn_type_t;

修复bug:FlexibleButton id相反问题读代码里面是这样对应的。

按键处理

/**
 * @brief Handle all key events in one scan cycle.
 *        Must be used after 'flex_button_read' API
 * 
 * @param void
 * @return none
*/
static void flex_button_process(void)
{
    uint8_t i;
    flex_button_t* target;

//    for (target = btn_head, i = 0; target != NULL; target = target->next, i ++)
		for (target = btn_head, i = button_cnt - 1; target != NULL; target = target->next, i--)
    {
        if (target->status > FLEX_BTN_STAGE_DEFAULT)
        {
            target->scan_cnt ++;
            if (target->scan_cnt >= ((1 << (sizeof(target->scan_cnt) * 8)) - 1))
            {
                target->scan_cnt = target->long_hold_start_tick;
            }
        }

        switch (target->status)
        {
        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);

                /* swtich to button down stage */
                target->status = FLEX_BTN_STAGE_DOWN;
            }
            else
            {
                target->event = FLEX_BTN_PRESS_NONE;
            }
            break;

        case FLEX_BTN_STAGE_DOWN: /* stage: button down */
            if (BTN_IS_PRESSED(i)) /* is pressed */
            {
                if (target->click_cnt > 0) /* multiple click */
                {
                    if (target->scan_cnt > target->max_multiple_clicks_interval)
                    {
                        EVENT_SET_AND_EXEC_CB(target, 
                            target->click_cnt < FLEX_BTN_PRESS_REPEAT_CLICK ? 
                                target->click_cnt :
                                FLEX_BTN_PRESS_REPEAT_CLICK);

                        /* swtich to button down stage */
                        target->status = FLEX_BTN_STAGE_DOWN;
                        target->scan_cnt = 0;
                        target->click_cnt = 0;
                    }
                }
                else if (target->scan_cnt >= target->long_hold_start_tick)
                {
                    if (target->event != FLEX_BTN_PRESS_LONG_HOLD)
                    {
                        EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_LONG_HOLD);
                    }
                }
                else if (target->scan_cnt >= target->long_press_start_tick)
                {
                    if (target->event != FLEX_BTN_PRESS_LONG_START)
                    {
                        EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_LONG_START);
                    }
                }
                else if (target->scan_cnt >= target->short_press_start_tick)
                {
                    if (target->event != FLEX_BTN_PRESS_SHORT_START)
                    {
                        EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_SHORT_START);
                    }
                }
            }
            else /* button up */
            {
                if (target->scan_cnt >= target->long_hold_start_tick)
                {
                    EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_LONG_HOLD_UP);
                    target->status = FLEX_BTN_STAGE_DEFAULT;
                }
                else if (target->scan_cnt >= target->long_press_start_tick)
                {
                    EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_LONG_UP);
                    target->status = FLEX_BTN_STAGE_DEFAULT;
                }
                else if (target->scan_cnt >= target->short_press_start_tick)
                {
                    EVENT_SET_AND_EXEC_CB(target, FLEX_BTN_PRESS_SHORT_UP);
                    target->status = FLEX_BTN_STAGE_DEFAULT;
                }
                else
                {
                    /* swtich to multiple click stage */
                    target->status = FLEX_BTN_STAGE_MULTIPLE_CLICK;
                    target->click_cnt ++;
                }
            }
            break;

        case FLEX_BTN_STAGE_MULTIPLE_CLICK: /* stage: multiple click */
            if (BTN_IS_PRESSED(i)) /* is pressed */
            {
                /* swtich to button down stage */
                target->status = FLEX_BTN_STAGE_DOWN;
                target->scan_cnt = 0;
            }
            else
            {
                if (target->scan_cnt > target->max_multiple_clicks_interval)
                {
                    EVENT_SET_AND_EXEC_CB(target, 
                        target->click_cnt < FLEX_BTN_PRESS_REPEAT_CLICK ? 
                            target->click_cnt :
                            FLEX_BTN_PRESS_REPEAT_CLICK);

                    /* swtich to default stage */
                    target->status = FLEX_BTN_STAGE_DEFAULT;
                }
            }
            break;
        }
    }
}

注释掉的部分是源代码,下面是我修改之后的代码。 

这里也是重点看“i”。

在遍历链表的时候,

BTN_IS_PRESSED(i)

原作者代码的i对应关系是,USER_BUTTON_3的链表使用了USER_BUTTON_1 引脚读取到的值。

那我们只要按照我上面给出的代码修改之后对应关系就正常了。

小结

原作者写的这份代码非常优秀,无论是实现的功能/可以执行都比我高出很多。具体就是在数据结构设计的时候我目前为止没有设计过带链表的数据结构,作者再这里面通过链表实现这些功能真的巧妙。文章来源地址https://www.toymoban.com/news/detail-441903.html

到了这里,关于修复bug:FlexibleButton id相反问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 修复uni-simple-router@2.0.7版本query参数null的bug

    问题:query参数为null或者为空时,插件内部参数校验问题导致的会报错:TypeError: Cannot convert undefined or null to object at Function.keys 源码修改如下: 通过打补丁的方式修复query参数类型校验问题 1. 安装patch-package 2、修改依赖包 已经修复的uni-simple-router@2.0.7版本:https://github.com/dr

    2024年01月18日
    浏览(44)
  • 日常BUG——使用Long类型作id,后端返回给前段后精度丢失问题

    😜 作           者 :是江迪呀 ✒️ 本文 : 日常BUG 、 BUG 、 问题分析 ☀️ 每日   一言 : 存在错误说明你在进步! 数据库long类型Id: 前端返回的Id实体类: 前端拿到的Id: 这是因为使用Long类型作id时,前后端交互时数据在网络上传输会导致精度丢失。 在返回给前

    2024年02月13日
    浏览(40)
  • 【python修复bug】—— HTTP_2 网站超时问题的解决方案

    在进行网络数据爬取时,使用 Python 程序访问支持 HTTP/2 协议的网站时,有时会遇到超时问题。这可能会导致数据获取不完整,影响爬虫程序的正常运行。 问题描述 在实际操作中,当使用 Python 编写的爬虫程序访问支持 HTTP/2 协议的网站时,可能会遇到超时异常。即使尝试强制

    2024年01月18日
    浏览(38)
  • Curl多线程https访问,崩溃问题修复

    Curl: ��: SSL and multithread crash on windows, how to use mutex on windows? SSL and multithread crash on windows, how to use mutex on windows? From: mao mao lmjrd_at_hotmail.com Date: Fri, 25 Nov 2016 09:50:48 +0000 Thankyou Thomas and Johan both to Johan: how to use these two functions openssl_crypto_locking_callback openssl_crypto_init_locks when star

    2024年02月03日
    浏览(38)
  • Ubuntu 22.04 突然失去网络图标,无法ping通等网络消失问题。bug修复

    目前主流解决方案如下, But! 在我的解决过程中完全失效,固参考一位知乎方案遂解决。 在VM虚拟机上搭建的Ubuntu22.04网络图标突然消失无法联网解决方法 注:这个是我参考的主流方案,解决失败的过程,但也有很多人因此成功,大家可以自行尝试 关闭NetworkManager 修改Net

    2024年01月21日
    浏览(64)
  • k8s 1.28版本:使用StorageClass动态创建PV,SelfLink 问题修复

       k8s中提供了一套自动创建 PV 的机制,就是基于 StorageClass 进行的 ,通过 StorageClass 可以实现仅仅配置 PVC,然后交由 StorageClass 根据 PVC 的需求动态创建 PV。 问题:   使用 k8s 1.28版本,通过 kubectl get pvc ,发现 PVC一直处于 Pending 状态。通过 kubectl describe pvc [pvc名称] 描述

    2024年02月08日
    浏览(43)
  • Git学习——修复bug

            场景:开发过程中大家都会自己创建一个自己的分支去工作,工作完成后将自己的分支合并到主路,但是在这个过程中,会出现bug,因此当我们正在分支工作的时候,却突然接到紧急任务修复bug,我们需要先保存我们当前分支的工作状态,然后去处理bug。 例如:现在

    2024年02月21日
    浏览(35)
  • Bug竞技场【已经修复】

    目录 1.基础知识 2.最佳组合 2.1 铁男-螳螂 2.2 弟弟组合 海克斯抽卡bug 背景:美测服-美服-马服-可以有效地减少bug率 复盘是为了更好的战斗! 提前观看一些视频资料也是如此。 通过看直播博主的经验,可以让你关注到本来对战的时候容易忽略的一些细节,了解到一些常见搭配

    2024年02月15日
    浏览(34)
  • Nginx漏洞修复之目录穿越(目录遍历)漏洞复现及修复

    前言 Nginx是一个高性能的HTTP和反向代理服务器,经常被做为反向代理,动态的部分被proxy_pass传递给后端端口,而静态文件需要Nginx来处理。 漏洞出现在服务器的静态文件中。如果静态文件存储在/home/目录下,而该目录在url中名字为files,那么就需要用alias设置目录的别名 。

    2024年02月04日
    浏览(41)
  • 记录--一行代码修复100vh bug

    你知道奇怪的移动视口错误(也称为100vh bug)吗?或者如何以正确的方式创建全屏块? 什么是移动视口错误? 你是否曾经在网页上创建过全屏元素?只需添加一行 CSS 并不难: 1vh是视口高度的1% ,正是我们所需要的。但当我们在移动设备上测试时,就会出现问题。移动浏览

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包