From 30b04a8ba2beceea84aab10d9a5cc7c463b75ddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=91=D0=BE=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Wed, 21 Aug 2024 13:37:43 +0200 Subject: [PATCH] update --- button.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ button.h | 14 +++++++++ 2 files changed, 104 insertions(+) create mode 100644 button.c create mode 100644 button.h 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