Initial for Condor Simulator

Dependents:   USBJoystick_2 USBJoystick_NEW

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sun Jul 22 10:34:23 2018 +0000
Revision:
1:92574cf6e9af
Parent:
0:e086541742c3
Child:
2:265e03bf82af
Initial

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