Pilote de classe HID du capteur
À compter de Windows 8, le système d’exploitation Windows comprend un pilote hid (SensorsHIDClassDriver.dll) du capteur intégré, qui prend en charge onze types de capteurs qui communiquent à l’aide du transport HID.
Voici la liste des capteurs pris en charge :
- Accéléromètre 3D
- Lumière ambiante
- Température ambiante
- Pression atmosphérique
- Boussole 3D
- Orientation de l’appareil
- Gyroscope 3D
- Humidité
- Inclinomètre 3D
- Présence
- Proximité
L’illustration suivante illustre le flux de données de deux applications de capteur vers le bas à travers la pile de pilotes et, enfin, vers le matériel lui-même.
Prise en charge des capteurs personnalisés
En plus des onze capteurs couverts dans les listes précédentes, le pilote de classe prend également en charge une classe Custom. Cette classe permet à un fabricant de capteurs d’intégrer un appareil introuvable dans la liste précédente : par exemple, un capteur de monoxyde de carbone. Le capteur personnalisé se présente à l’API du capteur en tant qu’appareil personnalisé avec des propriétés uniques.
Architecture et vue d’ensemble
Si vous créez le microprogramme d’un capteur compatible, vous aurez besoin d’une compréhension de base du modèle d’E/S pris en charge par le pilote de classe.
- Le capteur envoie un rapport de fonctionnalité ou un rapport d’entrée au pilote de classe HID. Un rapport de fonctionnalité est envoyé en réponse à une demande du pilote. Ce rapport contient des données de propriété, notamment le paramètre de sensibilité aux modifications du capteur, son intervalle de rapport et son état de création de rapports. Un rapport d’entrée est envoyé sur demande ou de manière asynchrone en réponse à un événement. Ce rapport contient les données réelles du capteur. Par exemple, pour un accéléromètre, le rapport contient les forces G le long des axes x, y et z).
- Le pilote de classe HID envoie des rapports de fonctionnalités au capteur. Par exemple, lorsque l’application demande une nouvelle sensibilité aux modifications ou un nouvel intervalle de rapport, le pilote empaquette ces valeurs dans un rapport de fonctionnalités et utilise ce rapport pour envoyer la demande au microprogramme du capteur.
Le diagramme suivant illustre le modèle d’E/S :
Exemple de descripteur de rapport
Si votre capteur prend en charge l’une des sept catégories natives du pilote de classe, son microprogramme doit prendre en charge des rapports d’entrée et de fonctionnalités spécifiques. Les rapports de fonctionnalités incluent l’état actuel du rapport d’un capteur, son status, la sensibilité aux modifications et l’intervalle de création de rapports (en plus d’autres propriétés possibles). Les rapports d’entrée contiennent des lectures de capteur : True ou False pour un commutateur, valeurs G-force pour un accéléromètre ou LUX pour un capteur de lumière ambiante.
Exemple de rapport sur les fonctionnalités de l’accéléromètre
L’exemple de code suivant montre le rapport de fonctionnalité HID pour l’accéléromètre. Notez la nature auto-descriptive de ce rapport. Il inclut les valeurs minimales et maximales, ainsi que le nombre et la taille des champs individuels.
//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),
Exemple de rapport d’entrée accéléromètre
L’exemple de code suivant montre le rapport d’entrée HID pour le même appareil. Là encore, notez la nature auto-descriptive des champs de ce rapport.
//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),