整理代码格式 用空格代替TAB键

pull/18/head
Meco Man 5 years ago
parent c4cb1e10a2
commit a29a19efed

@ -5,54 +5,54 @@ struct Button btn2;
uint8_t read_button1_GPIO() uint8_t read_button1_GPIO()
{ {
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin); return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
} }
uint8_t read_button2_GPIO() uint8_t read_button2_GPIO()
{ {
return HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin); return HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin);
} }
int main() int main()
{ {
button_init(&btn1, read_button1_GPIO, 0); button_init(&btn1, read_button1_GPIO, 0);
button_init(&btn2, read_button2_GPIO, 0); button_init(&btn2, read_button2_GPIO, 0);
button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler); button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler);
button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler); button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler);
button_attach(&btn1, PRESS_REPEAT, BTN1_PRESS_REPEAT_Handler); button_attach(&btn1, PRESS_REPEAT, BTN1_PRESS_REPEAT_Handler);
button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_Click_Handler); button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_Click_Handler);
button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_Click_Handler); button_attach(&btn1, DOUBLE_CLICK, BTN1_DOUBLE_Click_Handler);
button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler); button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);
button_attach(&btn1, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler); button_attach(&btn1, LONG_PRESS_HOLD, BTN1_LONG_PRESS_HOLD_Handler);
button_attach(&btn2, PRESS_DOWN, BTN2_PRESS_DOWN_Handler); button_attach(&btn2, PRESS_DOWN, BTN2_PRESS_DOWN_Handler);
button_attach(&btn2, PRESS_UP, BTN2_PRESS_UP_Handler); button_attach(&btn2, PRESS_UP, BTN2_PRESS_UP_Handler);
button_attach(&btn2, PRESS_REPEAT, BTN2_PRESS_REPEAT_Handler); button_attach(&btn2, PRESS_REPEAT, BTN2_PRESS_REPEAT_Handler);
button_attach(&btn2, SINGLE_CLICK, BTN2_SINGLE_Click_Handler); button_attach(&btn2, SINGLE_CLICK, BTN2_SINGLE_Click_Handler);
button_attach(&btn2, DOUBLE_CLICK, BTN2_DOUBLE_Click_Handler); button_attach(&btn2, DOUBLE_CLICK, BTN2_DOUBLE_Click_Handler);
button_attach(&btn2, LONG_PRESS_START, BTN2_LONG_PRESS_START_Handler); button_attach(&btn2, LONG_PRESS_START, BTN2_LONG_PRESS_START_Handler);
button_attach(&btn2, LONG_PRESS_HOLD, BTN2_LONG_PRESS_HOLD_Handler); button_attach(&btn2, LONG_PRESS_HOLD, BTN2_LONG_PRESS_HOLD_Handler);
button_start(&btn1); button_start(&btn1);
button_start(&btn2); button_start(&btn2);
//make the timer invoking the button_ticks() interval 5ms. //make the timer invoking the button_ticks() interval 5ms.
//This function is implemented by yourself. //This function is implemented by yourself.
__timer_start(button_ticks, 0, 5); __timer_start(button_ticks, 0, 5);
while(1) while(1)
{} {}
} }
void BTN1_PRESS_DOWN_Handler(void* btn) void BTN1_PRESS_DOWN_Handler(void* btn)
{ {
//do something... //do something...
} }
void BTN1_PRESS_UP_Handler(void* btn) void BTN1_PRESS_UP_Handler(void* btn)
{ {
//do something... //do something...
} }
... ...

@ -4,34 +4,34 @@ struct Button btn1;
uint8_t read_button1_GPIO() uint8_t read_button1_GPIO()
{ {
return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin); return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
} }
int main() int main()
{ {
static uint8_t btn1_event_val; static uint8_t btn1_event_val;
button_init(&btn1, read_button1_GPIO, 0); button_init(&btn1, read_button1_GPIO, 0);
button_start(&btn1); button_start(&btn1);
//make the timer invoking the button_ticks() interval 5ms. //make the timer invoking the button_ticks() interval 5ms.
//This function is implemented by yourself. //This function is implemented by yourself.
__timer_start(button_ticks, 0, 5); __timer_start(button_ticks, 0, 5);
while(1) while(1)
{ {
if(btn1_event_val != get_button_event(&btn1)) { if(btn1_event_val != get_button_event(&btn1)) {
btn1_event_val = get_button_event(&btn1); btn1_event_val = get_button_event(&btn1);
if(btn1_event_val == PRESS_DOWN) { if(btn1_event_val == PRESS_DOWN) {
//do something //do something
} else if(btn1_event_val == PRESS_UP) { } else if(btn1_event_val == PRESS_UP) {
//do something //do something
} else if(btn1_event_val == LONG_PRESS_HOLD) { } else if(btn1_event_val == LONG_PRESS_HOLD) {
//do something //do something
} }
} }
} }
} }

