Поделиться через


Драйвер класса 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),