2013-10-15 30 views
10

我一直在使用PS3控制器在Mac上最近使用IOKit的HID部分。我已經設法查看示例代碼並連接到我的控制器,接收數據流並解析它(包括加速度計和陀螺儀在內的所有東西)。從Mac發送數據到PS3 DualShock3控制器(IOHIDDeviceSetReport)

但是,今天我決定要開始設置設備背面的LED並觸發隆隆發動機,但我無法完成它!

雖然看到蘋果公司爲IOHID提供的示例代碼,但在HID設備上只設置接收數據的東西並不多。從網上查看(小部分爲半天),我有我認爲是一種工作發送方法,它使用IOHIDDeviceSetReport()。但是,我無法弄清楚我應該發送什麼數據。

我發現幾個網站列表數據的例子:

(我知道不是所有的這些例子都適用於Mac的一個PS3之間控制器)

很多人s eem是在談論這個問題,甚至是在做這件事(我拒絕相信沒有人有這個工作),但我似乎無法找到任何有關如何做到這一點的工作!

我覺得我錯過了一個簡單的步驟,所以如果任何人有任何想法,幫助或解決方案,請讓我知道。

謝謝。

例的如何我試圖發送報告準則(被被成功返回):

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

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

這只是發送大量的無(字面意思),但它只是一個例子什麼我只是使用它不正確。

附加:我也剛剛注意到,蘋果的IOHIDDeviceSetReport defenition從這裏給出的例子differes。

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(即指針)是「報告字節被髮送到設備。」

+0

你有沒有得到這個工作,你可以改變LED和隆隆電機狀態?我有IOKit代碼讀取值,但按照以下建議設置輸出報告不會更改任何LED。 –

+0

@TristanSeifert可悲的是, Karsten的回答很有用,但我發現之前有過鏈接,無法讓他們工作。讓我知道,如果你將來有隆隆聲或LED有任何運氣。 – Baza207

+0

我把它縮小到了IOKit,給了我一個關於寫入停滯管道的錯誤,但是沒有關於該錯誤的文檔,並且我對IOKit解決它不夠熟悉,所以可以認爲數據永遠不會被獲取直到設備。我會在將來更多地考慮它,讓你張貼! (如果我記得,那是......) –

回答

2

他們的例子似乎很好,據我讀過它。在這些情況下,當傳遞給IOHIDDeviceSetReport時,uint8_t [64]變量或uint8_t *變量都將被解釋爲指向uint8_t的指針。

我現在處於受限制的網絡中,因此我無法進一步提供幫助。但是我稍後會在家裏嘗試稍後再讀一點,因爲我也有一個相關的項目。如果我發現任何可以幫助我們的事情,我會回到這裏來談論它。

+0

謝謝,讓我知道你是否想出任何東西。 :) – Baza207

3

有一個例子:http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-2

與代碼描述LED和隆隆聲控制在: 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]中的字節配置Rumbl即這些字節全部發送給控制器。

這裏有定義的一些常量: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功能參數。