Files
fun_gen_amp_test/app/drivers/hw_button/hw_button.c
2023-09-25 21:32:15 +02:00

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