Compartir a través de


Controlador de clase HID del sensor

A partir de Windows 8, el sistema operativo Windows incluye un controlador HID Class (SensorsHIDClassDriver.dll) del sensor incorporado, 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
  • Inclinometer 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.

arquitectura del sensor de cliente.

Compatibilidad con sensores personalizados

Además de los once sensores tratados en las listas anteriores, el controlador de clase también admite una clase Custom. Esta clase permite a un fabricante de sensores integrar 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, como la configuración de sensibilidad a cambios 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-).
  • El controlador de clase HID envía informes de características al sensor. Por ejemplo, cuando la aplicación solicita un nuevo intervalo de confidencialidad o informe de cambio, el controlador empaqueta estos valores en un informe de características y usa este informe para enviar la solicitud al firmware del sensor.

En el diagrama siguiente se muestra el modelo de E/S:

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 informes de características incluyen el estado actual de los informes de un sensor, su estado, la confidencialidad del cambio y el intervalo de informes (además de otras propiedades posibles). Los informes de entrada contienen lecturas de sensor: True o False para un conmutador, valores G-force 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),

Informe de entrada de acelerómetro de ejemplo

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 autodescriptiva 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),