A communication protocol for GEM applications XAcc

Contents Extended XAcc XACC.H

4 Example: no|Link's XAcc protocol

Das no|Link-Accessory wurde für die Ansteuerung von Infrarotgeräten konzipiert und beinhaltet eine XAcc-Kommunikationsschicht für die Ansteuerung durch spezielle Applikationen. Zum momentanen Zeitpunkt wird das Media-Link-Interface von Catch Computer unterstützt. Eine weitere Anpassung an das no|Remote-Interface von no|Software ist in Arbeit.

Das no|Link-Accessory verwaltet alle Informationen, die zur Ansteuerung der verwendeten Infrarot- oder sonstiger Hardware benötigt werden. Jedem hardwareabhängigen Code (z.B einem Infrarotsignal) wird ein Befehl zugeordnet, und für jedes Gerät (z.B. Videorekorder) existiert eine Liste solcher Befehle.

Will nun z.B. eine Applikation für die Fernbedienung eines Videorekorders ein Infrarotsignal für die Play-Taste senden, so schickt es no|Link eine XAcc-Nachricht, in der das Kommando <senden>, das Gerät <VIDEOREKORDER> und der Befehl <PLAY> codiert sind.

Damit eine Applikation mit no|Link vollständig kommunizieren kann, muß diese das Request/Reply-Protokoll unterstützen, was als Extended-Feature in der XDSC-Beschreibung durch ein "RQ" bekannt gemacht wird. Nur so ist es möglich, die Liste der eingetragenen Geräte von no|Link erhalten zu können.

Wenn die Applikation auch Codes vom Accessory empfangen können will (nur mit entsprechender Hardware möglich), so muß als Extended-Feature in der XDSC-Beschreibung zusätzlich ein "RR" (Remote Receive) enthalten sein. Alle Applikationen, die mit noLink arbeiten wollen, müssen den XAcc-Level 1 unterstützen.

Als Application-Type enthält das no|Link-Accessory im XDSC "\2RC" (Remote Control).

Die vollständige XAcc-Identifikation von no|Link lautet zur Zeit folgendermaßen (in C-Syntax):


	char xaccNoLinkIdent[] =	"Infrarot Manager\0"
								"XDSC\0"
								"1Fernsteuerschnittstelle\0"
								"2RC\0"
								"XRQ\0"
								"NnoRci\0";

Eine denkbare XAcc-Identifikation für eine no|Link-Applikation könnte so aussehen:


	char xaccIdentstring[] =	"VideoControl\0"
								"XDSC\0"
								"1Video Fernbedienung\0"
								"XRQ\0"
								"Nno|Video ACC\0";

Die Kommunikation zwischen Applikation und dem no|Link-Accessory findet hauptsächlich über ACC_TEXT Messages statt.

Das Accessory versteht zur Zeit folgende Befehle, die als String mittels einer ACC_TEXT Message versendet werden müssen (<X> := <Gerät>:<Befehl>):

"S <X>"
Senden eines Befehls, z.B: "S VIDEO:PLAY".

"P <X>"
Präparieren eines Befehls, z.B: "P VIDEO:PLAY". Hierbei wird der Infrarot-Hardware der Code für diesen Befehl mitgeteilt, aber noch nicht abgeschickt.

"S"
Senden des zuletzt präparierten Befehls.

"T <X>"
Test der Existenz eines Befehls.

Insbesondere bei der Neuinstallation einer Fernsteuerungs-Applikation sollten alle Geräte und Befehle, die diese Applikation verwendet, dem Accessory mitgeteilt werden!

Wenn no|Link den mitgelieferten Befehl nicht kennt, so wird der Benutzer aufgefordert, die nötige "Lernprozedur" zu tätigen bzw. dem neuen Befehl einen schon vorhandenen zuzuweisen.

Es sollte in jeder Fernsteuerungsapplikation eine Funktion geben, die es dem Benutzer ermöglicht, alle unterstützten Befehle zu "testen" - am besten über einen "Anmelden"-Button.

Die Testfunktion ist die einzige, die u.U. eine Interaktion mit dem Benutzer führt. Alle anderen vollführen keine Ausgabe.

Als Antwort erhält die Applikation eine ACC_ACK-Message, bei der in msgbuff[3] der Erfolg der Behandlung des Befehls vermerkt ist:

1
Operation war erfolgreich

0
Gerät/Befehl ist nicht vorhanden bzw. Fehler bei der Bearbeitung

Geräte- und Befehlsnamen dürfen maximal 32 Zeichen lang sein und dürfen KEINEN ':' enthalten. Es wird nicht zwischen Groß- und Kleinschreibung unterschieden.

Eine Applikation kann vom Accessory eine Liste der eingetragenen Geräte anfordern. Hierfür muß die Applikation das neue XAcc-Request/Reply-Protokoll verstehen (siehe oben bzw. XACC.H).

Um die Liste anzufordern, wird von der Applikation ein ACC_REQUEST an das Accessory geschickt, wobei diese Nachricht folgendermaßen aufgebaut sein muß:


	msgbuff[0] = ACC_REQUEST
	msgbuff[1] = apid
	msgbuff[2] = 0
	msgbuff[3] = 0x04		/* Datentyp: Code */
	msgbuff[4] = 'D'		/* 'D' steht für "devices" */
	msgbuff[5] = 0
	msgbuff[6] = 0
	msgbuff[7] = 0

Als Antwort erhält die Applikation, wenn ein Fehler auftrat eine ACC_ACK- Message mit msgbuff[3] == 0, oder bei Erfolg eine ACC_REPLY-Message:


	msgbuff[0] = ACC_REPLY
	msgbuff[1] = apid von no|Link
	msgbuff[2] = 0
	msgbuff[3] = 0x02		/* Datentyp: Environment-String */
	msgbuff[4]+msgbuff[5] =	Pointer auf einen global zugreifbaren
							Speicher, in dem die Liste der Geräte
							in folgendem Format steht:
							"DEVICEINFOS:\0Gerät1\0Gerät2\0"
	msgbuff[6]+msgbuff[7] = long-value, der die Größe des Buffers
							angibt (inkl. der abschließenden zwei
							NULL-Bytes)

Der Empfang einer ACC_REPLY-Message muß abschließend mit einer ACC_ACK- Message bestätigt werden, damit das no|Link-Accessory seine Resourcen wieder freigeben kann!


Contents Extended XAcc XACC.H