ISIX-RTOS – przykład 2 – kolejki FIFO i obsługa graficznego wyświetlacza LCD

Ustawienie wybranej pozycji kursora w pamięci obrazu sprowadza się do wysłania do wyświetlacza komendy Set Row Position oraz Set Col Position.
Działanie klasy display_server (wątku serwera) , sprowadza się do odczytywania komunikatów (wskaźników do klas komunikatów) z kolejki FIFO, a następnie odpowiednie wykorzystanie metod klasy nokia_display do sterowania wyświetlaczem. Zadanie to realizowane jest przez metodę wirtualną main() klasy display_server (list. 7).

List. 7. Metoda wirtualna main() klasy display_server

W pętli głównej wątku wywoływana jest metoda pop() obiektu kolejki FIFO (io_fifo). Metoda ta blokuje wykonywanie wątku do momentu odebrania od innego zadania komunikatu przekazanego za pomocą metody push(). W przypadku, gdy kolejka FIFO zawiera jakiś komunikat, wówczas metoda pop(), wybudza wątek i zwraca kod błędu isix::ISIX_EOK. W przypadku odebrania prawidłowego komunikatu, zawartość wyświetlacza LCD jest czyszczona za pomocą metody clear() obiektu wyświetlacza display, a następnie sprawdzany jest typ przekazanego komunikatu (obiektu) za pomocą metody get_type() klasy bazowej display_msg. Wykrywanie typów klas również można zrealizować za pomocą mechanizmu RTTI (Run Time Type Information) i operatora typeid(), jednak z uwagi na dużą zajętość pamięci Flash mechanizm RTTI został wyłączony za pomocą flagi kompilatora -fno-rtti) Jeżeli przekazany obiekt jest typu tekstowego (text_msg), wówczas jest on rzutowany na wskaźnik do klasy text_msg, i następnie wywoływane są metody pobierające wskaźnik do napisu oraz pozycję tekstu na ekranie. Następnie wywoływana jest metoda obiektu wyświetlacza (display), wypisująca tekst na wyświetlaczu LCD na zadanej pozycji. W przypadku, gdy mamy do czynienia z obiektem typu graficznego (graph_msg), wówczas jest on rzutowany na wskaźnik do tego obiektu, a następnie wywoływana jest metoda pobierająca wskaźnik na strukturę opisującą obrazek (img_def). Następnie wskaźnik ten jest przekazywany do metody put_bitmap() obiektu wyświetlacza, który jest odpowiedzialny za wyświetlenie bitmapy. Obiekt keys, klasy graph_key jest odpowiedzialny za odczyt stanu joysticka oraz wysyłanie komend dla serwera wyświetlania w zależności od kierunku przechylenia josyticka.

List. 8. Klasa graph_key jest odpowiedzialna za odczyt stanu joysticka oraz wysyłanie komend dla serwera wyświetlania w zależności od kierunku przechylenia joysticka

Obiekt inicjalizowany jest za pomocą konstruktora, który jako argument przyjmuje referencję do klasy display_server. W konstruktorze inicjalizowane są porty GPIO do których podłączone są poszczególne styki joysticka. Odczyt stanu joysticka oraz wysyłanie komunikatów realizowane jest przez metodę główną wątku main()list. 9.

List. 9. Metoda główna wątku main() odpowiada za odczyt stanu joysticka oraz wysyłanie komunikatów

Wykrywanie kierunku przechylenia joysticka jest realizowane w pętli głównej wątku, na zasadzie wykrywania zbocza na linii GPIO, do której dołączono styki joysticka. W przypadku wykrycia zbocza opadającego na którymś z wejść program ustala jaki kierunek wskazuje josytick, następnie do kolejki FIFO serwera wyświetlania jest przekazywany obiekt komunikatu za pomocą metody send_message(). Dodatkowe krótkie opóźnienie o długości DELAY_TIME (25 ms) eliminuje wpływ drgań styków na działanie aplikacji.

Do pobrania

O autorze