diff --git a/README.md b/README.md index b0bfd81..f13d8b3 100644 --- a/README.md +++ b/README.md @@ -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`:按键键值的类型。 @@ -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按键事件 ### 单击事件 @@ -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定义示例中宏定义的方式定义按键进行操作 @@ -403,7 +424,7 @@ extern void mfbd_group_reset(const mfbd_group_t *_pbtn_group); ## MFBD段定义 -段定义(Section-Definition)是程序编译期间会将不同的程序内容放到不同的程序段中,再通过链接器链接为固件。 +段定义(Section-Definition)是程序编译期间会将不同的程序内容放到不同的程序段中,再通过链接器链接为固件。段定义同样也支持默认定义方式。 ### GROUP命名和其他对应名称关系 @@ -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__ \ } ``` @@ -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使用方法 @@ -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 ``` ### 段定义调用按键检测 -由于使用了段定义,所以程序无法判断一个组是否有所有的按键种类。所以可能会出错,此时需要通过自行调整检测宏来进行按键检测。 +由于使用了段定义,所以程序无法判断一个组是否有所有的使能的按键种类。所以可能会出错,此时需要通过自行调整检测的宏来进行按键检测。 默认的按键扫描宏如下: @@ -526,8 +548,6 @@ GUN gcc工程需要在工程的ld文件中找到`rodata`的初始化链接代码 } while (0) ``` -这样就可以进行正确的通过编译了。 - ### 段定义调用按键复位 和段定义调用按键检测一样,需要自行调整程序,删除组内没有用到的按键复位函数宏。 diff --git a/examples/mfbd_demo_rtt.c b/examples/mfbd_demo_rtt.c index 23c6c9e..290db9f 100644 --- a/examples/mfbd_demo_rtt.c +++ b/examples/mfbd_demo_rtt.c @@ -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); @@ -38,6 +40,31 @@ 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. */ @@ -45,45 +72,75 @@ unsigned char bsp_btn_check(mfbd_btn_index_t btn_index); /* 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*/ @@ -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*/ diff --git a/mfbd.c b/mfbd.c index 6cca8a6..ca787bb 100644 --- a/mfbd.c +++ b/mfbd.c @@ -348,7 +348,7 @@ void mfbd_mbtn_scan(const mfbd_group_t *_pbtn_group) { _pbtn_group->btn_value_report(_pbtn->btn_info->btn_up_code); } - +#if MFBD_MULTICLICK_STATE_AUTO_RESET /* if multiclick_state is not 0 and less than max_multiclick_state, inc multiclick_state */ if (((MFBD_MULTICLICK_TIME_IN_FUC) != 0) \ && (_pbtn->multiclick_state < _pbtn->btn_info->max_multiclick_state) \ @@ -357,6 +357,18 @@ void mfbd_mbtn_scan(const mfbd_group_t *_pbtn_group) _pbtn->multiclick_state++; _pbtn->multiclick_count = 0; } +#else + /* if multiclick_state is not 0 and less than max_multiclick_state, inc multiclick_state */ + if (((MFBD_MULTICLICK_TIME_IN_FUC) != 0) \ + && (!((((MFBD_LONG_TIME_IN_FUC) > 0) && (_pbtn->btn_info->btn_long_code != 0)) && (_pbtn->long_count >= (MFBD_LONG_TIME_IN_FUC))))) + { + if(_pbtn->multiclick_state < _pbtn->btn_info->max_multiclick_state) + { + _pbtn->multiclick_state++; + } + _pbtn->multiclick_count = 0; + } +#endif else { /* over max multi-click times or (long event and repeat event) happened, reset to 0. */ diff --git a/mfbd.h b/mfbd.h index 98d0f17..e6c825b 100644 --- a/mfbd.h +++ b/mfbd.h @@ -30,6 +30,11 @@ typedef enum MFBD_BTN_STATE_LONG, } MFBD_BTN_STATE_t; +#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. */ +#define MFBD_DOWN_CODES_NAME(NAME) NAME##_DOWN_CODES /* when using mbtn default define api, this is long-codes name. */ + /* tiny button definitions, tiny button functions only support down and up event. */ #if MFBD_PARAMS_SAME_IN_GROUP diff --git a/mfbd_cfg.h b/mfbd_cfg.h index 4b3f219..badc903 100644 --- a/mfbd_cfg.h +++ b/mfbd_cfg.h @@ -144,4 +144,12 @@ #define MFBD_PARAMS_SAME_IN_GROUP 0 #endif +/* set MFBD_MULTICLICK_STATE_AUTO_RESET to 1 will auto reset multiclick state to 0 when reach to max multicick state. */ +#ifdef PKG_MFBD_MULTICLICK_STATE_AUTO_RESET + #define MFBD_MULTICLICK_STATE_AUTO_RESET 1 +#else + /* if you are not use mfbd in rt-thread, you can change this instead. */ + #define MFBD_MULTICLICK_STATE_AUTO_RESET 0 +#endif + #endif /* _MFBD_CFG_H_ */ diff --git a/mfbd_sd.c b/mfbd_sd.c index e255c19..864e3ca 100644 --- a/mfbd_sd.c +++ b/mfbd_sd.c @@ -356,7 +356,7 @@ void mfbd_mbtn_scan(const mfbd_group_t *_pbtn_group, const mfbd_mbtn_info_t *_pb { _pbtn_group->btn_value_report(_pbtn_info->btn_up_code); } - +#if MFBD_MULTICLICK_STATE_AUTO_RESET /* if multiclick_state is not 0 and less than max_multiclick_state, inc multiclick_state */ if (((MFBD_MULTICLICK_TIME_IN_FUC) != 0) \ && (_pbtn_info->btn->multiclick_state < _pbtn_info->max_multiclick_state) \ @@ -365,6 +365,18 @@ void mfbd_mbtn_scan(const mfbd_group_t *_pbtn_group, const mfbd_mbtn_info_t *_pb _pbtn_info->btn->multiclick_state++; _pbtn_info->btn->multiclick_count = 0; } +#else + /* if multiclick_state is not 0 and less than max_multiclick_state, inc multiclick_state */ + if (((MFBD_MULTICLICK_TIME_IN_FUC) != 0) \ + && (!((((MFBD_LONG_TIME_IN_FUC) > 0) && (_pbtn_info->btn_long_code != 0)) && (_pbtn_info->btn->long_count >= (MFBD_LONG_TIME_IN_FUC))))) + { + if(_pbtn_info->btn->multiclick_state < _pbtn_info->max_multiclick_state) + { + _pbtn_info->btn->multiclick_state++; + } + _pbtn_info->btn->multiclick_count = 0; + } +#endif else { /* over max multi-click times or (long event and repeat event) happened, reset to 0. */ diff --git a/mfbd_sd.h b/mfbd_sd.h index 0d416f3..83a4d10 100644 --- a/mfbd_sd.h +++ b/mfbd_sd.h @@ -23,6 +23,11 @@ typedef enum MFBD_BTN_STATE_LONG, } MFBD_BTN_STATE_t; +#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. */ +#define MFBD_DOWN_CODES_NAME(NAME) NAME##_DOWN_CODES /* when using mbtn default define api, this is long-codes name. */ + #if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */ #define __MFBD_SECTION(x) __attribute__((section(x))) #define MFBD_USED __attribute__((used)) @@ -438,9 +443,9 @@ typedef struct _mfbd_group_struct #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__ \ } extern void mfbd_tbtn_scan(const mfbd_group_t *_pbtn_group, const mfbd_tbtn_info_t *_pbtn_info_start, const mfbd_tbtn_info_t *_pbtn_info_end);