Clement 58516e5f7c feat: V1 fonctionnel OK (#8)
Reviewed-on: #8
Co-authored-by: Clement <c.boesmier@aptatio.com>
Co-committed-by: Clement <c.boesmier@aptatio.com>
2023-12-03 12:24:37 +01:00

75 lines
1.9 KiB
C++

#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);//FIXME: maybe change to FALLING
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 < 0){
newPosition = 0;
this->readAndReset();
}
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;
this->readAndReset();
}
void SwitchableEncodeur::setValue(int val){
this->write(val*4);
}