Initial for Condor Simulator

Dependents:   USBJoystick_2 USBJoystick_NEW

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sat Sep 29 09:27:44 2018 +0000
Revision:
4:71835900760f
Parent:
3:550cca870c98
Child:
5:fa0a30d0ef3d
Descriptor Bug fixes

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 4:71835900760f 34 /*
Cirrus01 4:71835900760f 35 #define SBYTE 0 // 1 Byte, 8 Bit Resolution
Cirrus01 4:71835900760f 36 #define SWORD 1 // 2 Byte, 16 Bit Resolution
Cirrus01 4:71835900760f 37 */
Cirrus01 2:265e03bf82af 38 //Configure Joystick Hat Buttons
Cirrus01 2:265e03bf82af 39 #define HAT4 1 // 4 Hat Buttons; 4 Positions if HAT4_8 = 0
Cirrus01 3:550cca870c98 40 #define HAT4_8 1 // 4 Hat Buttons giving 8 Positions if 1; DO NOT USE WITH HAT8!
Cirrus01 1:92574cf6e9af 41 #define HAT8 0
wim 0:e086541742c3 42
Cirrus01 2:265e03bf82af 43 //Configure Joystick Buttons
wim 0:e086541742c3 44 #define BUTTONS4 0
wim 0:e086541742c3 45 #define BUTTONS8 0
wim 0:e086541742c3 46 #define BUTTONS32 1
wim 0:e086541742c3 47
wim 0:e086541742c3 48
wim 0:e086541742c3 49 /* Common usage */
wim 0:e086541742c3 50 enum JOY_BUTTON {
Cirrus01 1:92574cf6e9af 51 JOY_B0 = 1,
Cirrus01 1:92574cf6e9af 52 JOY_B1 = 2,
Cirrus01 1:92574cf6e9af 53 JOY_B2 = 4,
Cirrus01 1:92574cf6e9af 54 JOY_B3 = 8,
wim 0:e086541742c3 55 };
wim 0:e086541742c3 56
Cirrus01 2:265e03bf82af 57 #if (HAT4 == 1 && HAT4_8 == 0)
wim 0:e086541742c3 58 enum JOY_HAT {
Cirrus01 1:92574cf6e9af 59 JOY_HAT_UP = 0,
Cirrus01 1:92574cf6e9af 60 JOY_HAT_RIGHT = 1,
Cirrus01 1:92574cf6e9af 61 JOY_HAT_DOWN = 2,
Cirrus01 1:92574cf6e9af 62 JOY_HAT_LEFT = 3,
Cirrus01 1:92574cf6e9af 63 JOY_HAT_NEUTRAL = 4,
wim 0:e086541742c3 64 };
wim 0:e086541742c3 65 #endif
Cirrus01 2:265e03bf82af 66 #if (HAT8 == 1 || (HAT4 == 1 && HAT4_8 == 1))
wim 0:e086541742c3 67 enum JOY_HAT {
Cirrus01 1:92574cf6e9af 68 JOY_HAT_UP = 0,
Cirrus01 1:92574cf6e9af 69 JOY_HAT_UP_RIGHT = 1,
Cirrus01 1:92574cf6e9af 70 JOY_HAT_RIGHT = 2,
Cirrus01 2:265e03bf82af 71 JOY_HAT_DOWN_RIGHT = 3,
Cirrus01 1:92574cf6e9af 72 JOY_HAT_DOWN = 4,
Cirrus01 1:92574cf6e9af 73 JOY_HAT_DOWN_LEFT = 5,
Cirrus01 1:92574cf6e9af 74 JOY_HAT_LEFT = 6,
Cirrus01 2:265e03bf82af 75 JOY_HAT_UP_LEFT = 7,
Cirrus01 1:92574cf6e9af 76 JOY_HAT_NEUTRAL = 8,
wim 0:e086541742c3 77 };
wim 0:e086541742c3 78 #endif
wim 0:e086541742c3 79
Cirrus01 4:71835900760f 80 /* Limits */
wim 0:e086541742c3 81 /* These values do not directly map to screen pixels */
wim 0:e086541742c3 82 /* Zero may be interpreted as meaning 'no movement' */
Cirrus01 4:71835900760f 83 #if (SBYTE == 1)
Cirrus01 4:71835900760f 84 #define MIN_ABS (-127) /*!< The maximum value */
Cirrus01 4:71835900760f 85 #define MAX_ABS (127) /*!< The maximum value */
Cirrus01 4:71835900760f 86 #endif
Cirrus01 4:71835900760f 87 #if (SWORD == 1)
Cirrus01 4:71835900760f 88 #define MIN_ABS (-32767) /*!< The maximum value */
Cirrus01 4:71835900760f 89 #define MAX_ABS (32767) /*!< The maximum value */
Cirrus01 4:71835900760f 90 #endif
wim 0:e086541742c3 91 /**
wim 0:e086541742c3 92 *
wim 0:e086541742c3 93 * USBJoystick example
wim 0:e086541742c3 94 * @code
wim 0:e086541742c3 95 * #include "mbed.h"
wim 0:e086541742c3 96 * #include "USBJoystick.h"
wim 0:e086541742c3 97 *
wim 0:e086541742c3 98 * USBJoystick joystick;
wim 0:e086541742c3 99 *
wim 0:e086541742c3 100 * int main(void)
wim 0:e086541742c3 101 * {
wim 0:e086541742c3 102 * while (1)
wim 0:e086541742c3 103 * {
wim 0:e086541742c3 104 * joystick.move(20, 0);
wim 0:e086541742c3 105 * wait(0.5);
wim 0:e086541742c3 106 * }
wim 0:e086541742c3 107 * }
wim 0:e086541742c3 108 *
wim 0:e086541742c3 109 * @endcode
wim 0:e086541742c3 110 *
wim 0:e086541742c3 111 *
wim 0:e086541742c3 112 * @code
wim 0:e086541742c3 113 * #include "mbed.h"
wim 0:e086541742c3 114 * #include "USBJoystick.h"
wim 0:e086541742c3 115 *
wim 0:e086541742c3 116 * USBJoystick joystick;
wim 0:e086541742c3 117 *
wim 0:e086541742c3 118 * int main(void) {
wim 0:e086541742c3 119 * uint16_t i = 0;
wim 0:e086541742c3 120 * int16_t throttle = 0;
Cirrus01 1:92574cf6e9af 121 * int16_t rudder = 0;
wim 0:e086541742c3 122 * int16_t x = 0;
wim 0:e086541742c3 123 * int16_t y = 0;
wim 0:e086541742c3 124 * int32_t radius = 120;
wim 0:e086541742c3 125 * int32_t angle = 0;
Cirrus01 1:92574cf6e9af 126 * uint32_t buttons = 0;
Cirrus01 1:92574cf6e9af 127 * uint8_t hat = 0;
Cirrus01 1:92574cf6e9af 128 *
wim 0:e086541742c3 129 * while (1) {
wim 0:e086541742c3 130 * // Basic Joystick
wim 0:e086541742c3 131 * throttle = (i >> 8) & 0xFF; // value -127 .. 128
Cirrus01 1:92574cf6e9af 132 * rudder = (i >> 8) & 0xFF; // value -127 .. 128
Cirrus01 1:92574cf6e9af 133 * buttons = (i >> 8) & 0x0F; // value 0 .. 15, one bit per button
Cirrus01 1:92574cf6e9af 134 * hat = (i >> 8) & 0x07; // value 0 .. 7 or 8 for neutral
Cirrus01 1:92574cf6e9af 135 * i++;
Cirrus01 1:92574cf6e9af 136 *
wim 0:e086541742c3 137 * x = cos((double)angle*3.14/180.0)*radius; // value -127 .. 128
wim 0:e086541742c3 138 * y = sin((double)angle*3.14/180.0)*radius; // value -127 .. 128
Cirrus01 1:92574cf6e9af 139 * angle += 3;
wim 0:e086541742c3 140 *
wim 0:e086541742c3 141 * joystick.update(throttle, rudder, x, y, buttons, hat);
wim 0:e086541742c3 142 *
wim 0:e086541742c3 143 * wait(0.001);
wim 0:e086541742c3 144 * }
wim 0:e086541742c3 145 * }
wim 0:e086541742c3 146 * @endcode
wim 0:e086541742c3 147 */
wim 0:e086541742c3 148
wim 0:e086541742c3 149
Cirrus01 1:92574cf6e9af 150 class USBJoystick: public USBHID
Cirrus01 1:92574cf6e9af 151 {
Cirrus01 1:92574cf6e9af 152 public:
wim 0:e086541742c3 153
Cirrus01 1:92574cf6e9af 154 /**
Cirrus01 1:92574cf6e9af 155 * Constructor
Cirrus01 1:92574cf6e9af 156 *
Cirrus01 1:92574cf6e9af 157 * @param vendor_id Your vendor_id (default: 0x1234)
Cirrus01 2:265e03bf82af 158 * @param product_id Your product_id (default: 0x0604)
Cirrus01 1:92574cf6e9af 159 * @param product_release Your product_release (default: 0x0001)
Cirrus01 1:92574cf6e9af 160 */
wim 0:e086541742c3 161 // 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 162 // 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 163 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 164 USBHID(0, 0, vendor_id, product_id, product_release, false) {
Cirrus01 1:92574cf6e9af 165 _init();
Cirrus01 1:92574cf6e9af 166 connect(waitForConnect);
Cirrus01 1:92574cf6e9af 167 };
Cirrus01 1:92574cf6e9af 168
Cirrus01 1:92574cf6e9af 169 /**
Cirrus01 1:92574cf6e9af 170 * Write state of the joystick
Cirrus01 1:92574cf6e9af 171 *
Cirrus01 1:92574cf6e9af 172 * @param x x-axis position
Cirrus01 1:92574cf6e9af 173 * @param y y-axis position
Cirrus01 4:71835900760f 174 * @param b break position
Cirrus01 4:71835900760f 175 * @param f flaps position
Cirrus01 4:71835900760f 176 * @param r rudder position
Cirrus01 4:71835900760f 177 * @param t throttle position
Cirrus01 4:71835900760f 178 * @param hat hat state 0 (up), 1 (up right), 2 (right), 3 (down right), 4 (down), 5 (down left), 6 (left), 7 (up left) or 8 (neutral)
Cirrus01 1:92574cf6e9af 179 * @param buttons buttons state
Cirrus01 1:92574cf6e9af 180 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 181 */
Cirrus01 4:71835900760f 182 bool update(uint16_t x, uint16_t y, uint16_t b, uint16_t f, uint16_t r, uint16_t t, uint8_t hat, uint32_t buttons);
Cirrus01 1:92574cf6e9af 183
Cirrus01 1:92574cf6e9af 184 /**
Cirrus01 1:92574cf6e9af 185 * Write state of the joystick
Cirrus01 1:92574cf6e9af 186 *
Cirrus01 1:92574cf6e9af 187 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 188 */
Cirrus01 1:92574cf6e9af 189 bool update();
wim 0:e086541742c3 190
Cirrus01 1:92574cf6e9af 191 /**
Cirrus01 1:92574cf6e9af 192 * Move the throttle position
Cirrus01 1:92574cf6e9af 193 *
Cirrus01 1:92574cf6e9af 194 * @param t throttle position
Cirrus01 1:92574cf6e9af 195 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 196 */
Cirrus01 4:71835900760f 197 bool throttle(uint16_t t);
Cirrus01 1:92574cf6e9af 198
Cirrus01 1:92574cf6e9af 199 /**
Cirrus01 1:92574cf6e9af 200 * Move the rudder position
Cirrus01 1:92574cf6e9af 201 *
Cirrus01 1:92574cf6e9af 202 * @param r rudder position
Cirrus01 1:92574cf6e9af 203 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 204 */
Cirrus01 4:71835900760f 205 bool rudder(uint16_t r);
Cirrus01 1:92574cf6e9af 206
Cirrus01 1:92574cf6e9af 207 /**
Cirrus01 1:92574cf6e9af 208 * Move the dive break position
Cirrus01 1:92574cf6e9af 209 *
Cirrus01 4:71835900760f 210 * @param b break position
Cirrus01 1:92574cf6e9af 211 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 212 */
Cirrus01 4:71835900760f 213 bool diveBreak(uint16_t b);
Cirrus01 1:92574cf6e9af 214
wim 0:e086541742c3 215 /**
Cirrus01 1:92574cf6e9af 216 * Move the flaps position
wim 0:e086541742c3 217 *
Cirrus01 4:71835900760f 218 * @param f flaps position
wim 0:e086541742c3 219 * @returns true if there is no error, false otherwise
wim 0:e086541742c3 220 */
Cirrus01 4:71835900760f 221 bool flaps(uint16_t f);
Cirrus01 1:92574cf6e9af 222
Cirrus01 1:92574cf6e9af 223
Cirrus01 1:92574cf6e9af 224 /**
Cirrus01 1:92574cf6e9af 225 * Move the cursor to (x, y)
Cirrus01 1:92574cf6e9af 226 *
Cirrus01 1:92574cf6e9af 227 * @param x-axis position
Cirrus01 1:92574cf6e9af 228 * @param y-axis position
Cirrus01 1:92574cf6e9af 229 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 230 */
Cirrus01 4:71835900760f 231 bool move(uint16_t x, uint16_t y);
Cirrus01 1:92574cf6e9af 232
Cirrus01 1:92574cf6e9af 233 /**
Cirrus01 1:92574cf6e9af 234 * Press one or several buttons
Cirrus01 1:92574cf6e9af 235 *
Cirrus01 1:92574cf6e9af 236 * @param buttons buttons state
Cirrus01 1:92574cf6e9af 237 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 238 */
Cirrus01 1:92574cf6e9af 239 bool buttons(uint32_t buttons);
wim 0:e086541742c3 240
Cirrus01 1:92574cf6e9af 241 /**
Cirrus01 1:92574cf6e9af 242 * Press hat
Cirrus01 1:92574cf6e9af 243 *
Cirrus01 1:92574cf6e9af 244 * @param hat hat state
Cirrus01 1:92574cf6e9af 245 * @returns true if there is no error, false otherwise
Cirrus01 1:92574cf6e9af 246 */
Cirrus01 1:92574cf6e9af 247 bool hat(uint8_t hat);
wim 0:e086541742c3 248
Cirrus01 1:92574cf6e9af 249 /**
Cirrus01 1:92574cf6e9af 250 * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
Cirrus01 1:92574cf6e9af 251 *
Cirrus01 1:92574cf6e9af 252 * @returns pointer to the report descriptor
Cirrus01 1:92574cf6e9af 253 */
Cirrus01 1:92574cf6e9af 254 virtual uint8_t * reportDesc();
Cirrus01 1:92574cf6e9af 255
Cirrus01 1:92574cf6e9af 256 private:
Cirrus01 4:71835900760f 257 uint16_t _x;
Cirrus01 4:71835900760f 258 uint16_t _y;
Cirrus01 4:71835900760f 259 uint16_t _b;
Cirrus01 4:71835900760f 260 uint16_t _f;
Cirrus01 4:71835900760f 261 uint16_t _r;
Cirrus01 4:71835900760f 262 uint16_t _t;
Cirrus01 4:71835900760f 263 uint8_t _hat;
Cirrus01 1:92574cf6e9af 264 uint32_t _buttons;
Cirrus01 1:92574cf6e9af 265
Cirrus01 1:92574cf6e9af 266 void _init();
wim 0:e086541742c3 267 };
wim 0:e086541742c3 268
wim 0:e086541742c3 269 #endif