Add support for input DGOC-44U

This commit is contained in:
Marc Riera Irigoyen 2022-11-19 12:26:27 +01:00
parent 24f41f10fe
commit f9ab1ce64f
2 changed files with 88 additions and 3 deletions

View file

@ -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**.

View file

@ -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)]