Added init function for better usability, added check for HIDGuardian usage

This commit is contained in:
Florian Kaiser
2020-12-22 14:11:33 +01:00
committed by Florian K
parent 3f16538555
commit b004d2bc7b

View File

@@ -1,59 +1,85 @@
from os import device_encoding
import hid import hid
from .enums import (LedOptions, PlayerID, from .enums import (LedOptions, PlayerID,
PulseOptions, TriggerModes, Brightness) PulseOptions, TriggerModes, Brightness)
import threading import threading
import sys
import winreg
class pydualsense: class pydualsense:
def __init__(self, verbose: bool = False) -> None: def __init__(self, verbose: bool = False) -> None:
# TODO: maybe add a init function to not automatically allocate controller when class is declared # TODO: maybe add a init function to not automatically allocate controller when class is declared
self.verbose = verbose self.verbose = verbose
self.receive_buffer_size = 64
self.device: hid.Device = self.__find_device() self.send_report_size = 48
self.light = DSLight() # control led light of ds
self.audio = DSAudio()
self.triggerL = DSTrigger()
self.triggerR = DSTrigger()
self.color = (0,0,255) # set color around touchpad to blue self.color = (0,0,255) # set color around touchpad to blue
self.receive_buffer_size = 64
self.send_report_size = 48
# controller states
self.state = DSState()
def init(self):
"""initialize module and device
"""
self.device: hid.Device = self.__find_device()
self.light = DSLight() # control led light of ds
self.audio = DSAudio() # ds audio setting
self.triggerL = DSTrigger() # left trigger
self.triggerR = DSTrigger() # right trigger
self.state = DSState() # controller states
# thread for receiving and sending # thread for receiving and sending
self.ds_thread = True self.ds_thread = True
self.report_thread = threading.Thread(target=self.sendReport) self.report_thread = threading.Thread(target=self.sendReport)
self.report_thread.start() self.report_thread.start()
self.init = True
def close(self): def close(self):
self.ds_thread = False self.ds_thread = False
self.report_thread.join() self.report_thread.join()
self.device.close() self.device.close()
def __find_device(self): def _check_hide(self):
devices = hid.enumerate(vid=0x054c) """check if hidguardian is used and controller is hidden
found_devices = [] """
for device in devices: if sys.platform.startswith('win32'):
if device['vendor_id'] == 0x054c and device['product_id'] == 0x0CE6: try:
found_devices.append(device) 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)
else:
# TODO: find something for other platforms. Maybe not even needed on linux
return False
def __find_device(self):
# TODO: detect connection mode, bluetooth has a bigger write buffer # TODO: detect connection mode, bluetooth has a bigger write buffer
# TODO: implement multiple controllers working # TODO: implement multiple controllers working
if len(found_devices) != 1: if self._check_hide():
raise Exception('no dualsense controller detected') raise Exception('HIDGuardian detected. Delete the controller from HIDGuardian and restart PC to connect to controller')
detected_device = None
devices = hid.enumerate(vid=0x054c)
for device in devices:
if device['vendor_id'] == 0x054c and device['product_id'] == 0x0CE6:
detected_device = device
dual_sense = hid.Device(vid=found_devices[0]['vendor_id'], pid=found_devices[0]['product_id']) if detected_device == None:
raise Exception('No device detected')
dual_sense = hid.Device(vid=detected_device['vendor_id'], pid=detected_device['product_id'])
return dual_sense return dual_sense
# right trigger # right trigger
def setRightTriggerMode(self, mode: TriggerModes): def setRightTriggerMode(self, mode: TriggerModes):
"""set the trigger mode for R2 """set the trigger mode for R2
@@ -63,6 +89,7 @@ class pydualsense:
""" """
self.triggerR.mode = mode self.triggerR.mode = mode
def setRightTriggerForce(self, forceID: int, force: int): def setRightTriggerForce(self, forceID: int, force: int):
"""set the right trigger force. trigger consist of 7 parameter """set the right trigger force. trigger consist of 7 parameter
@@ -77,7 +104,6 @@ class pydualsense:
self.triggerR.setForce(id=forceID, force=force) self.triggerR.setForce(id=forceID, force=force)
# left trigger
def setLeftTriggerMode(self, mode: TriggerModes): def setLeftTriggerMode(self, mode: TriggerModes):
"""set the trigger mode for L2 """set the trigger mode for L2
@@ -86,6 +112,7 @@ class pydualsense:
""" """
self.triggerL.mode = mode self.triggerL.mode = mode
def setLeftTriggerForce(self, forceID: int, force: int): def setLeftTriggerForce(self, forceID: int, force: int):
"""set the left trigger force. trigger consist of 7 parameter """set the left trigger force. trigger consist of 7 parameter
@@ -398,10 +425,6 @@ class DSLight:
def setBrightness(self, brightness: Brightness): def setBrightness(self, brightness: Brightness):
self._brightness = brightness self._brightness = brightness
def setPlayerNumer(self, player):
if player > 5:
raise Exception('only 5 players supported. choose 1-5')
class DSAudio: class DSAudio: