Skip to content

Commit 1359500

Browse files
committed
Support for LEDs on Xbox 360 controllers
1 parent 68e4861 commit 1359500

2 files changed

Lines changed: 36 additions & 3 deletions

File tree

Xb2XInput/XboxController.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,14 +395,32 @@ void CALLBACK XboxController::OnVigemNotification(PVIGEM_CLIENT Client, PVIGEM_T
395395
LargeMotor = SmallMotor = 0;
396396

397397
memset(&controller.output_prev_, 0, sizeof(XboxOutputReport));
398-
controller.output_prev_.bSize = sizeof(XboxOutputReport);
398+
controller.output_prev_.bReportId = XBOX_OUTPUT_REPORT_ID_RUMBLE;
399+
controller.output_prev_.bSize = 2 + sizeof(controller.output_prev_.Rumble);
399400
controller.output_prev_.Rumble.wLeftMotorSpeed = _byteswap_ushort(LargeMotor); // why do these need to be byteswapped???
400401
controller.output_prev_.Rumble.wRightMotorSpeed = _byteswap_ushort(SmallMotor);
401402

402403
{
403404
std::lock_guard<std::mutex> guard(usb_mutex_);
404405
libusb_control_transfer(controller.usb_handle_, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
405-
HID_SET_REPORT, (HID_REPORT_TYPE_OUTPUT << 8) | 0x00, 0, (unsigned char*)&controller.output_prev_, sizeof(XboxOutputReport), 1000);
406+
HID_SET_REPORT, (HID_REPORT_TYPE_OUTPUT << 8) | 0x00, 0, (unsigned char*)&controller.output_prev_, controller.output_prev_.bSize, 1000);
407+
}
408+
409+
memset(&controller.output_prev_, 0, sizeof(XboxOutputReport));
410+
controller.output_prev_.bReportId = XBOX_OUTPUT_REPORT_ID_LED;
411+
controller.output_prev_.bSize = 2 + sizeof(controller.output_prev_.LED);
412+
switch (LedNumber) {
413+
case 0: controller.output_prev_.LED.bAnimationId = LED_ANIMATION_ID_ON_1; break;
414+
case 1: controller.output_prev_.LED.bAnimationId = LED_ANIMATION_ID_ON_2; break;
415+
case 2: controller.output_prev_.LED.bAnimationId = LED_ANIMATION_ID_ON_3; break;
416+
case 3: controller.output_prev_.LED.bAnimationId = LED_ANIMATION_ID_ON_4; break;
417+
default: controller.output_prev_.LED.bAnimationId = LED_ANIMATION_ID_ALL_OFF;
418+
}
419+
420+
{
421+
std::lock_guard<std::mutex> guard(usb_mutex_);
422+
libusb_control_transfer(controller.usb_handle_, LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
423+
HID_SET_REPORT, (HID_REPORT_TYPE_OUTPUT << 8) | 0x00, 0, (unsigned char*)&controller.output_prev_, controller.output_prev_.bSize, 1000);
406424
}
407425

408426
break;

Xb2XInput/XboxController.hpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,26 @@ struct XboxInputReport {
5858
OGXINPUT_GAMEPAD Gamepad;
5959
};
6060

61+
#define XBOX_OUTPUT_REPORT_ID_RUMBLE 0
62+
#define XBOX_OUTPUT_REPORT_ID_LED 1
63+
#define LED_ANIMATION_ID_ALL_OFF 0
64+
#define LED_ANIMATION_ID_ON_1 6
65+
#define LED_ANIMATION_ID_ON_2 7
66+
#define LED_ANIMATION_ID_ON_3 8
67+
#define LED_ANIMATION_ID_ON_4 9
68+
69+
struct XboxOutputReportLED {
70+
BYTE bAnimationId;
71+
};
72+
6173
struct XboxOutputReport {
6274
BYTE bReportId;
6375
BYTE bSize;
6476

65-
OGXINPUT_RUMBLE Rumble;
77+
union {
78+
OGXINPUT_RUMBLE Rumble;
79+
XboxOutputReportLED LED;
80+
};
6681
};
6782

6883
struct Deadzone {

0 commit comments

Comments
 (0)