Отправьте данные на контроллер 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.

Сейчас я на ограниченной сети, поэтому я больше не смогу помочь. Но я попытаюсь немного почитать об этом позже дома, так как у меня также есть связанный проект. Если я узнаю все, что может нам помочь, я вернусь сюда, чтобы поговорить об этом.