Драйвер класса HID датчика
Начиная с Windows 8 операционная система Windows включает встроенный драйвер hid-класса датчика (SensorsHIDClassDriver.dll), который поддерживает одиннадцать типов датчиков, взаимодействующих с помощью транспорта HID.
Ниже приведен список поддерживаемых датчиков.
- Акселерометр 3D
- Внешнее освещение
- Температура окружающей среды
- Атмосферное давление
- Компас 3D
- Ориентация устройства
- Гироскоп 3D
- влажность.
- Инклинометр 3D
- Присутствие
- Близость
На следующем рисунке показан поток данных из двух приложений датчиков вниз по стеку драйверов и, наконец, к самому оборудованию.
Поддержка пользовательских датчиков
Помимо одиннадцати датчиков, описанных в предыдущих списках, драйвер класса также поддерживает пользовательский класс. Этот класс позволяет производителю датчика интегрировать устройство, не найденное в предыдущем списке, например датчик угарного газа. Пользовательский датчик представляет себя в API датчика как пользовательское устройство с уникальными свойствами.
Архитектура и обзор
Если вы создаете встроенное ПО для совместимого датчика, вам потребуется базовое представление о модели ввода-вывода, поддерживаемой драйвером класса.
- Датчик отправляет отчет о функциях или входной отчет в драйвер класса HID. Отчет о функциях отправляется в ответ на запрос от драйвера. Этот отчет содержит данные свойств, включая настройку чувствительности датчика к изменениям, интервал отчета и состояние отчета. Входной отчет отправляется по запросу или асинхронно в ответ на событие. Этот отчет содержит фактические данные датчика. Например, для акселерометра отчет содержит G-силы вдоль осей x, y и z).
- Драйвер класса HID отправляет датчику отчеты о функциях. Например, когда приложение запрашивает новую чувствительность к изменению или интервал отчета, драйвер упаковывает эти значения в отчет о функциях и использует этот отчет для отправки запроса встроенному ПО датчика.
На следующей схеме показана модель ввода-вывода.
Пример дескриптора отчета
Если датчик поддерживает одну из семи категорий, встроенных в драйвер класса, его встроенное ПО потребует поддержки определенных функций и входных отчетов. Отчеты о функциях включают текущее состояние отчетов датчика, его состояние, чувствительность к изменениям и интервал отчетности (в дополнение к другим возможным свойствам). Входные отчеты содержат показания датчика: True или False для переключателя, значения силы G для акселерометра или LUX для датчика внешнего освещения.
Пример отчета о функциях акселерометра
В следующем примере кода показан отчет о функциях HID для акселерометра. Обратите внимание на самоописывающий характер этого отчета. Он включает минимальное и максимальное значения, а также количество и размер отдельных полей.
//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),
Пример входного отчета акселерометра
В следующем примере кода показан входной отчет HID для того же устройства. Опять же, обратите внимание на самоописательный характер полей в этом отчете.
//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),