* examples for --dpad as buttons and other options

Figure out:
===========
Unknown data: bytes: 3 Data: 0x01 0x03 0x0e 
Unknown data: bytes: 3 Data: 0x02 0x03 0x00 
Unknown data: bytes: 3 Data: 0x03 0x03 0x03 
Unknown data: bytes: 3 Data: 0x08 0x03 0x00 
Unknown data: bytes: 3 Data: 0x01 0x03 0x00 

Different Computer/Pad:
Unknown data: bytes: 3 Data: 0x01 0x03 0x0e
Unknown data: bytes: 3 Data: 0x02 0x03 0x00
Unknown data: bytes: 3 Data: 0x03 0x03 0x03
Unknown data: bytes: 3 Data: 0x08 0x03 0x00
Unknown data: bytes: 3 Data: 0x01 0x03 0x00

                      /* Happens with XBox360 Controller sometimes
                         Unknown data: bytes: 3 Data: 0x01 0x03 0x0e 
                         Unknown data: bytes: 3 Data: 0x02 0x03 0x00 
                         Unknown data: bytes: 3 Data: 0x03 0x03 0x03 
                         Unknown data: bytes: 3 Data: 0x08 0x03 0x00 
                         -- different session:
                         Unknown data: bytes: 3 Data: 0x01 0x03 0x0e 
                         Unknown data: bytes: 3 Data: 0x02 0x03 0x00 
                         Unknown data: bytes: 3 Data: 0x03 0x03 0x03 
                         Unknown data: bytes: 3 Data: 0x08 0x03 0x00 
                         Unknown data: bytes: 3 Data: 0x01 0x03 0x06 

                      */


// wire:                 { 0x00, 0x08, 0x00, large, small, 0x00, 0x00, 0x00 };
// wireless: { 0x00, 0x01, 0x0f, 0xc0, 0x00, large, small, 0x00, 0x00, 0x00, 0x00, 0x00};
                                 ^^^^ typo?
void Wireless360Controller::SetRumbleMotors(unsigned char large, unsigned char small)
{
    char buf[] = {0x00, 0x01, 0x0f, 0xc0, 0x00, large, small, 0x00, 0x00, 0x00, 0x00, 0x00};
    WirelessDevice *device;
    
    device = OSDynamicCast(WirelessDevice, getProvider());
    if (device != NULL)
        device->SendPacket(buf, sizeof(buf));
}
    

-----

Tilt Sensor: is mapped to the second axis of S2, to LT and RT (three parts)
- Range for 2nd axis of S2 : -32768 when guitar is straight down and 32767 when she is straight up.
- Range for LT : ~200 not very precise and ~60 at min.
- Range for RT : ~190 not very precise and ~55 at min.

    dummy should stay mostly 0, except the position five and six, which
    are the LT/RT trigger. We can either just ignore them or you can try
    to find out if they have any meaning.
     

They control guitar rotation, hmm hard to explain, it's when I rotate the guitar in front of me, it detects if the guitar is in the correct position.
-----

* add -type option to enforce controller type

* Question: Firestorm Dual Power: How to get rumble to work when there is no endpoint to send data to?

* allow selection of controller by usb path busNr,deviceNr

* Guitar Hero Controller:
  - lsusb -v output looks like a XBox360 controller
  - usbcat looks like an XBox360 controller
  - it doesn't report events  

http://forums.gentoo.org/viewtopic-p-5061825.html
http://gentoo-wiki.com/HOWTO_Xbox_360_controller_on_Linux
http://happypenguin.org/show?xboxdrv
http://ubuntuforums.org/showthread.php?t=404577&page=16
http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver

* add jstest, evtest into the source


 WirelessHIDDevice::receivedMessage(IOMemoryDescriptor *data)

* wireless reports battery level

* disconnecting the pad in use will just let the driver wait forever
  for new data, any way we can catch a disconnect?

* a way to configure the deadzone for axis (might be needed for some games)

* Add support for dancepad/mats (should just mean cleanup up the
  buttons/axis not provided by the dancepad/mat)

New Command Line Options:

--button-map BTN

  BTN is a list of integers, where each integer corresponds to the
  event that gets send

  A,B,X,Y,LB,RB,SL,SR,LT,RT,Start,Mode,Back,DPAD-UP,DPAD-DOWN,DPAD-LEFT,DPAD-RIGHT
  A,B,X,Y,TL2,TR2,TL,TR,

#define BTN_A			0x130
#define BTN_B			0x131
#define BTN_C			0x132
#define BTN_X			0x133
#define BTN_Y			0x134
#define BTN_Z			0x135
#define BTN_TL			0x136
#define BTN_TR			0x137
#define BTN_TL2			0x138
#define BTN_TR2			0x139
#define BTN_SELECT		0x13a
#define BTN_START		0x13b
#define BTN_MODE		0x13c
#define BTN_THUMBL		0x13d
#define BTN_THUMBR		0x13e

--dpad-first 
  Dpad becomes first and second axis, instead of last, useful for 2D
  jump'n run

--stick2-as-throttle
  Makes the second stick act as throttle control

* add support to remap keys

* allow mouse emulation

* allow swapping of dpad and analog axis, so that dpad is first instead of last

* merge this thing with Pingus Input handling to get a very flexible framework?

* ...

Use cases:
==========
* flightsim:
   expects:     X/Y      Rudder   Throttle
   XBox:    Left-Stick   LT+RT    Right-Stick(rel)

* FPS:
   expects:  Mouse-X/Y   Walk-X/Y  Trigger
   XBox:    Left-Stick   RickStick Trigger(btn)

* 2D Jump Run
   needs dpad first

Needed features:
================
* stick to mouse
* relative-axis (throttle doesn't flip back, a stick does, need to handle that)
* trigger to button
* dpad to axis
* dpad to button
* inversal of axis
* soft-axis for dpad

(controller 
  (button (name   "BTN_X") ;; X and Y send out BTN_X events
          (device (xbox360-button "Y")
                  (xbox360-button "X")))
  (button (name   "BTN_A") 
          (device (inverse (xbox360-button "Y"))))
  (axis   (name "ABS_X")
          ...
)

;; -- Pingus Input Configuration --
(pingus-controller
 (standard-pointer
  (usbmouse:pointer (device "/dev/input/mx500")))

 (standard-scroller
  (usbmouse:scroller (device "/dev/input/marblemouse")))

 (primary-button
  (usbmouse:button (device "/dev/input/mx500") (button 0)))

 (secondary-button
  (usbmouse:button (device "/dev/input/mx500") (button 1)))

 (pause-button
  (usbmouse:button (device "/dev/input/mx500") (button 4)))

 (fast-forward-button
  (usbmouse:button (device "/dev/input/mx500") (button 3)))

;; (armageddon-button
;;  (usbmouse:button (device "/dev/input/mx500") (button 4)))

 (escape-button
  (sdl:keyboard-button (key "escape")))

 (action-up-button
  (usbmouse:button (device "/dev/input/mx500") (button 6))) 

 (action-down-button
  (usbmouse:button (device "/dev/input/mx500") (button 5)))
 )

;; EOF ;;
 

# EOF #