inital version
This commit is contained in:
48
buttons.h
Normal file
48
buttons.h
Normal file
@ -0,0 +1,48 @@
|
||||
#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 uint16_t usPerTick = 1000;
|
||||
static constexpr uint8_t button[] = { PD6, PD7 };
|
||||
static constexpr uint8_t buttonsAmount = sizeof(button);
|
||||
uint32_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]*usPerTick >= 1000000) _eventHandler(i, LONG_RELEASED, _userData);
|
||||
else if(buttonCount[i]*usPerTick >= 30000)_eventHandler(i, RELEASED, _userData);
|
||||
buttonCount[i] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(buttonCount[i]*usPerTick == 30000) _eventHandler(i, PRESSED, _userData);
|
||||
else if(buttonCount[i]*usPerTick == 1000000) _eventHandler(i, LONG_PRESSED, _userData);
|
||||
++buttonCount[i];
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user