Files
AsteleMotor/buttons.h
2024-06-10 20:06:08 +02:00

48 lines
1.2 KiB
C++

#pragma once
#include <avr/io.h>
#include "writepin.h"
class Buttons
{
public:
static constexpr uint8_t PRESSED = 0;
static constexpr uint8_t RELEASED = 2;
static constexpr uint8_t LONG_PRESSED = 1;
static constexpr uint8_t LONG_RELEASED= 3;
private:
volatile uint8_t * const pinReg = &PIND;
static constexpr uint8_t button[] = { PD5, PD6 };
static constexpr uint8_t buttonsAmount = sizeof(button);
uint8_t buttonCount[buttonsAmount] = {};
void* _userData;
void (*_eventHandler)(uint8_t index, uint8_t type, void* data);
public:
Buttons(void (*eventHandler)(uint8_t index, uint8_t type, void* data), void* userData = nullptr): _userData(userData), _eventHandler(eventHandler){}
void tick();
};
void Buttons::tick()
{
for(uint8_t i = 0; i < buttonsAmount; ++i)
{
if(readPin(pinReg, button[i]) == true)
{
if(buttonCount[i] >= 100) _eventHandler(i, LONG_RELEASED, _userData);
else if(buttonCount[i] >= 3)_eventHandler(i, RELEASED, _userData);
buttonCount[i] = 0;
}
else
{
if(buttonCount[i] == 3) _eventHandler(i, PRESSED, _userData);
else if(buttonCount[i] == 100) _eventHandler(i, LONG_PRESSED, _userData);
++buttonCount[i];
}
}
}