107 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "main.h"
 | |
| #include "hw_button.h"
 | |
| 
 | |
| static void buttonIdleRoutine(ButtonKey_t *key);
 | |
| static void buttonDebounceRoutine(ButtonKey_t *key);
 | |
| static void buttonPressedRoutine(ButtonKey_t *key);
 | |
| static void buttonLongPressedRoutine(ButtonKey_t *key);
 | |
| 
 | |
| typedef void (*ButtonRoutine_t)(ButtonKey_t *);
 | |
| 
 | |
| ButtonRoutine_t button_routine[MAX_STATE] = {
 | |
|     buttonIdleRoutine,
 | |
|     buttonDebounceRoutine,
 | |
|     buttonPressedRoutine,
 | |
|     buttonLongPressedRoutine,
 | |
|     buttonLongPressedRoutine,
 | |
| };
 | |
| 
 | |
| void buttonHandler(ButtonKey_t *key)
 | |
| {
 | |
|     button_routine[key->state](key);
 | |
| }
 | |
| 
 | |
| static void buttonIdleRoutine(ButtonKey_t *key)
 | |
| {
 | |
|     if (key->pushed_state == HAL_GPIO_ReadPin(key->gpio_port, key->gpio_pin))
 | |
|     {
 | |
|         key->state = DEBOUNCE;
 | |
|         key->last_tick = HAL_GetTick();
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void buttonDebounceRoutine(ButtonKey_t *key)
 | |
| {
 | |
|     if (HAL_GetTick() - key->last_tick < key->timer_debounce)
 | |
|     {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (key->pushed_state != HAL_GPIO_ReadPin(key->gpio_port, key->gpio_pin))
 | |
|     {
 | |
|         key->state = IDLE;
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     key->state = PRESSED;
 | |
|     key->last_tick = HAL_GetTick();
 | |
|     // if (key->buttonPressed)
 | |
|     // {
 | |
|     //     key->buttonPressed(key);
 | |
|     // }
 | |
| }
 | |
| 
 | |
| static void buttonPressedRoutine(ButtonKey_t *key)
 | |
| {
 | |
|     if (key->pushed_state != HAL_GPIO_ReadPin(key->gpio_port, key->gpio_pin))
 | |
|     {
 | |
|         key->state = IDLE;
 | |
|         // if (key->buttonReleased)
 | |
|         // {
 | |
|         //     key->buttonReleased(key);
 | |
|         // }
 | |
|         if (key->buttonPressed)
 | |
|         {
 | |
|             key->buttonPressed(key);
 | |
|         }
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (HAL_GetTick() - key->last_tick < key->timer_long_pressed)
 | |
|     {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     key->state = LONGPRESSED;
 | |
|     key->last_tick = HAL_GetTick();
 | |
|     if (key->buttonLongPressed)
 | |
|     {
 | |
|         key->buttonLongPressed(key);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void buttonLongPressedRoutine(ButtonKey_t *key)
 | |
| {
 | |
|     if (key->pushed_state != HAL_GPIO_ReadPin(key->gpio_port, key->gpio_pin))
 | |
|     {
 | |
|         key->state = IDLE;
 | |
|         if (key->buttonReleased)
 | |
|         {
 | |
|             key->buttonReleased(key);
 | |
|         }
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (HAL_GetTick() - key->last_tick < key->timer_repeat_delay)
 | |
|     {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     key->state = REPEAT;
 | |
|     key->last_tick = HAL_GetTick();
 | |
|     if (key->buttonRepeat)
 | |
|     {
 | |
|         key->buttonRepeat(key);
 | |
|     }
 | |
| }
 |