mirror of
https://github.com/supleed2/ELEC60013-ES-CW2.git
synced 2024-11-14 12:35:48 +00:00
91 lines
2.1 KiB
C++
91 lines
2.1 KiB
C++
#include <knob>
|
|
|
|
Knob::Knob(int minimum, int maximum, int initialRotation) {
|
|
Knob::minimum = minimum;
|
|
Knob::maximum = maximum;
|
|
Knob::A = false;
|
|
Knob::B = false;
|
|
Knob::previousRotation = NONE;
|
|
Knob::rotation = initialRotation;
|
|
Knob::rotationInternal = initialRotation;
|
|
}
|
|
|
|
int Knob::getRotation() {
|
|
return Knob::rotation;
|
|
};
|
|
|
|
void Knob::setRotation(int newRotation) {
|
|
rotation = newRotation;
|
|
rotationInternal = newRotation;
|
|
};
|
|
|
|
void Knob::updateRotation(bool ANew, bool BNew) {
|
|
if (A == ANew && B == BNew)
|
|
return; // No change, do not update values
|
|
|
|
bool fullstep = (BNew && ANew) || (!BNew && !ANew);
|
|
|
|
bool cwRot = (!B && !A && !BNew && ANew) ||
|
|
(!B && A && BNew && ANew) ||
|
|
(B && !A && !BNew && !ANew) ||
|
|
(B && A && BNew && !ANew);
|
|
|
|
bool acwRot = (!B && !A && BNew && !ANew) ||
|
|
(!B && A && !BNew && !ANew) ||
|
|
(B && !A && BNew && ANew) ||
|
|
(B && A && !BNew && ANew);
|
|
|
|
bool impossible = (!B && !A && BNew && ANew) ||
|
|
(!B && A && BNew && !ANew) ||
|
|
(B && !A && !BNew && ANew) ||
|
|
(B && A && !BNew && !ANew);
|
|
|
|
if (cwRot) {
|
|
if (previousRotation == CW && fullstep) {
|
|
rotationInternal++;
|
|
} else if (previousRotation == ACW && fullstep) {
|
|
previousRotation = NONE;
|
|
} else {
|
|
previousRotation = CW;
|
|
}
|
|
} else if (acwRot) {
|
|
if (previousRotation == ACW && fullstep) {
|
|
rotationInternal--;
|
|
} else if (previousRotation == CW && fullstep) {
|
|
previousRotation = NONE;
|
|
} else {
|
|
previousRotation = ACW;
|
|
}
|
|
} else if (impossible) {
|
|
if (fullstep) {
|
|
switch (previousRotation) {
|
|
case NONE: // Step skipped and no previous direction
|
|
break;
|
|
case CW:
|
|
rotationInternal++;
|
|
break;
|
|
case ACW:
|
|
rotationInternal--;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
A = ANew;
|
|
B = BNew;
|
|
if (rotationInternal < minimum)
|
|
rotationInternal = minimum;
|
|
if (rotationInternal > maximum)
|
|
rotationInternal = maximum;
|
|
rotation = rotationInternal;
|
|
}
|
|
|
|
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;
|
|
}; |