Listing 136 - rysowanie widocziych pozycji menu
static VOld system menuDrawltems(
MENUITEM_P* pmenu, uint8 t index)
{
pm©rtu +- indexj
for(a-0 5 a<LCD_SYJ a-H-)
1fOmanu.typ* -■ MBNUT_END) break;
lcd_GoTo(l, e)5
ir,enu.DrewPi;oc(lc:d_Get:FileO , irenu. ldName) \
Listing 138- lwurzenie tablicy opisującej menu
MENUITEM_P app_mainmenu [] =
{
{MENUT_FUNC, IDS_Pcsl, sysrem_mPn\«Ras©Draw, jNULL}}, {NEN[IT_FtlNC , TDS_Pcs2, sys t©m_jnenu3aseDraw, jNULL}], {MEHUT_FUNC, IDS_Pcs3, oyatcnTirenuBaseDraw, jNULL)J, {HENUT_FUNC, 3DS_Pcs4, sys tem_rr.enu3aseD: aw, jNULL)), {nehut_func, lDS_Pus5, system_rr.enu3aseDraw, {nul...}] , {KENUT_END, 0, NULL, jNULL)}
};
Listing 139- podstawowa funkcja rysująca pozycję menu
void system menuEaseDraw(FILE* stream, uintl6 t idNanie) {
fpuis_P(lanqsys_GetText(idName), stream);
>
Listing 140 - wyświetlenie menu
systemjneri- ((menuitem_?*) app_mainmenu) ;
Do funkcji system menu, w miejscu gdzie interpretowane są komunikaty, dodajemy obsługę dwóch nowych przypadków widocznych na listingu 141.
Teraz mamy możliwość stworzenia i obsłużenia bardziej skompilowanego menu widocznego na listingu 142. Z poziomu tego menu wywoływane są funkcje, których zarys pokazuje listing 143 jedna z odrysowywa-nych pozycji to nie sam tekst, ale tekst z wartością i wymaga specjalnej funkcji rysującej.
W tej chwili nie ma znaczenia, co wspomniane funkcje dokładnie robią. Funkcja zaznaczona na czerwono nie została jeszcze omówiona. Są to proste działania, które nie wnoszą do naszego programu nic nowego, dlatego postanowiłem ich opis przenieść na stronę kursu znajdującą się na mojej stronie autorskiej. Znajdziesz tam omówienie fragmentów', które uznałem za mniej ważne i nie zmieściły się w tym artykule.
Podsumowanie
Dziś wyjątkowo w artykule me znalazły się pełne kody - brakujące fragmenty, wraz
Lhilng 137 - przejście na pozycję niżej w menu
Static uint8 t system_menuDowr.(
MENUITEP._P* pmenj,uint8 t* pindex, uin-.8 r* perrpos)
(
uint8_t aj
uir.t8_t curpoo - *pcurposJ uir.t8 t index - *pindexj // Zmiana pozycji kursora if(curoos — LCD_SY-1)
IfCp ęm_read_byte (Apmer.u [i:idex+d] . type) MENUT_END)
return T; // nic nie zmieniam
++(*pindex);
)
ł
// Przesunięcie kursora jeśli docelowa pozycja to nie koniec if(pgm read_byte (Aurnenu [iudejct-curpos+l] • type) I* MENUT_END) -t-t-C*pcurpos); return 0;
Przewijalne menu jest wygodnym rozwiązaniem tam, gdzie musimy manipulować większą ilością paiamcl-rów. Często zdarza się, ze menu jest główną częścią jakiegoś programu.
Menu będzie przesuwane zgodnie /. rysunkiem A. Będziemy mieli swobodę przy tworzeniu struktury menu, jednak zawsze będzie cno obsługiwane w ten sposób.
Ełomcrrty oplw pozycji menu
W oktualnym rozwiązaniu proponuję, aby menu było opisane w postaci tabiicy określającej poszczególne pozycje. Tabiica ta będzie umieszczona w panięci programu Każdy element naszej tablicy będzie składni się ze struktury zawierającej pola opisane w obrazku w ramce.
Z punktu widzenia aplikacji menu będzie tworzone poprzez wywołania jednej funkcji przyjmującej jako parametr wskaźnik na strukturę menu. Daje to jednocześnie bardzo wygodne narzędzie do tworzenia podmenu - wystarczy wywołać rckurcncyjnic funkcję tworzącą menu. Sprawi to dodatkowo, że po powrocie
do wyższego poziomu menu pozycja kursora będzie pamiętana.
Pewnym utrudnieniem naszego układu piololypowcgo jest to, że mamy w nim tylko dwa przyciski. Potraktujmy to jednak jako wyzwanie - stworzenie wygodnego interfejsu przy ich wykorzystaniu. Moja propo życia jest taka:
Przycisk. SW2: zmiana wartosciprzesuwanie się po ment. Aby bez problemu można było przemieszczać się w obu kierunkach, kierunek zrniar. jest odwracany, jeśli minie ls od ostatniego naciśnięcia. Daje to efekt, że gdy naciskamy przycisk szybko (minimum raz na sekundę) lub go trzymamy, zmiana następuje przykładowo w górę. Jeśli teraz odczekamy sekundę -następne naciśnięcie spowoduje zmianę w dół. W menu kierunek zmian będzie odwracany także po dojściu do skrajnej pozycji.
Przycisk SW1: krótkie naciśnięcie - potwierdze-nie/wybór; długie naciśnięcie - wycofanie się / anulowanie.
46 Sierpień 2006 Elektronika dla Wszystkich