Files
ats20/button.c
Олег Бородин 9ae1e7bc07 update
2025-01-18 13:25:14 +02:00

58 lines
1.3 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>
static bool button_is_pressed(button_t *button);
void button_init(button_t *button, uintptr_t ddraddr, uintptr_t portaddr, uintptr_t pinaddr, uint8_t outnum) {
button->ddraddr = ddraddr;
button->portaddr = portaddr;
button->pinaddr = pinaddr;
button->outnum = outnum;
}
void button_setup(button_t *button) {
REG_SETDOWN_BIT(_MMIO_BYTE(button->ddraddr), button->outnum);
REG_SETUP_BIT(_MMIO_BYTE(button->portaddr), button->outnum);
}
static bool button_is_pressed(button_t *button) {
if (!REG_BIT_VALUE(_MMIO_BYTE(button->pinaddr), button->outnum)) {
return true;
}
return false;
}
bool button_was_pressed(button_t *button) {
bool was_pressed = button->was_pressed;
if (was_pressed) {
button->was_pressed = false;
button->push_time = 0;
}
return was_pressed;
}
void button_reset(button_t *button) {
button->was_pressed = false;
button->push_time = 0;
}
#define BUTTON_PRESS_TIME 30
void button_handle(button_t *button) {
if (button_is_pressed(button)) {
button->push_time++;
}
if (button->push_time > BUTTON_PRESS_TIME) {
button->was_pressed = true;
}
}