mirror of
https://github.com/cathery/sys-con.git
synced 2024-12-24 15:13:45 +00:00
Fix Xbox One controller init packets
This commit is contained in:
parent
c8bdfd81d2
commit
eb0be90be0
@ -81,9 +81,6 @@ private:
|
|||||||
XboxOneButtonData m_buttonData;
|
XboxOneButtonData m_buttonData;
|
||||||
bool m_GuidePressed{false};
|
bool m_GuidePressed{false};
|
||||||
|
|
||||||
//Meant to be incremented with each out packet
|
|
||||||
uint8_t m_outPacketSerial = 0;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
XboxOneController(std::unique_ptr<IUSBDevice> &&interface);
|
XboxOneController(std::unique_ptr<IUSBDevice> &&interface);
|
||||||
virtual ~XboxOneController();
|
virtual ~XboxOneController();
|
||||||
|
@ -7,7 +7,18 @@ static ControllerConfig _xboxoneControllerConfig{};
|
|||||||
#define TRIGGER_MAXVALUE 1023
|
#define TRIGGER_MAXVALUE 1023
|
||||||
|
|
||||||
//Following input packets were referenced from https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
|
//Following input packets were referenced from https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
|
||||||
|
// and https://github.com/360Controller/360Controller/blob/master/360Controller/_60Controller.cpp
|
||||||
|
|
||||||
|
//Enables LED on the PowerA controller but disables input?
|
||||||
|
static const uint8_t xboxone_powerA_ledOn[] = {
|
||||||
|
0x04, 0x20, 0x01, 0x00};
|
||||||
|
|
||||||
|
//does something maybe
|
||||||
|
static const uint8_t xboxone_test_init1[] = {
|
||||||
|
0x01, 0x20, 0x01, 0x09, 0x00, 0x04, 0x20, 0x3a,
|
||||||
|
0x00, 0x00, 0x00, 0x98, 0x00};
|
||||||
|
|
||||||
|
//required for all xbox one controllers
|
||||||
static const uint8_t xboxone_fw2015_init[] = {
|
static const uint8_t xboxone_fw2015_init[] = {
|
||||||
0x05, 0x20, 0x00, 0x01, 0x00};
|
0x05, 0x20, 0x00, 0x01, 0x00};
|
||||||
|
|
||||||
@ -40,6 +51,9 @@ struct VendorProductPacket
|
|||||||
static VendorProductPacket init_packets[]{
|
static VendorProductPacket init_packets[]{
|
||||||
{0x0e6f, 0x0165, xboxone_hori_init, sizeof(xboxone_hori_init)},
|
{0x0e6f, 0x0165, xboxone_hori_init, sizeof(xboxone_hori_init)},
|
||||||
{0x0f0d, 0x0067, xboxone_hori_init, sizeof(xboxone_hori_init)},
|
{0x0f0d, 0x0067, xboxone_hori_init, sizeof(xboxone_hori_init)},
|
||||||
|
|
||||||
|
{0x0000, 0x0000, xboxone_test_init1, sizeof(xboxone_test_init1)},
|
||||||
|
|
||||||
{0x0000, 0x0000, xboxone_fw2015_init, sizeof(xboxone_fw2015_init)},
|
{0x0000, 0x0000, xboxone_fw2015_init, sizeof(xboxone_fw2015_init)},
|
||||||
{0x0e6f, 0x0000, xboxone_pdp_init1, sizeof(xboxone_pdp_init1)},
|
{0x0e6f, 0x0000, xboxone_pdp_init1, sizeof(xboxone_pdp_init1)},
|
||||||
{0x0e6f, 0x0000, xboxone_pdp_init2, sizeof(xboxone_pdp_init2)},
|
{0x0e6f, 0x0000, xboxone_pdp_init2, sizeof(xboxone_pdp_init2)},
|
||||||
@ -144,7 +158,7 @@ void XboxOneController::CloseInterfaces()
|
|||||||
|
|
||||||
Status XboxOneController::GetInput()
|
Status XboxOneController::GetInput()
|
||||||
{
|
{
|
||||||
uint8_t input_bytes[18];
|
uint8_t input_bytes[64];
|
||||||
|
|
||||||
Status rc = m_inPipe->Read(input_bytes, sizeof(input_bytes));
|
Status rc = m_inPipe->Read(input_bytes, sizeof(input_bytes));
|
||||||
if (S_FAILED(rc))
|
if (S_FAILED(rc))
|
||||||
@ -185,19 +199,11 @@ Status XboxOneController::SendInitBytes()
|
|||||||
if (init_packets[i].ProductID != 0 && init_packets[i].ProductID != product)
|
if (init_packets[i].ProductID != 0 && init_packets[i].ProductID != product)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
uint8_t init_packet[16];
|
rc = m_outPipe->Write(init_packets[i].Packet, init_packets[i].Length);
|
||||||
for (int byte = 0; byte != init_packets[i].Length; ++byte)
|
|
||||||
{
|
|
||||||
init_packet[byte] = init_packets[i].Packet[byte];
|
|
||||||
}
|
|
||||||
|
|
||||||
init_packet[2] = m_outPacketSerial++;
|
|
||||||
|
|
||||||
rc = m_outPipe->Write(init_packet, init_packets[i].Length);
|
|
||||||
if (S_FAILED(rc))
|
if (S_FAILED(rc))
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
WriteToLog("Send a specific init packet for controller v", vendor, " p", product, " with outPacket ", +init_packet[2]);
|
WriteToLog("Send a specific init packet ", i, " for controller v", vendor, " p", product);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -304,8 +310,7 @@ Status XboxOneController::WriteAckGuideReport(uint8_t sequence)
|
|||||||
Status XboxOneController::SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude)
|
Status XboxOneController::SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude)
|
||||||
{
|
{
|
||||||
uint8_t rumble_data[]{
|
uint8_t rumble_data[]{
|
||||||
0x09, 0x00,
|
0x09, 0x00, 0x00,
|
||||||
m_outPacketSerial++,
|
|
||||||
0x09, 0x00, 0x0f, 0x00, 0x00,
|
0x09, 0x00, 0x0f, 0x00, 0x00,
|
||||||
strong_magnitude,
|
strong_magnitude,
|
||||||
weak_magnitude,
|
weak_magnitude,
|
||||||
|
Loading…
Reference in New Issue
Block a user