转自华为开发者社区:https://developer.huawei.com/consumer/cn/forum/topic/0204425948429750699?fid=0101303901040230869
背景在智能物联领域发展迅速的今天,对物联终端产品的小型化,低成本要求越来越苛刻,但产品的功能要求越来越丰富多样;同时,产品在终端使用,不可避免的需要支持用户配置,而按键作为最普遍的输入方式,被广泛用于各类产品中,但如何用最少的按键资源实现最多样的输入状态呢? 本文就基于Hihope的WIFI-IOT套件,介绍一种识别按键输入的实现方式,能够采集单按键或组合按键的短按、长按以及双击状态。 软件框架本模块在系统中属于中间层,具体介绍如下: hardware:硬件按键有动作后触发GPIO中断,CPU停止当前任务进入中断。 middleware:区分按键ID和识别按键事件。在中断上半部,处理中断,更新ID和上报按键动作,在下半部记录数据,识别按键事件,并上报系统和应用。application:使用按键事件。 软件流程如下: 特性说明按键驱动按键动作的触发采用边沿触发方式,这样能够采集按下和抬起动作,hi3861的GPIO中断只能配置下降沿或上升沿一种触发方式,两种都要响应需要在下降沿中断中重新配置中断触发方式为上升沿,在上升沿中断中重新配置中断触发方式为下降沿,这样就能够采集到下次的电平变化。 WIFI-IOT套件主板上的user键和OLED板上的S1和S2,都挂在GPIO05引脚上,通过按键按下时引脚上不同的电压值来区分,根据威廉希尔官方网站
和手册中的码值计算公式adc=V/4/1.8*4096,按键与电压与ADC码值的关系如下: 按键ID | 电压范围 | 码值范围 | 下限 | 上限 | 下限 | 上限 | user | 0.01 | 0.4 | 5 | 228 | S1 | 0.4 | 0.8 | 228 | 455 | S2 | 0.8 | 1.2 | 455 | 682 |
GPIO引脚在作为ADC通道复用时,GPIO中断依然能够触发(手册里面没有讲,但是实际测试可以的),所以可以在GPIO中断里采集ADC的值,用于区分不同的按键。 事件识别按键事件的识别,主要是依据按键高低电平变化和持续时间来判定,首先我们定义按键按下后抬起为一个事件单位,记录下一个事件单位内无按键按下当前高电平持续时间cur_h,有按键按下时开始记录当前低电平持续时间cur_l,按键抬起后,一个事件单位结束,将当前记录值cur值赋给上一次last,这样需要记录当前cur值,上一次last值和上上次last_last值,如下图: 单击事件判定条件: last_h大于双击事件中第一次抬起到第二次按下的时间T, cur_h也大于T(此条件用于区分双击),然后通过判断last_l的时间长短区分短按事件和长按事件。 双击事件判定条件: last_last_h大于T, last_last_l小于长按判定时间, last_h 小于T。 组合按键判定条件:事件的判别方法与单个按键一致,不同的是需要处理指定的多个按键关系,这里是将多个按键最后一个按下的动作作为组合按键的低电平开始时间,最早一个抬起动作作为组合按键的高电平开始时间。 移植指导移植本模块需要注意的地方: 按键对应的GPIO引脚号, 本模块适配了WIFI-IOT套件中的4个按键,分别是主板上的user键,OLED板上的S1和S2,彩灯板的user按键,按键信息如下,移植时需要根据硬件修改。 按键描述 | 按键ID | 引脚 | 码值范围 | 下限 | 上限 | 彩灯板的user按键 | USER1 | GPIO08 | - | - | 主控板user按键 | USER2 | GPIO05 | 5 | 228 | OLED板S1按键 | S1 | 228 | 455 | OLED板S2按键 | S2 | 455 | 682 |
应用使用按键时,并不是按照PCB丝印的名称定义的,一般是按照功能来定义,比如模式键、选择键、确认键、加减键等,根据具体每个按键的功能可以在定义里修改: 按键事件的上报在button_xxxx_pressed_check函数,此处调用是在软定时器中断处理函数中,注意不要将具体的应用功能放在此处实现,建议采用回调方式,通过系统的同步机制与其他模块交互。 问题与建议 鸿蒙系统内有多个编码风格,在写该特性时非常困惑,不知道要与那种风格保持一致,比如wifi_iot目录下提供的接口是大驼峰风格,hal目录下提供的接口又是linux风格,希望能提供开发指导,那一层该用什么编码风格保持统一。 本模块代码还有优化空间,比如是否可以不用软定时器,用系统tick记录按键电平时间,以减少系统资源占用;采用注册表来管理按键类型和上报接口,方便给应用提供统一的接口而不用关心模块内部实现等,也希望有兴趣的大牛能一起继续优化,为鸿蒙系统和人类进步尽微薄之力:)。
最后,帖子不能上传代码包,提供网盘链接如下: https://pan.baidu.com/s/18ZVboC0jPdHD1HIeGWB73A
|