[2] JAVA i STM32 – ekspresowy kurs programowania z MicroEJ – obsługa GPIO
Teraz można już przystąpić do tworzenia kodu aplikacji. Na początku należy dodać główną klasę z metodą main, od której rozpocznie się wykonywanie programu. Nazwa klasy nie ma znaczenia, ważne jest aby zawierała ona statyczną metodę main. Nową klasę można dodać klikając prawym przyciskiem myszy na projekcie w drzewie po lewej stronie głównego okna środowiska MicroEJ i wybierając New?Class. W oknie nowej klasy (rysunek 5) należy podać jej nazwę. Warto także podać nazwę pakietu, w którym zostanie umieszczona klasa – w przeciwnym razie zostanie ona umieszczona w pakiecie default co jest niezalecane. Po kliknięciu Finish zostanie utworzona klasa z metodą main, w której należy umieścić własny kod. Jak już wspomniano wcześniej, metoda ta jest statyczna, co oznacza, ze może być wywołana bez utworzenia obiektu klasy, w której się znajduje. Dodatkowo można zauważyć, ze jest oznaczona modyfikatorem dostępu public, co z kolei umożliwia wywołanie tej metody z dowolnego miejsca w programie.
Rys. 5. Tworzenie nowej klasy
Przed przystąpieniem do implementacji metody main, warto jeszcze przygotować inną klasę – ButtonListener (listing 1). Jest to klasa umożliwiająca odbieranie zdarzeń przycisku z generatora (opis w punkcie 1). Powinna ona implementować interfejs Listener znajdujący się w bibliotece MicroUI. Interfejs w Javie jest listą metod, które klasa musi implementować. Można o nim myśleć także jako o odpowiedniku dziedziczenia po klasie abstrakcyjnej, znanym z innych języków obiektowych. Dzięki temu tworzona klasa ButtonListener implementująca interfejs Listener, jest także typu Listener i może być używana przez generator zdarzeń. Nową klasę można dodać w ten sam sposób co klasę główną, lecz w tym przypadku dodając implementowany interfejs (ej.microui.Listener) w polu Interface. Można to zrobić także po dodaniu klasy, dopisując implements Listener po nazwie klasy w pliku źródłowym.
Interfejs Listener wymaga zaimplementowania trzech metod performAction różniących się argumentami. W tym przypadku potrzebna jest tylko jedna z nich, przyjmująca liczbę całkowitą jako kod zdarzenia, opisany w punkcie 1. (pozostałe metody można pozostawić puste, jednak muszą być zdefiniowane w klasie). Wewnątrz metody określany jest i wyświetlany w konsoli typ zdarzenia – w przykładzie użyte są tylko zdarzenia wciśnięcia i zwolnienia przycisku. Metoda performAction będzie wywoływana po każdorazowym wykryciu zdarzenia.
List. 1. Kod klasy ButtonListener
package app; import ej.microui.Listener; import ej.microui.io.Buttons; public class ButtonListener implements Listener { @Override public void performAction() { // TODO Auto-generated method stub } @Override public void performAction(int value) { System.out.println("Got event number "+value); int action = Buttons.getAction(value); switch (action) { case Buttons.PRESSED: System.out.println("Button PRESSED"); break; case Buttons.RELEASED: System.out.println("Button RELEASED"); break; default: break; } } @Override public void performAction(int value, Object object) { // TODO Auto-generated method stub } }
Teraz można już przystąpić do implementacji metody main (listing 2). Jest ona bardzo prosta i zawiera jedynie rejestrację przygotowanego wcześniej obiektu typu ButtonListener w generatorze zdarzeń. Jest to typowa struktura dla aplikacji z interfejsem użytkownika: główna metoda main przygotowuje interfejs, a reszta programu znajduje się w obsłudze zdarzeń.
List. 2. Kod klasy GPIO
package app; import ej.microui.EventGenerator; import ej.microui.io.Buttons; public class GPIO { public static void main(String[] args) { EventGenerator[] eventGenerators = EventGenerator.get(Buttons.class); eventGenerators[0].setListener(new ButtonListener()); } }
Komentarza wymaga jeszcze tablica EventGenerator[]. Zawiera ona wszystkie zarejestrowane generatory typu podanego w argumencie metody EventGenerator.get. Generatory te są definiowane w konfiguracji platformy w pliku *-configuration/microui/microui.xml.
Na koniec pozostaje nam tylko uruchomienie przykładu. Na początek można sprawdzić działanie w symulatorze (jak widać na filmie). W tym celu należy kliknąć prawym przyciskiem myszy na projekt i wybrać opcję Run As?Run Configurations… W wyświetlonym oknie należy utworzyć nową konfigurację (New launch configuration), w zakładce Main wybrać projekt (Browse…) i klasę zawierającą metodę main (Select Main type…). Natomiast w zakładce Execution wybrać przygotowaną wcześniej platformę (JPF) i zaznaczyć opcję Execute on SimJPF. Po kliknięciu Run następuje uruchomienie symulatora, na którym wciśnięcie przycisku za pomocą myszy powoduje wywołanie metody klasy ButtonListener i wyświetlenie w konsoli kodu otrzymanego zdarzenia. Uruchomienie przykładu na zestawie ewaluacyjnym zostanie omówione w kolejnych punktach.
Obsługa LED
Sterownik LED jest także zawarty w bibliotece MicroUI, a jego użycie jest bardzo proste. Dostarcza on metod do sprawdzania liczby diod i ustawiania ich stanu. Implementacja tych metod znajduje się wewnątrz platformy, a biblioteka umożliwia dostęp do nich z poziomu Javy. Sprawdzenie liczby dostępnych diod odbywa się przez wywołanie metody Leds.getNumberOfLeds() z modułu ej.microui.io.Leds, a zmiana ich stanu przez wywołanie Leds.setLedOn(int ledid) lub Leds.setLedOff(int ledid). Wartość ledid jest numerem diody od 0 do całkowitej liczby diod minus jeden.
Kontrola diod jest możliwa z dowolnego miejsca w kodzie. W przykładzie, w metodzie main, sprawdzana jest liczba dostępnych diod i sygnalizowana na jednej nich (listing 3).
List. 3. Obsługa LED w metodzie main
public static void main(String[] args) { EventGenerator[] eventGenerators = EventGenerator.get(Buttons.class); eventGenerators[0].setListener(new ButtonListener()); try { int ledsCount = Leds.getNumberOfLeds(); for (int i = 0; i < ledsCount; i++) { Leds.setLedOn(0); Thread.sleep(1000); Leds.setLedOff(0); Thread.sleep(1000); } } catch (InterruptedException e) { e.printStackTrace(); } }