-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcontroller-raw.cpp
137 lines (104 loc) · 3.36 KB
/
controller-raw.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "controller.h"
#include <unistd.h>
using namespace Chaos;
bool ControllerRaw::applyHardware(const DeviceEvent* event) {
// State will already be stored, nothing to be done for raw
// if (spooferFile) {
// if (event->type == TYPE_AXIS &&
// event->id > AXIS_DY) {
// return true;
// }
// fwrite(event, sizeof(DeviceEvent), 1, spooferFile);
//chaosHid.sendUpdate( mControllerState->getHackedState() );
// }
return true;
}
void ControllerRaw::doAction() {
//printf("Queue length = %d\n", deviceEventQueue.size());
while (!bufferQueue.empty()) {
lock();
std::array<unsigned char, 64> bufferFront = bufferQueue.front();
bufferQueue.pop_front();
unlock();
//handleNewDeviceEvent( &event );
// First convert the incoming buffer into a device event:
// A buffer can contain multiple events
std::vector<DeviceEvent> deviceEvents;
mControllerState->getDeviceEvents(bufferFront.data(), 64, deviceEvents);
for (std::vector<DeviceEvent>::iterator it=deviceEvents.begin();
it != deviceEvents.end();
it++) {
DeviceEvent& event = *it;
/*
if (event.type == TYPE_AXIS) {
bool doNotPush = false;
for (std::deque<DeviceEvent>::iterator it = deviceEventQueue.begin();
it != deviceEventQueue.end();
it++) {
if (event.id == (*it).id) {
(*it) = event;
doNotPush = true;
printf("Replacing an event with id: %d\n", event.id);
}
}
if (doNotPush) {
//unlock();
continue;
}
}
*/
//deviceEventQueue.push_back( event );
handleNewDeviceEvent( &event );
}
// while (!deviceEventQueue.empty()) {
// DeviceEvent& event = deviceEventQueue.front();
// handleNewDeviceEvent( &event );
// deviceEventQueue.pop_front();
// }
//printf(" - handled type = %d id = %d value = %d\n", event.type, event.id, event.value);
}
//unlock();
pause();
}
void ControllerRaw::notification(unsigned char* buffer, int length) {
//memcpy(copiedBuffer, buffer, length);
lock();
bufferQueue.push_back( *(std::array<unsigned char, 64>*) buffer);
unlock();
// For each event in a buffer, run the following:
//lock();
// unlock();
//if (!deviceEventQueue.empty()) {
resume(); // kick off the thread if paused
//}
// printf("Before: ");
// for (int i = 0; i < length; i++) {
// printf("%02X ", buffer[i]);
// }
// printf("\n");
// This is our only chance to intercept the data.
// Take the mControllerState and replace the provided buffer:
mControllerState->applyHackedState(buffer, controllerState);
// printf("After: ");
// for (int i = 0; i < length; i++) {
// printf("%02X ", buffer[i]);
// }
// printf("\n");
}
void ControllerRaw::initialize( ) {
//copiedBuffer = malloc(sizeof(inputReport01_t));
this->setEndpoint(0x84); // Works for both dualshock4 and dualsense
mRawGadgetPassthrough.addObserver(this);
mRawGadgetPassthrough.initialize();
mRawGadgetPassthrough.start();
while (!mRawGadgetPassthrough.readyProductVendor()) {
usleep(10000);
}
mControllerState = ControllerState::factory(mRawGadgetPassthrough.getVendor(), mRawGadgetPassthrough.getProduct());
chaosHid = new ChaosUhid(mControllerState);
chaosHid->start();
if (mControllerState == NULL) {
fprintf(stderr, "ERROR! Could not build a ControllerState for vendor=0x%04x product=0x%04x\n", mRawGadgetPassthrough.getVendor(), mRawGadgetPassthrough.getProduct());
exit(EXIT_FAILURE);
}
}