@ -19,11 +19,11 @@ static struct Button* head_handle = NULL;
*/ */
void button_init(struct Button* handle, uint8_t(*pin_level)(), uint8_t active_level) void button_init(struct Button* handle, uint8_t(*pin_level)(), uint8_t active_level)
{ {
memset(handle, 0, sizeof(struct Button)); memset(handle, 0, sizeof(struct Button));
handle->event = (uint8_t)NONE_PRESS; handle->event = (uint8_t)NONE_PRESS;
handle->hal_button_Level = pin_level; handle->hal_button_Level = pin_level;
handle->button_level = handle->hal_button_Level(); handle->button_level = handle->hal_button_Level();
handle->active_level = active_level; handle->active_level = active_level;
} }
/** /**
@ -35,7 +35,7 @@ void button_init(struct Button* handle, uint8_t(*pin_level)(), uint8_t active_le
*/ */
void button_attach(struct Button* handle, PressEvent event, BtnCallback cb) void button_attach(struct Button* handle, PressEvent event, BtnCallback cb)
{ {
handle->cb[event] = cb; handle->cb[event] = cb;
} }
/** /**
@ -45,7 +45,7 @@ void button_attach(struct Button* handle, PressEvent event, BtnCallback cb)
*/ */
PressEvent get_button_event(struct Button* handle) PressEvent get_button_event(struct Button* handle)
{ {
return (PressEvent)(handle->event); return (PressEvent)(handle->event);
} }
/** /**
@ -55,98 +55,98 @@ PressEvent get_button_event(struct Button* handle)
*/ */
void button_handler(struct Button* handle) void button_handler(struct Button* handle)
{ {
uint8_t read_gpio_level = handle->hal_button_Level(); uint8_t read_gpio_level = handle->hal_button_Level();
//ticks counter working.. //ticks counter working..
if((handle->state) > 0) handle->ticks++; if((handle->state) > 0) handle->ticks++;
/*------------button debounce handle---------------*/ /*------------button debounce handle---------------*/
if(read_gpio_level != handle->button_level) { //not equal to prev one if(read_gpio_level != handle->button_level) { //not equal to prev one
//continue read 3 times same new level change //continue read 3 times same new level change
if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) { if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) {
handle->button_level = read_gpio_level; handle->button_level = read_gpio_level;
handle->debounce_cnt = 0; handle->debounce_cnt = 0;
} }
} else { //leved not change ,counter reset. } else { //leved not change ,counter reset.
handle->debounce_cnt = 0; handle->debounce_cnt = 0;
} }
/*-----------------State machine-------------------*/ /*-----------------State machine-------------------*/
switch (handle->state) { switch (handle->state) {
case 0: case 0:
if(handle->button_level == handle->active_level) { //start press down if(handle->button_level == handle->active_level) { //start press down
handle->event = (uint8_t)PRESS_DOWN; handle->event = (uint8_t)PRESS_DOWN;
EVENT_CB(PRESS_DOWN); EVENT_CB(PRESS_DOWN);
handle->ticks = 0; handle->ticks = 0;
handle->repeat = 1; handle->repeat = 1;
handle->state = 1; handle->state = 1;
} else { } else {
handle->event = (uint8_t)NONE_PRESS; handle->event = (uint8_t)NONE_PRESS;
} }
break; break;
case 1: case 1:
if(handle->button_level != handle->active_level) { //released press up if(handle->button_level != handle->active_level) { //released press up
handle->event = (uint8_t)PRESS_UP; handle->event = (uint8_t)PRESS_UP;
EVENT_CB(PRESS_UP); EVENT_CB(PRESS_UP);
handle->ticks = 0; handle->ticks = 0;
handle->state = 2; handle->state = 2;
} else if(handle->ticks > LONG_TICKS) { } else if(handle->ticks > LONG_TICKS) {
handle->event = (uint8_t)LONG_PRESS_START; handle->event = (uint8_t)LONG_PRESS_START;
EVENT_CB(LONG_PRESS_START); EVENT_CB(LONG_PRESS_START);
handle->state = 5; handle->state = 5;
} }
break; break;
case 2: case 2:
if(handle->button_level == handle->active_level) { //press down again if(handle->button_level == handle->active_level) { //press down again
handle->event = (uint8_t)PRESS_DOWN; handle->event = (uint8_t)PRESS_DOWN;
EVENT_CB(PRESS_DOWN); EVENT_CB(PRESS_DOWN);
handle->repeat++; handle->repeat++;
EVENT_CB(PRESS_REPEAT); // repeat hit EVENT_CB(PRESS_REPEAT); // repeat hit
handle->ticks = 0; handle->ticks = 0;
handle->state = 3; handle->state = 3;
} else if(handle->ticks > SHORT_TICKS) { //released timeout } else if(handle->ticks > SHORT_TICKS) { //released timeout
if(handle->repeat == 1) { if(handle->repeat == 1) {
handle->event = (uint8_t)SINGLE_CLICK; handle->event = (uint8_t)SINGLE_CLICK;
EVENT_CB(SINGLE_CLICK); EVENT_CB(SINGLE_CLICK);
} else if(handle->repeat == 2) { } else if(handle->repeat == 2) {
handle->event = (uint8_t)DOUBLE_CLICK; handle->event = (uint8_t)DOUBLE_CLICK;
EVENT_CB(DOUBLE_CLICK); // repeat hit EVENT_CB(DOUBLE_CLICK); // repeat hit
} }
handle->state = 0; handle->state = 0;
} }
break; break;
case 3: case 3:
if(handle->button_level != handle->active_level) { //released press up if(handle->button_level != handle->active_level) { //released press up
handle->event = (uint8_t)PRESS_UP; handle->event = (uint8_t)PRESS_UP;
EVENT_CB(PRESS_UP); EVENT_CB(PRESS_UP);
if(handle->ticks < SHORT_TICKS) { if(handle->ticks < SHORT_TICKS) {
handle->ticks = 0; handle->ticks = 0;
handle->state = 2; //repeat press handle->state = 2; //repeat press
} else { } else {
handle->state = 0; handle->state = 0;
} }
} else if(handle->ticks > LONG_TICKS) { } else if(handle->ticks > LONG_TICKS) {
handle->state = 5; handle->state = 5;
} }
break; break;
case 5: case 5:
if(handle->button_level == handle->active_level) { if(handle->button_level == handle->active_level) {
//continue hold trigger //continue hold trigger
handle->event = (uint8_t)LONG_PRESS_HOLD; handle->event = (uint8_t)LONG_PRESS_HOLD;
EVENT_CB(LONG_PRESS_HOLD); EVENT_CB(LONG_PRESS_HOLD);
} else { //releasd } else { //releasd
handle->event = (uint8_t)PRESS_UP; handle->event = (uint8_t)PRESS_UP;
EVENT_CB(PRESS_UP); EVENT_CB(PRESS_UP);
handle->state = 0; //reset handle->state = 0; //reset
} }
break; break;
} }
} }
/** /**
@ -156,14 +156,14 @@ void button_handler(struct Button* handle)
*/ */
int button_start(struct Button* handle) int button_start(struct Button* handle)
{ {
struct Button* target = head_handle; struct Button* target = head_handle;
while(target) { while(target) {
if(target == handle) return -1; //already exist. if(target == handle) return -1; //already exist.
target = target->next; target = target->next;
} }
handle->next = head_handle; handle->next = head_handle;
head_handle = handle; head_handle = handle;
return 0; return 0;
} }
/** /**
@ -173,15 +173,15 @@ int button_start(struct Button* handle)
*/ */
void button_stop(struct Button* handle) void button_stop(struct Button* handle)
{ {
struct Button** curr; struct Button** curr;
for(curr = &head_handle; *curr; ) { for(curr = &head_handle; *curr; ) {
struct Button* entry = *curr; struct Button* entry = *curr;
if (entry == handle) { if (entry == handle) {
*curr = entry->next; *curr = entry->next;
// free(entry); // free(entry);
} else } else
curr = &entry->next; curr = &entry->next;
} }
} }
/** /**
@ -191,9 +191,9 @@ void button_stop(struct Button* handle)
*/ */
void button_ticks() void button_ticks()
{ {
struct Button* target; struct Button* target;
for(target=head_handle; target; target=target->next) { for(target=head_handle; target; target=target->next) {
button_handler(target); button_handler(target);
} }
} }

