2022-03-23 18:23:26 +00:00
|
|
|
#include <knob>
|
|
|
|
|
|
|
|
Knob::Knob(int minimum, int maximum) {
|
|
|
|
Knob::minimum = minimum;
|
|
|
|
Knob::maximum = maximum;
|
|
|
|
Knob::A = false;
|
|
|
|
Knob::B = false;
|
|
|
|
Knob::rotPlusOnePrev = false;
|
|
|
|
Knob::rotMinOnePrev = false;
|
|
|
|
Knob::rotation = 0;
|
|
|
|
}
|
|
|
|
|
2022-03-24 22:18:18 +00:00
|
|
|
Knob::Knob(int minimum, int maximum, int initialRotation) {
|
|
|
|
Knob::minimum = minimum;
|
|
|
|
Knob::maximum = maximum;
|
|
|
|
Knob::A = false;
|
|
|
|
Knob::B = false;
|
|
|
|
Knob::rotPlusOnePrev = false;
|
|
|
|
Knob::rotMinOnePrev = false;
|
|
|
|
Knob::rotation = initialRotation;
|
|
|
|
}
|
|
|
|
|
2022-03-23 18:23:26 +00:00
|
|
|
int Knob::getRotation() {
|
|
|
|
return Knob::rotation;
|
|
|
|
};
|
|
|
|
|
|
|
|
void Knob::updateRotation(bool ANew, bool BNew) {
|
|
|
|
bool rotPlusOneNew = (!B && !A && !BNew && ANew) ||
|
|
|
|
(!B && A && BNew && ANew) ||
|
|
|
|
(B && !A && !BNew && !ANew) ||
|
|
|
|
(B && A && BNew && !ANew);
|
|
|
|
|
|
|
|
bool rotMinOneNew = (!B && !A && BNew && !ANew) ||
|
|
|
|
(!B && A && !BNew && !ANew) ||
|
|
|
|
(B && !A && BNew && ANew) ||
|
|
|
|
(B && A && !BNew && ANew);
|
|
|
|
|
|
|
|
bool impossibleState = (!B && !A && BNew && ANew) ||
|
|
|
|
(!B && A && BNew && !ANew) ||
|
|
|
|
(B && !A && !BNew && ANew) ||
|
|
|
|
(B && A && !BNew && !ANew);
|
|
|
|
|
|
|
|
if (rotPlusOneNew || (impossibleState && rotPlusOnePrev))
|
2022-03-24 22:18:18 +00:00
|
|
|
rotation += 1;
|
2022-03-23 18:23:26 +00:00
|
|
|
if (rotMinOneNew || (impossibleState && rotMinOnePrev))
|
2022-03-24 22:18:18 +00:00
|
|
|
rotation -= 1;
|
2022-03-23 18:23:26 +00:00
|
|
|
if (rotation < minimum)
|
|
|
|
rotation = minimum;
|
|
|
|
if (rotation > maximum)
|
|
|
|
rotation = maximum;
|
|
|
|
|
|
|
|
A = ANew;
|
|
|
|
B = BNew;
|
|
|
|
if (!impossibleState) {
|
|
|
|
rotPlusOnePrev = rotPlusOneNew;
|
|
|
|
rotMinOnePrev = rotMinOneNew;
|
|
|
|
}
|
2022-03-24 22:18:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Knob::changeLimitsVolume(int newMinimum, int newMaximum) {
|
|
|
|
if(newMaximum>maximum){
|
|
|
|
rotation = rotation<<1;
|
|
|
|
}else if(newMaximum<maximum){
|
|
|
|
rotation = rotation>>1;
|
|
|
|
}else{}
|
|
|
|
minimum = newMinimum;
|
|
|
|
maximum = newMaximum;
|
|
|
|
};
|