Arnaud VALLEY / Mbed 2 deprecated Pinscape_Controller_V2_arnoz

Dependencies:   mbed FastIO FastPWM USBDevice

Committer:
mjr
Date:
Thu Jun 02 22:52:25 2016 +0000
Revision:
62:f071ccde32a0
Parent:
54:fd77a6b2f76c
Child:
63:5cd1a5f3a41b
EXPERIMENTAL/ABANDONED: Combine all message types (JS+KB+LW) into a single HID interface, as a failed attempt to work around ledwiz.dll crash with multiple interfaces. This approach creates a new incompatibility due to the non-zero report ID.

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