AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

HID Gerät ansprechen.

Ein Thema von edanis · begonnen am 22. Jul 2007 · letzter Beitrag vom 24. Jul 2007
Antwort Antwort
edanis

Registriert seit: 22. Jul 2007
Ort: Witten
2 Beiträge
 
#1

HID Gerät ansprechen.

  Alt 22. Jul 2007, 21:11
Hallo

bevor das eine Frage an Robert Marquardt wird, kann mir die bestimmt (oder vielleicht) jemand anderes beantworten

Ich habe hier ein HID Gerät (Eine Art des Digitizerstift), für den mir das UsagesDemo Program folgende Infoausgabe produziert:

Delphi-Quellcode:
"Pegasus Technologies Ltd." "NoteTaker FW Ver 2.05" VID=$0E20

PID=$0100
Input Report Size=8
Output Report Size=8
Feature Report Size=0

Button Output
=============

0)
UsagePage: FFA0 ($FFA0)
ReportID: 0
IsAlias: False
BitField: 8
LinkCollection: 0
LinkUsage: 1 ($0001)
LinkUsagePage: FFA0 ($FFA0)
IsRange: False
IsStringRange: False
IsDesignatorRange: False
IsAbsolute: True
Usage: 3 ($0003)
StringIndex: 0
DesignatorIndex: 0
DataIndex: 0

Value Input
===========

0)
UsagePage: FFA0 ($FFA0)
ReportID: 0
IsAlias: False
BitField: 2
LinkCollection: 0
LinkUsage: 1 ($0001)
LinkUsagePage: FFA0 ($FFA0)
IsRange: False
IsStringRange: False
IsDesignatorRange: False
IsAbsolute: True
HasNull: False
BitSize: 8
ReportCount: 8
UnitsExp: 0
Units: 0
LogicalMin: -128
LogicalMax: 127
PhysicalMin: 0
PhysicalMax: -1
Usage: 2 ($0002)
StringIndex: 0
DesignatorIndex: 0
DataIndex: 0
Alle drei Tools (CollectionDemo, SimpleHIDWrite, UsagesDemo) erkennen es.

Und eine Frage, die ich zuerst stellen möchte.

Was muss ich alles erst lesen müssen (Ausser des Forums, der aber schon etwas groß geworden ist) um diese ausgabe überhaupt erst verstehen zu können und das Gerät durch die HID-Komponente richtig ansprechen (bzw. auslesen) zu können. Mein Vorhaben: Ich möchte die Koordinaten, die der Stift an die Basisisstation sendet in Mauszeigerkoordinatn umsetzen.

Wie ich die Maus steuere, müsste ich noch kennen, mit HID kenne ich mich aber noch nicht aus.

Vielen dank
Edward

PS Die Tools sind vom Raketenwerfer-Thread, der zum Lesen und nachmachen schon interessant ist.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: HID Gerät ansprechen.

  Alt 23. Jul 2007, 06:08
Der Startplatz ist hier http://www.usb.org/developers/hidpage Tip USBCV nicht installieren! Das ist ein Developer-Tool und Beta. Das kann in eine Windows-Neuinstallation ausarten.

Mit HID-Geraeten tauscht man Reports aus. Das sind vom Deskriptor genau beschriebene Records. In diesem Fall kann man 8 Bytes plus ReportID lesen und ebenfalls 8 Bytes plus ReportID schreiben. Beides sind (immer) verschiedene Record-Typen. Den dritten Typ Feature-Report gibt es hier nicht.

Im Output-Report ist nur genau ein Button deklariert. Er besteht nicht aus einem Bit, sondern aus einem Byte mit dem Wert 3. Damit ist der Report offensichtlich fehlerhaft deklariert. Die Deklarationen sollten die vorhandenen 8 Bytes ausfuellen.

Der Input-Report ist als Array von 8 vorzeichenbehafteten Bytes (BitSize, ReportCount) beschrieben. Die Report-Beschreibung ist erneut leicht fehlerhaft. Erstens sollte man das nicht vorzeichenbehaftet deklarieren und zweitens besagt PhysicalMin und PhysicalMax das nur 0 und -1 in den Bytes stehen. Da kann man aber sicher sein das andere Werte kommen.

