From 519e667fe95b24d0e19fd71f0d6c7177af1375b6 Mon Sep 17 00:00:00 2001 From: Florian Kaiser <37000563+flok@users.noreply.github.com> Date: Sat, 2 Mar 2024 23:42:13 +0100 Subject: [PATCH] implementing poetry --- .github/workflows/python-publish.yml | 4 +- docs/source/conf.py | 8 +- docs/source/ds_eventsystem.rst | 2 +- examples/leds.py | 8 +- poetry.lock | 185 +++++++++++++++++++++ pydualsense/__init__.py | 14 +- pydualsense/checksum.py | 9 +- pydualsense/enums.py | 6 +- pydualsense/event_system.py | 3 - pydualsense/hidapi.dll | Bin 0 -> 162304 bytes pydualsense/hidguardian.py | 13 +- pydualsense/pydualsense.py | 235 +++++++++++++++++---------- pyproject.toml | 36 ++++ requirements.txt | 6 +- 14 files changed, 417 insertions(+), 112 deletions(-) create mode 100644 poetry.lock create mode 100644 pydualsense/hidapi.dll create mode 100644 pyproject.toml diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index d54dbd7..aa28772 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -21,11 +21,11 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install setuptools wheel twine poetry - name: Build and publish env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | - python setup.py sdist bdist_wheel + poetry build twine upload dist/* diff --git a/docs/source/conf.py b/docs/source/conf.py index e6c0ca6..ffaa892 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,5 +1,5 @@ import sys -import os +from pathlib import Path # Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: @@ -11,10 +11,10 @@ import os project = 'pydualsense' copyright = '2022, Florian (flok) K' author = 'Florian (flok) K' -release = '0.6.1' +release = '0.7.1' -sys.path.insert(0, os.path.abspath('..')) -sys.path.insert(0, os.path.abspath('../../')) + +sys.path.append(str(Path(__file__).parents[2])) # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/docs/source/ds_eventsystem.rst b/docs/source/ds_eventsystem.rst index 8b7246d..58f4ba1 100644 --- a/docs/source/ds_eventsystem.rst +++ b/docs/source/ds_eventsystem.rst @@ -1,5 +1,5 @@ pydualsense event system classes -========================= +================================ The `Event System` implements the event system used for the button callbacks diff --git a/examples/leds.py b/examples/leds.py index 0a3597d..6b9bd0b 100644 --- a/examples/leds.py +++ b/examples/leds.py @@ -1,16 +1,18 @@ -from pydualsense import * +from pydualsense import pydualsense +from pydualsense.enums import PlayerID +import time # get dualsense instance dualsense = pydualsense() dualsense.init() # set color around touchpad to red -dualsense.light.setColorI(255,0,0) +dualsense.light.setColorI(255, 0, 0) # mute microphone dualsense.audio.setMicrophoneState(True) # set all player 1 indicator on dualsense.light.setPlayerID(PlayerID.PLAYER_1) # sleep a little to see the result on the controller # this is not needed in normal usage -import time; time.sleep(2) +time.sleep(2) # terminate the thread for message and close the device dualsense.close() diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..9a989f7 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,185 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "hidapi-usb" +version = "0.3.1" +description = "CFFI wrapper for hidapi with changes by flok" +optional = false +python-versions = "*" +files = [ + {file = "hidapi-usb-0.3.1.tar.gz", hash = "sha256:447ebf44942ab6c4ec2ac355567934b73f688a833266ab0094ea4e10f968cc13"}, + {file = "hidapi_usb-0.3.1-py3-none-any.whl", hash = "sha256:b5556ea285e5df02d5f53c2e03b432c87fcc692830279c3f0064040116211679"}, +] + +[package.dependencies] +cffi = "*" + +[[package]] +name = "mslex" +version = "1.1.0" +description = "shlex for windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mslex-1.1.0-py2.py3-none-any.whl", hash = "sha256:8826f4bb8d8c63402203d921dc8c2df0c7fec0d9c91d020ddf02fc9d0dce81bd"}, + {file = "mslex-1.1.0.tar.gz", hash = "sha256:7fe305fbdc9721283875e0b737fdb344374b761338a7f41af91875de278568e4"}, +] + +[[package]] +name = "psutil" +version = "5.9.8" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "taskipy" +version = "1.12.2" +description = "tasks runner for python projects" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "taskipy-1.12.2-py3-none-any.whl", hash = "sha256:ffdbb0bb0db54c0ec5c424610a3a087eea22706d4d1f6e3e8b4f12ebba05f98f"}, + {file = "taskipy-1.12.2.tar.gz", hash = "sha256:eadfdc20d6bb94d8018eda32f1dbf584cf4aa6cffb71ba5cc2de20d344f8c4fb"}, +] + +[package.dependencies] +colorama = ">=0.4.4,<0.5.0" +mslex = {version = ">=1.1.0,<2.0.0", markers = "sys_platform == \"win32\""} +psutil = ">=5.7.2,<6.0.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.7" +content-hash = "df693da77db69c7bc101566cbef11e351c47e416f881226e88e8d58114b55c41" diff --git a/pydualsense/__init__.py b/pydualsense/__init__.py index 3295285..d8999c4 100644 --- a/pydualsense/__init__.py +++ b/pydualsense/__init__.py @@ -1,3 +1,11 @@ -from .enums import LedOptions, Brightness, PlayerID, PulseOptions, TriggerModes -from .event_system import Event -from .pydualsense import pydualsense, DSLight, DSState, DSTouchpad, DSTrigger, DSAudio +import os +import sys +sys.path.append(os.path.dirname(__file__)) + +from .enums import LedOptions, Brightness, PlayerID, PulseOptions, TriggerModes # noqa : F401 +from .event_system import Event # noqa : F401 +from .pydualsense import pydualsense, DSLight, DSState, DSTouchpad, DSTrigger, DSAudio # noqa : F401 + +print(sys.path) + +__version__ = "0.7.1" \ No newline at end of file diff --git a/pydualsense/checksum.py b/pydualsense/checksum.py index 9794024..849847c 100644 --- a/pydualsense/checksum.py +++ b/pydualsense/checksum.py @@ -1,7 +1,7 @@ import array # from South-River - +# fmt: off hashTable = array.array('I', [ 0xd202ef8d, 0xa505df1b, 0x3c0c8ea1, 0x4b0bbe37, 0xd56f2b94, 0xa2681b02, 0x3b614ab8, 0x4c667a2e, 0xdcd967bf, 0xabde5729, 0x32d70693, 0x45d03605, 0xdbb4a3a6, 0xacb39330, 0x35bac28a, 0x42bdf21c, @@ -36,12 +36,13 @@ hashTable = array.array('I', [ 0x6fbf1d91, 0x18b82d07, 0x81b17cbd, 0xf6b64c2b, 0x68d2d988, 0x1fd5e91e, 0x86dcb8a4, 0xf1db8832, 0x616495a3, 0x1663a535, 0x8f6af48f, 0xf86dc419, 0x660951ba, 0x110e612c, 0x88073096, 0xff000000 ]) +# fmt:on def compute(buffer): - result = 0xeada2d49 + result = 0xEADA2D49 for i in range(0, 74): - result = hashTable[(result&0xFF)^(buffer[i]&0xFF)]^(result>>8) + result = hashTable[(result & 0xFF) ^ (buffer[i] & 0xFF)] ^ (result >> 8) - return result \ No newline at end of file + return result diff --git a/pydualsense/enums.py b/pydualsense/enums.py index 87b0b86..5717b7b 100644 --- a/pydualsense/enums.py +++ b/pydualsense/enums.py @@ -50,7 +50,7 @@ class BatteryState(IntFlag): POWER_SUPPLY_STATUS_DISCHARGING = 0x0 POWER_SUPPLY_STATUS_CHARGING = 0x1 POWER_SUPPLY_STATUS_FULL = 0x2 - POWER_SUPPLY_STATUS_NOT_CHARGING = 0xb - POWER_SUPPLY_STATUS_ERROR = 0xf - POWER_SUPPLY_TEMP_OR_VOLTAGE_OUT_OF_RANGE = 0xa + POWER_SUPPLY_STATUS_NOT_CHARGING = 0xB + POWER_SUPPLY_STATUS_ERROR = 0xF + POWER_SUPPLY_TEMP_OR_VOLTAGE_OUT_OF_RANGE = 0xA POWER_SUPPLY_STATUS_UNKNOWN = 0x0 diff --git a/pydualsense/event_system.py b/pydualsense/event_system.py index 024b244..b011bf0 100644 --- a/pydualsense/event_system.py +++ b/pydualsense/event_system.py @@ -1,6 +1,3 @@ -from collections import defaultdict - - class Event(object): """ Base class for the event driven system diff --git a/pydualsense/hidapi.dll b/pydualsense/hidapi.dll new file mode 100644 index 0000000000000000000000000000000000000000..4eded6eeb17e7dee808e4ef77b902532d9cffa69 GIT binary patch literal 162304 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 z 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 literal 0 HcmV?d00001 diff --git a/pydualsense/hidguardian.py b/pydualsense/hidguardian.py index 74a969b..c330d98 100644 --- a/pydualsense/hidguardian.py +++ b/pydualsense/hidguardian.py @@ -6,15 +6,20 @@ def check_hide() -> bool: """ check if hidguardian is used and controller is hidden """ - if sys.platform.startswith('win32'): + if sys.platform.startswith("win32"): try: access_reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - access_key = winreg.OpenKey(access_reg, r'SYSTEM\CurrentControlSet\Services\HidGuardian\Parameters', 0, winreg.KEY_READ) - affected_devices = winreg.QueryValueEx(access_key, 'AffectedDevices')[0] + access_key = winreg.OpenKey( + access_reg, + r"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: + except OSError: pass return False diff --git a/pydualsense/pydualsense.py b/pydualsense/pydualsense.py index 29441c2..2565723 100644 --- a/pydualsense/pydualsense.py +++ b/pydualsense/pydualsense.py @@ -3,11 +3,20 @@ import os import sys from sys import platform -if platform.startswith('Windows') and sys.version_info >= (3, 8): - os.add_dll_directory(os.getcwd()) +if platform.startswith("win32") and sys.version_info >= (3, 8): + os.environ["PATH"] += os.pathsep + os.path.dirname(__file__) + import hidapi -from .enums import (LedOptions, PlayerID, PulseOptions, TriggerModes, Brightness, ConnectionType, BatteryState) # type: ignore +from .enums import ( + LedOptions, + PlayerID, + PulseOptions, + TriggerModes, + Brightness, + ConnectionType, + BatteryState, +) # type: ignore import threading from .event_system import Event from .checksum import compute @@ -15,13 +24,12 @@ from copy import deepcopy logger = logging.getLogger() -FORMAT = '%(asctime)s %(message)s' +FORMAT = "%(asctime)s %(message)s" logging.basicConfig(format=FORMAT) logger.setLevel(logging.INFO) + class pydualsense: - - OUTPUT_REPORT_USB = 0x02 OUTPUT_REPORT_BT = 0x31 @@ -32,7 +40,7 @@ class pydualsense: Args: verbose (bool, optional): display verbose out (debug prints of input and output). Defaults to False. """ - # TODO: maybe add a init function to not automatically allocate controller when class is declared + self.verbose = verbose if self.verbose: @@ -86,7 +94,7 @@ class pydualsense: # trackpad touch # handles 1 or 2 fingers - #self.trackpad_frame_reported = Event() + # self.trackpad_frame_reported = Event() # gyrometer events self.gyro_changed = Event() @@ -98,13 +106,13 @@ class pydualsense: initialize module and device states. Starts the sendReport background thread at the end """ 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 - self.triggerR = DSTrigger() # right trigger - self.state = DSState() # controller states + 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 self.battery = DSBattery() - self.conType = self.determineConnectionType() # determine USB or BT connection + self.conType = self.determineConnectionType() # determine USB or BT connection self.ds_thread = True self.report_thread = threading.Thread(target=self.sendReport) self.report_thread.start() @@ -159,20 +167,25 @@ class pydualsense: """ # TODO: detect connection mode, bluetooth has a bigger write buffer # TODO: implement multiple controllers working - if sys.platform.startswith('win32'): + 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') + 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) + 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 is None: - raise Exception('No device detected') + raise Exception("No device detected") - dual_sense = hidapi.Device(vendor_id=detected_device.vendor_id, product_id=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) -> None: @@ -187,10 +200,10 @@ class pydualsense: Exception: intensity out of bounds 0..255 """ if not isinstance(intensity, int): - raise TypeError('left motor intensity needs to be an int') + raise TypeError("left motor intensity needs to be an int") if intensity > 255 or intensity < 0: - raise Exception('maximum intensity is 255') + raise Exception("maximum intensity is 255") self.leftMotor = intensity def setRightMotor(self, intensity: int) -> None: @@ -205,15 +218,14 @@ class pydualsense: Exception: intensity out of bounds 0..255 """ if not isinstance(intensity, int): - raise TypeError('right motor intensity needs to be an int') + raise TypeError("right motor intensity needs to be an int") if intensity > 255 or intensity < 0: - raise Exception('maximum intensity is 255') + raise Exception("maximum intensity is 255") self.rightMotor = intensity def sendReport(self) -> None: - """background thread handling the reading of the device and updating its states - """ + """background thread handling the reading of the device and updating its states""" while self.ds_thread: # read data from the input report of the controller inReport = self.device.read(self.input_report_length) @@ -239,9 +251,9 @@ class pydualsense: # the reports for BT and USB are structured the same, # but there is one more byte at the start of the bluetooth report. # We drop that byte, so that the format matches up again. - states = list(inReport)[1:] # convert bytes to list - else: # USB - states = list(inReport) # convert bytes to list + states = list(inReport)[1:] # convert bytes to list + else: # USB + states = list(inReport) # convert bytes to list self.states = states # states 0 is always 1 @@ -282,24 +294,40 @@ class pydualsense: # trackpad touch self.state.trackPadTouch0.ID = inReport[33] & 0x7F self.state.trackPadTouch0.isActive = (inReport[33] & 0x80) == 0 - self.state.trackPadTouch0.X = ((inReport[35] & 0x0f) << 8) | (inReport[34]) - self.state.trackPadTouch0.Y = ((inReport[36]) << 4) | ((inReport[35] & 0xf0) >> 4) + self.state.trackPadTouch0.X = ((inReport[35] & 0x0F) << 8) | (inReport[34]) + self.state.trackPadTouch0.Y = ((inReport[36]) << 4) | ( + (inReport[35] & 0xF0) >> 4 + ) # trackpad touch self.state.trackPadTouch1.ID = inReport[37] & 0x7F self.state.trackPadTouch1.isActive = (inReport[37] & 0x80) == 0 - self.state.trackPadTouch1.X = ((inReport[39] & 0x0f) << 8) | (inReport[38]) - self.state.trackPadTouch1.Y = ((inReport[40]) << 4) | ((inReport[39] & 0xf0) >> 4) + self.state.trackPadTouch1.X = ((inReport[39] & 0x0F) << 8) | (inReport[38]) + self.state.trackPadTouch1.Y = ((inReport[40]) << 4) | ( + (inReport[39] & 0xF0) >> 4 + ) # accelerometer - self.state.accelerometer.X = int.from_bytes(([inReport[16], inReport[17]]), byteorder='little', signed=True) - self.state.accelerometer.Y = int.from_bytes(([inReport[18], inReport[19]]), byteorder='little', signed=True) - self.state.accelerometer.Z = int.from_bytes(([inReport[20], inReport[21]]), byteorder='little', signed=True) + self.state.accelerometer.X = int.from_bytes( + ([inReport[16], inReport[17]]), byteorder="little", signed=True + ) + self.state.accelerometer.Y = int.from_bytes( + ([inReport[18], inReport[19]]), byteorder="little", signed=True + ) + self.state.accelerometer.Z = int.from_bytes( + ([inReport[20], inReport[21]]), byteorder="little", signed=True + ) # gyrometer - self.state.gyro.Pitch = int.from_bytes(([inReport[22], inReport[23]]), byteorder='little', signed=True) - self.state.gyro.Yaw = int.from_bytes(([inReport[24], inReport[25]]), byteorder='little', signed=True) - self.state.gyro.Roll = int.from_bytes(([inReport[26], inReport[27]]), byteorder='little', signed=True) + self.state.gyro.Pitch = int.from_bytes( + ([inReport[22], inReport[23]]), byteorder="little", signed=True + ) + self.state.gyro.Yaw = int.from_bytes( + ([inReport[24], inReport[25]]), byteorder="little", signed=True + ) + self.state.gyro.Roll = int.from_bytes( + ([inReport[26], inReport[27]]), byteorder="little", signed=True + ) # from kit-nya battery = states[53] @@ -375,21 +403,33 @@ class pydualsense: if self.state.options != self.last_states.options: self.option_pressed(self.state.options) - if self.state.accelerometer.X != self.last_states.accelerometer.X or \ - self.state.accelerometer.Y != self.last_states.accelerometer.Y or \ - self.state.accelerometer.Z != self.last_states.accelerometer.Z: - self.accelerometer_changed(self.state.accelerometer.X, self.state.accelerometer.Y, self.state.accelerometer.Z) + if ( + self.state.accelerometer.X != self.last_states.accelerometer.X + or self.state.accelerometer.Y != self.last_states.accelerometer.Y + or self.state.accelerometer.Z != self.last_states.accelerometer.Z + ): + self.accelerometer_changed( + self.state.accelerometer.X, + self.state.accelerometer.Y, + self.state.accelerometer.Z, + ) - if self.state.gyro.Pitch != self.last_states.gyro.Pitch or \ - self.state.gyro.Yaw != self.last_states.gyro.Yaw or \ - self.state.gyro.Roll != self.last_states.gyro.Roll: - self.gyro_changed(self.state.gyro.Pitch, self.state.gyro.Yaw, self.state.gyro.Roll) + if ( + self.state.gyro.Pitch != self.last_states.gyro.Pitch + or self.state.gyro.Yaw != self.last_states.gyro.Yaw + or self.state.gyro.Roll != self.last_states.gyro.Roll + ): + self.gyro_changed( + self.state.gyro.Pitch, self.state.gyro.Yaw, self.state.gyro.Roll + ) """ copy current state into temp object to check next cycle if a change occuret and event trigger is needed """ - self.last_states = deepcopy(self.state) # copy current state into object to check next time + self.last_states = deepcopy( + self.state + ) # copy current state into object to check next time # TODO: control mouse with touchpad for fun as DS4Windows @@ -411,7 +451,9 @@ class pydualsense: """ if self.conType == ConnectionType.USB: - outReport = [0] * self.output_report_length # create empty list with range of output report + outReport = ( + [0] * self.output_report_length + ) # create empty list with range of output report # packet type outReport[0] = self.OUTPUT_REPORT_USB @@ -423,7 +465,7 @@ class pydualsense: # 0x10 modification of audio volume # 0x20 toggling of internal speaker while headset is connected # 0x40 modification of microphone volume - outReport[1] = 0xff # [1] + outReport[1] = 0xFF # [1] # further flags determining what changes this packet will perform # 0x01 toggling microphone LED @@ -434,15 +476,15 @@ class pydualsense: # 0x20 ??? # 0x40 adjustment of overall motor/effect power (index 37 - read note on triggers) # 0x80 ??? - outReport[2] = 0x1 | 0x2 | 0x4 | 0x10 | 0x40 # [2] + outReport[2] = 0x1 | 0x2 | 0x4 | 0x10 | 0x40 # [2] - outReport[3] = self.rightMotor # right low freq motor 0-255 # [3] - outReport[4] = self.leftMotor # left low freq motor 0-255 # [4] + outReport[3] = self.rightMotor # right low freq motor 0-255 # [3] + outReport[4] = self.leftMotor # left low freq motor 0-255 # [4] # outReport[5] - outReport[8] audio related # set Micrphone LED, setting doesnt effect microphone settings - outReport[9] = self.audio.microphone_led # [9] + outReport[9] = self.audio.microphone_led # [9] outReport[10] = 0x10 if self.audio.microphone_mute is True else 0x00 @@ -474,10 +516,11 @@ class pydualsense: outReport[47] = self.light.TouchpadColor[2] elif self.conType == ConnectionType.BT: - - outReport = [0] * self.output_report_length # create empty list with range of output report + outReport = ( + [0] * self.output_report_length + ) # create empty list with range of output report # packet type - outReport[0] = self.OUTPUT_REPORT_BT # bt type + outReport[0] = self.OUTPUT_REPORT_BT # bt type outReport[1] = 0x02 @@ -489,7 +532,7 @@ class pydualsense: # 0x10 modification of audio volume # 0x20 toggling of internal speaker while headset is connected # 0x40 modification of microphone volume - outReport[2] = 0xff # [1] + outReport[2] = 0xFF # [1] # further flags determining what changes this packet will perform # 0x01 toggling microphone LED @@ -500,15 +543,15 @@ class pydualsense: # 0x20 ??? # 0x40 adjustment of overall motor/effect power (index 37 - read note on triggers) # 0x80 ??? - outReport[3] = 0x1 | 0x2 | 0x4 | 0x10 | 0x40 # [2] + outReport[3] = 0x1 | 0x2 | 0x4 | 0x10 | 0x40 # [2] - outReport[4] = self.rightMotor # right low freq motor 0-255 # [3] - outReport[5] = self.leftMotor # left low freq motor 0-255 # [4] + outReport[4] = self.rightMotor # right low freq motor 0-255 # [3] + outReport[5] = self.leftMotor # left low freq motor 0-255 # [4] # outReport[5] - outReport[8] audio related # set Micrphone LED, setting doesnt effect microphone settings - outReport[10] = self.audio.microphone_led # [9] + outReport[10] = self.audio.microphone_led # [9] outReport[11] = 0x10 if self.audio.microphone_mute is True else 0x00 @@ -541,7 +584,7 @@ class pydualsense: crcChecksum = compute(outReport) - outReport[74] = (crcChecksum & 0x000000FF) + outReport[74] = crcChecksum & 0x000000FF outReport[75] = (crcChecksum & 0x0000FF00) >> 8 outReport[76] = (crcChecksum & 0x00FF0000) >> 16 outReport[77] = (crcChecksum & 0xFF000000) >> 24 @@ -556,6 +599,7 @@ class DSTouchpad: """ Dualsense Touchpad class. Contains X and Y position of touch and if the touch isActive """ + def __init__(self) -> None: """ Class represents the Touchpad of the controller @@ -567,15 +611,37 @@ class DSTouchpad: class DSState: - def __init__(self) -> None: """ All dualsense states (inputs) that can be read. Second method to check if a input is pressed. """ self.square, self.triangle, self.circle, self.cross = False, False, False, False - self.DpadUp, self.DpadDown, self.DpadLeft, self.DpadRight = False, False, False, False - self.L1, self.L2, self.L3, self.R1, self.R2, self.R3, self.R2Btn, self.L2Btn = False, False, False, False, False, False, False, False - self.share, self.options, self.ps, self.touch1, self.touch2, self.touchBtn, self.touchRight, self.touchLeft = False, False, False, False, False, False, False, False + self.DpadUp, self.DpadDown, self.DpadLeft, self.DpadRight = ( + False, + False, + False, + False, + ) + self.L1, self.L2, self.L3, self.R1, self.R2, self.R3, self.R2Btn, self.L2Btn = ( + False, + False, + False, + False, + False, + False, + False, + False, + ) + ( + self.share, + self.options, + self.ps, + self.touch1, + self.touch2, + self.touchBtn, + self.touchRight, + self.touchLeft, + ) = False, False, False, False, False, False, False, False self.touchFinger1, self.touchFinger2 = False, False self.micBtn = False self.RX, self.RY, self.LX, self.LY = 128, 128, 128, 128 @@ -641,8 +707,9 @@ class DSLight: """ Represents all features of lights on the controller """ + def __init__(self) -> None: - self.brightness: Brightness = Brightness.low # sets + self.brightness: Brightness = Brightness.low # sets self.playerNumber: PlayerID = PlayerID.PLAYER_1 self.ledOption: LedOptions = LedOptions.Both self.pulseOptions: PulseOptions = PulseOptions.Off @@ -659,7 +726,7 @@ class DSLight: TypeError: LedOption is false type """ if not isinstance(option, LedOptions): - raise TypeError('Need LEDOption type') + raise TypeError("Need LEDOption type") self.ledOption = option def setPulseOption(self, option: PulseOptions): @@ -673,7 +740,7 @@ class DSLight: TypeError: Pulse option is false type """ if not isinstance(option, PulseOptions): - raise TypeError('Need PulseOption type') + raise TypeError("Need PulseOption type") self.pulseOptions = option def setBrightness(self, brightness: Brightness): @@ -687,7 +754,7 @@ class DSLight: TypeError: brightness false type """ if not isinstance(brightness, Brightness): - raise TypeError('Need Brightness type') + raise TypeError("Need Brightness type") self.brightness = brightness def setPlayerID(self, player: PlayerID): @@ -702,7 +769,7 @@ class DSLight: TypeError: [description] """ if not isinstance(player, PlayerID): - raise TypeError('Need PlayerID type') + raise TypeError("Need PlayerID type") self.playerNumber = player def setColorI(self, r: int, g: int, b: int) -> None: @@ -719,10 +786,10 @@ class DSLight: Exception: color channels are out of bounds """ if not isinstance(r, int) or not isinstance(g, int) or not isinstance(b, int): - raise TypeError('Color parameter need to be int') + raise TypeError("Color parameter need to be int") # check if color is out of bounds if (r > 255 or g > 255 or b > 255) or (r < 0 or g < 0 or b < 0): - raise Exception('colors have values from 0 to 255 only') + raise Exception("colors have values from 0 to 255 only") self.TouchpadColor = (r, g, b) def setColorT(self, color: tuple) -> None: @@ -737,12 +804,12 @@ class DSLight: Exception: color channels are out of bounds """ if not isinstance(color, tuple): - raise TypeError('Color type is tuple') + raise TypeError("Color type is tuple") # unpack for out of bounds check r, g, b = map(int, color) # check if color is out of bounds if (r > 255 or g > 255 or b > 255) or (r < 0 or g < 0 or b < 0): - raise Exception('colors have values from 0 to 255 only') + raise Exception("colors have values from 0 to 255 only") self.TouchpadColor = (r, g, b) @@ -766,7 +833,7 @@ class DSAudio: Exception: false state for the led """ if not isinstance(value, bool): - raise TypeError('MicrophoneLED can only be a bool') + raise TypeError("MicrophoneLED can only be a bool") self.microphone_led = value def setMicrophoneState(self, state: bool): @@ -781,9 +848,9 @@ class DSAudio: """ if not isinstance(state, bool): - raise TypeError('state needs to be bool') + raise TypeError("state needs to be bool") - self.setMicrophoneLED(state) # set led accordingly + self.setMicrophoneLED(state) # set led accordingly self.microphone_mute = state @@ -793,6 +860,7 @@ class DSTrigger: # TODO: make this interface more userfriendly so a developer knows what he is doing """ + def __init__(self) -> None: # trigger modes self.mode: TriggerModes = TriggerModes.Off @@ -813,10 +881,10 @@ class DSTrigger: Exception: choosen a false force parameter """ if not isinstance(forceID, int) or not isinstance(force, int): - raise TypeError('forceID and force needs to be type int') + raise TypeError("forceID and force needs to be type int") if forceID > 6 or forceID < 0: - raise Exception('only 7 parameters available') + raise Exception("only 7 parameters available") self.forces[forceID] = force @@ -831,7 +899,7 @@ class DSTrigger: TypeError: false Trigger mode type """ if not isinstance(mode, TriggerModes): - raise TypeError('Trigger mode parameter needs to be of type `TriggerModes`') + raise TypeError("Trigger mode parameter needs to be of type `TriggerModes`") self.mode = mode @@ -840,6 +908,7 @@ class DSGyro: """ Class representing the Gyro2 of the controller """ + def __init__(self) -> None: self.Pitch = 0 self.Yaw = 0 @@ -850,6 +919,7 @@ class DSAccelerometer: """ Class representing the Accelerometer of the controller """ + def __init__(self) -> None: self.X = 0 self.Y = 0 @@ -860,6 +930,7 @@ class DSBattery: """ Class representing the Battery of the controller """ + def __init__(self) -> None: self.State = BatteryState.POWER_SUPPLY_STATUS_UNKNOWN self.Level = 0 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..497cf71 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,36 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "pydualsense" +version = "0.7.1" +description = "use your DualSense (PS5) controller with python" +license = "MIT" +repository = "https://github.com/flok/pydualsense" +authors = ["Florian (flok) K"] +readme = "README.md" +packages = [{include = "pydualsense"}] +include = ["pydualsense/hidapi.dll"] + +[tool.poetry.dependencies] +python = "^3.7" +hidapi-usb = "^0.3.1" + +[tool.poetry.group.dev.dependencies] +taskipy = "^1.12.2" + +[tool.taskipy.tasks] +clear = "find pydualsense/ -type f \\( -iname \\*.c -o -iname \\*.cpp -o -iname \\*.pyd -o -iname \\*.so \\) -delete" +build = "poetry build" +html_docs = "make html -C docs" +post_build = "task clear" +post_test = "task clear" + + +[tool.poetry_bumpversion.file."pydualsense/__init__.py"] + + +[tool.ruff] +exclude = [".venv"] +line-length = 120 diff --git a/requirements.txt b/requirements.txt index 49c671e..c1ad984 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -hid-usb -sphinx -furo +cffi==1.15.1 ; python_version >= "3.7" and python_version < "4.0" +hidapi-usb==0.3.1 ; python_version >= "3.7" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0"