0

IOHIDManager API を使用して、マウス (Magic Apple Mouse) の X、Y、button1、Button2 などの Mac OsX 上のデバイスの HID レポートからデータを読み取ろうとしています。

API を使用すると、記述子を動的に読み取ることができますが、いくつかの問題があります。 - API は、記述子から必要なすべての情報を提供してくれません。...構造を正しく構築するには、パディングを自分で計算する必要があります。- API は、記述子または HID レポートと同じ順序で機能 (X、Y、btn1 ...) を提供しません!! HIDレポートを読む正しい順序をどうやって知ることができると思いますか!?

そのため、HID レポート データと正しく一致していません。

これは、OsX API によって記述子から提供された情報です。

device 0x7f94f4804c70 is Apple Optical USB Mouse (vendor 5ac), max report size 6 
nb element descriptor : 11
        element (usage name) Generic Desktop item 0002 
        element (usage name) Generic Desktop item 0001 
        element (usage name) X 
        element (usage name) Y 
        element (usage name) Z 
        element (usage name) Wheel 
        element (usage name) Button 1 
        element (usage name) Button 2 
        element (usage name) Button 3 
        element (usage name) Button 4 
        element (usage name) Apple Reserved Mouse Data 

だから私は構造体を構築します:X、Y、Z、ホイール、Btn1 | Btn2 | Btn3 | Btn4、ARMD

これは、記述子から Linux で提供された RAW 情報です。

0x05, 0x01,                    // Usage Page (Generic Desktop)        0
0x09, 0x02,                    // Usage (Mouse)                       2
0xa1, 0x01,                    // Collection (Application)            4
0x05, 0x09,                    //   Usage Page (Button)               6
0x19, 0x01,                    //   Usage Minimum (1)                 8
0x29, 0x04,                    //   Usage Maximum (4)                 10
0x15, 0x00,                    //   Logical Minimum (0)               12
0x25, 0x01,                    //   Logical Maximum (1)               14
0x95, 0x04,                    //   Report Count (4)                  16
0x75, 0x01,                    //   Report Size (1)                   18
0x81, 0x02,                    //   Input (Data,Var,Abs)              20
0x95, 0x01,                    //   Report Count (1)                  22
0x75, 0x04,                    //   Report Size (4)                   24
0x81, 0x01,                    //   Input (Cnst,Arr,Abs)              26
0x05, 0x01,                    //   Usage Page (Generic Desktop)      28
0x09, 0x01,                    //   Usage (Pointer)                   30
0xa1, 0x00,                    //   Collection (Physical)             32
0x09, 0x30,                    //     Usage (X)                       34
0x09, 0x31,                    //     Usage (Y)                       36
0x09, 0x32,                    //     Usage (Z)                       38
0x09, 0x38,                    //     Usage (Wheel)                   40
0x15, 0x81,                    //     Logical Minimum (-127)          42
0x25, 0x7f,                    //     Logical Maximum (127)           44
0x75, 0x08,                    //     Report Size (8)                 46
0x95, 0x04,                    //     Report Count (4)                48
0x81, 0x06,                    //     Input (Data,Var,Rel)            50
0xc0,                          //   End Collection                    52
0x05, 0xff,                    //   Usage Page (Vendor Usage Page 0xff) 53
0x09, 0xc0,                    //   Usage (Vendor Usage 0xc0)         55
0x75, 0x08,                    //   Report Size (8)                   57
0x95, 0x01,                    //   Report Count (1)                  59
0x81, 0x02,                    //   Input (Data,Var,Abs)              61
0xc0,                          // End Collection                      63

だから私は構造体を構築することができました: Btn1|Btn2|Btn3|Btn4|0|0|0|0, X, Y, Z, Wheel, ARMD

そこから、OsX API に基づいて、HID レポートと「一致」するように、ほぼ同じ (パディング ビットを含む) 構造を構築しています。だから私は持っています:X、Y、Z、ホイール、Btn1 | Btn2 | Btn3 | Btn4 | 0 | 0 | 0 | 0、ARMD

私は HID レポートを購読し、私の構造に適合するはずなので解析します...しかし、そうではありません

ここでは、OsX で Btn1 をクリックしたときに得たものです。

device : 0x7fe609007500, id: 0 ---  01  00  00  00  00  00  size - 48
X : 1  Y : 0  Z : 0  Wheel : 0  Button 1 : 0  Button 2 : 0  Button 3 : 0  Button 4 : 0  ARMData : 0

レポートによると、X=1 !!!!

ここに、それは私がLinuxで持っているものです

2.384001  B1: 1 | B2: 0 | B3: 0 | B4: 0 | # | X:    0 | Y:    0 | Z:    0 | Wheel:    0 | 0xff00c0: -127

このプログラムは、Magic Apple Mouse 以外のいくつかのデバイスでマウスとして動作しますが、他のデバイスでも同様の問題が発生します... API は、間違った順序で部分的な情報を提供します。

私が理解できなかったことはありますか?誰かが同じ問題を抱えているか、OSX で HID API を使用する方法をよりよく理解していますか?

4

3 に答える 3

0

この質問に対する答えを見つけたと思います。

API は、デバイスで見つけることができる要素のリストを返します。どのレポート ID であっても、リスト内の要素の順序に関係なく (実際にはロジックがありますが、私が期待していたものではありません)

しかし、API は各要素に「cookie」という名前のキーを追加し、このキーは記述子で見つかった要素の順序を尊重しているようです。この Cookie を使用して正しい順序で構造を構築し、正しいオフセットを計算して、入力レポートを正しく解析できます。

device 0x7ff1f42072a0 is Apple Optical USB Mouse (vendor 5ac), max report size 6 
nb element descriptor : 11
    cookie: 1 - element (usage name) Generic Desktop item 0002 
    cookie: 2 - element (usage name) Generic Desktop item 0001 
    cookie: 3 - element (usage name) Button 1 
    cookie: 4 - element (usage name) Button 2 
    cookie: 5 - element (usage name) Button 3 
    cookie: 6 - element (usage name) Button 4 
    cookie: 7 - element (usage name) X 
    cookie: 8 - element (usage name) Y 
    cookie: 9 - element (usage name) Z 
    cookie: 10 - element (usage name) Wheel 
    cookie: 11 - element (usage name) Apple Reserved Mouse Data 

編集:さらにテストした後、このソリューションはすべてのデバイスで機能しません。Cookie キーは、たとえばタッチ スクリーンの場合、記述子の順序を尊重しません:/

于 2014-01-10T14:47:37.360 に答える
0

私はこの API の経験がないので、この回答は的外れかもしれません。また、あなたの質問はややこしいと思いました。

IOHIDManager APIを使用していて、USB デバイスからの一部の HID レポートの正確なビット構造を理解するのに問題があるようです。

正確なビット構造は、まさにこのような高レベル API によって抽象化されるべき詳細の種類であると思います。なぜ正確な構造を知る必要があるのですか?IOHIDManagerRegisterInputValueCallbackデバイスからデータを読み取るだけに使用できますか?

于 2014-01-09T22:08:26.627 に答える