Agile Button: Agile Button

Agile Button 1.1.1
A agile button package.
Agile Button

1、介绍

Agile Button 是基于 RT-Thread 实现的 button 软件包，提供 button 操作的 API。

  • 按键操作的状态变化为：未按下 ——> 按下 ——> 未按下。
  • 为了消除干扰，默认的消抖时间为 15ms，可以通过 agile_btn_set_elimination_time API 更改消抖时间。
  • 间隔在 500ms 内的连续操作，记为多次操作，更改对象的 repeat_cnt 属性，通过该属性可获取连续操作次数。
  • 在按下期间会计算对象的持续按下时间，可通过对象的 hold_time 属性获取。
____ __ __ ____
__| |__ ——> |____| ——> __| |__

Agile Button 提供了 4 种事件：

BTN_PRESS_DOWN_EVENT
BTN_HOLD_EVENT
BTN_PRESS_UP_EVENT
BTN_CLICK_EVENT
BTN_CLICK_EVENT
@ BTN_CLICK_EVENT
点击事件
Definition: agile_button.h:37
BTN_HOLD_EVENT
@ BTN_HOLD_EVENT
持续按下有效事件
Definition: agile_button.h:35
BTN_PRESS_DOWN_EVENT
@ BTN_PRESS_DOWN_EVENT
按下事件
Definition: agile_button.h:34
BTN_PRESS_UP_EVENT
@ BTN_PRESS_UP_EVENT
弹起事件
Definition: agile_button.h:36

可以通过 agile_btn_set_event_cb API 设置每个事件的触发回调。

  • BTN_PRESS_DOWN_EVENT

从 未按下 ——> 按下 触发一次。

____ __ __
__| |__ ——> |____|
  • BTN_HOLD_EVENT

一直处于按下状态，默认每隔 1s 触发一次，可以通过 agile_btn_set_hold_cycle_time API 更改触发周期。

__ __
|____|
  • BTN_PRESS_UP_EVENT

从 按下 ——> 未按下 触发一次。

__ __ ____
|____| ——> __| |__
  • BTN_CLICK_EVENT

一次完整的操作触发一次，即：未按下 ——> 按下 ——> 未按下。

**注意**：BTN_PRESS_UP_EVENT 也会被触发。

____ __ __ ____
__| |__ ——> |____| ——> __| |__

1.1、特性

  1. 代码简洁易懂，充分使用 RT-Thread 提供的 API
  2. 详细注释
  3. 线程安全
  4. 断言保护
  5. API 操作简单

1.2、目录结构

名称 | 说明
doc | 文档目录
examples | 例子目录
inc | 头文件目录
src | 源代码目录

1.3、许可证

Agile Button package 遵循 LGPLv2.1 许可，详见 LICENSE 文件。

1.4、依赖

  • RT-Thread 3.0+
  • RT-Thread 4.0+

2、如何打开 Agile Button

使用 Agile Button package 需要在 RT-Thread 的包管理器中选择它，具体路径如下：

RT-Thread online packages
peripheral libraries and drivers --->
[*] agile_button: A agile button package

然后让 RT-Thread 的包管理器自动更新，或者使用 pkgs --update 命令更新包到 BSP 中。

3、使用 Agile Button

  • 帮助文档请查看 doc/doxygen/Agile_Button.chm

如果未使能 PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT:

  1. agile_btn_env_init 初始化环境
  2. 创建一个线程，周期调用 agile_btn_process，建议周期时间不要太长
  • agile_btn_create / agile_btn_init 创建 / 初始化对象
  • agile_btn_set_elimination_time 更改消抖时间，可忽略

  • agile_btn_set_hold_cycle_time 更改持续按下触发周期时间，可忽略

    该操作也可在运行过程中执行

  • agile_btn_set_event_cb 设置事件触发回调
  • agile_btn_start 启动运行
  • agile_btn_stop 运行过程中强制停止

3.1、示例

使用示例在 examples 下。

3.2、Doxygen 文档生成

  • 使用 Doxywizard 打开 Doxyfile 运行，生成的文件在 doxygen/output 下。
  • 需要更改 Graphviz 路径。
  • HTML 生成未使用 chm 格式的，如果使能需要更改 hhc.exe 路径。

4、联系方式 & 感谢

  • 维护：马龙伟
  • 主页：https://github.com/loogg/agile_button
  • 邮箱：25440.nosp@m.4721.nosp@m.3@qq..nosp@m.com
制作者 doxygen 1.9.2


Agile Button: 更新记录

A agile button package.
更新记录

Agile Button 1.1.0 发布

新功能

2021-11-28：马龙伟

  • 增加 Doxygen 注释，生成文档
  • 增加静态初始化，不使用动态内存分配也可使用该软件包
  • 增加 PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT 配置，可自由决定是否自动创建线程

修改

2021-11-28：马龙伟

  • 修改变量定义为标准数据类型
  • 修改 example 代码, 引脚号从命令行输入
  • 修改静态变量命名

Agile Button 1.1.1 发布

修改

2021-12-29：马龙伟

  • 修改 API 注释
  • 完善文档
  • 修改 example


Agile Button: 示例说明

A agile button package.
示例说明

1、介绍

该示例提供动态创建和静态创建功能演示，需要 FINSH 的支持。请开启 FINSH 功能。

2、使用

2.1、动态创建

  • 创建对象并启动

    命令行输入 dbtn_create [pin] [active]

    pin: 引脚号，查看驱动中按键 IO 对应的引脚号

    active: 有效电平 1/0

  • 删除对象

    命令行输入 dbtn_delete

2.2、静态创建

  • 初始化对象并启动

    命令行输入 sbtn_init [pin] [active]

    pin: 引脚号，查看驱动中按键 IO 对应的引脚号

    active: 有效电平 1/0


Agile Button: 模块

A agile button package.
模块
这里列出了所有模块:
[详情级别 12]
Agile Button Exported Types
RT-Thread DBG Configuration
▼ Agile Button Thread Auto Init
Agile Button Thread Auto Init Configuration
Agile Button Thread Auto Init Functions
Agile Button Private Constants
Agile Button Private Macros
Agile Button Private Variables
Agile Button Private Functions
Agile Button Exported Functions


Agile Button: Agile Button Exported Types

A agile button package.
结构体 | 类型定义 | 枚举
Agile Button Exported Types

结构体

struct agile_btn
Agile Button 结构体 更多...

类型定义

typedef struct agile_btn agile_btn_t
Agile Button 结构体 更多...

枚举

enum agile_btn_event {
BTN_PRESS_DOWN_EVENT = 0 , BTN_HOLD_EVENT , BTN_PRESS_UP_EVENT , BTN_CLICK_EVENT ,
BTN_EVENT_SUM
}
Agile Button 对象事件 更多...
enum agile_btn_state {
BTN_STATE_NONE_PRESS = 0 , BTN_STATE_CHECK_PRESS , BTN_STATE_PRESS_DOWN , BTN_STATE_PRESS_HOLD ,
BTN_STATE_PRESS_UP
}
Agile Button 对象状态 更多...

详细描述

类型定义说明

◆ agile_btn_t

typedef struct agile_btn agile_btn_t

Agile Button 结构体

在文件 agile_button.h 第 52 行定义.

枚举类型说明

◆ agile_btn_event

enum agile_btn_event

Agile Button 对象事件

枚举值
BTN_PRESS_DOWN_EVENT | 按下事件
BTN_HOLD_EVENT | 持续按下有效事件
BTN_PRESS_UP_EVENT | 弹起事件
BTN_CLICK_EVENT | 点击事件
BTN_EVENT_SUM | 事件总数目

在文件 agile_button.h 第 33 行定义.

◆ agile_btn_state

enum agile_btn_state

Agile Button 对象状态

枚举值
BTN_STATE_NONE_PRESS | 未按下状态
BTN_STATE_CHECK_PRESS | 抖动检查状态
BTN_STATE_PRESS_DOWN | 按下状态
BTN_STATE_PRESS_HOLD | 持续按下状态
BTN_STATE_PRESS_UP | 弹起状态

在文件 agile_button.h 第 44 行定义.


Agile Button: agile_btn结构体 参考

