Driver de classe HID do sensor
Começando com Windows 8, o sistema operacional Windows inclui um driver de classe HID (SensorsHIDClassDriver.dll) do sensor in-box, que dá suporte a onze tipos de sensores que se comunicam usando o transporte HID.
Aqui está uma lista dos sensores com suporte:
- Acelerômetro 3D
- Luz ambiente
- Temperatura ambiente
- Pressão atmosférica
- Compass 3D
- Orientação do dispositivo
- Giroscópio 3D
- Umidade
- Inclinômetro 3D
- Presença
- Proximidade
A ilustração a seguir ilustra o fluxo de dados entre dois aplicativos de sensor na pilha do driver e, por fim, para o próprio hardware.
Suporte para sensores personalizados
Além dos onze sensores abordados nas listas anteriores, o driver de classe também dá suporte a uma classe Custom. Essa classe permite que um fabricante de sensor integre um dispositivo não encontrado na lista anterior: por exemplo, um sensor de monóxido de carbono. O sensor personalizado se apresenta à API do sensor como um dispositivo personalizado com propriedades exclusivas.
Arquitetura e visão geral
Se você estiver criando o firmware para um sensor compatível, precisará de uma compreensão básica do modelo de E/S compatível com o driver de classe.
- O sensor envia um relatório de recurso ou um relatório de entrada para o driver de classe HID. Um relatório de recursos é enviado em resposta a uma solicitação do driver. Este relatório contém dados de propriedade, incluindo a configuração de confidencialidade de alteração do sensor, seu intervalo de relatório e seu estado de relatório. Um relatório de entrada é enviado mediante solicitação ou de forma assíncrona em resposta a um evento. Este relatório contém os dados reais do sensor. Por exemplo, para um acelerômetro, o relatório contém as forças G ao longo dos eixos x, y e z).
- O driver de classe HID envia relatórios de recursos para o sensor. Por exemplo, quando o aplicativo solicita uma nova confidencialidade de alteração ou intervalo de relatório, o driver empacota esses valores em um relatório de recursos e usa esse relatório para enviar a solicitação para o firmware do sensor.
O diagrama a seguir ilustra o modelo de E/S:
Descritor de relatório de exemplo
Se o sensor der suporte a uma das sete categorias nativas do driver de classe, seu firmware precisará dar suporte a relatórios de entrada e recursos específicos. Os relatórios de recursos incluem o estado de relatório atual de um sensor, sua status, sensibilidade de alteração e intervalo de relatório (além de outras propriedades possíveis). Os relatórios de entrada contêm leituras de sensor: True ou False para um comutador, valores de força G para um acelerômetro ou LUX para um sensor de luz ambiente.
Relatório de recursos do acelerômetro de exemplo
O exemplo de código a seguir mostra o relatório de recursos HID para o acelerômetro. Observe a natureza auto-descritiva deste relatório. Ele inclui valores mínimos e máximos e a contagem e o tamanho de campos individuais.
//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),
Exemplo de relatório de entrada do acelerômetro
O exemplo de código a seguir mostra o relatório de entrada HID para o mesmo dispositivo. Novamente, observe a natureza auto-descritiva dos campos neste relatório.
//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),