Compare commits
91 Commits
Author | SHA1 | Date | |
---|---|---|---|
0a3042b93c | |||
73fecc1904 | |||
ed252a6548 | |||
ad3214dd23 | |||
311b047bf5 | |||
13901aeb50 | |||
5f3f25cc8c | |||
96ae8860d5 | |||
8a8f6deb89 | |||
79230bfef3 | |||
063af49887 | |||
21da6857b0 | |||
0a892386ae | |||
83d7177a78 | |||
cc8afa8519 | |||
4cf83ce9d1 | |||
30379bd8e3 | |||
a6b4964e80 | |||
98ea8ef5b9 | |||
985e6a769d | |||
b0d364b15e | |||
f99b53d4b7 | |||
e02148c937 | |||
e99f8f761c | |||
074bff27d6 | |||
52264dc7cf | |||
25794ce68c | |||
8acc3666dc | |||
53b3dc3761 | |||
b236be16b7 | |||
97908392f6 | |||
1004d0fef5 | |||
422cb858ac | |||
ae528e516b | |||
9954e3c308 | |||
263853da7f | |||
e5f6d5697b | |||
74f2665a2f | |||
d2bf9a8a1e | |||
480411b50f | |||
4e8af089a0 | |||
7c6275db45 | |||
86b7e5dd13 | |||
3f9dfec413 | |||
803df7e087 | |||
82f908ae0a | |||
94564057b9 | |||
40c6af15ef | |||
b3603680d8 | |||
9dea5d4c10 | |||
b356ce2d9f | |||
8ac6883f17 | |||
1c2565cf39 | |||
3cccc1d1c7 | |||
3b898462e0 | |||
f2ea6a014b | |||
88c5208aea | |||
b78cc61b21 | |||
d9d604318c | |||
a5bf138ea5 | |||
95170bcd0d | |||
6eb50802d4 | |||
f1a6f6e21d | |||
148205d27a | |||
ff6f5ffa13 | |||
7791e1de0b | |||
124c961ff0 | |||
e5a1ff1bbd | |||
8c2fff3be1 | |||
50fa5106a3 | |||
d5790b538c | |||
4c4aed6fa8 | |||
baa3675406 | |||
1342f281d7 | |||
cefd61a97a | |||
7b2641f174 | |||
7d4037a748 | |||
d26316d273 | |||
2a9746d510 | |||
2285535276 | |||
2bbf4e19d1 | |||
caebb2be77 | |||
304e42025c | |||
0dc32bd979 | |||
17c947b6fb | |||
085355e0f9 | |||
029eb3095e | |||
6eca515cf7 | |||
57d2d60f67 | |||
1ccceeeb06 | |||
ff3bfc66d2 |
29
.gitea/workflows/test.yml
Normal file
29
.gitea/workflows/test.yml
Normal file
@@ -0,0 +1,29 @@
|
||||
name: Run Controller Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches-ignore: [ main ]
|
||||
pull-request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/setup-python@v3
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
|
||||
- name: Install Dependencies
|
||||
run:
|
||||
python -m pip install --upgrade pip
|
||||
pip install pygame
|
||||
|
||||
- name: Run Unit Tests
|
||||
run:
|
||||
python -m unittest discover tests
|
@@ -1,3 +1,6 @@
|
||||
# PyGame-Controller
|
||||
|
||||
Small module to make it easy to add controller support.
|
||||
Small module to make it easy to add controller support.
|
||||
|
||||

|
||||

