From f9ab1ce64f40fb756a53de0663c1885c10277001 Mon Sep 17 00:00:00 2001 From: Marc Riera Irigoyen Date: Sat, 19 Nov 2022 12:26:27 +0100 Subject: [PATCH] Add support for input DGOC-44U --- README.md | 8 +-- ddgo-converter/gamepads/physical.py | 83 +++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0440ee4..c16790c 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,13 @@ The executable is ready to use. However, you will need read AND write permission ## Supported controllers -### Physical +### Physical (input) +- One-handle controller for PC (DGC-255) +- Two-handle controller for PC (DGOC-44U) - One-handle controller for Nintendo Switch (ZKNS-001) -### Emulated +### Emulated (output) - Two-handle controller for PC (DGOC-44U) - Two-handle controller for Sony PlayStation (SLPH-00051) @@ -27,6 +29,6 @@ The executable is ready to use. However, you will need read AND write permission ## Notes -When emulating console controllers, an emulated Sony PlayStation 3 controller is used for easier mapping. On RetroArch, everything works out of the box. +When emulating console controllers, an emulated Sony PlayStation 3 controller is used for easier mapping. On RetroArch, everything should work out of the box. _Densha de GO! 64_ requires connecting the controller to Port 3 and enabling **Independent C-button Controls**. diff --git a/ddgo-converter/gamepads/physical.py b/ddgo-converter/gamepads/physical.py index 7002f93..f68f81d 100755 --- a/ddgo-converter/gamepads/physical.py +++ b/ddgo-converter/gamepads/physical.py @@ -10,6 +10,8 @@ def create_gamepad(vid, pid, name): return SwitchGamepad(vid, pid, name) case 0x054c, 0x0268: return ClassicGamepad(vid, pid, name) + case 0x0ae4, 0x0003: + return PCGamepad(vid, pid, name) return PhysicalGamepad(vid, pid, name) class PhysicalGamepad: @@ -18,6 +20,7 @@ class PhysicalGamepad: UNKNOWN = 0 CLASSIC = 1 SWITCH = 2 + PC = 3 def __init__(self, vid, pid, name): super().__init__() @@ -278,3 +281,83 @@ class ClassicGamepad(PhysicalGamepad): return input_events except OSError: return [InputEvent(InputEvent.EventType.ERROR, None)] + +class PCGamepad(PhysicalGamepad): + + def __init__(self, * args): + super().__init__(* args) + self.type = self.GamepadType.PC + self.config = [] + self.device = self._get_device() + + def start(self): + try: + self.device.grab() + except: + return + + def stop(self): + try: + self.device.ungrab() + except: + return + + def read_input(self): + select([self.device], [], [], 5) + try: + event = self.device.read_one() + input_events = [] + if event is not None: + if event.type == evdev.ecodes.EV_KEY: + match event.code: + case 289: + input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_A)) + case 288: + input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_B)) + case 290: + input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_C)) + case 291: + input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_D)) + case 292: + input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_SELECT)) + case 293: + input_events.append(InputEvent(InputEvent.EventType(event.value), InputEvent.Button.BUTTON_START)) + if event.type == evdev.ecodes.EV_ABS and event.code == evdev.ecodes.ABS_X: + match event.value: + case 0xB9: # EMG + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 9)) + case 0xB5: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 8)) + case 0xB2: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 7)) + case 0xAF: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 6)) + case 0xA8: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 5)) + case 0xA2: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 4)) + case 0x9A: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 3)) + case 0x94: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 2)) + case 0x8A: + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 1)) + case 0x79: # N + input_events.append(InputEvent(InputEvent.EventType.BRAKE_NOTCH, 0)) + if event.type == evdev.ecodes.EV_ABS and event.code == evdev.ecodes.ABS_Y: + match event.value: + case 0x81: # N + input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 0)) + case 0x6D: + input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 1)) + case 0x54: + input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 2)) + case 0x3F: + input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 3)) + case 0x21: + input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 4)) + case 0x00: # P5 + input_events.append(InputEvent(InputEvent.EventType.POWER_NOTCH, 5)) + return input_events + except OSError: + return [InputEvent(InputEvent.EventType.ERROR, None)] \ No newline at end of file