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

 
 
> Структура меню
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
Ответов
zltigo
сообщение Nov 16 2006, 09:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



До кучи.
Код
//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
MenuState menu_state[] =
{
//  State                                    State Text          Function
    
    { ST_MAIN,                              "Main            ",    NULL             },
    { ST_MAIN_REV,                            "                ",    mf_revision     },

    { ST_TIME_FUNC,                            "Time            ", mf_showtime     },
    { ST_TIME_SET_FUNC,                        "SetTime         ", mf_settime         },

      { ST_DATE_FUNC,                            "Date            ",    mf_showdate     },

    { ST_SOUND,                              "Sound           ", NULL             },
    { ST_SOUND_SELECT_FUNC,                    NULL,                mf_selectsound     },
    { ST_SOUND_PLAY_FUNC,                      NULL,                mf_playsound     },

    { ST_TEMPERATURE,                        "Temperature     ",    NULL             },
    { ST_TEMPERATURE_FUNC,                   NULL,                mf_temperature     },

    { ST_VOLTAGE,                            "Voltage         ",    NULL             },
    { ST_VOLTAGE_FUNC,                       NULL,                mf_voltage         },

    { ST_LIGHT,                              "Light           ",    NULL             },
    { ST_LIGHT_FUNC,                         NULL,                  mf_light         },

    { ST_OPTIONS,                            "Options         ",    NULL             },
    { ST_OPTIONS_DISPLAY,                    "Display         ",    NULL             },
    { ST_OPTIONS_COMMON,                    "Common          ",    NULL             },
    { ST_OPTIONS_TEST,                        "Test            ",    NULL             },
    // End of list
    { 0,                                     NULL,                  NULL             },

};

//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
MenuNavigate menu_nextstate[] =
{
//  State                           Input       NEXT State
    { ST_MAIN,                      KEY_UP,       ST_OPTIONS         },
    { ST_MAIN,                      KEY_PREV,   ST_MAIN_REV     },
    { ST_MAIN,                      KEY_NEXT,   ST_MAIN_REV     },
    { ST_MAIN,                      KEY_DOWN,      ST_TIME_FUNC    },

    { ST_MAIN_REV,                    KEY_PREV,   ST_MAIN            },
    { ST_MAIN_REV,                    KEY_NEXT,   ST_MAIN            },
        
    { ST_SOUND,                      KEY_UP,       ST_DATE_FUNC    },
    { ST_SOUND,                      KEY_NEXT,   ST_SOUND_SELECT_FUNC    },
    { ST_SOUND,                      KEY_PREV,   ST_MAIN            },
    { ST_SOUND,                      KEY_DOWN,   ST_TEMPERATURE    },

    { ST_TEMPERATURE,                KEY_UP,       ST_SOUND        },
    { ST_TEMPERATURE,                KEY_NEXT,   ST_TEMPERATURE_FUNC    },
    { ST_TEMPERATURE,                KEY_PREV,   ST_MAIN            },
    { ST_TEMPERATURE,                KEY_DOWN,      ST_VOLTAGE        },

    { ST_VOLTAGE,                    KEY_UP,       ST_TEMPERATURE    },
    { ST_VOLTAGE,                    KEY_NEXT,   ST_VOLTAGE_FUNC    },
    { ST_VOLTAGE,                    KEY_PREV,   ST_MAIN            },
    { ST_VOLTAGE,                    KEY_DOWN,      ST_LIGHT        },

    { ST_LIGHT,                      KEY_UP,       ST_VOLTAGE        },
    { ST_LIGHT,                      KEY_NEXT,   ST_LIGHT_FUNC    },
    { ST_LIGHT,                      KEY_PREV,   ST_MAIN            },
    { ST_LIGHT,                      KEY_DOWN,      ST_OPTIONS        },

    { ST_OPTIONS,                    KEY_UP,       ST_LIGHT        },
    { ST_OPTIONS,                    KEY_NEXT,   ST_OPTIONS_DISPLAY    },
    { ST_OPTIONS,                    KEY_PREV,   ST_MAIN        },
    { ST_OPTIONS,                    KEY_DOWN,      ST_MAIN        },

    
    { ST_OPTIONS_TEST,                KEY_UP,       ST_OPTIONS_COMMON    },
    { ST_OPTIONS_TEST,                KEY_PREV,   ST_OPTIONS    },
    { ST_OPTIONS_TEST,                KEY_BREAK,  ST_MAIN              },
    { ST_OPTIONS_TEST,                KEY_DOWN,   ST_OPTIONS_DISPLAY  },
    
    { ST_OPTIONS_DISPLAY,            KEY_UP,       ST_OPTIONS_TEST    },
    { ST_OPTIONS_DISPLAY,            KEY_PREV,   ST_OPTIONS    },
    { ST_OPTIONS_DISPLAY,              KEY_BREAK,  ST_MAIN              },
    { ST_OPTIONS_DISPLAY,            KEY_DOWN,      ST_OPTIONS_COMMON    },
    
        
    { ST_OPTIONS_COMMON,            KEY_UP,       ST_OPTIONS_DISPLAY    },
    { ST_OPTIONS_COMMON,            KEY_PREV,   ST_OPTIONS    },
    { ST_OPTIONS_COMMON,               KEY_BREAK,  ST_MAIN              },
    { ST_OPTIONS_COMMON,            KEY_DOWN,   ST_OPTIONS_TEST    },

    // End of list
    { 0,                             0,          0                }
};

