Skip to content

Commit 998df8e

Browse files
committed
BT support for compatible DualShock 4 gamepads and renaming of buttons for binding
1 parent 499ff3d commit 998df8e

File tree

7 files changed

+80
-32
lines changed

7 files changed

+80
-32
lines changed

BINDINGS.RU.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
## Клавиатура и мышь
1515
Название клавиши | Значение
1616
------------ | -------------
17-
MOUSE LEFT CLICK | `MOUSE-LEFT-CLICK`
18-
MOUSE RIGHT CLICK | `MOUSE-RIGHT-CLICK`
19-
MOUSE MIDDLE CLICK | `MOUSE-MIDDLE-CLICK`
17+
MOUSE LEFT CLICK | `MOUSE-LEFT`
18+
MOUSE RIGHT CLICK | `MOUSE-RIGHT`
19+
MOUSE MIDDLE CLICK | `MOUSE-MIDDLE`
2020
MOUSE WHEEL UP | `MOUSE-WHEEL-UP`
2121
MOUSE WHEEL DOWN | `MOUSE-WHEEL-DOWN`
2222
ESCAPE | `ESCAPE`

BINDINGS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ Mouse wheel scrolling | MOUSE-WHEEL
1313
## Keyboard and mouse
1414
Key name | Value
1515
------------ | -------------
16-
MOUSE LEFT CLICK | `MOUSE-LEFT-CLICK`
17-
MOUSE RIGHT CLICK | `MOUSE-RIGHT-CLICK`
18-
MOUSE MIDDLE CLICK | `MOUSE-MIDDLE-CLICK`
16+
MOUSE LEFT CLICK | `MOUSE-LEFT`
17+
MOUSE RIGHT CLICK | `MOUSE-RIGHT`
18+
MOUSE MIDDLE CLICK | `MOUSE-MIDDLE`
1919
MOUSE WHEEL UP | `MOUSE-WHEEL-UP`
2020
MOUSE WHEEL DOWN | `MOUSE-WHEEL-DOWN`
2121
ESCAPE | `ESCAPE`

Profiles/Clive Barkers - Undying.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[GAMEPAD]
2-
LEFT-TRIGGER = MOUSE-RIGHT-CLICK
3-
RIGHT-TRIGGER = MOUSE-LEFT-CLICK
2+
LEFT-TRIGGER = MOUSE-RIGHT
3+
RIGHT-TRIGGER = MOUSE-LEFT
44

55
L1-LB = E
66
R1-RB = END

Profiles/Desktop.ini

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
LEFT-TRIGGER = HIDE-APPS
33
RIGHT-TRIGGER = FULLSCREEN-PLUS
44

5-
L1-LB = MOUSE-RIGHT-CLICK
6-
R1-RB = MOUSE-LEFT-CLICK
5+
L1-LB = MOUSE-RIGHT
6+
R1-RB = MOUSE-LEFT
77

88
BACK = ESCAPE
99
START = WIN
@@ -26,7 +26,7 @@ LEFT-STICK = MOUSE-LOOK
2626
LEFT-STICK-CLICK = CHANGE-LANGUAGE
2727

2828
RIGHT-STICK = MOUSE-WHEEL
29-
RIGHT-STICK-CLICK = MOUSE-MIDDLE-CLICK
29+
RIGHT-STICK-CLICK = MOUSE-MIDDLE
3030

3131
[MOUSE]
3232
SensitivityX = 75

Profiles/FPS.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[GAMEPAD]
2-
LEFT-TRIGGER = MOUSE-RIGHT-CLICK
3-
RIGHT-TRIGGER = MOUSE-LEFT-CLICK
2+
LEFT-TRIGGER = MOUSE-RIGHT
3+
RIGHT-TRIGGER = MOUSE-LEFT
44

55
L1-LB = F
66
R1-RB = G

