mirror of
https://github.com/cathery/sys-con.git
synced 2025-04-10 06:44:35 +00:00
Xbox One: send init packets for specific devices
This commit is contained in:
parent
586f1b0914
commit
eb43cdd02b
@ -81,7 +81,8 @@ private:
|
|||||||
XboxOneButtonData m_buttonData;
|
XboxOneButtonData m_buttonData;
|
||||||
bool m_GuidePressed{false};
|
bool m_GuidePressed{false};
|
||||||
|
|
||||||
uint8_t m_rumbleDataCounter = 0;
|
//Meant to be incremented with each out packet
|
||||||
|
uint8_t m_outPacketSerial = 0;
|
||||||
/*
|
/*
|
||||||
|
|
||||||
int16_t kLeftThumbDeadzone = 2500; //7849;
|
int16_t kLeftThumbDeadzone = 2500; //7849;
|
||||||
|
@ -1,8 +1,54 @@
|
|||||||
#include "Controllers/XboxOneController.h"
|
#include "Controllers/XboxOneController.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include "../../source/log.h"
|
||||||
|
|
||||||
static ControllerConfig _xboxoneControllerConfig{};
|
static ControllerConfig _xboxoneControllerConfig{};
|
||||||
|
|
||||||
|
//Following input packets were referenced from https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
|
||||||
|
|
||||||
|
static const uint8_t xboxone_fw2015_init[] = {
|
||||||
|
0x05, 0x20, 0x00, 0x01, 0x00};
|
||||||
|
|
||||||
|
static const uint8_t xboxone_hori_init[] = {
|
||||||
|
0x01, 0x20, 0x00, 0x09, 0x00, 0x04, 0x20, 0x3a,
|
||||||
|
0x00, 0x00, 0x00, 0x80, 0x00};
|
||||||
|
|
||||||
|
static const uint8_t xboxone_pdp_init1[] = {
|
||||||
|
0x0a, 0x20, 0x00, 0x03, 0x00, 0x01, 0x14};
|
||||||
|
|
||||||
|
static const uint8_t xboxone_pdp_init2[] = {
|
||||||
|
0x06, 0x20, 0x00, 0x02, 0x01, 0x00};
|
||||||
|
|
||||||
|
static const uint8_t xboxone_rumblebegin_init[] = {
|
||||||
|
0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
|
||||||
|
0x1D, 0x1D, 0xFF, 0x00, 0x00};
|
||||||
|
|
||||||
|
static const uint8_t xboxone_rumbleend_init[] = {
|
||||||
|
0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
|
struct VendorProductPacket
|
||||||
|
{
|
||||||
|
uint16_t VendorID;
|
||||||
|
uint16_t ProductID;
|
||||||
|
const uint8_t *Packet;
|
||||||
|
uint8_t Length;
|
||||||
|
};
|
||||||
|
|
||||||
|
static VendorProductPacket init_packets[]{
|
||||||
|
{0x0e6f, 0x0165, xboxone_hori_init, sizeof(xboxone_hori_init)},
|
||||||
|
{0x0f0d, 0x0067, xboxone_hori_init, sizeof(xboxone_hori_init)},
|
||||||
|
{0x0000, 0x0000, xboxone_fw2015_init, sizeof(xboxone_fw2015_init)},
|
||||||
|
{0x0e6f, 0x0000, xboxone_pdp_init1, sizeof(xboxone_pdp_init1)},
|
||||||
|
{0x0e6f, 0x0000, xboxone_pdp_init2, sizeof(xboxone_pdp_init2)},
|
||||||
|
{0x24c6, 0x541a, xboxone_rumblebegin_init, sizeof(xboxone_rumblebegin_init)},
|
||||||
|
{0x24c6, 0x542a, xboxone_rumblebegin_init, sizeof(xboxone_rumblebegin_init)},
|
||||||
|
{0x24c6, 0x543a, xboxone_rumblebegin_init, sizeof(xboxone_rumblebegin_init)},
|
||||||
|
{0x24c6, 0x541a, xboxone_rumbleend_init, sizeof(xboxone_rumbleend_init)},
|
||||||
|
{0x24c6, 0x542a, xboxone_rumbleend_init, sizeof(xboxone_rumbleend_init)},
|
||||||
|
{0x24c6, 0x543a, xboxone_rumbleend_init, sizeof(xboxone_rumbleend_init)},
|
||||||
|
};
|
||||||
|
|
||||||
XboxOneController::XboxOneController(std::unique_ptr<IUSBDevice> &&interface)
|
XboxOneController::XboxOneController(std::unique_ptr<IUSBDevice> &&interface)
|
||||||
: IController(std::move(interface))
|
: IController(std::move(interface))
|
||||||
{
|
{
|
||||||
@ -121,11 +167,30 @@ Status XboxOneController::GetInput()
|
|||||||
|
|
||||||
Status XboxOneController::SendInitBytes()
|
Status XboxOneController::SendInitBytes()
|
||||||
{
|
{
|
||||||
uint8_t init_bytes[]{
|
Status rc;
|
||||||
0x05,
|
uint16_t vendor = m_device->GetVendor();
|
||||||
0x20, 0x00, 0x01, 0x00};
|
uint16_t product = m_device->GetProduct();
|
||||||
|
for (int i = 0; i != (sizeof(init_packets) / sizeof(VendorProductPacket)); ++i)
|
||||||
|
{
|
||||||
|
if (init_packets[i].VendorID != 0 && init_packets[i].VendorID != vendor)
|
||||||
|
continue;
|
||||||
|
if (init_packets[i].ProductID != 0 && init_packets[i].ProductID != product)
|
||||||
|
continue;
|
||||||
|
|
||||||
Status rc = m_outPipe->Write(init_bytes, sizeof(init_bytes));
|
uint8_t init_packet[16];
|
||||||
|
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))
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
WriteToLog("Send a specific init packet for controller v", vendor, " p", product, " with outPacket ", +init_packet[2]);
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +298,7 @@ Status XboxOneController::SetRumble(uint8_t strong_magnitude, uint8_t weak_magni
|
|||||||
{
|
{
|
||||||
uint8_t rumble_data[]{
|
uint8_t rumble_data[]{
|
||||||
0x09, 0x00,
|
0x09, 0x00,
|
||||||
m_rumbleDataCounter++,
|
m_outPacketSerial++,
|
||||||
0x09, 0x00, 0x0f, 0x00, 0x00,
|
0x09, 0x00, 0x0f, 0x00, 0x00,
|
||||||
strong_magnitude,
|
strong_magnitude,
|
||||||
weak_magnitude,
|
weak_magnitude,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user