Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de Windows 8, el sistema operativo Windows incluye un controlador de clase HID de sensor incorporado (SensorsHIDClassDriver.dll), que admite once tipos de sensores que se comunican mediante el transporte HID.
Esta es una lista de los sensores admitidos:
- Acelerómetro 3D
- Luz ambiente
- Temperatura ambiente
- Presión atmosférica
- Brújula 3D
- Orientación del dispositivo
- Giroscopio 3D
- Humedad
- Inclinómetro 3D
- Presencia
- Proximidad
En la ilustración siguiente se muestra el flujo de datos desde dos aplicaciones de sensor hasta la pila de controladores y, por último, hasta el propio hardware.
Compatibilidad con sensores personalizados
Además de los once sensores cubiertos en las listas anteriores, el controlador de clase también admite una clase personalizada. Esta clase permite que un fabricante de sensores integre un dispositivo que no se encuentra en la lista anterior: por ejemplo, un sensor de monóxido de carbono. El sensor personalizado se presenta a la API del sensor como un dispositivo personalizado con propiedades únicas.
Información general y arquitectura
Si va a crear el firmware para un sensor compatible, necesitará un conocimiento básico del modelo de E/S compatible con el controlador de clase.
- El sensor envía un informe de características o un informe de entrada al controlador de clase HID. Se envía un informe de características en respuesta a una solicitud del controlador. Este informe contiene datos de propiedad, incluyendo la configuración de sensibilidad al cambio del sensor, su intervalo de informe y su estado de informe. Un informe de entrada se envía a petición o de forma asincrónica en respuesta a un evento. Este informe contiene los datos reales del sensor. Por ejemplo, para un acelerómetro, el informe contiene las fuerzas G a lo largo de los ejes x, y y z).
- El controlador de clase HID envía informes de características al sensor. Por ejemplo, cuando la aplicación solicita una nueva sensibilidad al cambio o intervalo de notificación, el controlador empaqueta estos valores en un informe de características y utiliza este informe para enviar la solicitud al firmware del sensor.
En el diagrama siguiente se muestra el modelo de E/S:
Descriptor de informe de ejemplo
Si el sensor admite una de las siete categorías nativas del controlador de clase, su firmware deberá admitir informes de entrada y características específicos. Los reportes de características incluyen el estado de reporte de un sensor, su estado, la sensibilidad al cambio y el intervalo de reporte (además de otras propiedades posibles). Los informes de entrada contienen lecturas del sensor: True o False para un conmutador, valores de fuerza G para un acelerómetro o LUX para un sensor de luz ambiente.
Informe de características de acelerómetro de ejemplo
En el ejemplo de código siguiente se muestra el informe de características HID para el acelerómetro. Tenga en cuenta la naturaleza autoscriptiva de este informe. Incluye valores mínimos y máximos y el recuento y el tamaño de los campos individuales.
//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),
Ejemplo de informe de entrada de acelerómetro
En el ejemplo de código siguiente se muestra el informe de entrada HID para el mismo dispositivo. De nuevo, tenga en cuenta la naturaleza autoscriptiva de los campos de este informe.
//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),