Dieses Geraet hat also einen Deskriptor der so gerade akzeptabel ist. Was man vom Geraet lesen kann ist nicht genau deklariert. Man muss also experimentieren.
Man darf an das Geraet einen Report mit ReportID 0 und den Daten 03 00 00 00 00 00 00 00 oder 00 00 00 00 00 00 00 00 schreiben. Das duerfte Ein- bzw. Ausschalten sein.
  Mit Zitat antworten Zitat
edanis

Registriert seit: 22. Jul 2007
Ort: Witten
2 Beiträge
 
#3

Re: HID Gerät ansprechen.

  Alt 23. Jul 2007, 20:59
Hallo Robert

Danke für die schnelle Antwort.

Zitat:
Dieses Geraet hat also einen Deskriptor der so gerade akzeptabel ist.
Über die Qualität der Programmierung, im Sinne ob man was mit dem Stift anfangen kann, wollte ich noch im ersten Beitrag fragen (daher vor allem das UsagesDemo zitiert) dann dachte ich, lieber verstehe ich lieber selbst was von der Sache, erst dann programmmiere ich was dazu. Danke also auch für die Antwort.

Das Gerät ist dieses Digitaler Notizblock

Eine Ein/ausschaltvorrichtung habe ich weder am Gerät noch am Software finden können, auch keine LEDS oder Tongeber. Dass es überhaupt etwas an ihn geschickt werden kann/muss, hat mich schwer gewundert. Soll nicht heißen, dass es nichts empfängt. Aber egal was ich an die Basisstation sende, ob mit SetReport oder Write, ändert das nichts am Verhalten, bei SetReport bekomme ich SET REPORT ERROR: Der Vorgang wurde erfolgreich beendet (0) in die Listbox geschrieben, bei Write je nach Werten WR 00 03 00 00 00 00 00 00 00 oder WR 00 00 00 00 00 00 00 00 00.

Und egal was ich und wie oft mit Write oder SetReport gesendet habe (so genau darf ich es nicht sagen, ich habe nicht alles ausprobiert), sobald ich den Stift aufsetze und bis ich den abhebe, wird die Listbox mit Einträgen überflütet. Wenn ich nicht nur Zeichne sondern am selben Punkt aufsetze und abhebe, wiederholen sich einige Zahlen. Koordinatenangaben erkenne ich dabei zwar so nicht, aber ich vermute, ich muss die Werte in binäre übersetzen um andere Bitlängen als 64 bzw 8 Bit zu finden: An jeder Stelle des Papiers kann es mal viel mal wenig nullen geben.

Der Auszug der Werte beim Aufsetzen un abheben in der rechten unteren Papiercke:

Delphi-Quellcode:
...
RD 00 80 B3 00 00 00 00 00 00
RD 00 F6 66 43 1D 1A 40 75 68
RD 00 47 14 3D 50 1A 00 00 00
RD 00 80 5B 44 0D 0A 40 7F 5B
RD 00 05 0A 3F 00 00 00 00 00
RD 00 80 B3 00 00 00 00 00 00
RD 00 94 71 06 2A 12 3F 13 16
RD 00 04 1D 3B 70 1D D5 06 05
RD 00 23 00 3F 53 2B 04 18 3B
RD 00 30 32 D5 09 04 1C 0C 40
RD 00 53 70 07 15 3C 30 30 00
RD 00 80 B3 00 00 00 00 00 00
RD 00 F1 55 44 0C 0A 40 70 3A
RD 00 44 0A 40 00 00 00 00 00
RD 00 90 64 45 22 02 3F 0F 0B
RD 00 44 17 3C 6C 10 D5 06 03
RD 00 1C 08 3F 53 6F 07 15 3C
RD 00 30 31 00 00 00 00 00 00
RD 00 80 B3 00 00 00 00 00 00
Die letzte Zeile entsteht beim Abheben; Zahlen ändern sich je nachdem wo ich das mit dem Stift tue.

Aber ich denke, bevor ich die Jagt auf nullen und einsen eröffne, sollte ich lieber mit HID, DDK und vor allem Deinen HID Komponenten beschäftigt haben. Ich weiß zum Beispiel nicht, wie Du aus dem Bericht auf 03 00 00 00 00 00 00 00 oder 00 00 00 00 00 00 00 00 kommst.

Besten Dank deshalb für den Link!

Grüsse,
Edward
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: HID Gerät ansprechen.

  Alt 24. Jul 2007, 06:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz