Отправьте данные на контроллер PS3 DualShock3 с Mac (IOHIDDeviceSetReport)
Я играл с HID частью IOKit в последнее время на моем Mac с контроллером PS3. Мне удалось просмотреть образец кода и подключиться к моему контроллеру, получить поток данных и проанализировать его (все, включая акселерометр и гироскоп).
Однако сегодня я решил начать устанавливать светодиоды на задней панели устройства и запускать двигатели грохота, но я просто не могу заставить его работать!
Глядя на пример кода, который Apple предоставляет для IOHID, я не вижу ничего, что можно было бы установить при настройке на HID-устройстве, только получая данные. От поиска в Интернете (для мелочи много полдня) у меня есть то, что я считаю рабочим методом отправки, который использует 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
(являющийся указателем) - это "байты отчета, которые должны быть отправлены на устройство".
Ответы
Ответ 1
есть пример: http://www.circuitsathome.com/mcu/ps3-and-wiimote-game-controllers-on-the-arduino-host-shield-part-2
с кодом, описывающим управление светодиодом и 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] переопределяется для установки состояния светодиода, а байты с 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 в качестве параметров.
Ответ 2
Их пример кажется прекрасным, насколько я его читал. В этих условиях либо переменная uint8_t [64], либо переменная uint8_t * будут интерпретироваться как указатель на uint8_t при передаче в IOHIDDeviceSetReport.
Сейчас я на ограниченной сети, поэтому я больше не смогу помочь. Но я попытаюсь немного почитать об этом позже дома, так как у меня также есть связанный проект. Если я узнаю все, что может нам помочь, я вернусь сюда, чтобы поговорить об этом.