|
Структура меню |
|
|
|
Nov 15 2006, 17:36
|
Участник

Группа: Участник
Сообщений: 74
Регистрация: 21-10-06
Пользователь №: 21 540

|
Народ, как Вы делаете меню для своих девайсов? Интересует структура. Столкнулся с проблемой: вывод на дисплей (HD44780 совместимый) меню получается малопонятной и (главное) неприспособленный для добавления новых пунктов меню. Никогда раньше не приходилось делать меню, так что научите  Может у кого есть каки-нить наработки\библиотеки? Заранее большое спасибо...
|
|
|
|
|
 |
Ответов
|
Mar 28 2007, 20:38
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 17-06-04
Пользователь №: 36

|
// Menus define: void KeySC (void); // Прототипы фуекций void TimeMenu1 (void); void TimeMenu0 (void); void FPout (void); void Fauto (void); void Fstop (void); void FPr0 (void); void FPr1 (void); void FPr2 (void); void FPr3 (void); // Главное меню MAKE_MENU(POUT,STAT,PARAM,NULL_ENTRY,NULL_ENTRY,FPout,TimeMenu0,"Pout"); MAKE_MENU(STAT,PARAM,POUT,POUT,AUTO,KeySC,TimeMenu1,"Stat"); MAKE_MENU(PARAM,POUT,STAT,POUT,PR1,KeySC,TimeMenu1,"Prtr"); // Подменю STAT MAKE_MENU(AUTO,STOP,HAND,STAT,okAUTO,KeySC,TimeMenu0,"Auto"); MAKE_MENU(okAUTO,NULL_ENTRY,NULL_ENTRY,NULL_ENTRY,NULL_ENTRY,KeySC,Fauto,"end "); MAKE_MENU(STOP,HAND,AUTO,STAT,okSTOP,KeySC,TimeMenu0,"Stop"); MAKE_MENU(okSTOP,NULL_ENTRY,NULL_ENTRY,NULL_ENTRY,NULL_ENTRY,KeySC,Fstop,"end "); MAKE_MENU(HAND,AUTO,STOP,STAT,NULL_ENTRY,KeySC,TimeMenu0,"Hand"); // Подменю PARAM MAKE_MENU(PR1,NULL_ENTRY,NULL_ENTRY,PARAM,SetParam,FPr1,FPr0,"Pr "); MAKE_MENU(SetParam,NULL_ENTRY,NULL_ENTRY,PR1,NULL_ENTRY,FPr3,FPr2,"__ ");
Это основное описание. Как я уже говорил, работаем на GCC. Изменения незначительны. Из всех вариантов, которые мы использовали, это самый удобный в использовании, пасширении/изменении, и наименьший по объему памяти.
|
|
|
|
|
Aug 7 2007, 10:58
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
По поводу Micro-Menu... При попытке вызова SET_MENU(Level1Item1); как указано в псевдокоде (MicroMenu.zip) программа вылетает. Пробовал определить структуру меню в ОЗУ. Не помогает. Вот мой пример: Код #include <inavr.h> #include "defines.h" #include "i2c.h" #include "tic154.h" #include "Menu.c"
// Prototypes: void Level1Item1Sub1_Text(void); void Level1Item1Sub1_Func(void);
const char Buffer[]="OPTIONS";
// Menus: MAKE_MENU(Level1Item1, Level1Item2, Level1Item3, NULL_ENTRY, Level1Item1Sub1, NULL_FUNC, NULL_FUNC, "ITEM 1"); MAKE_MENU(Level1Item2, Level1Item3, Level1Item1, NULL_ENTRY , NULL_ENTRY, NULL_FUNC, NULL_FUNC, "ITEM 2"); MAKE_MENU(Level1Item3, Level1Item1, Level1Item2, NULL_ENTRY, NULL_ENTRY, NULL_FUNC, NULL_FUNC, "ITEM 3");
MAKE_MENU(Level1Item1Sub1, NULL_ENTRY , NULL_ENTRY , Level1Item1, NULL_ENTRY,Level1Item1Sub1_Func, Level1Item1Sub1_Text, NULL_TEXT);
// Functions: void Level1Item1Sub1_Text(void) { char Buffer[] = "*YNAMIC MENU TEXT";
Buffer[0] = 'D';
LCD_Put_Str(Buffer);
// LCD_Write_SRAM_String(Buffer); }
void Level1Item1Sub1_Func(void) { // Shutdown_App(); }
//..........................................
void main (void) { // Initialise TWI_Init(100); // set TWI bit rate to 100KHz LCD_Init();
SET_MENU_WRITE_FUNC(Buffer); SET_MENU(Level1Item1); SET_MENU(PARENT); SET_MENU(SIBLING); SET_MENU(PREVIOUS); SET_MENU(NEXT); GO_MENU_FUNC(SELECTFUNC); }
//################################ // Menu.c
#include "Menu.h" #include <string.h>
Menu_Item Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, {0x00}}; Menu_Item* CurrMenuItem; WriteFuncPtr* WriteFunc;
void MenuChange(Menu_Item* NewMenu) { if ((void*)NewMenu == (void*)&NULL_ENTRY) return;
CurrMenuItem = NewMenu; #if defined(MENU_USE_SRAM_BUFFER) #if (MENU_USE_SRAM_BUFFER < 1) #error Menu SRAM Buffer Size not Defined! #endif char Buffer[MENU_USE_SRAM_BUFFER]; strcpy(Buffer, CurrMenuItem->Text); //strcpy_P
((WriteFuncPtr)WriteFunc)((const char*)Buffer); #else ((WriteFuncPtr)WriteFunc)((const char*)CurrMenuItem->Text); #endif
GO_MENU_FUNC(ENTERFUNC); }
void MenuFunc(FuncPtr* Function) { if ((void*)Function == (void*)NULL_FUNC) return;
((FuncPtr)Function)(); }
//##################################################### //Menu.h
#ifndef MENU_H #define MENU_H
//#include <pgmspace.h>
// Typedefs: typedef void (*FuncPtr)(void); typedef void (*WriteFuncPtr)(const char*);
typedef struct { // __flash void *Next; void *Previous; void *Parent; void *Sibling; FuncPtr SelectFunc; FuncPtr EnterFunc; const char Text[6]; } Menu_Item;
// Externs: extern WriteFuncPtr* WriteFunc; extern Menu_Item Null_Menu; extern Menu_Item* CurrMenuItem;
// Defines and Macros: #define NULL_ENTRY Null_Menu #define NULL_FUNC (void*)0 #define NULL_TEXT 0x00 #define MENU_USE_SRAM_BUFFER 32
#define PREVIOUS *((Menu_Item*)(&CurrMenuItem->Previous)) #define NEXT *((Menu_Item*)(&CurrMenuItem->Next)) #define PARENT *((Menu_Item*)(&CurrMenuItem->Parent)) #define SIBLING *((Menu_Item*)(&CurrMenuItem->Sibling)) #define ENTERFUNC *((Menu_Item*)(&CurrMenuItem->EnterFunc)) #define SELECTFUNC *((Menu_Item*)(&CurrMenuItem->SelectFunc))
#define MAKE_MENU(Name, Next, Previous, Parent, Sibling, SelectFunc, EnterFunc, Text) \ extern Menu_Item Next; \ extern Menu_Item Previous; \ extern Menu_Item Parent; \ extern Menu_Item Sibling; \ Menu_Item Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Sibling, (FuncPtr)SelectFunc, (FuncPtr)EnterFunc, { Text }}
#define SET_MENU_WRITE_FUNC(x) \ WriteFunc = (WriteFuncPtr*)&x;
#define SET_MENU(x) \ MenuChange((Menu_Item*)&x); #define GO_MENU_FUNC(x) \ MenuFunc((FuncPtr*)&x) #define EXTERN_MENU(Name) \ extern Menu_Item Name;
// Prototypes: void MenuChange(Menu_Item* NewMenu); void MenuFunc(FuncPtr* Function);
#endif Помогите, пожалуйста, разобраться с этим меню.
|
|
|
|
Сообщений в этой теме
sind-rom Структура меню Nov 15 2006, 17:36 junoSynthesizer присоединяюсь к вопросу.
тоже только начал стряпа... Nov 15 2006, 22:00 bodja74 Делал двух-координатное меню.
Создаем массив перем... Nov 15 2006, 22:37 SergSit Почитай тему на этом форуме : Отображение меня на ... Nov 16 2006, 07:03 _Bill Цитата(sind-rom @ Nov 15 2006, 20:36... Nov 16 2006, 09:28 zltigo До кучи.
Код//------------------------------------... Nov 16 2006, 09:39 Andy_F Например, вот так:
Кодstruct menu_item
{ unsigned... Nov 16 2006, 09:42 alux Продолжаем разговор... Считаю, что тема организаци... Mar 28 2007, 10:21 beer_warrior ЦитатаКак прикрутить данный проект к IAR (v.4.12A)... Mar 28 2007, 10:44 alux Забыл приложить файл... Я GCC не силен. Сделал сле... Mar 28 2007, 12:11 MRW Используем это MicroMenu. Вещь просто супер. Легко... Mar 28 2007, 14:09 beer_warrior ЦитатаError[Pe146]: too many initializer values D:... Mar 28 2007, 14:29 alux Цитата(beer_warrior @ Mar 28 2007, 14:29)... Mar 28 2007, 18:45  Dog Pawlowa Цитата(alux @ Mar 28 2007, 18:45) Вот лис... Mar 28 2007, 19:25   alux Цитата(Dog Pawlowa @ Mar 28 2007, 19:25) ... Mar 28 2007, 20:01 alux Первую ошибку можно обойти, указав размер массива ... Mar 29 2007, 10:28 IgorKossak Цитата(alux @ Mar 29 2007, 10:28) Первую ... Apr 1 2007, 22:10 id_Alx Цитата(alux @ Mar 29 2007, 13:28) Первую ... Aug 28 2007, 18:13  alux ЦитатаДля IAR получилось так...
У меня не получает... Sep 27 2007, 15:19   id_Alx Цитата(alux @ Sep 27 2007, 18:19) В испра... Oct 2 2007, 07:19    alux У меня меню заработало. Как теперь сделать, чтобы ... Oct 3 2007, 18:53 Kolia Выкладываю исходник простого и удобного меню для H... Mar 30 2007, 13:59 beer_warrior ЦитатаА вот со второй ошибкой не могу справится. В... Mar 30 2007, 14:44 Яrik Только сильно не ругайте:
Решил попробывать код пр... Jul 13 2007, 14:44 IceS Цитата(Яrik @ Jul 13 2007, 18:44) но чего... Jul 16 2007, 21:43 Unknown_User Очень интересная, а главная злободневная для меня ... Sep 9 2007, 18:18 admiral Продолжу тему. У меня возникла необходимость созда... Apr 8 2008, 11:24 sKWO Цитата(admiral @ Apr 8 2008, 14:24) Код#d... Apr 8 2008, 12:16
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|