steering-wheel/lib/RotaryEncoder/RotaryEncoder.cpp

52 lines
1.4 KiB
C++

#include "RotaryEncoder.h"
RotaryEncoder::RotaryEncoder(int ENC_A, int ENC_B, int multiplier, int stepSize, int pauseLength) {
_ENC_A = ENC_A;
_ENC_B = ENC_B;
_multiplier = multiplier;
_stepSize = stepSize;
_pauseLength = pauseLength;
_oldENC_A = 0;
_oldENC_B = 0;
_lastENCread = 0;
_ENCcounter = 0;
_lastENCreadTime = micros();
//define pin modes
pinMode(_ENC_A, INPUT);
pinMode(_ENC_B, INPUT);
digitalWrite(_ENC_A,HIGH); //these pins do not have pull up resistors on an attiny...
digitalWrite(_ENC_B,HIGH); //you must pull them up on the board.
}
int RotaryEncoder::readEncoder() {
int a0Pin = digitalRead(_ENC_A);
int a1Pin = digitalRead(_ENC_B);
int changevalue = 1;
int returnVal = 0;
if(a0Pin != _oldENC_A || a1Pin != _oldENC_B) {
if(_oldENC_A == a1Pin && _oldENC_B != a0Pin) {
returnVal = 1;
} else if (_oldENC_B == a0Pin && _oldENC_A != a1Pin) {
returnVal = -1;
}
_oldENC_A = a0Pin;
_oldENC_B = a1Pin;
if(returnVal != 0) {
if(returnVal == _lastENCread) {
_ENCcounter++;
if((micros() - _lastENCreadTime) < _pauseLength) {
changevalue = max((_ENCcounter/_stepSize)*_multiplier,1);
}
_lastENCreadTime = micros();
} else {
_ENCcounter=0;
}
_lastENCread = returnVal;
}
return returnVal*changevalue;
} else {
return 0;
}
}