From a29a19efed71b928d75eac12e9f25173adfd021e Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Thu, 22 Apr 2021 05:46:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=20=E7=94=A8=E7=A9=BA=E6=A0=BC=E4=BB=A3=E6=9B=BFTAB?= =?UTF-8?q?=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/example_callback.c | 66 +++++----- examples/example_poll.c | 50 ++++---- multi_button.c | 240 ++++++++++++++++++------------------ multi_button.h | 42 +++---- 4 files changed, 199 insertions(+), 199 deletions(-) diff --git a/examples/example_callback.c b/examples/example_callback.c index d774069..2d5fd76 100644 --- a/examples/example_callback.c +++ b/examples/example_callback.c @@ -5,54 +5,54 @@ struct Button btn2; 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() { - return HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin); + return HAL_GPIO_ReadPin(B2_GPIO_Port, B2_Pin); } int main() { - button_init(&btn1, read_button1_GPIO, 0); - button_init(&btn2, read_button2_GPIO, 0); - - button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler); - button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler); - button_attach(&btn1, PRESS_REPEAT, BTN1_PRESS_REPEAT_Handler); - button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_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_HOLD, BTN1_LONG_PRESS_HOLD_Handler); - - button_attach(&btn2, PRESS_DOWN, BTN2_PRESS_DOWN_Handler); - button_attach(&btn2, PRESS_UP, BTN2_PRESS_UP_Handler); - button_attach(&btn2, PRESS_REPEAT, BTN2_PRESS_REPEAT_Handler); - button_attach(&btn2, SINGLE_CLICK, BTN2_SINGLE_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_HOLD, BTN2_LONG_PRESS_HOLD_Handler); - - button_start(&btn1); - button_start(&btn2); - - //make the timer invoking the button_ticks() interval 5ms. - //This function is implemented by yourself. - __timer_start(button_ticks, 0, 5); - - while(1) - {} + button_init(&btn1, read_button1_GPIO, 0); + button_init(&btn2, read_button2_GPIO, 0); + + button_attach(&btn1, PRESS_DOWN, BTN1_PRESS_DOWN_Handler); + button_attach(&btn1, PRESS_UP, BTN1_PRESS_UP_Handler); + button_attach(&btn1, PRESS_REPEAT, BTN1_PRESS_REPEAT_Handler); + button_attach(&btn1, SINGLE_CLICK, BTN1_SINGLE_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_HOLD, BTN1_LONG_PRESS_HOLD_Handler); + + button_attach(&btn2, PRESS_DOWN, BTN2_PRESS_DOWN_Handler); + button_attach(&btn2, PRESS_UP, BTN2_PRESS_UP_Handler); + button_attach(&btn2, PRESS_REPEAT, BTN2_PRESS_REPEAT_Handler); + button_attach(&btn2, SINGLE_CLICK, BTN2_SINGLE_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_HOLD, BTN2_LONG_PRESS_HOLD_Handler); + + button_start(&btn1); + button_start(&btn2); + + //make the timer invoking the button_ticks() interval 5ms. + //This function is implemented by yourself. + __timer_start(button_ticks, 0, 5); + + while(1) + {} } void BTN1_PRESS_DOWN_Handler(void* btn) { - //do something... + //do something... } void BTN1_PRESS_UP_Handler(void* btn) { - //do something... + //do something... } -... \ No newline at end of file +... diff --git a/examples/example_poll.c b/examples/example_poll.c index 054cd72..180e90b 100644 --- a/examples/example_poll.c +++ b/examples/example_poll.c @@ -2,36 +2,36 @@ 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() { - static uint8_t btn1_event_val; - - button_init(&btn1, read_button1_GPIO, 0); - button_start(&btn1); - - //make the timer invoking the button_ticks() interval 5ms. - //This function is implemented by yourself. - __timer_start(button_ticks, 0, 5); - - while(1) - { - if(btn1_event_val != get_button_event(&btn1)) { - btn1_event_val = get_button_event(&btn1); - - if(btn1_event_val == PRESS_DOWN) { - //do something - } else if(btn1_event_val == PRESS_UP) { - //do something - } else if(btn1_event_val == LONG_PRESS_HOLD) { - //do something - } - } - } + static uint8_t btn1_event_val; + + button_init(&btn1, read_button1_GPIO, 0); + button_start(&btn1); + + //make the timer invoking the button_ticks() interval 5ms. + //This function is implemented by yourself. + __timer_start(button_ticks, 0, 5); + + while(1) + { + if(btn1_event_val != get_button_event(&btn1)) { + btn1_event_val = get_button_event(&btn1); + + if(btn1_event_val == PRESS_DOWN) { + //do something + } else if(btn1_event_val == PRESS_UP) { + //do something + } else if(btn1_event_val == LONG_PRESS_HOLD) { + //do something + } + } + } } diff --git a/multi_button.c b/multi_button.c index c05ca91..d789bd7 100644 --- a/multi_button.c +++ b/multi_button.c @@ -19,11 +19,11 @@ static struct Button* head_handle = NULL; */ void button_init(struct Button* handle, uint8_t(*pin_level)(), uint8_t active_level) { - memset(handle, 0, sizeof(struct Button)); - handle->event = (uint8_t)NONE_PRESS; - handle->hal_button_Level = pin_level; - handle->button_level = handle->hal_button_Level(); - handle->active_level = active_level; + memset(handle, 0, sizeof(struct Button)); + handle->event = (uint8_t)NONE_PRESS; + handle->hal_button_Level = pin_level; + handle->button_level = handle->hal_button_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) { - 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) { - 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) { - uint8_t read_gpio_level = handle->hal_button_Level(); - - //ticks counter working.. - if((handle->state) > 0) handle->ticks++; - - /*------------button debounce handle---------------*/ - if(read_gpio_level != handle->button_level) { //not equal to prev one - //continue read 3 times same new level change - if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) { - handle->button_level = read_gpio_level; - handle->debounce_cnt = 0; - } - } else { //leved not change ,counter reset. - handle->debounce_cnt = 0; - } - - /*-----------------State machine-------------------*/ - switch (handle->state) { - case 0: - if(handle->button_level == handle->active_level) { //start press down - handle->event = (uint8_t)PRESS_DOWN; - EVENT_CB(PRESS_DOWN); - handle->ticks = 0; - handle->repeat = 1; - handle->state = 1; - } else { - handle->event = (uint8_t)NONE_PRESS; - } - break; - - case 1: - if(handle->button_level != handle->active_level) { //released press up - handle->event = (uint8_t)PRESS_UP; - EVENT_CB(PRESS_UP); - handle->ticks = 0; - handle->state = 2; - - } else if(handle->ticks > LONG_TICKS) { - handle->event = (uint8_t)LONG_PRESS_START; - EVENT_CB(LONG_PRESS_START); - handle->state = 5; - } - break; - - case 2: - if(handle->button_level == handle->active_level) { //press down again - handle->event = (uint8_t)PRESS_DOWN; - EVENT_CB(PRESS_DOWN); - handle->repeat++; - EVENT_CB(PRESS_REPEAT); // repeat hit - handle->ticks = 0; - handle->state = 3; - } else if(handle->ticks > SHORT_TICKS) { //released timeout - if(handle->repeat == 1) { - handle->event = (uint8_t)SINGLE_CLICK; - EVENT_CB(SINGLE_CLICK); - } else if(handle->repeat == 2) { - handle->event = (uint8_t)DOUBLE_CLICK; - EVENT_CB(DOUBLE_CLICK); // repeat hit - } - handle->state = 0; - } - break; - - case 3: - if(handle->button_level != handle->active_level) { //released press up - handle->event = (uint8_t)PRESS_UP; - EVENT_CB(PRESS_UP); - if(handle->ticks < SHORT_TICKS) { - handle->ticks = 0; - handle->state = 2; //repeat press - } else { - handle->state = 0; - } - } else if(handle->ticks > LONG_TICKS) { - handle->state = 5; - } - break; - - case 5: - if(handle->button_level == handle->active_level) { - //continue hold trigger - handle->event = (uint8_t)LONG_PRESS_HOLD; - EVENT_CB(LONG_PRESS_HOLD); - - } else { //releasd - handle->event = (uint8_t)PRESS_UP; - EVENT_CB(PRESS_UP); - handle->state = 0; //reset - } - break; - } + uint8_t read_gpio_level = handle->hal_button_Level(); + + //ticks counter working.. + if((handle->state) > 0) handle->ticks++; + + /*------------button debounce handle---------------*/ + if(read_gpio_level != handle->button_level) { //not equal to prev one + //continue read 3 times same new level change + if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) { + handle->button_level = read_gpio_level; + handle->debounce_cnt = 0; + } + } else { //leved not change ,counter reset. + handle->debounce_cnt = 0; + } + + /*-----------------State machine-------------------*/ + switch (handle->state) { + case 0: + if(handle->button_level == handle->active_level) { //start press down + handle->event = (uint8_t)PRESS_DOWN; + EVENT_CB(PRESS_DOWN); + handle->ticks = 0; + handle->repeat = 1; + handle->state = 1; + } else { + handle->event = (uint8_t)NONE_PRESS; + } + break; + + case 1: + if(handle->button_level != handle->active_level) { //released press up + handle->event = (uint8_t)PRESS_UP; + EVENT_CB(PRESS_UP); + handle->ticks = 0; + handle->state = 2; + + } else if(handle->ticks > LONG_TICKS) { + handle->event = (uint8_t)LONG_PRESS_START; + EVENT_CB(LONG_PRESS_START); + handle->state = 5; + } + break; + + case 2: + if(handle->button_level == handle->active_level) { //press down again + handle->event = (uint8_t)PRESS_DOWN; + EVENT_CB(PRESS_DOWN); + handle->repeat++; + EVENT_CB(PRESS_REPEAT); // repeat hit + handle->ticks = 0; + handle->state = 3; + } else if(handle->ticks > SHORT_TICKS) { //released timeout + if(handle->repeat == 1) { + handle->event = (uint8_t)SINGLE_CLICK; + EVENT_CB(SINGLE_CLICK); + } else if(handle->repeat == 2) { + handle->event = (uint8_t)DOUBLE_CLICK; + EVENT_CB(DOUBLE_CLICK); // repeat hit + } + handle->state = 0; + } + break; + + case 3: + if(handle->button_level != handle->active_level) { //released press up + handle->event = (uint8_t)PRESS_UP; + EVENT_CB(PRESS_UP); + if(handle->ticks < SHORT_TICKS) { + handle->ticks = 0; + handle->state = 2; //repeat press + } else { + handle->state = 0; + } + } else if(handle->ticks > LONG_TICKS) { + handle->state = 5; + } + break; + + case 5: + if(handle->button_level == handle->active_level) { + //continue hold trigger + handle->event = (uint8_t)LONG_PRESS_HOLD; + EVENT_CB(LONG_PRESS_HOLD); + + } else { //releasd + handle->event = (uint8_t)PRESS_UP; + EVENT_CB(PRESS_UP); + handle->state = 0; //reset + } + break; + } } /** @@ -156,14 +156,14 @@ void button_handler(struct Button* handle) */ int button_start(struct Button* handle) { - struct Button* target = head_handle; - while(target) { - if(target == handle) return -1; //already exist. - target = target->next; - } - handle->next = head_handle; - head_handle = handle; - return 0; + struct Button* target = head_handle; + while(target) { + if(target == handle) return -1; //already exist. + target = target->next; + } + handle->next = head_handle; + head_handle = handle; + return 0; } /** @@ -173,15 +173,15 @@ int button_start(struct Button* handle) */ void button_stop(struct Button* handle) { - struct Button** curr; - for(curr = &head_handle; *curr; ) { - struct Button* entry = *curr; - if (entry == handle) { - *curr = entry->next; -// free(entry); - } else - curr = &entry->next; - } + struct Button** curr; + for(curr = &head_handle; *curr; ) { + struct Button* entry = *curr; + if (entry == handle) { + *curr = entry->next; +// free(entry); + } else + curr = &entry->next; + } } /** @@ -191,9 +191,9 @@ void button_stop(struct Button* handle) */ void button_ticks() { - struct Button* target; - for(target=head_handle; target; target=target->next) { - button_handler(target); - } + struct Button* target; + for(target=head_handle; target; target=target->next) { + button_handler(target); + } } diff --git a/multi_button.h b/multi_button.h index 6cf54d7..7c56f9e 100644 --- a/multi_button.h +++ b/multi_button.h @@ -10,8 +10,8 @@ #include "string.h" //According to your need to modify the constants. -#define TICKS_INTERVAL 5 //ms -#define DEBOUNCE_TICKS 3 //MAX 8 +#define TICKS_INTERVAL 5 //ms +#define DEBOUNCE_TICKS 3 //MAX 8 #define SHORT_TICKS (300 /TICKS_INTERVAL) #define LONG_TICKS (1000 /TICKS_INTERVAL) @@ -19,28 +19,28 @@ typedef void (*BtnCallback)(void*); typedef enum { - PRESS_DOWN = 0, - PRESS_UP, - PRESS_REPEAT, - SINGLE_CLICK, - DOUBLE_CLICK, - LONG_PRESS_START, - LONG_PRESS_HOLD, - number_of_event, - NONE_PRESS + PRESS_DOWN = 0, + PRESS_UP, + PRESS_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); - BtnCallback cb[number_of_event]; - struct Button* next; + 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); + BtnCallback cb[number_of_event]; + struct Button* next; }Button; #ifdef __cplusplus