次の方法で共有


センサー HID クラス ドライバー

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 モデルを示しています。

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),