Initial for Condor Simulator

Dependents:   USBJoystick_2 USBJoystick_NEW

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sat Sep 15 07:46:30 2018 +0000
Revision:
2:265e03bf82af
Parent:
1:92574cf6e9af
Child:
3:550cca870c98
Hat Switch Bug fixed; - HID Descriptor fixed; - Hat Switch values transleted

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:e086541742c3 1 /* mbed USBJoystick Library
wim 0:e086541742c3 2 * Copyright (c) 2012, v01: Initial version, WH,
wim 0:e086541742c3 3 * Modified USBMouse code ARM Limited.
wim 0:e086541742c3 4 * (c) 2010-2011 mbed.org, MIT License
Cirrus01 1:92574cf6e9af 5 * 2016, v02: Updated USBDevice Lib, Added waitForConnect, Updated 32 bits button
wim 0:e086541742c3 6 *
wim 0:e086541742c3 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
wim 0:e086541742c3 8 * of this software and associated documentation files (the "Software"), to deal
wim 0:e086541742c3 9 * in the Software without restriction, inclumosig without limitation the rights
wim 0:e086541742c3 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
wim 0:e086541742c3 11 * copies of the Software, and to permit persons to whom the Software is
wim 0:e086541742c3 12 * furnished to do so, subject to the following conditions:
wim 0:e086541742c3 13 *
wim 0:e086541742c3 14 * The above copyright notice and this permission notice shall be included in
wim 0:e086541742c3 15 * all copies or substantial portions of the Software.
wim 0:e086541742c3 16 *
wim 0:e086541742c3 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
wim 0:e086541742c3 18 * IMPLIED, INCLUmosiG BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
wim 0:e086541742c3 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
wim 0:e086541742c3 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
wim 0:e086541742c3 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
wim 0:e086541742c3 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
wim 0:e086541742c3 23 * THE SOFTWARE.
wim 0:e086541742c3 24 */
wim 0:e086541742c3 25
wim 0:e086541742c3 26 #ifndef USBJOYSTICK_H
wim 0:e086541742c3 27 #define USBJOYSTICK_H
wim 0:e086541742c3 28
wim 0:e086541742c3 29 #include "USBHID.h"
wim 0:e086541742c3 30
wim 0:e086541742c3 31 #define REPORT_ID_JOYSTICK 4
wim 0:e086541742c3 32
Cirrus01 2:265e03bf82af 33 //Configure Joystick Slider Resolution
Cirrus01 2:265e03bf82af 34 #define SBYTE 1 // 1 Byte, 8 Bit Resolution
Cirrus01 2:265e03bf82af 35 #define SWORD 0 // 2 Byte, 16 Bit Resolution
Cirrus01 2:265e03bf82af 36 //Configure Joystick Hat Buttons
Cirrus01 2:265e03bf82af 37 #define HAT4 1 // 4 Hat Buttons; 4 Positions if HAT4_8 = 0
Cirrus01 2:265e03bf82af 38 #define HAT4_8 0 // 4 Hat Buttons giving 8 Positions if 1; DO NOT USE WITH HAT8!
Cirrus01 1:92574cf6e9af 39 #define HAT8 0
wim 0:e086541742c3 40
Cirrus01 2:265e03bf82af 41 //Configure Joystick Buttons
wim 0:e086541742c3 42 #define BUTTONS4 0
wim 0:e086541742c3 43 #define BUTTONS8 0
wim 0:e086541742c3 44 #define BUTTONS32 1
wim 0:e086541742c3 45
wim 0:e086541742c3 46
wim 0:e086541742c3 47 /* Common usage */
wim 0:e086541742c3 48 enum JOY_BUTTON {
Cirrus01 1:92574cf6e9af 49 JOY_B0 = 1,
Cirrus01 1:92574cf6e9af 50 JOY_B1 = 2,
Cirrus01 1:92574cf6e9af 51 JOY_B2 = 4,
Cirrus01 1:92574cf6e9af 52 JOY_B3 = 8,
wim 0:e086541742c3 53 };
wim 0:e086541742c3 54
Cirrus01 2:265e03bf82af 55 #if (HAT4 == 1 && HAT4_8 == 0)
wim 0:e086541742c3 56 enum JOY_HAT {
Cirrus01 1:92574cf6e9af 57 JOY_HAT_UP = 0,
Cirrus01 1:92574cf6e9af 58 JOY_HAT_RIGHT = 1,
Cirrus01 1:92574cf6e9af 59 JOY_HAT_DOWN = 2,
Cirrus01 1:92574cf6e9af 60 JOY_HAT_LEFT = 3,
Cirrus01 1:92574cf6e9af 61 JOY_HAT_NEUTRAL = 4,
wim 0:e086541742c3 62 };
wim 0:e086541742c3 63 #endif
Cirrus01 2:265e03bf82af 64 #if (HAT8 == 1 || (HAT4 == 1 && HAT4_8 == 1))
wim 0:e086541742c3 65 enum JOY_HAT {
Cirrus01 1:92574cf6e9af 66 JOY_HAT_UP = 0,
Cirrus01 1:92574cf6e9af 67 JOY_HAT_UP_RIGHT = 1,
Cirrus01 1:92574cf6e9af 68 JOY_HAT_RIGHT = 2,
Cirrus01 2:265e03bf82af 69 JOY_HAT_DOWN_RIGHT = 3,
Cirrus01 1:92574cf6e9af 70 JOY_HAT_DOWN = 4,
Cirrus01 1:92574cf6e9af 71 JOY_HAT_DOWN_LEFT = 5,
Cirrus01 1:92574cf6e9af 72 JOY_HAT_LEFT = 6,
Cirrus01 2:265e03bf82af 73 JOY_HAT_UP_LEFT = 7,
Cirrus01 1:92574cf6e9af 74 JOY_HAT_NEUTRAL = 8,
wim 0:e086541742c3 75 };
wim 0:e086541742c3 76 #endif
wim 0:e086541742c3 77
wim 0:e086541742c3 78 /* X, Y and T limits */
wim 0:e086541742c3 79 /* These values do not directly map to screen pixels */
wim 0:e086541742c3 80 /* Zero may be interpreted as meaning 'no movement' */
wim 0:e086541742c3 81 #define JX_MIN_ABS (-127) /*!< The maximum value that we can move to the left on the x-axis */
wim 0:e086541742c3 82 #define JY_MIN_ABS (-127) /*!< The maximum value that we can move up on the y-axis */
wim 0:e086541742c3 83 #define JT_MIN_ABS (-127) /*!< The minimum value for the throttle */
wim 0:e086541742c3 84 #define JX_MAX_ABS (127) /*!< The maximum value that we can move to the right on the x-axis */
wim 0:e086541742c3 85 #define JY_MAX_ABS (127) /*!< The maximum value that we can move down on the y-axis */
wim 0:e086541742c3 86 #define JT_MAX_ABS (127) /*!< The maximum value for the throttle */
wim 0:e086541742c3 87
wim 0:e086541742c3 88 /**
wim 0:e086541742c3 89 *
wim 0:e086541742c3 90 * USBJoystick example
wim 0:e086541742c3 91 * @code
wim 0:e086541742c3 92 * #include "mbed.h"
wim 0:e086541742c3 93 * #include "USBJoystick.h"
wim 0:e086541742c3 94 *
wim 0:e086541742c3 95 * USBJoystick joystick;
wim 0:e086541742c3 96 *
wim 0:e086541742c3 97 * int main(void)
wim 0:e086541742c3 98 * {
wim 0:e086541742c3 99 * while (1)
wim 0:e086541742c3 100 * {
wim 0:e086541742c3 101 * joystick.move(20, 0);
wim 0:e086541742c3 102 * wait(0.5);
wim 0:e086541742c3 103 * }
wim 0:e086541742c3 104 * }
wim 0:e086541742c3 105 *
wim 0:e086541742c3 106 * @endcode
wim 0:e086541742c3 107 *
wim 0:e086541742c3 108 *
wim 0:e086541742c3 109 * @code
wim 0:e086541742c3 110 * #include "mbed.h"
wim 0:e086541742c3 111 * #include "USBJoystick.h"
wim 0:e086541742c3 112 *
wim 0:e086541742c3 113 * USBJoystick joystick;
wim 0:e086541742c3 114 *
wim 0:e086541742c3 115 * int main(void) {
wim 0:e086541742c3 116 * uint16_t i = 0;
wim 0:e086541742c3 117 * int16_t throttle = 0;
Cirrus01 1:92574cf6e9af 118 * int16_t rudder = 0;
wim 0:e086541742c3 119 * int16_t x = 0;
wim 0:e086541742c3 120 * int16_t y = 0;
wim 0:e086541742c3 121 * int32_t radius = 120;
wim 0:e086541742c3 122 * int32_t angle = 0;
Cirrus01 1:92574cf6e9af 123 * uint32_t buttons = 0;
Cirrus01 1:92574cf6e9af 124 * uint8_t hat = 0;
Cirrus01 1:92574cf6e9af 125 *
wim 0:e086541742c3 126 * while (1) {
wim 0:e086541742c3 127 * // Basic Joystick
wim 0:e086541742c3 128 * throttle = (i >> 8) & 0xFF; // value -127 .. 128
Cirrus01 1:92574cf6e9af 129 * rudder = (i >> 8) & 0xFF; // value -127 .. 128
Cirrus01 1:92574cf6e9af 130 * buttons = (i >> 8) & 0x0F; // value 0 .. 15, one bit per button
Cirrus01 1:92574cf6e9af 131 * hat = (i >> 8) & 0x07; // value 0 .. 7 or 8 for neutral
Cirrus01 1:92574cf6e9af 132 * i++;
Cirrus01 1:92574cf6e9af 133 *
wim 0:e086541742c3 134 * x = cos((double)angle*3.14/180.0)*radius; // value -127 .. 128
wim 0:e086541742c3 135 * y = sin((double)angle*3.14/180.0)*radius; // value -127 .. 128
Cirrus01 1:92574cf6e9af 136 * angle += 3;
wim 0:e086541742c3 137 *
wim 0:e086541742c3 138 * joystick.update(throttle, rudder, x, y, buttons, hat);
wim 0:e086541742c3 139 *
wim 0:e086541742c3 140 * wait(0.001);
wim 0:e086541742c3 141 * }
wim 0:e086541742c3 142 * }
wim 0:e086541742c3 143 * @endcode
wim 0:e086541742c3 144 */
wim 0:e086541742c3 145
wim 0:e086541742c3 146
Cirrus01 1:92574cf6e9af 147 class USBJoystick: public USBHID
Cirrus01 1:92574cf6e9af 148 {
Cirrus01 1:92574cf6e9af 149 public:
wim 0:e086541742c3 150
Cirrus01 1:92574cf6e9af 151 /**
Cirrus01 1:92574cf6e9af 152 * Constructor
Cirrus01 1:92574cf6e9af 153 *
Cirrus01 1:92574cf6e9af 154 * @param vendor_id Your vendor_id (default: 0x1234)
Cirrus01 2:265e03bf82af 155 * @param product_id Your product_id (default: 0x0604)
Cirrus01 1:92574cf6e9af 156 * @param product_release Your product_release (default: 0x0001)
Cirrus01 1:92574cf6e9af 157 */
wim 0:e086541742c3 158 // USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0100, uint16_t product_release = 0x0001, int waitForConnect = true): // 4 buttons, no padding on buttons
wim 0:e086541742c3 159 // USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0500, uint16_t product_release = 0x0001, int waitForConnect = true): // 8 buttons, no padding on buttons
Cirrus01 1:92574cf6e9af 160 USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0604, uint16_t product_release = 0x0001, int waitForConnect = true): // 32 buttons, no padding on buttons
Cirrus01 1:92574cf6e9af 161 USBHID(0, 0, vendor_id, product_id, product_release, false) {
Cirrus01 1:92574cf6e9af 162 _init();
Cirrus01 1:92574cf6e9af 163 connect(waitForConnect);
Cirrus01 1:92574cf6e9af 164 };
Cirrus01 1:92574cf6e9af 165
Cirrus01 1:92574cf6e9af 166 /**
Cirrus01 1:92574cf6e9af 167 * Write state of the joystick
Cirrus01 1:92574cf6e9af 168 *
Cirrus01 1:92574cf6e9af 169 * @param t throttle position
Cirrus01 1:92574cf6e9af 170 * @param r rudder position
Cirrus01 1:92574cf6e9af 171 * @param x x-axis position
Cirrus01 1:92574cf6e9af 172 * @param y y-axis position
Cirrus01 1:92574cf6e9af 173 * @param buttons buttons state
Cirrus01 1:92574cf6e9af 174 * @param hat hat state 0 (up), 1 (right, 2 (down), 3 (left) or 4 (neutral)
Cirrus01 1:92574cf6e9af 175 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 176 */
Cirrus01 1:92574cf6e9af 177 bool update(int16_t t, int16_t r, int16_t d, int16_t w, int16_t x, int16_t y, uint32_t buttons, uint8_t hat);
Cirrus01 1:92574cf6e9af 178
Cirrus01 1:92574cf6e9af 179 /**
Cirrus01 1:92574cf6e9af 180 * Write state of the joystick
Cirrus01 1:92574cf6e9af 181 *
Cirrus01 1:92574cf6e9af 182 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 183 */
Cirrus01 1:92574cf6e9af 184 bool update();
wim 0:e086541742c3 185
Cirrus01 1:92574cf6e9af 186 /**
Cirrus01 1:92574cf6e9af 187 * Move the throttle position
Cirrus01 1:92574cf6e9af 188 *
Cirrus01 1:92574cf6e9af 189 * @param t throttle position
Cirrus01 1:92574cf6e9af 190 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 191 */
Cirrus01 1:92574cf6e9af 192 bool throttle(int16_t t);
Cirrus01 1:92574cf6e9af 193
Cirrus01 1:92574cf6e9af 194 /**
Cirrus01 1:92574cf6e9af 195 * Move the rudder position
Cirrus01 1:92574cf6e9af 196 *
Cirrus01 1:92574cf6e9af 197 * @param r rudder position
Cirrus01 1:92574cf6e9af 198 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 199 */
Cirrus01 1:92574cf6e9af 200 bool rudder(int16_t r);
Cirrus01 1:92574cf6e9af 201
Cirrus01 1:92574cf6e9af 202 /**
Cirrus01 1:92574cf6e9af 203 * Move the dive break position
Cirrus01 1:92574cf6e9af 204 *
Cirrus01 1:92574cf6e9af 205 * @param d dive break position
Cirrus01 1:92574cf6e9af 206 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 207 */
Cirrus01 1:92574cf6e9af 208 bool diveBreak(int16_t d);
Cirrus01 1:92574cf6e9af 209
wim 0:e086541742c3 210 /**
Cirrus01 1:92574cf6e9af 211 * Move the flaps position
wim 0:e086541742c3 212 *
Cirrus01 1:92574cf6e9af 213 * @param w wing flaps position
wim 0:e086541742c3 214 * @returns true if there is no error, false otherwise
wim 0:e086541742c3 215 */
Cirrus01 1:92574cf6e9af 216 bool flaps(int16_t w);
Cirrus01 1:92574cf6e9af 217
Cirrus01 1:92574cf6e9af 218
Cirrus01 1:92574cf6e9af 219 /**
Cirrus01 1:92574cf6e9af 220 * Move the cursor to (x, y)
Cirrus01 1:92574cf6e9af 221 *
Cirrus01 1:92574cf6e9af 222 * @param x-axis position
Cirrus01 1:92574cf6e9af 223 * @param y-axis position
Cirrus01 1:92574cf6e9af 224 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 225 */
Cirrus01 1:92574cf6e9af 226 bool move(int16_t x, int16_t y);
Cirrus01 1:92574cf6e9af 227
Cirrus01 1:92574cf6e9af 228 /**
Cirrus01 1:92574cf6e9af 229 * Press one or several buttons
Cirrus01 1:92574cf6e9af 230 *
Cirrus01 1:92574cf6e9af 231 * @param buttons buttons state
Cirrus01 1:92574cf6e9af 232 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 233 */
Cirrus01 1:92574cf6e9af 234 bool buttons(uint32_t buttons);
wim 0:e086541742c3 235
Cirrus01 1:92574cf6e9af 236 /**
Cirrus01 1:92574cf6e9af 237 * Press hat
Cirrus01 1:92574cf6e9af 238 *
Cirrus01 1:92574cf6e9af 239 * @param hat hat state
Cirrus01 1:92574cf6e9af 240 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 241 */
Cirrus01 1:92574cf6e9af 242 bool hat(uint8_t hat);
wim 0:e086541742c3 243
Cirrus01 1:92574cf6e9af 244 /**
Cirrus01 1:92574cf6e9af 245 * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
Cirrus01 1:92574cf6e9af 246 *
Cirrus01 1:92574cf6e9af 247 * @returns pointer to the report descriptor
Cirrus01 1:92574cf6e9af 248 */
Cirrus01 1:92574cf6e9af 249 virtual uint8_t * reportDesc();
Cirrus01 1:92574cf6e9af 250
Cirrus01 1:92574cf6e9af 251 private:
Cirrus01 2:265e03bf82af 252 int16_t _t;
Cirrus01 2:265e03bf82af 253 int16_t _r;
Cirrus01 2:265e03bf82af 254 int16_t _d;
Cirrus01 2:265e03bf82af 255 int16_t _w;
Cirrus01 2:265e03bf82af 256 int16_t _x;
Cirrus01 2:265e03bf82af 257 int16_t _y;
Cirrus01 1:92574cf6e9af 258 uint32_t _buttons;
Cirrus01 1:92574cf6e9af 259 uint8_t _hat;
Cirrus01 1:92574cf6e9af 260
Cirrus01 1:92574cf6e9af 261 void _init();
wim 0:e086541742c3 262 };
wim 0:e086541742c3 263
wim 0:e086541742c3 264 #endif