Hi, You are my NO. visitor, Welcome!
I'm an Embedded Software Engineer
- Focusing on OpenSource Software
- Using ST & ESP & Nordic & TI & WCH
I'm Learning
- BLE & BLE MESH
- 6LOWPAN
Multi-Function Button Detection for MCU.
License: Apache License 2.0
const mfbd_btn_code_t KEY2_DOWN_CODES[2] =
{
KEY2_CLICK_1,
KEY2_CLICK_2,
};
#if MFBD_USE_MULTIFUCNTION_BUTTON//重复时间与长按时间请大于滤波时间
/* 名称, 按键索引, 最大点击数量 */
MFBD_MBTN_DEFAULT_DEFINE(KEY2, KID_KEY2, 2);
MFBD_MBTN_ARRAYLIST(mbtn_list, &KEY2);
日志输出如下:
KEY2_UP_CODE
[warn] unknow btn_value:52636
KEY2_UP_CODE
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
[warn] unknow btn_value:52636
KEY2_UP_CODE
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
[warn] unknow btn_value:52636
KEY2_UP_CODE
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
/* it means the button is down for over filter_time. */
if (_pbtn->state == MFBD_BTN_STATE_UP)
{
_pbtn->state = MFBD_BTN_STATE_DOWN;
/* clear long_count. */
_pbtn->long_count = 0;
if (_pbtn->btn_info->btn_down_code[_pbtn->multiclick_state] > 0)
{
+ printf("multiclick_state %d\n", _pbtn->multiclick_state);
_pbtn_group->btn_value_report(_pbtn->btn_info->btn_down_code[_pbtn->multiclick_state]);
}
}
multiclick_state 2
[warn] unknow btn_value:52692
KEY2_UP_CODE
multiclick_state 2
[warn] unknow btn_value:52692
KEY2_UP_CODE
multiclick_state 2
[warn] unknow btn_value:52692
KEY2_UP_CODE
multiclick_state 2
[warn] unknow btn_value:52692
KEY2_UP_CODE
multiclick_state 2
[warn] unknow btn_value:52692
KEY2_UP_CODE
multiclick_state 2
[warn] unknow btn_value:52692
现在把初始化中修改如下,这并不符合直觉逻辑
//这里需要为1才是正常的
+ MFBD_MBTN_DEFAULT_DEFINE(KEY2, KID_KEY2, 1);
在日志中就不会出现错误的键值代码
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
KEY2_CLICK_1
KEY2_UP_CODE
KEY2_CLICK_2
KEY2_UP_CODE
/* it means the button is down for over filter_time. */
if (_pbtn->state == MFBD_BTN_STATE_UP)
{
_pbtn->state = MFBD_BTN_STATE_DOWN;
/* clear long_count. */
_pbtn->long_count = 0;
if (_pbtn->btn_info->btn_down_code[_pbtn->multiclick_state] > 0)
{
printf("mbtn down code: %d\n", _pbtn->btn_info->btn_down_code[_pbtn->multiclick_state]);
_pbtn_group->btn_value_report(_pbtn->btn_info->btn_down_code[_pbtn->multiclick_state]);
}
}
mbtn down code: 52688
[warn] unknow btn_value:52688
KEY2_UP_CODE
mbtn down code: 52688
[warn] unknow btn_value:52688
KEY2_UP_CODE
mbtn down code: 52688
[warn] unknow btn_value:52688
KEY2_UP_CODE
mbtn down code: 52688
[warn] unknow btn_value:52688
KEY2_UP_CODE
mbtn down code: 52688
+ if(_pbtn->multiclick_state < _pbtn->btn_info->max_multiclick_state - 1)
{
_pbtn->multiclick_state++;
printf("MFBD_BTN_STATE_UP %d\r\n", _pbtn->multiclick_state);
}
尝鲜了一下段定义的mbtn模式,这时候定义最大点击数量为2就是正常的
MFBD_GROUP_DEFINE(test_btns, bsp_btn_check, bsp_btn_value_report);
/*支持Button单击&长按的操作*/
#if MFBD_USE_NORMAL_BUTTON
/* 名称, 按键索引 */
MFBD_NBTN_DEFAULT_DEFINE(test_btns, KEY1, KID_KEY1);
//MFBD_NBTN_ARRAYLIST(nbtn_list, &KEY1);
#endif /* MFBD_USE_NORMAL_BUTTON */
#if MFBD_USE_MULTIFUCNTION_BUTTON//重复时间与长按时间请大于滤波时间
/* 名称, 按键索引, 最大点击数量 */
MFBD_MBTN_DEFAULT_DEFINE(test_btns ,KEY2, KID_KEY2, 2);
使用段 167200 2880 56648 226728 375a8 application.elf
未使用段 167216 2924 56624 226764 375cc application.elf
例如:定义一个枚举存放按键索引。
一个枚举存放按键键值。
我只要通过宏定义输入按键名称。
就能生成对应的索引与各个状态的键值。这样方便查看与编写。
我尝试过操作,搞不出来。
大概像如下这样的枚举
/* 按键ID*/
typedef enum
{
KID_Stop_Button = 0X00,
KID_WK_UP,
KID_Before_Radar_1,
KID_Before_Radar_2,
KID_Before_Radar_3,
KID_Start_Button,
KID_Article_Crash,
KID_Turn_ALM,
KID_Walk_ALM,
HARD_KEY_NUM,// 实体按键个数
}KEY_ID;
/*
定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
推荐使用enum, 不用#define,原因:
(1) 便于新增键值,方便调整顺序,使代码看起来舒服点
(2) 编译器可帮我们避免键值重复。
/
typedef enum
{
KEY_NONE = 0X00U, / 0 表示按键事件 */
KEY_WK_UP_DOWN, /* 4键按下 /
KEY_WK_UP_UP, / 4键弹起 /
KEY_WK_UP_LONG, / 4键长按 */
KEY_TURN_ZERO_DOWN, /* 1键按下 /
KEY_TURN_ZERO_UP, / 1键弹起 /
KEY_TURN_ZERO_LONG, / 1键长按 */
KEY_TURN_LIMIT_DOWN, /* 2键按下 /
KEY_TURN_LIMIT_UP, / 2键弹起 /
KEY_TURN_LIMIT_LONG, / 2键长按 */
KEY_TURN_ALM_DOWN, /* 3键按下 /
KEY_TURN_ALM_UP, / 3键弹起 /
KEY_TURN_ALM_LONG, / 3键长按 /
}KEY_CODE;
/ 名称, 按键索引, 滤波时间, 重复时间,长按时间,按下键值, 松开键值 长按键值) */
MFBD_NBTN_DEFINE(STOP_BUTTON, KID_Stop_Button, 3, 0, 150, KEY_TURN_ZERO_DOWN, KEY_TURN_ZERO_UP, KEY_TURN_ZERO_LONG);
MFBD_NBTN_DEFINE(turn_limit, KID_TURN_LIMIT, 3, 0, 150, KEY_TURN_LIMIT_DOWN, KEY_TURN_LIMIT_UP,KEY_TURN_LIMIT_LONG);
MFBD_NBTN_DEFINE(turn_alm, KID_TURN_ALM, 3, 0, 150, KEY_TURN_ALM_DOWN, KEY_TURN_ALM_UP, KEY_TURN_ALM_LONG);
MFBD_NBTN_DEFINE(WK_UP, KID_WK_UP, 3, 0, 150, KEY_WK_UP_DOWN, KEY_WK_UP_UP, KEY_WK_UP_LONG);
/* 名称, 按键索引, 滤波时间, 重复时间,长按时间,按下键值, 松开键值 长按键值) /
MFBD_NBTN_DEFINE(STOP_BUTTON, KID_Stop_Button, 3, 0, 150, KEY_TURN_ZERO_DOWN, KEY_TURN_ZERO_UP, KEY_TURN_ZERO_LONG);
MFBD_NBTN_DEFINE(turn_limit, KID_TURN_LIMIT, 3, 0, 150, KEY_TURN_LIMIT_DOWN, KEY_TURN_LIMIT_UP,KEY_TURN_LIMIT_LONG);
MFBD_NBTN_DEFINE(turn_alm, KID_TURN_ALM, 3, 0, 150, KEY_TURN_ALM_DOWN, KEY_TURN_ALM_UP, KEY_TURN_ALM_LONG);
MFBD_NBTN_DEFINE(WK_UP, KID_WK_UP, 3, 0, 150, KEY_WK_UP_DOWN, KEY_WK_UP_UP, KEY_WK_UP_LONG);
/
/
void Key_Handle(mfbd_btn_code_t ucKeyCode)
{
if (ucKeyCode != KEY_NONE)
{
switch (ucKeyCode)
{
case KEY_WK_UP_UP:
LOG_I("WK_UP UP");
break;
case KEY_WK_UP_DOWN:
LOG_I("WK_UP DOWN");
break;
case KEY_WK_UP_LONG:
LOG_I("WK_UP LONG");
break;
case KEY_TURN_ZERO_UP:
LOG_I("turn zero sensor UP");
break;
case KEY_TURN_ZERO_DOWN:
LOG_I("turn zero sensor DOWN");
break;
case KEY_TURN_ZERO_LONG:
LOG_I("turn zero sensor LONG");
break;
case KEY_TURN_LIMIT_UP:
LOG_I("turn limit sensor UP");
break;
case KEY_TURN_LIMIT_DOWN:
LOG_I("turn limit sensor DOWN");
break;
case KEY_TURN_LIMIT_LONG:
LOG_I("turn limit sensor LONG");
break;
case KEY_TURN_ALM_UP:
LOG_I("turn alm sensor UP");
break;
case KEY_TURN_ALM_DOWN:
LOG_I("turn alm sensor DOWN");
break;
case KEY_TURN_ALM_LONG:
LOG_I("turn alm sensor LONG");
break;
default:
/ 其它的键值不处理 */
break;
}
}
}
由于更改配置会直接修改mfbd_cfg.h头文件。
导致我在用git 上传代码时,显示:modified: mfbd_cfg.h
没法上传。就只能删除子模块git文件。变成自己的文件,而且无法获取更新了。
建议在rt_config.h里进行配置就好
/* set MFBD_USE_TINY_BUTTON to 1 will enable tiny button functions. */
#define MFBD_USE_TINY_BUTTON 0
/* set MFBD_USE_NORMAL_BUTTON to 1 will enable normal button functions. */
#define MFBD_USE_NORMAL_BUTTON 1
/* set MFBD_USE_MULTIFUCNTION_BUTTON to 1 will enable multifunction button functions. */
#define MFBD_USE_MULTIFUCNTION_BUTTON 0
/* set MFBD_USE_BTN_SCAN_PRE_FUNC to 1 will enable running prepare_function before run button detection function */
#define MFBD_USE_BTN_SCAN_PRE_FUNC 0
/* set MFBD_USE_BTN_SCAN_AFTER_FUNC to 1 will enable running after_function after run button detection function */
#define MFBD_USE_BTN_SCAN_AFTER_FUNC 0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.