WR 00 03 00 00 00 00 00 00 00 oder WR 00 00 00 00 00 00 00 00 00 bedeutet das erfolgreich geschrieben wurde.
Es gibt drei Typen von HID-Reports: Input, Output und Feature. Feature-Reports sind zur Konfiguration des Geraetes gedacht und koennen mit zwei HID-
API-Funktionen gelesen bzw. geschrieben werden. Feature Report Size=0 sagt das dieses Geraet keine Feature-Reports versteht. Die
API-Funktionen dazu werden immer scheitern.
Input-Reports kann man nur lesen und Output-Reports nur schreiben.
Die Ausgabe von UsagesDemo fasst alle Angaben zu den Output-Reports unter Ueberschriften mit "Output" im Namen zusammen. Die Bestandteile der Reports sind hierarchisch angeordnet. CollectionDemo zeigt dazu die Baumstruktur. In diesem Fall haben wir nur genau ein Element in einem Output Report Size=8 Byte grossen Report. Die ReportID kommt dann immer noch dazu. In diesem Fall ReportID: 0 gibt es nur genau einen Output-Report und er muss die ReportID 0 haben. Gibt es mehrere moegliche Reports, so sagt die ReportID an in welchem Report das Element enthalten ist.
Elemente eines Reports werden Usage genannt. Der Output-Report kann genau eine Usage vom Typ Button enthalten. Der Button ist hier wie bei einer Tastatur als Byte (BitField: 8) mit dem Usage-Wert Usage: 3 ($0003) enthalten. Es kann also nur ein Report entweder mit $03 im ersten Byte oder ohne gesendet werden. Usages sind innerhalb von UsagePages definiert. Fuer eine Menge UsagePages sind die Werte mit Definitionen versehen. Man koennte dann genau angeben welche Bedeutung ein Element hat. HidUsage.pas enthaelt nichts anderes als eine Menge von Konstanten mit den Namen.
Wie bereits erklaert ist der Output-Report zu lang. Da er nur ein Byte Inhalt definiert, sollte er auch nur ein Byte lang sein. Da war wohl jemand nicht geschickt genug unterschiedliche Reportlaengen im Microcontroller zu behandeln (beim Office-Raketenwerfer kann man sehen das ein Deskriptor fuer eine Tastatur umgearbeitet wurde).
Der Input-Report ist ebenso einfach. "Value" bedeutet das die Elemente Werte sind. BitSize: 8 und ReportCount: 8 besagt das es ein Wert ist, der aus einem Array von 8 Elementen mit je 8 Bits besteht. LogicalMin: -128 und LogicalMax: 127 geben den erlaubten Wertebereich jedes Array-Elementes an. Es sind also vorzeichenbehaftete Werte. Das ist eine weitere Nachlaessigkeit, denn vermutlich sind Bytes mit Wertebereich 0..255 gemeint. PhysicalMin: 0 und PhysicalMax: -1 geben an welche Werte wirklich in den Bytes sind. Die Abbildung auf den Bereich LogicalMin..LogiclaMax geschieht per
API-Funktion beim Extrahieren aus dem Report. Es ist klar das diese Angaben hier ebenfalls Murks sind. Die Extraktion per
API-Funktionen geht also schief. Das macht aber nichts, da man ja den Report auch selbst zerlegen kann. Die Deklaration als Array bedeutet das der Entwickler hier versucht die wahre Struktur zu verbergen.