Source/DSAdvance/DSAdvance.cpp

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,60 @@ void GamepadSetState(InputOutState OutState)
202202
} else if (CurGamepad.ControllerType == NINTENDO_SWITCH_PRO) { // Need test
203203
unsigned char outputReport[64] = { 0 };
204204

205-
outputReport[0] = 0x10;
205+
/*outputReport[0] = 0x10;
206206
outputReport[1] = (++CurGamepad.PacketCounter) & 0xF; if (CurGamepad.PacketCounter > 0xF) CurGamepad.PacketCounter = 0x0;
207207
outputReport[2] = std::clamp(OutState.SmallMotor - 0, 0, 229); // It seems that it is not recommended to use the Nintendo Switch motors at 100 % , there is a risk of damaging them, so we will limit ourselves to 90%
208208
outputReport[6] = std::clamp(OutState.LargeMotor - 0, 0, 229);
209209
210-
// USB
210+
// BT
211+
if (!CurGamepad.USBConnection) {
212+
outputReport[0] = 0x80; // Заголовок для Bluetooth
213+
outputReport[1] = 0x92; // Команда вибрации для Bluetooth
214+
outputReport[3] = 0x31; // Подкоманда для вибрации
215+
outputReport[8] = 0x10; // Дополнительные данные для Bluetooth
216+
}*/
217+
218+
// Настройка амплитуды
219+
/*unsigned char h_amp = (OutState.SmallMotor / 649) * 2;
220+
unsigned char l_amp1 = (OutState.LargeMotor / 649);
221+
unsigned char l_amp2 = ((l_amp1 % 2) * 128);
222+
l_amp1 = (l_amp1 / 2) + 64;
223+
224+
outputReport[2] = 0x20; // Высокая частота
225+
outputReport[4] = 0x28; // Низкая частота
226+
outputReport[3] = h_amp;
227+
outputReport[5] = l_amp1;
228+
outputReport[4] += l_amp2;
229+
230+
// USB-пакет
211231
if (CurGamepad.USBConnection) {
212232
outputReport[0] = 0x80;
213233
outputReport[1] = 0x92;
214234
outputReport[3] = 0x31;
215235
outputReport[8] = 0x10;
236+
}*/
237+
238+
outputReport[0] = 0x10;
239+
outputReport[1] = (++CurGamepad.PacketCounter) & 0xF;
240+
if (CurGamepad.PacketCounter > 0xF) CurGamepad.PacketCounter = 0x0;
241+
242+
unsigned char hf = 0x20; // Высокая частота
243+
unsigned char lf = 0x28; // Низкая частота
244+
unsigned char h_amp = std::clamp(OutState.SmallMotor * 2 / 229, 0, 255);
245+
unsigned char l_amp1 = std::clamp(OutState.LargeMotor / 229, 0, 255);
246+
unsigned char l_amp2 = ((l_amp1 % 2) * 128);
247+
l_amp1 = (l_amp1 / 2) + 64;
248+
249+
outputReport[2] = hf;
250+
outputReport[3] = h_amp;
251+
outputReport[4] = lf + l_amp2;
252+
outputReport[5] = l_amp1;
253+
254+
if (!CurGamepad.USBConnection) {
255+
outputReport[0] = 0x80;
256+
outputReport[1] = 0x92;
257+
outputReport[3] = 0x31;
258+
outputReport[8] = 0x10;
216259
}
217260

218261
hid_write(CurGamepad.HidHandle, outputReport, 64);
@@ -256,12 +299,19 @@ void GamepadSearch() {
256299
CurGamepad.ControllerType = SONY_DUALSHOCK4;
257300
CurGamepad.USBConnection = true;
258301

259-
// BT detection
302+
// JoyShock Library apparently sent something, so it worked without a package (needed for BT detection to work, does not affect USB)
303+
unsigned char checkBT[2] = { 0x02, 0x00 };
304+
hid_write(CurGamepad.HidHandle, checkBT, sizeof(checkBT));
305+
306+
// BT detection for compatible gamepads that output USB VID/PID on BT connection
260307
unsigned char buf[64];
261308
memset(buf, 0, sizeof(buf));
262309
int bytesRead = hid_read_timeout(CurGamepad.HidHandle, buf, sizeof(buf), 100);
263310
if (bytesRead > 0 && buf[0] == 0x11)
264311
CurGamepad.USBConnection = false;
312+
313+
//printf("Detected device ID: 0x%X\n", cur_dev->product_id);
314+
//if (CurGamepad.USBConnection) printf("USB"); else printf("Wireless");
265315

266316
} else if (cur_dev->product_id == SONY_DS4_BT) { // ?
267317
CurGamepad.ControllerType = SONY_DUALSHOCK4;
@@ -675,7 +725,7 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
675725

676726
int main(int argc, char **argv)
677727
{
678-
SetConsoleTitle("DSAdvance 1.0.2");
728+
SetConsoleTitle("DSAdvance 1.0.3");
679729

680730
WNDCLASS AppWndClass = {};
681731
AppWndClass.lpfnWndProc = WindowProc;
@@ -687,7 +737,6 @@ int main(int argc, char **argv)
687737

688738
// Config parameters
689739
CIniReader IniFile("Config.ini");
690-
CurGamepad.TestRumbleProController = IniFile.ReadBoolean("Gamepad", "ProContollerRumble", false); //Temporary test
691740
CurGamepad.Sticks.InvertLeftX = IniFile.ReadBoolean("Gamepad", "InvertLeftStickX", false);
692741
CurGamepad.Sticks.InvertLeftY = IniFile.ReadBoolean("Gamepad", "InvertLeftStickY", false);
693742
CurGamepad.Sticks.InvertRightX = IniFile.ReadBoolean("Gamepad", "InvertRightStickX", false);

Source/DSAdvance/DSAdvance.h

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@
8282
#define VK_VOLUME_UP2 175
8383
#define VK_VOLUME_MUTE2 173
8484

85-
#define VK_MOUSE_LEFT_CLICK 501
86-
#define VK_MOUSE_MIDDLE_CLICK 502
87-
#define VK_MOUSE_RIGHT_CLICK 503
85+
#define VK_MOUSE_LEFT 501
86+
#define VK_MOUSE_MIDDLE 502
87+
#define VK_MOUSE_RIGHT 503
8888
#define VK_MOUSE_WHEEL_UP 504
8989
#define VK_MOUSE_WHEEL_DOWN 505
9090

@@ -128,7 +128,6 @@ struct Gamepad {
128128
unsigned char DefaultLEDBrightness = 0;
129129
unsigned char PacketCounter = 0;
130130
unsigned char RumbleOffCounter = 0;
131-
bool TestRumbleProController;
132131

133132
struct _Sticks
134133
{
@@ -306,11 +305,11 @@ void MousePress(int MouseBtn, bool ButtonPressed, Button* ButtonState) {
306305
if (ButtonPressed) {
307306
ButtonState->UnpressedOnce = true;
308307
if (ButtonState->PressedOnce == false) {
309-
if (MouseBtn == VK_MOUSE_LEFT_CLICK)
308+
if (MouseBtn == VK_MOUSE_LEFT)
310309
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
311-
else if (MouseBtn == VK_MOUSE_RIGHT_CLICK)
310+
else if (MouseBtn == VK_MOUSE_RIGHT)
312311
mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
313-
else if (MouseBtn == VK_MOUSE_MIDDLE_CLICK)
312+
else if (MouseBtn == VK_MOUSE_MIDDLE)
314313
mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
315314
else if (MouseBtn == VK_MOUSE_WHEEL_UP)
316315
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, -120, 0);
@@ -322,11 +321,11 @@ void MousePress(int MouseBtn, bool ButtonPressed, Button* ButtonState) {
322321
}
323322
else if (ButtonPressed == false && ButtonState->UnpressedOnce) {
324323
//printf("unpressed\n");
325-
if (MouseBtn == VK_MOUSE_LEFT_CLICK)
324+
if (MouseBtn == VK_MOUSE_LEFT)
326325
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
327-
else if (MouseBtn == VK_MOUSE_RIGHT_CLICK)
326+
else if (MouseBtn == VK_MOUSE_RIGHT)
328327
mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
329-
else if (MouseBtn == VK_MOUSE_MIDDLE_CLICK)
328+
else if (MouseBtn == VK_MOUSE_MIDDLE)
330329
mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
331330
ButtonState->UnpressedOnce = false;
332331
ButtonState->PressedOnce = false;
@@ -335,7 +334,7 @@ void MousePress(int MouseBtn, bool ButtonPressed, Button* ButtonState) {
335334

336335
void KeyPress(int KeyCode, bool ButtonPressed, Button* ButtonState) {
337336
if (KeyCode == 0) exit;
338-
else if (KeyCode == VK_MOUSE_LEFT_CLICK || KeyCode == VK_MOUSE_MIDDLE_CLICK || KeyCode == VK_MOUSE_RIGHT_CLICK ||
337+
else if (KeyCode == VK_MOUSE_LEFT || KeyCode == VK_MOUSE_MIDDLE || KeyCode == VK_MOUSE_RIGHT ||
339338
KeyCode == VK_MOUSE_WHEEL_UP || KeyCode == VK_MOUSE_WHEEL_DOWN) // Move to mouse press
340339
MousePress(KeyCode, ButtonPressed, ButtonState);
341340
else if (ButtonPressed) {
@@ -453,9 +452,9 @@ int KeyNameToKeyCode(std::string KeyName) {
453452

454453
std::unordered_map<std::string, int> KeyMap = {
455454
{"NONE", 0},
456-
{"MOUSE-LEFT-CLICK", VK_MOUSE_LEFT_CLICK},
457-
{"MOUSE-RIGHT-CLICK", VK_MOUSE_RIGHT_CLICK},
458-
{"MOUSE-MIDDLE-CLICK", VK_MOUSE_MIDDLE_CLICK},
455+
{"MOUSE-LEFT", VK_MOUSE_LEFT},
456+
{"MOUSE-RIGHT", VK_MOUSE_RIGHT},
457+
{"MOUSE-MIDDLE", VK_MOUSE_MIDDLE},
459458
//{"MOUSE-SIDE1-CLICK", VK_XBUTTON1},
460459
//{"MOUSE-SIDE2-CLICK", VK_XBUTTON2},
461460
{"MOUSE-WHEEL-UP", VK_MOUSE_WHEEL_UP},

0 commit comments

Comments
 (0)