[4] Bezpłatna biblioteka graficzna Microchip Graphics Library dla mikrokontrolerów PIC24 i PIC32: „mierniki” graficzne w interfejsach użytkownika
To już ostatnia część cyklu artykułów poświęconych prezentacji wybranych możliwości bibliotek MLA firmy Microchip. W poprzednich częściach przedstawiliśmy przykłady prostych aplikacji z prezentujących podstawowe możliwości tych bibliotek (patrz część 1, część 2 oraz część 3).
Ważną grupą są elementy wyświetlające wartości w postaci cyfrowej lub analogowej. Do wyświetlania wartości w postaci cyfrowej jest przeznaczony element Digital Meter. Po postawieniu na ekranie GDD-X nadał mu identyfikator DMT_7. W oknie właściwości Properties można ustawić styl obiektu (Scheme). Rozdzielczość wyświetlanej danej ustawia się przez modyfikację zmiennych Noofdigits (liczba wszystkich cyfr) i Dotpos (liczba cyfr po przecinku).
Modyfikacja wyświetlanej wartości odbywa się z wykorzystaniem funkcji i makr przypisanych do obiektu Digital Meter. Funkcja DmSetValue ustawia warto wyświetlanej zmiennej. Jej argumentami są : wskaźnik do modyfikowanego obiektu i nowa wartość. Uzupełnieniem tej funkcji są dwa makra wykonujące inkrementacje i dekrementację wyświetlanej wartości o określoną w argumencie wartość. Zdefiniujmy dodatkowe dwa przyciski i nazwijmy je UP i DOWN. Za pomocą GDD-X można „napisać program”, który będzie modyfikował i wyświetlał wartość w postaci cyfrowej. W oknie Events/Projects Explorer klikamy na identyfikator DMT_7 i wykonujemy Add Code. Powoduje to uaktywnienie obiektu.
Teraz dla przycisku opisanego jako „UP” definiujemy akcję inkrementacji wyświetlanej wartości o 1 przy każdym przyciśnięciu i puszczeniu przycisku. Klikamy prawym klawiszem na BTN_10->BTN_MSG_RELEASED , wybieramy Add Action. Potem wybieramy element Digital Meter DMT_7 z ekranu „ekran”, a następnie akcję Increment Value i na koniec wartość inkrementacji (tutaj o 1). Zostało to pokazane na rysunku 21.
Rys. 21. Dodanie akcji inkrementacji wyświetlanej wartości o 1
Podobne czynności wykonujemy dla przycisku BTN_9 z tym, że tam zdefiniujemy dekrementację wartości o 1. Po tych definicjach GDD-X wygeneruje kod obsługi pokazany na listingu 15.
List. 15. Obsługa modyfikacji I wyświetlania wartosci przez obiekt Digital Meter
//if(objMsg == BTN_MSG_RELEASED && pObj->ID == (BTN_9) ) { DmDecVal(((DIGITALMETER*)(GOLFindObject(DMT_7))), (SHORT)1); SetState(((DIGITALMETER*)(GOLFindObject(DMT_7))), DM_UPDATE); } // // if(objMsg == BTN_MSG_RELEASED && pObj->ID == (BTN_10) ) { DmIncVal(((DIGITALMETER*)(GOLFindObject(DMT_7))), (SHORT)1); SetState(((DIGITALMETER*)(GOLFindObject(DMT_7))), DM_UPDATE); } //
Inkrementacje i dekrementacje wykonują makra DmDrcVal i DmIncVal obiektu Digitalmeter. Nowa wartość jest wyświetlana po wykonaniu opisywanego już makra SetState. Wywołanie tego makra z argumentem DM_UPDATE informuje aplikację, że w obiekcie Digital Meter trzeba na nowo narysować tylko element text. Wszystkie stany obiektu Digital Meter są dokładnie opisane w pliku pomocy.
Na fotografii 22 pokazano ekran z opisywanym przykładem. Żeby wyświetlana wartość była dobrze widoczna wybrałem w definicji stylu pogrubioną czcionkę Arial o wielkości 24dla której zdefiniowane są wzorce znaków tylko dla cyfr 0…9.
Fot. 22. Przykład zastosowania obiektu Digital Meter
Teraz zmienimy obiekt Digital Meter na analogowo/cyfrowy miernik Meter (fotografia 23). Ten obiekt pokazuje wartość w postaci analogowej (wskazówka na skali) oraz w postaci cyfrowej u dołu skali. W zakładce Properties ->General ustawiamy wartości parametrów: Minval=1 i Maxval=50. Wyświetlane wartości będą się mogły zmieniać w zakresie 1…50 z krokiem 1.
Fot. 23. Przykład zastosowania obiektu Meter
Na listingu 16 pokazano fragment programu obsługującego zmianę wyświetlanej wartości przyciskami UP i DOWN.
List. 16. Modyfikacja wskazań obiektu Meter
if(objMsg == BTN_MSG_RELEASED && pObj->ID == (BTN_9) ) { MtrDecVal(((METER*)(GOLFindObject(MTR_6))), (SHORT)1); SetState(((METER*)(GOLFindObject(MTR_6))), MTR_DRAW_UPDATE); } //// if(objMsg == BTN_MSG_RELEASED && pObj->ID == (BTN_10) ) { MtrIncVal(((METER*)(GOLFindObject(MTR_6))), (SHORT)1); SetState(((METER*)(GOLFindObject(MTR_6))), MTR_DRAW_UPDATE); }
Podsumowanie
Trudno byłoby opisać szczegóły wszystkich możliwości biblioteki i programu Graphics Display Designer X, jest to bowiem materiał na sporą książkę. Ale nawet tych kilka prostych przykładów pokazuje olbrzymie możliwości samej biblioteki, ale tez jak dla mnie rewelacyjnego wsparcia w postaci wtyczki GDD-X. To wsparcie powoduje znakomite skrócenie czasu przygotowania interfejsu ale tez daje możliwość szybkiego i elastycznego modyfikowania swoich projektów. Jeżeli do tego dodamy dobrze przygotowany plik pomocy, to dostajemy idealne narzędzie dla tworzenia atrakcyjnych interfejsów użytkownika.