Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A partir do Windows 8, o sistema operativo Windows inclui um driver de classe HID de sensor nativo (SensorsHIDClassDriver.dll), que suporta onze tipos de sensores que se comunicam usando o transporte HID.
Aqui está uma lista dos sensores suportados:
- Acelerômetro 3D
- Luz ambiente
- Temperatura Ambiente
- Pressão atmosférica
- Bússola 3D
- Orientação do dispositivo
- Giroscópio 3D
- Humidade
- Inclinômetro 3D
- Presença
- Proximidade
A ilustração a seguir mostra o fluxo de dados de ida e volta de dois aplicativos de sensor para baixo através da pilha de drivers e, finalmente, para o próprio hardware.
Suporte para sensores personalizados
Além dos onze sensores abordados nas listas anteriores, o driver de classe também suporta uma classe personalizada. Esta classe permite que um fabricante de sensores integre um dispositivo não encontrado na lista anterior: por exemplo, um sensor de monóxido de carbono. O sensor personalizado apresenta-se à API do sensor como um dispositivo personalizado com propriedades únicas.
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 suportado pelo driver de classe.
- O sensor envia um relatório de funcionalidade ou um relatório de entrada para o driver de classe HID. Um relatório de função é enviado em resposta a uma solicitação do controlador. Este relatório contém dados de propriedade, incluindo a configuração de sensibilidade a alterações 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 sensibilidade de alteração ou intervalo de relatório, o driver empacota esses valores em um relatório de recurso 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 suportar uma das sete categorias nativas do driver de classe, seu firmware precisará suportar recursos específicos e relatórios de entrada. Os relatórios de características incluem o estado atual de relatório de um sensor, o seu estado, a sensibilidade à mudança, e o intervalo de relatório (além de outras propriedades possíveis). Os relatórios de entrada contêm leituras do sensor: True ou False para um interruptor, valores de força G para um acelerômetro ou LUX para um sensor de luz ambiente.
Exemplo de relatório de funcionalidades do acelerómetro
O exemplo de código a seguir mostra o relatório de recurso HID para o acelerômetro. Note-se a natureza auto-descritiva deste relatório. Inclui valores mínimos e máximos e a contagem e 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. Mais uma vez, note-se a natureza auto-descritiva dos campos deste 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),