我最近在Mac上使用PS3控制器玩了很多IOKit的HID部分。我已经设法查看示例代码并连接到我的控制器,接收数据流并解析它(Everything,包括加速度计和陀螺仪)。
然而,今天我决定开始设置设备背面的LED并触发隆隆电机,但我无法让它工作!
看看Apple为IOHID提供的示例代码,我在HID设备上设置东西时只看到了很多,只接收数据。从网上看(小半天)我得到的是我认为使用IOHIDDeviceSetReport()
的工作发送方法。但是,我无法弄清楚我应该发送什么数据。
我找到了几个列出数据示例的网站:
(我知道并非所有这些示例都适用于Mac和PS3控制器之间)
很多人似乎在谈论这个,甚至在做这件事(我拒绝相信没有人有这个工作)但我似乎无法找到任何关于实际如何做到这一点的工作!
我觉得我在这里错过了一个简单的步骤,所以如果有任何想法,帮助或解决方案,请告诉我。
感谢。
示例代码我正在尝试发送报告(正在返回成功):
CFIndex len = 64;
uint8_t report[64] = {0x0};
IOReturn tIOReturn = IOHIDDeviceSetReport(deviceRef,
kIOHIDReportTypeOutput,
reportID,
report,
len);
这只是发送了很多东西(字面意思)但它只是我正在使用的一个例子,只是因为它不正确。
额外:我刚刚注意到苹果对IOHIDDeviceSetReport
的不同之处有所不同。
它说report
应该是“报告缓冲区的地址”。但...
它说*report
(作为指针)是“要发送到设备的报告字节。”。
答案 0 :(得分: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函数。
答案 1 :(得分:2)
就我所读到的而言,他们的榜样似乎很好。在这些情况下,uint8_t [64]变量或uint8_t *变量在传递给IOHIDDeviceSetReport时都将被解释为指向uint8_t的指针。
我现在在受限制的网络上,所以我无法继续提供帮助。但是我稍后会在家里尝试更多地阅读这个内容,因为我也有一个相关的项目。如果我发现任何可以帮助我们的事情,我会回到这里谈谈它。