2626
2727#include " XInput.h"
2828
29+ #ifndef USB_XINPUT
30+ #warning "USB type is not set to XInput in boards menu! Board will not behave as an XInput device"
31+ #endif
32+
2933// Teensy 3.1-3.2: __MK20DX256__
3034// Teensy LC: __MKL26Z64__
3135// Teensy 3.5: __MK64FX512__
3438#if defined(TEENSYDUINO) && \
3539 (defined (__MK20DX256__) || defined (__MKL26Z64__) || \
3640 defined (__MK64FX512__) || defined(__MK66FX1M0__))
37-
38- #ifndef USB_XINPUT
39- #error "USB type is not set to XInput in boards menu!"
40- #endif
41-
4241#else
43- #error "Not a supported board! Must use Teensy 3.1/3.2, LC, 3.5, or 3.6"
42+ #warning "Not a supported board! Must use Teensy 3.1/3.2, LC, 3.5, or 3.6"
4443#endif
4544
4645// --------------------------------------------------------
@@ -305,21 +304,36 @@ uint8_t XInputGamepad::getLEDPatternID() const {
305304 return (uint8_t )ledPattern;
306305}
307306
307+ boolean XInputGamepad::connected () {
308+ #ifdef USB_XINPUT
309+ return XInputUSB::connected ();
310+ #else
311+ return false ;
312+ #endif
313+ }
314+
308315// Send an update packet to the PC
309- void XInputGamepad::send () {
310- if (!newData) return ; // TX data hasn't changed
311- XInputUSB.send (tx, USB_Timeout);
316+ size_t XInputGamepad::send () {
317+ if (!newData) return 0 ; // TX data hasn't changed
318+ #ifdef USB_XINPUT
319+ XInputUSB::send (tx, USB_Timeout);
312320 newData = false ;
321+ #else
322+ #warning "Using debug output for XInput send()"
323+ printDebug ();
324+ #endif
325+ return sizeof (tx);
313326}
314327
315- void XInputGamepad::receive () {
316- if (XInputUSB.available () == 0 ) {
317- return ; // No packet available
328+ size_t XInputGamepad::receive () {
329+ #ifdef USB_XINPUT
330+ if (XInputUSB::available () == 0 ) {
331+ return 0 ; // No packet available
318332 }
319333
320334 // Grab packet and store it in rx array
321335 uint8_t rx[8 ];
322- XInputUSB. recv (rx, USB_Timeout);
336+ size_t bytesRecv = XInputUSB:: recv (rx, USB_Timeout);
323337
324338 // Rumble Packet
325339 if ((rx[0 ] == 0x00 ) & (rx[1 ] == 0x08 )) {
@@ -330,6 +344,10 @@ void XInputGamepad::receive() {
330344 else if (rx[0 ] == 0x01 ) {
331345 parseLED (rx[2 ]);
332346 }
347+ return bytesRecv;
348+ #else
349+ return 0 ;
350+ #endif
333351}
334352
335353void XInputGamepad::parseLED (uint8_t leds) {
@@ -372,9 +390,9 @@ XInputGamepad::Range * XInputGamepad::getRangeFromEnum(XInputControl ctrl) {
372390}
373391
374392int32_t XInputGamepad::rescaleInput (int32_t val, Range in, Range out) {
375- if (in.min == out.min && in.max == out.max ) return val; // Ranges identical
376393 if (val <= in.min ) return out.min ; // Out of range -
377394 if (val >= in.max ) return out.max ; // Out of range +
395+ if (in.min == out.min && in.max == out.max ) return val; // Ranges identical
378396 return map (val, in.min , in.max , out.min , out.max );
379397}
380398
@@ -415,4 +433,60 @@ void XInputGamepad::reset() {
415433 setJoystickRange (XInputMap_Joystick::range.min , XInputMap_Joystick::range.max );
416434}
417435
436+ void XInputGamepad::printDebug (Print &output) const {
437+ const char fillCharacter = ' _' ;
438+
439+ char buffer[80 ];
440+
441+ // Buttons
442+ const char dpadLPrint = getButton (DPAD_LEFT) ? ' <' : fillCharacter;
443+ const char dpadUPrint = getButton (DPAD_UP) ? ' ^' : fillCharacter;
444+ const char dpadDPrint = getButton (DPAD_DOWN) ? ' v' : fillCharacter;
445+ const char dpadRPrint = getButton (DPAD_RIGHT) ? ' >' : fillCharacter;
446+
447+ const char aButtonPrint = getButton (BUTTON_A) ? ' A' : fillCharacter;
448+ const char bButtonPrint = getButton (BUTTON_B) ? ' B' : fillCharacter;
449+ const char xButtonPrint = getButton (BUTTON_X) ? ' X' : fillCharacter;
450+ const char yButtonPrint = getButton (BUTTON_Y) ? ' Y' : fillCharacter;
451+
452+ const char startPrint = getButton (BUTTON_START) ? ' >' : fillCharacter;
453+ const char backPrint = getButton (BUTTON_BACK) ? ' <' : fillCharacter;
454+
455+ const char logoPrint = getButton (BUTTON_LOGO) ? ' X' : fillCharacter;
456+
457+ // Bumpers
458+ char leftBumper[3 ] = " LB" ;
459+ char rightBumper[3 ] = " RB" ;
460+
461+ if (!getButton (BUTTON_LB)) {
462+ leftBumper[0 ] = fillCharacter;
463+ leftBumper[1 ] = fillCharacter;
464+ }
465+ if (!getButton (BUTTON_RB)) {
466+ rightBumper[0 ] = fillCharacter;
467+ rightBumper[1 ] = fillCharacter;
468+ }
469+
470+ output.print (" XInput Debug: " );
471+ sprintf (buffer,
472+ " LT: %3u %s L:(%6d, %6d) %c%c%c%c | %c%c%c | %c%c%c%c R:(%6d, %6d) %s RT: %3u" ,
473+
474+ // Left side controls
475+ getTrigger (TRIGGER_LEFT),
476+ leftBumper,
477+ getJoystickX (JOY_LEFT), getJoystickY (JOY_LEFT),
478+
479+ // Buttons
480+ dpadLPrint, dpadUPrint, dpadDPrint, dpadRPrint,
481+ backPrint, logoPrint, startPrint,
482+ aButtonPrint, bButtonPrint, xButtonPrint, yButtonPrint,
483+
484+ // Right side controls
485+ getJoystickX (JOY_RIGHT), getJoystickY (JOY_RIGHT),
486+ rightBumper,
487+ getTrigger (TRIGGER_RIGHT)
488+ );
489+ output.println (buffer);
490+ }
491+
418492XInputGamepad XInput;
0 commit comments