@minash87,Попытаюсь объяснить, что происходит.
Изменение переменной
EnableRAW
происходит непосредственно там, где это написано в коде.
Проблема в том, что метод
Enc.tick()
выполняется каждый цикл, и не зависимо от того какая функция из
switch
вызывается, в объекте
Enc
может хранится состояние, которое могло произойти до вызова необходимой функции.
В вашем конкретном случае, пока обрабатывается
case 0:
может быть выполнен поворот с нажатием, это состояние хранится в объекте
Enc
. И когда произошло переключение, на первой же итерации проверка
if (Enc.rightH()) { EnableRAW = 1; }
может сработать и поменять значение EnableRAW.
По хорошему, необходимо сбрасывать состояние всех кнопок, включая энкодер, при смене режима, т.е. при каждом присвоении MenuPage нового значения выполнять метод
resetState()
для всех объектов? которые вызывали
tick()
. иначе может ловить подобные побочные эффекты и дальше.
как вариант могу предложить сделать обертку над значением, чтобы сократить множество писанины, и не сильно вмешиваться в уже реализованный код.
template<
typename T, void (*ChangeHandler)(const T& prev, const T& now)
> class valueWrapper final {
public:
using type = T;
using thisType = valueWrapper<type, ChangeHandler>;
using reference = thisType&;
using constReference = const reference;
using changeHandler = void (*)(const T& prev, const T& now);
constReference operator=(constReference rhs) { T prev = value; value = rhs.value; ChangeHandler(prev, value); return *this; }
constReference operator=(type rhs) { T prev = value; value = rhs; ChangeHandler(prev, value); return *this; }
bool operator==(constReference rhs) const { return (value == rhs.value); }
bool operator==(type rhs) const { return (value == rhs); }
operator type() { return value; }
valueWrapper(type defaultValue) : value(defaultValue) { }
private:
type value;
};
template<typename T>
void ChangeMenuPage(const T& prev, const T& now) {
if (prev != now) {
Enc.resetState();
BtnStart.resetState();
BtnStop.resetState();
BtnMenu.resetState();
BtnExit.resetState();
}
}
// Меню
//uint8_t MenuPage = 0; // Меню
valueWrapper<uint8_t, ChangeMenuPage<uint8_t> > MenuPage{0}; // Меню
данная обертка ведет себя как обычная целочисленная переменная (касаемо операций присвоения и получения значения), при вызове операции присваивания, например:
MenuPage = 10;
будет вызвана функция обработчик
ChangeMenuPage()
, в которой будет произведен сброс состояний всех объектов. Таким образом состояния будут сбрасываться всегда, при присвоении
MenuPage
нового значения.