Хотелось бы узнать у знающих людей насколько жизнеспособна такая функция для меню на LCD1602.
Вроде как будто работает. Интересует мнение на сам алгоритм.
Особенность дисплея или библиотеки, при выводе строки первый символ не должен быть пробелом. иначе все рушится. Пришлось использовать строку такую “> пункт <”
#define T_FOLDER 0 // Тип меню - папка
#define T_APP 1 // Функция для выполнения кода
struct menuStruct { // создаём ярлык структуры меню
uint8_t type; // тип меню папка или функция , если функция , то mode1 - номер функции, mode2 - параметры функций
uint8_t parent; // номер родителя, верхний уровень 0.
uint8_t mode1; // стартовый номер дочернего пункта меню в массиве MenuTable
uint8_t mode2; // колличество пунктов меню
char name[32]; // название пункта меню
};
//массив структуры меню
static PROGMEM menuStruct MenuTable[] = {
T_FOLDER, 0, 1, 3," МЕНЮ ", // Меню 0 Это MenuLevel
T_FOLDER, 0, 2, 3,"> Промывка <", // 1
T_APP, 1, 2, 3,">Старт промывки<", // 2
T_APP, 1, 2, 3,"> Стоп промывки<", // 3
T_APP, 1, 2, 3,"> Выход <", // 4
T_FOLDER, 0, 6, 5,"> Настройка <", // 5
T_FOLDER, 5, 6, 2,"> Громкость <",
T_APP, 6, 6, 2,">Уровень умолч.<",
T_APP, 6, 6, 2,"> Выход <",
T_FOLDER, 5, 10,3,"> Налив <",
T_APP, 6, 1, 3, "Уровень",
T_APP, 6, 2, 3, "Проверка",
T_APP, 6, 3, 3, "Выход",
T_FOLDER, 5, 14,3,"> Тип тостов <",
T_APP, 6, 1, 3, "Случайно",
T_APP, 6, 2, 3, "По порядку",
T_APP, 6, 3, 3, "Выход",
T_FOLDER, 5, 18,3,"> Тип налива <",
T_APP, 6, 1, 1, "Стандартный",
T_APP, 6, 2, 1, "Игра",
T_APP, 6, 3, 1,"> Выход <",
T_APP, 5, 1, 1,"> Выход <",
T_APP, 0, 2, 1,"> Выход <"
};
uint8_t menuLevel = 0; // Текущий уровень меню
//======= Функция обработки меню ==================================================================
void menuEnter(int command){ // command - это номер родителя меню
menuLevel = MenuTable[command].mode1; // Устанавливает номер дочернего меню в массиве меню
int i =0;
int timeavtoexitstart = millis();
lcd.clear() ;
u_int8_t currentMenuItem = 1; // Устанавливает номер текущего пункта меню
while ((millis() - timeavtoexitstart < 60000) || i==2) // автовыход из пунктов меню через 1 минуту
{
lcd.setCursor(0, 0); // Устанавливает курсор в (позицию,Строка)
lcd.print(MenuTable[command].name);
lcd.setCursor(0, 1); // Устанавливает курсор в (позицию,Строка)
lcd.print(MenuTable[menuLevel].name);
i = opros_encoder();
switch (i) {
case 0:
// выполнить, если значение == 0
break;
case 1:
// выполнить, если значение == 1
{
if (MenuTable[menuLevel].type==0)
{
int menuLevelOld = menuLevel;
menuEnter(MenuTable[menuLevel].mode1-1); // передали в функцию меню номер родителя
menuLevel = menuLevelOld;
}
if (MenuTable[menuLevel].type==1)
{
// Выполнить функцию привязанную к данному меню
menuCommand(menuLevel);
return;
}
}
break;
case 2:
// выполнить, если значение == 2
break;
case 3:
// выполнить, если значение == 3
{ //Serial.println(" отработали козу Повернули вправо шаг меню вниз");
currentMenuItem++;
if (currentMenuItem>MenuTable[command].mode2)
{
currentMenuItem --;
menuLevel --;
}
do {
menuLevel++;
} while (command!=MenuTable[menuLevel].parent);
timeavtoexitstart = millis();
}
break;
case 4:
// выполнить, если значение == 4
{ //Serial.println(" отработали козу Повернули влево шаг меню вверх");
currentMenuItem--;
if (currentMenuItem<1)
{
currentMenuItem ++;
menuLevel ++;
}
do {
menuLevel--;
} while (command!=MenuTable[menuLevel].parent);
timeavtoexitstart = millis();
}
break;
}
}
lcd.clear();
lcd.setCursor(3, 0); // Первый аргумент позиция, второй строка
lcd.print("Наливатор");
lcd.setCursor(4, 1);
lcd.print("Версия 1");
menuLevel = command; // Устанавливает уровень меню в начальное состояние
}