К основному контенту

Кушать подано!

 Поскольку кормят нас повара и санитары, решил повысить уровень обслуживания, сделав меню.


То есть, вдохновившись всем известным MicroMenu, сделал свой вариант "библиотечки" дл создания меню в проектах на микроконтроллерах AVR. На видео показаны основные фишки моего варианта:

  • Скроллинг меню, если на дисплее оно целиком не вмещается. Выделение активного пункта в данном случае сделано "прочеркиванием" двумя линиями, но, естественно, можно сделать, как угодно.
  • Выполнение команд меню без завершения самого меню (с завершением тоже можно).
  • Наличие в меню пунктов со значениями параметров. Выделенный параметр сразу может редактироваться в заданных пределах.
  • Возможность вложенных меню.

Есть еще ряд фишек, но на видео они не видны... Вот так выглядит код, создающий структуру меню, показанную на видео:

// главное меню
//	 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);

Кто работал с MicroMenu, тому подобный способ описания структуры меню будет знаком. Как видите, главное отличие в том, что пункты имеют разный размер, т.е. количество полей разное. Это позволяет экономить память в некоторых случаях. С другой стороны, добавилась возможность добавить новое поле, которое я назвал по-русски свойством, а по-английски property. Пункты меню, имеющие такое поле, позволяют видеть значение свойства и менять его интерактивно - на видео вы это видели.

Реализована поддержка следующих свойств:

  • целое число (со знаком и без оного, 8 и 16 бит), причем число можно выводить в десятичной или шестнадцатеричной форме;
  • булево значение (т.е. логическое) - оно отображаетс парой соответствующих строк текста;
  • выбор одного варианта из нескольких - каждый вариант так же представляется соответствующим текстом.

Относительно просто добавить поддержку и 32-битных чисел... Но надо ли? Вводить их значение при помощи кнопок "навигации" - это удовольствие не из приятных... При желании это можно реализовать по-старинке - написав свою функцию и назначив её нужному пункту меню...

Таким образом, моя система меню сразу позволяет решить следующие задачи, практически всегда присутствующие в проектах на МК с ЖКИ:

  • организовать процесс "настройки" всех параметров при помощи интуитивного меню;
  • сохранять автоматически в EEPROM все свойства, используемые в меню, и загружать их оттуда.

То есть теперь достаточно описать пункты меню вместе с соответствующими свойствами, выделить место под переменные для этих свойств (эти переменные затем использовать по назначению в программе), выделить место в EEPROM для сохранения значений этих свойств (все это указывается при создании свойства в пункте меню), и в нужный момент вызвать созданное меню на дисплей - все остальные заботы я уже решил!

Думаю, многие знают, что не всегда просто решить, например, интерактивную регулировку яркости подсветки дисплея. Часто делают так: в меню выбирают пункт, по активации которого выводится редактор яркости (то ли шкала, то ли число), а потом, когда ввод нового значения яркости завершен, работа с меню завершается, и задается новое значение яркости. Так вот, в моей системе яркость может меняться одновременно с изменением соответствующего свойства! На видео вы могли видеть, как включается и выключается "моторчик" - точно так же можно выполнять какую-то функцию при каждом изменении числа. То есть реализован полностью интерактивный способ изменения всех свойств! И прощайте странные цифры, обозначающие включение или отключение каких-то режимов - здравствуйте понятные слова!

Надеюсь, моё меню сможет удоветворить самый изысканный вкус любого гурмана...

Комментарии

Популярные сообщения из этого блога

Все ниже, и ниже, и ниже... стремим CLK AVR...

Как ни посмотришь, так все всегда в гонке... Выше, больше, быстрее, потом еще больше, еще выше, еще быстрее... Мегагерцы, Гигагерцы... А потом нервные срывы и - милости просим к нам в гнездо, в комнату с белым потолком, с правом на надежду! И это еще хорошо, если так повезет... А кому это надо? Мне, например, не надо. Свой последний проект на микроконтроллере AVR я сделал на тактовой частоте в 32768 Гц. Ни больше, ни меньше, а 32 килогерца. Само собой, это вышло не специально... Просто решил делать часы на микроконтроллере, в котором нет аппаратного таймера специально под организацию часов реального времени... Ну и самым простым оказалось перевести весь проект на тактирование от часового кварца.  А чего такого? Это самая низкая из доступных "по умолчанию" частот (даже тактирование от генератора WDT и то на большей частоте получается - порядка 100 кГц), при том стабильная, ибо кварц.  И вышло так, что практически никаких ограничений в процессе написания прошивки я не испытывал

Музей древностей

Был я молод, был я весел... Даже имел свой блог на сайте Паяльник (не к ночи будь сказано). Но, паяльник на то и паяльник, что неугодным его можно вставить в... в общем, вставить. А это неприятно, поверьте мне... В общем, забанили меня там. Поэтому новый личный блог я начал с переноса оттуда сюда буйной головы своих раздумий... Коллекция древностей будет пополняться, по мере сил. А потом пойдет пополнение уже свежачком...

О братьях наших меньших

  Когда наступишь ты в говно, Знай: невиновное оно! Ведь, безусловно, младший брат Реально в этом виноват.