Перейти к содержанию
    

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

Вот подсмотрел пример организации меню. http://easyelectronics.ru/organizaciya-dre...nogo-menyu.html

Пробую для STM32 , на IAR.

 

// структура для меню
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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все не правильно сказал....

 

а если

"Запуск"

заменить на 'З'

 

а потом на

{'З','а', 'п', 'у', 'с', 'к'}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все не правильно сказал....

 

а если

"Запуск"

заменить на 'З'

 

а потом на

{'З','а', 'п', 'у', 'с', 'к'}

 

Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки.

 

 

 

У вас структура menuItem имеет 6 полей , а в строчке

 

MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск");

 

7 параметров. too many initializer values - слишком много инициализирующих значений.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас структура 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте перебить макрос вот так:

 

#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 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня со скрипом, но собралось (в вижуал студии).

 

Верните в макрос extern как в примере. Все ссылки на другие меню Next, Previous должны быть описаны с помощью MAKE_MENU иначе линкер будет ругаться.

 

Вот как у меня получилось:

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас структура menuItem имеет 6 полей , а в строчке

 

MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск");

 

7 параметров. too many initializer values - слишком много инициализирующих значений.

 

тоже сначала так подумал, нет там по макросу все верно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мда... пол дня убил.. а оказалось все просто..

 

 const char  Text[17];

 

нужно было указать размерность текстового поля...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это слишком простое и очевидное решение.

Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может подскажите ссылки на другие примеры организации многоуровневых меню

Поиском по форуму надо-таки учиться пользоваться... Например посмотрите тут

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это слишком простое и очевидное решение.

Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике...

Отображение будет на 2-х строчном дисплее, поэтому 16 символов в строке, в самый раз, чтоб одним махом при выводе стереть и старое что было. А что место, щас уже прошли времена борьбы за каждый байт. Не хватит, возьмём "жирней" камешок, на пару копеек дороже.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...