Knobelaufgabe: IO Warrior bleibt hängen

Lieber Torben

Kleine Knobelaufgabe ::slight_smile:

Ich bin dabei für ein Partnerradio eine VF (Verkehrsfunk) zu realisieren. Soweit so gut. Nun haben wir jedoch gemerkt, dass der IOWarrior in bestimmten Situatioen hängen bleibt.

Ausgangslage:
mAirList mit IOWarrior + Notificationscript PFL

[Remote0] Type=IOWarrior Serial=00003A8C On0=PLAYER 1-1 START Off0=PLAYER 1-1 STOP

Port 0 (Taster) drücken und halten. mAirList Player 1 spielt.
Bit 0 geht auf LOW in ALL-in-ONE … Testprogramm für den IOWarrior
Taster loslassen. Player Stop
Bit 0 geht auf HIGH in ALL-in-ONE … Testprogramm für den IOWarrior
Taster nochmals drücken -> Abfolge wieder holt sich. Bis hier her alles okay

[hr]
Nun habe ich an Port0 nur meinen Taster jedoch kein On0 bzw. OFF0, da ich diese Status mit einem Script abfrage

[Remote0] Type=IOWarrior Serial=00003A8C

Port 0 (Taster) drücken und halten.
Bit 0 geht auf LOW in ALL-in-ONE … Testprogramm für den IOWarrior
Taster loslassen.
Bit 0 geht auf HIGH in ALL-in-ONE … Testprogramm für den IOWarrior
Taster nochmals drücken -> Abfolge wieder holt sich. Bis hier her alles okay

Nun kommt das PFL ins Spiel, welches den Port 30 setzt
Port 0 (Taster) drücken und halten.
Bit 0 geht auf LOW in ALL-in-ONE … Testprogramm für den IOWarrior
PFL in der Playlist mittels ICON aktivieren und wieder deaktivieren
Taster loslassen.
Bit 0 bleibt auf LOW in ALL-in-ONE … Testprogramm für den IOWarrior
Taster nochmals drücken -> Nichts geht mehr mit BIT 0

Knobelfrage: Wieso bleibt Bit 0 auf LOW?
Hängt die mit dem Wetter zusammen, oder ist mAirList nicht happy über die fehlenden Befehle?

Liebe Grüsse
Michel


ALL-in-ONE … Testprogramm für den IOWarrior ( 24 / 40 / 56 )
http://www.greinert-dud.de/


IOWarriorPFLSwitch.mls (831 Bytes)

Zwischenablage01.jpg

Die Lösung ist vermutlich die folgende:

Jeder Port lässt sich als Eingang oder als Ausgang verwenden. mAirList ermittelt beim Programmstart anhand der in der Config zugewiesenen Befehle, welche Ports als Eingänge angesehen werden sollen. Nämlich genau die, für die ein Kommando eingerichtet ist. Alle anderen werden als Ausgänge betrachtet.

Warum ist das jetzt wichtig?

mAirList kommuniziert mit dem IOWarrior über das HID-Protokoll. Dabei überträgt mAirList bei jedem SetPort nicht nur den neuen Wert des einzelnen Ports, sondern immer die Werte für alle Ports gleichzeitig. Es werden als z.B. beim IOWarrior40 (der ja eigentlich nur 32 Ports hat) jedesmal 32 Bit, also 4 Byte, übertragen. Wichtig dabei: Man muss die Bits derjenigen Ports, die man als Eingang verwenden will, immer auf 1 lassen. Das tut mAirList automatisch für diejenigen Ports, denen du in der Config ein Kommando zugewiesen hast. Die anderen werden je nach Zustand auf 1 oder auf 0 gesetzt, wobei die Logik invers ist: 0 bedeutet “Port an” und 1 bedeutet “Port aus”. Wenn man ein Bit zum ersten Mal auf 0 setzt, nimmt der IOWarrior an, dass man es ab sofort als Ausgang verwenden will. Solange man nur Einsen für das Bit schickt, bleibt der Port ein Eingang.

mAirList speichert den aktuellen Zustand alle Ports zwischen und passt die Bits entsprechend an, wenn Statusänderungen entweder vom IOWarrior (Eingangs-Ports) oder vom Script (Ausgangs-Ports) kommen. Am Anfang steht in diesem Zwischenspeicher: FF FF FF FF (alle Ports aus). Insbesondere ist also Bit 0 auf 1 gesetzt.

Wenn du jetzt SetPort(30, 1) und SetPort(30, 0) aufrufst, wird das 30. Bit gelöscht bzw. wieder gesetzt. Da du keine Eingänge definiert hast, verändert mAirList vor dem Abschicken auch keine Bits.

Nun drückst du am IOWarrior die Taste, damit wird der Port aktiviert, und der IOWarrior schickt uns per HID: Bit 0 jetzt auf 0! (Genauer: Er schickt uns alle 32 Bits.) Das speichert mAirList in seinem Buffer. Wenn du jetzt das nächste Mal SetPort aufrufst, wird diese 0 zurück an den IO-Warrior übertragen. Damit wird Port 0 ab sofort zum Ausgang und reagiert nicht mehr auf den Knopfdruck.

Fazit: Die Applikation muss wissen, welche Ports Eingänge und Ausgänge sind. Bei mAirList geschieht die Unterscheidung dadurch, dass man manchen Ports Befehle zuordnet und manchen nicht. Wenn du also Port 0 als Eingang benutzen willst, auch wenn es für ein anderes Programm ist, musst du ihm ein Kommando zuordnen. Im Zweifel ein nicht existentes, das mAirList dann einfach ignoriert.

Hallo Torben

Herzlichen Dank für Deine ausführliche Antwort. Es scheint wirklich mit einem beliebigen Kommando zu klappen. Wäre es denkbar, dass Du ein Kommando z.B. “NoAction” oder “SetasInputPort” in die Liste hinzufügen könntest?

Liebe Grüsse
Michel

Tipp einfach “x” oder “nix” ein.

Habe ich bereits ::slight_smile:

torben,
wo du gerade so schön die Funktionsweise von I/O-W erlkärst.

Kann mAirlist eigentlich auch den I2C-Bus benutzen? Würde einige interessante Möglichkeiten eröffnen…

Greetz
Malte

Schau dir mal folgenden Link an. Scheint als lässt sich über einen IO-Warrior einen I2C ansteuern.

ALL-in-ONE … Testprogramm für den IOWarrior ( 24 / 40 / 56 )
http://www.greinert-dud.de/

Ja ja, der I/O-Warrior kann dass, aber meine Frage war: Kann mAirlist auch I2C reden?
Ich muss ja irgendwie den BUS abfragen, oder daten hin schicken.

Man könnte z.B. die aktuelle Laufzeit oder Titelinformationen an ein Display schicken, war hier im Forum schonmal gefragt, oder dezentrale I/Os oder oder oder…
gibt reichlich was man damit anstellen kann.