Вот как-то так оно работает
На видео показаны основные фишки моего варианта:
Скроллинг меню, если на дисплее оно целиком не вмещается. Выделение активного пункта в данном случае сделано "прочеркиванием" двумя линиями, но, естественно, можно сделать, как угодно.
- - Выполнение команд меню без завершения самого меню (с завершением тоже можно).
- Наличие в меню пунктов со значениями параметров. Выделенный параметр сразу может редактироваться в заданных пределах.
- Возможность вложенных меню.
Меню с видео описывается в коде так:
Код: Выделить всё
// главное меню
// id name parent prev next func|subm property
MENU_CMD( mm_1, "BEEP", NONE, NONE, mm_2, beep);
MENU_PROP(mm_2, "TEST", NONE, mm_1, mm_3, NULL, PROP_U8(u8, NOSTORE, 0, 12));
MENU_PROP(mm_3, "MOTOR", NONE, mm_2, mm_4, motor, PROP_BOOL(motor_state, NOSTORE, sf("STOP"), sf("RUN")));
MENU_SUB( mm_4, "SUBMENU", NONE, mm_3, mm_5, sm_1);
MENU_PROP(mm_5, "TEMPERATURE", NONE, mm_4, mm_6, NULL, PROP_I16(vfr, NOSTORE, -20, 20));
MENU_CMD( mm_6, "LOAD", NONE, mm_5, mm_7, load);
MENU_CMD( mm_7, "SAVE & EXIT", NONE, mm_6, NONE, save);
// субменю
MENU_CMD( sm_1, "STOP DEMO 1", mm_4, NONE, sm_2, done);
MENU_CMD( sm_2, "STOP DEMO 2", mm_4, sm_1, sm_3, done);
MENU_SUB( sm_3, "STOP SUB", mm_4, sm_2, NONE, ssm_1);
// субменю 2
MENU_CMD(ssm_1, "SUB STOP DEMO 1", sm_3, NONE, ssm_2, done);
MENU_CMD(ssm_2, "SUB STOP DEMO 2", sm_3, ssm_1, ssm_3, done);
MENU_CMD(ssm_3, "SUB STOP DEMO 3", sm_3, ssm_2, NONE, done);- - целое число (со знаком и без оного, 8 и 16 бит), причем число можно выводить в десятичной или шестнадцатеричной форме;
- булево значение (т.е. логическое) - оно отображается парой соответствующих строк текста;
- выбор одного варианта из нескольких - каждый вариант так же представляется соответствующим текстом.
Таким образом, моя система меню сразу позволяет решить следующие задачи, практически всегда присутствующие в проектах на МК с ЖКИ:
- - организовать процесс "настройки" всех параметров при помощи интуитивного меню;
- сохранять автоматически в EEPROM все свойства, используемые в меню, и загружать их оттуда.
Думаю, многие знают, что не всегда просто решить, напрмер, интерактивную регулировку яркости подсветки дисплея. Часто делают так: в меню выбирают пункт, по активации которого выводится редактор яркости (то ли шкала, то ли число), а потом, когда ввод нового значения яркости завершен, работа с меню завершается, и задается новое значение яркости. Так вот, в моей системе яркость может меняться одновременно с изменением соответствующего свойства! На видео вы могли видеть, как включается и выключается "моторчик" - точно так же можно выполнять какую-то функцию при каждом изменении числа. То есть реализован полностью интерактивный способ изменения всех свойств! И прощайте странные цифры, обозначающие включение или отключение каких-то режимов - здравствуйте понятные слова!


