Endlich, etwa 20 Jahre nach Einführung von
HID gibt es Bewegung
bei der Standardisierung von Usage Tables für Sensoren.
Sowie ab Windows 7 ein Anzeigeprogramm dafür.
Aber letztlich ist das beim Betrachten von PnPSA
ein satter Reinfall!
Immerhin, SensorDoagnosticTool.exe aus dem Windows SDK funktioniert.
Theoretisch ab Windows 7, hier unter Windows 10-64.
Aber nur, wenn man in den Systemeinstellungen
den Zugriff auf die Geo-Position erlaubt!
Mithin eine Privatsphäre an alle Programme freigibt, die Hosen runterlässt.
Sonst erscheint nichts, kein Fenster, das Programm stürzt sang- und klanglos ab.
Den Mikrocontroller STM32F103 habe ich mit mit dem HID-Deskriptor von
jener Webseite
gefüttert und diesen erst mal aufs nötigste geschrumpft.
Das ergibt schließlich einen HID-Reportdeskriptor von ca. 120 Byte Länge,
nicht rund 300 Byte von der Vorlage.
Wohlgemerkt, für eine einzige Messgröße!
Bei der Festlegung des HID-Sensor-Standards hat man
ganz offensichtlich nicht die HID-Dokumentation gelesen!
Denn so viel Unfug hätte man sonst nicht festnageln können.
Aber erst mal die positiven Seiten:
Es gibt einen Standard, und es gibt (mindestens)
ein Programm zur Darstellung von Messwerten.
(Das obige SensorDiagnosticTool kann keine Zeitverlaufsgrafik darstellen.)
Die Abtastrate kann im sinnvoll erscheinenden Bereich von 1...1000 ms
eingestellt werden.
Eine Angabe der (absoluten) Genauigkeit ist vorgesehen.
Diese kann sogar pro Messwert mitgegeben werden.
Sinnvoll, denn viele Sensoren haben in der Nähe ihrer Grenzen
abnehmende Genauigkeiten, haben nur relative Genauigkeiten,
oder die Genauigkeit hängt vom Messbereich ab, bspw. beim Ohmmeter.
Aber das war's auch schon! Was mit nicht ausgelesenen Abtastwerten passiert?
In die Tonne. Kein Puffern.
Kein HDA.
Nun, zu den ganzen Schattenseiten:
An Abtastraten über 1 kSa/s hat wohl niemand gedacht.
Dadurch kann man gerade mal langsame Vorgänge aufzeichnen,
mit Vorliebe Temperatur und Geo-Position in heute üblicher Genauigkeit.
(Man bedenke, dass Differential-GPS im Mikrometerbereich messen kann!)
Auch an eine gegenseitige Synchronisation hat man nicht gedacht.
Braucht man bei Abtastraten weit unter 1 kSa/s auch nicht.
Immerhin kann man mit der Zeit-Usage einen Zeitstempel generieren,
wenn der Mikrocontroller eine Echtzeituhr hat.
Noch gruseliger ist das, was man mit den Möglichkeiten des Report-Deskriptors
nicht angestellt hat:
Keine implizite Umrechnung eines Zahlenwertes, wie er bspw. vom
A/D-Wandler kommt,
durch das Anzeigeprogramm: Dafür stehen die Angaben:
Logical Minimum + Logical Maximum sowie
Physical Minimum + Physical Maximum
zur Verfügung, mit dem das Anzeigeprogramm:
dem Mikrocontroller die Umrechnung erspart,
der dafür mindestens eine schlau gemachte Multplikation ausführen muss,
die Auflösung ermitteln kann (und damit die Anzahl von Kommastellen) und
den Messbereich kennt.
Für Auflösung und Messbereich müssen nach diesem HID-Sensor-Standard
nun aufwändige Feature-Reportdeskriporen
und ein mit Konstanten gefüllter Feature-Report herhalten.
Keine Auswertung der Angaben Unit und String Index,
um bei anderen als den vorgesehenen Messgrößen einen Titel-Text
und eine Einheit anzugeben.
Anders als zu erwarten werden die sich gegenseitig ausschließenden
Optionen, bspw. für die Lage des Sensors:
HID_USAGE_SENSOR_PROPERTY_CONNECTION_TYPE_PC_INTEGRATED_SEL = Im Computer,
als Bitarray erwartet, von dem genau 1 Bit aktiviert sein muss.
Ich hab's ausprobiert, zumindest SensorDisgnosticTool funktioniert nur so.
Die Beispiele, die man in hid-sensor-usages.docx
(wirklich .docx, igitt!) findet,
machen keinen Gebrauch davon, numerisch aufeinanderfolgende Usages
durch Usage Minimum und Usage Maximum zu ersetzen.
Aber immerhin gibt es hier erstmals eine Anleitung,
wozu es Collection(Logical) gibt und wie man es anwendet.
Arrays aus Messwerten sind der Schlüssel zu höheren Abtastraten unter HID.
Diese Möglichkeit besteht, ist aber nirgends erwähnt und dürfte auch nicht funktionieren.
Ohne die Angabe des Ready-Bits im Input-Report wird nichts verarbeitet.
Man braucht also im Input-Report mindestens ein freies, auf 1 gesetztes Bit
neben dem Messwert.
Einige geläufige Messgrößen sind nicht vorgesehen.
So bleibt unklar, wie man das Drehmoment etwa eines selbstgemachten
Drehmomentenschlüssels
anzeigen soll.
Nun muss noch geprüft werden, ob andere Software in der Lage ist,
HID-Reportdeskriptoren vollumfänglich auszuwerten,
um dann wenigstens erwartungsgemäß zu funktionieren.
Ansonsten bleibt immer noch das WebUSB-Interface als Ausweg.