⟵ zur Projektübericht

Motivation

Der ADFC-Stormarn e.V. verwendet Klebeetiketten zur Codierung von Fahrrädern.

EIN-Code Etikett

Auf diesen Etiketten ist ein EIN-Code (Eigentümer-Identifizierungs-Nummer) aufgedruckt, die es der Polizei, den Fundbüros und dem ADFC erlauben, den Eigentümer eines Fahrrads zu ermitteln. Eine über aufgeklebte Etikett angebrachte Plombierfolie schützt dieses vor dem Ablösen.

ADFC EIN-Code-Etikett aufgeklebt

Dieses Verfahren eignet sich auch für andere Gegenstände, wie Kameras, Fahrrad-Akkus, Kinderwagen, Pferdesättel, etc.

Die Codier-Aktionen finden häufig j.w.d. statt und nicht immer gibt es dort einen verlässlichen Zugang zum Internet. Die Daten zur Generierung der EIN-Codes werden deshalb in einer lokal zur Verfügung stehenden SQLite-Datenbank abgelegt.

Diese Seite beschreibt wie das Drucken von Klebeetiketten mit einem per Bluetooth gekoppelten Drucker implementiert ist.


In­halts­ver­zeich­nis

Implementierung: Klebeetikett drucken

Druckerauswahl

Drucken

Etikettenzähler

Sonderbehandlung in Screen1


Implementierung: Klebeetikett drucken

Mit einem Smartphone können mehrere Drucker gekoppelt sein. In diesem Fall muss der Anwender entscheiden, welcher dieser Drucker benutzt werden soll. Eine Automatik, die prüft, ob ein Drucker per BT erreichbar ist, ist leider nicht möglich, da die letztendlich verwendete  der BluetoothClient-Komponente des App Inventors eine solche Funktion nicht unterstützt.

Die Funktionalitäten zum Drucken werden von der Extension UrsPte560 bereit gestellt. Dies ist ein Wrapper um die BluetoothClient-Komponente mit erweiterten und angepassten Funktionen. U.a. wird auch ein ausgewählter Drucker in dieser Komponente statisch abgelegt, d.h. ein einmal ausgewählter Drucker ist auf allen anderen Screens (Activity) verfügbar, die diese Extension benutzen.

Die Zahl der täglich erstellten Etiketten wird in einer TinyDB-Komponente unter dem aktuellen Tagesdatum abgelegt.

Druckerauswahl

Zur Erleichterung der Identifizierung der Drucker, sind diese mit einem Aufkleber mit dem Bluetooth-Namen des Druckers versehen:

Bluetooth-Kennung des Druckers

Zur Auswahl eines Druckers und zur Anzeige des ausgewählten Druckers wird eine ListPicker-Komponente (pickPrinter) verwendet. Bei der Initialisierung einer Screen-Komponente, wird überprüft, ob schon ein Drucker ausgewählt wurde. Dies wird dem Anwender in der ListPicker-Schaltfläche angezeigt (Eigenschaft Text).

Anzeige ausgewählter Drucker

Die Überprüfung erfolgt beim Ereignis Screen.Initialize einer Screen-Komponente und beim Ereignis Screen.OtherScreenClosed.

Initilaie Anzeige eines ausgewählten Druckers

Der zu benutzende Drucker kann jederzeit erneut festgelegt werden. Dazu muss der Anwender die Schaltfläche der ListPicker-Komponente antippen. Daraufhin wird die Liste der Namen der gekoppelten Drucker in die ListPicker-Komponente übertragen und angezeigt:

BeforePicking: Füllen der ListPicker-Komponente

Nach der Auswahl wird der Name verteilt:

AfterPicking: Verteilen der Auswahl

Ist zum Zeitpunkt des Druckens eines Etiketts noch kein Drucker ausgewählt, wird ebenfalls die ListPicker-Komponente zur Druckerauswahl aufgerufen.

Druckerauswahl vor dem Drucken

Drucken

Das Drucken wird über die Schaltfläche cmdPrint ausgelöst. Das eigentliche Drucken kann nicht direkt ausgelöst, da der Aufruf von UrsPte560.Print die Anwendung blockiert. Die Anpassung der anderen Elemente erfolgt über die MessageQueue. Die ist aber während des Druckens blockiert. Deshalb erfolgt der eigentliche Druck um 100 ms verzögert. Dies reich, um die anderen Komponenten zu aktualisieren. Der Aufruf von UrsAI2Utils.FireDelayedEvent löst das Ereignis UrsAI2Utils.DelayedEvent nach der angegebenen Zeit aus.

cmdPrint: Druck auslösen

Der Start des Drucks erfolgt um 100 ms verzögert. Im Fehlerfall, müssen die benutzten Komponenten wieder zurück gesetzt werden.

Verzögerte Auslösung des eigentlichen Drucks

Falls der Druck erfolgreich war, wird der Etikettenzähler erhöht (s.u.). Auf jeden Fall werden die benutzten Komponenten wieder zurück gesetzt. UrsPte560.AfterDataPrinted wird etwa zwei Sekunden (Einstellung über UrsPte560.AfterDataPrintedDelay) nach dem Start des Drucks ausgelöst. Dies reicht i.d.R. für die Übertragung der Daten an den Drucker. Danach kann die Verbindung zum Drucker für andere Clients frei gegeben werden.

Beendigung des Druckvorgangs

Etikettenzähler

Die Zahl der täglich erstellten Etiketten wird in einer TinyDB-Komponente unter dem aktuellen Tagesdatum abgelegt. Beim Initialisieren einer Screen-Komponente wird der DB-Schlüssel xxx ermittelt und die Datenbank abgerufen:

Initialisierung des Etikettenzählers

Nach jedem erfolgreichen Druck wird der Zähler erhöht:

Etikettenzähler fortschreiben

Sonderbehandlung in Screen1

Bei der Initialisierung von Screen1 wird die Datenbank für den Etikettenzähler aufgeräumt. Der aktuelle Zähler wird ausgelesen, die Datenbank gelöscht und anschließend neu beschrieben.

Initialisierung in Screen1

Wenn ein anderer Screen geschlossen wird, muss die evtl. neue Etikettenanzahl angezeigt werden:

Aktualisierung der Etikettenanzahl