Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
update demo and somecomments.
  • Loading branch information
smartmx committed Jul 4, 2023
1 parent 19ae09e commit 2719211
Show file tree
Hide file tree
Showing 7 changed files with 217 additions and 68 deletions.
112 changes: 66 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ typedef uint32_t mfbd_btn_index_t;
*/
#define MFBD_PARAMS_SAME_IN_GROUP 1

/* set MFBD_MULTICLICK_STATE_AUTO_RESET to 1 will auto set multiclick state to 0 when reach to max multicick state. */
#define MFBD_MULTICLICK_STATE_AUTO_RESET 1

```

`mfbd_btn_code_t`:按键键值的类型。
Expand Down Expand Up @@ -87,6 +90,8 @@ typedef uint32_t mfbd_btn_index_t;

`MFBD_PARAMS_SAME_IN_GROUP`:当所有按键的扫描滤波时间、长按时间、重复上报时间、连击释放时间一致的时候,可以将该宏置为`1`。此时,每个按键的info结构体中将不再存放上述事件参数,而把时间参数存放在group结构体中。当该选项使能的时候,无法在启用长按事件(long count)的时候单独禁用某个按键的重复上报事件(repeat count),但可以通过设置`repeat_time = 0`禁用全部按键的重复上报事件。

`MFBD_MULTICLICK_STATE_AUTO_RESET`:当mbtn达到最大连击次数时,连击次数是否自动返回未连击状态。为`1`,则自动返回0状态,下次连击则返回按键连击0按键码,为`0`,则必须等带连击释放时间达到后,才会自动返回0状态,下次连击则返回按键连击最高状态按键码。

## MFBD按键事件

### 单击事件
Expand Down Expand Up @@ -291,6 +296,22 @@ MFBD_MBTN_DEFAULT_DEFINE(NAME, ...);
```MFBD_MBTN_DEFAULT_DEFINE(HI, ...)```,将会默认使用```HI_UP_CODE```和```HI_LONG_CODE```作为按键值。所以程序中需要准备好该两个名称的按键值枚举变量或宏定义。另外MBTN需要提供一个变量名为```HI_DOWN_CODES```的按键值数组,作为多次连击的按键值。
可以通过在枚举变量时,使用如下宏定义,来快速生成名称:
```c
#define MFBD_DOWN_CODE_NAME(NAME) NAME##_DOWN_CODE /* when using tbtn/nbtn default define api, this is down-code name. */
#define MFBD_UP_CODE_NAME(NAME) NAME##_UP_CODE /* when using tbtn/nbtn/mbtn default define api, this is up-code name. */
#define MFBD_LONG_CODE_NAME(NAME) NAME##_LONG_CODE /* when using nbtn/mbtn default define api, this is long-code name. */
```

mbtn需要提供数组来代表各种连击时发送的按键值,数组名参考下面的宏定义:

```c
#define MFBD_DOWN_CODES_NAME(NAME) NAME##_DOWN_CODES /* when using mbtn default define api, this is long-codes name. */

mfbd_btn_code_t MFBD_DOWN_CODES_DEF(mbtn)[4] = {0x1501, 0x1511, 0x1521, 0x1531}; /* example */
```
## MFBD 使用示例
这里使用上方MFBD定义示例中宏定义的方式定义按键进行操作
Expand Down Expand Up @@ -403,7 +424,7 @@ extern void mfbd_group_reset(const mfbd_group_t *_pbtn_group);

## MFBD段定义

段定义(Section-Definition)是程序编译期间会将不同的程序内容放到不同的程序段中,再通过链接器链接为固件。
段定义(Section-Definition)是程序编译期间会将不同的程序内容放到不同的程序段中,再通过链接器链接为固件。段定义同样也支持默认定义方式。

### GROUP命名和其他对应名称关系

Expand All @@ -417,16 +438,16 @@ extern void mfbd_group_reset(const mfbd_group_t *_pbtn_group);
#define MFBD_GROUP_EXTERN(GROUP) extern const mfbd_group_t MFBD_GROUP_NAME(GROUP)
```

