WIP conversion from HID to PID

Dependents:   USBJoystick_HelloWorld2_wip

Fork of USBJoystick by Wim Huiskamp

Committer:
Cirrus01
Date:
Sat Jul 07 10:46:53 2018 +0000
Revision:
1:7f1e68e6da0c
Parent:
0:e086541742c3
w/o

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