10

最近、PS3コントローラーを搭載したMacでIOKitのHID部分をいじっています。サンプルコードを調べてコントローラーに接続し、データのストリームを受信して​​解析することができました (加速度計とジャイロを含むすべて)。

しかし、今日、デバイスの背面にある LED の設定を開始し、ランブル モーターをトリガーしたいと決めましたが、動作させることができません!

Apple が IOHID 用に提供しているサンプル コードを調べてみると、HID デバイスでの設定についてはあまり見ることができず、データを受信するだけです。Web を調べたところ (ほんの半日)、IOHIDDeviceSetReport(). ただし、どのデータを送信すればよいかわかりません。

データの例をリストしているサイトをいくつか見つけました。

(これらの例のすべてが Mac と PS3 コントローラーの間の場合ではないことはわかっています)

多くの人がこれについて話しているようで、それを実行しているようです (誰もこれを機能させたとは信じられません) が、実際に機能する方法については何も見つけられないようです!

ここで簡単な手順が欠けているように感じます。アイデア、ヘルプ、または解決策があれば教えてください。

ありがとう。

レポートを送信しようとしている方法のコード例(成功を返している):

CFIndex len = 64;
uint8_t report[64] = {0x0};

IOReturn  tIOReturn = IOHIDDeviceSetReport(deviceRef,
                                           kIOHIDReportTypeOutput,
                                           reportID,
                                           report,
                                           len);

これは(文字通り)何も送信していないだけですが、正しくない場合に備えて私が使用しているものの単なる例です。

おまけ:アップルの定義IOHIDDeviceSetReportが、与えられた例とは異なることにも気づきました。

https://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html#//apple_ref/doc/uid/TP40000970-CH214-SW81

そこにはreport、「レポートバッファのアドレス」であるべきだと書かれています。しかし...

https://developer.apple.com/library/mac/documentation/IOKit/Reference/IOHIDDevice_iokit_header_reference/Reference/reference.html#//apple_ref/doc/uid/TP40012408-CHIOHIDDevicehFunctions-DontLinkElementID_23

そこには*report、(ポインタである) と書かれていますが、「デバイスに送信されるレポート バイトです。」

4

2 に答える 2

3

例があります: http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-2

LED と Rumble コントロールを記述するコード: https://github.com/ribbotson/USB-Host/blob/master/ps3/PS3USB/ps3_usb.cpp#L187

レポートとして送信したバイトには、特定の形式が必要なようです。

 prog_char output_01_report[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                     0x00, 0x02, 0xff, 0x27, 0x10, 0x00, 0x32, 0xff, 
                                     0x27, 0x10, 0x00, 0x32, 0xff, 0x27, 0x10, 0x00, 
                                     0x32, 0xff, 0x27, 0x10, 0x00, 0x32, 0x00, 0x00, 
                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  };

LEDRumble 関数では、これらのバイトが buf にコピーされ、buf[9] がオーバーライドされて LED の状態が設定され、buf[1] から buf[4] までのバイトが Rumble の設定に使用されます。バイトはすべてコントローラに送信されます。

ここにいくつかの定数が定義されています: https://github.com/ribbotson/USB-Host/blob/master/ps3/PS3USB/ps3_usb.h#L100

#define psLED1 0x01
#define psLED2 0x02
#define psLED3 0x04
#define psLED4 0x08
#define psRumbleHigh 0x10
#define psRumbleLow 0x20

これらの定数は、パラメーターとして LEDRumble 関数に渡されます。

于 2013-12-28T10:54:30.397 に答える
2

私が読んだ限り、彼らの例は問題ないようです。このような状況では、IOHIDDeviceSetReport に渡されると、uint8_t[64] 変数または uint8_t* 変数のいずれかが uint8_t へのポインターとして解釈されます。

現在、ネットワークが制限されているため、これ以上お手伝いすることはできません。しかし、関連するプロジェクトも念頭に置いているので、後で家でこれについてもう少し読んでみます. これについて何か助けになることがわかったら、ここに戻ってそれについて話します。

于 2013-10-25T14:10:06.660 に答える