First Release

Dependencies:   USBDevice

Revision:
0:e1265f6b3565
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Out_PS3USB/USBHID/USBJoystick.cpp	Sat Jul 27 14:05:47 2013 +0000
@@ -0,0 +1,254 @@
+/* Copyright (c) 2010-2011 mbed.org, MIT License
+* Modified Mouse code for Joystick - WH 2012
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+* and associated documentation files (the "Software"), to deal in the Software without
+* restriction, including without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in all copies or
+* substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "stdint.h"
+#include "USBJoystick.h"
+
+bool USBJoystick::update(int16_t x, int16_t y, int16_t z, int16_t rz, uint32_t buttons, uint8_t stick)
+{
+    HID_REPORT report;
+    int idx = 0;
+    
+    _x = x;
+    _y = y;
+    _z = z;
+    _rz = rz;
+    _buttons = buttons;
+    _stick = stick;
+
+    unsigned char hatswitch;
+    if (_stick & JOYSTICK_UP) {
+        hatswitch = 0;
+        if (_stick & JOYSTICK_RIGHT) hatswitch = 1;
+        if (_stick & JOYSTICK_LEFT) hatswitch = 7;
+    } else if (_stick & JOYSTICK_RIGHT) {
+        hatswitch = 2;
+        if (_stick & JOYSTICK_DOWN) hatswitch = 3;
+    } else if (_stick & JOYSTICK_DOWN) {
+        hatswitch = 4;
+        if (_stick & JOYSTICK_LEFT) hatswitch = 5;
+    } else if (_stick & JOYSTICK_LEFT) {
+        hatswitch = 6;
+    } else {
+        hatswitch = 0xf;
+    }
+
+   // Fill the report according to the Joystick Descriptor
+    report.data[idx++] = _buttons & 0xff;
+    report.data[idx++] = (_buttons>>8) & 0xff;
+    report.data[idx++] = hatswitch & 0x0f;
+    report.data[idx++] = _x + 0x80;
+    report.data[idx++] = _y + 0x80;
+    report.data[idx++] = _z + 0x80;
+    report.data[idx++] = _rz + 0x80;
+
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.length = idx; 
+
+    return send(&report);
+}
+ 
+bool USBJoystick::update() 
+{
+    HID_REPORT report;
+    int idx = 0;
+
+    unsigned char hatswitch;
+    if (_stick & JOYSTICK_UP) {
+        hatswitch = 0;
+        if (_stick & JOYSTICK_RIGHT) hatswitch = 1;
+        if (_stick & JOYSTICK_LEFT) hatswitch = 7;
+    } else if (_stick & JOYSTICK_RIGHT) {
+        hatswitch = 2;
+        if (_stick & JOYSTICK_DOWN) hatswitch = 3;
+    } else if (_stick & JOYSTICK_DOWN) {
+        hatswitch = 4;
+        if (_stick & JOYSTICK_LEFT) hatswitch = 5;
+    } else if (_stick & JOYSTICK_LEFT) {
+        hatswitch = 6;
+    } else {
+        hatswitch = 0xf;
+    }
+
+   // Fill the report according to the Joystick Descriptor
+    report.data[idx++] = _buttons & 0xff;
+    report.data[idx++] = (_buttons>>8) & 0xff;
+    report.data[idx++] = hatswitch & 0x0f;
+    report.data[idx++] = _x + 0x80;
+    report.data[idx++] = _y + 0x80;
+    report.data[idx++] = _z + 0x80;
+    report.data[idx++] = _rz + 0x80;
+
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.data[idx++] = 0;
+    report.length = idx; 
+
+    return send(&report);
+}
+
+
+
+void USBJoystick::_init() 
+{
+    _x = 0;
+    _y = 0;
+    _z = 0;
+    _rz = 0;
+    _buttons = 0;
+    _stick = 0;
+}
+
+
+uint8_t * USBJoystick::reportDesc() 
+{
+    static uint8_t reportDescriptor[] = 
+    {
+        0x05, 0x01, // USAGE_PAGE (Generic Desktop)
+        0x09, 0x05, // USAGE (Gamepad)
+        0xa1, 0x01, // COLLECTION (Application)
+
+        0x15, 0x00, //   LOGICAL_MINIMUM (0)
+        0x25, 0x01, //   LOGICAL_MAXIMUM (1)
+        0x35, 0x00, //   PHYSICAL_MINIMUM (0)
+        0x45, 0x01, //   PHYSICAL_MAXIMUM (1)
+        0x75, 0x01, //   REPORT_SIZE (1)
+        0x95, 0x0d, //   REPORT_COUNT (13)
+        0x05, 0x09, //   USAGE_PAGE (Button)
+        0x19, 0x01, //   USAGE_MINIMUM (Button 1)
+        0x29, 0x0d, //   USAGE_MAXIMUM (Button 13)
+        0x81, 0x02, //   INPUT (Data,Var,Abs)
+        0x95, 0x03, //   REPORT_COUNT (3)
+        0x81, 0x01, //   INPUT (Cnst,Ary,Abs)
+        0x05, 0x01, //   USAGE_PAGE (Generic Desktop)
+        0x25, 0x07, //   LOGICAL_MAXIMUM (7)
+        0x46, 0x3b, 0x01, //   PHYSICAL_MAXIMUM (315)
+        0x75, 0x04, //   REPORT_SIZE (4)
+        0x95, 0x01, //   REPORT_COUNT (1)
+        0x65, 0x14, //   UNIT (Eng Rot:Angular Pos)
+        0x09, 0x39, //   USAGE (Hat switch)
+        0x81, 0x42, //   INPUT (Data,Var,Abs,Null)
+        0x65, 0x00, //   UNIT (None)
+        0x95, 0x01, //   REPORT_COUNT (1)
+        0x81, 0x01, //   INPUT (Cnst,Ary,Abs)
+
+        0x26, 0xff, 0x00, //   LOGICAL_MAXIMUM (255)
+        0x46, 0xff, 0x00, //   PHYSICAL_MAXIMUM (255)
+        0x09, 0x30, //   USAGE (X)
+        0x09, 0x31, //   USAGE (Y)
+        0x09, 0x32, //   USAGE (Z)
+        0x09, 0x35, //   USAGE (Rz)
+        0x75, 0x08, //   REPORT_SIZE (8)
+        0x95, 0x04, //   REPORT_COUNT (4)
+        0x81, 0x02, //   INPUT (Data,Var,Abs)
+
+        0x06, 0x00, 0xff, //   USAGE_PAGE (Vendor Specific)
+        0x09, 0x20, //   Unknown
+        0x09, 0x21, //   Unknown
+        0x09, 0x22, //   Unknown
+        0x09, 0x23, //   Unknown
+        0x09, 0x24, //   Unknown
+        0x09, 0x25, //   Unknown
+        0x09, 0x26, //   Unknown
+        0x09, 0x27, //   Unknown
+        0x09, 0x28, //   Unknown
+        0x09, 0x29, //   Unknown
+        0x09, 0x2a, //   Unknown
+        0x09, 0x2b, //   Unknown
+        0x95, 0x0c, //   REPORT_COUNT (12)
+        0x81, 0x02, //   INPUT (Data,Var,Abs)
+        0x0a, 0x21, 0x26, //   Unknown
+        0x95, 0x08, //   REPORT_COUNT (8)
+        0xb1, 0x02, //   FEATURE (Data,Var,Abs)
+
+        0xc0, // END_COLLECTION
+        
+    /*  
+        USAGE_PAGE(1),      0x01,
+        USAGE(1),           0x04,
+        COLLECTION(1),      0x01,
+        USAGE(1),           0x01,
+        COLLECTION(1),      0x00,
+
+        USAGE_PAGE(1),      0x09,
+        USAGE_MINIMUM(1),       0x01,
+        USAGE_MAXIMUM(1),       0x0C,
+        LOGICAL_MINIMUM(1),     0x00,
+        LOGICAL_MAXIMUM(1),     0x01,
+        PHYSICAL_MINIMUM(1),    0x00,
+        PHYSICAL_MAXIMUM(1),    0x01,
+        REPORT_SIZE(1),     0x01,
+        REPORT_COUNT(1),    0x0C,
+        INPUT(1),           0x02,
+
+        USAGE_PAGE(1),      0x01,
+        USAGE(1),           0x39,
+        LOGICAL_MINIMUM(1),     0x00,
+        LOGICAL_MAXIMUM(1),     0x07,
+        PHYSICAL_MINIMUM(1),    0x00,
+        PHYSICAL_MAXIMUM(2),    0x3B, 0x01,
+        UNIT(1),            0x14,
+        REPORT_SIZE(1),     0x04,
+        REPORT_COUNT(1),    0x01,
+        INPUT(1),           0x42,
+
+        USAGE_PAGE(1),      0x01,
+        USAGE(1),           0x30,
+        USAGE(1),           0x31,
+        USAGE(1),           0x32,
+        USAGE(1),           0x35,
+        LOGICAL_MINIMUM(1),     0x00,
+        LOGICAL_MAXIMUM(2),     0xff, 0x00,
+        PHYSICAL_MINIMUM(1),    0x00,
+        PHYSICAL_MAXIMUM(2),    0xff, 0x00,
+        UNIT(2),            0x00, 0x00,
+        REPORT_SIZE(1),     0x08,
+        REPORT_COUNT(1),    0x04,
+        INPUT(1),           0x02,
+
+        END_COLLECTION(0),
+        END_COLLECTION(0),
+    */
+    };
+
+      reportLength = sizeof(reportDescriptor);
+      return reportDescriptor;
+}
+
+