added drivers
This commit is contained in:
106
app/drivers/hw_button/hw_button.c
Normal file
106
app/drivers/hw_button/hw_button.c
Normal file
@@ -0,0 +1,106 @@
|
||||
#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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user