Programmieren der App-Funktion
Wie bereits im ersten Abschnitt dieses Kapitels angesprochen, funktioniert auch das Programmieren der App über Drag and Drop. Im folgenden gehen wir eine Musterlösung des Programmcodes für die App Block für Block durch und erläutern die Funktionen der einzelnen Teilblöcke. Du kannst parallel mitprogrammieren oder und das ist sogar noch viel besser, du hast eine eigene Idee und setzt die beschriebene Funktion auf deine Art und Weise um.
Wir beginnen mit einer booleschen Variablen, welche den Zustand des Automatikmodus speichert. Ihr Block wird in der folgenden Abbildung dargestellt. Diese Variable ist nötig, da flüssig zwischen dem Automatikmodus und der manuellen Farbeingabe gewechselt werden muss. Ist der Automatikmodus aktiv und es wird eine Farbe manuell eingegeben, so muss das Programm "wissen", ob der Automatikmodus aktiviert ist, damit es die Taste des Automatikmodus beim Umschalten in den manuellen wieder freigeben kann. Dazu aber später mehr.
Abbildung: Programmblock der Variablen für den Automatikmodus
Quelle: MIT App Inventor
Als nächstes folgt der Block, der ausgeführt wird, wenn die App das erste Mal geöffnet wird. Wie es die folgende Abbildung beschreibt, werden "Label_Fehlermeldung", "Block_Steueurungsscreen" und "Block_Abfragescreen" unsichtbar, während "Block_Verbindungsscreen" sichtbar wird. Dieser Block dient also als Initialisierung, sodass der Nutzer beim Starten der App als erstes auf dem Verbindungsscreen landet und keine Fehlermeldung sieht, falls deren letzter Stand sichtbar war.
Abbildung: Initialisierungsblock beim Starten der App
Quelle: MIT App Inventor
Die nächsten zwei Blöcke befassen sich mit der "ListenAuswahl", die wie eine Taste aussieht, es aber eigentlich nicht ist. Der erste Block beinhaltet das was passieren soll noch bevor auf die "Verbinden"-Taste gedrückt wird und der zweite Block das, was bei der Auswahl eines Bluetooth-Gerätes, also nach dem Drücken auf die "Verbinden"-Taste, passiert.
Abbildung: Blöcke der "ListenAuswahl"
Quelle: MIT App Inventor
Zum ersten Block:
Noch bevor im Steuerungsscreen auf "Verbinden" geklickt werden kann, wird eine Liste aller mit dem Smartphone gekoppelten Bluetooth-Geräte zuzüglich deren Namen und MAC-Adressen generiert und in der "ListenAuswahl"-Komponente gespeichert.
Zum zweiten Block:
Nachdem auf die "Verbinden"-Taste gedrückt wurde, wird diese vorher generierte Liste angezeigt. Wird eines der in der Liste angezeigten Bluetooth-Geräte ausgewählt, so wird ein Verbindungsversuch gestartet. War der Versuch erfolgreich passiert folgendes:
"Label_Statusausgabe" erhält als Text das verbundene Gerät und dessen MAC-Adresse und die Farbe von "Block_Verbindungsstatus" wird auf Grün geändert. Außerdem wird der Steuerungsscreen in seinen Grundzustand versetzt, was bedeutet, dass "Label_Fehlermeldung" und "Block_Verbindungsscreen" unsichtbar werden und "Block_Steuerungsscreen" dafür sichtbar wird. Des Weiteren wird "Taste_Automatikmodus" aktiviert und deren Farbe auf Blau gesetzt. Auch die Farbe von "Taste_Anwenden" wird blau und "Label_Falsche_Farbeingabe" wird unsichtbar. Abschließend werden die Inhalte der Texteingabefelder für die Farben gelöscht. Nach dem wiederherstellen des Grundzustandes des Steuerungsscreens wird der Befehl "flush" an den ESP32 gesendet, um auch dort den Grundzustand hervorzurufen.
War die Verbindung zum Gerät erfolglos, so schließt sich die Liste und "Label_Fehlermeldung" wird auf dem Verbindungsscreen angezeigt. Der Steuerungsscreen ist dann nicht zu sehen, es kann aber ein erneuter Verbindungsversuch gestartet werden.
Nun da alle Blöcke, die die Funktion des Verbindungsscreens betreffen, erklärt wurden, können wir mit dem Hauptbestandteil der App, dem Steuerungsscreen, fortfahren. Vorher muss aber auch gesagt werden, dass der eben behandelte, zweite Block der "ListenAuswahl"-Komponente auch einen Teil der Funktionen des Steuerungsscreens, wie beispielsweise die Verbindungsstatus-Anzeige, abdeckt. Der erste und größte Block des Steuerungsscreens behandelt die Funktion der "Anwenden"-Taste und wird im Folgenden dargestellt.
Abbildung: Block der "Anwenden"-Taste
Quelle: MIT App Inventor
Das eine Blockkonstrukt, welches leider nicht ganz auf das Bild passt wird gleich gesondert behandelt. Zuerst gehen wir den Block aber einmal von oben nach unten durch:
Beim Betätigen von "Taste_Anwenden" wird, falls der Automatikmodus vorher aktiv war, "global Automatik_An" auf "falsch" gesetzt sowie "Taste_Automatikmodus" wieder aktiviert und deren Farbe auf Blau geändert.
Außerdem wird, wenn in einem der drei Textfelder kein Inhalt steht oder die eingegebenen Zahlenwerte die Grenzen des RGB-Farbraumes sprengen, "Label_Falsche_Farbeingabe" sichtbar und der Befehl "0,0,0" an das Smartphone gesendet. Die Abfrage erfolgt dabei entweder über den Vergleich des Textes in den Textfeldern mit dem leeren String "" und der Verknüpfung der Vergleiche mit ODER-Funktionen oder durch den Vergleich des Zahlenwertes in den Textfeldern mit den Werten 0 und 255 und die Verknüpfung der Vergleiche mit ODER-Funktionen. Da der MIT App Inventor leider keine Funktion zum Umwandeln von Datentypen bietet, müssen wir uns hier ein wenig selbst helfen, indem wir den Text, welcher in den Textfeldern steht vor dem Vergleich mit 0 oder 255 mit einer 1 multiplizieren. Auf diese Weise machen wir aus dem Text direkt eine Zahl. Dies funktioniert aber nur ordnungsgemäß, wenn die Textfelder nur Zahlen enthalten. Dies kann im Designer in den "Eigenschaften" eingestellt werden (kleiner Hinweis). Diese eben beschriebene Abfrage der Grenzen des RGB-Farbraums ist die Zeile, welche in der oberen Grafik abgeschnitten wurde. Diese wird im folgenden nochmals separat dargestellt. Wenn die Eingabe in die Textfelder korrekt war, so wird "Label_Falsche_Farbeingabe" wieder unsichtbar und ein Befehl mit folgender Syntax an das Smartphone gesendet:
Inhalt Textfeld_Rot,Ihnalt Textfeld_Grün,Inhalt Textfeld_Blau
Abbildung: Block der Abfrage des Einhaltens des RGB-Farbraums
Quelle: MIT App Inventor
Abbildung: Block der "Automatikmodus"-Taste
Quelle: MIT App Inventor
Die dritte und letzte Taste auf dem Steuerungsscreen ist die "Trennen"-Taste. Wird "Taste_Trennen" betätigt, so wird "Block_Steuerungsscreen" unsichtbar, "Label_Abfragescreen" wird an den Namen und die MAC-Adresse des Kommunikationspartners angepasst und "Block_Abfragescreen" wird auf der Nutzeroberfläche sichtbar. Der Screen wechselt also quasi vom Steuerungsscreen zum Abfragescreen, auf dem dem Nutzer noch eine letzte Chance gewährt wird, sich zu entscheiden, ob er die Bluetooth-Verbindung tatsächlich trennen möchte oder ob er die "Trennen"-Taste nur versehentlich betätigt hat und wieder zurück auf den Steuerungsscreen möchte.
Abbildung: Block der "Trennen"-Taste
Quelle: MIT App Inventor
Der letzte Block des Steuerungsscreens ist der der Fehlerabfrage, falls die Bluetooth-Verbindung mitten bei der Bedienung der App unterbrochen wird. Kommt es bei der Bluetooth-Verbindung während der App-Bedienung zu einem Fehler, so wird "Block_Verbindungsstatus" rot angezeigt. "Label_Statusausgabe" zeigt dann eine Fehlermeldung mit MAC-Adresse und Name des Kommunikationspartners an.
Abbildung: Block der Fehlerbehandlung bei unerwartetem Abbruch der Bluetooth-Verbindung
Quelle: MIT App Inventor
Nachdem das Programm für den Verbindungsscreen und den Steuerungsscreen steht, bleiben nur noch zwei letzte Blöcke zur Implementation der Funktionen des Abfragescreens übrig, welche im Folgenden dargestellt werden.
Abbildung: Blöcke des Abfragescreens
Quelle: MIT App Inventor
Zum ersten Block:
Wird "Taste_Trennen_Bestätigen" betätigt, entscheidet sich der Nutzer dazu die Bluetooth-Verbindung tatsächlich zu trennen, so wird "Block_Abfragescreen" unsichtbar und die Bluetooth-Verbindung wird getrennt. "Block_Verbindungsscreen" wird wieder sichtbar. Alle zuvor aktivierten Funktionen sind immer noch aktiv.
Zum zweiten Block:
Wird "Taste_Trennen_Verneinen" betätigt, entscheidet sich der Nutzer gegen das Trennen der Bluetooth-Verbindung, so wird "Block_Steuerungsscreen" wieder sichtbar und "Block_Abfragescreen" unsichtbar. Die Verbindung wurde nicht getrennt und alle vorher aktivierten Funktionen sind noch aktiv.