A agile button package.
成员变量
agile_btn结构体 参考
Agile Button Exported Types

Agile Button 结构体 更多...

#include <agile_button.h>

成员变量

uint8_t | active
激活标志 更多...
uint8_t | repeat_cnt
按键重按计数 更多...
uint8_t | elimination_time
按键消抖时间(单位ms,默认15ms) 更多...
enum agile_btn_event | event
按键对象事件 更多...
enum agile_btn_state | state
按键对象状态 更多...
uint32_t | hold_time
按键按下持续时间(单位ms) 更多...
uint32_t | prev_hold_time
缓存 hold_time 变量 更多...
uint32_t | hold_cycle_time
按键按下后持续调用回调函数的周期(单位ms,默认1s) 更多...
uint32_t | pin
按键引脚 更多...
uint32_t | active_logic
有效电平(PIN_HIGH/PIN_LOW) 更多...
rt_tick_t | tick_timeout
超时时间 更多...
void(* | event_cb [BTN_EVENT_SUM])(agile_btn_t *btn)
按键对象事件回调函数 更多...
rt_slist_t | slist
单向链表节点 更多...

详细描述

Agile Button 结构体

在文件 agile_button.h 第 57 行定义.

结构体成员变量说明

◆ active

uint8_t agile_btn::active

激活标志

在文件 agile_button.h 第 58 行定义.

◆ active_logic

uint32_t agile_btn::active_logic

有效电平(PIN_HIGH/PIN_LOW)

在文件 agile_button.h 第 67 行定义.

◆ elimination_time

uint8_t agile_btn::elimination_time

按键消抖时间(单位ms,默认15ms)

在文件 agile_button.h 第 60 行定义.

◆ event

enum agile_btn_event agile_btn::event

按键对象事件

在文件 agile_button.h 第 61 行定义.

◆ event_cb

void(* agile_btn::event_cb[BTN_EVENT_SUM])(agile_btn_t *btn)

按键对象事件回调函数

在文件 agile_button.h 第 69 行定义.

◆ hold_cycle_time

uint32_t agile_btn::hold_cycle_time

按键按下后持续调用回调函数的周期(单位ms,默认1s)

在文件 agile_button.h 第 65 行定义.

◆ hold_time

uint32_t agile_btn::hold_time

按键按下持续时间(单位ms)

在文件 agile_button.h 第 63 行定义.

◆ pin

uint32_t agile_btn::pin

按键引脚

在文件 agile_button.h 第 66 行定义.

◆ prev_hold_time

uint32_t agile_btn::prev_hold_time

缓存 hold_time 变量

在文件 agile_button.h 第 64 行定义.

◆ repeat_cnt

uint8_t agile_btn::repeat_cnt

按键重按计数

在文件 agile_button.h 第 59 行定义.

◆ slist

rt_slist_t agile_btn::slist

单向链表节点

在文件 agile_button.h 第 70 行定义.

◆ state

enum agile_btn_state agile_btn::state

按键对象状态

在文件 agile_button.h 第 62 行定义.

◆ tick_timeout

rt_tick_t agile_btn::tick_timeout

超时时间

在文件 agile_button.h 第 68 行定义.

该结构体的文档由以下文件生成:
  • C:/Users/longwei.ma/Desktop/test/packages/agile_button/inc/agile_button.h


Agile Button: RT-Thread DBG Configuration

A agile button package.
RT-Thread DBG Configuration

RT-Thread DBG 功能配置

#define | DBG_ENABLE
#define | DBG_COLOR
#define | DBG_SECTION_NAME "agile_button"
#define | DBG_LEVEL DBG_INFO

详细描述

宏定义说明

◆ DBG_COLOR

#define DBG_COLOR

在文件 agile_button.c 第 41 行定义.

◆ DBG_ENABLE

#define DBG_ENABLE

在文件 agile_button.c 第 40 行定义.

◆ DBG_LEVEL

#define DBG_LEVEL DBG_INFO

在文件 agile_button.c 第 46 行定义.

◆ DBG_SECTION_NAME

#define DBG_SECTION_NAME "agile_button"

在文件 agile_button.c 第 42 行定义.


Agile Button: Agile Button Thread Auto Init

A agile button package.
模块
Agile Button Thread Auto Init
Agile Button Thread Auto Init 的协作图:

模块

Agile Button Thread Auto Init Configuration
Agile Button Thread Auto Init Functions

详细描述

制作者 doxygen 1.9.2


Agile Button: Agile Button Thread Auto Init Configuration

A agile button package.
Agile Button Thread Auto Init Configuration
Agile Button Thread Auto Init
Agile Button Thread Auto Init Configuration 的协作图:

Agile Button 自动初始化线程配置

#define | PKG_AGILE_BUTTON_THREAD_STACK_SIZE 256
Agile Button 线程堆栈大小 更多...
#define | PKG_AGILE_BUTTON_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 4
Agile Button 线程优先级 更多...

详细描述

宏定义说明

◆ PKG_AGILE_BUTTON_THREAD_PRIORITY

#define PKG_AGILE_BUTTON_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 4

Agile Button 线程优先级

在文件 agile_button.c 第 75 行定义.

◆ PKG_AGILE_BUTTON_THREAD_STACK_SIZE

#define PKG_AGILE_BUTTON_THREAD_STACK_SIZE 256

Agile Button 线程堆栈大小

在文件 agile_button.c 第 71 行定义.


Agile Button: Agile Button Thread Auto Init Functions

A agile button package.
函数
Agile Button Thread Auto Init Functions
Agile Button Thread Auto Init
Agile Button Thread Auto Init Functions 的协作图:

函数

static void | agile_btn_auto_thread_entry (void *parameter)
Agile Button 内部线程函数入口 更多...
static int | agile_btn_auto_thread_init (void)
Agile Button 内部线程初始化 更多...

详细描述

函数说明

◆ agile_btn_auto_thread_entry()

static void agile_btn_auto_thread_entry ( void * parameter )
static

Agile Button 内部线程函数入口

参数
parameter 线程参数

在文件 agile_button.c 第 479 行定义.

函数调用图:
这是这个函数的调用关系图:

◆ agile_btn_auto_thread_init()

static int agile_btn_auto_thread_init ( void )
static

Agile Button 内部线程初始化

返回
RT_EOK:成功

在文件 agile_button.c 第 491 行定义.

函数调用图:


Agile Button: Agile Button Private Constants

A agile button package.
宏定义
Agile Button Private Constants

宏定义

#define | AGILE_BUTTON_ELIMINATION_TIME_DEFAULT 15
按键消抖默认时间 15ms 更多...
#define | AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT 500
两次按键按下间隔超过500ms清零重复计数 更多...
#define | AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT 1000
按键按下后持续调用回调函数的周期 更多...

详细描述

宏定义说明

◆ AGILE_BUTTON_ELIMINATION_TIME_DEFAULT

#define AGILE_BUTTON_ELIMINATION_TIME_DEFAULT 15

按键消抖默认时间 15ms

在文件 agile_button.c 第 94 行定义.

◆ AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT

#define AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT 1000

按键按下后持续调用回调函数的周期

在文件 agile_button.c 第 96 行定义.

◆ AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT

#define AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT 500

两次按键按下间隔超过500ms清零重复计数

在文件 agile_button.c 第 95 行定义.


Agile Button: Agile Button Private Macros

A agile button package.
宏定义
Agile Button Private Macros

宏定义

#define | AGILE_BUTTON_PIN_STATE(btn) rt_pin_read(btn->pin)
获取按键引脚电平状态 更多...
#define | AGILE_BUTTON_EVENT_CB(btn, event)
调用按键事件的回调函数 更多...

详细描述

宏定义说明

◆ AGILE_BUTTON_EVENT_CB

#define AGILE_BUTTON_EVENT_CB | ( | btn,
 |  | event
 | ) |
值:
do { \
RT_ASSERT(btn); \
if (btn->event_cb[event]) { \
btn->event_cb[event](btn); \
} \
} while (0)

调用按键事件的回调函数

参数
btn | Agile Button 对象指针
event | 事件类型
返回
无

在文件 agile_button.c 第 118 行定义.

◆ AGILE_BUTTON_PIN_STATE

