Freigeben über


Sensor HID-Klassentreiber

Ab Windows 8 enthält das Windows-Betriebssystem einen eingebauten HID-Klassentreiber (SensorsHIDClassDriver.dll), der elf Sensortypen unterstützt, die über den HID-Transport kommunizieren.

Hier ist eine Liste der unterstützten Sensoren:

  • Beschleunigungsmesser 3D
  • Umgebungslicht
  • Umgebungstemperatur
  • Luftdruck
  • Kompass 3D
  • Ausrichtung des Geräts
  • Gyroskop 3D
  • Feuchtigkeit
  • Neigungsmesser 3D
  • Anwesenheit
  • Nähe

Die folgende Abbildung zeigt den Datenfluss von zwei Sensoranwendungen über den Treiberstapel nach unten und schließlich an die Hardware selbst.

Client-Sensor-Architektur.

Unterstützung für benutzerdefinierte Sensoren

Zusätzlich zu den elf Sensoren, die in den vorherigen Listen behandelt werden, unterstützt der Klassentreiber auch eine benutzerdefinierte Klasse. Diese Klasse ermöglicht es einem Sensorhersteller, ein Gerät zu integrieren, das in der vorherigen Liste nicht gefunden wurde: z. B. ein Kohlenmonoxidsensor. Der benutzerdefinierte Sensor stellt sich der Sensor-API als benutzerdefiniertes Gerät mit eindeutigen Eigenschaften vor.

Architektur und Übersicht

Wenn Sie die Firmware für einen kompatiblen Sensor erstellen, benötigen Sie ein grundlegendes Verständnis des vom Klassentreiber unterstützten E/A-Modells.

  • Der Sensor sendet entweder einen Featurebericht oder einen Eingabebericht an den HID-Klassen-Treiber aus. Ein Featurebericht wird als Antwort auf eine Anforderung des Treibers gesendet. Dieser Bericht enthält Eigenschaftsdaten, einschließlich der Änderungsempfindlichkeitseinstellung des Sensors, des Berichtsintervalls und des Berichtszustands. Ein Eingabebericht wird entweder auf Anforderung oder asynchron als Reaktion auf ein Ereignis gesendet. Dieser Bericht enthält die tatsächlichen Sensordaten. Beispielsweise enthält der Bericht für einen Beschleunigungsmesser die G-Kräfte entlang der X-, Y- und Z-Achse).
  • Der HID-Klassentreiber sendet Funktionsberichte an den Sensor. Wenn die Anwendung beispielsweise ein neues Änderungsempfindlichkeits- oder Berichtsintervall anfordert, packt der Treiber diese Werte in einen Featurebericht und verwendet diesen Bericht, um die Anforderung an die Firmware des Sensors zu senden.

Das folgende Diagramm veranschaulicht das E/A-Modell:

I/o-Modell.

Beispielberichtdeskriptor

Wenn Ihr Sensor eine der sieben Kategorien unterstützt, die für den Klassentreiber nativ sind, muss die Firmware bestimmte Feature- und Eingabeberichte unterstützen. Zu den Featureberichten gehören der aktuelle Berichtsstatus eines Sensors, dessen Status, die Änderungsempfindlichkeit und das Berichtsintervall (zusätzlich zu anderen möglichen Eigenschaften). Die Eingabeberichte enthalten Sensorwerte: True oder False für einen Schalter, G-Force-Werte für einen Beschleunigungsmesser oder LUX für einen Umgebungslichtsensor.

Beispielbericht zum Merkmal des Beschleunigungsmessers

Das folgende Codebeispiel zeigt den HID-Featurebericht für den Beschleunigungsmesser. Beachten Sie die selbstdeskriptive Natur dieses Berichts. Sie enthält Mindest- und Maximalwerte sowie die Anzahl und Größe einzelner Felder.

//feature reports (xmit/receive)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_8(0xFF),             //LOGICAL_MAXIMUM (255) 
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_FEATURE(Data_Var_Abs),

    HID_USAGE_SENSOR_PROPERTY_SENSOR_STATUS,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_8(0xFF),             //LOGICAL_MAXIMUM (255) 
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_FEATURE(Data_Var_Abs),

    HID_USAGE_SENSOR_PROPERTY_CHANGE_SENSITIVITY_ABS,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_16(0xFF,0xFF), //LOGICAL_MAXIMUM (65535) 
    HID_REPORT_SIZE(16),
    HID_REPORT_COUNT(1),
    HID_USAGE_SENSOR_UNITS_G,
    HID_UNIT_EXPONENT(0xE), 
    HID_FEATURE(Data_Var_Abs),

    HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_32(0xFF,0xFF,0xFF,0xFF), //LOGICAL_MAXIMUM (4294967295) 
    HID_REPORT_SIZE(32),
    HID_REPORT_COUNT(1),
    HID_USAGE_SENSOR_UNITS_MILLISECOND,
    HID_UNIT_EXPONENT(0), 
    HID_FEATURE(Data_Var_Abs),

Beispiel für einen Beschleunigungsmesser-Eingabebericht

Das folgende Codebeispiel zeigt den HID-Eingabebericht für dasselbe Gerät. Beachten Sie auch hier die selbstdeskriptive Natur der Felder in diesem Bericht.

//input reports (transmit)
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_STATE,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_8(0xFF),             //LOGICAL_MAXIMUM (255) 
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),

    HID_USAGE_SENSOR_EVENT,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_8(0xFF),             //LOGICAL_MAXIMUM (255) 
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_X_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80),             //    LOGICAL_MINIMUM (-32767) 
    HID_LOGICAL_MAX_16(0xFF,0x7F),             //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16), 
    HID_REPORT_COUNT(1), 
    HID_USAGE_SENSOR_UNITS_G,
    HID_UNIT_EXPONENT(0xE), 
    HID_INPUT(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Y_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80),             //    LOGICAL_MINIMUM (-32767) 
    HID_LOGICAL_MAX_16(0xFF,0x7F),             //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16), 
    HID_REPORT_COUNT(1), 
    HID_USAGE_SENSOR_UNITS_G,
    HID_UNIT_EXPONENT(0xE), 
    HID_INPUT(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA_MOTION_ACCELERATION_Z_AXIS,
    HID_LOGICAL_MIN_16(0x01,0x80),             //    LOGICAL_MINIMUM (-32767) 
    HID_LOGICAL_MAX_16(0xFF,0x7F),             //    LOGICAL_MAXIMUM (32767)
    HID_REPORT_SIZE(16), 
    HID_REPORT_COUNT(3), 
    HID_USAGE_SENSOR_UNITS_G,
    HID_UNIT_EXPONENT(0xE), 
    HID_INPUT(Data_Var_Abs),

    HID_USAGE_SENSOR_DATA_MOTION_INTENSITY,
    HID_LOGICAL_MIN_8(0x00),                   //LOGICAL_MINIMUM (0) 
    HID_LOGICAL_MAX_8(0xFF),             //LOGICAL_MAXIMUM (255) 
    HID_REPORT_SIZE(8),
    HID_REPORT_COUNT(1),
    HID_INPUT(Data_Var_Abs),