Browse Source

Beginning support USB for Nintendo Switch...

It shows up with name XBox360 for Windows (at least the version I have)...

But at least it is starting to give some data
main
Kurt Eckhardt 4 years ago
parent
commit
93f0ea36fd
5 changed files with 56 additions and 7 deletions
  1. +2
    -2
      USBHost_t36.h
  2. +1
    -1
      bluetooth.cpp
  3. +3
    -2
      examples/USBHost_viewer/USBHost_viewer.ino
  4. +49
    -1
      joystick.cpp
  5. +1
    -1
      keywords.txt

+ 2
- 2
USBHost_t36.h View File

@@ -57,7 +57,7 @@
// your best effort to read chapter 4 before asking USB questions!


//#define USBHOST_PRINT_DEBUG
#define USBHOST_PRINT_DEBUG
//#define USBHDBGSerial Serial1

#ifndef USBHDBGSerial
@@ -918,7 +918,7 @@ public:
bool setLEDs(uint8_t lr, uint8_t lg, uint8_t lb); // sets Leds,
bool inline setLEDs(uint32_t leds) {return setLEDs((leds >> 16) & 0xff, (leds >> 8) & 0xff, leds & 0xff);} // sets Leds - passing one arg for all leds
enum { STANDARD_AXIS_COUNT = 10, ADDITIONAL_AXIS_COUNT = 54, TOTAL_AXIS_COUNT = (STANDARD_AXIS_COUNT+ADDITIONAL_AXIS_COUNT) };
typedef enum { UNKNOWN=0, PS3, PS4, XBOXONE, XBOX360, PS3_MOTION, SpaceNav} joytype_t;
typedef enum { UNKNOWN=0, PS3, PS4, XBOXONE, XBOX360, PS3_MOTION, SpaceNav, SWITCH} joytype_t;
joytype_t joystickType() {return joystickType_;}

// PS3 pair function. hack, requires that it be connect4ed by USB and we have the address of the Bluetooth dongle...

+ 1
- 1
bluetooth.cpp View File

@@ -31,7 +31,7 @@
#define println USBHost::println_//#define DEBUG_BT

#define DEBUG_BT
#define DEBUG_BT_VERBOSE
//#define DEBUG_BT_VERBOSE

#ifndef DEBUG_BT
#undef DEBUG_BT_VERBOSE

+ 3
- 2
examples/USBHost_viewer/USBHost_viewer.ino View File

@@ -17,7 +17,7 @@
//
// This example is in the public domain
//=============================================================================
#define USE_ST77XX // define this if you wish to use one of these displays.
//#define USE_ST77XX // define this if you wish to use one of these displays.

#include "USBHost_t36.h"

@@ -489,6 +489,7 @@ void ProcessJoystickData() {

case JoystickController::XBOXONE:
case JoystickController::XBOX360:
case JoystickController::SWITCH:
ltv = joystick.getAxis(4);
rtv = joystick.getAxis(5);
if ((ltv != joystick_left_trigger_value) || (rtv != joystick_right_trigger_value)) {
@@ -988,4 +989,4 @@ void OnHIDExtrasRelease(uint32_t top, uint16_t key)
tft.print(top, HEX);
tft.print(") key release:");
tft.println(key, HEX);
}
}

+ 49
- 1
joystick.cpp View File

@@ -40,7 +40,7 @@
JoystickController::product_vendor_mapping_t JoystickController::pid_vid_mapping[] = {
{ 0x045e, 0x02ea, XBOXONE, false },{ 0x045e, 0x02dd, XBOXONE, false },
{ 0x045e, 0x0719, XBOX360, false},
{ 0x045e, 0x028E, XBOX360, false}, // Switch?
{ 0x045e, 0x028E, SWITCH, false}, // Switch?
{ 0x054C, 0x0268, PS3, true},
{ 0x054C, 0x042F, PS3, true}, // PS3 Navigation controller
{ 0x054C, 0x03D5, PS3_MOTION, true}, // PS3 Motion controller
@@ -648,13 +648,31 @@ typedef struct {
int16_t axis[4];
} xbox360data_t;

typedef struct {
uint8_t state;
uint8_t id_or_type;
// From online references button order:
// sync, dummy, start, back, a, b, x, y
// dpad up, down left, right
// lb, rb, left stick, right stick
// Axis:
// lt, rt, lx, ly, rx, ry
//
uint16_t buttons;
uint8_t lt;
uint8_t rt;
int16_t axis[4];
} switchdataUSB_t;

static const uint8_t xbox_axis_order_mapping[] = {3, 4, 0, 1, 2, 5};

void JoystickController::rx_data(const Transfer_t *transfer)
{
#ifdef DEBUG_JOYSTICK
print("JoystickController::rx_data (", joystickType_, DEC);
print("): ");
print_hexbytes((uint8_t*)transfer->buffer, transfer->length);
#endif

if (joystickType_ == XBOXONE) {
// Process XBOX One data
@@ -733,6 +751,36 @@ void JoystickController::rx_data(const Transfer_t *transfer)

if (anychange) joystickEvent = true;
}
} else if (joystickType_ == SWITCH) {
switchdataUSB_t *switchd = (switchdataUSB_t *)transfer->buffer;
if (buttons != switchd->buttons) {
buttons = switchd->buttons;
anychange = true;
}
axis_mask_ = 0x3f;
axis_changed_mask_ = 0; // assume none for now

for (uint8_t i = 0; i < 4; i++) {
if (axis[i] != switchd->axis[i]) {
axis[i] = switchd->axis[i];
axis_changed_mask_ |= (1 << i);
anychange = true;
}
}
// the two triggers show up as 4 and 5
if (axis[4] != switchd->lt) {
axis[4] = switchd->lt;
axis_changed_mask_ |= (1 << 4);
anychange = true;
}

if (axis[5] != switchd->rt) {
axis[5] = switchd->rt;
axis_changed_mask_ |= (1 << 5);
anychange = true;
}

if (anychange) joystickEvent = true;
}

queue_Data_Transfer(rxpipe_, rxbuf_, rx_size_, this);

+ 1
- 1
keywords.txt View File

@@ -95,7 +95,7 @@ PS3_MOTION LITERAL1
PS4 LITERAL1
XBOXONE LITERAL1
XBOX360 LITERAL1
SWITCH LITERAL1
# USBSerial
USBHOST_SERIAL_7E1 LITERAL1
USBHOST_SERIAL_7O1 LITERAL1

Loading…
Cancel
Save