#define AGILE_BUTTON_PIN_STATE ( btn ) rt_pin_read(btn->pin)

获取按键引脚电平状态

参数
btn Agile Button 对象指针
返回
引脚电平

在文件 agile_button.c 第 110 行定义.


Agile Button: Agile Button Private Variables

A agile button package.
变量
Agile Button Private Variables

变量

static rt_slist_t | _slist_head = RT_SLIST_OBJECT_INIT(_slist_head)
Agile Button 链表头节点 更多...
static struct rt_mutex | _mtx
Agile Button 互斥锁 更多...
static uint8_t | _is_init = 0
Agile Button 初始化完成标志 更多...
static struct rt_thread | _thread
Agile Button 线程控制块 更多...
static uint8_t | _thread_stack [PKG_AGILE_BUTTON_THREAD_STACK_SIZE]
Agile Button 线程堆栈 更多...

详细描述

变量说明

◆ _is_init

uint8_t _is_init = 0
static

Agile Button 初始化完成标志

在文件 agile_button.c 第 136 行定义.

◆ _mtx

struct rt_mutex _mtx
static

Agile Button 互斥锁

在文件 agile_button.c 第 135 行定义.

◆ _slist_head

rt_slist_t _slist_head = RT_SLIST_OBJECT_INIT(_slist_head)
static

Agile Button 链表头节点

在文件 agile_button.c 第 134 行定义.

◆ _thread

struct rt_thread _thread
static

Agile Button 线程控制块

在文件 agile_button.c 第 139 行定义.

◆ _thread_stack

uint8_t _thread_stack[PKG_AGILE_BUTTON_THREAD_STACK_SIZE]
static

Agile Button 线程堆栈

在文件 agile_button.c 第 140 行定义.


Agile Button: Agile Button Private Functions

A agile button package.
函数
Agile Button Private Functions

函数

static void agile_btn_cal_hold_time (agile_btn_t *btn)
计算按键按下持续时间 更多...

详细描述

函数说明

◆ agile_btn_cal_hold_time()

static void agile_btn_cal_hold_time ( agile_btn_t * btn )
static

计算按键按下持续时间

参数
btn Agile Button 对象指针

在文件 agile_button.c 第 154 行定义.

这是这个函数的调用关系图:


Agile Button: Agile Button Exported Functions

A agile button package.
函数
Agile Button Exported Functions

函数

