From 4ba875800c70cd80f533fa5cd4b213827b501628 Mon Sep 17 00:00:00 2001 From: cathery Date: Sat, 9 Nov 2019 23:22:41 +0300 Subject: [PATCH] Begin implementing Xbox One Adapter --- ControllerUSB/include/ControllerTypes.h | 2 + ControllerUSB/include/Controllers.h | 1 + .../include/Controllers/XboxOneAdapter.h | 29 +++++ ControllerUSB/source/ControllerHelpers.cpp | 4 + .../source/Controllers/XboxOneAdapter.cpp | 105 ++++++++++++++++++ .../source/SwitchAbstractedPadHandler.cpp | 22 ++-- SwitchUSB/source/SwitchHDLHandler.cpp | 7 ++ source/mainLoop.cpp | 6 + 8 files changed, 161 insertions(+), 15 deletions(-) create mode 100644 ControllerUSB/include/Controllers/XboxOneAdapter.h create mode 100644 ControllerUSB/source/Controllers/XboxOneAdapter.cpp diff --git a/ControllerUSB/include/ControllerTypes.h b/ControllerUSB/include/ControllerTypes.h index 8d9477e..668dd0d 100644 --- a/ControllerUSB/include/ControllerTypes.h +++ b/ControllerUSB/include/ControllerTypes.h @@ -6,6 +6,7 @@ enum ControllerType CONTROLLER_XBOX360, CONTROLLER_XBOX360W, CONTROLLER_XBOXONE, + CONTROLLER_XBOXONEW, CONTROLLER_DUALSHOCK3, CONTROLLER_DUALSHOCK4, }; @@ -43,6 +44,7 @@ enum ControllerSupport SUPPORTS_RUMBLE, SUPPORTS_BLUETOOTH, SUPPORTS_PAIRING, + SUPPORTS_NOTHING, SUPPORTS_SIXAXIS, SUPPORTS_SEVENAXIS, SUPPORTS_PRESSUREBUTTONS, diff --git a/ControllerUSB/include/Controllers.h b/ControllerUSB/include/Controllers.h index 93662e1..942ab8e 100644 --- a/ControllerUSB/include/Controllers.h +++ b/ControllerUSB/include/Controllers.h @@ -4,5 +4,6 @@ #include "Controllers/Xbox360WirelessController.h" #include "Controllers/XboxController.h" #include "Controllers/XboxOneController.h" +#include "Controllers/XboxOneAdapter.h" #include "Controllers/Dualshock3Controller.h" #include "Controllers/Dualshock4Controller.h" diff --git a/ControllerUSB/include/Controllers/XboxOneAdapter.h b/ControllerUSB/include/Controllers/XboxOneAdapter.h new file mode 100644 index 0000000..fdd32cc --- /dev/null +++ b/ControllerUSB/include/Controllers/XboxOneAdapter.h @@ -0,0 +1,29 @@ +#pragma once + +#include "IController.h" +#include "Controllers/XboxOneController.h" + +//References used: +//https://github.com/quantus/xbox-one-controller-protocol +//https://cs.chromium.org/chromium/src/device/gamepad/xbox_controller_mac.mm + +class XboxOneAdapter : public IController +{ +private: + IUSBEndpoint *m_inPipe = nullptr; + IUSBEndpoint *m_outPipe = nullptr; + +public: + XboxOneAdapter(std::unique_ptr &&interface); + virtual ~XboxOneAdapter(); + + virtual Status Initialize(); + virtual void Exit(); + + Status OpenInterfaces(); + void CloseInterfaces(); + + virtual ControllerType GetType() { return CONTROLLER_XBOXONEW; } + + Status SendInitBytes(); +}; \ No newline at end of file diff --git a/ControllerUSB/source/ControllerHelpers.cpp b/ControllerUSB/source/ControllerHelpers.cpp index 0155e41..3f43b91 100644 --- a/ControllerUSB/source/ControllerHelpers.cpp +++ b/ControllerUSB/source/ControllerHelpers.cpp @@ -22,6 +22,10 @@ bool DoesControllerSupport(ControllerType type, ControllerSupport supportType) default: return false; } + case CONTROLLER_XBOXONEW: + if (supportType == SUPPORTS_NOTHING) + return true; + return false; case CONTROLLER_DUALSHOCK3: switch (supportType) { diff --git a/ControllerUSB/source/Controllers/XboxOneAdapter.cpp b/ControllerUSB/source/Controllers/XboxOneAdapter.cpp new file mode 100644 index 0000000..1be0270 --- /dev/null +++ b/ControllerUSB/source/Controllers/XboxOneAdapter.cpp @@ -0,0 +1,105 @@ +#include "Controllers/XboxOneAdapter.h" +#include +#include "../../source/log.h" + +XboxOneAdapter::XboxOneAdapter(std::unique_ptr &&interface) + : IController(std::move(interface)) +{ +} + +XboxOneAdapter::~XboxOneAdapter() +{ + Exit(); +} + +Status XboxOneAdapter::Initialize() +{ + Status rc; + + rc = OpenInterfaces(); + if (S_FAILED(rc)) + return rc; + + rc = SendInitBytes(); + if (S_FAILED(rc)) + return rc; + return rc; +} +void XboxOneAdapter::Exit() +{ + CloseInterfaces(); +} + +Status XboxOneAdapter::OpenInterfaces() +{ + Status rc; + rc = m_device->Open(); + if (S_FAILED(rc)) + return rc; + + std::vector> &interfaces = m_device->GetInterfaces(); + for (auto &&interface : interfaces) + { + rc = interface->Open(); + if (S_FAILED(rc)) + return rc; + + /* + + if (interface->GetDescriptor()->bInterfaceProtocol != 208) + continue; + + if (interface->GetDescriptor()->bNumEndpoints < 2) + continue; + */ + + if (!m_inPipe) + { + for (uint8_t i = 0; i != 15; ++i) + { + IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, i); + if (inEndpoint) + { + rc = inEndpoint->Open(); + if (S_FAILED(rc)) + return 5555; + + m_inPipe = inEndpoint; + break; + } + } + } + + if (!m_outPipe) + { + for (uint8_t i = 0; i != 15; ++i) + { + IUSBEndpoint *outEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_OUT, i); + if (outEndpoint) + { + rc = outEndpoint->Open(); + if (S_FAILED(rc)) + return 6666; + + m_outPipe = outEndpoint; + break; + } + } + } + } + + if (!m_inPipe || !m_outPipe) + return 69; + + return rc; +} +void XboxOneAdapter::CloseInterfaces() +{ + //m_device->Reset(); + m_device->Close(); +} + +Status XboxOneAdapter::SendInitBytes() +{ + return 0; +} \ No newline at end of file diff --git a/SwitchUSB/source/SwitchAbstractedPadHandler.cpp b/SwitchUSB/source/SwitchAbstractedPadHandler.cpp index c38691f..cfb58f4 100644 --- a/SwitchUSB/source/SwitchAbstractedPadHandler.cpp +++ b/SwitchUSB/source/SwitchAbstractedPadHandler.cpp @@ -19,20 +19,8 @@ Result SwitchAbstractedPadHandler::Initialize() if (R_FAILED(rc)) return rc; - /* - - hidScanInput(); - HidControllerID lastOfflineID = CONTROLLER_PLAYER_1; - for (int i = 0; i != 8; ++i) - { - if (!hidIsControllerConnected(static_cast(i))) - { - lastOfflineID = static_cast(i); - break; - } - } - //WriteToLog("Found last offline ID: ", lastOfflineID); - */ + if (DoesControllerSupport(GetController()->GetType(), SUPPORTS_NOTHING)) + return rc; rc = InitAbstractedPadState(); if (R_FAILED(rc)) @@ -68,10 +56,14 @@ Result SwitchAbstractedPadHandler::Initialize() void SwitchAbstractedPadHandler::Exit() { - ExitAbstractedPadState(); m_controllerHandler.Exit(); + + if (DoesControllerSupport(GetController()->GetType(), SUPPORTS_NOTHING)) + return; + ExitInputThread(); ExitOutputThread(); + ExitAbstractedPadState(); } //Used to give out unique ids to abstracted pads diff --git a/SwitchUSB/source/SwitchHDLHandler.cpp b/SwitchUSB/source/SwitchHDLHandler.cpp index 7ee8683..da1eb8e 100644 --- a/SwitchUSB/source/SwitchHDLHandler.cpp +++ b/SwitchUSB/source/SwitchHDLHandler.cpp @@ -18,6 +18,9 @@ Result SwitchHDLHandler::Initialize() if (R_FAILED(rc)) return rc; + if (DoesControllerSupport(GetController()->GetType(), SUPPORTS_NOTHING)) + return rc; + rc = InitHdlState(); if (R_FAILED(rc)) return rc; @@ -39,6 +42,10 @@ Result SwitchHDLHandler::Initialize() void SwitchHDLHandler::Exit() { m_controllerHandler.Exit(); + + if (DoesControllerSupport(GetController()->GetType(), SUPPORTS_NOTHING)) + return; + ExitInputThread(); ExitOutputThread(); ExitHdlState(); diff --git a/source/mainLoop.cpp b/source/mainLoop.cpp index 3a66f41..897298c 100644 --- a/source/mainLoop.cpp +++ b/source/mainLoop.cpp @@ -152,6 +152,12 @@ Result mainLoop() devicePtr = std::make_unique(interfaces, total_entries); controllerPtr = std::make_unique(std::move(devicePtr)); } + else if (R_SUCCEEDED(QueryInterfaces(interfaces, sizeof(interfaces), &total_entries, USB_CLASS_VENDOR_SPEC, 255, 255))) + { + WriteToLog("Registering Xbox One adapter"); + devicePtr = std::make_unique(interfaces, total_entries); + controllerPtr = std::make_unique(std::move(devicePtr)); + } } } rc = eventWait(&ds3Event, 0);