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

меню stm32f4

Привет.

Столкнулся с проблемой при написание микроменю. Не вызывает функцию void Language (void) по указателю.

menu.h

#ifndef   _MENU_H_
#define   _MENU_H_

#define NULL_ENTRY Null_Menu
#define NULL_FUNC  (void*)0

#define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Selectf, Enterf, Text_RUS,Text_ENG) \
extern const menuItem Next;     \
extern const menuItem Previous; \
extern const menuItem Parent;   \
extern const menuItem Child;  \
       const menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, (FuncPtr)Selectf, (FuncPtr)Enterf, { Text_RUS }, { Text_ENG }}



#define PREVIOUS   ((menuItem*)(selectedMenuItem->Previous))
#define NEXT       ((menuItem*)(selectedMenuItem->Next))
#define PARENT     ((menuItem*)(selectedMenuItem->Parent))
#define CHILD      ((menuItem*)(selectedMenuItem->Child))
#define SELECT	   (selectedMenuItem->Select)
#define SELECTFUNC  ((FuncPtr)(selectedMenuItem->SelectFunc))
#define ENTERFUNC   ((FuncPtr)(selectedMenuItem->EnterFunc))

#define NULL_ENTRY Null_Menu

// Typedefs:
typedef void (*FuncPtr)(void);        

typedef struct {
void       *Next;
void       *Previous;
void       *Parent;
void       *Child;
const char     Select;
       FuncPtr    SelectFunc;   // программа для отображения в самом меню
       FuncPtr    EnterFunc;   // программа работы, вызываемая при нажатии Enter в меню
const char Text_RUS[20];
       const char Text_ENG[20];
} const menuItem;



menuItem* selectedMenuItem; // текущий пункт меню

menuItem	Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, NULL_FUNC, NULL_FUNC, {0x00}, {0x00}};


enum {
   MENU_CANCEL=1,
   MENU_RESET,
   MENU_MODE1,
   MENU_MODE2,
   MENU_MODE3,
   MENU_MODE4,
   MENU_MODE5,
   MENU_MODE6,
   MENU_SENS1,
   MENU_SENS2,
   MENU_WARM,
   MENU_PROCESS
};

#endif

main.c

void Language (void){
 LCDCLEAR LCD_SetPos(0, 1);
 if (Mem.EEPROMMap.language_messages != 0) //Если в настройках установлен режим русского языка
 {
   printf(" РУС ");
 }
 else
 {
   printf(" ENG ");
 }
}
void menuChange(const menuItem* NewMenu)
{
if ((void*)NewMenu == (void*)&NULL_ENTRY)
  return;

selectedMenuItem = NewMenu;

 LCDCLEAR LCD_SetPos(0, 0); //Очистка экрана LCD
 if (Mem.EEPROMMap.language_messages != 0) //Если в настройках установлен режим русского языка
 {
  printf("%s",(char *)NewMenu->Text_RUS);  
 }
 else
 {
    printf("%s",(char *)NewMenu->Text_ENG);
 }
}


//                 NEXT,      PREVIOUS     PARENT,     CHILD
MAKE_MENU(m_s1i1,  m_s1i2,    m_s1i3,      NULL_ENTRY, m_s2i1,           0, NULL_FUNC, NULL_FUNC, "Настройки","Settings");
MAKE_MENU(m_s1i2,  m_s1i3,    m_s1i1,      NULL_ENTRY, NULL_ENTRY,       0, NULL_FUNC, NULL_FUNC, "Корекция","Correction");
MAKE_MENU(m_s1i3,  m_s1i1,    m_s1i2,      NULL_ENTRY, NULL_ENTRY,       0, NULL_FUNC, NULL_FUNC, "Стереть стек","Erase stack");

// подменю настройки
MAKE_MENU(m_s2i1,  m_s2i2,    NULL_ENTRY,  m_s1i1,     NULL_ENTRY,   MENU_MODE1, Language, Language, "Язык(Language)","Language");
MAKE_MENU(m_s2i2,  m_s2i3,    m_s2i1,      m_s1i1,     NULL_ENTRY,   MENU_MODE1, NULL_FUNC, NULL_FUNC, "Режим измерения","Measurement mode");
MAKE_MENU(m_s2i3,  m_s2i4,    m_s2i2,      m_s1i1,     NULL_ENTRY,   MENU_MODE1, NULL_FUNC, NULL_FUNC, "Режим мойки","Washing mode");
MAKE_MENU(m_s2i4,  m_s2i5,    m_s2i3,      m_s1i1,     NULL_ENTRY,   MENU_MODE1, NULL_FUNC, NULL_FUNC, "Звук","Sound");
MAKE_MENU(m_s2i5,  m_s2i6,    m_s2i4,      m_s1i1,     NULL_ENTRY,   MENU_MODE1, NULL_FUNC, NULL_FUNC, "Округление","Rounding");
MAKE_MENU(m_s2i6,  NULL_ENTRY,    m_s2i5,      m_s1i1,     NULL_ENTRY,   MENU_MODE1, NULL_FUNC, NULL_FUNC, "Сервесный режим","Servesny mode");

Изменено пользователем Alex_Golubev

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


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

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

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

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

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

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

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

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

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

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