From 99c195e3d331839221d3ef70bc9d441bee3b29a6 Mon Sep 17 00:00:00 2001 From: cathery Date: Thu, 7 Nov 2019 12:48:06 +0300 Subject: [PATCH] Xbox360: Set LED on init and fix endpoints --- .../include/Controllers/Xbox360Controller.h | 22 ++++++++++ .../source/Controllers/Xbox360Controller.cpp | 40 +++++++++++++------ 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/ControllerUSB/include/Controllers/Xbox360Controller.h b/ControllerUSB/include/Controllers/Xbox360Controller.h index 0c52fe0..f60ccc3 100644 --- a/ControllerUSB/include/Controllers/Xbox360Controller.h +++ b/ControllerUSB/include/Controllers/Xbox360Controller.h @@ -60,6 +60,26 @@ enum Xbox360InputPacketType XBOX360INPUT_RUMBLE = 3, }; +enum Xbox360LEDValue +{ + XBOX360LED_OFF, + XBOX360LED_ALLBLINK, + XBOX360LED_TOPLEFTBLINK, + XBOX360LED_TOPRIGHTBLINK, + XBOX360LED_BOTTOMLEFTBLINK, + XBOX360LED_BOTTOMRIGHTBLINK, + XBOX360LED_TOPLEFT, + XBOX360LED_TOPRIGHT, + XBOX360LED_BOTTOMLEFT, + XBOX360LED_BOTTOMRIGHT, + XBOX360LED_ROTATE, + XBOX360LED_BLINK, + XBOX360LED_SLOWBLINK, + XBOX360LED_ROTATE_2, + XBOX360LED_ALLSLOWBLINK, + XBOX360LED_BLINKONCE, +}; + class Xbox360Controller : public IController { private: @@ -99,5 +119,7 @@ public: Status SendInitBytes(); Status SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude); + Status SetLED(Xbox360LEDValue value); + static void LoadConfig(const ControllerConfig *config); }; \ No newline at end of file diff --git a/ControllerUSB/source/Controllers/Xbox360Controller.cpp b/ControllerUSB/source/Controllers/Xbox360Controller.cpp index adc0458..1391b00 100644 --- a/ControllerUSB/source/Controllers/Xbox360Controller.cpp +++ b/ControllerUSB/source/Controllers/Xbox360Controller.cpp @@ -20,6 +20,8 @@ Status Xbox360Controller::Initialize() rc = OpenInterfaces(); if (S_FAILED(rc)) return rc; + + SetLED(XBOX360LED_TOPLEFT); return rc; } void Xbox360Controller::Exit() @@ -47,27 +49,35 @@ Status Xbox360Controller::OpenInterfaces() if (!m_inPipe) { - IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, 0); - if (inEndpoint) + for (int i = 0; i != 15; ++i) { - rc = inEndpoint->Open(); - if (S_FAILED(rc)) - return 55555; + IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, i); + if (inEndpoint) + { + rc = inEndpoint->Open(); + if (S_FAILED(rc)) + return 55555; - m_inPipe = inEndpoint; + m_inPipe = inEndpoint; + break; + } } } if (!m_outPipe) { - IUSBEndpoint *outEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_OUT, 0); - if (outEndpoint) + for (int i = 0; i != 15; ++i) { - rc = outEndpoint->Open(); - if (S_FAILED(rc)) - return 66666; + IUSBEndpoint *outEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_OUT, i); + if (outEndpoint) + { + rc = outEndpoint->Open(); + if (S_FAILED(rc)) + return 66666; - m_outPipe = outEndpoint; + m_outPipe = outEndpoint; + break; + } } } } @@ -199,6 +209,12 @@ Status Xbox360Controller::SetRumble(uint8_t strong_magnitude, uint8_t weak_magni return m_outPipe->Write(rumbleData, sizeof(rumbleData)); } +Status Xbox360Controller::SetLED(Xbox360LEDValue value) +{ + uint8_t ledPacket[]{0x01, 0x03, static_cast(value)}; + return m_outPipe->Write(ledPacket, sizeof(ledPacket)); +} + void Xbox360Controller::LoadConfig(const ControllerConfig *config) { _xbox360ControllerConfig = *config;