реклама на сайте
подробности

 
 
> Структура меню
sind-rom
сообщение Nov 15 2006, 17:36
Сообщение #1


Участник
*

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



Народ, как Вы делаете меню для своих девайсов? Интересует структура. Столкнулся с проблемой: вывод на дисплей (HD44780 совместимый) меню получается малопонятной и (главное) неприспособленный для добавления новых пунктов меню. Никогда раньше не приходилось делать меню, так что научите smile.gif Может у кого есть каки-нить наработки\библиотеки?
Заранее большое спасибо...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MRW
сообщение Mar 28 2007, 20:38
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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. Изменения незначительны. Из всех вариантов, которые мы использовали, это самый удобный в использовании, пасширении/изменении, и наименьший по объему памяти.
Go to the top of the page
 
+Quote Post
alux
сообщение Aug 7 2007, 10:58
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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

Помогите, пожалуйста, разобраться с этим меню.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01336 секунд с 7
ELECTRONIX ©2004-2016