Estoy investigando una incompatibilidad de algunos Gamepads Bluetooth con OSX: Tengo un Gamepad Bluetooth (NES30 Pro). El problema es que si lo conecto por bluetooth, no funciona correctamente en OSX. Ya he encontrado la causa y se lo he comunicado al fabricante, y me han prometido que mirarán de arreglarlo. Sin embargo, mientras tanto me gustaría encontrar una solución.
La causa del problema es que el Gamepad no envía un descriptor de uso HID adecuado cuando se conecta por Bluetooth. El Gamepad debería enviar un descriptor de uso HID que señala que es un gamepad. Sin embargo, envía un descriptor de uso HID que señala que es un dispositivo compuesto de Teclado, Ratón y Gamepad al mismo tiempo.
A modo de ilustración, esta es una captura de pantalla del administrador de dispositivos de Windows, que muestra que el Gamepad actúa como varios tipos de dispositivos a la vez.
Windows y Linux simplemente crean 3 dispositivos, un dispositivo de teclado, un dispositivo de ratón y un dispositivo de gamepad. Sin embargo OSX crea sólo un dispositivo que contiene toda la funcionalidad a la vez, que la mayoría de los programas no reconocen como un Gamepad. Hasta ahora la única aplicación que me ha mostrado que los datos de posición de los ejes analógicos y de los botones del gamepad son transmitidos es la aplicación HID explorer de apple ( http://developer.apple.com/mac/library/samplecode/HID_Explorer/HID_Explorer.zip )
Ahora estoy buscando una solución en OSX. Algunos sistemas Linux también tienen un problema con el descriptor de uso de wron HID. Sin embargo, por lo general se puede arreglar mediante el establecimiento de una regla udev que específicamente le dice al sistema para tratar el dispositivo como gamepad / joystick, por ejemplo así:
# 8Bitdo SFC30 GamePad Bluetooth mode(START)
SUBSYSTEM=="input", ATTRS{name}=="8Bitdo SFC30 GamePad", MODE="0666", ENV{ID_INPUT_JOYSTICK}="1"
Por supuesto, OSX no tiene udev. ¿Alguien sabe cómo decirle/forzar a OSX para que trate un dispositivo de entrada como un joystick/gamepad? ¿O tal vez cómo crear un dispositivo gamepad virtual que tome su entrada de los ejes/botones del dispositivo compuesto de teclado/ratón/gamepad? ¿O alguna otra idea de cómo abordar este problema?
Nota: Estoy especialmente interesado en utilizar los sticks analógicos. Así que la asignación de los mismos a los botones del teclado no es una opción. (El gamepad ya tiene un modo especial para hacer eso por sí mismo. Sin embargo, entonces los sticks analógicos, por supuesto, no funcionan).