程序中真实的组名为`mfbd_group_test_btns`
程序中真实的变量组名为`mfbd_group_test_btns`

使用`MFBD_GROUP_DEFINE`宏不需要考虑名称,他里面自动生成名字
使用`MFBD_GROUP_DEFINE`宏不需要考虑名称,宏定义里面会自动生成名字

```c
#define MFBD_GROUP_DEFINE(GROUP, IS_BTN_DOWN_FUNC, BTN_VALUE_REPORT_FUNC, ...) \
const mfbd_group_t MFBD_GROUP_NAME(GROUP) = { \
IS_BTN_DOWN_FUNC, \
BTN_VALUE_REPORT_FUNC, \
__VA_ARGS__ \
IS_BTN_DOWN_FUNC, \
BTN_VALUE_REPORT_FUNC, \
__VA_ARGS__ \
}
```
Expand All @@ -442,13 +463,15 @@ extern void mfbd_group_reset(const mfbd_group_t *_pbtn_group);

例如,按键组为`test_btns`,则默认:

组内的`tbtn`对应的段名为`test_btns_tbtn`
组内的`nbtn`对应的段名为`test_btns_nbtn`
组内的`mbtn`对应的段名为`test_btns_mbtn`
组内的`tbtn`对应的段名为`test_btns_tbtn`。

组内的`nbtn`对应的段名为`test_btns_nbtn`。

组内的`mbtn`对应的段名为`test_btns_mbtn`。

### MDK和IAR编译器使用方法

MDK和IAR中都在软件内部进行更改了代码编译后的链接操作,可以很方便的使用,无需修改工程文件。
MDK和IAR中都在软件内部进行更改了代码编译后的链接操作,可以很方便的使用,无需修改工程文件,直接使用宏定义即可

### GCC使用方法

Expand All @@ -461,44 +484,43 @@ GUN gcc工程需要在工程的ld文件中找到`rodata`的初始化链接代码
组内的`mbtn`对应的段名为`test_btns_mbtn_start`,结束地址为`test_btns_mbtn_end`

```ld
.text :
{
. = ALIGN(4);
KEEP(*(SORT_NONE(.handle_reset)))
*(.text)
*(.text.*)

/* this is for tbtn in test_btns. */
. = ALIGN(4);
PROVIDE(test_btns_tbtn_start = .);
KEEP(*(test_btns_tbtn*))
PROVIDE(test_btns_tbtn_end = .);

/* this is for nbtn in test_btns. */
. = ALIGN(4);
PROVIDE(test_btns_nbtn_start = .);
KEEP(*(test_btns_nbtn*))
PROVIDE(test_btns_nbtn_end = .);

/* this is for mbtn in test_btns. */
. = ALIGN(4);
PROVIDE(test_btns_mbtn_start = .);
KEEP(*(test_btns_mbtn*))
PROVIDE(test_btns_mbtn_end = .);

*(.rodata)
*(.rodata*)
*(.sdata2.*)
*(.glue_7)
*(.glue_7t)
*(.gnu.linkonce.t.*)
. = ALIGN(4);
} >FLASH AT>FLASH
.text :
{
. = ALIGN(4);
KEEP(*(SORT_NONE(.handle_reset)))
*(.text)
*(.text.*)

/* this is for tbtn in test_btns. */
. = ALIGN(4);
PROVIDE(test_btns_tbtn_start = .);
KEEP(*(test_btns_tbtn*))
PROVIDE(test_btns_tbtn_end = .);

/* this is for nbtn in test_btns. */
. = ALIGN(4);
PROVIDE(test_btns_nbtn_start = .);
KEEP(*(test_btns_nbtn*))
PROVIDE(test_btns_nbtn_end = .);

/* this is for mbtn in test_btns. */
. = ALIGN(4);
PROVIDE(test_btns_mbtn_start = .);
KEEP(*(test_btns_mbtn*))
PROVIDE(test_btns_mbtn_end = .);

*(.rodata)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.gnu.linkonce.t.*)
. = ALIGN(4);
} >FLASH AT>FLASH
```

