Лeoнид Ивaнoвич (15.09.2011 10:54, просмотров: 645) ответил mazur на Мне чего-то не хватает. Не могу понять что считать состоянием автомата в обработке меню, а что свести в макрос или подпрограмму. Расскажите, пожалуйста как у вас работает меню.
Пример выдернул из генератора PG-872. Определяю коды меню:
enum { MNU_NO, //код отсутствия меню
MNU_SPLASH, //код меню splash screen
MNU_INFO, //код меню информации
MNU_ERROR, //код меню ошибки
MNU_OUTS, //код меню OUTS
MNU_STEPO, //код меню установки шага для OUTS
MNU_SYNC, //код меню SYNC
MNU_STEPS, //код меню установки шага для SYNC
MNU_SERV, //код меню сервиса
MNU_SHOW }; //код меню показа splash и info
Описываю функции-обработчики каждого пункта меню:
void Mnu_Splash(bool ini); //меню индикации заставки
void Mnu_Info(bool ini); //меню информации об устройстве
void Mnu_Error(bool ini); //меню индикации ошибки
void Mnu_Outs(bool ini); //меню выходных каналов
void Mnu_StepO(bool ini); //меню редактирования шага
void Mnu_Sync(bool ini); //меню входа синхронизации
void Mnu_StepS(bool ini); //меню редактирования шага
void Mnu_Serv(bool ini); //меню сервиса
void Mnu_Show(bool ini); //меню показа рекламы
В основном цикле вызываю обработчик меню:
void Menu_Exe(bool t)
{
if(t)
{
if(MenuTimer) MenuTimer--; //обработка таймера меню
}
KeyCode = Keyboard_GetCode(); //чтение кода нажатой кнопки
bool MnuIni = Menu != DispMenu; //признак необходимости прорисовки
switch(Menu) //выполнение обработчиков меню
{
case MNU_SPLASH: Mnu_Splash(MnuIni); break; //меню индикации заставки
case MNU_INFO: Mnu_Info(MnuIni); break; //меню информации об устройстве
case MNU_ERROR: Mnu_Error(MnuIni); break; //меню индикации ошибки
case MNU_OUTS: Mnu_Outs(MnuIni); break; //меню OUTS
case MNU_STEPO: Mnu_StepO(MnuIni); break; //меню шага OUTS
case MNU_SYNC: Mnu_Sync(MnuIni); break; //меню SYNC
case MNU_STEPS: Mnu_StepS(MnuIni); break; //меню шага SYNC
case MNU_SERV: Mnu_Serv(MnuIni); break; //меню SERVICE
case MNU_SHOW: Mnu_Show(MnuIni); break; //меню SHOW
}
if(KeyCode != KEY_NO) //если кнопка не обработана, то
{
Sound_Note(); //звуковой сигнал нотификации
KeyCode = KEY_NO; //кнопка обработана
}
Keyboard_SetCode(KeyCode); //установка кода обработанной кнопки
}
Ну и как пример, один из обработчиков пункта меню:
void Mnu_Splash(bool ini)
{
if(ini) //если требуется прорисовка, то
{
LCD_Picture(Splash); //вывод картинки
LCD_Update(); //обновление дисплея
MenuTimer = ms2sys(SPL_TMV); //загрузка таймера меню splash screen
CfgOk = FPGA_Configurate(); //загрузка конфигурации FPGA
Setup_Read(); //инициализация настроек
Vals_Read(0); //инициализация параметров и железа
DispMenu = Menu; //снятие требования прорисовки
}
if(KeyCode != KEY_NO || //если нажата кнопка или
!MenuTimer) //если переполнение таймера, то
{
Menu = MNU_INFO; //запрос меню информации
KeyCode = KEY_NO; //кнопка обработана
}
}