@ -10,8 +10,8 @@
#include "string.h" #include "string.h"
//According to your need to modify the constants. //According to your need to modify the constants.
#define TICKS_INTERVAL 5 //ms #define TICKS_INTERVAL 5 //ms
#define DEBOUNCE_TICKS 3 //MAX 8 #define DEBOUNCE_TICKS 3 //MAX 8
#define SHORT_TICKS (300 /TICKS_INTERVAL) #define SHORT_TICKS (300 /TICKS_INTERVAL)
#define LONG_TICKS (1000 /TICKS_INTERVAL) #define LONG_TICKS (1000 /TICKS_INTERVAL)
@ -19,28 +19,28 @@
typedef void (*BtnCallback)(void*); typedef void (*BtnCallback)(void*);
typedef enum { typedef enum {
PRESS_DOWN = 0, PRESS_DOWN = 0,
PRESS_UP, PRESS_UP,
PRESS_REPEAT, PRESS_REPEAT,
SINGLE_CLICK, SINGLE_CLICK,
DOUBLE_CLICK, DOUBLE_CLICK,
LONG_PRESS_START, LONG_PRESS_START,
LONG_PRESS_HOLD, LONG_PRESS_HOLD,
number_of_event, number_of_event,
NONE_PRESS NONE_PRESS
}PressEvent; }PressEvent;
typedef struct Button { typedef struct Button {
uint16_t ticks; uint16_t ticks;
uint8_t repeat : 4; uint8_t repeat : 4;
uint8_t event : 4; uint8_t event : 4;
uint8_t state : 3; uint8_t state : 3;
uint8_t debounce_cnt : 3; uint8_t debounce_cnt : 3;
uint8_t active_level : 1; uint8_t active_level : 1;
uint8_t button_level : 1; uint8_t button_level : 1;
uint8_t (*hal_button_Level)(void); uint8_t (*hal_button_Level)(void);
BtnCallback cb[number_of_event]; BtnCallback cb[number_of_event];
struct Button* next; struct Button* next;
}Button; }Button;
#ifdef __cplusplus #ifdef __cplusplus

Loading…
Cancel
Save