1 Star 0 Fork 0

iot-solution_admin/button

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

概述

一个c语言实现的按键服务组件,支持单击、双击、长按、松开、自动消抖,可以自由设置组合按键,可用于GPIO及ADC类型按键。

接口定义

int button_srv_init(void)

按键服务初始化

  • 返回值:
    • 成功返回0,失败返回-1
int button_init(const button_config_t b_tbl[])

单按键列表初始化

  • 参数
    • b_tbl :单按键列表
  • 返回值:
    • 成功返回0,失败返回-1
typedef struct button_config {
    int pin_id;      //按键 pin id
    int evt_flag;    //订阅的按键事件类型
    evt_cb cb;       //按键事件用户回调函数
    void *priv;      //按键事件用户回调函数的自定义参数
    int type;        //按键类型
    char name[MAX_BUTTON_NAME]; //按键名
} button_config_t;
#define PRESS_DOWN_FLAG (1<<BUTTON_PRESS_DOWN)            //单击
#define PRESS_UP_FLAG (1<<BUTTON_PRESS_UP)                //松开
#define PRESS_LONG_DOWN_FLAG (1<<BUTTON_PRESS_LONG_DOWN)  //长按
#define DOUBLE_PRESS_FLAG (1<<BUTTON_PRESS_DOUBLE)        //双击
#define EVT_ALL_FLAG (PRESS_DOWN_FLAG | PRESS_UP_FLAG | DOUBLE_PRESS_FLAG | PRESS_LONG_DOWN_FLAG)  //以上所有事件

typedef enum {
    BUTTON_TYPE_GPIO,/* GPIO按键 支持中断方式*/
    BUTTON_TYPE_ADC, /* ADC按键 */
} button_type_t;
typedef void (*evt_cb)(button_evt_id_t event_id, char *name, void *priv);
  • 参数
    • event_id :事件类型
    • name: 按键名
    • priv: 用户自定义参数
typedef enum {
    BUTTON_PRESS_DOWN = 0,       //单击
    BUTTON_PRESS_UP,             //松开
    BUTTON_PRESS_LONG_DOWN,      //长按
    BUTTON_PRESS_DOUBLE,         //双击
    BUTTON_COMBINATION,          //组合按键事件

    BUTTON_EVT_END
} button_evt_id_t;
int button_param_cur(char *name, button_param_t *p);
int button_param_set(char *name, button_param_t *p);

获取/设置按键参数

  • 参数
    • name:按键名
    • p :按键参数
  • 返回值:
    • 成功返回0,失败返回-1
typedef struct button_param {
    int st_tmout;   //min pin active level time(soft elimination buffeting time)
    int ld_tmout;   //min long press time
    int dd_tmout;   //max double press time interval
    int active_level;
    const char *adc_name; //if button is adc_button, it has
    int range; 			//if button is adc_button, it has
    int vref; //if button is adc_button, it has
} button_param_t;
int button_combination_init(const button_combinations_t bc_tbl[])

组合按键列表初始化

  • 参数
    • b_tbl :组合按键列表
  • 返回值:
    • 成功返回0,失败返回-1

注意:adc类型按键不支持组合键

typedef struct button_combinations button_combinations_t

struct button_combinations {
    int pin_id[MAX_COMBINATION_NUM]; //按键pin id
    int pin_sum; //组合按键总数
    int evt_flag; //订阅的按键事件类型
    int tmout; //组合按键间隔时长
    evt_cb cb; //按键事件用户回调函数
    void *priv; //按键事件用户回调函数的自定义参数
    char name[MAX_BUTTON_NAME]; //组合按键名
};

示例代码

const static char *log_buf[] = {
    "down",
    "up",
    "down_l",
    "d_down",
    "bc",
};

static void button_evt(button_evt_id_t event_id, char *name, void *priv)
{
    LOGE(TAG, "key[%s]:%s", name, log_buf[event_id]);
}
/* 按键表 */
const static button_config_t button_table[] = {
    {APP_KEY_MUTE,    EVT_ALL_FLAG, button_evt, NULL, BUTTON_TYPE_GPIO, "mute"},
    {APP_KEY_VOL_INC, EVT_ALL_FLAG, button_evt, NULL, BUTTON_TYPE_GPIO,  "inc"},
    {APP_KEY_VOL_DEC, EVT_ALL_FLAG, button_evt, NULL, BUTTON_TYPE_GPIO,  "dec"},
    {0, 0, NULL, NULL},
};

/* 组合按键表 */
const static button_combinations_t bc_table[] = {
    {
        .pin_name[0] = "mute",
        .pin_name[1] = "inc",
        .evt_flag = PRESS_LONG_DOWN_FLAG,
        .pin_sum = 2,
        .tmout = 500,
        .cb = button_evt,
        .priv = NULL,
        .name = "mute&inc"
    },
    {
        .pin_name[0] = "mute",
        .pin_name[1] = "dec",
        .evt_flag = PRESS_LONG_DOWN_FLAG,
        .pin_sum = 2,
        .tmout = 500,
        .cb = button_evt,
        .priv = NULL,
        .name = "mute&dec"
    },
    {
        .pin_sum = 0,
        .cb = NULL,
    },
};

int main()
{
    board_yoc_init(); //板级初始化
    LOGD(TAG, "%s\n", aos_get_app_version());
    button_srv_init(); // 按键服务初始化
    button_init(button_table); // 初始化按键表
    button_param_t pb;
    button_param_cur("mute", &pb); // 获取“mute”按键当前参数
    pb.ld_tmout = 5000;            // 更改长按时间为5000ms
    button_param_set("mute", &pb); 
    button_param_set("inc", &pb);
    button_param_set("dec", &pb); //设置按键参数
    button_combination_init(bc_table); // 初始化组合按键表

    return 0;
}

空文件

简介

{"name": "button", "description": "按键服务组件,支持通过GPIO和ADC控制。", "versions": "v7.3.0", "license": "Apache license v2.0", "type": "common", "depends": ["csi", "rhino", "aos"]} 展开 收起
取消

发行版

暂无发行版

贡献者 (1)

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/iot-solution_admin/button.git
git@gitee.com:iot-solution_admin/button.git
iot-solution_admin
button
button
V1.0.3

搜索帮助