agile_btn_t * | agile_btn_create (uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
创建 Agile Button 对象 更多...
int | agile_btn_delete (agile_btn_t *btn)
删除 Agile Button 对象 更多...
int | agile_btn_init (agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
初始化 Agile Button 对象 更多...
int | agile_btn_start (agile_btn_t *btn)
启动 Agile Button 对象 更多...
int | agile_btn_stop (agile_btn_t *btn)
停止 Agile Button 对象 更多...
int | agile_btn_set_elimination_time (agile_btn_t *btn, uint8_t elimination_time)
设置按键消抖时间 更多...
int | agile_btn_set_hold_cycle_time (agile_btn_t *btn, uint32_t hold_cycle_time)
设置按键按下后 BTN_HOLD_EVENT 事件回调函数的周期 更多...
int | agile_btn_set_event_cb (agile_btn_t *btn, enum agile_btn_event event, void(*event_cb)(agile_btn_t *btn))
设置按键事件回调函数 更多...
void | agile_btn_process (void)
处理所有 Agile Button 对象 更多...
void | agile_btn_env_init (void)
Agile Button 环境初始化 更多...

详细描述

函数说明

◆ agile_btn_create()

agile_btn_t * agile_btn_create | ( | uint32_t | pin,
 |  | uint32_t | active_logic,
 |  | uint32_t | pin_mode
 | ) |  |

创建 Agile Button 对象

参数
pin | 按键引脚
active_logic | 有效电平
pin_mode | 引脚模式
返回
!=RT_NULL:Agile Button 对象指针; RT_NULL:异常

在文件 agile_button.c 第 183 行定义.

◆ agile_btn_delete()

int agile_btn_delete ( agile_btn_t * btn )

删除 Agile Button 对象

参数
btn Agile Button 对象指针
返回
RT_EOK:成功

在文件 agile_button.c 第 218 行定义.

◆ agile_btn_env_init()

void agile_btn_env_init ( void )

Agile Button 环境初始化

注解
使用其他 API 之前该函数必须被调用。 如果使能 PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT, 这个函数将被自动调用。

在文件 agile_button.c 第 451 行定义.

这是这个函数的调用关系图:

◆ agile_btn_init()

int agile_btn_init | ( | agile_btn_t * | btn,
 |  | uint32_t | pin,
 |  | uint32_t | active_logic,
 |  | uint32_t | pin_mode
 | ) |  |

初始化 Agile Button 对象

参数
btn | Agile Button 对象指针
pin | 按键引脚
active_logic | 有效电平
pin_mode | 引脚模式
返回
RT_EOK:成功; !=RT_EOK:异常

在文件 agile_button.c 第 241 行定义.

◆ agile_btn_process()

void agile_btn_process ( void )

处理所有 Agile Button 对象

注解
如果使能 PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT, 这个函数将被自动初始化线程 5ms 周期调用。 用户调用需要创建一个线程并将这个函数放入 while (1) {} 中。

在文件 agile_button.c 第 377 行定义.

函数调用图:
这是这个函数的调用关系图:

◆ agile_btn_set_elimination_time()

int agile_btn_set_elimination_time | ( | agile_btn_t * | btn,
 |  | uint8_t | elimination_time
 | ) |  |

设置按键消抖时间

参数
btn | Agile Button 对象指针
elimination_time | 消抖时间(单位ms)
返回
RT_EOK:成功

在文件 agile_button.c 第 324 行定义.

◆ agile_btn_set_event_cb()

int agile_btn_set_event_cb | ( | agile_btn_t * | btn,
 |  | enum agile_btn_event | event,
 |  | void(*)(agile_btn_t *btn) | event_cb
 | ) |  |

设置按键事件回调函数

参数
btn | Agile Button 对象指针
event | 事件类型
event_cb | 事件回调函数
返回
RT_EOK:成功; !=RT_OK:异常

在文件 agile_button.c 第 359 行定义.

◆ agile_btn_set_hold_cycle_time()

int agile_btn_set_hold_cycle_time | ( | agile_btn_t * | btn,
 |  | uint32_t | hold_cycle_time
 | ) |  |

设置按键按下后 BTN_HOLD_EVENT 事件回调函数的周期

参数
btn | Agile Button 对象指针
hold_cycle_time | 周期时间(单位ms)
返回
RT_EOK:成功

在文件 agile_button.c 第 341 行定义.

◆ agile_btn_start()

int agile_btn_start ( agile_btn_t * btn )

启动 Agile Button 对象

参数
btn Agile Button 对象指针
返回
RT_EOK:成功; !=RT_OK:异常

在文件 agile_button.c 第 274 行定义.

◆ agile_btn_stop()

int agile_btn_stop ( agile_btn_t * btn )

停止 Agile Button 对象

参数
btn Agile Button 对象指针
返回
RT_EOK:成功

在文件 agile_button.c 第 301 行定义.


Agile Button: 结构体

A agile button package.
结构体
这里列出了所有结构体，并附带简要说明:
C agile_btn Agile Button 结构体


Agile Button: 结构体索引

A agile button package.
结构体索引
A
A
agile_btn


Agile Button: 成员变量

A agile button package.
这里列出了所有结构体和联合体的成员变量，并附带结构体或联合的详细说明:
  • active : agile_btn
  • active_logic : agile_btn
  • elimination_time : agile_btn
  • event : agile_btn
  • event_cb : agile_btn
  • hold_cycle_time : agile_btn
  • hold_time : agile_btn
  • pin : agile_btn
  • prev_hold_time : agile_btn
  • repeat_cnt : agile_btn
  • slist : agile_btn
  • state : agile_btn
  • tick_timeout : agile_btn


Agile Button: 成员变量 - 变量

A agile button package.
  • active : agile_btn
  • active_logic : agile_btn
  • elimination_time : agile_btn
  • event : agile_btn
  • event_cb : agile_btn
  • hold_cycle_time : agile_btn
  • hold_time : agile_btn
  • pin : agile_btn
  • prev_hold_time : agile_btn
  • repeat_cnt : agile_btn
  • slist : agile_btn
  • state : agile_btn
  • tick_timeout : agile_btn


Agile Button: 文件列表

A agile button package.
文件列表
这里列出了所有文件，并附带简要说明:
[详情级别 12]
examples |
▼ inc |
agile_button.h | Agile Button 软件包头文件
▼ src |
agile_button.c | Agile Button 软件包源文件


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/examples 目录参考

A agile button package.
  • examples
examples 目录参考


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/inc 目录参考

A agile button package.
  • inc
inc 目录参考

文件

文件 agile_button.h [代码]
Agile Button 软件包头文件


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/inc/agile_button.h 文件参考

A agile button package.
  • inc
结构体 | 类型定义 | 枚举 | 函数
agile_button.h 文件参考

Agile Button 软件包头文件 更多...

#include <rtthread.h>
#include <rtdevice.h>
#include <stdint.h>
agile_button.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

结构体

struct agile_btn
Agile Button 结构体 更多...

类型定义

typedef struct agile_btn agile_btn_t
Agile Button 结构体 更多...

枚举

enum agile_btn_event {
BTN_PRESS_DOWN_EVENT = 0 , BTN_HOLD_EVENT , BTN_PRESS_UP_EVENT , BTN_CLICK_EVENT ,
BTN_EVENT_SUM
}
Agile Button 对象事件 更多...
enum agile_btn_state {
BTN_STATE_NONE_PRESS = 0 , BTN_STATE_CHECK_PRESS , BTN_STATE_PRESS_DOWN , BTN_STATE_PRESS_HOLD ,
BTN_STATE_PRESS_UP
}
Agile Button 对象状态 更多...

函数

agile_btn_t * | agile_btn_create (uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
创建 Agile Button 对象 更多...
int | agile_btn_delete (agile_btn_t *btn)
删除 Agile Button 对象 更多...
int | agile_btn_init (agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
初始化 Agile Button 对象 更多...
int | agile_btn_start (agile_btn_t *btn)
启动 Agile Button 对象 更多...
int | agile_btn_stop (agile_btn_t *btn)
停止 Agile Button 对象 更多...
int | agile_btn_set_elimination_time (agile_btn_t *btn, uint8_t elimination_time)
设置按键消抖时间 更多...
int | agile_btn_set_hold_cycle_time (agile_btn_t *btn, uint32_t hold_cycle_time)
设置按键按下后 BTN_HOLD_EVENT 事件回调函数的周期 更多...
int | agile_btn_set_event_cb (agile_btn_t *btn, enum agile_btn_event event, void(*event_cb)(agile_btn_t *btn))
设置按键事件回调函数 更多...
void | agile_btn_process (void)
处理所有 Agile Button 对象 更多...
void | agile_btn_env_init (void)
Agile Button 环境初始化 更多...

详细描述

Agile Button 软件包头文件

作者
马龙伟 (25440.nosp@m.4721.nosp@m.3@qq..nosp@m.com)
版本
1.1.1
日期
2021-12-29
注意

© Copyright (c) 2021 Ma Longwei. All rights reserved.

在文件 agile_button.h 中定义.


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/src 目录参考

A agile button package.
  • src
src 目录参考
src 的目录依赖关系图

文件

文件 agile_button.c [代码]
Agile Button 软件包源文件


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/src/agile_button.c 文件参考

A agile button package.
  • src
宏定义 | 函数 | 变量
agile_button.c 文件参考

Agile Button 软件包源文件 更多...

#include <agile_button.h>
#include <rtdbg.h>
agile_button.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define | AGILE_BUTTON_ELIMINATION_TIME_DEFAULT 15
按键消抖默认时间 15ms 更多...
#define | AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT 500
两次按键按下间隔超过500ms清零重复计数 更多...
#define | AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT 1000
按键按下后持续调用回调函数的周期 更多...
#define | AGILE_BUTTON_PIN_STATE(btn) rt_pin_read(btn->pin)
获取按键引脚电平状态 更多...
#define | AGILE_BUTTON_EVENT_CB(btn, event)
调用按键事件的回调函数 更多...
RT-Thread DBG 功能配置
#define | DBG_ENABLE
#define | DBG_COLOR
#define | DBG_SECTION_NAME "agile_button"
#define | DBG_LEVEL DBG_INFO
Agile Button 自动初始化线程配置
#define | PKG_AGILE_BUTTON_THREAD_STACK_SIZE 256
Agile Button 线程堆栈大小 更多...
#define | PKG_AGILE_BUTTON_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 4
Agile Button 线程优先级 更多...

函数

static void | agile_btn_cal_hold_time (agile_btn_t *btn)
计算按键按下持续时间 更多...
agile_btn_t * | agile_btn_create (uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
创建 Agile Button 对象 更多...
int | agile_btn_delete (agile_btn_t *btn)
删除 Agile Button 对象 更多...
int | agile_btn_init (agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
初始化 Agile Button 对象 更多...
int | agile_btn_start (agile_btn_t *btn)
启动 Agile Button 对象 更多...
int | agile_btn_stop (agile_btn_t *btn)
停止 Agile Button 对象 更多...
int | agile_btn_set_elimination_time (agile_btn_t *btn, uint8_t elimination_time)
设置按键消抖时间 更多...
int | agile_btn_set_hold_cycle_time (agile_btn_t *btn, uint32_t hold_cycle_time)
设置按键按下后 BTN_HOLD_EVENT 事件回调函数的周期 更多...
int | agile_btn_set_event_cb (agile_btn_t *btn, enum agile_btn_event event, void(*event_cb)(agile_btn_t *btn))
设置按键事件回调函数 更多...
void | agile_btn_process (void)
处理所有 Agile Button 对象 更多...
void | agile_btn_env_init (void)
Agile Button 环境初始化 更多...
static void | agile_btn_auto_thread_entry (void *parameter)
Agile Button 内部线程函数入口 更多...
static int | agile_btn_auto_thread_init (void)
Agile Button 内部线程初始化 更多...

变量

static rt_slist_t | _slist_head = RT_SLIST_OBJECT_INIT(_slist_head)
Agile Button 链表头节点 更多...
static struct rt_mutex | _mtx
Agile Button 互斥锁 更多...
static uint8_t | _is_init = 0
Agile Button 初始化完成标志 更多...
static struct rt_thread | _thread
Agile Button 线程控制块 更多...
static uint8_t | _thread_stack [PKG_AGILE_BUTTON_THREAD_STACK_SIZE]
Agile Button 线程堆栈 更多...

详细描述

Agile Button 软件包源文件

作者
马龙伟 (25440.nosp@m.4721.nosp@m.3@qq..nosp@m.com)
版本
1.1.1
日期
2021-12-29
   使用：
   如果未使能 PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT:
   1. agile_btn_env_init 初始化环境
   2. 创建一个线程，周期调用 agile_btn_process，建议周期时间不要太长

   - agile_btn_create / agile_btn_init 创建 / 初始化对象
   - agile_btn_set_elimination_time 更改消抖时间，可忽略
   - agile_btn_set_hold_cycle_time 更改持续按下触发周期时间，可忽略
     该操作也可在运行过程中执行
   - agile_btn_set_event_cb 设置事件触发回调
   - agile_btn_start 启动运行
   - agile_btn_stop 运行过程中强制停止
注意

© Copyright (c) 2021 Ma Longwei. All rights reserved.

在文件 agile_button.c 中定义.


Agile Button: 全局定义

A agile button package.
这里列出了所有函数,变量,宏,枚举和类型定义等,并附带其所属的文件:

- _ -

  • _is_init : agile_button.c
  • _mtx : agile_button.c
  • _slist_head : agile_button.c
  • _thread : agile_button.c
  • _thread_stack : agile_button.c

- a -

  • agile_btn_auto_thread_entry() : agile_button.c
  • agile_btn_auto_thread_init() : agile_button.c
  • agile_btn_cal_hold_time() : agile_button.c
  • agile_btn_create() : agile_button.h
  • agile_btn_delete() : agile_button.h
  • agile_btn_env_init() : agile_button.h
  • agile_btn_event : agile_button.h
  • agile_btn_init() : agile_button.h
  • agile_btn_process() : agile_button.h
  • agile_btn_set_elimination_time() : agile_button.h
  • agile_btn_set_event_cb() : agile_button.h
  • agile_btn_set_hold_cycle_time() : agile_button.h
  • agile_btn_start() : agile_button.h
  • agile_btn_state : agile_button.h
  • agile_btn_stop() : agile_button.h
  • agile_btn_t : agile_button.h
  • AGILE_BUTTON_ELIMINATION_TIME_DEFAULT : agile_button.c
  • AGILE_BUTTON_EVENT_CB : agile_button.c
  • AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT : agile_button.c
  • AGILE_BUTTON_PIN_STATE : agile_button.c
  • AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT : agile_button.c

- b -

  • BTN_CLICK_EVENT : agile_button.h
  • BTN_EVENT_SUM : agile_button.h
  • BTN_HOLD_EVENT : agile_button.h
  • BTN_PRESS_DOWN_EVENT : agile_button.h
  • BTN_PRESS_UP_EVENT : agile_button.h
  • BTN_STATE_CHECK_PRESS : agile_button.h
  • BTN_STATE_NONE_PRESS : agile_button.h
  • BTN_STATE_PRESS_DOWN : agile_button.h
  • BTN_STATE_PRESS_HOLD : agile_button.h
  • BTN_STATE_PRESS_UP : agile_button.h

- d -

  • DBG_COLOR : agile_button.c
  • DBG_ENABLE : agile_button.c
  • DBG_LEVEL : agile_button.c
  • DBG_SECTION_NAME : agile_button.c

- p -

  • PKG_AGILE_BUTTON_THREAD_PRIORITY : agile_button.c
  • PKG_AGILE_BUTTON_THREAD_STACK_SIZE : agile_button.c


Agile Button: 全局定义

A agile button package.
  • agile_btn_auto_thread_entry() : agile_button.c
  • agile_btn_auto_thread_init() : agile_button.c
  • agile_btn_cal_hold_time() : agile_button.c
  • agile_btn_create() : agile_button.h
  • agile_btn_delete() : agile_button.h
  • agile_btn_env_init() : agile_button.h
  • agile_btn_init() : agile_button.h
  • agile_btn_process() : agile_button.h
  • agile_btn_set_elimination_time() : agile_button.h
  • agile_btn_set_event_cb() : agile_button.h
  • agile_btn_set_hold_cycle_time() : agile_button.h
  • agile_btn_start() : agile_button.h
  • agile_btn_stop() : agile_button.h


Agile Button: 全局定义

A agile button package.
  • _is_init : agile_button.c
  • _mtx : agile_button.c
  • _slist_head : agile_button.c
  • _thread : agile_button.c
  • _thread_stack : agile_button.c


Agile Button: 全局定义

A agile button package.
  • agile_btn_t : agile_button.h


Agile Button: 全局定义

A agile button package.
  • agile_btn_event : agile_button.h
  • agile_btn_state : agile_button.h


Agile Button: 全局定义

A agile button package.
  • BTN_CLICK_EVENT : agile_button.h
  • BTN_EVENT_SUM : agile_button.h
  • BTN_HOLD_EVENT : agile_button.h
  • BTN_PRESS_DOWN_EVENT : agile_button.h
  • BTN_PRESS_UP_EVENT : agile_button.h
  • BTN_STATE_CHECK_PRESS : agile_button.h
  • BTN_STATE_NONE_PRESS : agile_button.h
  • BTN_STATE_PRESS_DOWN : agile_button.h
  • BTN_STATE_PRESS_HOLD : agile_button.h
  • BTN_STATE_PRESS_UP : agile_button.h


Agile Button: 全局定义

A agile button package.
  • AGILE_BUTTON_ELIMINATION_TIME_DEFAULT : agile_button.c
  • AGILE_BUTTON_EVENT_CB : agile_button.c
  • AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT : agile_button.c
  • AGILE_BUTTON_PIN_STATE : agile_button.c
  • AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT : agile_button.c
  • DBG_COLOR : agile_button.c
  • DBG_ENABLE : agile_button.c
  • DBG_LEVEL : agile_button.c
  • DBG_SECTION_NAME : agile_button.c
  • PKG_AGILE_BUTTON_THREAD_PRIORITY : agile_button.c
  • PKG_AGILE_BUTTON_THREAD_STACK_SIZE : agile_button.c


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/ChangeLog.md 文件参考

A agile button package.
C:/Users/longwei.ma/Desktop/test/packages/agile_button/ChangeLog.md 文件参考


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/README.md 文件参考

A agile button package.
C:/Users/longwei.ma/Desktop/test/packages/agile_button/README.md 文件参考


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/src/agile_button.c 源文件

A agile button package.
  • src
agile_button.c
浏览该文件的文档.
1
31#include <agile_button.h>
32
40#define DBG_ENABLE
41#define DBG_COLOR
42#define DBG_SECTION_NAME "agile_button"
43#ifdef PKG_AGILE_BUTTON_DEBUG
44#define DBG_LEVEL DBG_LOG
45#else
46#define DBG_LEVEL DBG_INFO
47#endif
48#include <rtdbg.h>
57#ifdef PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT
58
70#ifndef PKG_AGILE_BUTTON_THREAD_STACK_SIZE
71#define PKG_AGILE_BUTTON_THREAD_STACK_SIZE 256
72#endif
73
74#ifndef PKG_AGILE_BUTTON_THREAD_PRIORITY
75#define PKG_AGILE_BUTTON_THREAD_PRIORITY RT_THREAD_PRIORITY_MAX - 4
76#endif
89#endif /* PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT */
90
94#define AGILE_BUTTON_ELIMINATION_TIME_DEFAULT 15
95#define AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT 500
96#define AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT 1000
110#define AGILE_BUTTON_PIN_STATE(btn) rt_pin_read(btn->pin)
111
118#define AGILE_BUTTON_EVENT_CB(btn, event) \
119 do { \
120 RT_ASSERT(btn); \
121 if (btn->event_cb[event]) { \
122 btn->event_cb[event](btn); \
123 } \
124 } while (0)
125
133ALIGN(RT_ALIGN_SIZE)
134static rt_slist_t _slist_head = RT_SLIST_OBJECT_INIT(_slist_head);
135static struct rt_mutex _mtx;
136static uint8_t _is_init = 0;
138#ifdef PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT
139static struct rt_thread _thread;
140static uint8_t _thread_stack[PKG_AGILE_BUTTON_THREAD_STACK_SIZE];
141#endif
154static void agile_btn_cal_hold_time(agile_btn_t *btn)
155{
156 RT_ASSERT(btn);
157
158 if (rt_tick_get() < btn->tick_timeout) {
159 btn->hold_time = RT_TICK_MAX - btn->tick_timeout + rt_tick_get();
160 } else {
161 btn->hold_time = rt_tick_get() - btn->tick_timeout;
162 }
163 btn->hold_time = btn->hold_time * (1000 / RT_TICK_PER_SECOND);
164}
165
174#ifdef RT_USING_HEAP
175
183 agile_btn_t *agile_btn_create(uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
184{
185 if (!_is_init) {
186 LOG_E("Please call agile_btn_env_init first.");
187 return RT_NULL;
188 }
189
190 agile_btn_t *btn = (agile_btn_t *)rt_malloc(sizeof(agile_btn_t));
191 if (btn == RT_NULL)
192 return RT_NULL;
193
194 rt_memset(btn, 0, sizeof(agile_btn_t));
195 btn->active = 0;
196 btn->repeat_cnt = 0;
197 btn->elimination_time = AGILE_BUTTON_ELIMINATION_TIME_DEFAULT;
198 btn->event = BTN_EVENT_SUM;
199 btn->state = BTN_STATE_NONE_PRESS;
200 btn->hold_time = 0;
201 btn->prev_hold_time = 0;
202 btn->hold_cycle_time = AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT;
203 btn->pin = pin;
204 btn->active_logic = active_logic;
205 btn->tick_timeout = rt_tick_get();
206 rt_slist_init(&(btn->slist));
207
208 rt_pin_mode(pin, pin_mode);
209
210 return btn;
211}
212
218int agile_btn_delete(agile_btn_t *btn)
219{
220 RT_ASSERT(btn);
221
222 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
223 rt_slist_remove(&_slist_head, &(btn->slist));
224 btn->slist.next = RT_NULL;
225 rt_mutex_release(&_mtx);
226 rt_free(btn);
227
228 return RT_EOK;
229}
230
231#endif /* RT_USING_HEAP */
232
241int agile_btn_init(agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
242{
243 RT_ASSERT(btn);
244
245 if (!_is_init) {
246 LOG_E("Please call agile_btn_env_init first.");
247 return -RT_ERROR;
248 }
249
250 rt_memset(btn, 0, sizeof(agile_btn_t));
251 btn->active = 0;
252 btn->repeat_cnt = 0;
253 btn->elimination_time = AGILE_BUTTON_ELIMINATION_TIME_DEFAULT;
254 btn->event = BTN_EVENT_SUM;
255 btn->state = BTN_STATE_NONE_PRESS;
256 btn->hold_time = 0;
257 btn->prev_hold_time = 0;
258 btn->hold_cycle_time = AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT;
259 btn->pin = pin;
260 btn->active_logic = active_logic;
261 btn->tick_timeout = rt_tick_get();
262 rt_slist_init(&(btn->slist));
263
264 rt_pin_mode(pin, pin_mode);
265
266 return RT_EOK;
267}
268
274int agile_btn_start(agile_btn_t *btn)
275{
276 RT_ASSERT(btn);
277
278 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
279 if (btn->active) {
280 rt_mutex_release(&_mtx);
281 return -RT_ERROR;
282 }
283 btn->repeat_cnt = 0;
284 btn->event = BTN_EVENT_SUM;
285 btn->state = BTN_STATE_NONE_PRESS;
286 btn->hold_time = 0;
287 btn->prev_hold_time = 0;
288 btn->tick_timeout = rt_tick_get();
289 rt_slist_append(&_slist_head, &(btn->slist));
290 btn->active = 1;
291 rt_mutex_release(&_mtx);
292
293 return RT_EOK;
294}
295
301int agile_btn_stop(agile_btn_t *btn)
302{
303 RT_ASSERT(btn);
304
305 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
306 if (!btn->active) {
307 rt_mutex_release(&_mtx);
308 return RT_EOK;
309 }
310 rt_slist_remove(&_slist_head, &(btn->slist));
311 btn->slist.next = RT_NULL;
312 btn->active = 0;
313 rt_mutex_release(&_mtx);
314
315 return RT_EOK;
316}
317
324int agile_btn_set_elimination_time(agile_btn_t *btn, uint8_t elimination_time)
325{
326 RT_ASSERT(btn);
327
328 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
329 btn->elimination_time = elimination_time;
330 rt_mutex_release(&_mtx);
331
332 return RT_EOK;
333}
334
341int agile_btn_set_hold_cycle_time(agile_btn_t *btn, uint32_t hold_cycle_time)
342{
343 RT_ASSERT(btn);
344
345 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
346 btn->hold_cycle_time = hold_cycle_time;
347 rt_mutex_release(&_mtx);
348
349 return RT_EOK;
350}
351
359int agile_btn_set_event_cb(agile_btn_t *btn, enum agile_btn_event event, void (*event_cb)(agile_btn_t *btn))
360{
361 RT_ASSERT(btn);
362
363 if (event >= BTN_EVENT_SUM)
364 return -RT_ERROR;
365 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
366 btn->event_cb[event] = event_cb;
367 rt_mutex_release(&_mtx);
368
369 return RT_EOK;
370}
371
377void agile_btn_process(void)
378{
379 rt_slist_t *node;
380
381 rt_mutex_take(&_mtx, RT_WAITING_FOREVER);
382 rt_slist_for_each(node, &_slist_head)
383 {
384 agile_btn_t *btn = rt_slist_entry(node, agile_btn_t, slist);
385 switch (btn->state) {
386 case BTN_STATE_NONE_PRESS: {
387 if (AGILE_BUTTON_PIN_STATE(btn) == btn->active_logic) {
388 btn->tick_timeout = rt_tick_get() + rt_tick_from_millisecond(btn->elimination_time);
389 btn->state = BTN_STATE_CHECK_PRESS;
390 } else {
391 /* 2次按下中间间隔过大，清零重按计数 */
392 if (btn->repeat_cnt) {
393 if ((rt_tick_get() - btn->tick_timeout) < (RT_TICK_MAX / 2)) {
394 btn->repeat_cnt = 0;
395 }
396 }
397 }
398 } break;
399 case BTN_STATE_CHECK_PRESS: {
400 if (AGILE_BUTTON_PIN_STATE(btn) == btn->active_logic) {
401 if ((rt_tick_get() - btn->tick_timeout) < (RT_TICK_MAX / 2)) {
402 btn->state = BTN_STATE_PRESS_DOWN;
403 }
404 } else {
405 btn->state = BTN_STATE_NONE_PRESS;
406 }
407 } break;
408 case BTN_STATE_PRESS_DOWN: {
409 btn->hold_time = 0;
410 btn->prev_hold_time = 0;
411 btn->repeat_cnt++;
412 btn->event = BTN_PRESS_DOWN_EVENT;
413 AGILE_BUTTON_EVENT_CB(btn, btn->event);
414
415 btn->tick_timeout = rt_tick_get();
416 btn->state = BTN_STATE_PRESS_HOLD;
417 } break;
418 case BTN_STATE_PRESS_HOLD: {
419 if (AGILE_BUTTON_PIN_STATE(btn) == btn->active_logic) {
420 agile_btn_cal_hold_time(btn);
421 if (btn->hold_time - btn->prev_hold_time >= btn->hold_cycle_time) {
422 btn->event = BTN_HOLD_EVENT;
423 AGILE_BUTTON_EVENT_CB(btn, btn->event);
424 btn->prev_hold_time = btn->hold_time;
425 }
426 } else {
427 btn->state = BTN_STATE_PRESS_UP;
428 }
429 } break;
430 case BTN_STATE_PRESS_UP: {
431 btn->event = BTN_PRESS_UP_EVENT;
432 AGILE_BUTTON_EVENT_CB(btn, btn->event);
433 btn->event = BTN_CLICK_EVENT;
434 AGILE_BUTTON_EVENT_CB(btn, btn->event);
435
436 btn->tick_timeout = rt_tick_get() + rt_tick_from_millisecond(AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT);
437 btn->state = BTN_STATE_NONE_PRESS;
438 } break;
439 default:
440 break;
441 }
442 }
443 rt_mutex_release(&_mtx);
444}
445
451void agile_btn_env_init(void)
452{
453 if (_is_init)
454 return;
455
456 rt_mutex_init(&_mtx, "btn_mtx", RT_IPC_FLAG_FIFO);
457
458 _is_init = 1;
459}
460
465#ifdef PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT
466
479static void agile_btn_auto_thread_entry(void *parameter)
480{
481 while (1) {
482 agile_btn_process();
483 rt_thread_mdelay(5);
484 }
485}
486
491static int agile_btn_auto_thread_init(void)
492{
493 agile_btn_env_init();
494
495 rt_thread_init(&_thread,
496 "agbtn",
497 agile_btn_auto_thread_entry,
498 RT_NULL,
499 &_thread_stack[0],
500 sizeof(_thread_stack),
501 PKG_AGILE_BUTTON_THREAD_PRIORITY,
502 100);
503
504 rt_thread_startup(&_thread);
505
506 return RT_EOK;
507}
508INIT_APP_EXPORT(agile_btn_auto_thread_init);
509
518#endif /* PKG_AGILE_BUTTON_USING_THREAD_AUTO_INIT */
agile_button.h
Agile Button 软件包头文件
agile_btn_delete
int agile_btn_delete(agile_btn_t *btn)
删除 Agile Button 对象
Definition: agile_button.c:218
agile_btn_env_init
void agile_btn_env_init(void)
Agile Button 环境初始化
Definition: agile_button.c:451
agile_btn_set_hold_cycle_time
int agile_btn_set_hold_cycle_time(agile_btn_t *btn, uint32_t hold_cycle_time)
设置按键按下后 BTN_HOLD_EVENT 事件回调函数的周期
Definition: agile_button.c:341
agile_btn_create
agile_btn_t * agile_btn_create(uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
创建 Agile Button 对象
Definition: agile_button.c:183
agile_btn_stop
int agile_btn_stop(agile_btn_t *btn)
停止 Agile Button 对象
Definition: agile_button.c:301
agile_btn_start
int agile_btn_start(agile_btn_t *btn)
启动 Agile Button 对象
Definition: agile_button.c:274
agile_btn_set_event_cb
int agile_btn_set_event_cb(agile_btn_t *btn, enum agile_btn_event event, void(*event_cb)(agile_btn_t *btn))
设置按键事件回调函数
Definition: agile_button.c:359
agile_btn_set_elimination_time
int agile_btn_set_elimination_time(agile_btn_t *btn, uint8_t elimination_time)
设置按键消抖时间
Definition: agile_button.c:324
agile_btn_init
int agile_btn_init(agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
初始化 Agile Button 对象
Definition: agile_button.c:241
agile_btn_process
void agile_btn_process(void)
处理所有 Agile Button 对象
Definition: agile_button.c:377
agile_btn_event
agile_btn_event
Agile Button 对象事件
Definition: agile_button.h:33
BTN_CLICK_EVENT
@ BTN_CLICK_EVENT
点击事件
Definition: agile_button.h:37
BTN_HOLD_EVENT
@ BTN_HOLD_EVENT
持续按下有效事件
Definition: agile_button.h:35
BTN_PRESS_DOWN_EVENT
@ BTN_PRESS_DOWN_EVENT
按下事件
Definition: agile_button.h:34
BTN_PRESS_UP_EVENT
@ BTN_PRESS_UP_EVENT
弹起事件
Definition: agile_button.h:36
BTN_EVENT_SUM
@ BTN_EVENT_SUM
事件总数目
Definition: agile_button.h:38
BTN_STATE_PRESS_HOLD
@ BTN_STATE_PRESS_HOLD
持续按下状态
Definition: agile_button.h:48
BTN_STATE_PRESS_UP
@ BTN_STATE_PRESS_UP
弹起状态
Definition: agile_button.h:49
BTN_STATE_CHECK_PRESS
@ BTN_STATE_CHECK_PRESS
抖动检查状态
Definition: agile_button.h:46
BTN_STATE_NONE_PRESS
@ BTN_STATE_NONE_PRESS
未按下状态
Definition: agile_button.h:45
BTN_STATE_PRESS_DOWN
@ BTN_STATE_PRESS_DOWN
按下状态
Definition: agile_button.h:47
AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT
#define AGILE_BUTTON_HOLD_CYCLE_TIME_DEFAULT
按键按下后持续调用回调函数的周期
Definition: agile_button.c:96
AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT
#define AGILE_BUTTON_TWO_INTERVAL_TIME_DEFAULT
两次按键按下间隔超过500ms清零重复计数
Definition: agile_button.c:95
AGILE_BUTTON_ELIMINATION_TIME_DEFAULT
#define AGILE_BUTTON_ELIMINATION_TIME_DEFAULT
按键消抖默认时间 15ms
Definition: agile_button.c:94
agile_btn_cal_hold_time
static void agile_btn_cal_hold_time(agile_btn_t *btn)
计算按键按下持续时间
Definition: agile_button.c:154
AGILE_BUTTON_PIN_STATE
#define AGILE_BUTTON_PIN_STATE(btn)
获取按键引脚电平状态
Definition: agile_button.c:110
AGILE_BUTTON_EVENT_CB
#define AGILE_BUTTON_EVENT_CB(btn, event)
调用按键事件的回调函数
Definition: agile_button.c:118
_slist_head
static rt_slist_t _slist_head
Agile Button 链表头节点
Definition: agile_button.c:134
_thread_stack
static uint8_t _thread_stack[PKG_AGILE_BUTTON_THREAD_STACK_SIZE]
Agile Button 线程堆栈
Definition: agile_button.c:140
_is_init
static uint8_t _is_init
Agile Button 初始化完成标志
Definition: agile_button.c:136
_mtx
static struct rt_mutex _mtx
Agile Button 互斥锁
Definition: agile_button.c:135
_thread
static struct rt_thread _thread
Agile Button 线程控制块
Definition: agile_button.c:139
PKG_AGILE_BUTTON_THREAD_PRIORITY
#define PKG_AGILE_BUTTON_THREAD_PRIORITY
Agile Button 线程优先级
Definition: agile_button.c:75
PKG_AGILE_BUTTON_THREAD_STACK_SIZE
#define PKG_AGILE_BUTTON_THREAD_STACK_SIZE
Agile Button 线程堆栈大小
Definition: agile_button.c:71
agile_btn_auto_thread_entry
static void agile_btn_auto_thread_entry(void *parameter)
Agile Button 内部线程函数入口
Definition: agile_button.c:479
agile_btn_auto_thread_init
static int agile_btn_auto_thread_init(void)
Agile Button 内部线程初始化
Definition: agile_button.c:491
agile_btn
Agile Button 结构体
Definition: agile_button.h:57
agile_btn::pin
uint32_t pin
按键引脚
Definition: agile_button.h:66
agile_btn::active
uint8_t active
激活标志
Definition: agile_button.h:58
agile_btn::event_cb
void(* event_cb[BTN_EVENT_SUM])(agile_btn_t *btn)
按键对象事件回调函数
Definition: agile_button.h:69
agile_btn::active_logic
uint32_t active_logic
有效电平(PIN_HIGH/PIN_LOW)
Definition: agile_button.h:67
agile_btn::event
enum agile_btn_event event
按键对象事件
Definition: agile_button.h:61
agile_btn::prev_hold_time
uint32_t prev_hold_time
缓存 hold_time 变量
Definition: agile_button.h:64
agile_btn::state
enum agile_btn_state state
按键对象状态
Definition: agile_button.h:62
agile_btn::hold_time
uint32_t hold_time
按键按下持续时间(单位ms)
Definition: agile_button.h:63
agile_btn::repeat_cnt
uint8_t repeat_cnt
按键重按计数
Definition: agile_button.h:59
agile_btn::hold_cycle_time
uint32_t hold_cycle_time
按键按下后持续调用回调函数的周期(单位ms,默认1s)
Definition: agile_button.h:65
agile_btn::elimination_time
uint8_t elimination_time
按键消抖时间(单位ms,默认15ms)
Definition: agile_button.h:60
agile_btn::tick_timeout
rt_tick_t tick_timeout
超时时间
Definition: agile_button.h:68
agile_btn::slist
rt_slist_t slist
单向链表节点
Definition: agile_button.h:70


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/inc/agile_button.h 源文件

A agile button package.
  • inc
agile_button.h
浏览该文件的文档.
1
15#ifndef __PKG_AGILE_BUTTON_H
16#define __PKG_AGILE_BUTTON_H
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
22#include <rtthread.h>
23#include <rtdevice.h>
24#include <stdint.h>
25
33enum agile_btn_event {
34 BTN_PRESS_DOWN_EVENT = 0,
35 BTN_HOLD_EVENT,
36 BTN_PRESS_UP_EVENT,
37 BTN_CLICK_EVENT,
38 BTN_EVENT_SUM
39};
40
44enum agile_btn_state {
45 BTN_STATE_NONE_PRESS = 0,
46 BTN_STATE_CHECK_PRESS,
47 BTN_STATE_PRESS_DOWN,
48 BTN_STATE_PRESS_HOLD,
49 BTN_STATE_PRESS_UP,
50};
51
52typedef struct agile_btn agile_btn_t;
57struct agile_btn {
58 uint8_t active;
59 uint8_t repeat_cnt;
60 uint8_t elimination_time;
61 enum agile_btn_event event;
62 enum agile_btn_state state;
63 uint32_t hold_time;
64 uint32_t prev_hold_time;
65 uint32_t hold_cycle_time;
66 uint32_t pin;
67 uint32_t active_logic;
68 rt_tick_t tick_timeout;
69 void (*event_cb[BTN_EVENT_SUM])(agile_btn_t *btn);
70 rt_slist_t slist;
71};
72
80#ifdef RT_USING_HEAP
81 agile_btn_t *agile_btn_create(uint32_t pin, uint32_t active_logic, uint32_t pin_mode);
82int agile_btn_delete(agile_btn_t *btn);
83#endif
84
85int agile_btn_init(agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode);
86int agile_btn_start(agile_btn_t *btn);
87int agile_btn_stop(agile_btn_t *btn);
88int agile_btn_set_elimination_time(agile_btn_t *btn, uint8_t elimination_time);
89int agile_btn_set_hold_cycle_time(agile_btn_t *btn, uint32_t hold_cycle_time);
90int agile_btn_set_event_cb(agile_btn_t *btn, enum agile_btn_event event, void (*event_cb)(agile_btn_t *btn));
91void agile_btn_process(void);
92void agile_btn_env_init(void);
97#ifdef __cplusplus
98}
99#endif
100
101#endif /* __PKG_AGILE_BUTTON_H */
agile_btn_delete
int agile_btn_delete(agile_btn_t *btn)
删除 Agile Button 对象
Definition: agile_button.c:218
agile_btn_env_init
void agile_btn_env_init(void)
Agile Button 环境初始化
Definition: agile_button.c:451
agile_btn_set_hold_cycle_time
int agile_btn_set_hold_cycle_time(agile_btn_t *btn, uint32_t hold_cycle_time)
设置按键按下后 BTN_HOLD_EVENT 事件回调函数的周期
Definition: agile_button.c:341
agile_btn_create
agile_btn_t * agile_btn_create(uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
创建 Agile Button 对象
Definition: agile_button.c:183
agile_btn_stop
int agile_btn_stop(agile_btn_t *btn)
停止 Agile Button 对象
Definition: agile_button.c:301
agile_btn_start
int agile_btn_start(agile_btn_t *btn)
启动 Agile Button 对象
Definition: agile_button.c:274
agile_btn_set_event_cb
int agile_btn_set_event_cb(agile_btn_t *btn, enum agile_btn_event event, void(*event_cb)(agile_btn_t *btn))
设置按键事件回调函数
Definition: agile_button.c:359
agile_btn_set_elimination_time
int agile_btn_set_elimination_time(agile_btn_t *btn, uint8_t elimination_time)
设置按键消抖时间
Definition: agile_button.c:324
agile_btn_init
int agile_btn_init(agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode)
初始化 Agile Button 对象
Definition: agile_button.c:241
agile_btn_process
void agile_btn_process(void)
处理所有 Agile Button 对象
Definition: agile_button.c:377
agile_btn_event
agile_btn_event
Agile Button 对象事件
Definition: agile_button.h:33
agile_btn_state
agile_btn_state
Agile Button 对象状态
Definition: agile_button.h:44
BTN_CLICK_EVENT
@ BTN_CLICK_EVENT
点击事件
Definition: agile_button.h:37
BTN_HOLD_EVENT
@ BTN_HOLD_EVENT
持续按下有效事件
Definition: agile_button.h:35
BTN_PRESS_DOWN_EVENT
@ BTN_PRESS_DOWN_EVENT
按下事件
Definition: agile_button.h:34
BTN_PRESS_UP_EVENT
@ BTN_PRESS_UP_EVENT
弹起事件
Definition: agile_button.h:36
BTN_EVENT_SUM
@ BTN_EVENT_SUM
事件总数目
Definition: agile_button.h:38
BTN_STATE_PRESS_HOLD
@ BTN_STATE_PRESS_HOLD
持续按下状态
Definition: agile_button.h:48
BTN_STATE_PRESS_UP
@ BTN_STATE_PRESS_UP
弹起状态
Definition: agile_button.h:49
BTN_STATE_CHECK_PRESS
@ BTN_STATE_CHECK_PRESS
抖动检查状态
Definition: agile_button.h:46
BTN_STATE_NONE_PRESS
@ BTN_STATE_NONE_PRESS
未按下状态
Definition: agile_button.h:45
BTN_STATE_PRESS_DOWN
@ BTN_STATE_PRESS_DOWN
按下状态
Definition: agile_button.h:47
agile_btn
Agile Button 结构体
Definition: agile_button.h:57
agile_btn::pin
uint32_t pin
按键引脚
Definition: agile_button.h:66
agile_btn::active
uint8_t active
激活标志
Definition: agile_button.h:58
agile_btn::event_cb
void(* event_cb[BTN_EVENT_SUM])(agile_btn_t *btn)
按键对象事件回调函数
Definition: agile_button.h:69
agile_btn::active_logic
uint32_t active_logic
有效电平(PIN_HIGH/PIN_LOW)
Definition: agile_button.h:67
agile_btn::event
enum agile_btn_event event
按键对象事件
Definition: agile_button.h:61
agile_btn::prev_hold_time
uint32_t prev_hold_time
缓存 hold_time 变量
Definition: agile_button.h:64
agile_btn::state
enum agile_btn_state state
按键对象状态
Definition: agile_button.h:62
agile_btn::hold_time
uint32_t hold_time
按键按下持续时间(单位ms)
Definition: agile_button.h:63
agile_btn::repeat_cnt
uint8_t repeat_cnt
按键重按计数
Definition: agile_button.h:59
agile_btn::hold_cycle_time
uint32_t hold_cycle_time
按键按下后持续调用回调函数的周期(单位ms,默认1s)
Definition: agile_button.h:65
agile_btn::elimination_time
uint8_t elimination_time
按键消抖时间(单位ms,默认15ms)
Definition: agile_button.h:60
agile_btn::tick_timeout
rt_tick_t tick_timeout
超时时间
Definition: agile_button.h:68
agile_btn::slist
rt_slist_t slist
单向链表节点
Definition: agile_button.h:70


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/src -> inc 关系

A agile button package.
  • src

src → inc 关系

文件在 src | 在 inc 中引用
agile_button.c | agile_button.h


Agile Button: C:/Users/longwei.ma/Desktop/test/packages/agile_button/examples/README.md 文件参考

A agile button package.
C:/Users/longwei.ma/Desktop/test/packages/agile_button/examples/README.md 文件参考


Agile Button: 图例

A agile button package.
图例

本页将向您解释如何理解由 doxygen 生成的图.

考虑如下例子:

/*! 由于截断而使 Invisible 不可见 */
class Invisible { };
/*! Truncated 的继承关系将被隐藏 */
class Truncated : public Invisible { };
/* 没有被doxygen文档化的类 */
class Undocumented { };
/*! public 继承关系的类 */
class PublicBase : public Truncated { };
/*! 一个模板类 */
template<class T> class Templ { };
/*! protected 继承关系的类 */
class ProtectedBase { };
/*! private 继承关系的类 */
class PrivateBase { };
/*! 被 Inherited 使用的类 */
class Used { };
/*! 继承自其它若干类的超级类 */
class Inherited : public PublicBase,
protected ProtectedBase,
private PrivateBase,
public Undocumented,
public Templ<int>
{
private:
Used *m_usedClass;
};

结果将会生成以下图:

上图中的矩形有如下意义:

  • 灰色填充的矩形 表示上图是由该结构体或类生成.
  • 黑色边框的矩形 表示已经被文档化的结构体或类.
  • 灰色边框的矩形 表示未被文档化的结构体或类.
  • 红色边框的矩形 表示该结构体或类的关系没有被完全显示.如果生成的图不能调整到制定的尺寸，有一些关系就会被截断而不显示出来.

箭头有如下意义:

  • 深蓝色的箭头被用于展示 public 的继承关系.
  • 深绿色的箭头表示 protected 的继承关系.
  • 深红色的箭头说明了是 privated 的继承关系.
  • 紫色虚线箭头用来表示两个类之间的聚合关系. 被箭头指向的类的类型的变量,可以通过箭头旁标明的变量去访问.
  • 黄色虚线箭头表示模板类实例和模板类之间的关系. 箭头旁边标明了模板类实例化的参数.


Agile Button: 相关页面

A agile button package.
相关页面
这里列出了所有相关页面:
更新记录
示例说明