|
|
  |
организация пользовательского меню с выводом на дисплей |
|
|
|
Aug 13 2013, 15:31
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Вот подсмотрел пример организации меню. http://easyelectronics.ru/organizaciya-dre...nogo-menyu.html Пробую для STM32 , на IAR. CODE // структура для меню typedef struct PROGMEM{ void *Next; void *Previous; void *Parent; void *Child; uint8_t Select; const char Text[]; } menuItem;
#define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ menuItem Next; \ menuItem Previous; \ menuItem Parent; \ menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, { Text }} #define NULL_ENTRY Null_Menu menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}}; enum { MENU_CANCEL=1, MENU_RESET, MENU_MODE1, MENU_MODE2, MENU_MODE3, MENU_SENS1, MENU_SENS2, }; // NEXT, PREVIOUS PARENT, CHILD MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск");
и вот на строки menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}}; MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); IAR выдаёт ошибку. Error[Pe146]: too many initializer values Что ему не нравится ?
Сообщение отредактировал IgorKossak - Aug 13 2013, 21:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Aug 13 2013, 16:33
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(Golikov A. @ Aug 13 2013, 18:34)  все не правильно сказал....
а если "Запуск" заменить на 'З'
а потом на {'З','а', 'п', 'у', 'с', 'к'} Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки.
|
|
|
|
|
Aug 13 2013, 17:07
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(alexdos @ Aug 13 2013, 19:33)  Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки. У вас структура menuItem имеет 6 полей , а в строчке Код MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); 7 параметров. too many initializer values - слишком много инициализирующих значений.
|
|
|
|
|
Aug 13 2013, 17:13
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(_Артём_ @ Aug 13 2013, 20:07)  У вас структура menuItem имеет 6 полей , а в строчке Код MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); 7 параметров. too many initializer values - слишком много инициализирующих значений. На строку: Код MAKE_MENU(m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, {'s'}); Выскакивает ошибка: Error[Pe054]: too few arguments in invocation of macro "MAKE_MENU" не хватает ему аргументов. Убираю в дефайне Name, #define MAKE_MENU(Next, Previous, Parent, Child, Select, Text) опять выскакивает ошибка Error[Pe146]: too many initializer values
|
|
|
|
|
Aug 13 2013, 17:19
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Попробуйте перебить макрос вот так: Код #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ menuItem Next; \ menuItem Previous; \ menuItem Parent; \ menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, Text}
|
|
|
|
|
Aug 13 2013, 17:27
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(andrewlekar @ Aug 13 2013, 20:19)  Попробуйте перебить макрос вот так: Код #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ menuItem Next; \ menuItem Previous; \ menuItem Parent; \ menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, Text} Перебивка не помогла. Кириллицу менял на латинницу. Не помогло. Может подскажите ссылки на другие примеры организации многоуровневых меню
Сообщение отредактировал alexdos - Aug 13 2013, 17:33
|
|
|
|
|
Aug 13 2013, 17:53
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
У меня со скрипом, но собралось (в вижуал студии). Верните в макрос extern как в примере. Все ссылки на другие меню Next, Previous должны быть описаны с помощью MAKE_MENU иначе линкер будет ругаться. Вот как у меня получилось: CODE #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ extern menuItem Next; \ extern menuItem Previous; \ extern menuItem Parent; \ extern menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, { Text }}
menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}}; #define NULL_ENTRY Null_Menu
enum { MENU_CANCEL=1, MENU_RESET, MENU_MODE1, MENU_MODE2, MENU_MODE3, MENU_SENS1, MENU_SENS2, };
MAKE_MENU(Level1Item1, Level1Item2, Level1Item3, NULL_ENTRY, Level1Item1Sub1, 0, "Запуск"); MAKE_MENU(Level1Item2, Level1Item3, Level1Item1, NULL_ENTRY, NULL_ENTRY, 0, "Запуск2"); MAKE_MENU(Level1Item3, Level1Item1, Level1Item2, NULL_ENTRY, NULL_ENTRY, 0, "Запуск3"); MAKE_MENU(Level1Item1Sub1, NULL_ENTRY, NULL_ENTRY, Level1Item1, NULL_ENTRY, 0, "Запуск4");
int _tmain(int argc, _TCHAR* argv[]) { return 0; }
Сообщение отредактировал andrewlekar - Aug 13 2013, 17:53
|
|
|
|
|
Aug 13 2013, 20:48
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(_Артём_ @ Aug 13 2013, 21:07)  У вас структура menuItem имеет 6 полей , а в строчке Код MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); 7 параметров. too many initializer values - слишком много инициализирующих значений. тоже сначала так подумал, нет там по макросу все верно.
|
|
|
|
|
Aug 13 2013, 20:51
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Мда... пол дня убил.. а оказалось все просто.. Код const char Text[17]; нужно было указать размерность текстового поля...
|
|
|
|
|
Aug 14 2013, 07:11
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(alexdos @ Aug 13 2013, 21:27)  Может подскажите ссылки на другие примеры организации многоуровневых меню Поиском по форуму надо-таки учиться пользоваться... Например посмотрите тут
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Aug 14 2013, 07:50
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(Golikov A. @ Aug 14 2013, 06:35)  это слишком простое и очевидное решение. Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике... Отображение будет на 2-х строчном дисплее, поэтому 16 символов в строке, в самый раз, чтоб одним махом при выводе стереть и старое что было. А что место, щас уже прошли времена борьбы за каждый байт. Не хватит, возьмём "жирней" камешок, на пару копеек дороже. Согласен с Вами что нужно решить задачу в общем виде, но пока и малым обойдусь, как всегда время поджимает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|