#include "../include/SwitchableEncodeur.h" IRAM_ATTR void switchEncoder() { static unsigned long last_interrupt_time = 0; unsigned long interrupt_time = millis(); // If interrupts come faster than 200ms, assume it's a bounce and ignore if (interrupt_time - last_interrupt_time > 200){ SwitchableEncodeur::getInstance()->addMenu(); } last_interrupt_time = interrupt_time; } SwitchableEncodeur* SwitchableEncodeur::instance = nullptr; SwitchableEncodeur::SwitchableEncodeur(uint8_t pin1, uint8_t pin2, uint8_t pinSW, int nbMenu): Encoder(pin1, pin2){ SwitchableEncodeur::instance = this; this->menu = 0; this->nbMenu = nbMenu; pinMode(pinSW, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(pinSW), switchEncoder, RISING); this->oldPosition = -999; this->oldMenu = -999; } void SwitchableEncodeur::resetMenu() { this->menu = 0; } void SwitchableEncodeur::addMenu() { this->menu++; if (this->menu > this->nbMenu) { this->menu = 0; } } int SwitchableEncodeur::getMenu() { return this->menu; } SwitchableEncodeur* SwitchableEncodeur::getInstance() { return SwitchableEncodeur::instance; } bool SwitchableEncodeur::update() { bool sortie = false; long newPosition = this->read()/4; if (newPosition != this->oldPosition || this->menu != this->oldMenu) { this->oldMenu = this->menu; this->oldPosition = newPosition; if(this->oldPosition < 0){ this->oldPosition = 0; } sortie = true; } return sortie; } int SwitchableEncodeur::getValue() { return this->oldPosition; } void SwitchableEncodeur::resetValue() { this->oldPosition = 0; }