從 Windows 8 開始,Windows 作業系統包含內建感測器 HID 類別驅動程式 (SensorsHIDClassDriver.dll) ,支援使用 HID 傳輸進行通訊的 11 種感測器類型。
以下是支援的感測器清單:
- 加速度計 3D
- 環境光
- 環境溫度
- 大氣壓力
- 指南針 3D
- 裝置方向
- 陀螺儀 3D
- 溼度
- 測斜儀 3D
- 存在
- 鄰近
下圖描述從兩個感測器應用程式來回的資料流程,向下穿過驅動程式堆疊,最後到硬體本身。
支援自定義感測器
除了先前清單中涵蓋的11個感測器之外,類別驅動程式也支援Custom類別。 這個類別可讓感測器製造商整合先前清單中找不到的裝置:例如,一氧化碳感測器。 自定義感測器會將自己呈現給感測器 API 作為具有唯一屬性的自定義裝置。
架構和概觀
如果您要建立相容感測器的韌體,您需要對類別驅動程式所支援的 I/O 模型有基本瞭解。
- 感測器會將功能報告或輸入報告傳送至 HID 類別驅動程式。 功能報告會被傳送以回應驅動程式的請求。 此報表包含屬性數據,包括感測器的變更敏感度設定、其報告間隔,以及其報告狀態。 輸入報告會在要求時傳送,或以異步方式回應事件。 此報表包含實際的感測器數據。 例如,針對加速計,報表包含沿著 x、y 和 z 軸的 G 力。
- HID 類別驅動程式會將功能報告傳送至感測器。 例如,當應用程式要求新的變更敏感度或報告間隔時,驅動程式會將這些值封裝到功能報表中,並使用此報告將要求傳送至感測器的韌體。
下圖說明 I/O 模型:
範例報表描述元
如果您的感測器支援類別驅動程式原生的七個類別之一,其韌體將需要支援特定功能和輸入報告。 功能報告包括感測器的目前報告狀態、其狀態、變更敏感度和報告間隔(除了其他可能的屬性)。 輸入報告包含感測器讀數:開關的 True 或 False、加速計的 G-force 值或環境光線感測器的 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),