Bisher haben wir nur sehr einfache Bibliotheksbausteine benutzt. Für die nächste Aufgabe werden wir komplexere Bausteine mit umfangreicherer Funktionalität nutzen. Wir werden sehen, wie uns hoch entwickelte Komponenten aus der PEC-Bibliothek die Arbeit erleichtern. Dazu stellen wir uns eine etwas komplexere Aufgabe.
Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der durch Klicken einer Taste eine neue Funktion ausgewählt und über einen LED-Blinkcode LED visualisiert wird.
Die Lösung soll folgende Anforderungen erfüllen:
Führen Sie folgende Vorbereitungsarbeiten durch:
Die Aufgabe besteht also darin, das Klicken und Halten der Funktionstaste zu unterscheiden. Schauen wir uns in der PEC-Bibliothek um fällt und der Bibliotheksbaustein PecButtonClickAndHold auf. Zunächst stellen wir diesen neuen Baustein dem bisher verwendeten PecPinInput gegenüber.
Der Unterschied ist beim Betrachten der Bausteine recht deutlich. Den PecPinInput kann man eigentlich nur konfigurieren und den Status abfragen. Der PecButtonClickAndHold wirkt dagegen viel komplexer. Er hat zwar auch die Merkmale von PecPinInput aber uns fallen vor allem die ist ein-Beziehung zum PecAppModul und die zusätzlichen Verhaltensmerkmale wie zum Beispiel onClick, onHoldStart, isPressed und waitForPress auf.
Die Eigenschaft ein PecAppModul zu sein bedeutet, dass der PecButtonClickAndHold eine aktive Klasse ist. Er kann also selbständig ohne von uns besonders behandelt zu werden automatisch seine Verhaltensmerkmale als eigene Task ausführen. Das ist zum Beispiel bei der Operation onClick so. Das der Button geklickt wurde merkt dieser selbständig ohne dass wir dafür etwas programmieren müssen. Der Name verrät bereits, dass es sich bei onClick um ein sogenanntes Ereignis handelt.
Wenn Sie sich später mit der UML intensiver auseinandersetzen werden Sie die genaue Bedeutung der schräg gestellten Schreibweise lernen. Wir merken uns erst einmal, dass wir uns als Anfänger an solche schräg gestellt notierten Verhaltensmerkmale sozusagen dranhängen können. Der Fachmann nennt das eine virtuelle Funktionen zu überschreiben. Das Werkzeug wird uns dabei komfortabel unterstützen.
In Summe lässt sich schon mal feststellen, dass der Bibliotheksbaustein PecButtonClickAndHold offensichtlich schon alles kann was wir für die Erfüllung der gestellten Anforderungen benötigen.
Für die Anzeige-LED möchten wir auch einen höher entwickelten Bibliotheksbaustein verwenden. Das ist die PecLED. Wir stellen diese wieder mit dem einfachen PecPinOutput gegenüber
Auch hier fällt das PecAppModul ins Auge. Offensichtlich macht die PecLed was auch immer diese tun soll selbständig. Die Liste der Verhaltensmerkmale verrät uns schon was die PecLed so kann. Sie kann offensichtlich neben einfachem An-, Aus- und Umschalten (on, off, toggle) auch noch blinken, flackern, dimmen und kurz aufblitzen (blink, flicker, dim, flash). Es sieht so aus, als wenn dieser Baustein ebenfalls schon alles kann was wir brauchen.
Fassen wir kurz zusammen welche Systembausteine wir benötigen:
Die Taste und die LED müssen mit dem Controller verbunden werden und wir kennen auch schon die benötigten Bibliotheksbausteine sowie die Ereignisse an die wir uns dran hängen möchten. Der Grobentwurf sieht dann wie folgt aus:
MERKE: schräg gestellte Verhaltensmerkmale = hier kannst du dich durch überschreiben „dranhängen“
Die Realisierung sollte die im obigen Entwurf beschriebenen Elemente beinhalten. Da diese Lösung eine neue Stufe der Komplexität darstellt soll hier wieder Schritt für Schritt der folgende Entwurf gealisiert werden.
Als erstes führen wir die bekannten Schritte aus:
Der Entwurf sollte jetzt dem folgenden Zwischenstand haben. Bitte verifizieren Sie ihr Klassenmodell.
Im nächsten Schritt wollen wir uns an die Ereignisse onClick und onHoldStart hängen indem wir diese Verhaltensmerkmale überschreiben. Überschreiben bedeutet, dass in unserer Anwenderklasse Operationen gleichen Namens enthalten sind. Der Compiler erkennt automatisch, dass beim Aufruf dieser Ereignisse nicht die Operationen des PEC-Bausteins in der Bibliothek sondern die Operationen in unserer Anwendung aufgerufen werden müssen. Gehen Sie wie folgt vor:
Wiederholen Sie diese Schritte für die Operatiom ButtonClickAndHoldBase::onHoldStart():void.
Nach diesen Arbeitsschritten sollte ihr Klassenmodell wie folgt aussehen. Verifizieren Sie bitte ihr Klassendiagramm.
Jetzt können wir den C++ Code für die geforderte Funktionalität eingeben.
FunctionKey::onClick():voidapp.indicatorLED.nextBlinkCode();
FunctionKey::onHoldStart():voidapp.indicatorLED.off();
Der Aufwand für die Konstruktion des Klassenmodells wird jetzt mit verblüffend einfachem Code belohnt. Wir können die Anwendung jetzt erstellen und Testen.
Übersetzen Sie das Programm. Korrigieren Sie ggf. Schreibfehler. Übertragen Sie das lauffähige Programm in den Programmspeicher des Controllers.
Erlernte und gefestigte Arbeitsschritte:
Erweitern Sie zur Übung die Anwendung um eine Reaktion beim loslassen der Funktionstaste nach dem langen halten (onHoldEnd). Beim Loslassen der gehaltenen Taste soll die Anzeige-LED kurz aufblitzen (flash).