diff --git a/.github/workflows/python-mypy.yml b/.github/workflows/python-mypy.yml deleted file mode 100644 index c5f0f7f..0000000 --- a/.github/workflows/python-mypy.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Mypy - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - name: Mypy - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install mypy - - name: mypy - run: | - mypy pydualsense/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index f379579..8175c97 100644 --- a/.gitignore +++ b/.gitignore @@ -149,6 +149,9 @@ dmypy.json !.vscode/extensions.json *.code-workspace +### pycharm ### +.idea/* + # End of https://www.toptal.com/developers/gitignore/api/python,vscode pydualsense/interface.py diff --git a/README.md b/README.md index f5ab9c6..f1c8b67 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ pip install pydualsense ```python -from pydualsense import pydualsense +from pydualsense import pydualsense, TriggerModes ds = pydualsense() # open controller ds.init() # initialize controller diff --git a/pydualsense/hidguardian.py b/pydualsense/hidguardian.py new file mode 100644 index 0000000..f7114b8 --- /dev/null +++ b/pydualsense/hidguardian.py @@ -0,0 +1,18 @@ +import winreg +import sys + +def check_hide() -> bool: + """check if hidguardian is used and controller is hidden + """ + if sys.platform.startswith('win32'): + try: + access_reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + access_key = winreg.OpenKey(access_reg, 'SYSTEM\CurrentControlSet\Services\HidGuardian\Parameters', 0, winreg.KEY_READ) + affected_devices = winreg.QueryValueEx(access_key, 'AffectedDevices')[0] + if "054C" in affected_devices and "0CE6" in affected_devices: + return True + return False + except OSError as e: + print(e) + + return False diff --git a/pydualsense/pydualsense.py b/pydualsense/pydualsense.py index 5e1c693..36d6ee7 100644 --- a/pydualsense/pydualsense.py +++ b/pydualsense/pydualsense.py @@ -1,14 +1,12 @@ # needed for python > 3.8 import os, sys -if sys.version_info >= (3,8): +if sys.platform.startswith('win32') and sys.version_info >= (3,8): os.add_dll_directory(os.getcwd()) -import hid # type: ignore -from .enums import (LedOptions, PlayerID, - PulseOptions, TriggerModes, Brightness) +import hidapi +from .enums import (LedOptions, PlayerID, PulseOptions, TriggerModes, Brightness) # type: ignore import threading -import winreg class pydualsense: def __init__(self, verbose: bool = False) -> None:# @@ -24,7 +22,7 @@ class pydualsense: def init(self): """initialize module and device states """ - self.device: hid.Device = self.__find_device() + self.device: hidapi.Device = self.__find_device() self.light = DSLight() # control led light of ds self.audio = DSAudio() # ds audio setting self.triggerL = DSTrigger() # left trigger @@ -38,8 +36,6 @@ class pydualsense: self.report_thread = threading.Thread(target=self.sendReport) self.report_thread.start() - self.init = True - def close(self): """ Stops the report thread and closes the HID device @@ -48,24 +44,8 @@ class pydualsense: self.report_thread.join() self.device.close() - def _check_hide(self) -> bool: - """check if hidguardian is used and controller is hidden - """ - if sys.platform.startswith('win32'): - try: - access_reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - access_key = winreg.OpenKey(access_reg, 'SYSTEM\CurrentControlSet\Services\HidGuardian\Parameters', 0, winreg.KEY_READ) - affected_devices = winreg.QueryValueEx(access_key, 'AffectedDevices')[0] - if "054C" in affected_devices and "0CE6" in affected_devices: - return True - return False - except OSError as e: - print(e) - return False - - - def __find_device(self) -> hid.Device: + def __find_device(self) -> hidapi.Device: """ find HID device and open it @@ -78,19 +58,21 @@ class pydualsense: """ # TODO: detect connection mode, bluetooth has a bigger write buffer # TODO: implement multiple controllers working - if self._check_hide(): - raise Exception('HIDGuardian detected. Delete the controller from HIDGuardian and restart PC to connect to controller') - detected_device: hid.Device = None - devices = hid.enumerate(vid=0x054c) + if sys.platform.startswith('win32'): + import pydualsense.hidguardian as hidguardian + if hidguardian.check_hide(): + raise Exception('HIDGuardian detected. Delete the controller from HIDGuardian and restart PC to connect to controller') + detected_device: hidapi.Device = None + devices = hidapi.enumerate(vendor_id=0x054c) for device in devices: - if device['vendor_id'] == 0x054c and device['product_id'] == 0x0CE6: + if device.vendor_id == 0x054c and device.product_id == 0x0CE6: detected_device = device if detected_device == None: raise Exception('No device detected') - dual_sense = hid.Device(vid=detected_device['vendor_id'], pid=detected_device['product_id']) + dual_sense = hidapi.Device(vendor_id=detected_device.vendor_id, product_id=detected_device.product_id) return dual_sense def setLeftMotor(self, intensity: int): @@ -138,7 +120,7 @@ class pydualsense: # read data from the input report of the controller inReport = self.device.read(self.receive_buffer_size) - + print(inReport) # decrypt the packet and bind the inputs self.readInput(inReport) @@ -538,4 +520,4 @@ class DSTrigger: if not isinstance(mode, TriggerModes): raise TypeError('Trigger mode parameter needs to be of type `TriggerModes`') - self.mode = mode \ No newline at end of file + self.mode = mode diff --git a/setup.py b/setup.py index c4c8b28..7214f17 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ with open("README.md", "r") as fh: setup( name='pydualsense', - version='0.4.2', + version='0.5.1', description='use your DualSense (PS5) controller with python', long_description=long_description, long_description_content_type="text/markdown", @@ -14,5 +14,5 @@ setup( author='Florian K', license='MIT License', packages=setuptools.find_packages(), - install_requires=['hid>=1.0.4'] + install_requires=['hidapi-usb', 'cffi'] )