Programowanie ■
indeksu. Normalnie funkcje te powinny zwracać wartość 0. Jeśli jednak znajdujemy się na skrajnej pozycji menu i przemieszczenie nie zostało wykonane - zwracana jest wartość 1.
Przy przesuwaniu kursora w dół musimy się także liczyć z możliwością, że możemy mieć menu o długości krótszej niż liczba linii wyświetlacza. Stąd, na listingu 137, bierze się badanie końca menu w pętli for na kolejnych możliwych pozycjach.
Korzystanie z menu
0 ile konstrukcja jest dość rozbudowana, to korzystanie z utworzonego menu jest łatwe
1 przyjemne. Listing 138 pokazuje tworzenie w pamięci programu tablicy opisującej nasze menu. Umieść ją w pliku app.c. Zauważ, że korzystamy tutaj z nowych napisów, które musisz dodać do programu. Napisy IDS Pozl, IDS_Poz2 w moim przypadku miały tak proste nazwy jak „Pozycja \'\ „Pozycja 2”. Ponadto używamy także domyślnej funkcji rysującej pozycje menu. Ponieważ możemy często z niej korzystać, dobrze jest uczynić ją częścią systemu. Jej postać pokazuje listing 139.
Aby menu zostało wyświetlone, można posłużyć się kodem z listingu 140. Kod ten możesz wprowadzić zamiast dotychczasowgo testowania przycisków w pliku app.c.
Pokazuje to. że od strony używania nasze menu jest dość sympatyczne w obsłudze.
Listing 131 - obsługa timelów programowych w przerwaniu Hitlera systemowego
for(a«Ó; a<ELEMS ([system rimer); a-ł-f)
struct system_timer* p? *
systera^iimer + aj 1 f (pT ->mode =
SY3TEM_TIMER_MOCEONESHOT)
(
if(pT->cnt I- 0)
-C?T->cnt);
1f(pT->cnt *= 0)
system_nsgPut(iDM_T.MiHO+a);
else if(pT->mode —
SYSTEM TIMER M0DEFR2ERUN)
0)
pT->cnt • pT->start; 3y3tem_megPut (lDM_TIMER04-a) ;
else
Listing 133 - typy danych potrzebne do obsługi menu
// Typ danej pozycji menu typedef enum menuiTEM_rype {
MENUT_ENDf
MENUT_POPUP,
MENUT_FUNC
jMENU.TiMJTYPE;
// Wygląd funkcji rysowania pozycji typedef void (*MENUiTEM_DrawProc)(FiLE*/*streamV. uintl6_t/*idName*/):
//' wygląd funkcji wywoływanej na naciśnięcie przycisku // Jeśli zwróci wartość !• 0 - menu zostanie zakończone typedef uint8_tC*MENUirEM_OaSelecL>(uin-8_t /*curposV);
// System menu - określenie struktury pozycji typedef struct menuitem {
MRNll T TFM_TY PR typ®; uint8_t idNameJ MENUITEM_DrawProc DrawProcf union {
struct menuitem* psudmenu;
MENUirEM_OnSeIect OnSelectProc; łdataj
}menuitem, menuiten_? progmek:
Listing 135- komendy IDM MENl'...
Listing 132 - komunikaty ł i nu* rów
#define IDM_MENU_CHAMGF TRM.SWnOWN tfdefine idm_menu_Chavjger idm_swdown_repeat #define idm_mcnu_ok idm_swup_short
tfdefine idm_menu_esc idm_swup_hold
#dcfinc idm_timer0 10 dfdefirie IDM_TIMERl 11 #define IDM_TIMER2 12
Listing 134 - pierwszy poziom obsługi menu | ||
uint8 t system menu (MEMUITEM P* pmer.u) { uint8_t index ■» 0; |
SWitch(msg) { case idm menu change: | |
uint8_t curpos - 0; // kierunek przesówania |
case idm menu ciianger: | |
system LimerReset(0); | ||
ulnt8_t dir ** 0; |
ifOiiO | |
uint8 t kbd repeat last; |
1 | |
if(systeir menuUp(pmenu, | ||
// Pręckość repetycji (wolno) |
&index, fircurpos)) | |
kbd rp.peaf last = systeir. kbdSetRepeatSpaed(8); |
{ system rtenuUown (pmenu, | |
// Inicjacja timera oroqramowego | ||
cystern timerSet(0, SYSTEM TIMEF MODEONESHOT, |
&index, Acurpor.); | |
MENU_CHANCEDIR, 0) J |
<ii y = 0; 1 1 | |
for(;;) | ||
else | ||
u-.nt8 t nsg; |
(... analogicznie jak “góra") | |
break; | ||
Icd Cis O I |
case idmtimero: | |
// Rysowanie elementów |
dir - !dir; | |
syetem menjDrówIterrs (pmenu, index); |
break; | |
// Wyrysowanie kursora |
} | |
led GoTo(0, curpos); |
} | |
fputc(system cuksor, leć GetFileO); | ||
// Odmalowanie wyświetlacza |
cleonup! | |
led Upda:e(); |
// Przywrócenie ustawień system kbćŁ>et.*<epeatSpeed(Kbd repeat last); | |
// Oczekiwanie na komunikaty |
return 0; | |
msg = systenmsgWaitFor(); |
} | |