|
@@ -30,7 +30,7 @@ class TextPrint:
|
||||
|
||||
def main():
|
||||
# Set the width and height of the screen (width, height), and name the window.
|
||||
screen = pygame.display.set_mode((500, 700))
|
||||
screen = pygame.display.set_mode((800, 700))
|
||||
pygame.display.set_caption("Joystick example")
|
||||
|
||||
# Used to manage how fast the screen updates.
|
||||
|
55
joystick_debug.py
Normal file
55
joystick_debug.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import os
|
||||
import pygame
|
||||
from evdev import InputDevice, list_devices
|
||||
|
||||
def format_vidpid(info):
|
||||
return f"{info.vendor:04x}:{info.product:04x}"
|
||||
|
||||
def get_evdev_devices():
|
||||
evdev_devices = {}
|
||||
for path in list_devices():
|
||||
try:
|
||||
dev = InputDevice(path)
|
||||
evdev_devices[os.path.basename(path)] = {
|
||||
'name': dev.name,
|
||||
'phys': dev.phys,
|
||||
'vidpid': format_vidpid(dev.info),
|
||||
'path': path
|
||||
}
|
||||
except Exception:
|
||||
pass
|
||||
return evdev_devices
|
||||
|
||||
def match_evdev_to_pygame():
|
||||
pygame.init()
|
||||
pygame.joystick.init()
|
||||
|
||||
evdev_devices = get_evdev_devices()
|
||||
|
||||
for i in range(pygame.joystick.get_count()):
|
||||
js = pygame.joystick.Joystick(i)
|
||||
js.init()
|
||||
name = js.get_name()
|
||||
guid = js.get_guid()
|
||||
|
||||
# Try to guess the matching evdev device based on name
|
||||
matched = None
|
||||
for ev in evdev_devices.values():
|
||||
if name.lower() in ev['name'].lower() or ev['name'].lower() in name.lower():
|
||||
matched = ev
|
||||
break
|
||||
|
||||
print(f"Joystick {i}:")
|
||||
print(f" pygame name : {name}")
|
||||
print(f" pygame guid : {guid}")
|
||||
if matched:
|
||||
print(f" evdev name : {matched['name']}")
|
||||
print(f" path : {matched['path']}")
|
||||
print(f" phys : {matched['phys']}")
|
||||
print(f" VID:PID : {matched['vidpid']}")
|
||||
else:
|
||||
print(f" evdev info : [not matched]")
|
||||
print("-" * 40)
|
||||
|
||||
if __name__ == "__main__":
|
||||
match_evdev_to_pygame()
|
1
main.py
1
main.py
@@ -1,5 +1,6 @@
|
||||
import pygame
|
||||
import pygameControls as PC
|
||||
from pygameControls import globals
|
||||
|
||||
if __name__ == "__main__":
|
||||
pygame.init()
|
||||
|
@@ -1,31 +1,19 @@
|
||||
import pygame
|
||||
from .controlsbase import ControlsBase
|
||||
from .dualsense_controller import DualSenseController
|
||||
from .dualsense_edge_controller import DualSenseEdgeController
|
||||
from .logitech_f310_controller import LogitechF310Controller
|
||||
from .logitech_f510_controller import LogitechF510Controller
|
||||
from .logitech_f710_controller import LogitechF710Controller
|
||||
from .xbox_series_x_controller import XboxSeriesXController
|
||||
from .generic_controller import GenericController
|
||||
from .logitech_dual_action_controller import LogitechDualActionController
|
||||
from . import globals
|
||||
|
||||
__version__ = "0.1.7"
|
||||
|
||||
CONTROLLERS = {
|
||||
"DualSense Wireless Controller": DualSenseController,
|
||||
"DualSense Edge Wireless Controller": DualSenseEdgeController,
|
||||
"Logitech Gamepad F310": LogitechF310Controller,
|
||||
"Logitech Gamepad F510": LogitechF510Controller,
|
||||
"Logitech Gamepad F710": LogitechF710Controller,
|
||||
"Logitech Dual Action": LogitechDualActionController,
|
||||
"X box Series X Controller": XboxSeriesXController
|
||||
}
|
||||
__version__ = "0.2.7"
|
||||
|
||||
class Controllers:
|
||||
def __init__(self, joy):
|
||||
globals.init()
|
||||
self.controllers = []
|
||||
if not joy.get_name() in CONTROLLERS:
|
||||
self.controllers.append(GenericController(joy))
|
||||
else:
|
||||
self.controllers.append(CONTROLLERS[joy.get_name()](joy))
|
||||
|
||||
cont = self.detect_controller(joy.get_guid())
|
||||
self.controllers.append(cont(joy))
|
||||
|
||||
def detect_controller(self, guid):
|
||||
for gp in globals.GAMEPADS:
|
||||
for p in globals.GAMEPADS[gp]:
|
||||
if p["guid"] != guid:
|
||||
continue
|
||||
return p["class"]
|
||||
return globals.CONTROLLERS["Generic Controller"]
|
@@ -15,6 +15,7 @@ class DualSenseController(ControlsBase):
|
||||
self.device = pydualsense()
|
||||
self.device.init()
|
||||
self.name = self.device.device.get_product_string()
|
||||
self.guid = self.device.get_guid()
|
||||
self.powerlevel = self.device.battery.Level
|
||||
self.batterystate = BATTERY_STATE[str(self.device.battery.State)]
|
||||
self.set_player_id(PlayerID.PLAYER_1)
|
||||
@@ -25,25 +26,17 @@ class DualSenseController(ControlsBase):
|
||||
self.numbuttons: int = joy.get_numbuttons()
|
||||
self.buttons: list = [joy.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[3],
|
||||
"right stick y": self.axis[4],
|
||||
"right trigger": self.buttons[5],
|
||||
"left trigger": self.buttons[2],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[4],
|
||||
"right button": self.buttons[5],
|
||||
"cross button": self.buttons[0],
|
||||
"triangle button": self.buttons[2],
|
||||
"circle button": self.buttons[1],
|
||||
"square button": self.buttons[3],
|
||||
"left stick button": self.buttons[11],
|
||||
"right stick button": self.buttons[12],
|
||||
"connect button": self.buttons[8],
|
||||
"list button": self.buttons[9],
|
||||
"logo button": self.buttons[10]
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"cross button": 0,
|
||||
"triangle button": 2,
|
||||
"circle button": 1,
|
||||
"square button": 3,
|
||||
"left stick button": 11,
|
||||
"right stick button": 12,
|
||||
"connect button": 8,
|
||||
"list button": 9,
|
||||
"logo button": 10
|
||||
}
|
||||
print(f"{self.name} connected")
|
||||
print(f"Power level: {self.powerlevel}")
|
||||
|
@@ -7,6 +7,7 @@ class DualSenseEdgeController(ControlsBase):
|
||||
self.device = pydualsense()
|
||||
self.device.init()
|
||||
self.name = self.device.device.get_product_string()
|
||||
self.guid = self.device.get_guid()
|
||||
self.powerlevel = self.device.battery.Level
|
||||
self.batterystate = BATTERY_STATE[str(self.device.battery.State)]
|
||||
self.set_player_id(PlayerID.PLAYER_1)
|
||||
|
12
pygameControls/enums.py
Normal file
12
pygameControls/enums.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from enum import Enum
|
||||
|
||||
class ConnectionType(Enum):
|
||||
USB = 1
|
||||
BLUETOOTH = 2
|
||||
WIRELESS = 3
|
||||
Unknown = -1
|
||||
|
||||
class InputType(Enum):
|
||||
DirectInput = 1
|
||||
XInput = 2
|
||||
Unknown = -1
|
@@ -14,24 +14,18 @@ class GenericController(ControlsBase):
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[2],
|
||||
"right stick y": self.axis[3],
|
||||
"right trigger": self.buttons[7],
|
||||
"left trigger": self.buttons[6],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[4],
|
||||
"right button": self.buttons[5],
|
||||
"X button": self.buttons[0],
|
||||
"Y button": self.buttons[3],
|
||||
"A button": self.buttons[1],
|
||||
"B button": self.buttons[2],
|
||||
"left stick button": self.buttons[10],
|
||||
"right stick button": self.buttons[11],
|
||||
"back button": self.buttons[8],
|
||||
"start button": self.buttons[9],
|
||||
"r2 trigger": 7,
|
||||
"l2 trigger": 6,
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"X button": 0,
|
||||
"Y button": 3,
|
||||
"A button": 1,
|
||||
"B button": 2,
|
||||
"left stick button": 10,
|
||||
"right stick button": 11,
|
||||
"back button": 8,
|
||||
"start button": 9,
|
||||
"logo button": None
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
208
pygameControls/globals.py
Normal file
208
pygameControls/globals.py
Normal file
@@ -0,0 +1,208 @@
|
||||
from .enums import ConnectionType, InputType
|
||||
|
||||
from .controlsbase import ControlsBase
|
||||
from .dualsense_controller import DualSenseController
|
||||
from .dualsense_edge_controller import DualSenseEdgeController
|
||||
from .logitech_f310_controller import LogitechF310Controller
|
||||
from .logitech_f510_controller import LogitechF510Controller
|
||||
from .logitech_f710_controller import LogitechF710Controller
|
||||
from .xbox_series_x_controller import XboxSeriesXController
|
||||
from .sony_playstation3_controller import SonyPlayStation3Controller
|
||||
from .playstation3_controller import PlayStation3Controller
|
||||
from .sony_playstation4_controller import SonyPlayStation4Controller
|
||||
from .playstation4_controller import PlayStation4Controller
|
||||
from .generic_controller import GenericController
|
||||
from .logitech_dual_action_controller import LogitechDualActionController
|
||||
|
||||
def init():
|
||||
global VID_PID
|
||||
VID_PID = {
|
||||
"046d:c216": "Logitech Gamepad F310",
|
||||
"046d:c21d": "Microsoft X-Box 360 pad",
|
||||
"046d:c21d": "Logitech Dual Action",
|
||||
"045e:0b12": "Xbox Series X Controller",
|
||||
"045e:0b13": "Xbox Series X Controller",
|
||||
"045e:0b20": "Xbox Series X Controller",
|
||||
"045e:0b21": "Xbox Series X Controller",
|
||||
"054c:0ce6": "DualSense Wireless Controller",
|
||||
"054c:0df2": "DualSense Wireless Controller",
|
||||
}
|
||||
global CONTROLLERS
|
||||
CONTROLLERS = {
|
||||
"DualSense Wireless Controller": DualSenseController,
|
||||
"DualSense Edge Wireless Controller": DualSenseEdgeController,
|
||||
"Logitech Gamepad F310": LogitechF310Controller,
|
||||
"Logitech Gamepad F510": LogitechF510Controller,
|
||||
"Logitech Gamepad F710": LogitechF710Controller,
|
||||
"Logitech Dual Action": LogitechDualActionController,
|
||||
"Microsoft X-Box 360 pad": LogitechDualActionController,
|
||||
"Xbox Series X Controller": XboxSeriesXController,
|
||||
"Sony PLAYSTATION(R)3 Controller": SonyPlayStation3Controller,
|
||||
"PLAYSTATION(R)3 Controller": PlayStation3Controller,
|
||||
"Sony PLAYSTATION(R)4 Controller": SonyPlayStation4Controller,
|
||||
"PLAYSTATION(R)4 Controller": PlayStation4Controller,
|
||||
"Generic Controller": GenericController
|
||||
}
|
||||
global GAMEPADS
|
||||
GAMEPADS = {
|
||||
"Sony Controller": [
|
||||
{
|
||||
"vidpid": "054c:0ce6",
|
||||
"guid": "0300fd574c050000e60c000011810000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": [
|
||||
"Sony Interactive Entertainment DualSense Wireless Controller",
|
||||
"Sony Corp. DualSense wireless controller (PS5)",
|
||||
"DualSense Wireless Controller"
|
||||
],
|
||||
"class": CONTROLLERS["DualSense Wireless Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:0df2",
|
||||
"guid": "050057564c050000e60c000000810000",
|
||||
"connection": ConnectionType.BLUETOOTH,
|
||||
"input": InputType.DirectInput,
|
||||
"name": [
|
||||
"DualSense Wireless Controller"
|
||||
],
|
||||
"class": CONTROLLERS["DualSense Wireless Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:0dfc",
|
||||
"guid": "",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["DualSense Edge Wireless Controller"],
|
||||
"class": CONTROLLERS["DualSense Edge Wireless Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:0dfc",
|
||||
"guid": "",
|
||||
"connection": ConnectionType.BLUETOOTH,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["DualSense Edge Wireless Controller"],
|
||||
"class": CONTROLLERS["DualSense Edge Wireless Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:0268",
|
||||
"guid": "0300afd34c0500006802000011810000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["Sony PLAYSTATION(R)3 Controller"],
|
||||
"class": CONTROLLERS["Sony PLAYSTATION(R)3 Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "",
|
||||
"guid": "0500f9d24c0500006802000000800000",
|
||||
"connection": ConnectionType.BLUETOOTH,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["PLAYSTATION(R)3 Controller"],
|
||||
"class": CONTROLLERS["PLAYSTATION(R)3 Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:05c4",
|
||||
"guid": "",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["DualShock 4 v1 Controller"],
|
||||
"class": CONTROLLERS["PLAYSTATION(R)4 Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:05c4",
|
||||
"guid": "",
|
||||
"connection": ConnectionType.BLUETOOTH,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["DualShock 4 v1 Controller"],
|
||||
"class": CONTROLLERS["Sony PLAYSTATION(R)4 Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:09cc",
|
||||
"guid": "",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["DualShock 4 v2 Controller"],
|
||||
"class": CONTROLLERS["PLAYSTATION(R)4 Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "054c:09cc",
|
||||
"guid": "05009b514c050000cc09000000810000",
|
||||
"connection": ConnectionType.BLUETOOTH,
|
||||
"input": InputType.DirectInput,
|
||||
"name": ["Wireless Controller"],
|
||||
"class": CONTROLLERS["Sony PLAYSTATION(R)4 Controller"]
|
||||
}
|
||||
],
|
||||
"Microsoft Controller": [
|
||||
{
|
||||
"vidpid": "045e:0b12",
|
||||
"guid": "0300509d5e040000120b000017050000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.XInput,
|
||||
"name": [
|
||||
"Xbox Series X Controller",
|
||||
"Microsoft Corp. Xbox Controller"
|
||||
],
|
||||
"class": CONTROLLERS["Xbox Series X Controller"]
|
||||
},
|
||||
{
|
||||
"vidpid": "045e:0b13",
|
||||
"guid": "0500509d5e040000130b000023050000",
|
||||
"connection": ConnectionType.BLUETOOTH,
|
||||
"input": InputType.XInput,
|
||||
"name": [
|
||||
"Xbox Series X Controller",
|
||||
"Xbox Wireless Controller"
|
||||
],
|
||||
"class": CONTROLLERS["Xbox Series X Controller"]
|
||||
}
|
||||
],
|
||||
"Logitech Controller": [
|
||||
{
|
||||
"vidpid": "046d:c21d",
|
||||
"guid": "030005ff6d0400001dc2000014400000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.XInput,
|
||||
"name": [
|
||||
"Logitech, Inc. F310 Gamepad [XInput Mode]",
|
||||
"Logitech Gamepad F310"
|
||||
],
|
||||
"class": CONTROLLERS["Logitech Gamepad F310"]
|
||||
},
|
||||
{
|
||||
"vidpid": "046d:c216",
|
||||
"guid": "0300040e6d04000016c2000011010000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": [
|
||||
"Logitech, Inc. F310 Gamepad [DirectInput Mode]",
|
||||
"Logitech Dual Action",
|
||||
"Logitech Logitech Dual Action"
|
||||
],
|
||||
"class": CONTROLLERS["Logitech Dual Action"]
|
||||
},
|
||||
{
|
||||
"vidpid": "046d:c21d",
|
||||
"guid": "0333443e6d0400001fc2000005030000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.XInput,
|
||||
"name": [
|
||||
"Logitech, Inc. F710 Gamepad [XInput Mode]",
|
||||
"Logitech Gamepad F710"
|
||||
],
|
||||
"class": CONTROLLERS["Logitech Gamepad F710"]
|
||||
},
|
||||
{
|
||||
"vidpid": "046d:c216",
|
||||
"guid": "03005d8e6d04000019c2000011010000",
|
||||
"connection": ConnectionType.USB,
|
||||
"input": InputType.DirectInput,
|
||||
"name": [
|
||||
"Logitech, Inc. F710 Gamepad [DirectInput Mode]",
|
||||
"Logitech Dual Action",
|
||||
"Logitech Cordless Rumblepad 2"
|
||||
],
|
||||
"class": CONTROLLERS["Logitech Rumblepad 2"]
|
||||
}
|
||||
]
|
||||
}
|
@@ -14,12 +14,7 @@ This controller is a usb controller, with the following features.
|
||||
|
||||
import pygame
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
from enum import Enum
|
||||
|
||||
class InputMode(Enum):
|
||||
DirectInput = 1
|
||||
XInput = 2
|
||||
|
||||
class LogitechDualActionController(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
@@ -33,26 +28,19 @@ class LogitechDualActionController(ControlsBase):
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.input_mode = InputMode.DirectInput
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[2],
|
||||
"right stick y": self.axis[3],
|
||||
"right trigger": self.buttons[7],
|
||||
"left trigger": self.buttons[6],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[4],
|
||||
"right button": self.buttons[5],
|
||||
"X button": self.buttons[0],
|
||||
"Y button": self.buttons[3],
|
||||
"A button": self.buttons[1],
|
||||
"B button": self.buttons[2],
|
||||
"left stick button": self.buttons[10],
|
||||
"right stick button": self.buttons[11],
|
||||
"back button": self.buttons[8],
|
||||
"start button": self.buttons[9],
|
||||
"r2 trigger": 7,
|
||||
"l2 trigger": 6,
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"X button": 0,
|
||||
"Y button": 3,
|
||||
"A button": 1,
|
||||
"B button": 2,
|
||||
"left stick button": 10,
|
||||
"right stick button": 11,
|
||||
"back button": 8,
|
||||
"start button": 9,
|
||||
"logo button": None
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
@@ -91,12 +79,4 @@ class LogitechDualActionController(ControlsBase):
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
||||
@property
|
||||
def input_mode(self) -> int:
|
||||
return self._inputmode
|
||||
|
||||
@input_mode.setter
|
||||
def input_mode(self, mode: int) -> None:
|
||||
self._inputmode = mode
|
||||
|
@@ -14,12 +14,7 @@ This controller is a usb controller, with the following features.
|
||||
|
||||
import pygame
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
from enum import Enum
|
||||
|
||||
class InputMode(Enum):
|
||||
DirectInput = 1
|
||||
XInput = 2
|
||||
|
||||
class LogitechF310Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
@@ -33,27 +28,18 @@ class LogitechF310Controller(ControlsBase):
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.input_mode = InputMode.XInput
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[3],
|
||||
"right stick y": self.axis[4],
|
||||
"right trigger": self.axis[2],
|
||||
"left trigger": self.axis[5],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[4],
|
||||
"right button": self.buttons[5],
|
||||
"X button": self.buttons[2],
|
||||
"Y button": self.buttons[3],
|
||||
"A button": self.buttons[0],
|
||||
"B button": self.buttons[1],
|
||||
"left stick button": self.buttons[9],
|
||||
"right stick button": self.buttons[10],
|
||||
"back button": self.buttons[6],
|
||||
"start button": self.buttons[7],
|
||||
"logo button": self.buttons[8]
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"X button": 2,
|
||||
"Y button": 3,
|
||||
"A button": 0,
|
||||
"B button": 1,
|
||||
"left stick button": 9,
|
||||
"right stick button": 10,
|
||||
"back button": 6,
|
||||
"start button": 7,
|
||||
"logo button": 8
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
@@ -91,12 +77,4 @@ class LogitechF310Controller(ControlsBase):
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
||||
@property
|
||||
def input_mode(self) -> int:
|
||||
return self._inputmode
|
||||
|
||||
@input_mode.setter
|
||||
def input_mode(self, mode: int) -> None:
|
||||
self._inputmode = mode
|
||||
|
@@ -1,61 +1,37 @@
|
||||
"""
|
||||
Logitech F310 Controller class.
|
||||
This controller is a usb controller, with the following features.
|
||||
(XInput mode)
|
||||
6 axis
|
||||
11 buttons
|
||||
1 hat
|
||||
|
||||
(DirectInput mode)
|
||||
4 axis
|
||||
12 buttons
|
||||
1 hat
|
||||
Logitech F510 Controller class.
|
||||
This controller should have the same setup as the F310, but with the addition of rumble effect.
|
||||
I don't have this controller, so I haven't been able to verify the workings!
|
||||
Subsequent updates will be done, based on updates for the F310.
|
||||
"""
|
||||
|
||||
import pygame
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
from enum import Enum
|
||||
|
||||
class InputMode(Enum):
|
||||
DirectInput = 1
|
||||
XInput = 2
|
||||
|
||||
class ConnectionType(Enum):
|
||||
WIRED = 1
|
||||
WIRELESS = 2
|
||||
|
||||
class LogitechF510Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxis()
|
||||
self.axis: list = []
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = []
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = []
|
||||
self.input_mode: InputMode.DirectInput
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[3],
|
||||
"right stick y": self.axis[4],
|
||||
"right trigger": self.axis[2],
|
||||
"left trigger": self.axis[5],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[4],
|
||||
"right button": self.buttons[5],
|
||||
"X button": self.buttons[2],
|
||||
"Y button": self.buttons[3],
|
||||
"A button": self.buttons[0],
|
||||
"B button": self.buttons[1],
|
||||
"left stick button": self.buttons[9],
|
||||
"right stick button": self.buttons[10],
|
||||
"back button": self.buttons[6],
|
||||
"start button": self.buttons[7],
|
||||
"logo button": self.buttons[8]
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"X button": 2,
|
||||
"Y button": 3,
|
||||
"A button": 0,
|
||||
"B button": 1,
|
||||
"left stick button": 9,
|
||||
"right stick button": 10,
|
||||
"back button": 6,
|
||||
"start button": 7,
|
||||
"logo button": 8
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
@@ -117,19 +93,4 @@ class LogitechF510Controller(ControlsBase):
|
||||
@buttons.setter
|
||||
def buttons(self) -> None:
|
||||
self._buttons = [self.device.get_buttons(b) for b in range(self.numbuttons)]
|
||||
|
||||
@property
|
||||
def input_mode(self) -> int:
|
||||
return self._inputmode
|
||||
|
||||
@input_mode.setter
|
||||
def input_mode(self, mode: int) -> None:
|
||||
self._inputmode = mode
|
||||
|
||||
@property
|
||||
def input_connection(self) -> int:
|
||||
return self._input_connection
|
||||
|
||||
@input_connection.setter
|
||||
def input_connection(self, conn: int) -> None:
|
||||
self._input_connection = conn
|
||||
|
@@ -1,61 +1,35 @@
|
||||
"""
|
||||
Logitech F310 Controller class.
|
||||
This controller is a usb controller, with the following features.
|
||||
(XInput mode)
|
||||
6 axis
|
||||
11 buttons
|
||||
1 hat
|
||||
|
||||
(DirectInput mode)
|
||||
4 axis
|
||||
12 buttons
|
||||
1 hat
|
||||
Logitech F710 Controller class.
|
||||
This controller is a usb/wireless controller.
|
||||
"""
|
||||
|
||||
import pygame
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
from enum import Enum
|
||||
|
||||
class InputMode(Enum):
|
||||
DirectInput = 1
|
||||
XInput = 2
|
||||
|
||||
class ConnectionType(Enum):
|
||||
WIRED = 1
|
||||
WIRELESS = 2
|
||||
|
||||
class LogitechF710Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxis()
|
||||
self.axis: list = []
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = []
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = []
|
||||
self.input_mode: InputMode.DirectInput
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[3],
|
||||
"right stick y": self.axis[4],
|
||||
"right trigger": self.axis[2],
|
||||
"left trigger": self.axis[5],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[4],
|
||||
"right button": self.buttons[5],
|
||||
"X button": self.buttons[2],
|
||||
"Y button": self.buttons[3],
|
||||
"A button": self.buttons[0],
|
||||
"B button": self.buttons[1],
|
||||
"left stick button": self.buttons[9],
|
||||
"right stick button": self.buttons[10],
|
||||
"back button": self.buttons[6],
|
||||
"start button": self.buttons[7],
|
||||
"logo button": self.buttons[8]
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"X button": 2,
|
||||
"Y button": 3,
|
||||
"A button": 0,
|
||||
"B button": 1,
|
||||
"left stick button": 9,
|
||||
"right stick button": 10,
|
||||
"back button": 6,
|
||||
"start button": 7,
|
||||
"logo button": 8
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
@@ -117,19 +91,4 @@ class LogitechF710Controller(ControlsBase):
|
||||
@buttons.setter
|
||||
def buttons(self) -> None:
|
||||
self._buttons = [self.device.get_buttons(b) for b in range(self.numbuttons)]
|
||||
|
||||
@property
|
||||
def input_mode(self) -> int:
|
||||
return self._inputmode
|
||||
|
||||
@input_mode.setter
|
||||
def input_mode(self, mode: int) -> None:
|
||||
self._inputmode = mode
|
||||
|
||||
@property
|
||||
def input_connection(self) -> int:
|
||||
return self._input_connection
|
||||
|
||||
@input_connection.setter
|
||||
def input_connection(self, conn: int) -> None:
|
||||
self._input_connection = conn
|
||||
|
71
pygameControls/playstation3_controller.py
Normal file
71
pygameControls/playstation3_controller.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
import pygame
|
||||
|
||||
class PlayStation3Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxes()
|
||||
self.axis: list = [self.device.get_axis(a) for a in range(self.numaxis)]
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"cross button": 0,
|
||||
"triangle button": 2,
|
||||
"circle button": 1,
|
||||
"square button": 3,
|
||||
"left stick button": 11,
|
||||
"right stick button": 12,
|
||||
"logo button": 10,
|
||||
"select button": 8,
|
||||
"start button": 9,
|
||||
"down button": 14,
|
||||
"up button": 13,
|
||||
"left button": 15,
|
||||
"right button": 16
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
def close(self):
|
||||
self.device.quit()
|
||||
|
||||
def handle_input(self, event):
|
||||
pass
|
||||
|
||||
def left(self):
|
||||
pass
|
||||
|
||||
def right(self):
|
||||
pass
|
||||
|
||||
def up(self):
|
||||
pass
|
||||
|
||||
def down(self):
|
||||
pass
|
||||
|
||||
def pause(self):
|
||||
pass
|
||||
|
||||
def rumble(self, left, right, duration=0):
|
||||
if not left in range(256) or not right in range(256):
|
||||
raise ValueError("left and right values must be in the range 0 - 255")
|
||||
self.device.rumble(left / 255, right / 255, duration)
|
||||
|
||||
def stop_rumble(self):
|
||||
self.device.stop_rumble()
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
71
pygameControls/playstation4_controller.py
Normal file
71
pygameControls/playstation4_controller.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
import pygame
|
||||
|
||||
class PlayStation4Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxes()
|
||||
self.axis: list = [self.device.get_axis(a) for a in range(self.numaxis)]
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"cross button": 0,
|
||||
"triangle button": 2,
|
||||
"circle button": 1,
|
||||
"square button": 3,
|
||||
"left stick button": 11,
|
||||
"right stick button": 12,
|
||||
"logo button": 10,
|
||||
"select button": 8,
|
||||
"start button": 9,
|
||||
"down button": 14,
|
||||
"up button": 13,
|
||||
"left button": 15,
|
||||
"right button": 16
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
def close(self):
|
||||
self.device.quit()
|
||||
|
||||
def handle_input(self, event):
|
||||
pass
|
||||
|
||||
def left(self):
|
||||
pass
|
||||
|
||||
def right(self):
|
||||
pass
|
||||
|
||||
def up(self):
|
||||
pass
|
||||
|
||||
def down(self):
|
||||
pass
|
||||
|
||||
def pause(self):
|
||||
pass
|
||||
|
||||
def rumble(self, left, right, duration=0):
|
||||
if not left in range(256) or not right in range(256):
|
||||
raise ValueError("left and right values must be in the range 0 - 255")
|
||||
self.device.rumble(left / 255, right / 255, duration)
|
||||
|
||||
def stop_rumble(self):
|
||||
self.device.stop_rumble()
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
71
pygameControls/sony_playstation3_controller.py
Normal file
71
pygameControls/sony_playstation3_controller.py
Normal file
@@ -0,0 +1,71 @@
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
import pygame
|
||||
|
||||
class SonyPlayStation3Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxes()
|
||||
self.axis: list = [self.device.get_axis(a) for a in range(self.numaxis)]
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"cross button": 0,
|
||||
"triangle button": 2,
|
||||
"circle button": 1,
|
||||
"square button": 3,
|
||||
"left stick button": 11,
|
||||
"right stick button": 12,
|
||||
"logo button": 10,
|
||||
"select button": 8,
|
||||
"start button": 9,
|
||||
"down button": 14,
|
||||
"up button": 13,
|
||||
"left button": 15,
|
||||
"right button": 16
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
def close(self):
|
||||
self.device.quit()
|
||||
|
||||
def handle_input(self, event):
|
||||
pass
|
||||
|
||||
def left(self):
|
||||
pass
|
||||
|
||||
def right(self):
|
||||
pass
|
||||
|
||||
def up(self):
|
||||
pass
|
||||
|
||||
def down(self):
|
||||
pass
|
||||
|
||||
def pause(self):
|
||||
pass
|
||||
|
||||
def rumble(self, left, right, duration=0):
|
||||
if not left in range(256) or not right in range(256):
|
||||
raise ValueError("left and right values must be in the range 0 - 255")
|
||||
self.device.rumble(left / 255, right / 255, duration)
|
||||
|
||||
def stop_rumble(self):
|
||||
self.device.stop_rumble()
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
67
pygameControls/sony_playstation4_controller.py
Normal file
67
pygameControls/sony_playstation4_controller.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
import pygame
|
||||
|
||||
class SonyPlayStation4Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxes()
|
||||
self.axis: list = [self.device.get_axis(a) for a in range(self.numaxis)]
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"l1 button": 4,
|
||||
"r1 button": 5,
|
||||
"cross button": 0,
|
||||
"triangle button": 2,
|
||||
"circle button": 1,
|
||||
"square button": 3,
|
||||
"left stick button": 11,
|
||||
"right stick button": 12,
|
||||
"logo button": 10,
|
||||
"share button": 8,
|
||||
"options button": 9
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
def close(self):
|
||||
self.device.quit()
|
||||
|
||||
def handle_input(self, event):
|
||||
pass
|
||||
|
||||
def left(self):
|
||||
pass
|
||||
|
||||
def right(self):
|
||||
pass
|
||||
|
||||
def up(self):
|
||||
pass
|
||||
|
||||
def down(self):
|
||||
pass
|
||||
|
||||
def pause(self):
|
||||
pass
|
||||
|
||||
def rumble(self, left, right, duration=0):
|
||||
if not left in range(256) or not right in range(256):
|
||||
raise ValueError("left and right values must be in the range 0 - 255")
|
||||
self.device.rumble(left / 255, right / 255, duration)
|
||||
|
||||
def stop_rumble(self):
|
||||
self.device.stop_rumble()
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
31
pygameControls/tests/test_controller.py
Normal file
31
pygameControls/tests/test_controller.py
Normal file
@@ -0,0 +1,31 @@
|
||||
import unittest
|
||||
from unittest.mock import MagicMock
|
||||
from pygameControls import Controller
|
||||
|
||||
class TestController(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.mock_js = MagicMock()
|
||||
self.mock_js.get_button.side_effect = lambda i: 1 if i == 0 else 0
|
||||
self.mock_js.get_axis.side_effect = lambda i: 0.5 if i == 1 else 0.0
|
||||
self.mock_js.get_name.return_value = "DualSense Wireless Controller"
|
||||
self.mock_js.get_guid.return_value = "030000004c0500000c0e000011010000"
|
||||
|
||||
self.controller = Controller(self.mock_js)
|
||||
|
||||
def test_button_press(self):
|
||||
self.assertEqual(self.controller.get_button(0), 1)
|
||||
self.assertEqual(self.controller.get_button(1), 0)
|
||||
|
||||
def test_axis_reading(self):
|
||||
self.assertAlmostEqual(self.controller.get_axis(1), 0.5)
|
||||
|
||||
def test_profile_mapping(self):
|
||||
self.assertEqual(self.controller.get_mapping(), "Sony DualSense")
|
||||
|
||||
def test_custom_config(self):
|
||||
cfg = self.controller.get_custom_config()
|
||||
self.assertIn("cross", cfg)
|
||||
self.assertEqual(cfg["cross"], 0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
68
pygameControls/xbox_360_controller.py
Normal file
68
pygameControls/xbox_360_controller.py
Normal file
@@ -0,0 +1,68 @@
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
import pygame
|
||||
|
||||
class Xbox360Controller(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
self.device = joy
|
||||
self.instance_id: int = self.device.get_instance_id()
|
||||
self.name = self.device.get_name()
|
||||
self.guid = self.device.get_guid()
|
||||
self.numaxis: int = self.device.get_numaxes()
|
||||
self.axis: list = [self.device.get_axis(a) for a in range(self.numaxis)]
|
||||
self.numhats: int = self.device.get_numhats()
|
||||
self.hats: list = [self.device.get_hat(h) for h in range(self.numhats)]
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"l1 button": 6,
|
||||
"r1 button": 7,
|
||||
"X button": 3,
|
||||
"Y button": 4,
|
||||
"A button": 0,
|
||||
"B button": 1,
|
||||
"left stick button": 13,
|
||||
"right stick button": 14,
|
||||
"logo button": 12,
|
||||
"share button": 15,
|
||||
"list button": 11,
|
||||
"copy button": 10
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
def close(self):
|
||||
self.device.quit()
|
||||
|
||||
def handle_input(self, event):
|
||||
pass
|
||||
|
||||
def left(self):
|
||||
pass
|
||||
|
||||
def right(self):
|
||||
pass
|
||||
|
||||
def up(self):
|
||||
pass
|
||||
|
||||
def down(self):
|
||||
pass
|
||||
|
||||
def pause(self):
|
||||
pass
|
||||
|
||||
def rumble(self, left, right, duration=0):
|
||||
if not left in range(256) or not right in range(256):
|
||||
raise ValueError("left and right values must be in the range 0 - 255")
|
||||
self.device.rumble(left / 255, right / 255, duration)
|
||||
|
||||
def stop_rumble(self):
|
||||
self.device.stop_rumble()
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, name: str) -> None:
|
||||
self._name = name
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from pygameControls.controlsbase import ControlsBase
|
||||
import pygame
|
||||
|
||||
class XboxSeriesXController(ControlsBase):
|
||||
def __init__(self, joy):
|
||||
@@ -13,31 +14,23 @@ class XboxSeriesXController(ControlsBase):
|
||||
self.numbuttons: int = self.device.get_numbuttons()
|
||||
self.buttons: list = [self.device.get_button(b) for b in range(self.numbuttons)]
|
||||
self.mapping = {
|
||||
"left stick x": self.axis[0],
|
||||
"left stick y": self.axis[1],
|
||||
"right stick x": self.axis[2],
|
||||
"right stick y": self.axis[3],
|
||||
"right trigger": self.axis[4],
|
||||
"left trigger": self.axis[5],
|
||||
"dhat x": self.hats[0][0],
|
||||
"dhat y": self.hats[0][1],
|
||||
"left button": self.buttons[6],
|
||||
"right button": self.buttons[7],
|
||||
"X button": self.buttons[3],
|
||||
"Y button": self.buttons[4],
|
||||
"A button": self.buttons[0],
|
||||
"B button": self.buttons[1],
|
||||
"left stick button": self.buttons[13],
|
||||
"right stick button": self.buttons[14],
|
||||
"logo button": self.buttons[12],
|
||||
"share button": self.buttons[15],
|
||||
"list button": self.buttons[11],
|
||||
"copy button": self.buttons[10]
|
||||
"l1 button": 6,
|
||||
"r1 button": 7,
|
||||
"X button": 3,
|
||||
"Y button": 4,
|
||||
"A button": 0,
|
||||
"B button": 1,
|
||||
"left stick button": 13,
|
||||
"right stick button": 14,
|
||||
"logo button": 12,
|
||||
"share button": 15,
|
||||
"list button": 11,
|
||||
"copy button": 10
|
||||
}
|
||||
print(f"{self.name} connected.")
|
||||
|
||||
def close(self):
|
||||
pass
|
||||
self.device.quit()
|
||||
|
||||
def handle_input(self, event):
|
||||
pass
|
||||
@@ -57,13 +50,13 @@ class XboxSeriesXController(ControlsBase):
|
||||
def pause(self):
|
||||
pass
|
||||
|
||||
def rumble(self, left, right):
|
||||
def rumble(self, left, right, duration=0):
|
||||
if not left in range(256) or not right in range(256):
|
||||
raise ValueError("left and right values must be in the range 0 - 255")
|
||||
self.joy.rumble(left, right)
|
||||
self.device.rumble(left / 255, right / 255, duration)
|
||||
|
||||
def stop_rumble(self):
|
||||
self.joy.rumble(0, 0)
|
||||
self.device.stop_rumble()
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
|
@@ -3,4 +3,4 @@ pulsectl==24.12.0
|
||||
pydualsense==0.7.3
|
||||
pygame==2.6.1
|
||||
setuptools==68.2.2
|
||||
sounddevice==0.5.1
|
||||
sounddevice==0.5.1
|
Reference in New Issue
Block a user