次の方法で共有


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

Windows 8 以降、Windows オペレーティング システムには、HID トランスポートを使用して通信する 11 種類のセンサーをサポートするインボックス センサー HID クラス ドライバー (SensorsHIDClassDriver.dll) が含まれています。

サポートされているセンサーは次のとおりです。

  • 加速度計 3D
  • 環境光
  • 大気温度
  • 大気圧
  • コンパス 3D
  • デバイスの向き
  • ジャイロスコープ 3D
  • 湿度
  • 傾斜計 3D
  • プレゼンス
  • 近接

次の図は、2 つのセンサー アプリケーションからドライバー スタックを経由し、最終的にはハードウェア自体とデータをやり取りするフローを示しています。

client sensor architecture.

カスタム センサーのサポート

上記の一覧に示した 11 個のセンサーに加えて、クラス ドライバーはカスタム クラスもサポートしています。 このクラスを使用すると、センサーの製造元は、上記の一覧に示されていないデバイス (一酸化炭素センサーなど) を統合できます。 カスタム センサーは、独自のプロパティを持つカスタム デバイスとしてセンサー API に提示されます。

アーキテクチャと概要

互換性のあるセンサーのファームウェアを作成する場合は、クラス ドライバーでサポートされている I/O モデルの基本的な理解が必要です。

  • センサーは、機能レポートまたは入力レポートを HID クラス ドライバーに送信します。 機能レポートは、ドライバーからの要求に応答して送信されます。 このレポートには、センサーの変更感度設定、レポート間隔、レポートの状態などのプロパティ データが含まれます。 入力レポートは、要求時に送信されるか、イベントに応答して非同期的に送信されます。 このレポートには、実際のセンサー データが含まれています。 たとえば、加速度計の場合、レポートには x 軸、y 軸、z 軸に沿った重力加速度が含まれます。
  • HID クラス ドライバーは、センサーに機能レポートを送信します。 たとえば、アプリケーションが新しい変更感度またはレポート間隔を要求すると、ドライバーはこれらの値を機能レポートにパッケージ化し、そのレポートを使用してセンサーのファームウェアに要求を送信します。

次の図は I/O モデルを示しています。

i/o model.

レポート記述子のサンプル

センサーがクラス ドライバーにネイティブな 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),