Sensor HID-Klassentreiber

Ab Windows 8 enthält das Windows-Betriebssystem einen im Lieferumfang enthaltenen Sensor HID Class Driver (SensorsHIDClassDriver.dll), der elf Arten von Sensoren unterstützt, die über den HID-Transport kommunizieren.

Hier finden Sie eine Liste der unterstützten Sensoren:

  • Beschleunigungsmesser 3D
  • Umgebungslicht
  • Umgebungstemperatur
  • Luftdruck
  • Kompass 3D
  • Geräteausrichtung
  • Gyroskop 3D
  • Luftfeuchtigkeit
  • Neigungsmesser 3D
  • Anwesenheit
  • Nähe

Die folgende Abbildung zeigt den Datenfluss von zwei Sensoranwendungen nach unten durch den Treiberstapel und schließlich zur Hardware selbst.

Clientsensorarchitektur.

Unterstützung für benutzerdefinierte Sensoren

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

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-Klassentreiber. Als Antwort auf eine Anforderung des Treibers wird ein Featurebericht gesendet. Dieser Bericht enthält Eigenschaftendaten, einschließlich der Änderungsempfindlichkeitseinstellung des Sensors, des Berichtsintervalls und des Berichtsstatus. Ein Eingabebericht wird entweder auf Anforderung oder asynchron als Reaktion auf ein Ereignis gesendet. Dieser Bericht enthält die tatsächlichen Sensordaten. Für einen Beschleunigungsmesser enthält der Bericht beispielsweise die G-Kräfte entlang der x-, y- und z-Achse).
  • Der HID-Klassentreiber sendet Featureberichte 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:

E/A-Modell.

Beispielmeldedeskriptoren

Wenn Ihr Sensor eine der sieben Kategorien unterstützt, die für den Klassentreiber nativ sind, muss seine Firmware bestimmte Features und Eingabeberichte unterstützen. Die Featureberichte umfassen den aktuellen 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 zu Beschleunigungsmesserfeatures

Das folgende Codebeispiel zeigt den HID-Featurebericht für den Beschleunigungsmesser. Beachten Sie die selbstdeskriptive Natur dieses Berichts. Sie enthält Mindest- und Höchstwerte 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),

Beispielbericht zur Beschleunigungsmessereingabe

Das folgende Codebeispiel zeigt den HID-Eingabebericht für dasselbe Gerät. Beachten Sie erneut 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),