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