センサー HID クラス ドライバー
Windows 8 以降、Windows オペレーティング システムには、HID トランスポートを使用して通信する 11 種類のセンサーをサポートするインボックス センサー HID クラス ドライバー (SensorsHIDClassDriver.dll) が含まれています。
サポートされているセンサーは次のとおりです。
- 加速度計 3D
- 環境光
- 大気温度
- 大気圧
- コンパス 3D
- デバイスの向き
- ジャイロスコープ 3D
- 湿度
- 傾斜計 3D
- プレゼンス
- 近接
次の図は、2 つのセンサー アプリケーションからドライバー スタックを経由し、最終的にはハードウェア自体とデータをやり取りするフローを示しています。
カスタム センサーのサポート
上記の一覧に示した 11 個のセンサーに加えて、クラス ドライバーはカスタム クラスもサポートしています。 このクラスを使用すると、センサーの製造元は、上記の一覧に示されていないデバイス (一酸化炭素センサーなど) を統合できます。 カスタム センサーは、独自のプロパティを持つカスタム デバイスとしてセンサー API に提示されます。
アーキテクチャと概要
互換性のあるセンサーのファームウェアを作成する場合は、クラス ドライバーでサポートされている I/O モデルの基本的な理解が必要です。
- センサーは、機能レポートまたは入力レポートを HID クラス ドライバーに送信します。 機能レポートは、ドライバーからの要求に応答して送信されます。 このレポートには、センサーの変更感度設定、レポート間隔、レポートの状態などのプロパティ データが含まれます。 入力レポートは、要求時に送信されるか、イベントに応答して非同期的に送信されます。 このレポートには、実際のセンサー データが含まれています。 たとえば、加速度計の場合、レポートには x 軸、y 軸、z 軸に沿った重力加速度が含まれます。
- HID クラス ドライバーは、センサーに機能レポートを送信します。 たとえば、アプリケーションが新しい変更感度またはレポート間隔を要求すると、ドライバーはこれらの値を機能レポートにパッケージ化し、そのレポートを使用してセンサーのファームウェアに要求を送信します。
次の図は I/O モデルを示しています。
レポート記述子のサンプル
センサーがクラス ドライバーにネイティブな 7 つのカテゴリのいずれかをサポートしている場合、センサーのファームウェアは特定の機能と入力レポートをサポートする必要があります。 機能レポートには、(その他の可能なプロパティに加えて) センサーの現在のレポートの状態、センサーの状態、変更感度、レポート間隔が含まれています。 入力レポートには、センサーの測定値が含まれています。スイッチの場合は True または False、加速度計の場合は重力加速度値、周囲光センサーの場合は 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),