none
マルチディスプレイ対応のタッチパネル用ドライバ RRS feed

  • 質問

  • タッチパネル用のHIDドライバを開発中です。ドライバはHIDUSBFX2をベースにしています。シングルディスプレイでは問題なく動作していますが、マルチディスプレイに対応するための方式を検討で行き詰っています。

    2つのタッチパネル1と2を2つのディスプレイA,Bに割り当てて1の操作をAに2の操作をBに反映させようとした場合、どのような処理が必要でしょうか?タッチパネルとディスプレイを関連付けることはアプリケーションを使って設定できそうですが、レポートディスクリプタで指定した範囲外を出力することは出来ないので、困っています。

    ご教授願います。

    • 移動 Mike Wang (MSCS) 2012年10月2日 13:07 (移動元:Windows デバイスドライバー開発)
    2011年6月10日 6:42

すべての返信

  • アプリケーション側で扱う Device Surface (HID デバイスの座標空間) を1つの領域で表し、入力された座標に応じて、対応するタッチパネル デバイスに処理を割り振りたい。。。ということでしょうか?
    イメージとしては(あまり適切なたとえでは無いかもしれませんが)、
    「複数のマウスが接続されていて、仮にその個々のマウスが個別の座標空間上に
      存在しているとしたら、どうすればよいのか?」
    みたいな感じかなと思ったのですが。。。

    もしこの理解で合っているとしたら。。。
    現在のドライバの上位に仮想 HID デバイスみたいなクラスを用意して、入力された座標に応じてタッチパネル1もしくは2に対応するデバイス オブジェクトへのリクエストに変換する仕組みが必要になるのではないでしょうか?
    少なくとも、タッチパネル1と2はそれぞれ独立した異なる Device Surface に対応する処理を行うことになると思いますので、上位のユーザ モード側で1つの Device Surface として扱うのであれば、そのリクエストを個々のタッチパネル デバイス オブジェクトへのリクエストに分割するためのレイヤが必要になると思います。
    (単なる素人考えですが。。。)

    2011年6月11日 6:40
  • 返信ありがとうございます。

    Device Surface(HIDデバイスの座標空間)とはどのようなものでしょうか?

    私が実現したいのは、例えば複数のモニタにそれぞれ透明なタッチパネルを取り付けたとして、そのタッチパネルとモニタを関連付けて動作させたいというものです。マウスは相対座標で座標を出力しますが、タッチパネルは絶対座標ですので、モニタに関連付けねばなりません。一方で、HIDデバイスはPlug and PlayでレポートディスクリプタをOSへ返し、その座標空間を定義するので、それ以降はその座標の範囲を変更できないと思うのです。

    どなたかご教授願います。

    2011年6月14日 1:05
  • 先の私の返信はかなり頓珍漢だったかも。。。大変失礼致しました。
    ちなみに先の返信での 「アプリケーション側で扱う Device Surface」とは、ディスプレイの物理的な表示空間をアプリケーション (Windows) 側で扱う論理的な表示空間にマップしたもの。。。と言う意味で書いたのですが、この点も分かりずらい表現で申し訳ありませんでした。

    今回 TATSUN さんがベースにされたドライバは HIDUSBFX2 とのことですが、このドライバで定義されている G_DefaultReportDescriptor の内容を全面的に書き換えた。。。と言うことでしょうか?
    そもそも HIDUSBFX2 Driver は OSR USB FX-2 Learning Kit 用のドライバなので、Touch Panel Device 用に作り変えるとなると、Report Descriptor の定義もかなり変更する必要があると思います。
    Touch Panel Device 用の Report Descriptor に関しては、WDK で提供されている Elotouch Driver (%BASEDIR%\src\input\hiddigi\EloMT) などの Digitizer のドライバが参考になると思いますが、こちらのドライバは既に確認済みと言うことでしょうか?
    Elotouch Driver と HIDUSBFX2 Driver の Report Descriptor は似ているようでかなり異なっているようです。
    また readme を確認すると "multi-touch" とあるので、マルチディスプレイにも対応しているのかも。。。(全然違う意味かもしれませんが。。。)
    ですので、まだ Digitizer ドライバのサンプル コードを確認されていないのであれば、そちらを参照してみてはいかがでしょうか?
    (既に確認済み。。。と言うことでしたら、ご容赦ください。)

    あと1点気になったことは、返信の以下の記述ですが。。。

    > HIDデバイスは Plug and PlayでレポートディスクリプタをOSに返し

    Report Descriptor の情報は IOCTL_HID_GET_REPORT_DESCRIPTOR の応答、つまり Device I/O Control リクエストの結果としてドライバが返すものなので、PnP リクエストではないと思います。

    私の認識に誤りがありましたらご容赦ください。

    2011年6月14日 3:34
  • 返信ありがとうございます。

    EloTouchのソースは確認済みです。このソースは、もちろんマルチタッチに対応していますが、インターフェースはシリアルインターフェースであり、それをUSBデバイスのように動作させるものです。HIDUSBFX2はマルチには対応していませんが、Report Descriptorを変更することで(他にも結構修正が必要ですが)マルチタッチのUSBデバイスに対応できます。(というか対応済みです)。

    その後、調査した結果、デバイスドライバではマルチディスプレイの対応が不要(の可能性が高い)ということがわかりました。今のところWindows 7のみですが、コントロールパネルでモニタとタッチデバイスの関連付けが出来るようです。

    >Report Descriptor の情報は IOCTL_HID_GET_REPORT_DESCRIPTOR の応答、つまり Device I/O Control リクエストの結果としてドライバが返すものなので、PnP リクエストではないと思います。

    認識の違いがあるようですが、Report DescriptorはHIDクラスのリクエストとしてUSBプラグアンドプレイ時に基本的にデバイスが返すものです。Device I/O Controlで要求されますが、そこからデバイスに問い合わせます。もし、EloTouchのようにデバイスが返さない場合は、ドライバが返すことも可能です。

    自己レスですが、とりあえず本件に関しては解決しました。ありがとうございました。

    • 回答の候補に設定 犬のポチ 2011年6月20日 4:53
    2011年6月15日 3:52