BYTE     state;            // Helds the current Menu state
BYTE     enter = TRUE;
BYTE    enter_func = FALSE;

//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
void MenuProcess( void *params )
{
int rotor_cnt = 0xF7;
char tmp_str[16];
ulong rtc_time;
BYTE nextstate;
BYTE prevstate;
static char *statetext;
BYTE (*statefunc)(BYTE);
BYTE input;
char i;

    params = params;

    // Initial state variables
    prevstate = ST_DUMMY;
    state = nextstate = ST_MAIN;
    statetext = "Hello!";
    statefunc = NULL;
    
    for(;; )                            // Main Menu loop
    {
        // Plain menu text
        if( statetext )
        {   lcd_setpos( 1, 1 );
            lcd_string( statetext );                  
            statetext = NULL;
        }

        input = key_get();               // Read buttons

        if( statefunc )
        {     // When in this state, we must call the state function
            nextstate = statefunc( input );
        }
        else if( input != KEY_NULL )
        {   // Plain menu, clock the state machine
            nextstate = statemachine( state, input );
        }
        if( nextstate != state )
        {   state = nextstate;
            for( i=0; menu_state[i].state; i++ )
            {   if( menu_state[i].state == state )
                {   statetext = menu_state[i].text;
                    statefunc = menu_state[i].func;
                    break;
                }
            }
        }
        
        if( state == ST_MAIN )
        {    
            if( prevstate != ST_MAIN )
            {    prevstate = ST_MAIN;
        
                lcd_setpos( 2, 1 );
                //           1234567890123456
                lcd_string( "No Alarms       " );
            }
            
            if( xQueueReceive( RTCMSG_handle, &rtc_time, 0 ) )
            {
                sprintf( &tmp_str[0], "%02i:%02i", (BYTE)(rtc_time>>16), (BYTE)(rtc_time>>8) );
                lcd_setpos( 1, 17-8 );
                lcd_string( tmp_str );
            }    
            
            if( ++rotor_cnt > 0xF7+5 )
                rotor_cnt = 0xF7;
            lcd_setpos( 1, 16 );
            lcd_char( rotor_cnt );
            
            vTaskDelay_ms( 100 );

        }
        else
        {   prevstate = state;
            vTaskDelay_ms( 100 );
        }
    } //End Main loop
}


//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
BYTE statemachine( BYTE state, BYTE stimul )
{
int i;
BYTE newstate = state;            // Default stay in same state

    for( i=0; menu_nextstate[i].state; i++ )
    {   if( menu_nextstate[i].state == state && menu_nextstate[i].input == stimul )
        {   newstate = menu_nextstate[i].state_next;
            break;
        }
    }
    return( newstate );
}


--------------------
Feci, quod potui, faciant meliora potentes
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
- - 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
- - MRW   // Menus define: void KeySC (void); // Прототипы ф...   Mar 28 2007, 20:38
|- - alux   По поводу Micro-Menu... При попытке вызова SET_MEN...   Aug 7 2007, 10:58
- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:33
Рейтинг@Mail.ru


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