Einfache Erstellung einer GUI zum isolierten Testen von Hardware

Testen von frisch entwickelter Hardware kann manchmal ganz schön Zeit und Nerven aufreibend sein. Sobald mehrere Komponenten einer Einheit gleichzeitig entwickelt werden, bedarf es isolierter Tests, um alle Funktionen unabhängig voneinander zu überprüfen. In unserem Fall geht es um den Powercontroller eines Defibrillators. Dieser wird später mit dem restlichen Gerät kommunizieren. So lange dieses jedoch noch nicht entwickelt ist, soll eine Testsoftware diese Schnittstelle simulieren. Nach der Toolvalidierung können dann alle Software- und Integrationstests durchgeführt werden. Durch Verwenden einer GUI (Graphical User Interface) soll außerdem die Bedienbarkeit vereinfacht werden. Wer verschickt und liest schon gerne Hexadezimal Pakete?

Schema der Problematik. Die zu erstellende Software fungiert als externer Host, welcher über die serielle Schnittstelle mit dem Softwareprotokoll des Mikrocontrollers der Powercontroller-Einheit kommuniziert und den restlichen Defibrillator simuliert.

Eine GUI erstellen. Wie eigentlich?

Zur Programmierung einer GUI gibt es sehr viele Möglichkeiten. Aufgrund von Beliebtheit, Erweiterbarkeit und Lizenzfreiheit bietet sich Python in Kombination mit PyQt an. Auch die gute Dokumentation und Vielfalt an Diskussionen über Python im Netz sprechen für die Verwendung der Programmiersprache. PyQt ist ein Binding zwischen Python und der in C++ verfassten QT-Bibliothek und erfreut sich ebenfalls großer Verbreitung. Neben der Verfügbarkeit aller klassischen Steuerelemente (Checkboxen, Buttons, Comboboxen, …) ist auch das Einbinden komplexerer grafischer Komponenten wie z. B. Graphen ohne weiteres möglich.

Das Designertool QTDesigner bietet die Möglichkeit, die grafische Oberfläche schnell und relativ intuitiv zu gestalten, ohne eine Zeile Code zu schreiben. Dank QT sind die verwendeten Elemente auf allen Plattformen nativ. Im Designer kann mit Layouts die Orientierung ordentlich und ansprechend gestaltet werden.

Der QTDesigner in Aktion.

So entstandene Designs können mit nur einem Befehl in der Kommandozeile in einem Python-Skript übersetzt werden. Da der Rest der Anwendung in anderen Dateien geschrieben wird, kann parallel an der Benutzeroberfläche in QTDesigner und an der Logik der Software gearbeitet werden. Der Signal-/Slot Editor (unten rechts im Screenshot) erlaubt die direkte Implementierung einfacher Funktionen, die grafische Elemente im Programm übernehmen sollen. Alles sehr praktisch und nach kurzer Einarbeitung wirklich einfach.

Ist die GUI fertig, kann mit bestimmten Tools (z. B. mit pyinstaller .exe-Dateien für Windows) eine unabhängig ausführbare App erstellt werden, ideal für die Weitergabe an die Testabteilung oder den Kunden.

Im Inneren

Die beiden großen Aufgaben der Software sind die Kommunikation mit der Hardware und die Bereitstellung der grafischen Schnittstelle. Für den reibungslosen Ablauf wird dafür Multihreading verwendet, also die parallele Abwicklung der Aufgaben. Die Anwendung an sich verwaltet die GUI während sich ein Thread mit dem Senden, Empfangen und Interpretieren von Datenpaketen von und für die Hardware beschäftigt. Untereinander wird mit QT’s Signalen und Slots kommuniziert. So kann der Hardware-Thread das Aufrufen von Funktionen der GUI veranlassen und umgekehrt.

In unserem Fall sind die Nachrichten zwischen Powercontroller und Host in Paketen organisiert. Jedes Paket besteht aus einem Start- und Stopzeichen, einem Schlüssel zur Identifikation des Kommandos, einer Payload, die die zugehörigen Informationen enthält und einer Checksumme. Letztere dient zur Garantie der vollständigen und korrekten Übermittlung des Pakets. Bei Eingang der Daten werden diese in einen Buffer geschrieben, welcher sie als Paket an den nächsten Buffer weitergibt, sobald ein Stopzeichen erreicht wird. Nach der Validierung mittels Checksumme wird dann abhängig vom Befehl die entsprechende Funktion in der GUI aufgerufen.

Kontinuierlich verfügbare Daten werden auch kontinuierlich angezeigt. Zum einen numerisch und zum anderen grafisch in Form von Plots. Auf Wunsch können diese Daten als Logs in .csv Dateien gespeichert und später weiterverarbeitet werden. So sind auch längere andauernde Analysen der Hardware möglich.

Die zwei Hauptkomponenten der Software-Funktionen wie Updates, das Definieren einer neuen Seriennummer des Geräts oder das Auslösen eines Resets sind ebenfalls möglich.

Aufgabenverteilung der zwei wichtigsten Software-Komponenten

Fazit

Python bietet durch Verbreitung, Funktionalität und Kompatibilität alles, was für das schnelle und effektive Schreiben eines solchen Tools zum Integrationstest von Vorteil ist. Die GUI war schnell geschrieben und kommuniziert problemlos über eine serielle Schnittstelle mit der Hardware. Der neue Komfort und die Zeiteinsparung waren beim zuständigen Entwickler sehr willkommen. Bereits beim Schreiben der Software fielen durch das isolierte und intensive Arbeiten mit den verschiedenen Funktionen einige bis dato unbemerkte Fehler auf.

Zu beachten sind die kleinen aber feinen Lizenzunterschiede: PyQt ist unter der GNU General Public License (GPL) oder als kommerzielle Version verfügbar. Alternativen wie etwa wxpythonkivy oder beeware gibt es unter der noch freieren GNU Lesser General Pulic License (LGPL).

Auch interessant:

Unittests und Coverage – Wie viel Testabdeckung brauche ich?

Unit Tests sind schon etwas Tolles! Unit Tests werden in der Regel vom Entwickler selber parallel zur Entwicklung geschrieben. Es wird nicht…

Avatar

Seit Januar 2019 gehört Christian Schlieker zum MEDtech-Ingenieur Team. Aktuelle Aufgabengebiete umfassen die hardwarenahe Entwicklung in C und die Entwicklung von grafischen Benutzeroberflächen.

Getagged mit: , , , , , , ,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.