查看原文
其他

Button_drive与rtpkgs内测

杰杰 物联网IoT开发 2022-09-10

前言

前几天写了个按键驱动,参考了MulitButton的数据结构的用法,逻辑实现并不一样。
在这里感谢所有的开源开发者,让我从中学到了很多,同时网络也是一个好平台,也希望所有的开发者能形成良性循环,从网络中学知识,回馈到网络中去。感谢MulitButton的作者0x1abin,感谢两位rtt的大佬:大法师流光

Button_drive简介

Button_drive是一个小巧的按键驱动,支持单击、双击、长按、连续触发等(后续可以在按键控制块中添加触发事件),理论上可无限量扩展Button,Button_drive采用按键触发事件回调方式处理业务逻辑,支持在RTOS中使用,我目前仅在RT-Thread上测试过。

Button_drive使用效果

单击与长按

单击与长按

双击

双击

连击

连击

使用方法

  1. 创建按键句柄

1Button_t Button1;
2Button_t Button2; 
  1. 创建按键,初始化按键信息,包括按键名字、按键电平检测函数接口、按键触发电平。

1  Button_Create("Button1",                //按键名字
2                &Button1,                 //按键句柄
3                Read_Button1_Level,     //按键电平检测函数接口
4                BTN_TRIGGER);            //触发电平
5
6                ......
  1. 按键触发事件与事件回调函数链接映射,当按键事件被触发的时候,自动跳转回调函数中处理业务逻辑。

1  Button_Attach(&Button1,BUTTON_DOWM,Btn2_Dowm_CallBack);        //按键单击
2  Button_Attach(&Button1,BUTTON_DOUBLE,Btn2_Double_CallBack);    //双击
3  Button_Attach(&Button1,BUTTON_LONG,Btn2_Long_CallBack);        //长按
4
5                .......
  1. 周期调用回调按键处理函数即可,建议调用周期20-50ms。

1Button_Process();     //需要周期调用按键处理函数

需要用户实现的 2 个函数:

  • 按键电平检测接口:

1uint8_t Read_Button1_Level(void)
2{
3  return GPIO_ReadInputDataBit(BTN1_GPIO_PORT,BTN1_GPIO_PIN);
4}
5
6uint8_t Read_Button2_Level(void)
7{
8  return GPIO_ReadInputDataBit(BTN2_GPIO_PORT,BTN2_GPIO_PIN);
9}
10
11// 这是我在stm32上简单测试的伪代码,以实际源码为准
  • 按键逻辑处理

1void Btn1_Dowm_CallBack(void *btn)
2
{
3  PRINT_INFO("Button1 单击!");
4}
5
6void Btn1_Double_CallBack(void *btn)
7
{
8  PRINT_INFO("Button1 双击!");
9}
10
11void Btn1_Long_CallBack(void *btn)
12
{
13  PRINT_INFO("Button1 长按!");
14
15  Button_Delete(&Button2);
16  PRINT_INFO("删除Button1");
17  Search_Button();
18}

特点

Button_drive开放源码,按键控制块采用数据结构方式,按键事件采用枚举类型,确保不会重复,也便于添加用户需要逻辑,采用宏定义方式定义消抖时间、连按触发时间、双击时间间隔、长按时间等,便于修改。
同时所有被创建的按键采用单链表方式连击,用户只管创建,无需理会按键处理,只需调用Button_Process()即可,在函数中会自动遍历所有被创建的按键。
支持按键删除操作,用户无需在代码中删除对应的按键创建于映射链接代码,也无需删除关于按键的任何回调事件处理函数,只需调用Button_Delete()函数即可,这样子,就不会处理关于被删除按键的任何状态。当然目前按键内存不会释放,如果使用os的话,建议释放按键内存。

ps:所有源码用c实现,全局变量采用驼峰命名法+下划线法,局部变量采用下划线法命名

按键控制块
1/*
2    每个按键对应1个全局的结构体变量。
3    其成员变量是实现消抖和多种按键状态所必须的
4*/

5typedef struct button
6{

7  /* 下面是一个函数指针,指向判断按键手否按下的函数 */
8  uint8_t (*Read_Button_Level)(void); /* 读取按键电平函数,需要用户实现 */
9
10  char Name[BTN_NAME_MAX];
11
12  uint8_t Button_Trigger_Event      :   3;      /* 按键触发事件,单击,双击,长按等 */
13  uint8_t Button_State              :   3;      /* 按键当前状态(按下还是弹起) */
14  uint8_t Button_Trigger_Level      :   1;    /* 按键触发电平 */
15  uint8_t Button_Last_Level         :   1;    /* 按键当前电平 */
16
17  uint8_t Button_Last_State;      /* 上一次的按键状态,用于判断双击 */
18
19  Button_CallBack CallBack_Function[number_of_event];
20
21  uint8_t Button_Cycle;               /* 连续按键周期 */
22
23  uint8_t Timer_Count;            /* 计时 */
24  uint8_t Debounce_Time;        /* 消抖时间 */
25
26  uint8_t Long_Time;          /* 按键按下持续时间 */
27
28  struct button *Next;
29
30}Button_t;
触发事件
1typedef enum {
2  BUTTON_DOWM = 0,
3  BUTTON_UP,
4  BUTTON_DOUBLE,
5  BUTTON_LONG,
6  BUTTON_ALL_RIGGER,
7  number_of_event, /* 触发回调的事件 */
8  NONE_TRIGGER
9}Button_Event;

后续

流光大佬的要求,让我玩一玩RTT的rtkpgs,打算用Button_drive练一练手吧。

关于rtkpgs

buildpkg 是用于生成 RT-Thread package 的快速构建工具。

一个优秀的 package 应该是这样的:

  1. 代码优雅, 规范化。

  2. examples 例程,提供通俗易懂的使用例程。

  3. SConscript 文件,用于和 RT-Thread 环境一起进行编译。

  4. README.md 文档,向用户提供必要的功能说明。

  5. docs 文件夹, 放置除了 README 之外的其他细节文档。

  6. license 许可文件,版权说明。

为了方便快速的生成 RT-Thread package 规范化模板 以及 减轻开源仓库迁移 RT-Thread 的前期准备工作的负担,基于此目的的 buildpkg 应运而生,为开发 Rt-Thread 的 package 的开发者提供辅助开发工具。

序号支持功能描述
1构建 package 模板创建指定名称 package , 自动添加 readme /版本号/ github ci脚本/demo/开源协议文件
2迁移开源仓库从指定 git 仓库构建 package , 自动添加readme/版本号/ github ci脚本/demo/开源协议文件, 但是迁移的仓库需要用户自己按照实际情况修改
3更新 package生成package后可以再次更新之前设定的版本号,开源协议或者scons脚本等

使用说明

1. 构建package

buildpkg.exe make pkgdemo

2. 迁移开源仓库

buildpkg.exe make cstring https://github.com/liu2guang/cstring.git

3. 更新package

buildpkg.exe update pkgname

4. 可选配置

长参数短参数描述
--version=v1.0.0-v v1.0.0设置 package 的版本
--license=MIT-l MIT设置 package 所遵循的版权协议
--submodule-s删除 git 子模块

如果你对Button_drivertpkgs感兴趣,欢迎加入内测群聊获取源码与讨论:

ps:能分享出去更好!


杰杰:

创客飞梦空间是开源公众号

如果喜欢我的文章,那就关注我吧

也欢迎大家投稿



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存