#pragma once #include #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]; } } }