diff --git a/button.c b/button.c new file mode 100644 index 0000000..8a7df7e --- /dev/null +++ b/button.c @@ -0,0 +1,90 @@ +/* + * Copyright 2017-2024 Oleg Borodin + */ + +#include +#include + +#include + +#include +#include + +typedef struct { + bool was_pressed; + bool strokes_ended; + uint16_t time_counter; + uint16_t released_time; + uint16_t push_counter; +} button_t; + +button_t button; + +void button_init(void) { + /* D3 PD3: Set key input */ + REG_SETDOWN_BIT(DDRD, PD3); + REG_SETUP_BIT(PORTD, PD3); +} + +bool button_is_pressed(void) { + if (REG_BIT_VALUE(PIND, PD3)) { + return true; + } + return false; +} + +uint8_t button_get(void) { + if (button.strokes_ended) { + uint8_t counter = button.push_counter; + button.was_pressed = false; + button.time_counter = 0; + button.push_counter = 0; + button.strokes_ended = false; + return counter; + } + return 0; +} + +void button_reset(void) { + button.was_pressed = false; + button.time_counter = 0; + button.push_counter = 0; + button.strokes_ended = false; +} + +#define BUTTON_TIME_PRESSED 100 +#define BUTTON_TIME_RELEASED 100 +#define BUTTON_RELEASED_TIME 1500 + +void button_handle(void) { + if (!button.strokes_ended) { + if (!button.was_pressed) { + if (button_is_pressed()) { + button.time_counter++; + button.released_time++; + } + if (button.time_counter > BUTTON_TIME_PRESSED) { + button.time_counter = 0; + button.was_pressed = true; + } + } else { + if (!button_is_pressed()) { + button.time_counter++; + } + if (button.time_counter > BUTTON_TIME_RELEASED) { + button.time_counter = 0; + button.was_pressed = false; + button.push_counter++; + button.released_time = 0; + } + } + if (button.push_counter > 0) { + button.released_time++; + if (button.released_time > BUTTON_RELEASED_TIME) { + button.strokes_ended = true; + } + } else { + button.released_time = 0; + } + } +} diff --git a/button.h b/button.h new file mode 100644 index 0000000..f3d2404 --- /dev/null +++ b/button.h @@ -0,0 +1,14 @@ +/* + * Copyright 2017-2024 Oleg Borodin + */ + +#ifndef BUTTON_H_QWERTY +#define BUTTON_H_QWERTY + +void button_init(void); +void button_reset(void); +bool button_is_pressed(void); +void button_handle(void); +uint8_t button_get(void); + +#endif