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);
|
|
}
|
|
}
|