JavaScript: Hardware mit Cylon.js steuern
Seite 4: Treiber entwickeln
Eigene Hardware integrieren
Wie eingangs angesprochen, lassen sich mit dem Basisframework ohne die Installation zusätzlicher Module keinerlei Geräte nutzen. Die benötigten Treiber stehen als Cylon.js-Plug-ins zur Verfügung oder lassen sich selbst schreiben. Sie bestehen aus zwei Teilen: einem Adapter und dem eigentlichen Treiber. Ersterer stellt die Verbindung zu einem Gerät her, sodass dem Treiber die gerätespezifischen Funktionen bekannt sind und er sie ohne Verbindungsinformationen nutzen kann.
Um neue Treiber nicht komplett von Hand schreiben zu müssen, lässt sich auf das Kommandozeilenwerkzeug cylon-cli zurückgreifen. Bei dessen Installation hilft npm:
$ npm install -g cylon-cli
Ist es verfügbar, können Nutzer mit dem Befehl generate module ein Grundgerüst erstellen, wobei für <drivername> der gewünschte Treibername einzusetzen ist:
$ cylon generate module <drivername>
Im neu erzeugten Verzeichnis findet sich anschließend ein Unterordner namens lib, der unter anderem die Dateien adaptor.js und driver.js enthält. Sie enthalten den Code für Adapter und Treiber.
Ein Adapter muss zumindest die Funktionen connect und disconnect enthalten, ein Treiber hingegen start, halt und sämtliche Funktionen, die für das Ansprechen der jeweiligen Hardware erforderlich sind. Ein ausführliches Beispiel hierfür zeigt die Cylon.js-Dokumentation anhand des Treibers für die Parrot AR.Drone.
Der Adapter und der Treiber fungieren als Node.js-kompatible Event Emitter, weshalb die Funktion this.emit zur Verfügung steht, um Ereignisse auszulösen. Um beispielsweise ein connected-Ereignis innerhalb des Adapters an den Aufrufer durchzureichen, lässt sich der folgende Code nutzen:
this.connector.on('connected', () => {
this.emit('connected');
});
FĂĽr die Weitergabe von Ereignissen stellt Cylon.js auĂźerdem die Komfortfunktionen defineAdaptorEvent und defineDriverEvent zur VerfĂĽgung. Damit lieĂźe sich der vorige Aufruf auf die Zeile
this.defineAdaptorEvent('connected');
verkürzen. Soll das Ereignis umbenannt werden, lässt sich das durch die Übergabe eines Objekts und der Definition des neuen Namen als targetEventName bewerkstelligen:
this.defineAdaptorEvent({
eventName: 'connected',
targetEventName: 'now-connected'
});
Ist ein Ereignis zusätzlich als update-Ereignis zu veröffentlichen, ist darüber hinaus die Eigenschaft update mit dem Wert true anzugeben:
this.defineAdaptorEvent({
eventName: 'connected',
targetEventName: 'now-connected',
update: true
});