Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » Организация меню в проекте с дисплеем


Организация меню в проекте с дисплеем

Сообщений 1 страница 2 из 2

1

Всем привет!

Я МК занимась сравнительно недавно и как то раньше особо не заморачивался такой темой как меню. Для себя и хобби можно вообще сделать что угодно, но это для себя...
Так получилось что по работе пришлось поддерживать и развивать чужой , недоделанный проект на stm32.(первый мой не хоббийный опыт)
Много что вызывает сомнения и непонимание в чужом коде , потратил неделю на форматирование кода в читабельный вид и написание комментариев(вообще не было комментариев, но зато куча вложенных циклов и функции размеров на пять экранов) Ну это все можно поправить, тем более что самое сложное в проекте это не сам МК, а некие расчеты которые он делает(математика).
Ну что мне явно не нравится это МЕНЮ. Насколько я понимаю меню писалась быстро и чисто для тестов функционала. в итоге меню практически нет, оно тормозит, глючит и трудно дополняемое и поддерживаемое в будущем. Зато места занимает очень много. Сунулся в интернете , а там куча вариантов и все разные....

Для меня более авторитетно услышать мнения форумчан на эту тему. Нужно простенькое небольшое меню с минимум вложений, управление 4 кнопками. Хотелось бы узнать как вы решали подобные задачи.

2

моя давняя тема, вот хочу рассказать как я сделал менюшку

в основном мейне я выделил несколько частей кода
1. работа с данными, внешними прерываниями и т.д.
2. графическая часть

1)
ну работа с данными в основном происходит так

Код:
 if (statusgps)
              {               
                NMEA_Parser_GGA();
                GpsDataInMainstructure();
                statusgps=0;                 
              }

если есть флаг что пришли данные GPS ( когда буфер DMA заполнился) я обрабатываю данные и заношу их структуры которые отвечают за основные данные.
по такому же принципу работают другие обработчики ( ацп встроенных батарей устройства, юарт на ПК, драйвер который выплевывает данные на экран по ДМА , обработчик данных с внешних АЦП и прочее)

2) графическая часть заключается в заполнении буфера вывода на экран.
Сделан он на простом

Код:
switch (window)
                {
                ShowDrawMenu: DrawMenu();
                    break;
                case ShowSettingsList: DrawSettingsList();
                    break;
                case ShowGpsList: DrawGpsList();
                    break;
             // и т.д.

чтобы не мучаться, я просто задефайнил название окон

Код:
#define ShowDrawMenu 5
#define ShowSettingsList 6
#define ShowGpsList 7

чтобы не выдумывать название функций с стал называть с слова DRAW

в каждой такой функции я ввел статическую переменную для курсора (static uint8_t kursor=0; ) и выделил две части функции
1. часть отображение данных - в которой уже стоят функции которые заполняют данным буфер для отображения (например список подменю) чисто отображение без какой то логики.
2. часть которая отвечает за обработку результатов нажатия кнопок. благодаря этой части иногда может меняться первая часть. например выделяться курсор  ,изменяется общая модель данных или осуществляется переход на другие страницы меню.

Код:
if ((Setbutton[1])           // флаг нажатия кнопки SET
      {
        while (!Setbutton[0){}       // флаг того что кнопка отпущена
        if (kursor==0) {window=ShowDrawMenu;}     // выбор подменю или основного окна
        if (kursor==1) {window=ShowGpsList; } 
        if (kursor==2) {window=ShowSettingsList; } 
        SetButtonClear();            // очистка флагов
      }

конечно можно сказать что есть место где while простаивает, но опять же  основная часть данных обрабатывается в прерываниях и через дма, и лишь потом изменяется обращая модель данных, при этом нажатие кнопок пользователем достаточно важная часть которой можно позволить такие задержки.

___
в итоге достаточно быстро можно создавать новые окна, не париться с их названием и выбором или достаточно быстро поменять меню и выбрать другое окно. Возможно профи скажут что это топорно сделано или что это велосипед, но как показала практика вполне рабочий вариант.

Вот решил поделиться.


Вы здесь » Микроконтроллеры » Архив » Организация меню в проекте с дисплеем