Mirror with some correction

Dependencies:   mbed FastIO FastPWM USBDevice

Committer:
arnoz
Date:
Fri Oct 01 08:19:46 2021 +0000
Revision:
116:7a67265d7c19
Parent:
113:7330439f2ffc
- Correct information regarding your last merge

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 77:0b96f6867312 10 #include "circbuf.h"
mjr 35:e959ffba78fd 11
mjr 39:b3815a1c3802 12 // Bufferd incoming LedWiz message structure
mjr 38:091e511ce8a0 13 struct LedWizMsg
mjr 38:091e511ce8a0 14 {
mjr 38:091e511ce8a0 15 uint8_t data[8];
mjr 38:091e511ce8a0 16 };
mjr 38:091e511ce8a0 17
mjr 39:b3815a1c3802 18 // interface IDs
mjr 39:b3815a1c3802 19 const uint8_t IFC_ID_JS = 0; // joystick + LedWiz interface
mjr 39:b3815a1c3802 20 const uint8_t IFC_ID_KB = 1; // keyboard interface
mjr 39:b3815a1c3802 21
mjr 35:e959ffba78fd 22 // keyboard interface report IDs
mjr 63:5cd1a5f3a41b 23 const uint8_t REPORT_ID_KB = 1;
mjr 63:5cd1a5f3a41b 24 const uint8_t REPORT_ID_MEDIA = 2;
mjr 35:e959ffba78fd 25
mjr 0:5acbbe3f4cf4 26 /* Common usage */
mjr 0:5acbbe3f4cf4 27 enum JOY_BUTTON {
mjr 0:5acbbe3f4cf4 28 JOY_B0 = 0x0001,
mjr 0:5acbbe3f4cf4 29 JOY_B1 = 0x0002,
mjr 0:5acbbe3f4cf4 30 JOY_B2 = 0x0004,
mjr 0:5acbbe3f4cf4 31 JOY_B3 = 0x0008,
mjr 0:5acbbe3f4cf4 32 JOY_B4 = 0x0010,
mjr 0:5acbbe3f4cf4 33 JOY_B5 = 0x0020,
mjr 0:5acbbe3f4cf4 34 JOY_B6 = 0x0040,
mjr 0:5acbbe3f4cf4 35 JOY_B7 = 0x0080,
mjr 0:5acbbe3f4cf4 36 JOY_B8 = 0x0100,
mjr 0:5acbbe3f4cf4 37 JOY_B9 = 0x0200,
mjr 0:5acbbe3f4cf4 38 JOY_B10 = 0x0400,
mjr 0:5acbbe3f4cf4 39 JOY_B11 = 0x0800,
mjr 0:5acbbe3f4cf4 40 JOY_B12 = 0x1000,
mjr 0:5acbbe3f4cf4 41 JOY_B13 = 0x2000,
mjr 0:5acbbe3f4cf4 42 JOY_B14 = 0x4000,
mjr 0:5acbbe3f4cf4 43 JOY_B15 = 0x8000
mjr 0:5acbbe3f4cf4 44 };
mjr 0:5acbbe3f4cf4 45
mjr 0:5acbbe3f4cf4 46 /**
mjr 0:5acbbe3f4cf4 47 *
mjr 0:5acbbe3f4cf4 48 * USBJoystick example
mjr 0:5acbbe3f4cf4 49 * @code
mjr 0:5acbbe3f4cf4 50 * #include "mbed.h"
mjr 0:5acbbe3f4cf4 51 * #include "USBJoystick.h"
mjr 0:5acbbe3f4cf4 52 *
mjr 0:5acbbe3f4cf4 53 * USBJoystick joystick;
mjr 0:5acbbe3f4cf4 54 *
mjr 0:5acbbe3f4cf4 55 * int main(void)
mjr 0:5acbbe3f4cf4 56 * {
mjr 0:5acbbe3f4cf4 57 * while (1)
mjr 0:5acbbe3f4cf4 58 * {
mjr 0:5acbbe3f4cf4 59 * joystick.move(20, 0);
mjr 0:5acbbe3f4cf4 60 * wait(0.5);
mjr 0:5acbbe3f4cf4 61 * }
mjr 0:5acbbe3f4cf4 62 * }
mjr 0:5acbbe3f4cf4 63 *
mjr 0:5acbbe3f4cf4 64 * @endcode
mjr 0:5acbbe3f4cf4 65 *
mjr 0:5acbbe3f4cf4 66 *
mjr 0:5acbbe3f4cf4 67 * @code
mjr 0:5acbbe3f4cf4 68 * #include "mbed.h"
mjr 0:5acbbe3f4cf4 69 * #include "USBJoystick.h"
mjr 0:5acbbe3f4cf4 70 * #include <math.h>
mjr 0:5acbbe3f4cf4 71 *
mjr 0:5acbbe3f4cf4 72 * USBJoystick joystick;
mjr 0:5acbbe3f4cf4 73 *
mjr 0:5acbbe3f4cf4 74 * int main(void)
mjr 0:5acbbe3f4cf4 75 * {
mjr 0:5acbbe3f4cf4 76 * while (1) {
mjr 0:5acbbe3f4cf4 77 * // Basic Joystick
mjr 0:5acbbe3f4cf4 78 * joystick.update(tx, y, z, buttonBits);
mjr 0:5acbbe3f4cf4 79 * wait(0.001);
mjr 0:5acbbe3f4cf4 80 * }
mjr 0:5acbbe3f4cf4 81 * }
mjr 0:5acbbe3f4cf4 82 * @endcode
mjr 0:5acbbe3f4cf4 83 */
mjr 0:5acbbe3f4cf4 84
mjr 0:5acbbe3f4cf4 85
mjr 77:0b96f6867312 86 class USBJoystick: public USBHID
mjr 77:0b96f6867312 87 {
mjr 77:0b96f6867312 88 public:
mjr 77:0b96f6867312 89 // Length of our joystick reports. Important: This must be kept in sync
mjr 77:0b96f6867312 90 // with the actual joystick report format sent in update().
mjr 77:0b96f6867312 91 static const int reportLen = 14;
mjr 90:aa4e571da8e8 92
mjr 90:aa4e571da8e8 93 // Joystick axis report format
mjr 90:aa4e571da8e8 94 static const int AXIS_FORMAT_XYZ = 0; // nudge on X/Y, plunger on Z
mjr 90:aa4e571da8e8 95 static const int AXIS_FORMAT_RXRYRZ = 1; // nudge on Rx/Ry, plunger on Rz
mjr 38:091e511ce8a0 96
mjr 77:0b96f6867312 97 /**
mjr 77:0b96f6867312 98 * Constructor
mjr 77:0b96f6867312 99 *
mjr 77:0b96f6867312 100 * @param vendor_id Your vendor_id (default: 0x1234)
mjr 77:0b96f6867312 101 * @param product_id Your product_id (default: 0x0002)
mjr 77:0b96f6867312 102 * @param product_release Your product_release (default: 0x0001)
mjr 90:aa4e571da8e8 103 * @param waitforConnect don't return until the connection is established
mjr 90:aa4e571da8e8 104 * @param enableJoystick enable the joystick interface (if false, uses the OUT-only LedWiz-style interface)
mjr 90:aa4e571da8e8 105 * @param axisFormat an AXIS_FORMAT_xxx value specifying the joystick axis report format
mjr 90:aa4e571da8e8 106 * @param useKB enable the USB keyboard reporting interface
mjr 77:0b96f6867312 107 */
mjr 77:0b96f6867312 108 USBJoystick(uint16_t vendor_id, uint16_t product_id, uint16_t product_release,
mjr 90:aa4e571da8e8 109 int waitForConnect, bool enableJoystick, int axisFormat, bool useKB)
mjr 77:0b96f6867312 110 : USBHID(16, 64, vendor_id, product_id, product_release, false)
mjr 77:0b96f6867312 111 {
mjr 77:0b96f6867312 112 _init();
mjr 77:0b96f6867312 113 this->useKB = useKB;
mjr 77:0b96f6867312 114 this->enableJoystick = enableJoystick;
mjr 90:aa4e571da8e8 115 this->axisFormat = axisFormat;
mjr 77:0b96f6867312 116 connect(waitForConnect);
mjr 77:0b96f6867312 117 };
mjr 77:0b96f6867312 118
mjr 77:0b96f6867312 119 /* read a report from the LedWiz buffer */
mjr 77:0b96f6867312 120 bool readLedWizMsg(LedWizMsg &msg)
mjr 77:0b96f6867312 121 {
mjr 77:0b96f6867312 122 return lwbuf.read(msg);
mjr 77:0b96f6867312 123 }
mjr 77:0b96f6867312 124
mjr 77:0b96f6867312 125 /* get the idle time settings, in milliseconds */
mjr 77:0b96f6867312 126 uint32_t getKbIdle() const { return kbIdleTime * 4UL; }
mjr 77:0b96f6867312 127 uint32_t getMediaIdle() const { return mediaIdleTime * 4UL; }
mjr 77:0b96f6867312 128
mjr 39:b3815a1c3802 129
mjr 77:0b96f6867312 130 /**
mjr 77:0b96f6867312 131 * Send a keyboard report. The argument gives the key state, in the standard
mjr 77:0b96f6867312 132 * 6KRO USB keyboard report format: byte 0 is the modifier key bit mask, byte 1
mjr 77:0b96f6867312 133 * is reserved (must be 0), and bytes 2-6 are the currently pressed keys, as
mjr 77:0b96f6867312 134 * USB key codes.
mjr 77:0b96f6867312 135 */
mjr 77:0b96f6867312 136 bool kbUpdate(uint8_t data[8]);
mjr 77:0b96f6867312 137
mjr 77:0b96f6867312 138 /**
mjr 77:0b96f6867312 139 * Send a media key update. The argument gives the bit mask of media keys
mjr 77:0b96f6867312 140 * currently pressed. See the HID report descriptor for the order of bits.
mjr 77:0b96f6867312 141 */
mjr 77:0b96f6867312 142 bool mediaUpdate(uint8_t data);
mjr 77:0b96f6867312 143
mjr 77:0b96f6867312 144 /**
mjr 77:0b96f6867312 145 * Update the joystick status
mjr 77:0b96f6867312 146 *
mjr 77:0b96f6867312 147 * @param x x-axis position
mjr 77:0b96f6867312 148 * @param y y-axis position
mjr 77:0b96f6867312 149 * @param z z-axis position
mjr 77:0b96f6867312 150 * @param buttons buttons state, as a bit mask (combination with '|' of JOY_Bn values)
mjr 77:0b96f6867312 151 * @returns true if there is no error, false otherwise
mjr 77:0b96f6867312 152 */
mjr 77:0b96f6867312 153 bool update(int16_t x, int16_t y, int16_t z, uint32_t buttons, uint16_t status);
mjr 77:0b96f6867312 154
mjr 77:0b96f6867312 155 /**
mjr 77:0b96f6867312 156 * Update just the status
mjr 77:0b96f6867312 157 */
mjr 77:0b96f6867312 158 bool updateStatus(uint32_t stat);
mjr 77:0b96f6867312 159
mjr 77:0b96f6867312 160 /**
mjr 86:e30a1f60f783 161 * Write the plunger status report header.
mjr 86:e30a1f60f783 162 *
mjr 86:e30a1f60f783 163 * Note that we automatically add the "calibration mode" bit to the flags,
mjr 86:e30a1f60f783 164 * so the caller doesn't have to include this. The caller only has to
mjr 86:e30a1f60f783 165 * include the sensor-specific flags.
mjr 77:0b96f6867312 166 *
mjr 77:0b96f6867312 167 * @param npix number of pixels in the sensor (0 for non-imaging sensors)
mjr 86:e30a1f60f783 168 * @param pos the decoded plunger position, or -1 if none detected
mjr 86:e30a1f60f783 169 * @param flags (see USBProtocol.h, message type 2A, "byte 7" bit flags)
mjr 77:0b96f6867312 170 * @param avgScanTime average sensor scan time in microseconds
mjr 77:0b96f6867312 171 * @param processingTime time in microseconds to process the current frame
mjr 77:0b96f6867312 172 */
mjr 113:7330439f2ffc 173 bool sendPlungerStatus(int npix, int pos, int flags,
mjr 86:e30a1f60f783 174 uint32_t avgScanTime, uint32_t processingTime);
mjr 86:e30a1f60f783 175
mjr 86:e30a1f60f783 176 /**
mjr 86:e30a1f60f783 177 * Send a secondary plunger status report header.
mjr 86:e30a1f60f783 178 *
mjr 86:e30a1f60f783 179 * @param nativeScale upper bound of the sensor's native reading scale
mjr 86:e30a1f60f783 180 * @param jitterLo low end of jitter filter window (in sensor native scale units)
mjr 86:e30a1f60f783 181 * @param jitterHi high end of jitter filter window
mjr 86:e30a1f60f783 182 * @param rawPos raw position reading, before applying jitter filter
mjr 86:e30a1f60f783 183 * @param axcTime auto-exposure time in microseconds
mjr 86:e30a1f60f783 184 */
mjr 86:e30a1f60f783 185 bool sendPlungerStatus2(
mjr 86:e30a1f60f783 186 int nativeScale, int jitterLo, int jitterHi, int rawPos, int axcTime);
mjr 87:8d35c74403af 187
mjr 87:8d35c74403af 188 /**
mjr 87:8d35c74403af 189 * Send a barcode plunger status report header.
mjr 87:8d35c74403af 190 *
mjr 87:8d35c74403af 191 * @param nbits number of bits in bar code
mjr 87:8d35c74403af 192 * @param codetype bar code type (1=Gray code/Manchester bit coding)
mjr 87:8d35c74403af 193 * @param pixofs pixel offset of first bit
mjr 87:8d35c74403af 194 * @param raw raw bar code bits
mjr 87:8d35c74403af 195 * @param mask mask of successfully read bar code bits
mjr 87:8d35c74403af 196 */
mjr 87:8d35c74403af 197 bool sendPlungerStatusBarcode(
mjr 87:8d35c74403af 198 int nbits, int codetype, int startOfs, int pixPerBit, int raw, int mask);
mjr 108:bd5d4bd4383b 199
mjr 108:bd5d4bd4383b 200 /**
mjr 108:bd5d4bd4383b 201 * Send a quadrature sensor status report header.
mjr 108:bd5d4bd4383b 202 *
mjr 108:bd5d4bd4383b 203 * @param chA channel "A" reading
mjr 108:bd5d4bd4383b 204 * @param chB channel "B" reading
mjr 108:bd5d4bd4383b 205 */
mjr 108:bd5d4bd4383b 206 bool sendPlungerStatusQuadrature(int chA, int chB);
mjr 86:e30a1f60f783 207
mjr 77:0b96f6867312 208 /**
mjr 113:7330439f2ffc 209 * Send a VCNL4010 sensor extra status report
mjr 113:7330439f2ffc 210 *
mjr 113:7330439f2ffc 211 * @param proxCount raw proximity count reading from the sensor
mjr 113:7330439f2ffc 212 */
mjr 113:7330439f2ffc 213 bool sendPlungerStatusVCNL4010(int filteredProxCount, int rawProxCount);
mjr 113:7330439f2ffc 214
mjr 113:7330439f2ffc 215 /**
mjr 77:0b96f6867312 216 * Write an exposure report. We'll fill out a report with as many pixels as
mjr 77:0b96f6867312 217 * will fit in the packet, send the report, and update the index to the next
mjr 77:0b96f6867312 218 * pixel to send. The caller should call this repeatedly to send reports for
mjr 77:0b96f6867312 219 * all pixels.
mjr 77:0b96f6867312 220 *
mjr 77:0b96f6867312 221 * @param idx current index in pixel array, updated to point to next pixel to send
mjr 77:0b96f6867312 222 * @param npix number of pixels in the overall array
mjr 77:0b96f6867312 223 * @param pix pixel array
mjr 77:0b96f6867312 224 */
mjr 77:0b96f6867312 225 bool sendPlungerPix(int &idx, int npix, const uint8_t *pix);
mjr 77:0b96f6867312 226
mjr 77:0b96f6867312 227 /**
mjr 77:0b96f6867312 228 * Write a configuration report.
mjr 77:0b96f6867312 229 *
mjr 77:0b96f6867312 230 * @param numOutputs the number of configured output channels
mjr 77:0b96f6867312 231 * @param unitNo the device unit number
mjr 77:0b96f6867312 232 * @param plungerZero plunger zero calibration point
mjr 77:0b96f6867312 233 * @param plungerMax plunger max calibration point
mjr 77:0b96f6867312 234 * @param plungerRlsTime measured plunger release time, in milliseconds
mjr 77:0b96f6867312 235 * @param configured true if a configuration has been saved to flash from the host
mjr 77:0b96f6867312 236 * @param sbxpbx true if this firmware version supports SBX/PBX protocol extensions
mjr 78:1e00b3fa11af 237 * @param newAccelFeatures true if this firmware version supports the new accelerometer
mjr 78:1e00b3fa11af 238 * features (adjustable dynamic range, adjustable auto-centering mode time,
mjr 78:1e00b3fa11af 239 * auto-centering mode on/off)
mjr 92:f264fbaa1be5 240 * @param flashStatusFeature true if this firmware version supports the flash write
mjr 82:4f6209cb5c33 241 * success flags in the status bits
mjr 92:f264fbaa1be5 242 * @param reportTimingFeatures true if this firmware version supports configurable
mjr 92:f264fbaa1be5 243 * joystick report timing
mjr 99:8139b0c274f4 244 * @param chimeLogicFeature true if this firmware version supports Chime Logic
mjr 77:0b96f6867312 245 * @param freeHeapBytes number of free bytes in the malloc heap
mjr 77:0b96f6867312 246 */
mjr 77:0b96f6867312 247 bool reportConfig(int numOutputs, int unitNo,
mjr 77:0b96f6867312 248 int plungerZero, int plungerMax, int plunterRlsTime,
mjr 92:f264fbaa1be5 249 bool configured, bool sbxpbx, bool newAccelFeatures,
mjr 92:f264fbaa1be5 250 bool flashStatusFeature, bool reportTimingFeatures,
mjr 99:8139b0c274f4 251 bool chimeLogicFeature, size_t freeHeapBytes);
mjr 77:0b96f6867312 252
mjr 77:0b96f6867312 253 /**
mjr 77:0b96f6867312 254 * Write a configuration variable query report.
mjr 77:0b96f6867312 255 *
mjr 77:0b96f6867312 256 * @param data the 7-byte data variable buffer, starting with the variable ID byte
mjr 77:0b96f6867312 257 */
mjr 77:0b96f6867312 258 bool reportConfigVar(const uint8_t *data);
mjr 77:0b96f6867312 259
mjr 77:0b96f6867312 260 /**
mjr 77:0b96f6867312 261 * Write a device ID report.
mjr 77:0b96f6867312 262 */
mjr 77:0b96f6867312 263 bool reportID(int index);
mjr 77:0b96f6867312 264
mjr 77:0b96f6867312 265 /**
mjr 77:0b96f6867312 266 * Write a build data report
mjr 77:0b96f6867312 267 *
mjr 77:0b96f6867312 268 * @param date build date plus time, in __DATE__ " " __TIME__ macro format ("Mon dd, yyyy hh:mm:ss")
mjr 77:0b96f6867312 269 */
mjr 77:0b96f6867312 270 bool reportBuildInfo(const char *date);
mjr 77:0b96f6867312 271
mjr 77:0b96f6867312 272 /**
mjr 77:0b96f6867312 273 * Write a physical button status report.
mjr 77:0b96f6867312 274 *
mjr 77:0b96f6867312 275 * @param numButtons the number of buttons
mjr 77:0b96f6867312 276 * @param state the button states, 1 bit per button, 8 buttons per byte,
mjr 77:0b96f6867312 277 * starting with button 0 in the low-order bit (0x01) of the
mjr 77:0b96f6867312 278 * first byte
mjr 77:0b96f6867312 279 */
mjr 77:0b96f6867312 280 bool reportButtonStatus(int numButtons, const uint8_t *state);
mjr 77:0b96f6867312 281
mjr 77:0b96f6867312 282 /**
mjr 77:0b96f6867312 283 * Write an IR raw sensor input report. This reports a set of raw
mjr 77:0b96f6867312 284 * timing reports for input read from the IR sensor, for learning
mjr 77:0b96f6867312 285 * remote purposes.
mjr 77:0b96f6867312 286 *
mjr 77:0b96f6867312 287 * @param n number of items to report, up to maxRawIR
mjr 77:0b96f6867312 288 * @param data items to report; each is a timing reading, in 2us
mjr 77:0b96f6867312 289 * increments, with the low bit in each report set to 0 for
mjr 77:0b96f6867312 290 * a "space" (IR off) or 1 for a "mark" (IR on)
mjr 77:0b96f6867312 291 */
mjr 77:0b96f6867312 292 bool reportRawIR(int n, const uint16_t *data);
mjr 77:0b96f6867312 293
mjr 77:0b96f6867312 294 /**
mjr 77:0b96f6867312 295 * Maximum number of raw IR readings that can be sent in one report
mjr 77:0b96f6867312 296 * via reportRawIR().
mjr 77:0b96f6867312 297 */
mjr 77:0b96f6867312 298 static const int maxRawIR = (reportLen - 3)/2;
mjr 77:0b96f6867312 299
mjr 77:0b96f6867312 300 /**
mjr 77:0b96f6867312 301 * Write an IR input report. This reports a decoded command read in
mjr 77:0b96f6867312 302 * learning mode to the host.
mjr 77:0b96f6867312 303 *
mjr 77:0b96f6867312 304 * @param pro protocol ID (see IRProtocolID.h)
mjr 77:0b96f6867312 305 * @param flags bit flags: 0x02 = protocol uses dittos
mjr 77:0b96f6867312 306 * @param code decoded command code
mjr 77:0b96f6867312 307 */
mjr 77:0b96f6867312 308 bool reportIRCode(uint8_t pro, uint8_t flags, uint64_t code);
mjr 35:e959ffba78fd 309
mjr 77:0b96f6867312 310 /**
mjr 77:0b96f6867312 311 * Send a joystick report to the host
mjr 77:0b96f6867312 312 *
mjr 77:0b96f6867312 313 * @returns true if there is no error, false otherwise
mjr 77:0b96f6867312 314 */
mjr 77:0b96f6867312 315 bool update();
mjr 77:0b96f6867312 316
mjr 77:0b96f6867312 317 /**
mjr 77:0b96f6867312 318 * Move the cursor to (x, y)
mjr 77:0b96f6867312 319 *
mjr 77:0b96f6867312 320 * @param x x-axis position
mjr 77:0b96f6867312 321 * @param y y-axis position
mjr 77:0b96f6867312 322 * @returns true if there is no error, false otherwise
mjr 77:0b96f6867312 323 */
mjr 77:0b96f6867312 324 bool move(int16_t x, int16_t y);
mjr 77:0b96f6867312 325
mjr 77:0b96f6867312 326 /**
mjr 77:0b96f6867312 327 * Set the z position
mjr 77:0b96f6867312 328 *
mjr 77:0b96f6867312 329 * @param z z-axis osition
mjr 77:0b96f6867312 330 */
mjr 77:0b96f6867312 331 bool setZ(int16_t z);
mjr 77:0b96f6867312 332
mjr 77:0b96f6867312 333 /**
mjr 77:0b96f6867312 334 * Press one or several buttons
mjr 77:0b96f6867312 335 *
mjr 77:0b96f6867312 336 * @param buttons button state, as a bitwise combination of JOY_Bn values
mjr 77:0b96f6867312 337 * @returns true if there is no error, false otherwise
mjr 77:0b96f6867312 338 */
mjr 77:0b96f6867312 339 bool buttons(uint32_t buttons);
mjr 77:0b96f6867312 340
mjr 77:0b96f6867312 341 /* USB descriptor overrides */
mjr 77:0b96f6867312 342 virtual const uint8_t *configurationDesc();
mjr 77:0b96f6867312 343 virtual const uint8_t *reportDesc(int idx, uint16_t &len);
mjr 39:b3815a1c3802 344
mjr 77:0b96f6867312 345 /* USB descriptor string overrides */
mjr 77:0b96f6867312 346 virtual const uint8_t *stringImanufacturerDesc();
mjr 77:0b96f6867312 347 virtual const uint8_t *stringIserialDesc();
mjr 77:0b96f6867312 348 virtual const uint8_t *stringIproductDesc();
mjr 77:0b96f6867312 349
mjr 77:0b96f6867312 350 /* set/get idle time */
mjr 77:0b96f6867312 351 virtual void setIdleTime(int ifc, int rptid, int t)
mjr 77:0b96f6867312 352 {
mjr 77:0b96f6867312 353 // Remember the new value if operating on the keyboard. Remember
mjr 77:0b96f6867312 354 // separate keyboard and media control idle times, in case the
mjr 77:0b96f6867312 355 // host wants separate report rates.
mjr 77:0b96f6867312 356 if (ifc == IFC_ID_KB)
mjr 77:0b96f6867312 357 {
mjr 77:0b96f6867312 358 if (rptid == REPORT_ID_KB)
mjr 77:0b96f6867312 359 kbIdleTime = t;
mjr 77:0b96f6867312 360 else if (rptid == REPORT_ID_MEDIA)
mjr 77:0b96f6867312 361 mediaIdleTime = t;
mjr 77:0b96f6867312 362 }
mjr 77:0b96f6867312 363 }
mjr 77:0b96f6867312 364 virtual uint8_t getIdleTime(int ifc, int rptid)
mjr 77:0b96f6867312 365 {
mjr 77:0b96f6867312 366 // Return the kb idle time if the kb interface is the one requested.
mjr 77:0b96f6867312 367 if (ifc == IFC_ID_KB)
mjr 77:0b96f6867312 368 {
mjr 77:0b96f6867312 369 if (rptid == REPORT_ID_KB)
mjr 77:0b96f6867312 370 return kbIdleTime;
mjr 77:0b96f6867312 371 if (rptid == REPORT_ID_MEDIA)
mjr 77:0b96f6867312 372 return mediaIdleTime;
mjr 77:0b96f6867312 373 }
mjr 77:0b96f6867312 374
mjr 77:0b96f6867312 375 // we don't use idle times for other interfaces or report types
mjr 77:0b96f6867312 376 return 0;
mjr 77:0b96f6867312 377 }
mjr 77:0b96f6867312 378
mjr 77:0b96f6867312 379 /* callback overrides */
mjr 77:0b96f6867312 380 virtual bool USBCallback_setConfiguration(uint8_t configuration);
mjr 77:0b96f6867312 381 virtual bool USBCallback_setInterface(uint16_t interface, uint8_t alternate)
mjr 77:0b96f6867312 382 { return interface == 0 || interface == 1; }
mjr 77:0b96f6867312 383
mjr 77:0b96f6867312 384 virtual bool EP1_OUT_callback();
mjr 77:0b96f6867312 385 virtual bool EP4_OUT_callback();
mjr 77:0b96f6867312 386
mjr 77:0b96f6867312 387 private:
mjr 38:091e511ce8a0 388
mjr 77:0b96f6867312 389 // Incoming LedWiz message buffer. Each LedWiz message is exactly 8 bytes.
mjr 77:0b96f6867312 390 CircBuf<LedWizMsg, 16> lwbuf;
mjr 77:0b96f6867312 391
mjr 90:aa4e571da8e8 392 // enable the joystick interface
mjr 77:0b96f6867312 393 bool enableJoystick;
mjr 90:aa4e571da8e8 394
mjr 90:aa4e571da8e8 395 // joystick axis reporting format
mjr 90:aa4e571da8e8 396 bool axisFormat;
mjr 90:aa4e571da8e8 397
mjr 90:aa4e571da8e8 398 // enable the keyboard interface for button inputs
mjr 77:0b96f6867312 399 bool useKB;
mjr 90:aa4e571da8e8 400
mjr 90:aa4e571da8e8 401 // keyboard maximum idle time between reports
mjr 77:0b96f6867312 402 uint8_t kbIdleTime;
mjr 90:aa4e571da8e8 403
mjr 90:aa4e571da8e8 404 // media maximum idle time between reports
mjr 77:0b96f6867312 405 uint8_t mediaIdleTime;
mjr 90:aa4e571da8e8 406
mjr 90:aa4e571da8e8 407 // current X, Y, Z axis values
mjr 77:0b96f6867312 408 int16_t _x;
mjr 77:0b96f6867312 409 int16_t _y;
mjr 77:0b96f6867312 410 int16_t _z;
mjr 90:aa4e571da8e8 411
mjr 90:aa4e571da8e8 412 // joystick button status bits
mjr 77:0b96f6867312 413 uint16_t _buttonsLo;
mjr 77:0b96f6867312 414 uint16_t _buttonsHi;
mjr 90:aa4e571da8e8 415
mjr 90:aa4e571da8e8 416 // special status flag bits
mjr 77:0b96f6867312 417 uint16_t _status;
mjr 77:0b96f6867312 418
mjr 77:0b96f6867312 419 void _init();
mjr 0:5acbbe3f4cf4 420 };
mjr 0:5acbbe3f4cf4 421
mjr 38:091e511ce8a0 422 #endif