|
Каждый пункт меню описывается вот такой структурой (все было написано на CodeVisionAVR):
typedef flash struct _menu_pos
{
flash char name[16];
flash struct _menu_pos * flash top;
flash struct _menu_pos * flash prev;
flash struct _menu_pos * flash next;
flash struct _menu_pos * flash sub;
void(* keyb_proc)(unsigned char);
void(* value_print)(void);
void(* on_enter)(unsigned char);
void(* on_exit)(unsigned char);
} MENU_POS;
В структуру забиты указатели на функции отображения и работы с клавой этого пункта, функции, которые вызываются при входе и выходе в/из пункт и указатели на структуры соседних пунктов меню.
В программе объявлен указатель на текущий пункт меню:
flash struct _menu_pos * last_menu = &menu_mod;
Навигация производится таким образом:
static void MenuOnKey (unsigned char key)
{
// Îáðàáàòûâàþ êíîïêè íàâèãàöèè
switch (key)
{
case BT_LEFT:
if (last_menu->prev == NULL) break;
if (last_menu->on_exit) // Äåéñòâèÿ ïî âûõîäó èç ïóíêòà ìåíþ
{
(* last_menu->on_exit)(key);
}
last_menu = last_menu->prev; // Ïðåäèäóùèé ïóíêò ìåíþ
if (last_menu->on_enter) // Äåéñòâèÿ ïî âõîäó â ïóíêò ìåíþ
{
(* last_menu->on_enter)(key);
}
break;
case BT_RIGHT:
if (last_menu->next == NULL) break;
if (last_menu->on_exit) // Äåéñòâèÿ ïî âûõîäó èç ïóíêòà ìåíþ
{
(* last_menu->on_exit)(key);
}
last_menu = last_menu->next; // Ñëåäóþùèé ïóíêò ìåíþ
if (last_menu->on_enter) // Äåéñòâèÿ ïî âõîäó â ïóíêò ìåíþ
{
(* last_menu->on_enter)(key);
}
break;
case BT_ENTER:
if (last_menu->sub == NULL) break;
last_menu = last_menu->sub; // Íà óðîâåíü íèæå`
if (last_menu->on_enter) // Äåéñòâèÿ ïî âõîäó â íîâûé ïóíêò ìåíþ
{
(* last_menu->on_enter)(key);
}
break;
case BT_ESC:
if (last_menu->on_exit) // Äåéñòâèÿ ïî âûõîäó èç ïóíêòà ìåíþ
{
(* last_menu->on_exit)(key);
}
if (last_menu->top == &menu_top)
{
menu_timer = MTIM_STAT; // Âûõîä èç ìåíþ
}
else
{
last_menu = last_menu->top; // Íà óðîâåíü âûøå
}
break;
}
// Åñëè åñòü ðåãóëèðóþùàÿ ôóíêöèÿ - ïåðåäàþ êíîïêó åé
if (last_menu->key_proc)
{
(* last_menu->key_proc)(key);
}
}
E-mail: info@telesys.ru