介绍
我正在努力获得对PlayStation 4 Controller
在IOKit
. 控制器通过 连接Bluetooth
。我可以打开与控制器的连接并开始接收报告,但是,一旦我向它发送报告,它就会突然停止。
为了完全控制 PS4 控制器(隆隆声、触控板、LED),我一直在参考eleccelerator.com DualShock 4 页面,其中包含有关可以/在 PS4 和 DS4 之间发送的报告的信息。
代码
首先,我创建一个IOHIDManager
负责检测控制器的。
self.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
// Make sure we detect ANY type of 'game controller'
NSArray *criteria = [NSArray arrayWithObjects:
CreateCriterion(kHIDPage_GenericDesktop, kHIDUsage_GD_Joystick),
CreateCriterion(kHIDPage_GenericDesktop, kHIDUsage_GD_GamePad),
CreateCriterion(kHIDPage_GenericDesktop, kHIDUsage_GD_MultiAxisController),
nil];
IOHIDManagerSetDeviceMatchingMultiple(self.hidManager, (__bridge CFArrayRef)criteria);
IOHIDManagerScheduleWithRunLoop(self.hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOHIDManagerOpen(self.hidManager, kIOHIDOptionsTypeNone);
// Register callbacks
IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, ControllerConnected, (__bridge void *)self);
IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, ControllerDisconnected, (__bridge void *)self);
然后在接到对 的调用后ControllerConnected
,我创建了一个操纵杆类的实例,它初始化了IOHIDDeviceRef
.
- (void)registerDevice:(IOHIDDeviceRef)device {
self.device = device;
// Initialize the buffer
self.receivedPacketMaxSize = 552; // When using Bluetooth
self.receivedReport = (uint8_t *)calloc(self.receivedPacketMaxSize, sizeof(uint8_t));
// Register the device report callback
IOHIDDeviceScheduleWithRunLoop(self.device, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
IOHIDDeviceRegisterInputReportCallback(self.device, self.receivedReport, self.receivedPacketMaxSize, ControllerReport, (__bridge void *)self);
self.isValid = YES;
}
现在我确实接到了电话ControllerReport
,但是我收到的报告是0x01类型的,它们包含的内容有限(没有触控板或加速度计数据),但我想接收包含所有数据的0x11类型的数据包从控制器。
为了切换控制器发送的数据包,网站声明This report is sent once the GET REPORT FEATURE 0x02 is received.
所以我发送了该请求:
CFIndex len = self.receivedPacketMaxSize;
IOReturn featureMode2RequestError = IOHIDDeviceGetReport(self.device, kIOHIDReportTypeFeature, 0x02, self.receivedReport, &len);
if (featureMode2RequestError != kIOReturnSuccess) {
NSLog(@"Could switch the controller to mode 2 :(");
}
此时,ControllerReport
停止调用来自控制器的新报告。
我知道我能够向控制器发送数据,因为我能够发送一个改变 LED 颜色或设置隆隆声速度的数据包。
问题
如何从 PS4 控制器获取更长的 0x11 报告?
我试过的
我试过使用IOHIDDeviceGetReportWithCallback
and IOHIDDeviceGetReport
,但我总是kIOReturnUnsupported
回来。
我还在控制器的 linux 驱动程序的源代码中找到了对这个问题的一些参考... it starts sending input reports in report 17. Since report 17 is undefined ...
,但我不知道如何告诉 IOKit 处理报告 17 (0x11)。