Files
pa50contr/button.c
Олег Бородин bcc15559c2 update
2024-08-26 23:21:17 +02:00

90 lines
2.0 KiB
C

/*
* Copyright 2017-2024 Oleg Borodin <onborodin@gmail.com>
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <button.h>
#include <tool.h>
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;
}
bool button_was_pressed(void) {
if (button.push_counter > 0) {
return true;
}
return false;
}
uint8_t button_get(void) {
if (button.strokes_ended) {
uint8_t counter = button.push_counter;
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.released_time = 0;
button.strokes_ended = false;
}
#define BUTTON_TIME_PRESSED 20
#define BUTTON_TIME_RELEASED 20
#define BUTTON_RELEASED_TIME 300
void button_handle(void) {
if (!button.strokes_ended) {
if (!button.was_pressed) {
if (button_is_pressed()) {
button.time_counter++;
}
if (button.time_counter > BUTTON_TIME_PRESSED) {
button.time_counter = 0;
button.was_pressed = true;
button.released_time = 0;
}
} else {
if (!button_is_pressed()) {
button.time_counter++;
}
if (button.time_counter > BUTTON_TIME_RELEASED) {
button.push_counter++;
button.time_counter = 0;
button.was_pressed = false;
button.released_time = 0;
}
}
if (button.released_time++ > BUTTON_RELEASED_TIME) {
button.strokes_ended = true;
button.was_pressed = false;
button.time_counter = 0;
button.released_time = 0;
}
}
}