Arnaud VALLEY / Mbed 2 deprecated Pinscape_Controller_V2_arnoz

Dependencies:   mbed FastIO FastPWM USBDevice

Committer:
mjr
Date:
Sat Dec 19 06:37:19 2015 +0000
Revision:
35:e959ffba78fd
Parent:
33:d832bcab089e
Child:
38:091e511ce8a0
Keyboard/Media Control interface working, but the extra interface confuses the DOF connector.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mjr 0:5acbbe3f4cf4 1 /* USBJoystick.h */
mjr 0:5acbbe3f4cf4 2 /* USB device example: Joystick*/
mjr 0:5acbbe3f4cf4 3 /* Copyright (c) 2011 ARM Limited. All rights reserved. */
mjr 0:5acbbe3f4cf4 4 /* Modified Mouse code for Joystick - WH 2012 */
mjr 0:5acbbe3f4cf4 5
mjr 0:5acbbe3f4cf4 6 #ifndef USBJOYSTICK_H
mjr 0:5acbbe3f4cf4 7 #define USBJOYSTICK_H
mjr 0:5acbbe3f4cf4 8
mjr 0:5acbbe3f4cf4 9 #include "USBHID.h"
mjr 35:e959ffba78fd 10
mjr 35:e959ffba78fd 11 // keyboard interface report IDs
mjr 35:e959ffba78fd 12 const uint8_t REPORT_ID_KB = 1;
mjr 35:e959ffba78fd 13 const uint8_t REPORT_ID_MEDIA = 2;
mjr 35:e959ffba78fd 14
mjr 0:5acbbe3f4cf4 15 /* Common usage */
mjr 0:5acbbe3f4cf4 16 enum JOY_BUTTON {
mjr 0:5acbbe3f4cf4 17 JOY_B0 = 0x0001,
mjr 0:5acbbe3f4cf4 18 JOY_B1 = 0x0002,
mjr 0:5acbbe3f4cf4 19 JOY_B2 = 0x0004,
mjr 0:5acbbe3f4cf4 20 JOY_B3 = 0x0008,
mjr 0:5acbbe3f4cf4 21 JOY_B4 = 0x0010,
mjr 0:5acbbe3f4cf4 22 JOY_B5 = 0x0020,
mjr 0:5acbbe3f4cf4 23 JOY_B6 = 0x0040,
mjr 0:5acbbe3f4cf4 24 JOY_B7 = 0x0080,
mjr 0:5acbbe3f4cf4 25 JOY_B8 = 0x0100,
mjr 0:5acbbe3f4cf4 26 JOY_B9 = 0x0200,
mjr 0:5acbbe3f4cf4 27 JOY_B10 = 0x0400,
mjr 0:5acbbe3f4cf4 28 JOY_B11 = 0x0800,
mjr 0:5acbbe3f4cf4 29 JOY_B12 = 0x1000,
mjr 0:5acbbe3f4cf4 30 JOY_B13 = 0x2000,
mjr 0:5acbbe3f4cf4 31 JOY_B14 = 0x4000,
mjr 0:5acbbe3f4cf4 32 JOY_B15 = 0x8000
mjr 0:5acbbe3f4cf4 33 };
mjr 0:5acbbe3f4cf4 34
mjr 0:5acbbe3f4cf4 35 /* X, Y and T limits */
mjr 0:5acbbe3f4cf4 36 /* These values do not directly map to screen pixels */
mjr 0:5acbbe3f4cf4 37 /* Zero may be interpreted as meaning 'no movement' */
mjr 0:5acbbe3f4cf4 38 #define JX_MIN_ABS (-127) /*!< The maximum value that we can move to the left on the x-axis */
mjr 0:5acbbe3f4cf4 39 #define JY_MIN_ABS (-127) /*!< The maximum value that we can move up on the y-axis */
mjr 0:5acbbe3f4cf4 40 #define JZ_MIN_ABS (-127) /*!< The minimum value for the Z axis */
mjr 0:5acbbe3f4cf4 41 #define JX_MAX_ABS (127) /*!< The maximum value that we can move to the right on the x-axis */
mjr 0:5acbbe3f4cf4 42 #define JY_MAX_ABS (127) /*!< The maximum value that we can move down on the y-axis */
mjr 0:5acbbe3f4cf4 43 #define JZ_MAX_ABS (127) /*!< The maximum value for the Z axis */
mjr 0:5acbbe3f4cf4 44
mjr 0:5acbbe3f4cf4 45 /**
mjr 0:5acbbe3f4cf4 46 *
mjr 0:5acbbe3f4cf4 47 * USBJoystick example
mjr 0:5acbbe3f4cf4 48 * @code
mjr 0:5acbbe3f4cf4 49 * #include "mbed.h"
mjr 0:5acbbe3f4cf4 50 * #include "USBJoystick.h"
mjr 0:5acbbe3f4cf4 51 *
mjr 0:5acbbe3f4cf4 52 * USBJoystick joystick;
mjr 0:5acbbe3f4cf4 53 *
mjr 0:5acbbe3f4cf4 54 * int main(void)
mjr 0:5acbbe3f4cf4 55 * {
mjr 0:5acbbe3f4cf4 56 * while (1)
mjr 0:5acbbe3f4cf4 57 * {
mjr 0:5acbbe3f4cf4 58 * joystick.move(20, 0);
mjr 0:5acbbe3f4cf4 59 * wait(0.5);
mjr 0:5acbbe3f4cf4 60 * }
mjr 0:5acbbe3f4cf4 61 * }
mjr 0:5acbbe3f4cf4 62 *
mjr 0:5acbbe3f4cf4 63 * @endcode
mjr 0:5acbbe3f4cf4 64 *
mjr 0:5acbbe3f4cf4 65 *
mjr 0:5acbbe3f4cf4 66 * @code
mjr 0:5acbbe3f4cf4 67 * #include "mbed.h"
mjr 0:5acbbe3f4cf4 68 * #include "USBJoystick.h"
mjr 0:5acbbe3f4cf4 69 * #include <math.h>
mjr 0:5acbbe3f4cf4 70 *
mjr 0:5acbbe3f4cf4 71 * USBJoystick joystick;
mjr 0:5acbbe3f4cf4 72 *
mjr 0:5acbbe3f4cf4 73 * int main(void)
mjr 0:5acbbe3f4cf4 74 * {
mjr 0:5acbbe3f4cf4 75 * while (1) {
mjr 0:5acbbe3f4cf4 76 * // Basic Joystick
mjr 0:5acbbe3f4cf4 77 * joystick.update(tx, y, z, buttonBits);
mjr 0:5acbbe3f4cf4 78 * wait(0.001);
mjr 0:5acbbe3f4cf4 79 * }
mjr 0:5acbbe3f4cf4 80 * }
mjr 0:5acbbe3f4cf4 81 * @endcode
mjr 0:5acbbe3f4cf4 82 */
mjr 0:5acbbe3f4cf4 83
mjr 0:5acbbe3f4cf4 84
mjr 0:5acbbe3f4cf4 85 class USBJoystick: public USBHID {
mjr 0:5acbbe3f4cf4 86 public:
mjr 0:5acbbe3f4cf4 87
mjr 0:5acbbe3f4cf4 88 /**
mjr 0:5acbbe3f4cf4 89 * Constructor
mjr 0:5acbbe3f4cf4 90 *
mjr 0:5acbbe3f4cf4 91 * @param vendor_id Your vendor_id (default: 0x1234)
mjr 0:5acbbe3f4cf4 92 * @param product_id Your product_id (default: 0x0002)
mjr 0:5acbbe3f4cf4 93 * @param product_release Your product_release (default: 0x0001)
mjr 0:5acbbe3f4cf4 94 */
mjr 35:e959ffba78fd 95 USBJoystick(uint16_t vendor_id, uint16_t product_id, uint16_t product_release,
mjr 35:e959ffba78fd 96 int waitForConnect, bool enableJoystick, bool useKB)
mjr 35:e959ffba78fd 97 : USBHID(16, 64, vendor_id, product_id, product_release, false)
mjr 35:e959ffba78fd 98 {
mjr 35:e959ffba78fd 99 _init();
mjr 35:e959ffba78fd 100 this->useKB = useKB;
mjr 35:e959ffba78fd 101 this->enableJoystick = enableJoystick;
mjr 35:e959ffba78fd 102 connect(waitForConnect);
mjr 35:e959ffba78fd 103 };
mjr 0:5acbbe3f4cf4 104
mjr 0:5acbbe3f4cf4 105 /**
mjr 35:e959ffba78fd 106 * Send a keyboard report. The argument gives the key state, in the standard
mjr 35:e959ffba78fd 107 * 6KRO USB keyboard report format: byte 0 is the modifier key bit mask, byte 1
mjr 35:e959ffba78fd 108 * is reserved (must be 0), and bytes 2-6 are the currently pressed keys, as
mjr 35:e959ffba78fd 109 * USB key codes.
mjr 35:e959ffba78fd 110 */
mjr 35:e959ffba78fd 111 bool kbUpdate(uint8_t data[8]);
mjr 35:e959ffba78fd 112
mjr 35:e959ffba78fd 113 /**
mjr 35:e959ffba78fd 114 * Send a media key update. The argument gives the bit mask of media keys
mjr 35:e959ffba78fd 115 * currently pressed. See the HID report descriptor for the order of bits.
mjr 35:e959ffba78fd 116 */
mjr 35:e959ffba78fd 117 bool mediaUpdate(uint8_t data);
mjr 35:e959ffba78fd 118
mjr 35:e959ffba78fd 119 /**
mjr 35:e959ffba78fd 120 * Update the joystick status
mjr 0:5acbbe3f4cf4 121 *
mjr 0:5acbbe3f4cf4 122 * @param x x-axis position
mjr 0:5acbbe3f4cf4 123 * @param y y-axis position
mjr 0:5acbbe3f4cf4 124 * @param z z-axis position
mjr 0:5acbbe3f4cf4 125 * @param buttons buttons state, as a bit mask (combination with '|' of JOY_Bn values)
mjr 0:5acbbe3f4cf4 126 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 127 */
mjr 11:bd9da7088e6e 128 bool update(int16_t x, int16_t y, int16_t z, uint32_t buttons, uint16_t status);
mjr 10:976666ffa4ef 129
mjr 10:976666ffa4ef 130 /**
mjr 21:5048e16cc9ef 131 * Update just the status
mjr 21:5048e16cc9ef 132 */
mjr 21:5048e16cc9ef 133 bool updateStatus(uint32_t stat);
mjr 21:5048e16cc9ef 134
mjr 21:5048e16cc9ef 135 /**
mjr 10:976666ffa4ef 136 * Write an exposure report. We'll fill out a report with as many pixels as
mjr 10:976666ffa4ef 137 * will fit in the packet, send the report, and update the index to the next
mjr 10:976666ffa4ef 138 * pixel to send. The caller should call this repeatedly to send reports for
mjr 10:976666ffa4ef 139 * all pixels.
mjr 10:976666ffa4ef 140 *
mjr 10:976666ffa4ef 141 * @param idx current index in pixel array, updated to point to next pixel to send
mjr 10:976666ffa4ef 142 * @param npix number of pixels in the overall array
mjr 10:976666ffa4ef 143 * @param pix pixel array
mjr 10:976666ffa4ef 144 */
mjr 10:976666ffa4ef 145 bool updateExposure(int &idx, int npix, const uint16_t *pix);
mjr 33:d832bcab089e 146
mjr 33:d832bcab089e 147 /**
mjr 33:d832bcab089e 148 * Write a configuration report.
mjr 33:d832bcab089e 149 *
mjr 33:d832bcab089e 150 * @param numOutputs the number of configured output channels
mjr 33:d832bcab089e 151 * @param unitNo the device unit number
mjr 33:d832bcab089e 152 */
mjr 35:e959ffba78fd 153 bool reportConfig(int numOutputs, int unitNo, int plungerZero, int plungerMax);
mjr 0:5acbbe3f4cf4 154
mjr 0:5acbbe3f4cf4 155 /**
mjr 35:e959ffba78fd 156 * Send a joystick report to the host
mjr 0:5acbbe3f4cf4 157 *
mjr 0:5acbbe3f4cf4 158 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 159 */
mjr 0:5acbbe3f4cf4 160 bool update();
mjr 9:fd65b0a94720 161
mjr 0:5acbbe3f4cf4 162 /**
mjr 0:5acbbe3f4cf4 163 * Move the cursor to (x, y)
mjr 0:5acbbe3f4cf4 164 *
mjr 0:5acbbe3f4cf4 165 * @param x x-axis position
mjr 0:5acbbe3f4cf4 166 * @param y y-axis position
mjr 0:5acbbe3f4cf4 167 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 168 */
mjr 0:5acbbe3f4cf4 169 bool move(int16_t x, int16_t y);
mjr 0:5acbbe3f4cf4 170
mjr 0:5acbbe3f4cf4 171 /**
mjr 0:5acbbe3f4cf4 172 * Set the z position
mjr 0:5acbbe3f4cf4 173 *
mjr 0:5acbbe3f4cf4 174 * @param z z-axis osition
mjr 0:5acbbe3f4cf4 175 */
mjr 0:5acbbe3f4cf4 176 bool setZ(int16_t z);
mjr 0:5acbbe3f4cf4 177
mjr 0:5acbbe3f4cf4 178 /**
mjr 0:5acbbe3f4cf4 179 * Press one or several buttons
mjr 0:5acbbe3f4cf4 180 *
mjr 0:5acbbe3f4cf4 181 * @param buttons button state, as a bitwise combination of JOY_Bn values
mjr 0:5acbbe3f4cf4 182 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 183 */
mjr 11:bd9da7088e6e 184 bool buttons(uint32_t buttons);
mjr 35:e959ffba78fd 185
mjr 35:e959ffba78fd 186 /* USB descriptor overrides */
mjr 35:e959ffba78fd 187 virtual uint8_t * configurationDesc();
mjr 35:e959ffba78fd 188 virtual uint8_t * reportDescN(int n);
mjr 0:5acbbe3f4cf4 189
mjr 0:5acbbe3f4cf4 190 /* USB descriptor string overrides */
mjr 0:5acbbe3f4cf4 191 virtual uint8_t *stringImanufacturerDesc();
mjr 0:5acbbe3f4cf4 192 virtual uint8_t *stringIserialDesc();
mjr 0:5acbbe3f4cf4 193 virtual uint8_t *stringIproductDesc();
mjr 35:e959ffba78fd 194
mjr 35:e959ffba78fd 195 /* callback overrides */
mjr 35:e959ffba78fd 196 virtual bool USBCallback_setConfiguration(uint8_t configuration);
mjr 35:e959ffba78fd 197 virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate)
mjr 35:e959ffba78fd 198 { return interface == 0 || interface == 1; }
mjr 35:e959ffba78fd 199 virtual bool EP4_OUT_callback();
mjr 0:5acbbe3f4cf4 200
mjr 0:5acbbe3f4cf4 201 private:
mjr 35:e959ffba78fd 202 bool enableJoystick;
mjr 35:e959ffba78fd 203 bool useKB;
mjr 6:cc35eb643e8f 204 int16_t _x;
mjr 6:cc35eb643e8f 205 int16_t _y;
mjr 6:cc35eb643e8f 206 int16_t _z;
mjr 11:bd9da7088e6e 207 uint16_t _buttonsLo;
mjr 11:bd9da7088e6e 208 uint16_t _buttonsHi;
mjr 10:976666ffa4ef 209 uint16_t _status;
mjr 0:5acbbe3f4cf4 210
mjr 0:5acbbe3f4cf4 211 void _init();
mjr 0:5acbbe3f4cf4 212 };
mjr 0:5acbbe3f4cf4 213
mjr 0:5acbbe3f4cf4 214 #endif