### 段定义调用按键检测

由于使用了段定义,所以程序无法判断一个组是否有所有的按键种类。所以可能会出错,此时需要通过自行调整检测宏来进行按键检测
由于使用了段定义,所以程序无法判断一个组是否有所有的使能的按键种类。所以可能会出错,此时需要通过自行调整检测的宏来进行按键检测

默认的按键扫描宏如下:

Expand Down Expand Up @@ -526,8 +548,6 @@ GUN gcc工程需要在工程的ld文件中找到`rodata`的初始化链接代码
} while (0)
```

这样就可以进行正确的通过编译了。
### 段定义调用按键复位

和段定义调用按键检测一样,需要自行调整程序,删除组内没有用到的按键复位函数宏。
Expand Down
121 changes: 104 additions & 17 deletions examples/mfbd_demo_rtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#include "mfbd.h"
#include "mfbd_sd.h"

#define MFBD_DEMO_USE_DEFAULT_DEFINE 1 /* set to 1, you can study how to use default define APIs. */

void bsp_btn_value_report(mfbd_btn_code_t btn_value);
unsigned char bsp_btn_check(mfbd_btn_index_t btn_index);

Expand All @@ -38,52 +40,107 @@ unsigned char bsp_btn_check(mfbd_btn_index_t btn_index);
#define BTN_WK_UP GET_PIN(A, 0)
#endif

/* default definition example */
#if MFBD_DEMO_USE_DEFAULT_DEFINE

enum
{
MFBD_DOWN_CODE_NAME(test_tbtn) = 0x1201,
MFBD_UP_CODE_NAME(test_tbtn) = 0x1200,
MFBD_LONG_CODE_NAME(test_tbtn) = 0x1202,

MFBD_DOWN_CODE_NAME(test_nbtn) = 0x1301,
MFBD_UP_CODE_NAME(test_nbtn) = 0x1300,
MFBD_LONG_CODE_NAME(test_nbtn) = 0x1301,

MFBD_DOWN_CODE_NAME(test_nbtn1) = 0x1401,
MFBD_UP_CODE_NAME(test_nbtn1) = 0x1400,
MFBD_LONG_CODE_NAME(test_nbtn1) = 0x1402,

MFBD_UP_CODE_NAME(test_mbtn) = 0x1500,
MFBD_LONG_CODE_NAME(test_mbtn) = 0x1502,
};

mfbd_btn_code_t MFBD_DOWN_CODES_NAME(test_mbtn)[4] = {0x1501, 0x1511, 0x1521, 0x1531};

#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */

#if MFBD_USE_SECTION_DEFINITION
/* use section definition. */

#if MFBD_PARAMS_SAME_IN_GROUP

/* tbtn test */
#if MFBD_USE_TINY_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_TBTN_DEFAULT_DEFINE(GROUP, NAME, BTN_INDEX) */
MFBD_TBTN_DEFAULT_DEFINE(test_btns, test_tbtn, 1);
#else
/* MFBD_TBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, BTN_DOWN_CODE, BTN_UP_CODE) */
MFBD_TBTN_DEFINE(test_btns, test_tbtn, 1, 0x1201, 0x1200);
#endif /* MFBD_USE_TINY_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_TINY_BUTTON */

/* nbtn test */
#if MFBD_USE_NORMAL_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_NBTN_DEFAULT_DEFINE(GROUP, NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME) */
MFBD_NBTN_DEFAULT_DEFINE(test_btns, test_nbtn1, 3);
MFBD_NBTN_DEFAULT_DEFINE(test_btns, test_nbtn, 2);
#else
/* MFBD_NBTN_DEFINE(NAME, BTN_INDEX, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE) */
MFBD_NBTN_DEFINE(test_btns, test_nbtn1, 3, 0x1401, 0x1400, 0x1402);

MFBD_NBTN_DEFINE(test_btns, test_nbtn, 2, 0x1301, 0x1300, 0x1301);
#endif /* MFBD_USE_NORMAL_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_NORMAL_BUTTON */

/* mbtn test */
#if MFBD_USE_MULTIFUCNTION_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_MBTN_DEFAULT_DEFINE(GROUP, NAME, BTN_INDEX, MAX_MULTICLICK_STATE) */
MFBD_MBTN_DEFAULT_DEFINE(test_btns, test_mbtn, 4, 3);
#else
/* MFBD_MBTN_DEFINE(NAME, BTN_INDEX, MAX_MULTICLICK_STATE, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE, ...) */
MFBD_MBTN_DEFINE(test_btns, test_mbtn, 4, 3, 0x1501, 0x1500, 0x1501, 0x1511, 0x1521, 0x1531);
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */

#else

/* tbtn test */
#if MFBD_USE_TINY_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_TBTN_DEFAULT_DEFINE(GROUP, NAME, BTN_INDEX, FILTER_TIME) */
MFBD_TBTN_DEFAULT_DEFINE(test_btns, test_tbtn, 1, 3);
#else
/* MFBD_TBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, BTN_DOWN_CODE, BTN_UP_CODE) */
MFBD_TBTN_DEFINE(test_btns, test_tbtn, 1, 3, 0x1201, 0x1200);
#endif /* MFBD_USE_TINY_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_TINY_BUTTON */

/* nbtn test */
#if MFBD_USE_NORMAL_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_NBTN_DEFAULT_DEFINE(GROUP, NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME) */
MFBD_NBTN_DEFAULT_DEFINE(test_btns, test_nbtn1, 3, 3, 0, 150);
MFBD_NBTN_DEFAULT_DEFINE(test_btns, test_nbtn, 2, 3, 30, 150);
#else
/* MFBD_NBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE) */
MFBD_NBTN_DEFINE(test_btns, test_nbtn1, 3, 3, 0, 150, 0x1401, 0x1400, 0x1402);

MFBD_NBTN_DEFINE(test_btns, test_nbtn, 2, 3, 30, 150, 0x1301, 0x1300, 0x1301);
#endif /* MFBD_USE_NORMAL_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_NORMAL_BUTTON */

/* mbtn test */
#if MFBD_USE_MULTIFUCNTION_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_MBTN_DEFAULT_DEFINE(GROUP, NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME, MULTICLICK_TIME, MAX_MULTICLICK_STATE) */
MFBD_MBTN_DEFAULT_DEFINE(test_btns, test_mbtn, 4, 3, 30, 150, 75, 3);
#else
/* MFBD_MBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME, MULTICLICK_TIME, MAX_MULTICLICK_STATE, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE, ...) */
MFBD_MBTN_DEFINE(test_btns, test_mbtn, 4, 3, 30, 150, 75, 3, 0x1501, 0x1500, 0x1501, 0x1511, 0x1521, 0x1531);
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */

#endif /*MFBD_PARAMS_SAME_IN_GROUP*/

Expand Down Expand Up @@ -117,45 +174,75 @@ const mfbd_group_t MFBD_GROUP_NAME(test_btns) = {

/* tbtn test */
#if MFBD_USE_TINY_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_TBTN_DEFAULT_DEFINE(NAME, BTN_INDEX) */
MFBD_TBTN_DEFAULT_DEFINE(test_tbtn, 1);
#else
/* MFBD_TBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, BTN_DOWN_CODE, BTN_UP_CODE) */
MFBD_TBTN_DEFINE(test_tbtn, 1, 0x1201, 0x1200);
#endif /* MFBD_USE_TINY_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_TINY_BUTTON */

/* nbtn test */
#if MFBD_USE_NORMAL_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_NBTN_DEFAULT_DEFINE(NAME, BTN_INDEX) */
MFBD_NBTN_DEFAULT_DEFINE(test_nbtn1, 3);
MFBD_NBTN_DEFAULT_DEFINE(test_nbtn, 2);
#else
/* MFBD_NBTN_DEFINE(NAME, BTN_INDEX, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE) */
MFBD_NBTN_DEFINE(test_nbtn1, 3, 0x1401, 0x1400, 0x1402);

MFBD_NBTN_DEFINE(test_nbtn, 2, 0x1301, 0x1300, 0x1301);
#endif /* MFBD_USE_NORMAL_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_NORMAL_BUTTON */

/* mbtn test */
#if MFBD_USE_MULTIFUCNTION_BUTTON
/* MFBD_MBTN_DEFINE(NAME, BTN_INDEX, MAX_MULTICLICK_STATE, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE, ...) */
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_MBTN_DEFAULT_DEFINE(NAME, BTN_INDEX, MAX_MULTICLICK_STATE) */
MFBD_MBTN_DEFAULT_DEFINE(test_mbtn, 4, 3);
#else
/* FBD_MBTN_DEFINE(NAME, BTN_INDEX, MAX_MULTICLICK_STATE, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE, ...) */
MFBD_MBTN_DEFINE(test_mbtn, 4, 3, 0x1501, 0x1500, 0x1501, 0x1511, 0x1521, 0x1531);
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */

#else

/* tbtn test */
#if MFBD_USE_TINY_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_TBTN_DEFAULT_DEFINE(NAME, BTN_INDEX, FILTER_TIME) */
MFBD_TBTN_DEFAULT_DEFINE(test_tbtn, 1, 3);
#else
/* MFBD_TBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, BTN_DOWN_CODE, BTN_UP_CODE) */
MFBD_TBTN_DEFINE(test_tbtn, 1, 3, 0x1201, 0x1200);
#endif /* MFBD_USE_TINY_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_TINY_BUTTON */

/* nbtn test */
#if MFBD_USE_NORMAL_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_NBTN_DEFAULT_DEFINE(NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME) */
MFBD_NBTN_DEFAULT_DEFINE(test_nbtn1, 3, 3, 0, 150);
MFBD_NBTN_DEFAULT_DEFINE(test_nbtn, 2, 3, 30, 150);
#else
/* MFBD_NBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE) */
MFBD_NBTN_DEFINE(test_nbtn1, 3, 3, 0, 150, 0x1401, 0x1400, 0x1402);

MFBD_NBTN_DEFINE(test_nbtn, 2, 3, 30, 150, 0x1301, 0x1300, 0x1301);
#endif /* MFBD_USE_NORMAL_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_NORMAL_BUTTON */

/* mbtn test */
#if MFBD_USE_MULTIFUCNTION_BUTTON
#if MFBD_DEMO_USE_DEFAULT_DEFINE
/* MFBD_MBTN_DEFAULT_DEFINE(NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME, MULTICLICK_TIME, MAX_MULTICLICK_STATE) */
MFBD_MBTN_DEFAULT_DEFINE(test_mbtn, 4, 3, 30, 150, 75, 3);
#else
/* MFBD_MBTN_DEFINE(NAME, BTN_INDEX, FILTER_TIME, REPEAT_TIME, LONG_TIME, MULTICLICK_TIME, MAX_MULTICLICK_STATE, BTN_DOWN_CODE, BTN_UP_CODE, BTN_LONG_CODE, ...) */
MFBD_MBTN_DEFINE(test_mbtn, 4, 3, 30, 150, 75, 3, 0x1501, 0x1500, 0x1501, 0x1511, 0x1521, 0x1531);
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */
#endif /* MFBD_DEMO_USE_DEFAULT_DEFINE */
#endif /* MFBD_USE_MULTIFUCNTION_BUTTON */

#endif /*MFBD_PARAMS_SAME_IN_GROUP*/

Expand Down
Loading

0 comments on commit 2719211

Please sign in to comment.