USB HID Device that emulates a Gamecontroller

Dependencies:   mbed

The notebook page for this application is here

Committer:
wim
Date:
Sat Jan 07 21:03:54 2012 +0000
Revision:
0:5037d4be5b6d
First version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:5037d4be5b6d 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
wim 0:5037d4be5b6d 2 * Modified Mouse code for Joystick - WH 2012
wim 0:5037d4be5b6d 3 *
wim 0:5037d4be5b6d 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
wim 0:5037d4be5b6d 5 * and associated documentation files (the "Software"), to deal in the Software without
wim 0:5037d4be5b6d 6 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
wim 0:5037d4be5b6d 7 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
wim 0:5037d4be5b6d 8 * Software is furnished to do so, subject to the following conditions:
wim 0:5037d4be5b6d 9 *
wim 0:5037d4be5b6d 10 * The above copyright notice and this permission notice shall be included in all copies or
wim 0:5037d4be5b6d 11 * substantial portions of the Software.
wim 0:5037d4be5b6d 12 *
wim 0:5037d4be5b6d 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
wim 0:5037d4be5b6d 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
wim 0:5037d4be5b6d 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
wim 0:5037d4be5b6d 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
wim 0:5037d4be5b6d 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
wim 0:5037d4be5b6d 18 */
wim 0:5037d4be5b6d 19
wim 0:5037d4be5b6d 20 #include "stdint.h"
wim 0:5037d4be5b6d 21 #include "USBJoystick.h"
wim 0:5037d4be5b6d 22
wim 0:5037d4be5b6d 23 bool USBJoystick::update(int16_t t, int16_t r, int16_t x, int16_t y, uint8_t button, uint8_t hat) {
wim 0:5037d4be5b6d 24 HID_REPORT report;
wim 0:5037d4be5b6d 25 _t = t;
wim 0:5037d4be5b6d 26 _r = r;
wim 0:5037d4be5b6d 27 _x = x;
wim 0:5037d4be5b6d 28 _y = y;
wim 0:5037d4be5b6d 29 _button = button;
wim 0:5037d4be5b6d 30 _hat = hat;
wim 0:5037d4be5b6d 31
wim 0:5037d4be5b6d 32 // Fill the report according to the Joystick Descriptor
wim 0:5037d4be5b6d 33 report.data[0] = _t & 0xff;
wim 0:5037d4be5b6d 34 report.data[1] = _r & 0xff;
wim 0:5037d4be5b6d 35 report.data[2] = _x & 0xff;
wim 0:5037d4be5b6d 36 report.data[3] = _y & 0xff;
wim 0:5037d4be5b6d 37 report.data[4] = ((_button & 0x0f) << 4) | (_hat & 0x0f) ;
wim 0:5037d4be5b6d 38 report.length = 5;
wim 0:5037d4be5b6d 39
wim 0:5037d4be5b6d 40 return send(&report);
wim 0:5037d4be5b6d 41 }
wim 0:5037d4be5b6d 42
wim 0:5037d4be5b6d 43 bool USBJoystick::update() {
wim 0:5037d4be5b6d 44 HID_REPORT report;
wim 0:5037d4be5b6d 45
wim 0:5037d4be5b6d 46 // Fill the report according to the Joystick Descriptor
wim 0:5037d4be5b6d 47 report.data[0] = _t & 0xff;
wim 0:5037d4be5b6d 48 report.data[1] = _r & 0xff;
wim 0:5037d4be5b6d 49 report.data[2] = _x & 0xff;
wim 0:5037d4be5b6d 50 report.data[3] = _y & 0xff;
wim 0:5037d4be5b6d 51 report.data[4] = ((_button & 0x0f) << 4) | (_hat & 0x0f) ;
wim 0:5037d4be5b6d 52 report.length = 5;
wim 0:5037d4be5b6d 53
wim 0:5037d4be5b6d 54 return send(&report);
wim 0:5037d4be5b6d 55 }
wim 0:5037d4be5b6d 56
wim 0:5037d4be5b6d 57 bool USBJoystick::throttle(int16_t t) {
wim 0:5037d4be5b6d 58 _t = t;
wim 0:5037d4be5b6d 59 return update();
wim 0:5037d4be5b6d 60 }
wim 0:5037d4be5b6d 61
wim 0:5037d4be5b6d 62 bool USBJoystick::rudder(int16_t r) {
wim 0:5037d4be5b6d 63 _r = r;
wim 0:5037d4be5b6d 64 return update();
wim 0:5037d4be5b6d 65 }
wim 0:5037d4be5b6d 66
wim 0:5037d4be5b6d 67 bool USBJoystick::move(int16_t x, int16_t y) {
wim 0:5037d4be5b6d 68 _x = x;
wim 0:5037d4be5b6d 69 _y = y;
wim 0:5037d4be5b6d 70 return update();
wim 0:5037d4be5b6d 71 }
wim 0:5037d4be5b6d 72
wim 0:5037d4be5b6d 73 bool USBJoystick::button(uint8_t button) {
wim 0:5037d4be5b6d 74 _button = button;
wim 0:5037d4be5b6d 75 return update();
wim 0:5037d4be5b6d 76 }
wim 0:5037d4be5b6d 77
wim 0:5037d4be5b6d 78 bool USBJoystick::hat(uint8_t hat) {
wim 0:5037d4be5b6d 79 _hat = hat;
wim 0:5037d4be5b6d 80 return update();
wim 0:5037d4be5b6d 81 }
wim 0:5037d4be5b6d 82
wim 0:5037d4be5b6d 83
wim 0:5037d4be5b6d 84 void USBJoystick::_init() {
wim 0:5037d4be5b6d 85
wim 0:5037d4be5b6d 86 _t = -127;
wim 0:5037d4be5b6d 87 _r = -127;
wim 0:5037d4be5b6d 88 _x = 0;
wim 0:5037d4be5b6d 89 _y = 0;
wim 0:5037d4be5b6d 90 _button = 0x00;
wim 0:5037d4be5b6d 91 _hat = 0x00;
wim 0:5037d4be5b6d 92 }
wim 0:5037d4be5b6d 93
wim 0:5037d4be5b6d 94
wim 0:5037d4be5b6d 95 uint8_t * USBJoystick::reportDesc() {
wim 0:5037d4be5b6d 96 static uint8_t reportDescriptor[] = {
wim 0:5037d4be5b6d 97
wim 0:5037d4be5b6d 98 USAGE_PAGE(1), 0x01, // Generic Desktop
wim 0:5037d4be5b6d 99 LOGICAL_MINIMUM(1), 0x00, // Logical_Minimum (0)
wim 0:5037d4be5b6d 100 USAGE(1), 0x04, // Usage (Joystick)
wim 0:5037d4be5b6d 101 COLLECTION(1), 0x01, // Application
wim 0:5037d4be5b6d 102 USAGE_PAGE(1), 0x02, // Simulation Controls
wim 0:5037d4be5b6d 103 USAGE(1), 0xBB, // Throttle
wim 0:5037d4be5b6d 104 USAGE(1), 0xBA, // Rudder
wim 0:5037d4be5b6d 105 LOGICAL_MINIMUM(1), 0x81, // -127
wim 0:5037d4be5b6d 106 LOGICAL_MAXIMUM(1), 0x7f, // 127
wim 0:5037d4be5b6d 107 REPORT_SIZE(1), 0x08,
wim 0:5037d4be5b6d 108 REPORT_COUNT(1), 0x02,
wim 0:5037d4be5b6d 109 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 110 USAGE_PAGE(1), 0x01, // Generic Desktop
wim 0:5037d4be5b6d 111 USAGE(1), 0x01, // Usage (Pointer)
wim 0:5037d4be5b6d 112 COLLECTION(1), 0x00, // Physical
wim 0:5037d4be5b6d 113 USAGE(1), 0x30, // X
wim 0:5037d4be5b6d 114 USAGE(1), 0x31, // Y
wim 0:5037d4be5b6d 115 // 8 bit values
wim 0:5037d4be5b6d 116 LOGICAL_MINIMUM(1), 0x81, // -127
wim 0:5037d4be5b6d 117 LOGICAL_MAXIMUM(1), 0x7f, // 127
wim 0:5037d4be5b6d 118 REPORT_SIZE(1), 0x08,
wim 0:5037d4be5b6d 119 REPORT_COUNT(1), 0x02,
wim 0:5037d4be5b6d 120 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 121 // 16 bit values
wim 0:5037d4be5b6d 122 // LOGICAL_MINIMUM(1), 0x00, // 0
wim 0:5037d4be5b6d 123 // LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767
wim 0:5037d4be5b6d 124 // REPORT_SIZE(1), 0x10,
wim 0:5037d4be5b6d 125 // REPORT_COUNT(1), 0x02,
wim 0:5037d4be5b6d 126 // INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 127
wim 0:5037d4be5b6d 128 END_COLLECTION(0),
wim 0:5037d4be5b6d 129 // 4 Position Hat Switch
wim 0:5037d4be5b6d 130 // USAGE(1), 0x39, // Usage (Hat switch)
wim 0:5037d4be5b6d 131 // LOGICAL_MINIMUM(1), 0x00, // 0
wim 0:5037d4be5b6d 132 // LOGICAL_MAXIMUM(1), 0x03, // 3
wim 0:5037d4be5b6d 133 // PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
wim 0:5037d4be5b6d 134 // PHYSICAL_MAXIMUM(2), 0x0E, 0x01, // Physical_Maximum (270)
wim 0:5037d4be5b6d 135 // UNIT(1), 0x14, // Unit (Eng Rot:Angular Pos)
wim 0:5037d4be5b6d 136 // REPORT_SIZE(1), 0x04,
wim 0:5037d4be5b6d 137 // REPORT_COUNT(1), 0x01,
wim 0:5037d4be5b6d 138 // INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 139 // 8 Position Hat Switch
wim 0:5037d4be5b6d 140 USAGE(1), 0x39, // Usage (Hat switch)
wim 0:5037d4be5b6d 141 LOGICAL_MINIMUM(1), 0x00, // 0
wim 0:5037d4be5b6d 142 LOGICAL_MAXIMUM(1), 0x07, // 7
wim 0:5037d4be5b6d 143 PHYSICAL_MINIMUM(1), 0x00, // Physical_Minimum (0)
wim 0:5037d4be5b6d 144 PHYSICAL_MAXIMUM(2), 0x3B, 0x01, // Physical_Maximum (315)
wim 0:5037d4be5b6d 145 UNIT(1), 0x14, // Unit (Eng Rot:Angular Pos)
wim 0:5037d4be5b6d 146 REPORT_SIZE(1), 0x04,
wim 0:5037d4be5b6d 147 REPORT_COUNT(1), 0x01,
wim 0:5037d4be5b6d 148 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 149 //
wim 0:5037d4be5b6d 150 USAGE_PAGE(1), 0x09, // Buttons
wim 0:5037d4be5b6d 151 USAGE_MINIMUM(1), 0x01, // 1
wim 0:5037d4be5b6d 152 USAGE_MAXIMUM(1), 0x04, // 4
wim 0:5037d4be5b6d 153 LOGICAL_MINIMUM(1), 0x00, // 0
wim 0:5037d4be5b6d 154 LOGICAL_MAXIMUM(1), 0x01, // 1
wim 0:5037d4be5b6d 155 REPORT_SIZE(1), 0x01,
wim 0:5037d4be5b6d 156 REPORT_COUNT(1), 0x04,
wim 0:5037d4be5b6d 157 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
wim 0:5037d4be5b6d 158 UNIT(1), 0x00, // Unit (None)
wim 0:5037d4be5b6d 159 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 160 END_COLLECTION(0)
wim 0:5037d4be5b6d 161
wim 0:5037d4be5b6d 162 };
wim 0:5037d4be5b6d 163
wim 0:5037d4be5b6d 164 reportLength = sizeof(reportDescriptor);
wim 0:5037d4be5b6d 165 return reportDescriptor;
wim 0:5037d4be5b6d 166 }
wim 0:5037d4be5b6d 167
wim 0:5037d4be5b6d 168