USB device stack

Fork of USBDevice by mbed official

Committer:
nikitamere
Date:
Fri Sep 16 01:03:54 2016 +0000
Revision:
66:b6940e641a15
Parent:
65:e64cf9f9c595
Modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikitamere 64:e01add7a9b25 1 /* USBJoystick.h */
nikitamere 64:e01add7a9b25 2 /* USB device example: Joystick*/
nikitamere 64:e01add7a9b25 3 /* Copyright (c) 2011 ARM Limited. All rights reserved. */
nikitamere 64:e01add7a9b25 4 /* Modified Mouse code for Joystick - WH 2012 */
nikitamere 64:e01add7a9b25 5
nikitamere 64:e01add7a9b25 6 #ifndef USBJOYSTICK_H
nikitamere 64:e01add7a9b25 7 #define USBJOYSTICK_H
nikitamere 64:e01add7a9b25 8
nikitamere 64:e01add7a9b25 9 #include "USBHID.h"
nikitamere 64:e01add7a9b25 10
nikitamere 64:e01add7a9b25 11 #define REPORT_ID_JOYSTICK 4
nikitamere 64:e01add7a9b25 12
nikitamere 64:e01add7a9b25 13 /* Common usage */
nikitamere 64:e01add7a9b25 14 enum JOY_BUTTON {
nikitamere 64:e01add7a9b25 15 JOY_B0 = 1,
nikitamere 64:e01add7a9b25 16 JOY_B1 = 2,
nikitamere 64:e01add7a9b25 17 JOY_B2 = 4,
nikitamere 64:e01add7a9b25 18 JOY_B3 = 8,
nikitamere 64:e01add7a9b25 19 };
nikitamere 64:e01add7a9b25 20
nikitamere 64:e01add7a9b25 21 #if(0)
nikitamere 64:e01add7a9b25 22 enum JOY_HAT {
nikitamere 64:e01add7a9b25 23 JOY_HAT_UP = 0,
nikitamere 64:e01add7a9b25 24 JOY_HAT_RIGHT = 1,
nikitamere 64:e01add7a9b25 25 JOY_HAT_DOWN = 2,
nikitamere 64:e01add7a9b25 26 JOY_HAT_LEFT = 3,
nikitamere 64:e01add7a9b25 27 JOY_HAT_NEUTRAL = 4,
nikitamere 64:e01add7a9b25 28 };
nikitamere 64:e01add7a9b25 29 #else
nikitamere 64:e01add7a9b25 30 enum JOY_HAT {
nikitamere 64:e01add7a9b25 31 JOY_HAT_UP = 0,
nikitamere 64:e01add7a9b25 32 JOY_HAT_UP_RIGHT = 1,
nikitamere 64:e01add7a9b25 33 JOY_HAT_RIGHT = 2,
nikitamere 64:e01add7a9b25 34 JOY_HAT_RIGHT_DOWN = 3,
nikitamere 64:e01add7a9b25 35 JOY_HAT_DOWN = 4,
nikitamere 64:e01add7a9b25 36 JOY_HAT_DOWN_LEFT = 5,
nikitamere 64:e01add7a9b25 37 JOY_HAT_LEFT = 6,
nikitamere 64:e01add7a9b25 38 JOY_HAT_LEFT_UP = 7,
nikitamere 64:e01add7a9b25 39 JOY_HAT_NEUTRAL = 8,
nikitamere 64:e01add7a9b25 40 };
nikitamere 64:e01add7a9b25 41 #endif
nikitamere 64:e01add7a9b25 42
nikitamere 64:e01add7a9b25 43 /* X, Y and T limits */
nikitamere 64:e01add7a9b25 44 /* These values do not directly map to screen pixels */
nikitamere 64:e01add7a9b25 45 /* Zero may be interpreted as meaning 'no movement' */
nikitamere 64:e01add7a9b25 46 #define JX_MIN_ABS (-127) /*!< The maximum value that we can move to the left on the x-axis */
nikitamere 64:e01add7a9b25 47 #define JY_MIN_ABS (-127) /*!< The maximum value that we can move up on the y-axis */
nikitamere 64:e01add7a9b25 48 #define JT_MIN_ABS (-127) /*!< The minimum value for the throttle */
nikitamere 64:e01add7a9b25 49 #define JX_MAX_ABS (127) /*!< The maximum value that we can move to the right on the x-axis */
nikitamere 64:e01add7a9b25 50 #define JY_MAX_ABS (127) /*!< The maximum value that we can move down on the y-axis */
nikitamere 64:e01add7a9b25 51 #define JT_MAX_ABS (127) /*!< The maximum value for the throttle */
nikitamere 64:e01add7a9b25 52
nikitamere 64:e01add7a9b25 53 /**
nikitamere 64:e01add7a9b25 54 *
nikitamere 64:e01add7a9b25 55 * USBJoystick example
nikitamere 64:e01add7a9b25 56 * @code
nikitamere 64:e01add7a9b25 57 * #include "mbed.h"
nikitamere 64:e01add7a9b25 58 * #include "USBJoystick.h"
nikitamere 64:e01add7a9b25 59 *
nikitamere 64:e01add7a9b25 60 * USBJoystick joystick;
nikitamere 64:e01add7a9b25 61 *
nikitamere 64:e01add7a9b25 62 * int main(void)
nikitamere 64:e01add7a9b25 63 * {
nikitamere 64:e01add7a9b25 64 * while (1)
nikitamere 64:e01add7a9b25 65 * {
nikitamere 64:e01add7a9b25 66 * joystick.move(20, 0);
nikitamere 64:e01add7a9b25 67 * wait(0.5);
nikitamere 64:e01add7a9b25 68 * }
nikitamere 64:e01add7a9b25 69 * }
nikitamere 64:e01add7a9b25 70 *
nikitamere 64:e01add7a9b25 71 * @endcode
nikitamere 64:e01add7a9b25 72 *
nikitamere 64:e01add7a9b25 73 *
nikitamere 64:e01add7a9b25 74 * @code
nikitamere 64:e01add7a9b25 75 * #include "mbed.h"
nikitamere 64:e01add7a9b25 76 * #include "USBJoystick.h"
nikitamere 64:e01add7a9b25 77 * #include <math.h>
nikitamere 64:e01add7a9b25 78 *
nikitamere 64:e01add7a9b25 79 * USBJoystick joystick;
nikitamere 64:e01add7a9b25 80 *
nikitamere 64:e01add7a9b25 81 * int main(void)
nikitamere 64:e01add7a9b25 82 * {
nikitamere 64:e01add7a9b25 83 * int16_t i = 0;
nikitamere 64:e01add7a9b25 84 * int16_t throttle = 0;
nikitamere 64:e01add7a9b25 85 * int16_t rudder = 0;
nikitamere 64:e01add7a9b25 86 * int16_t x = 0;
nikitamere 64:e01add7a9b25 87 * int16_t y = 0;
nikitamere 64:e01add7a9b25 88 * int32_t radius = 120;
nikitamere 64:e01add7a9b25 89 * int32_t angle = 0;
nikitamere 64:e01add7a9b25 90 * int8_t button = 0;
nikitamere 64:e01add7a9b25 91 * int8_t hat = 0;
nikitamere 64:e01add7a9b25 92 *
nikitamere 64:e01add7a9b25 93 * while (1) {
nikitamere 64:e01add7a9b25 94 * // Basic Joystick
nikitamere 64:e01add7a9b25 95 * throttle = (i >> 8) & 0xFF; // value -127 .. 128
nikitamere 64:e01add7a9b25 96 * rudder = (i >> 8) & 0xFF; // value -127 .. 128
nikitamere 64:e01add7a9b25 97 * button = (i >> 8) & 0x0F; // value 0 .. 15, one bit per button
nikitamere 64:e01add7a9b25 98 * hat = (i >> 8) & 0x07; // value 0..7 or 8 for neutral
nikitamere 64:e01add7a9b25 99 * i++;
nikitamere 64:e01add7a9b25 100 *
nikitamere 64:e01add7a9b25 101 * x = cos((double)angle*3.14/180.0)*radius; // value -127 .. 128
nikitamere 64:e01add7a9b25 102 * y = sin((double)angle*3.14/180.0)*radius; // value -127 .. 128
nikitamere 64:e01add7a9b25 103 * angle += 3;
nikitamere 64:e01add7a9b25 104 *
nikitamere 64:e01add7a9b25 105 * joystick.update(throttle, rudder, x, y, button, hat);
nikitamere 64:e01add7a9b25 106 *
nikitamere 64:e01add7a9b25 107 * wait(0.001);
nikitamere 64:e01add7a9b25 108 * }
nikitamere 64:e01add7a9b25 109 * }
nikitamere 64:e01add7a9b25 110 * @endcode
nikitamere 64:e01add7a9b25 111 */
nikitamere 64:e01add7a9b25 112
nikitamere 64:e01add7a9b25 113
nikitamere 64:e01add7a9b25 114 class USBJoystick: public USBHID {
nikitamere 64:e01add7a9b25 115 public:
nikitamere 64:e01add7a9b25 116
nikitamere 64:e01add7a9b25 117 /**
nikitamere 64:e01add7a9b25 118 * Constructor
nikitamere 64:e01add7a9b25 119 *
nikitamere 64:e01add7a9b25 120 * @param vendor_id Your vendor_id (default: 0x1234)
nikitamere 64:e01add7a9b25 121 * @param product_id Your product_id (default: 0x0002)
nikitamere 64:e01add7a9b25 122 * @param product_release Your product_release (default: 0x0001)
nikitamere 64:e01add7a9b25 123 */
nikitamere 64:e01add7a9b25 124 USBJoystick(uint16_t vendor_id = 0x1234, uint16_t product_id = 0x0100, uint16_t product_release = 0x0001):
nikitamere 64:e01add7a9b25 125 USBHID(0, 0, vendor_id, product_id, product_release, false)
nikitamere 64:e01add7a9b25 126 {
nikitamere 64:e01add7a9b25 127 _init();
nikitamere 64:e01add7a9b25 128 connect();
nikitamere 64:e01add7a9b25 129 };
nikitamere 64:e01add7a9b25 130
nikitamere 64:e01add7a9b25 131 /**
nikitamere 64:e01add7a9b25 132 * Write a state of the mouse
nikitamere 64:e01add7a9b25 133 *
nikitamere 64:e01add7a9b25 134 * @param t throttle position
nikitamere 64:e01add7a9b25 135 * @param r rudder position
nikitamere 64:e01add7a9b25 136 * @param x x-axis position
nikitamere 64:e01add7a9b25 137 * @param y y-axis position
nikitamere 64:e01add7a9b25 138 * @param buttons buttons state
nikitamere 64:e01add7a9b25 139 * @param hat hat state 0 (up), 1 (right, 2 (down), 3 (left) or 4 (neutral)
nikitamere 64:e01add7a9b25 140 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 141 */
nikitamere 65:e64cf9f9c595 142 bool update(int16_t x, int16_t y, int16_t z, int16_t rx, uint16_t ry, uint16_t rz, uint8_t button);
nikitamere 64:e01add7a9b25 143
nikitamere 64:e01add7a9b25 144 /**
nikitamere 64:e01add7a9b25 145 * Write a state of the mouse
nikitamere 64:e01add7a9b25 146 *
nikitamere 64:e01add7a9b25 147 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 148 */
nikitamere 64:e01add7a9b25 149 bool update();
nikitamere 64:e01add7a9b25 150
nikitamere 64:e01add7a9b25 151 /**
nikitamere 64:e01add7a9b25 152 * Move the throttle position
nikitamere 64:e01add7a9b25 153 *
nikitamere 64:e01add7a9b25 154 * @param t throttle position
nikitamere 64:e01add7a9b25 155 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 156 */
nikitamere 64:e01add7a9b25 157 bool throttle(int16_t t);
nikitamere 64:e01add7a9b25 158
nikitamere 64:e01add7a9b25 159 /**
nikitamere 64:e01add7a9b25 160 * Move the rudder position
nikitamere 64:e01add7a9b25 161 *
nikitamere 64:e01add7a9b25 162 * @param r rudder position
nikitamere 64:e01add7a9b25 163 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 164 */
nikitamere 64:e01add7a9b25 165 bool rudder(int16_t r);
nikitamere 64:e01add7a9b25 166
nikitamere 64:e01add7a9b25 167 /**
nikitamere 64:e01add7a9b25 168 * Move the cursor to (x, y)
nikitamere 64:e01add7a9b25 169 *
nikitamere 64:e01add7a9b25 170 * @param x-axis position
nikitamere 64:e01add7a9b25 171 * @param y-axis position
nikitamere 64:e01add7a9b25 172 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 173 */
nikitamere 64:e01add7a9b25 174 bool move(int16_t x, int16_t y);
nikitamere 64:e01add7a9b25 175
nikitamere 64:e01add7a9b25 176 /**
nikitamere 64:e01add7a9b25 177 * Press one or several buttons
nikitamere 64:e01add7a9b25 178 *
nikitamere 64:e01add7a9b25 179 * @param button button state
nikitamere 64:e01add7a9b25 180 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 181 */
nikitamere 64:e01add7a9b25 182 bool button(uint16_t button);
nikitamere 64:e01add7a9b25 183
nikitamere 64:e01add7a9b25 184 /**
nikitamere 64:e01add7a9b25 185 * Press hat
nikitamere 64:e01add7a9b25 186 *
nikitamere 64:e01add7a9b25 187 * @param hat hat state
nikitamere 64:e01add7a9b25 188 * @returns true if there is no error, false otherwise
nikitamere 64:e01add7a9b25 189 */
nikitamere 64:e01add7a9b25 190 bool hat(uint8_t hat);
nikitamere 64:e01add7a9b25 191
nikitamere 64:e01add7a9b25 192 /*
nikitamere 64:e01add7a9b25 193 * To define the report descriptor. Warning: this method has to store the length of the report descriptor in reportLength.
nikitamere 64:e01add7a9b25 194 *
nikitamere 64:e01add7a9b25 195 * @returns pointer to the report descriptor
nikitamere 64:e01add7a9b25 196 */
nikitamere 64:e01add7a9b25 197 virtual uint8_t * reportDesc();
nikitamere 64:e01add7a9b25 198
nikitamere 65:e64cf9f9c595 199 private:
nikitamere 65:e64cf9f9c595 200 int16_t _x;
nikitamere 65:e64cf9f9c595 201 int16_t _y;
nikitamere 65:e64cf9f9c595 202 int16_t _z;
nikitamere 65:e64cf9f9c595 203 int16_t _rx;
nikitamere 65:e64cf9f9c595 204 int16_t _ry;
nikitamere 65:e64cf9f9c595 205 int16_t _rz;
nikitamere 64:e01add7a9b25 206 uint16_t _button;
nikitamere 65:e64cf9f9c595 207
nikitamere 64:e01add7a9b25 208
nikitamere 64:e01add7a9b25 209 void _init();
nikitamere 64:e01add7a9b25 210 };
nikitamere 64:e01add7a9b25 211
nikitamere 64:e01add7a9b25 212 #endif