48 lines
1.2 KiB
C++
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];
|
|
}
|
|
}
|
|
}
|