2013-10-15 32 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功能参数。