1
0
mirror of https://github.com/cathery/sys-con.git synced 2024-10-06 06:19:43 +00:00

More work on Dualshock 4

This commit is contained in:
cathery 2019-11-12 20:56:50 +03:00
parent fd529963cc
commit 7c1757bef8
3 changed files with 52 additions and 10 deletions

View File

@ -59,6 +59,35 @@ struct Dualshock4ButtonData
uint32_t crc32; uint32_t crc32;
}; };
struct Dualshock4USBButtonData
{
uint8_t type;
uint8_t stick_left_x;
uint8_t stick_left_y;
uint8_t stick_right_x;
uint8_t stick_right_y;
uint8_t dpad : 4;
bool square : 1;
bool cross : 1;
bool circle : 1;
bool triangle : 1;
bool l1 : 1;
bool r1 : 1;
bool l2 : 1;
bool r2 : 1;
bool share : 1;
bool options : 1;
bool l3 : 1;
bool r3 : 1;
uint8_t timestamp;
uint8_t l2_pressure;
uint8_t r2_pressure;
};
enum Dualshock4Dpad enum Dualshock4Dpad
{ {
DS4_UP = 0x000, DS4_UP = 0x000,
@ -76,6 +105,7 @@ class Dualshock4Controller : public IController
private: private:
IUSBEndpoint *m_inPipe = nullptr; IUSBEndpoint *m_inPipe = nullptr;
IUSBEndpoint *m_outPipe = nullptr; IUSBEndpoint *m_outPipe = nullptr;
IUSBInterface *m_interface = nullptr;
Dualshock4ButtonData m_buttonData; Dualshock4ButtonData m_buttonData;

View File

@ -1,5 +1,6 @@
#include "Controllers/Dualshock4Controller.h" #include "Controllers/Dualshock4Controller.h"
#include <cmath> #include <cmath>
#include "../../source/log.h"
static ControllerConfig _dualshock4ControllerConfig{}; static ControllerConfig _dualshock4ControllerConfig{};
@ -27,13 +28,13 @@ uint32_t ComputeDualshock4Checksum(const uint8_t *report_data, uint16_t length)
Status Dualshock4Controller::SendInitBytes() Status Dualshock4Controller::SendInitBytes()
{ {
uint8_t init_bytes[32] = {
//for bluetooth connection constexpr uint8_t init_bytes[32] = {
//0x11, 0xC4, 0x00, 0x07, 0x00, 0x00,
0x05, 0x07, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00,
0xFF, 0xFF, 0x7f, 0x7f,
0x00, 0x00, 0x40, 0x00, 0x00, 0x40,
0x00, 0x00}; 0x00, 0x00};
return m_outPipe->Write(init_bytes, sizeof(init_bytes)); return m_outPipe->Write(init_bytes, sizeof(init_bytes));
} }
@ -48,6 +49,12 @@ Status Dualshock4Controller::Initialize()
rc = SendInitBytes(); rc = SendInitBytes();
if (S_FAILED(rc)) if (S_FAILED(rc))
return rc; return rc;
WriteToLog("Max IN packet size: ", m_inPipe->GetDescriptor()->wMaxPacketSize);
WriteToLog("Max OUT packet size: ", m_outPipe->GetDescriptor()->wMaxPacketSize);
return GetInput();
return rc; return rc;
} }
void Dualshock4Controller::Exit() void Dualshock4Controller::Exit()
@ -76,6 +83,8 @@ Status Dualshock4Controller::OpenInterfaces()
if (interface->GetDescriptor()->bNumEndpoints < 2) if (interface->GetDescriptor()->bNumEndpoints < 2)
continue; continue;
m_interface = interface.get();
if (!m_inPipe) if (!m_inPipe)
{ {
for (int i = 0; i != 15; ++i) for (int i = 0; i != 15; ++i)
@ -83,7 +92,7 @@ Status Dualshock4Controller::OpenInterfaces()
IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, i); IUSBEndpoint *inEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_IN, i);
if (inEndpoint) if (inEndpoint)
{ {
rc = inEndpoint->Open(); rc = inEndpoint->Open(100);
if (S_FAILED(rc)) if (S_FAILED(rc))
return 61; return 61;
@ -100,7 +109,7 @@ Status Dualshock4Controller::OpenInterfaces()
IUSBEndpoint *outEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_OUT, i); IUSBEndpoint *outEndpoint = interface->GetEndpoint(IUSBEndpoint::USB_ENDPOINT_OUT, i);
if (outEndpoint) if (outEndpoint)
{ {
rc = outEndpoint->Open(); rc = outEndpoint->Open(100);
if (S_FAILED(rc)) if (S_FAILED(rc))
return 62; return 62;
@ -124,12 +133,15 @@ void Dualshock4Controller::CloseInterfaces()
Status Dualshock4Controller::GetInput() Status Dualshock4Controller::GetInput()
{ {
uint8_t input_bytes[64]; uint8_t input_bytes[65];
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))
{
m_inputData[0] = static_cast<uint8_t>(rc);
return rc; return rc;
}
for (int i = 0; i != 64; ++i) for (int i = 0; i != 65; ++i)
{ {
m_inputData[i] = input_bytes[i]; m_inputData[i] = input_bytes[i];
} }
@ -137,7 +149,7 @@ Status Dualshock4Controller::GetInput()
uint8_t type = input_bytes[0]; uint8_t type = input_bytes[0];
if (type == 0x11) //Button data if (type == 0x01)
{ {
m_buttonData = *reinterpret_cast<Dualshock4ButtonData *>(input_bytes); m_buttonData = *reinterpret_cast<Dualshock4ButtonData *>(input_bytes);
} }

View File

@ -156,7 +156,7 @@ Result mainLoop()
{ {
if (handler->GetController()->m_UpdateCalled) if (handler->GetController()->m_UpdateCalled)
{ {
for (int i = 0; i != 64; ++i) for (int i = 0; i != 100; ++i)
printf("0x%02X ", handler->GetController()->m_inputData[i]); printf("0x%02X ", handler->GetController()->m_inputData[i]);
printf("\n"); printf("\n");
handler->GetController()->m_UpdateCalled = false; handler->GetController()->m_UpdateCalled = false;