forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-06-14 d352b1982dc9b4fb2135c64cd909bb9cecc62139
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
 * Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
 * All rights reserved
 */
 
#ifndef _MULTI_BUTTON_H_
#define _MULTI_BUTTON_H_
 
//#include "stdint.h"
#include "string.h"
#include "define_all.h" 
 
//According to your need to modify the constants.
#define TICKS_INTERVAL    20    //ms
#define DEBOUNCE_TICKS    3    //MAX 8
#define SHORT_TICKS       (300 /TICKS_INTERVAL)
#define LONG_TICKS        (2000 /TICKS_INTERVAL)
 
 
typedef void (*BtnCallback)(void*);
 
typedef enum {
    PRESS_DOWN = 0,        //按下触发
    PRESS_UP,            //松开触发
    PRESS_REPEAT,        //按下repeat次触发
    SINGLE_CLICK,        //单击按键
    DOUBLE_CLICK,        //双击按键
    LONG_PRESS_START,    //长按到阈值
    LONG_PRESS_HOLD,    //长按期间一直触发
    number_of_event,
    NONE_PRESS
}PressEvent;
 
typedef struct Button {
    uint16_t ticks;
    uint8_t  repeat : 4;
    uint8_t  event : 4;//按键的事件
    uint8_t  state : 3;
    uint8_t  debounce_cnt : 3;
    uint8_t  active_level : 1;//有效的触发电平
    uint8_t  button_level : 1;
    uint8_t  (*hal_button_Level)(void);//GPIO电平读取接口的函数指针
    BtnCallback  cb[number_of_event];//声明一个BtnCallback函数指针类型的数组
    struct Button* next;//代表链表的结构体指针
}Button;
 
#ifdef __cplusplus
extern "C" {
#endif
 
void button_init(struct Button* handle, uint8_t(*pin_level)(), uint8_t active_level);
void button_attach(struct Button* handle, PressEvent event, BtnCallback cb);
PressEvent get_button_event(struct Button* handle);
int  button_start(struct Button* handle);
void button_stop(struct Button* handle);
void button_ticks(void);
 
#ifdef __cplusplus
}
#endif
 
#endif