Arnaud VALLEY / Mbed 2 deprecated Pinscape_Controller_V2_arnoz

Dependencies:   mbed FastIO FastPWM USBDevice

Committer:
mjr
Date:
Sat Apr 30 17:43:38 2016 +0000
Revision:
54:fd77a6b2f76c
Parent:
53:9b2611964afc
Child:
62:f071ccde32a0
TLC5940 with SPI DMA setup in interrupt handler (not quite working)

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 39:b3815a1c3802 11 // Bufferd incoming LedWiz message structure
mjr 38:091e511ce8a0 12 struct LedWizMsg
mjr 38:091e511ce8a0 13 {
mjr 38:091e511ce8a0 14 uint8_t data[8];
mjr 38:091e511ce8a0 15 };
mjr 38:091e511ce8a0 16
mjr 39:b3815a1c3802 17 // Circular buffer for incoming reports. We write reports in the IRQ
mjr 39:b3815a1c3802 18 // handler, and we read reports in the main loop in normal application
mjr 39:b3815a1c3802 19 // (non-IRQ) context.
mjr 39:b3815a1c3802 20 //
mjr 39:b3815a1c3802 21 // The design is organically safe for IRQ threading; there are no critical
mjr 39:b3815a1c3802 22 // sections. The IRQ context has exclusive access to the write pointer,
mjr 39:b3815a1c3802 23 // and the application context has exclusive access to the read pointer,
mjr 39:b3815a1c3802 24 // so there are no test-and-set or read-and-modify race conditions.
mjr 38:091e511ce8a0 25 template<class T, int cnt> class CircBuf
mjr 38:091e511ce8a0 26 {
mjr 38:091e511ce8a0 27 public:
mjr 38:091e511ce8a0 28 CircBuf()
mjr 38:091e511ce8a0 29 {
mjr 38:091e511ce8a0 30 iRead = iWrite = 0;
mjr 38:091e511ce8a0 31 }
mjr 38:091e511ce8a0 32
mjr 38:091e511ce8a0 33 // Read an item from the buffer. Returns true if an item was available,
mjr 39:b3815a1c3802 34 // false if the buffer was empty. (Called in the main loop, in application
mjr 39:b3815a1c3802 35 // context.)
mjr 38:091e511ce8a0 36 bool read(T &result)
mjr 38:091e511ce8a0 37 {
mjr 38:091e511ce8a0 38 if (iRead != iWrite)
mjr 38:091e511ce8a0 39 {
mjr 39:b3815a1c3802 40 //{uint8_t *d = buf[iRead].data; printf("circ read [%02x %02x %02x %02x %02x %02x %02x %02x]\r\n", d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7]);}
mjr 38:091e511ce8a0 41 memcpy(&result, &buf[iRead], sizeof(T));
mjr 38:091e511ce8a0 42 iRead = advance(iRead);
mjr 38:091e511ce8a0 43 return true;
mjr 38:091e511ce8a0 44 }
mjr 38:091e511ce8a0 45 else
mjr 38:091e511ce8a0 46 return false;
mjr 38:091e511ce8a0 47 }
mjr 38:091e511ce8a0 48
mjr 39:b3815a1c3802 49 // Write an item to the buffer. (Called in the IRQ handler, in interrupt
mjr 39:b3815a1c3802 50 // context.)
mjr 38:091e511ce8a0 51 bool write(const T &item)
mjr 38:091e511ce8a0 52 {
mjr 38:091e511ce8a0 53 int nxt = advance(iWrite);
mjr 38:091e511ce8a0 54 if (nxt != iRead)
mjr 38:091e511ce8a0 55 {
mjr 39:b3815a1c3802 56 memcpy(&buf[iWrite], &item, sizeof(T));
mjr 38:091e511ce8a0 57 iWrite = nxt;
mjr 38:091e511ce8a0 58 return true;
mjr 38:091e511ce8a0 59 }
mjr 38:091e511ce8a0 60 else
mjr 38:091e511ce8a0 61 return false;
mjr 38:091e511ce8a0 62 }
mjr 38:091e511ce8a0 63
mjr 38:091e511ce8a0 64 private:
mjr 38:091e511ce8a0 65 int advance(int i)
mjr 38:091e511ce8a0 66 {
mjr 39:b3815a1c3802 67 ++i;
mjr 39:b3815a1c3802 68 return i < cnt ? i : 0;
mjr 38:091e511ce8a0 69 }
mjr 38:091e511ce8a0 70
mjr 38:091e511ce8a0 71 int iRead;
mjr 38:091e511ce8a0 72 int iWrite;
mjr 38:091e511ce8a0 73 T buf[cnt];
mjr 38:091e511ce8a0 74 };
mjr 38:091e511ce8a0 75
mjr 39:b3815a1c3802 76 // interface IDs
mjr 39:b3815a1c3802 77 const uint8_t IFC_ID_JS = 0; // joystick + LedWiz interface
mjr 39:b3815a1c3802 78 const uint8_t IFC_ID_KB = 1; // keyboard interface
mjr 39:b3815a1c3802 79
mjr 35:e959ffba78fd 80 // keyboard interface report IDs
mjr 35:e959ffba78fd 81 const uint8_t REPORT_ID_KB = 1;
mjr 35:e959ffba78fd 82 const uint8_t REPORT_ID_MEDIA = 2;
mjr 35:e959ffba78fd 83
mjr 0:5acbbe3f4cf4 84 /* Common usage */
mjr 0:5acbbe3f4cf4 85 enum JOY_BUTTON {
mjr 0:5acbbe3f4cf4 86 JOY_B0 = 0x0001,
mjr 0:5acbbe3f4cf4 87 JOY_B1 = 0x0002,
mjr 0:5acbbe3f4cf4 88 JOY_B2 = 0x0004,
mjr 0:5acbbe3f4cf4 89 JOY_B3 = 0x0008,
mjr 0:5acbbe3f4cf4 90 JOY_B4 = 0x0010,
mjr 0:5acbbe3f4cf4 91 JOY_B5 = 0x0020,
mjr 0:5acbbe3f4cf4 92 JOY_B6 = 0x0040,
mjr 0:5acbbe3f4cf4 93 JOY_B7 = 0x0080,
mjr 0:5acbbe3f4cf4 94 JOY_B8 = 0x0100,
mjr 0:5acbbe3f4cf4 95 JOY_B9 = 0x0200,
mjr 0:5acbbe3f4cf4 96 JOY_B10 = 0x0400,
mjr 0:5acbbe3f4cf4 97 JOY_B11 = 0x0800,
mjr 0:5acbbe3f4cf4 98 JOY_B12 = 0x1000,
mjr 0:5acbbe3f4cf4 99 JOY_B13 = 0x2000,
mjr 0:5acbbe3f4cf4 100 JOY_B14 = 0x4000,
mjr 0:5acbbe3f4cf4 101 JOY_B15 = 0x8000
mjr 0:5acbbe3f4cf4 102 };
mjr 0:5acbbe3f4cf4 103
mjr 0:5acbbe3f4cf4 104 /* X, Y and T limits */
mjr 0:5acbbe3f4cf4 105 /* These values do not directly map to screen pixels */
mjr 0:5acbbe3f4cf4 106 /* Zero may be interpreted as meaning 'no movement' */
mjr 0:5acbbe3f4cf4 107 #define JX_MIN_ABS (-127) /*!< The maximum value that we can move to the left on the x-axis */
mjr 0:5acbbe3f4cf4 108 #define JY_MIN_ABS (-127) /*!< The maximum value that we can move up on the y-axis */
mjr 0:5acbbe3f4cf4 109 #define JZ_MIN_ABS (-127) /*!< The minimum value for the Z axis */
mjr 0:5acbbe3f4cf4 110 #define JX_MAX_ABS (127) /*!< The maximum value that we can move to the right on the x-axis */
mjr 0:5acbbe3f4cf4 111 #define JY_MAX_ABS (127) /*!< The maximum value that we can move down on the y-axis */
mjr 0:5acbbe3f4cf4 112 #define JZ_MAX_ABS (127) /*!< The maximum value for the Z axis */
mjr 0:5acbbe3f4cf4 113
mjr 0:5acbbe3f4cf4 114 /**
mjr 0:5acbbe3f4cf4 115 *
mjr 0:5acbbe3f4cf4 116 * USBJoystick example
mjr 0:5acbbe3f4cf4 117 * @code
mjr 0:5acbbe3f4cf4 118 * #include "mbed.h"
mjr 0:5acbbe3f4cf4 119 * #include "USBJoystick.h"
mjr 0:5acbbe3f4cf4 120 *
mjr 0:5acbbe3f4cf4 121 * USBJoystick joystick;
mjr 0:5acbbe3f4cf4 122 *
mjr 0:5acbbe3f4cf4 123 * int main(void)
mjr 0:5acbbe3f4cf4 124 * {
mjr 0:5acbbe3f4cf4 125 * while (1)
mjr 0:5acbbe3f4cf4 126 * {
mjr 0:5acbbe3f4cf4 127 * joystick.move(20, 0);
mjr 0:5acbbe3f4cf4 128 * wait(0.5);
mjr 0:5acbbe3f4cf4 129 * }
mjr 0:5acbbe3f4cf4 130 * }
mjr 0:5acbbe3f4cf4 131 *
mjr 0:5acbbe3f4cf4 132 * @endcode
mjr 0:5acbbe3f4cf4 133 *
mjr 0:5acbbe3f4cf4 134 *
mjr 0:5acbbe3f4cf4 135 * @code
mjr 0:5acbbe3f4cf4 136 * #include "mbed.h"
mjr 0:5acbbe3f4cf4 137 * #include "USBJoystick.h"
mjr 0:5acbbe3f4cf4 138 * #include <math.h>
mjr 0:5acbbe3f4cf4 139 *
mjr 0:5acbbe3f4cf4 140 * USBJoystick joystick;
mjr 0:5acbbe3f4cf4 141 *
mjr 0:5acbbe3f4cf4 142 * int main(void)
mjr 0:5acbbe3f4cf4 143 * {
mjr 0:5acbbe3f4cf4 144 * while (1) {
mjr 0:5acbbe3f4cf4 145 * // Basic Joystick
mjr 0:5acbbe3f4cf4 146 * joystick.update(tx, y, z, buttonBits);
mjr 0:5acbbe3f4cf4 147 * wait(0.001);
mjr 0:5acbbe3f4cf4 148 * }
mjr 0:5acbbe3f4cf4 149 * }
mjr 0:5acbbe3f4cf4 150 * @endcode
mjr 0:5acbbe3f4cf4 151 */
mjr 0:5acbbe3f4cf4 152
mjr 0:5acbbe3f4cf4 153
mjr 0:5acbbe3f4cf4 154 class USBJoystick: public USBHID {
mjr 0:5acbbe3f4cf4 155 public:
mjr 0:5acbbe3f4cf4 156
mjr 0:5acbbe3f4cf4 157 /**
mjr 0:5acbbe3f4cf4 158 * Constructor
mjr 0:5acbbe3f4cf4 159 *
mjr 0:5acbbe3f4cf4 160 * @param vendor_id Your vendor_id (default: 0x1234)
mjr 0:5acbbe3f4cf4 161 * @param product_id Your product_id (default: 0x0002)
mjr 0:5acbbe3f4cf4 162 * @param product_release Your product_release (default: 0x0001)
mjr 0:5acbbe3f4cf4 163 */
mjr 35:e959ffba78fd 164 USBJoystick(uint16_t vendor_id, uint16_t product_id, uint16_t product_release,
mjr 35:e959ffba78fd 165 int waitForConnect, bool enableJoystick, bool useKB)
mjr 35:e959ffba78fd 166 : USBHID(16, 64, vendor_id, product_id, product_release, false)
mjr 35:e959ffba78fd 167 {
mjr 35:e959ffba78fd 168 _init();
mjr 35:e959ffba78fd 169 this->useKB = useKB;
mjr 35:e959ffba78fd 170 this->enableJoystick = enableJoystick;
mjr 35:e959ffba78fd 171 connect(waitForConnect);
mjr 35:e959ffba78fd 172 };
mjr 38:091e511ce8a0 173
mjr 38:091e511ce8a0 174 /* read a report from the LedWiz buffer */
mjr 38:091e511ce8a0 175 bool readLedWizMsg(LedWizMsg &msg)
mjr 38:091e511ce8a0 176 {
mjr 38:091e511ce8a0 177 return lwbuf.read(msg);
mjr 38:091e511ce8a0 178 }
mjr 0:5acbbe3f4cf4 179
mjr 39:b3815a1c3802 180 /* get the idle time settings, in milliseconds */
mjr 39:b3815a1c3802 181 uint32_t getKbIdle() const { return kbIdleTime * 4UL; }
mjr 39:b3815a1c3802 182 uint32_t getMediaIdle() const { return mediaIdleTime * 4UL; }
mjr 39:b3815a1c3802 183
mjr 39:b3815a1c3802 184
mjr 0:5acbbe3f4cf4 185 /**
mjr 35:e959ffba78fd 186 * Send a keyboard report. The argument gives the key state, in the standard
mjr 35:e959ffba78fd 187 * 6KRO USB keyboard report format: byte 0 is the modifier key bit mask, byte 1
mjr 35:e959ffba78fd 188 * is reserved (must be 0), and bytes 2-6 are the currently pressed keys, as
mjr 35:e959ffba78fd 189 * USB key codes.
mjr 35:e959ffba78fd 190 */
mjr 35:e959ffba78fd 191 bool kbUpdate(uint8_t data[8]);
mjr 35:e959ffba78fd 192
mjr 35:e959ffba78fd 193 /**
mjr 35:e959ffba78fd 194 * Send a media key update. The argument gives the bit mask of media keys
mjr 35:e959ffba78fd 195 * currently pressed. See the HID report descriptor for the order of bits.
mjr 35:e959ffba78fd 196 */
mjr 35:e959ffba78fd 197 bool mediaUpdate(uint8_t data);
mjr 35:e959ffba78fd 198
mjr 35:e959ffba78fd 199 /**
mjr 35:e959ffba78fd 200 * Update the joystick status
mjr 0:5acbbe3f4cf4 201 *
mjr 0:5acbbe3f4cf4 202 * @param x x-axis position
mjr 0:5acbbe3f4cf4 203 * @param y y-axis position
mjr 0:5acbbe3f4cf4 204 * @param z z-axis position
mjr 0:5acbbe3f4cf4 205 * @param buttons buttons state, as a bit mask (combination with '|' of JOY_Bn values)
mjr 0:5acbbe3f4cf4 206 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 207 */
mjr 11:bd9da7088e6e 208 bool update(int16_t x, int16_t y, int16_t z, uint32_t buttons, uint16_t status);
mjr 10:976666ffa4ef 209
mjr 10:976666ffa4ef 210 /**
mjr 21:5048e16cc9ef 211 * Update just the status
mjr 21:5048e16cc9ef 212 */
mjr 21:5048e16cc9ef 213 bool updateStatus(uint32_t stat);
mjr 21:5048e16cc9ef 214
mjr 21:5048e16cc9ef 215 /**
mjr 52:8298b2a73eb2 216 * Write the plunger status report.
mjr 52:8298b2a73eb2 217 *
mjr 52:8298b2a73eb2 218 * @param npix number of pixels in the sensor (0 for non-imaging sensors)
mjr 52:8298b2a73eb2 219 * @param edgePos the pixel position of the detected edge in this image, or -1 if none detected
mjr 52:8298b2a73eb2 220 * @param dir sensor orientation (1 = standard, -1 = reversed, 0 = unknown)
mjr 52:8298b2a73eb2 221 * @param avgScanTime average sensor scan time in microseconds
mjr 52:8298b2a73eb2 222 * @param processingTime time in microseconds to process the current frame
mjr 52:8298b2a73eb2 223 */
mjr 52:8298b2a73eb2 224 bool sendPlungerStatus(int npix, int edgePos, int dir, uint32_t avgScanTime, uint32_t processingTime);
mjr 52:8298b2a73eb2 225
mjr 52:8298b2a73eb2 226 /**
mjr 10:976666ffa4ef 227 * Write an exposure report. We'll fill out a report with as many pixels as
mjr 10:976666ffa4ef 228 * will fit in the packet, send the report, and update the index to the next
mjr 10:976666ffa4ef 229 * pixel to send. The caller should call this repeatedly to send reports for
mjr 10:976666ffa4ef 230 * all pixels.
mjr 10:976666ffa4ef 231 *
mjr 10:976666ffa4ef 232 * @param idx current index in pixel array, updated to point to next pixel to send
mjr 10:976666ffa4ef 233 * @param npix number of pixels in the overall array
mjr 10:976666ffa4ef 234 * @param pix pixel array
mjr 10:976666ffa4ef 235 */
mjr 52:8298b2a73eb2 236 bool sendPlungerPix(int &idx, int npix, const uint8_t *pix);
mjr 48:058ace2aed1d 237
mjr 48:058ace2aed1d 238 /**
mjr 33:d832bcab089e 239 * Write a configuration report.
mjr 33:d832bcab089e 240 *
mjr 33:d832bcab089e 241 * @param numOutputs the number of configured output channels
mjr 33:d832bcab089e 242 * @param unitNo the device unit number
mjr 40:cc0d9814522b 243 * @param plungerZero plunger zero calibration point
mjr 40:cc0d9814522b 244 * @param plungerMax plunger max calibration point
mjr 52:8298b2a73eb2 245 * @param plungerRlsTime measured plunger release time, in milliseconds
mjr 40:cc0d9814522b 246 * @param configured true if a configuration has been saved to flash from the host
mjr 33:d832bcab089e 247 */
mjr 52:8298b2a73eb2 248 bool reportConfig(int numOutputs, int unitNo,
mjr 52:8298b2a73eb2 249 int plungerZero, int plungerMax, int plunterRlsTime,
mjr 52:8298b2a73eb2 250 bool configured);
mjr 52:8298b2a73eb2 251
mjr 52:8298b2a73eb2 252 /**
mjr 52:8298b2a73eb2 253 * Write a configuration variable query report.
mjr 52:8298b2a73eb2 254 *
mjr 52:8298b2a73eb2 255 * @param data the 7-byte data variable buffer, starting with the variable ID byte
mjr 52:8298b2a73eb2 256 */
mjr 52:8298b2a73eb2 257 bool reportConfigVar(const uint8_t *data);
mjr 40:cc0d9814522b 258
mjr 40:cc0d9814522b 259 /**
mjr 40:cc0d9814522b 260 * Write a device ID report.
mjr 40:cc0d9814522b 261 */
mjr 53:9b2611964afc 262 bool reportID(int index);
mjr 53:9b2611964afc 263
mjr 53:9b2611964afc 264 /**
mjr 53:9b2611964afc 265 * Write a build data report
mjr 53:9b2611964afc 266 *
mjr 53:9b2611964afc 267 * @param date build date plus time, in __DATE__ " " __TIME__ macro format ("Mon dd, yyyy hh:mm:ss")
mjr 53:9b2611964afc 268 */
mjr 53:9b2611964afc 269 bool reportBuildInfo(const char *date);
mjr 0:5acbbe3f4cf4 270
mjr 0:5acbbe3f4cf4 271 /**
mjr 35:e959ffba78fd 272 * Send a joystick report to the host
mjr 0:5acbbe3f4cf4 273 *
mjr 0:5acbbe3f4cf4 274 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 275 */
mjr 0:5acbbe3f4cf4 276 bool update();
mjr 9:fd65b0a94720 277
mjr 0:5acbbe3f4cf4 278 /**
mjr 0:5acbbe3f4cf4 279 * Move the cursor to (x, y)
mjr 0:5acbbe3f4cf4 280 *
mjr 0:5acbbe3f4cf4 281 * @param x x-axis position
mjr 0:5acbbe3f4cf4 282 * @param y y-axis position
mjr 0:5acbbe3f4cf4 283 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 284 */
mjr 0:5acbbe3f4cf4 285 bool move(int16_t x, int16_t y);
mjr 0:5acbbe3f4cf4 286
mjr 0:5acbbe3f4cf4 287 /**
mjr 0:5acbbe3f4cf4 288 * Set the z position
mjr 0:5acbbe3f4cf4 289 *
mjr 0:5acbbe3f4cf4 290 * @param z z-axis osition
mjr 0:5acbbe3f4cf4 291 */
mjr 0:5acbbe3f4cf4 292 bool setZ(int16_t z);
mjr 0:5acbbe3f4cf4 293
mjr 0:5acbbe3f4cf4 294 /**
mjr 0:5acbbe3f4cf4 295 * Press one or several buttons
mjr 0:5acbbe3f4cf4 296 *
mjr 0:5acbbe3f4cf4 297 * @param buttons button state, as a bitwise combination of JOY_Bn values
mjr 0:5acbbe3f4cf4 298 * @returns true if there is no error, false otherwise
mjr 0:5acbbe3f4cf4 299 */
mjr 11:bd9da7088e6e 300 bool buttons(uint32_t buttons);
mjr 35:e959ffba78fd 301
mjr 35:e959ffba78fd 302 /* USB descriptor overrides */
mjr 48:058ace2aed1d 303 virtual const uint8_t *configurationDesc();
mjr 54:fd77a6b2f76c 304 virtual const uint8_t *reportDesc(int idx, uint16_t &len);
mjr 0:5acbbe3f4cf4 305
mjr 0:5acbbe3f4cf4 306 /* USB descriptor string overrides */
mjr 48:058ace2aed1d 307 virtual const uint8_t *stringImanufacturerDesc();
mjr 48:058ace2aed1d 308 virtual const uint8_t *stringIserialDesc();
mjr 48:058ace2aed1d 309 virtual const uint8_t *stringIproductDesc();
mjr 35:e959ffba78fd 310
mjr 39:b3815a1c3802 311 /* set/get idle time */
mjr 39:b3815a1c3802 312 virtual void setIdleTime(int ifc, int rptid, int t)
mjr 39:b3815a1c3802 313 {
mjr 39:b3815a1c3802 314 // Remember the new value if operating on the keyboard. Remember
mjr 39:b3815a1c3802 315 // separate keyboard and media control idle times, in case the
mjr 39:b3815a1c3802 316 // host wants separate report rates.
mjr 39:b3815a1c3802 317 if (ifc == IFC_ID_KB)
mjr 39:b3815a1c3802 318 {
mjr 39:b3815a1c3802 319 if (rptid == REPORT_ID_KB)
mjr 39:b3815a1c3802 320 kbIdleTime = t;
mjr 39:b3815a1c3802 321 else if (rptid == REPORT_ID_MEDIA)
mjr 39:b3815a1c3802 322 mediaIdleTime = t;
mjr 39:b3815a1c3802 323 }
mjr 39:b3815a1c3802 324 }
mjr 39:b3815a1c3802 325 virtual uint8_t getIdleTime(int ifc, int rptid)
mjr 39:b3815a1c3802 326 {
mjr 39:b3815a1c3802 327 // Return the kb idle time if the kb interface is the one requested.
mjr 39:b3815a1c3802 328 if (ifc == IFC_ID_KB)
mjr 39:b3815a1c3802 329 {
mjr 39:b3815a1c3802 330 if (rptid == REPORT_ID_KB)
mjr 39:b3815a1c3802 331 return kbIdleTime;
mjr 39:b3815a1c3802 332 if (rptid == REPORT_ID_MEDIA)
mjr 39:b3815a1c3802 333 return mediaIdleTime;
mjr 39:b3815a1c3802 334 }
mjr 39:b3815a1c3802 335
mjr 39:b3815a1c3802 336 // we don't use idle times for other interfaces or report types
mjr 39:b3815a1c3802 337 return 0;
mjr 39:b3815a1c3802 338 }
mjr 39:b3815a1c3802 339
mjr 35:e959ffba78fd 340 /* callback overrides */
mjr 35:e959ffba78fd 341 virtual bool USBCallback_setConfiguration(uint8_t configuration);
mjr 35:e959ffba78fd 342 virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate)
mjr 35:e959ffba78fd 343 { return interface == 0 || interface == 1; }
mjr 38:091e511ce8a0 344
mjr 38:091e511ce8a0 345 virtual bool EP1_OUT_callback();
mjr 35:e959ffba78fd 346 virtual bool EP4_OUT_callback();
mjr 38:091e511ce8a0 347
mjr 0:5acbbe3f4cf4 348 private:
mjr 39:b3815a1c3802 349
mjr 39:b3815a1c3802 350 // Incoming LedWiz message buffer. Each LedWiz message is exactly 8 bytes.
mjr 39:b3815a1c3802 351 CircBuf<LedWizMsg, 64> lwbuf;
mjr 39:b3815a1c3802 352
mjr 35:e959ffba78fd 353 bool enableJoystick;
mjr 35:e959ffba78fd 354 bool useKB;
mjr 39:b3815a1c3802 355 uint8_t kbIdleTime;
mjr 39:b3815a1c3802 356 uint8_t mediaIdleTime;
mjr 6:cc35eb643e8f 357 int16_t _x;
mjr 6:cc35eb643e8f 358 int16_t _y;
mjr 6:cc35eb643e8f 359 int16_t _z;
mjr 11:bd9da7088e6e 360 uint16_t _buttonsLo;
mjr 11:bd9da7088e6e 361 uint16_t _buttonsHi;
mjr 10:976666ffa4ef 362 uint16_t _status;
mjr 38:091e511ce8a0 363
mjr 0:5acbbe3f4cf4 364 void _init();
mjr 0:5acbbe3f4cf4 365 };
mjr 0:5acbbe3f4cf4 366
mjr 38:091e511ce8a0 367 #endif