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

 
 
 
Reply to this topicStart new topic
> меню stm32f4
Alex_Golubev
сообщение May 12 2017, 04:14
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 94
Регистрация: 18-03-17
Пользователь №: 95 877



Привет.
Столкнулся с проблемой при написание микроменю. Не вызывает функцию void Language (void) по указателю.
menu.h
CODE
#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
CODE
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 - May 12 2017, 04:15
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd September 2017 - 08:19
Рейтинг@Mail.ru


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