From a137464ced7b7817562efa213e2307e267042658 Mon Sep 17 00:00:00 2001 From: Danny Staple Date: Wed, 28 Dec 2022 20:50:51 +0000 Subject: [PATCH] Clear up old versions --- ch-13/ble-tests/computer/poetry.lock | 314 ------- ch-13/ble-tests/computer/pyproject.toml | 18 - .../computer/robot_ble_connection.py | 38 - ch-13/ble-tests/computer/test_ble.py | 22 - ch-13/ble-tests/robot/code.py | 13 - ch-13/full-version/display_from_robot.py | 79 -- ch-13/full-version/find_devices.py | 13 - ch-13/full-version/poetry.lock | 777 ------------------ ch-13/full-version/pyproject.toml | 21 - ch-13/full-version/render_distance_grid.py | 27 - ch-13/full-version/requirements.txt | 3 - ch-13/full-version/robot/arena.py | 86 -- ch-13/full-version/robot/code.py | 284 ------- ch-13/full-version/robot/pid_controller.py | 27 - ch-13/full-version/robot/pio_encoder.py | 84 -- ch-13/full-version/robot/robot.py | 76 -- ch-13/full-version/robot_ble_connection.py | 40 - ch-13/layer-1/robot/code.py | 75 -- ch-13/layer-1/robot/pid_controller.py | 27 - ch-13/layer-1/robot/pio_encoder.py | 84 -- ch-13/layer-1/robot/robot.py | 78 -- 21 files changed, 2186 deletions(-) delete mode 100644 ch-13/ble-tests/computer/poetry.lock delete mode 100644 ch-13/ble-tests/computer/pyproject.toml delete mode 100644 ch-13/ble-tests/computer/robot_ble_connection.py delete mode 100644 ch-13/ble-tests/computer/test_ble.py delete mode 100644 ch-13/ble-tests/robot/code.py delete mode 100644 ch-13/full-version/display_from_robot.py delete mode 100644 ch-13/full-version/find_devices.py delete mode 100644 ch-13/full-version/poetry.lock delete mode 100644 ch-13/full-version/pyproject.toml delete mode 100644 ch-13/full-version/render_distance_grid.py delete mode 100644 ch-13/full-version/requirements.txt delete mode 100644 ch-13/full-version/robot/arena.py delete mode 100644 ch-13/full-version/robot/code.py delete mode 100644 ch-13/full-version/robot/pid_controller.py delete mode 100644 ch-13/full-version/robot/pio_encoder.py delete mode 100755 ch-13/full-version/robot/robot.py delete mode 100644 ch-13/full-version/robot_ble_connection.py delete mode 100644 ch-13/layer-1/robot/code.py delete mode 100644 ch-13/layer-1/robot/pid_controller.py delete mode 100644 ch-13/layer-1/robot/pio_encoder.py delete mode 100755 ch-13/layer-1/robot/robot.py diff --git a/ch-13/ble-tests/computer/poetry.lock b/ch-13/ble-tests/computer/poetry.lock deleted file mode 100644 index d6d68bb..0000000 --- a/ch-13/ble-tests/computer/poetry.lock +++ /dev/null @@ -1,314 +0,0 @@ -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "black" -version = "22.10.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "bleak" -version = "0.19.0" -description = "Bluetooth Low Energy platform Agnostic Klient" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" - -[package.dependencies] -async-timeout = ">=3.0.0,<5" -bleak-winrt = {version = ">=1.2.0,<2.0.0", markers = "platform_system == \"Windows\""} -dbus-fast = {version = ">=1.22.0,<2.0.0", markers = "platform_system == \"Linux\""} -pyobjc-core = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} -pyobjc-framework-CoreBluetooth = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} -pyobjc-framework-libdispatch = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} - -[[package]] -name = "bleak-winrt" -version = "1.2.0" -description = "Python WinRT bindings for Bleak" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" - -[[package]] -name = "dbus-fast" -version = "1.75.0" -description = "A faster version of dbus-next" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" - -[package.dependencies] -async-timeout = {version = ">=3.0.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pathspec" -version = "0.10.2" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "platformdirs" -version = "2.5.4" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pyobjc-core" -version = "8.5.1" -description = "Python<->ObjC Interoperability Module" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyobjc-framework-Cocoa" -version = "8.5.1" -description = "Wrappers for the Cocoa frameworks on macOS" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyobjc-core = ">=8.5.1" - -[[package]] -name = "pyobjc-framework-CoreBluetooth" -version = "8.5.1" -description = "Wrappers for the framework CoreBluetooth on macOS" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyobjc-core = ">=8.5.1" -pyobjc-framework-Cocoa = ">=8.5.1" - -[[package]] -name = "pyobjc-framework-libdispatch" -version = "8.5.1" -description = "Wrappers for libdispatch on macOS" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyobjc-core = ">=8.5.1" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" -optional = false -python-versions = ">=3.7" - -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "4ff9097130bf3c55c4ee87470b74c4e1c2f5fc736a0c95be9332f8c4f7d7bf5e" - -[metadata.files] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -bleak = [ - {file = "bleak-0.19.0-py3-none-any.whl", hash = "sha256:ccdba0d17dcceb1326e4e46600b37e9019cd52ce01948e2a3dbd6c94d1e4de01"}, - {file = "bleak-0.19.0.tar.gz", hash = "sha256:cce5200ca9bac7daaa74dd009c867c8c2b161a124e234c74307462e86caf50e6"}, -] -bleak-winrt = [ - {file = "bleak-winrt-1.2.0.tar.gz", hash = "sha256:0577d070251b9354fc6c45ffac57e39341ebb08ead014b1bdbd43e211d2ce1d6"}, - {file = "bleak_winrt-1.2.0-cp310-cp310-win32.whl", hash = "sha256:a2ae3054d6843ae0cfd3b94c83293a1dfd5804393977dd69bde91cb5099fc47c"}, - {file = "bleak_winrt-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:677df51dc825c6657b3ae94f00bd09b8ab88422b40d6a7bdbf7972a63bc44e9a"}, - {file = "bleak_winrt-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9449cdb942f22c9892bc1ada99e2ccce9bea8a8af1493e81fefb6de2cb3a7b80"}, - {file = "bleak_winrt-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:98c1b5a6a6c431ac7f76aa4285b752fe14a1c626bd8a1dfa56f66173ff120bee"}, - {file = "bleak_winrt-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:623ac511696e1f58d83cb9c431e32f613395f2199b3db7f125a3d872cab968a4"}, - {file = "bleak_winrt-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:13ab06dec55469cf51a2c187be7b630a7a2922e1ea9ac1998135974a7239b1e3"}, - {file = "bleak_winrt-1.2.0-cp38-cp38-win32.whl", hash = "sha256:5a36ff8cd53068c01a795a75d2c13054ddc5f99ce6de62c1a97cd343fc4d0727"}, - {file = "bleak_winrt-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:810c00726653a962256b7acd8edf81ab9e4a3c66e936a342ce4aec7dbd3a7263"}, - {file = "bleak_winrt-1.2.0-cp39-cp39-win32.whl", hash = "sha256:dd740047a08925bde54bec357391fcee595d7b8ca0c74c87170a5cbc3f97aa0a"}, - {file = "bleak_winrt-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:63130c11acfe75c504a79c01f9919e87f009f5e742bfc7b7a5c2a9c72bf591a7"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -dbus-fast = [ - {file = "dbus_fast-1.75.0-cp310-cp310-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:93cfff95d80af2d606503fe3d0bdfda322c4624a24190e4751c408b4e1bba488"}, - {file = "dbus_fast-1.75.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fd873fbc8ec057727e0abfef6f75d3c4cc6300f292b8a4d861eddc21a84e4e"}, - {file = "dbus_fast-1.75.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87e6caf531462f6f2b32c3d67f3e8ae19756e684ea464e9d7cc91dafcb3f3df6"}, - {file = "dbus_fast-1.75.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9343a845594662df9f9585bf1ff1c24388b512ebfa045739536678589783ec75"}, - {file = "dbus_fast-1.75.0-cp311-cp311-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:37f77e60b76e90806e63c975b2540a19c544ad45f1a71ce6393f34049b834c73"}, - {file = "dbus_fast-1.75.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49ba968cea28c9fb95b745823d10d8324f36c11ddf7d516412584b9a560374e"}, - {file = "dbus_fast-1.75.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0a68fbc1b07aa027d24ce225aa2696005035dd6341975c921cd93bf1ac04c943"}, - {file = "dbus_fast-1.75.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7992130ab48b5bf93c310c62b7e325242becee52755090418d9e1377d5cfed81"}, - {file = "dbus_fast-1.75.0-cp37-cp37m-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:69615e0bd3b519f583e6866255c4bdc0a70a7a5d7acaace603175a4b46fdf971"}, - {file = "dbus_fast-1.75.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93a86a15bc6f227eb3eda4098fa9572e583bb81e2223012a2ca4130023960fc"}, - {file = "dbus_fast-1.75.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:373276149810364db2536615a0d9f589a226092867762ad10d54a5b8b81d3a53"}, - {file = "dbus_fast-1.75.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b1df5b53ecdfc93b0e8b8da4b9081755b02548654f674bedf3c48eb8eee8978c"}, - {file = "dbus_fast-1.75.0-cp38-cp38-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:b7da81a7274325a003caa8d835e65b5e404ccb12d9fc5a9c30e1569bf0fd830a"}, - {file = "dbus_fast-1.75.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d7af2934c781045b705c68de66ea81dfced5faa88e8762d9187136adc4e671e"}, - {file = "dbus_fast-1.75.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5b1355f9d5cd48d7c1f242be7180059cea1d336c96340ab359d991c08f48d873"}, - {file = "dbus_fast-1.75.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:343e7cf78a0960dcd6161a1cc4618f8353c36d15843e149e27817efe45869b25"}, - {file = "dbus_fast-1.75.0-cp39-cp39-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:c322b52ea4a35d2f5221831a8fc95c56e1813fe0fd30cbdd883f32a3db3f86d7"}, - {file = "dbus_fast-1.75.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a8c37ba6c63f906cde3c54a4675a3b8ae9466eac704c450e942e58afe7e85af"}, - {file = "dbus_fast-1.75.0-cp39-cp39-manylinux_2_31_x86_64.whl", hash = "sha256:41a6cbae35160545a78c47a3081615c2c062efde8c984659ec75c2d5ccb50ad3"}, - {file = "dbus_fast-1.75.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:98cc58063fa6553870ca590c908f074a4f45b0300b0eb31ba6e5c781935a0ce2"}, - {file = "dbus_fast-1.75.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f58d50203633c06cebb6fdda0d3d6807ca1e3bd012e6670b01af30c0a088033c"}, - {file = "dbus_fast-1.75.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:413d7989519d9280653c690fdc17517667dd8a5307ce067fa835371dc3c7259b"}, - {file = "dbus_fast-1.75.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:337ba4c0b3b8346dd08dcba7fe026f0dd897c0ed85c01b8d1b2580769bd51ccd"}, - {file = "dbus_fast-1.75.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:80b058910f4160bcbdc1e088ae2dd0b874795e7017ac371fbbe6586ccb228bc0"}, - {file = "dbus_fast-1.75.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51c7df44f761909c189509e0fdcc415f615d943fb6c93d3181135fe72c771d3e"}, - {file = "dbus_fast-1.75.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:abbb69aa500949450e4edea1427876d0acec3b181b83ae505c16be975b148fb6"}, - {file = "dbus_fast-1.75.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40ff98d606490cbda4df77a9484730d5465be58a53e0285897182af2539873c9"}, - {file = "dbus_fast-1.75.0.tar.gz", hash = "sha256:1023171d2f07181ea5457a2727ee5e8bec3650ceb5410c91d8915ff44520bf13"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, -] -platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, -] -pyobjc-core = [ - {file = "pyobjc-core-8.5.1.tar.gz", hash = "sha256:f8592a12de076c27006700c4a46164478564fa33d7da41e7cbdd0a3bf9ddbccf"}, - {file = "pyobjc_core-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b62dcf987cc511188fc2aa5b4d3b9fd895361ea4984380463497ce4b0752ddf4"}, - {file = "pyobjc_core-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0accc653501a655f66c13f149a1d3d30e6cb65824edf852f7960a00c4f930d5b"}, - {file = "pyobjc_core-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f82b32affc898e9e5af041c1cecde2c99f2ce160b87df77f678c99f1550a4655"}, - {file = "pyobjc_core-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f7b2f6b6f3caeb882c658fe0c7098be2e8b79893d84daa8e636cb3e58a07df00"}, - {file = "pyobjc_core-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:872c0202c911a5a2f1269261c168e36569f6ddac17e5d854ac19e581726570cc"}, - {file = "pyobjc_core-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:21f92e231a4bae7f2d160d065f5afbf5e859a1e37f29d34ac12592205fc8c108"}, - {file = "pyobjc_core-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:315334dd09781129af6a39641248891c4caa57043901750b0139c6614ce84ec0"}, -] -pyobjc-framework-Cocoa = [ - {file = "pyobjc-framework-Cocoa-8.5.1.tar.gz", hash = "sha256:9a3de5cdb4644e85daf53f2ed912ef6c16ea5804a9e65552eafe62c2e139eb8c"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aa572acc2628488a47be8d19f4701fc96fce7377cc4da18316e1e08c3918521a"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb3ae21c8d81b7f02a891088c623cef61bca89bd671eff58c632d2f926b649f3"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:88f08f5bd94c66d373d8413c1d08218aff4cff0b586e0cc4249b2284023e7577"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:063683b57e4bd88cb0f9631ae65d25ec4eecf427d2fe8d0c578f88da9c896f3f"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f8806ddfac40620fb27f185d0f8937e69e330617319ecc2eccf6b9c8451bdd1"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7733a9a201df9e0cc2a0cf7bf54d76bd7981cba9b599353b243e3e0c9eefec10"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f0ab227f99d3e25dd3db73f8cde0999914a5f0dd6a08600349d25f95eaa0da63"}, -] -pyobjc-framework-CoreBluetooth = [ - {file = "pyobjc-framework-CoreBluetooth-8.5.1.tar.gz", hash = "sha256:b4f621fc3b5bf289db58e64fd746773b18297f87a0ffc5502de74f69133301c1"}, - {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bc720f2987a4d28dc73b13146e7c104d717100deb75c244da68f1d0849096661"}, - {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2167f22886beb5b3ae69e475e055403f28eab065c49a25e2b98b050b483be799"}, - {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aa9587a36eca143701731e8bb6c369148f8cc48c28168d41e7323828e5117f2d"}, -] -pyobjc-framework-libdispatch = [ - {file = "pyobjc-framework-libdispatch-8.5.1.tar.gz", hash = "sha256:066fb34fceb326307559104d45532ec2c7b55426f9910b70dbefd5d1b8fd530f"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a316646ab30ba2a97bc828f8e27e7bb79efdf993d218a9c5118396b4f81dc762"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7730a29e4d9c7d8c2e8d9ffb60af0ab6699b2186296d2bff0a2dd54527578bc3"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:76208d9d2b0071df2950800495ac0300360bb5f25cbe9ab880b65cb809764979"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ad9aa4773ff1d89bf4385c081824c4f8708b50e3ac2fe0a9d590153242c0f67"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81e1833bd26f15930faba678f9efdffafc79ec04e2ea8b6d1b88cafc0883af97"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:73226e224436eb6383e7a8a811c90ed597995adb155b4f46d727881a383ac550"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d115355ce446fc073c75cedfd7ab0a13958adda8e3a3b1e421e1f1e5f65640da"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] diff --git a/ch-13/ble-tests/computer/pyproject.toml b/ch-13/ble-tests/computer/pyproject.toml deleted file mode 100644 index 3e56777..0000000 --- a/ch-13/ble-tests/computer/pyproject.toml +++ /dev/null @@ -1,18 +0,0 @@ -[tool.poetry] -name = "ble-test" -version = "0.1.0" -description = "" -authors = ["Danny Staple "] -readme = "README.md" -packages = [{include = "ble_test"}] - -[tool.poetry.dependencies] -python = "^3.9" -bleak = "0.19.0" - -[tool.poetry.group.dev.dependencies] -black = "^22.10.0" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/ch-13/ble-tests/computer/robot_ble_connection.py b/ch-13/ble-tests/computer/robot_ble_connection.py deleted file mode 100644 index 66dd100..0000000 --- a/ch-13/ble-tests/computer/robot_ble_connection.py +++ /dev/null @@ -1,38 +0,0 @@ -import asyncio - -import bleak - - -class BleConnection: - # See https://learn.adafruit.com/introducing-adafruit-ble-bluetooth-low-energy-friend/uart-service - ble_uuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" - rx_gatt = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" - tx_gatt = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" - ble_name = "Adafruit Bluefruit LE" - - def __init__(self, receive_handler): - self.ble_client = None - self.receive_handler = receive_handler - - def _uart_handler(self, _, data: bytes): - self.receive_handler(data) - - async def connect(self): - print("Scanning for devices...") - devices = await bleak.BleakScanner.discover(service_uuids=[self.ble_uuid]) - print(f"Found {len(devices)} devices") - print([device.name for device in devices]) - ble_device_info = [device for device in devices if device.name==self.ble_name][0] - print(f"Connecting to {ble_device_info.name}...") - self.ble_client = bleak.BleakClient(ble_device_info.address) - await self.ble_client.connect() - print("Connected to {}".format(ble_device_info.name)) - self.notify_task = asyncio.create_task( - self.ble_client.start_notify(self.rx_gatt, self._uart_handler) - ) - - async def close(self): - await self.ble_client.disconnect() - - async def send_uart_data(self, data): - await self.ble_client.write_gatt_char(self.tx_gatt, data) diff --git a/ch-13/ble-tests/computer/test_ble.py b/ch-13/ble-tests/computer/test_ble.py deleted file mode 100644 index 2a988bb..0000000 --- a/ch-13/ble-tests/computer/test_ble.py +++ /dev/null @@ -1,22 +0,0 @@ -import asyncio -from robot_ble_connection import BleConnection - -def handle_data(data): - print(f"Response: {data}") - -async def main(): - ble_connection = BleConnection(handle_data) - await ble_connection.connect() - try: - while True: - await asyncio.sleep(0.5) - await ble_connection.send_uart_data(bytes([65, 66, 13]))# "Hello World".encode()) - await asyncio.sleep(3) - await ble_connection.send_uart_data("Hello\nwith newline in middle".encode()) - await asyncio.sleep(3) - await ble_connection.send_uart_data("Hello with newline as end\n".encode()) - await asyncio.sleep(2.5) - finally: - await ble_connection.close() - -asyncio.run(main()) diff --git a/ch-13/ble-tests/robot/code.py b/ch-13/ble-tests/robot/code.py deleted file mode 100644 index 0e915a0..0000000 --- a/ch-13/ble-tests/robot/code.py +++ /dev/null @@ -1,13 +0,0 @@ -import board -import busio -import time -uart = busio.UART(board.GP12, board.GP13, baudrate=9600) - - -while True: - while uart.in_waiting: - print("Receiving data...") - data = uart.readline() - print(f"Received {data.decode()}") - uart.write(f"Received {len(data)} bytes\n".encode()) - time.sleep(0.1) diff --git a/ch-13/full-version/display_from_robot.py b/ch-13/full-version/display_from_robot.py deleted file mode 100644 index 0a53a9d..0000000 --- a/ch-13/full-version/display_from_robot.py +++ /dev/null @@ -1,79 +0,0 @@ -import asyncio -import json -import numpy as np -import matplotlib.pyplot as plt -from matplotlib.widgets import Button - -from robot_ble_connection import BleConnection - - -class RobotDisplay: - def __init__(self): - self.ble_connection = BleConnection(self.handle_data) - self.buffer = "" - self.arena = {} - self.closed = False - self.fig, self.ax = plt.subplots() - self.poses = np.zeros([20, 2], dtype=np.int16) - self.motion = np.zeros([200, 3], dtype=float) - - def handle_close(self, _): - self.closed = True - - def handle_data(self, data): - self.buffer += data.decode("utf-8") - while "\n" in self.buffer: - line, self.buffer = self.buffer.split("\n", 1) - print(f"Received data: {line}") - try: - message = json.loads(line) - except ValueError: - print("Error parsing JSON") - return - if "arena" in message: - self.arena = message - if "poses" in message: - incoming_poses = np.array(message["poses"], dtype=np.int16) - self.poses = incoming_poses - - def draw(self): - self.ax.clear() - if self.arena: - for line in self.arena["arena"]: - self.ax.plot( - [line[0][0], line[1][0]], [line[0][1], line[1][1]], color="black" - ) - self.ax.scatter(self.poses[:,0], self.poses[:,1], color="blue") - - async def send_command(self, command): - request = (json.dumps({"command": command}) ).encode() - print(f"Sending request: {request}") - await self.ble_connection.send_uart_data(request) - - def start(self, _): - self.button_task = asyncio.create_task(self.send_command("start")) - - # def stop(self, _): - # self.button_task = asyncio.create_task(self.send_command("stop")) - - async def main(self): - plt.ion() - await self.ble_connection.connect() - try: - await self.send_command("arena") - self.fig.canvas.mpl_connect("close_event", self.handle_close) - start_button = Button(plt.axes([0.7, 0.05, 0.1, 0.075]), "Start") - start_button.on_clicked(self.start) - # stop_button = Button(plt.axes([0.81, 0.05, 0.1, 0.075]), "Stop") - # stop_button.on_clicked(self.stop) - while not self.closed: - self.draw() - plt.draw() - plt.pause(0.05) - await asyncio.sleep(0.01) - finally: - await self.ble_connection.close() - - -robot_display = RobotDisplay() -asyncio.run(robot_display.main()) diff --git a/ch-13/full-version/find_devices.py b/ch-13/full-version/find_devices.py deleted file mode 100644 index de4035e..0000000 --- a/ch-13/full-version/find_devices.py +++ /dev/null @@ -1,13 +0,0 @@ -import asyncio -import bleak - -async def run(): - ble_uuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" - ble_name = "Adafruit Bluefruit LE" - devices = await bleak.BleakScanner.discover(service_uuids=[ble_uuid]) - print(f"Found {len(devices)} devices") - print([device.name for device in devices]) - ble_device_info = [device for device in devices if device.name==ble_name][0] - print(f"Found robot {ble_device_info.name}...") - -asyncio.run(run()) diff --git a/ch-13/full-version/poetry.lock b/ch-13/full-version/poetry.lock deleted file mode 100644 index a5e38b9..0000000 --- a/ch-13/full-version/poetry.lock +++ /dev/null @@ -1,777 +0,0 @@ -[[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "bleak" -version = "0.19.0" -description = "Bluetooth Low Energy platform Agnostic Klient" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" - -[package.dependencies] -async-timeout = ">=3.0.0,<5" -bleak-winrt = {version = ">=1.2.0,<2.0.0", markers = "platform_system == \"Windows\""} -dbus-fast = {version = ">=1.22.0,<2.0.0", markers = "platform_system == \"Linux\""} -pyobjc-core = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} -pyobjc-framework-CoreBluetooth = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} -pyobjc-framework-libdispatch = {version = ">=8.5.1,<9.0.0", markers = "platform_system == \"Darwin\""} - -[[package]] -name = "bleak-winrt" -version = "1.2.0" -description = "Python WinRT bindings for Bleak" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" - -[[package]] -name = "contourpy" -version = "1.0.6" -description = "Python library for calculating contours of 2D quadrilateral grids" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["docutils (<0.18)", "sphinx (<=5.2.0)", "sphinx-rtd-theme"] -test = ["Pillow", "flake8", "isort", "matplotlib", "pytest"] -test-minimal = ["pytest"] -test-no-codebase = ["Pillow", "matplotlib", "pytest"] - -[[package]] -name = "cycler" -version = "0.11.0" -description = "Composable style cycles" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "dbus-fast" -version = "1.83.0" -description = "A faster version of dbus-next" -category = "main" -optional = false -python-versions = ">=3.7,<4.0" - -[package.dependencies] -async-timeout = {version = ">=3.0.0", markers = "python_version < \"3.11\""} - -[[package]] -name = "fonttools" -version = "4.38.0" -description = "Tools to manipulate font files" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "kiwisolver" -version = "1.4.4" -description = "A fast implementation of the Cassowary constraint solver" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "matplotlib" -version = "3.6.1" -description = "Python plotting package" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -kiwisolver = ">=1.0.1" -numpy = ">=1.19" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.2.1" -python-dateutil = ">=2.7" -setuptools_scm = ">=7" - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "numpy" -version = "1.23.4" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "packaging" -version = "22.0" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pathspec" -version = "0.10.3" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "Pillow" -version = "9.3.0" -description = "Python Imaging Library (Fork)" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "platformdirs" -version = "2.6.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pyobjc-core" -version = "8.5.1" -description = "Python<->ObjC Interoperability Module" -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyobjc-framework-Cocoa" -version = "8.5.1" -description = "Wrappers for the Cocoa frameworks on macOS" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyobjc-core = ">=8.5.1" - -[[package]] -name = "pyobjc-framework-CoreBluetooth" -version = "8.5.1" -description = "Wrappers for the framework CoreBluetooth on macOS" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyobjc-core = ">=8.5.1" -pyobjc-framework-Cocoa = ">=8.5.1" - -[[package]] -name = "pyobjc-framework-libdispatch" -version = "8.5.1" -description = "Wrappers for libdispatch on macOS" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyobjc-core = ">=8.5.1" - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" -optional = false -python-versions = ">=3.6.8" - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "setuptools" -version = "65.6.3" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -packaging = ">=20.0" -setuptools = "*" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "4ec6eb3464cbb49afad347e67bdf7c353d7ea4030fd8ed4257098a5df334eb99" - -[metadata.files] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -black = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] -bleak = [ - {file = "bleak-0.19.0-py3-none-any.whl", hash = "sha256:ccdba0d17dcceb1326e4e46600b37e9019cd52ce01948e2a3dbd6c94d1e4de01"}, - {file = "bleak-0.19.0.tar.gz", hash = "sha256:cce5200ca9bac7daaa74dd009c867c8c2b161a124e234c74307462e86caf50e6"}, -] -bleak-winrt = [ - {file = "bleak-winrt-1.2.0.tar.gz", hash = "sha256:0577d070251b9354fc6c45ffac57e39341ebb08ead014b1bdbd43e211d2ce1d6"}, - {file = "bleak_winrt-1.2.0-cp310-cp310-win32.whl", hash = "sha256:a2ae3054d6843ae0cfd3b94c83293a1dfd5804393977dd69bde91cb5099fc47c"}, - {file = "bleak_winrt-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:677df51dc825c6657b3ae94f00bd09b8ab88422b40d6a7bdbf7972a63bc44e9a"}, - {file = "bleak_winrt-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9449cdb942f22c9892bc1ada99e2ccce9bea8a8af1493e81fefb6de2cb3a7b80"}, - {file = "bleak_winrt-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:98c1b5a6a6c431ac7f76aa4285b752fe14a1c626bd8a1dfa56f66173ff120bee"}, - {file = "bleak_winrt-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:623ac511696e1f58d83cb9c431e32f613395f2199b3db7f125a3d872cab968a4"}, - {file = "bleak_winrt-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:13ab06dec55469cf51a2c187be7b630a7a2922e1ea9ac1998135974a7239b1e3"}, - {file = "bleak_winrt-1.2.0-cp38-cp38-win32.whl", hash = "sha256:5a36ff8cd53068c01a795a75d2c13054ddc5f99ce6de62c1a97cd343fc4d0727"}, - {file = "bleak_winrt-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:810c00726653a962256b7acd8edf81ab9e4a3c66e936a342ce4aec7dbd3a7263"}, - {file = "bleak_winrt-1.2.0-cp39-cp39-win32.whl", hash = "sha256:dd740047a08925bde54bec357391fcee595d7b8ca0c74c87170a5cbc3f97aa0a"}, - {file = "bleak_winrt-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:63130c11acfe75c504a79c01f9919e87f009f5e742bfc7b7a5c2a9c72bf591a7"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -contourpy = [ - {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6"}, - {file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb"}, - {file = "contourpy-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b"}, - {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee"}, - {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48"}, - {file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72"}, - {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db"}, - {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1"}, - {file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3"}, - {file = "contourpy-1.0.6-cp310-cp310-win32.whl", hash = "sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b"}, - {file = "contourpy-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621"}, - {file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a"}, - {file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30"}, - {file = "contourpy-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f"}, - {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3"}, - {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa"}, - {file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45"}, - {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f"}, - {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2"}, - {file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b"}, - {file = "contourpy-1.0.6-cp311-cp311-win32.whl", hash = "sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b"}, - {file = "contourpy-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c"}, - {file = "contourpy-1.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e"}, - {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768"}, - {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278"}, - {file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512"}, - {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de"}, - {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a"}, - {file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd"}, - {file = "contourpy-1.0.6-cp37-cp37m-win32.whl", hash = "sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3"}, - {file = "contourpy-1.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e"}, - {file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf"}, - {file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340"}, - {file = "contourpy-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109"}, - {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9"}, - {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95"}, - {file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036"}, - {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d"}, - {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0"}, - {file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa"}, - {file = "contourpy-1.0.6-cp38-cp38-win32.whl", hash = "sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9"}, - {file = "contourpy-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1"}, - {file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9"}, - {file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5"}, - {file = "contourpy-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183"}, - {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd"}, - {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a"}, - {file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2"}, - {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0"}, - {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b"}, - {file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8"}, - {file = "contourpy-1.0.6-cp39-cp39-win32.whl", hash = "sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4"}, - {file = "contourpy-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769"}, - {file = "contourpy-1.0.6-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41"}, - {file = "contourpy-1.0.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832"}, - {file = "contourpy-1.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675"}, - {file = "contourpy-1.0.6.tar.gz", hash = "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142"}, -] -cycler = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] -dbus-fast = [ - {file = "dbus_fast-1.83.0-cp310-cp310-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:41fd66ed9298869f135c43a6f22f3790d4b765a6a593fb415322e4dabe6f5452"}, - {file = "dbus_fast-1.83.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dedfbede7c7fc3d026014e5eedaf67b58c91806c86e435896c37060d9afac6c4"}, - {file = "dbus_fast-1.83.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3445f2e3377f30d2d24de7b5dd378d18ce71263ec96c932cd1abea5396440a2a"}, - {file = "dbus_fast-1.83.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:40189a5f578fca92251bfecb4a26da3f7752f0db52b6bcff9784407d45232d2e"}, - {file = "dbus_fast-1.83.0-cp311-cp311-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:822e58c7d530b8b4dc79a54fe1718cda78feab9d64e8f6623f3a0b477b6443a3"}, - {file = "dbus_fast-1.83.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc5c48ac4472ec5ba059a29e95328d06e224b03d5b0d5f1e1cd718213aa324d0"}, - {file = "dbus_fast-1.83.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ca4aad792dd1fce92bc4da353f424db3195bd5f8750e1c98c27ed49bec0f650b"}, - {file = "dbus_fast-1.83.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d428b34bdd6eb7bb35a9ca750530e8ef675e056de2ad4551bc56850264e18d35"}, - {file = "dbus_fast-1.83.0-cp37-cp37m-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:b053c4c2f2ca4c0f0f6928346b621f2cac77f08c03a8ced530d47c2faa46408b"}, - {file = "dbus_fast-1.83.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2ccf9563b6a926d46d0b546e57526556c24848127e9997a868e78d16f150297"}, - {file = "dbus_fast-1.83.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a79c27ed8bb71c89c557398b61bb53d60f4d1de1c52c33386b8504ec65b0a299"}, - {file = "dbus_fast-1.83.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:94c9ec8b3639cee94691e5788d6db6a5b502834968888f1a8be38fd0c4806e7c"}, - {file = "dbus_fast-1.83.0-cp38-cp38-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:5ca89e42bba8954f75eca52a3f2d1e3ecf6bbf19f17c543de122ccf82dabb65b"}, - {file = "dbus_fast-1.83.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9c87ab1546a38b5a2b4170fb9eee2e40ef82961b714eefa46674f066b255ff1"}, - {file = "dbus_fast-1.83.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7283ff647b1dff8cdbd98edda8d73c86e4d619f774ad574c72fb8c8056baadfa"}, - {file = "dbus_fast-1.83.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1f9b6ea977feeb816f5d74578d67ac713a8134726257112693ed685e975585d3"}, - {file = "dbus_fast-1.83.0-cp39-cp39-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:5b12f018d6fedf0ffba3d8e2d25a1f436c4b100c95d925e6cea8c2aceb475fed"}, - {file = "dbus_fast-1.83.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3491e38e58bc1c4aeab67994b5bba6d663c0d8999d3a1f5aae23afe392d6099"}, - {file = "dbus_fast-1.83.0-cp39-cp39-manylinux_2_31_x86_64.whl", hash = "sha256:4306b87f88546d9645b6b1ccdc863e410798c1c1ad7312ed6b210aa8a1b23dde"}, - {file = "dbus_fast-1.83.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:463ea272c36cc55dc4d3b3d55d17738fd06c1f870c5d9f2d5727c50554461aa5"}, - {file = "dbus_fast-1.83.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6f0b9e74e190a10a93a3831c91b7289bedbcd51dc20aa4326ee723e89bf12c26"}, - {file = "dbus_fast-1.83.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:f6c82bc159817f4ded469ca75af79bdb1b94699546232ea8b43c809cb1b157c2"}, - {file = "dbus_fast-1.83.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb9eaed1af93b021e45e6b4dec0fbbba7ab7de6710c890df486a9aa2de1851b"}, - {file = "dbus_fast-1.83.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:cce251b7e7ebbdbc858abc2eaed781bda44999ec61ed77c637da0384eb74a0a0"}, - {file = "dbus_fast-1.83.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50729191ff9045566f960142c1b7ef284178924fc514d71f92e5a9486d83267d"}, - {file = "dbus_fast-1.83.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux_2_5_i686.manylinux1_i686.manylinux2014_i686.whl", hash = "sha256:4a4c1bca00c7b7fde4b72e4f8553c3d42d8459dcf475f94a7ffd8eab56e6ae9b"}, - {file = "dbus_fast-1.83.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88697f7b1616aa980e59648d469edba30a46393a23155c3246d7e2a7224bbbd6"}, - {file = "dbus_fast-1.83.0.tar.gz", hash = "sha256:6a1a96725f1c91157fab94ab0bf2a5ddfdf0ed5fb68510980698d8180f51c848"}, -] -fonttools = [ - {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, - {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, -] -kiwisolver = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, -] -matplotlib = [ - {file = "matplotlib-3.6.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:7730e60e751cfcfe7fcb223cf03c0b979e9a064c239783ad37929d340a364cef"}, - {file = "matplotlib-3.6.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9dd40505ccc526acaf9a5db1b3029e237c64b58f1249983b28a291c2d6a1d0fa"}, - {file = "matplotlib-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:85948b303534b69fd771126764cf883fde2af9b003eb5778cb60f3b46f93d3f6"}, - {file = "matplotlib-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71eced071825005011cdc64efbae2e2c76b8209c18aa487dedf69796fe4b1e40"}, - {file = "matplotlib-3.6.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220314c2d6b9ca11570d7cd4b841c9f3137546f188336003b9fb8def4dcb804d"}, - {file = "matplotlib-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc5d726d4d42865f909c5208a7841109d76584950dd0587b01a77cc279d4ab7"}, - {file = "matplotlib-3.6.1-cp310-cp310-win32.whl", hash = "sha256:183bf3ac6a6023ee590aa4b677f391ceed65ec0d6b930901a8483c267bd12995"}, - {file = "matplotlib-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:a68b91ac7e6bb26100a540a033f54c95fe06d9c0aa51312c2a52d07d1bde78f4"}, - {file = "matplotlib-3.6.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:4648f0d79a87bf50ee740058305c91091ee5e1fbb71a7d2f5fe6707bfe328d1c"}, - {file = "matplotlib-3.6.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9403764017d20ff570f7ce973a8b9637f08a6109118f4e0ce6c7493d8849a0d3"}, - {file = "matplotlib-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4c8b5a243dd29d50289d694e931bd6cb6ae0b5bd654d12c647543d63862540c"}, - {file = "matplotlib-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1effccef0cea2d4da9feeed22079adf6786f92c800a7d0d2ef2104318a1c66c"}, - {file = "matplotlib-3.6.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dc25473319afabe49150267e54648ac559c33b0fc2a80c8caecfbbc2948a820"}, - {file = "matplotlib-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47cb088bbce82ae9fc2edf3c25e56a5c6142ce2553fea2b781679f960a70c207"}, - {file = "matplotlib-3.6.1-cp311-cp311-win32.whl", hash = "sha256:4d3b0e0a4611bd22065bbf47e9b2f689ac9e575bcb850a9f0ae2bbed75cab956"}, - {file = "matplotlib-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:e3c116e779fbbf421a9e4d3060db259a9bb486d98f4e3c5a0877c599bd173582"}, - {file = "matplotlib-3.6.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:565f514dec81a41cbed10eb6011501879695087fc2787fb89423a466508abbbd"}, - {file = "matplotlib-3.6.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:05e86446562063d6186ff6d700118c0dbd5dccc403a6187351ee526c48878f10"}, - {file = "matplotlib-3.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8245e85fd793f58edf29b8a9e3be47e8ecf76ea1a1e8240545f2746181ca5787"}, - {file = "matplotlib-3.6.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1e2c75d5d1ff6b7ef9870360bfa23bea076b8dc0945a60d19453d7619ed9ea8f"}, - {file = "matplotlib-3.6.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c9756a8e69f6e1f76d47eb42132175b6814da1fbeae0545304c6d0fc2aae252a"}, - {file = "matplotlib-3.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f5788168da2661b42f7468063b725cc73fdbeeb80f2704cb2d8c415e9a57c50"}, - {file = "matplotlib-3.6.1-cp38-cp38-win32.whl", hash = "sha256:0bab7564aafd5902128d54b68dca04f5755413fb6b502100bb0235a545882c48"}, - {file = "matplotlib-3.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3c53486278a0629fd892783271dc994b962fba8dfe207445d039e14f1928ea46"}, - {file = "matplotlib-3.6.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:27337bcb38d5db7430c14f350924542d75416ec1546d5d9d9f39b362b71db3fb"}, - {file = "matplotlib-3.6.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:fad858519bd6d52dbfeebdbe04d00dd8e932ed436f1c535e61bcc970a96c11e4"}, - {file = "matplotlib-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4a3d903588b519b38ed085d0ae762a1dcd4b70164617292175cfd91b90d6c415"}, - {file = "matplotlib-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bdbd37d0a41e025879863fe9b17bab15c0421313bc33e77e5e1aa54215c9c5"}, - {file = "matplotlib-3.6.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e632f66218811d4cf8b7a2a649e25ec15406c3c498f72d19e2bcf8377f38445d"}, - {file = "matplotlib-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ddd58324dc9a77e2e56d7b7aea7dbd0575b6f7cd1333c3ca9d388ac70978344"}, - {file = "matplotlib-3.6.1-cp39-cp39-win32.whl", hash = "sha256:12ab21d0cad122f5b23688d453a0280676e7c42f634f0dbd093d15d42d142b1f"}, - {file = "matplotlib-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:563896ba269324872ace436a57775dcc8322678a9496b28a8c25cdafa5ec2b92"}, - {file = "matplotlib-3.6.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:52935b7d4ccbf0dbc9cf454dbb10ca99c11cbe8da9467596b96e5e21fd4dfc5c"}, - {file = "matplotlib-3.6.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87027ff7b2edeb14476900261ef04d4beae949e1dfa0a3eb3ad6a6efbf9d0e1d"}, - {file = "matplotlib-3.6.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4de03085afb3b80fab341afaf8e60dfe06ce439b6dfed55d657cf34a7bc3c40"}, - {file = "matplotlib-3.6.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b53387d4e59432ff221540a4ffb5ee9669c69417805e4faf0148a00d701c61f9"}, - {file = "matplotlib-3.6.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:02561141c434154f7bae8e5449909d152367cb40aa57bfb2a27f2748b9c5f95f"}, - {file = "matplotlib-3.6.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0161ebf87518ecfe0980c942d5f0d5df0e080c1746ebaab2027a969967014b7"}, - {file = "matplotlib-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2469f57e4c5cc0e85eddc7b30995ea9c404a78c0b1856da75d1a5887156ca350"}, - {file = "matplotlib-3.6.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5f97141e05baf160c3ec125f06ceb2a44c9bb62f42fcb8ee1c05313c73e99432"}, - {file = "matplotlib-3.6.1.tar.gz", hash = "sha256:e2d1b7225666f7e1bcc94c0bc9c587a82e3e8691da4757e357e5c2515222ee37"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -numpy = [ - {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, - {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, - {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, - {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, - {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, - {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, - {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, - {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, - {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, - {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, - {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, -] -packaging = [ - {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, - {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, -] -pathspec = [ - {file = "pathspec-0.10.3-py3-none-any.whl", hash = "sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6"}, - {file = "pathspec-0.10.3.tar.gz", hash = "sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6"}, -] -Pillow = [ - {file = "Pillow-9.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2"}, - {file = "Pillow-9.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c"}, - {file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de"}, - {file = "Pillow-9.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7"}, - {file = "Pillow-9.3.0-cp310-cp310-win32.whl", hash = "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91"}, - {file = "Pillow-9.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b"}, - {file = "Pillow-9.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20"}, - {file = "Pillow-9.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812"}, - {file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c"}, - {file = "Pillow-9.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11"}, - {file = "Pillow-9.3.0-cp311-cp311-win32.whl", hash = "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c"}, - {file = "Pillow-9.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef"}, - {file = "Pillow-9.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b"}, - {file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee"}, - {file = "Pillow-9.3.0-cp37-cp37m-win32.whl", hash = "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29"}, - {file = "Pillow-9.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4"}, - {file = "Pillow-9.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4"}, - {file = "Pillow-9.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07"}, - {file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636"}, - {file = "Pillow-9.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32"}, - {file = "Pillow-9.3.0-cp38-cp38-win32.whl", hash = "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0"}, - {file = "Pillow-9.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc"}, - {file = "Pillow-9.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad"}, - {file = "Pillow-9.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd"}, - {file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c"}, - {file = "Pillow-9.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448"}, - {file = "Pillow-9.3.0-cp39-cp39-win32.whl", hash = "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48"}, - {file = "Pillow-9.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e"}, - {file = "Pillow-9.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65"}, - {file = "Pillow-9.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8"}, - {file = "Pillow-9.3.0.tar.gz", hash = "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f"}, -] -platformdirs = [ - {file = "platformdirs-2.6.0-py3-none-any.whl", hash = "sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca"}, - {file = "platformdirs-2.6.0.tar.gz", hash = "sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e"}, -] -pyobjc-core = [ - {file = "pyobjc-core-8.5.1.tar.gz", hash = "sha256:f8592a12de076c27006700c4a46164478564fa33d7da41e7cbdd0a3bf9ddbccf"}, - {file = "pyobjc_core-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b62dcf987cc511188fc2aa5b4d3b9fd895361ea4984380463497ce4b0752ddf4"}, - {file = "pyobjc_core-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0accc653501a655f66c13f149a1d3d30e6cb65824edf852f7960a00c4f930d5b"}, - {file = "pyobjc_core-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f82b32affc898e9e5af041c1cecde2c99f2ce160b87df77f678c99f1550a4655"}, - {file = "pyobjc_core-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f7b2f6b6f3caeb882c658fe0c7098be2e8b79893d84daa8e636cb3e58a07df00"}, - {file = "pyobjc_core-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:872c0202c911a5a2f1269261c168e36569f6ddac17e5d854ac19e581726570cc"}, - {file = "pyobjc_core-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:21f92e231a4bae7f2d160d065f5afbf5e859a1e37f29d34ac12592205fc8c108"}, - {file = "pyobjc_core-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:315334dd09781129af6a39641248891c4caa57043901750b0139c6614ce84ec0"}, -] -pyobjc-framework-Cocoa = [ - {file = "pyobjc-framework-Cocoa-8.5.1.tar.gz", hash = "sha256:9a3de5cdb4644e85daf53f2ed912ef6c16ea5804a9e65552eafe62c2e139eb8c"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aa572acc2628488a47be8d19f4701fc96fce7377cc4da18316e1e08c3918521a"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb3ae21c8d81b7f02a891088c623cef61bca89bd671eff58c632d2f926b649f3"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:88f08f5bd94c66d373d8413c1d08218aff4cff0b586e0cc4249b2284023e7577"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:063683b57e4bd88cb0f9631ae65d25ec4eecf427d2fe8d0c578f88da9c896f3f"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f8806ddfac40620fb27f185d0f8937e69e330617319ecc2eccf6b9c8451bdd1"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7733a9a201df9e0cc2a0cf7bf54d76bd7981cba9b599353b243e3e0c9eefec10"}, - {file = "pyobjc_framework_Cocoa-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f0ab227f99d3e25dd3db73f8cde0999914a5f0dd6a08600349d25f95eaa0da63"}, -] -pyobjc-framework-CoreBluetooth = [ - {file = "pyobjc-framework-CoreBluetooth-8.5.1.tar.gz", hash = "sha256:b4f621fc3b5bf289db58e64fd746773b18297f87a0ffc5502de74f69133301c1"}, - {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bc720f2987a4d28dc73b13146e7c104d717100deb75c244da68f1d0849096661"}, - {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2167f22886beb5b3ae69e475e055403f28eab065c49a25e2b98b050b483be799"}, - {file = "pyobjc_framework_CoreBluetooth-8.5.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aa9587a36eca143701731e8bb6c369148f8cc48c28168d41e7323828e5117f2d"}, -] -pyobjc-framework-libdispatch = [ - {file = "pyobjc-framework-libdispatch-8.5.1.tar.gz", hash = "sha256:066fb34fceb326307559104d45532ec2c7b55426f9910b70dbefd5d1b8fd530f"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a316646ab30ba2a97bc828f8e27e7bb79efdf993d218a9c5118396b4f81dc762"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7730a29e4d9c7d8c2e8d9ffb60af0ab6699b2186296d2bff0a2dd54527578bc3"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:76208d9d2b0071df2950800495ac0300360bb5f25cbe9ab880b65cb809764979"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1ad9aa4773ff1d89bf4385c081824c4f8708b50e3ac2fe0a9d590153242c0f67"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81e1833bd26f15930faba678f9efdffafc79ec04e2ea8b6d1b88cafc0883af97"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:73226e224436eb6383e7a8a811c90ed597995adb155b4f46d727881a383ac550"}, - {file = "pyobjc_framework_libdispatch-8.5.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d115355ce446fc073c75cedfd7ab0a13958adda8e3a3b1e421e1f1e5f65640da"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -setuptools = [ - {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, - {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, -] -setuptools-scm = [ - {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, - {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] diff --git a/ch-13/full-version/pyproject.toml b/ch-13/full-version/pyproject.toml deleted file mode 100644 index e5ac640..0000000 --- a/ch-13/full-version/pyproject.toml +++ /dev/null @@ -1,21 +0,0 @@ -[tool.poetry] -name = "modelling-space" -version = "0.1.0" -description = "" -authors = ["Danny Staple "] -readme = "README.md" -packages = [{include = "modelling_space"}] - -[tool.poetry.dependencies] -python = "^3.9" -matplotlib = "3.6.1" -numpy = "1.23.4" -bleak = "0.19.0" - - -[tool.poetry.group.dev.dependencies] -black = "^22.10.0" - -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" diff --git a/ch-13/full-version/render_distance_grid.py b/ch-13/full-version/render_distance_grid.py deleted file mode 100644 index effc724..0000000 --- a/ch-13/full-version/render_distance_grid.py +++ /dev/null @@ -1,27 +0,0 @@ -import arena -from matplotlib import pyplot as plt -import numpy as np - -def draw_arena_boundaries(arena): - for line in arena: - plt.plot([line[0][0], line[1][0]], [line[0][1], line[1][1]], color="red") - -def draw_distance_grid(ax): - overscan_size = arena.overscan * arena.grid_cell_size - - ax.imshow( - arena.distance_grid.T, - extent = [-overscan_size, arena.width + overscan_size, -overscan_size, arena.height + overscan_size], - origin="lower", - cmap="gray", - norm="log", - ) - -fig, ax = plt.subplots() -draw_arena_boundaries(arena.boundary_lines) -print("Value at 0, 1500 is", arena.get_distance_grid_at_point(0, 1500)) -# print("Value at 1000, 500 is", arena.get_distance_grid_at_point(1000, 500)) -# print("Value at 500, 1000 is", arena.get_distance_grid_at_point(500, 1000)) -# print("Value at 550, 1000 is", arena.get_distance_grid_at_point(550, 1000)) -draw_distance_grid(ax) -plt.show() diff --git a/ch-13/full-version/requirements.txt b/ch-13/full-version/requirements.txt deleted file mode 100644 index 01fedac..0000000 --- a/ch-13/full-version/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -matplotlib==3.6.1 -numpy==1.23.4 -bleak==0.19.0 diff --git a/ch-13/full-version/robot/arena.py b/ch-13/full-version/robot/arena.py deleted file mode 100644 index b4e8a98..0000000 --- a/ch-13/full-version/robot/arena.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Represent the lines of the arena""" -try: - from ulab import numpy as np -except ImportError: - import numpy as np - -boundary_lines = [ - [(0,0), (0, 1500)], - [(0, 1500), (1500, 1500)], - [(1500, 1500), (1500, 500)], - [(1500, 500), (1000, 500)], - [(1000, 500), (1000, 0)], - [(1000, 0), (0, 0)], -] - -width = 1500 -height = 1500 - -# 0, 0 is bottom left. Heading 0 is right, with heading increasing anticlockwise. Standard position angles. - -def point_is_inside_arena(x, y): - """Return True if the point is inside the arena. - if the point is inside the rectangle, but not inside the cutout, it's inside the arena. - """ - # is it inside the rectangle? - if x < 0 or x > width \ - or y < 0 or y > height: - return False - # is it inside the cutout? - if x > 1000 and y < 500: - return False - return True - -def get_point_distance_to_segment(x, y, segment): - """Return the distance squared from the point to the segment. - Segment -> ((x1, y1), (x2, y2)) - All segments are horizontal or vertical. - """ - segment_x1, segment_y1 = segment[0] - segment_x2, segment_y2 = segment[1] - # if the segment is horizontal, the point will be closest to the y value of the segment - if segment_y1 == segment_y2 and x >= min(segment_x1, segment_x2) and x <= max(segment_x1, segment_x2): - return abs(y - segment_y1) - # if the segment is vertical, the point will be closest to the x value of the segment - if segment_x1 == segment_x2 and y >= min(segment_y1, segment_y2) and y <= max(segment_y1, segment_y2): - return abs(x - segment_x1) - # the point will be closest to one of the end points - return np.sqrt(min((x - segment_x1) ** 2 + (y - segment_y1) ** 2, (x - segment_x2) ** 2 + (y - segment_y2) ** 2)) - - -def get_point_decay_from_nearest_segment(segments, x, y): - """Return the distance from the point to the nearest segment as a decay function.""" - max_decay = None - for segment in segments: - decay = 1.0 / max(1, get_point_distance_to_segment(x, y, segment)) - if max_decay is None or decay > max_decay: - max_decay = decay - return max_decay - - -grid_cell_size = 50 -overscan = 10 # 10 each way - -# beam endpoint model -def make_distance_grid(): - """Take the boundary lines. With and overscan of 10 cells, and grid cell size of 5cm (50mm), - make a grid of the distance to the nearest boundary line. - """ - grid = np.zeros((width // grid_cell_size + 2 * overscan, height // grid_cell_size + 2 * overscan), dtype=np.uint8) - # 4kb as floats, 1 kb as uint8s. - for x in range(grid.shape[0]): - column_x = x * grid_cell_size - (overscan * grid_cell_size) - for y in range(grid.shape[1]): - value = int(get_point_decay_from_nearest_segment(boundary_lines, column_x, y * grid_cell_size - (overscan * grid_cell_size)) * 255) - grid[x, y] = value - return grid - -distance_grid = make_distance_grid() - -def get_distance_grid_at_point(x, y): - """Return the distance grid value at the given point.""" - grid_x = int(x // grid_cell_size + overscan) - grid_y = int(y // grid_cell_size + overscan) - if grid_x < 0 or grid_x >= distance_grid.shape[0] or grid_y < 0 or grid_y >= distance_grid.shape[1]: - return 0 - return distance_grid[grid_x, grid_y] diff --git a/ch-13/full-version/robot/code.py b/ch-13/full-version/robot/code.py deleted file mode 100644 index 83b364f..0000000 --- a/ch-13/full-version/robot/code.py +++ /dev/null @@ -1,284 +0,0 @@ -import asyncio -import json -import random -from ulab import numpy as np - -import arena -import robot - -class DistanceSensorTracker: - def __init__(self): - robot.left_distance.distance_mode = 2 - robot.right_distance.distance_mode = 2 - robot.left_distance.timing_budget = 50 - robot.right_distance.timing_budget = 50 - self.left = 300 - self.right = 300 - - async def main(self): - robot.left_distance.start_ranging() - robot.right_distance.start_ranging() - while True: - if robot.left_distance.data_ready and robot.left_distance.distance: - self.left = robot.left_distance.distance * 10 # convert to mm - robot.left_distance.clear_interrupt() - if robot.right_distance.data_ready and robot.right_distance.distance: - self.right = robot.right_distance.distance * 10 - robot.right_distance.clear_interrupt() - await asyncio.sleep(0.01) - - -class CollisionAvoid: - def __init__(self, distance_sensors): - self.speed = 0.6 - self.distance_sensors = distance_sensors - - async def main(self): - while True: - robot.set_right(self.speed) - while self.distance_sensors.left < 300 or \ - self.distance_sensors.right < 300: - robot.set_left(-self.speed) - await asyncio.sleep(0.3) - robot.set_left(self.speed) - await asyncio.sleep(0) - -def get_scaled_sample_around_mean(mean, scale): - return mean + (random.uniform(-scale, scale) + random.uniform(-scale, scale)) / 2 - -def convert_to_standard_position(true_bearing): - standard_position = 90 - true_bearing - if standard_position > 180: - standard_position -= 360 - elif standard_position < -180: - standard_position += 360 - return standard_position - - -def send_json(data): - robot.uart.write((json.dumps(data) + "\n").encode()) - -def read_json(): - try: - data = robot.uart.readline() - decoded = data.decode() - return json.loads(decoded) - except (UnicodeError, ValueError): - print("Invalid data") - return None - - -def send_poses(samples): - send_json({ - "poses": np.array(samples[:,:2], dtype=np.int16).tolist(), - }) - - -class Simulation: - def __init__(self): - self.population_size = 200 - self.imu_mix = 0.3 * 0.5 - self.encoder_mix = 0.7 - self.rotation_scale = 0.5 # degrees - self.speed_scale = 3 # mm - - # Poses - each an array of [x, y, heading] - self.poses = np.array( - [( - int(random.uniform(0, arena.width)), - int(random.uniform(0, arena.height)), - int(random.uniform(0, 360))) for _ in range(self.population_size)], - dtype=np.float, - ) - self.distance_sensors = DistanceSensorTracker() - self.collision_avoider = CollisionAvoid(self.distance_sensors) - self.last_encoder_left = robot.left_encoder.read() - self.last_encoder_right = robot.right_encoder.read() - - async def apply_sensor_model(self): - # Based on vl53l1x sensor readings, create weight for each pose. - # vl53l1x standard dev is +/- 5 mm. Each distance is a mean reading - # we will first determine sensor positions based on poses - # project forward based on distances sensed, introducing noise (based on standard dev) - # then check this projected position against occupancy grid - # and weight accordingly - - # distance sensor positions projected forward. x, y - distance_sensor_left = np.zeros( - (self.poses.shape[0], 2), dtype=np.float) - distance_sensor_right = np.zeros( - (self.poses.shape[0], 2), dtype=np.float) - # sensors - they are facing forward, either side of the robot. Project them out to the sides - # based on each poses heading and turn sensors into rays, - # left sensor - poses_left_90 = np.radians(self.poses[:, 2] + 90) - distance_sensor_left[:, 0] = self.poses[:, 0] + np.cos(poses_left_90) * robot.distance_sensor_from_middle - distance_sensor_left[:, 1] = self.poses[:, 1] + np.sin(poses_left_90) * robot.distance_sensor_from_middle - # now project forward by distance sensor range - distance_sensor_left[:, 0] += np.cos(self.poses[:, 2]) * self.distance_sensors.left - distance_sensor_left[:, 1] += np.sin(self.poses[:, 2]) * self.distance_sensors.left - # right sensor - poses_right_90 = np.radians(self.poses[:, 2] - 90) - distance_sensor_right[:, 0] = self.poses[:, 0] + np.cos(poses_right_90) * robot.distance_sensor_from_middle - distance_sensor_right[:, 1] = self.poses[:, 1] + np.sin(poses_right_90) * robot.distance_sensor_from_middle - # now project forward by distance sensor range - distance_sensor_right[:, 0] += np.cos(self.poses[:, 2]) * self.distance_sensors.right - distance_sensor_right[:, 1] += np.sin(self.poses[:, 2]) * self.distance_sensors.right - - await asyncio.sleep(0) - # weighted poses a numpy array of weights for each pose - weights = np.zeros(self.poses.shape[0], dtype=np.float) - for index in range(self.poses.shape[0]): - # remove any that are outside the arena - if not arena.point_is_inside_arena(self.poses[index,0], self.poses[index,1]): - weights[index] = 0 - continue - # difference between this distance and the distance sensed is the error - # weight is the inverse of the error - weights[index] = arena.get_distance_grid_at_point(distance_sensor_left[index,0], distance_sensor_left[index,1]) - weights[index] += arena.get_distance_grid_at_point(distance_sensor_right[index,0], distance_sensor_right[index,1]) - await asyncio.sleep(0) - #normalise the weights - weights = weights / np.sum(weights) - return weights - - def resample(self, weights, sample_count): - """Return sample_count number of samples from the - poses, based on the weights array. - Uses low variance resampling""" - samples = [] - start = random.uniform(0, 1 / sample_count) - cumulative_weights = weights[0] - source_index = 0 - for current_index in range(sample_count): - weight_index = start + current_index / sample_count - while weight_index > cumulative_weights: - source_index += 1 - cumulative_weights += weights[source_index] - samples.append(source_index) - return np.array([self.poses[n] for n in samples]) - - def convert_odometry_to_motion(self, left_encoder_delta, right_encoder_delta): - """ - left_encoder is the change in the left encoder - right_encoder is the change in the right encoder - returns rot1, trans, rot2 - rot1 is the rotation of the robot in degrees before the translation - trans is the distance the robot has moved in mm - rot2 is the rotation of the robot in degrees - """ - left_mm = left_encoder_delta * robot.ticks_to_mm - right_mm = right_encoder_delta * robot.ticks_to_mm - - if left_mm == right_mm: - # no rotation - return 0, left_mm, 0 - - # calculate the radius of the arc - radius = (robot.wheelbase_mm / 2) * (left_mm + right_mm) / (right_mm - left_mm) - ## angle = difference in steps / wheelbase - d_theta = (right_mm - left_mm) / robot.wheelbase_mm - # For a small enough motion, assume that the chord length = arc length - arc_length = d_theta * radius - rot1 = np.degrees(d_theta/2) - rot2 = rot1 - return rot1, arc_length, rot2 - - async def motion_model(self): - """move forward, apply the motion model""" - new_heading = robot.imu.euler[0] - new_encoder_left = robot.left_encoder.read() - new_encoder_right = robot.right_encoder.read() - - rot1, trans, rot2 = self.convert_odometry_to_motion( - new_encoder_left - self.last_encoder_left, - new_encoder_right - self.last_encoder_right) - self.last_encoder_left = new_encoder_left - self.last_encoder_right = new_encoder_right - try: - new_heading = robot.imu.euler[0] - except OSError: - new_heading = None - if new_heading: - heading_change = self.last_heading - new_heading - self.last_heading = new_heading - # convert heading from true bearing to standard position - heading_change = convert_to_standard_position(heading_change) - # blend with the encoder heading changes - rot1 = rot1 * self.encoder_mix + heading_change * self.imu_mix - rot2 = rot2 * self.encoder_mix + heading_change * self.imu_mix - else: - print("Failed to get heading") - await asyncio.sleep(0) - rot1_model = np.array([get_scaled_sample_around_mean(rot1, self.rotation_scale) for _ in range(self.poses.shape[0])]) - trans_model = np.array([get_scaled_sample_around_mean(trans, self.speed_scale) for _ in range(self.poses.shape[0])]) - rot2_model = np.array([get_scaled_sample_around_mean(rot2, self.rotation_scale) for _ in range(self.poses.shape[0])]) - self.poses[:,2] += rot1_model - rot1_radians = np.radians(self.poses[:,2]) - self.poses[:,0] += trans_model * np.cos(rot1_radians) - self.poses[:,1] += trans_model * np.sin(rot1_radians) - self.poses[:,2] += rot2_model - self.poses[:,2] = np.array([float(theta % 360) for theta in self.poses[:,2]]) - - async def main(self): - asyncio.create_task(self.distance_sensors.main()) - asyncio.create_task(self.collision_avoider.main()) - self.last_heading = robot.imu.euler[0] - try: - while True: - weights = await self.apply_sensor_model() - send_poses(self.resample(weights, 20)) - self.poses = self.resample(weights, self.population_size) - await asyncio.sleep(0) - await self.motion_model() - finally: - robot.stop() - - - - -async def updater(simulation): - print("starting updater") - while True: - sys_status, gyro, accel, mag = robot.imu.calibration_status - if sys_status < 3: - send_json( - { - "imu_calibration": { - "gyro": gyro, - "accel": accel, - "mag": mag, - "sys": sys_status, - } - } - ) - await asyncio.sleep(0.5) - - -async def command_handler(simulation): - print("Starting handler") - update_task = None - simulation_task = None - while True: - if robot.uart.in_waiting: - print("Receiving data...") - request = read_json() - if not request: - print("no request") - continue - print("Received: ", request) - if request["command"] == "arena": - send_json({ - "arena": arena.boundary_lines, - }) - if not update_task: - update_task = asyncio.create_task(updater(simulation)) - elif request["command"] == "start": - if not simulation_task: - simulation_task = asyncio.create_task(simulation.main()) - - await asyncio.sleep(0.1) - - -simulation = Simulation() -asyncio.run(command_handler(simulation)) diff --git a/ch-13/full-version/robot/pid_controller.py b/ch-13/full-version/robot/pid_controller.py deleted file mode 100644 index a09358f..0000000 --- a/ch-13/full-version/robot/pid_controller.py +++ /dev/null @@ -1,27 +0,0 @@ -class PIDController: - def __init__(self, kp, ki, kd, d_filter_gain=0.1, imax=None, imin=None): - self.kp = kp - self.ki = ki - self.kd = kd - self.d_filter_gain = d_filter_gain - self.imax = imax - self.imin = imin - self.reset() - - def reset(self): - self.integral = 0 - self.error_prev = 0 - self.derivative = 0 - - def calculate(self, error, dt): - self.integral += error * dt - if self.imax is not None and self.integral > self.imax: - self.integral = self.imax - if self.imin is not None and self.integral < self.imin: - self.integral = self.imin - # Add a low pass filter to the difference - difference = (error - self.error_prev) * self.d_filter_gain - self.error_prev += difference - self.derivative = difference / dt - - return self.kp * error + self.ki * self.integral + self.kd * self.derivative diff --git a/ch-13/full-version/robot/pio_encoder.py b/ch-13/full-version/robot/pio_encoder.py deleted file mode 100644 index b831bf4..0000000 --- a/ch-13/full-version/robot/pio_encoder.py +++ /dev/null @@ -1,84 +0,0 @@ -import rp2pio -import adafruit_pioasm -import array -import asyncio - - -program = """ -; use the osr for count -; input pins c1 c2 - - set y, 0 ; clear y - mov osr, y ; and clear osr -read: - ; x will be the old value - ; y the new values - mov x, y ; store old Y in x - in null, 32 ; Clear ISR - using y - in pins, 2 ; read two pins into y - mov y, isr - jmp x!=y, different ; Jump if its different - jmp read ; otherwise loop back to read - -different: - ; x has old value, y has new. - ; extract the upper bit of X. - in x, 31 ; get bit 31 - old p1 (remember which direction it came in) - in null, 31 ; keep only 1 bit - mov x, isr ; put this back in x - jmp !x, c1_old_zero - -c1_old_not_zero: - jmp pin, count_up - jmp count_down - -c1_old_zero: - jmp pin, count_down - ; fall through -count_up: - ; for a clockwise move - we'll add 1 by inverting - mov x, ~ osr ; store inverted OSR on x - jmp x--, fake ; use jump to take off 1 -fake: - mov x, ~ x ; invert back - jmp send -count_down: - ; for a clockwise move, just take one off - mov x, osr ; store osr in x - jmp x--, send ; dec and send -send: - ; send x. - mov isr, x ; send it - push noblock ; put ISR into input FIFO - mov osr, x ; put X back in OSR - jmp read ; loop back -""" - -assembled = adafruit_pioasm.assemble(program) - - -class QuadratureEncoder: - def __init__(self, first_pin, second_pin, reversed=False): - """Encoder with 2 pins. Must use sequential pins on the board""" - self.sm = rp2pio.StateMachine( - assembled, - frequency=0, - first_in_pin=first_pin, - jmp_pin=second_pin, - in_pin_count=2, - ) - self.reversed = reversed - self._buffer = array.array("i", [0]) - asyncio.create_task(self.poll_loop()) - - async def poll_loop(self): - while True: - await asyncio.sleep(0) - while self.sm.in_waiting: - self.sm.readinto(self._buffer) - - def read(self): - if self.reversed: - return -self._buffer[0] - else: - return self._buffer[0] diff --git a/ch-13/full-version/robot/robot.py b/ch-13/full-version/robot/robot.py deleted file mode 100755 index 68bd714..0000000 --- a/ch-13/full-version/robot/robot.py +++ /dev/null @@ -1,76 +0,0 @@ -import board -import pwmio -import pio_encoder -import busio -import adafruit_vl53l1x -import math -import adafruit_bno055 - -uart = busio.UART(board.GP12, board.GP13, baudrate=9600) - -wheel_diameter_mm = 70 -wheel_circumference_mm = math.pi * wheel_diameter_mm -gear_ratio = 298 -encoder_poles = 28 -ticks_per_revolution = encoder_poles * gear_ratio -ticks_to_mm = wheel_circumference_mm / ticks_per_revolution -ticks_to_m = ticks_to_mm / 1000 -m_to_ticks = 1 / ticks_to_m -wheelbase_mm = 170 -distance_sensor_from_middle = 40 # approx mm - -motor_A2 = pwmio.PWMOut(board.GP17, frequency=100) -motor_A1 = pwmio.PWMOut(board.GP16, frequency=100) -motor_B2 = pwmio.PWMOut(board.GP18, frequency=100) -motor_B1 = pwmio.PWMOut(board.GP19, frequency=100) - -right_motor = motor_A1, motor_A2 -left_motor = motor_B1, motor_B2 - -right_encoder = pio_encoder.QuadratureEncoder(board.GP20, board.GP21) -left_encoder = pio_encoder.QuadratureEncoder(board.GP26, board.GP27, reversed=True) - -i2c0 = busio.I2C(sda=board.GP0, scl=board.GP1) -i2c1 = busio.I2C(sda=board.GP2, scl=board.GP3) - -left_distance = adafruit_vl53l1x.VL53L1X(i2c0) -right_distance = adafruit_vl53l1x.VL53L1X(i2c1) - -imu = adafruit_bno055.BNO055_I2C(i2c0) - -def stop(): - motor_A1.duty_cycle = 0 - motor_A2.duty_cycle = 0 - motor_B1.duty_cycle = 0 - motor_B2.duty_cycle = 0 - - -def set_speed(motor, speed): - # Swap motor pins if we reverse the speed - if abs(speed) < 0.1: - motor[0].duty_cycle = 0 - motor[1].duty_cycle = 1 - return - if speed < 0: - direction = motor[1], motor[0] - speed = -speed - else: - direction = motor - speed = min(speed, 1) # limit to 1.0 - max_speed = 2 ** 16 - 1 - - direction[0].duty_cycle = int(max_speed * speed) - direction[1].duty_cycle = 0 - - -def set_left(speed): - set_speed(left_motor, speed) - - -def set_right(speed): - set_speed(right_motor, speed) - -def check_imu_status(): - sys_status, gyro, accel, mag = imu.calibration_status - uart.write(f"Sys: {sys_status}, Gyro: {gyro}, Accel: {accel}, Mag: {mag}\n".encode()) - return sys_status == 3 diff --git a/ch-13/full-version/robot_ble_connection.py b/ch-13/full-version/robot_ble_connection.py deleted file mode 100644 index 59953bd..0000000 --- a/ch-13/full-version/robot_ble_connection.py +++ /dev/null @@ -1,40 +0,0 @@ -import asyncio - -import bleak - - -class BleConnection: - # See https://learn.adafruit.com/introducing-adafruit-ble-bluetooth-low-energy-friend/uart-service - ble_uuid = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" - rx_gatt = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" - tx_gatt = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" - ble_name = "Adafruit Bluefruit LE" - - def __init__(self, receive_handler): - self.ble_client = None - self.receive_handler = receive_handler - - def _uart_handler(self, _, data: bytes): - self.receive_handler(data) - - async def connect(self): - print("Scanning for devices...") - devices = await bleak.BleakScanner.discover( - service_uuids=[self.ble_uuid] - ) - print(f"Found {len(devices)} devices") - print([device.name for device in devices]) - ble_device_info = [device for device in devices if device.name==self.ble_name][0] - print(f"Connecting to {ble_device_info.name}...") - self.ble_client = bleak.BleakClient(ble_device_info.address) - await self.ble_client.connect() - print("Connected to {}".format(ble_device_info.name)) - self.notify_task = asyncio.create_task( - self.ble_client.start_notify(self.rx_gatt, self._uart_handler) - ) - - async def close(self): - await self.ble_client.disconnect() - - async def send_uart_data(self, data): - await self.ble_client.write_gatt_char(self.tx_gatt, data) diff --git a/ch-13/layer-1/robot/code.py b/ch-13/layer-1/robot/code.py deleted file mode 100644 index 047793d..0000000 --- a/ch-13/layer-1/robot/code.py +++ /dev/null @@ -1,75 +0,0 @@ -import asyncio -import json -import time - -import pid_controller -import robot - - -class RpmSpeedController: - def __init__(self, encoder, motor_fn): - self.encoder = encoder - self.motor_fn = motor_fn - self.pid = pid_controller.PIDController(3, 0, 1) - self.speed = 0 - self.reset() - - def reset(self): - self.last_ticks = self.encoder.read() - self.pwm = 0 - self.pid.reset() - - def update(self, dt): - current_ticks = self.encoder.read() - speed_in_ticks = (current_ticks - self.last_ticks) / dt - self.last_ticks = current_ticks - # calculate the error - error = self.speed - speed_in_ticks - # calculate the control signal - control_signal = self.pid.calculate(error, dt) - self.pwm += control_signal - self.motor_fn(self.pwm) - - -class MotionControl: - def __init__(self): - self.left_speed_controller = RpmSpeedController(robot.left_encoder, robot.set_left) - self.right_speed_controller = RpmSpeedController(robot.right_encoder, robot.set_right) - - - def plan_motion(self, turn1, distance, turn2): - """Plan a motion - based on making a turn, - moving forward a distance, - and then making another turn.""" - - pass - - def uodate(self, dt): - self.left_speed_controller.update(dt) - self.right_speed_controller.update(dt) - - -async def main_loop(dt): - motion_control = MotionControl() - while True: - await asyncio.sleep(dt) - current_time = time.monotonic() - dt = current_time - last_time - last_time = current_time - motion_control.uodate(dt) - - -async def command_handler(): - main_loop = None - motion_control = MotionControl() - robot = robot.Robot() - while True: - command = json.loads(input()) - if command["command"] == "start": - main_loop = asyncio.create_task(main_loop(0.2)) - elif command["command"] == "get_speed": - print(json.dumps(robot.get_speed())) - else: - print("Unknown command") - -asyncio.run(command_handler()) diff --git a/ch-13/layer-1/robot/pid_controller.py b/ch-13/layer-1/robot/pid_controller.py deleted file mode 100644 index a09358f..0000000 --- a/ch-13/layer-1/robot/pid_controller.py +++ /dev/null @@ -1,27 +0,0 @@ -class PIDController: - def __init__(self, kp, ki, kd, d_filter_gain=0.1, imax=None, imin=None): - self.kp = kp - self.ki = ki - self.kd = kd - self.d_filter_gain = d_filter_gain - self.imax = imax - self.imin = imin - self.reset() - - def reset(self): - self.integral = 0 - self.error_prev = 0 - self.derivative = 0 - - def calculate(self, error, dt): - self.integral += error * dt - if self.imax is not None and self.integral > self.imax: - self.integral = self.imax - if self.imin is not None and self.integral < self.imin: - self.integral = self.imin - # Add a low pass filter to the difference - difference = (error - self.error_prev) * self.d_filter_gain - self.error_prev += difference - self.derivative = difference / dt - - return self.kp * error + self.ki * self.integral + self.kd * self.derivative diff --git a/ch-13/layer-1/robot/pio_encoder.py b/ch-13/layer-1/robot/pio_encoder.py deleted file mode 100644 index b831bf4..0000000 --- a/ch-13/layer-1/robot/pio_encoder.py +++ /dev/null @@ -1,84 +0,0 @@ -import rp2pio -import adafruit_pioasm -import array -import asyncio - - -program = """ -; use the osr for count -; input pins c1 c2 - - set y, 0 ; clear y - mov osr, y ; and clear osr -read: - ; x will be the old value - ; y the new values - mov x, y ; store old Y in x - in null, 32 ; Clear ISR - using y - in pins, 2 ; read two pins into y - mov y, isr - jmp x!=y, different ; Jump if its different - jmp read ; otherwise loop back to read - -different: - ; x has old value, y has new. - ; extract the upper bit of X. - in x, 31 ; get bit 31 - old p1 (remember which direction it came in) - in null, 31 ; keep only 1 bit - mov x, isr ; put this back in x - jmp !x, c1_old_zero - -c1_old_not_zero: - jmp pin, count_up - jmp count_down - -c1_old_zero: - jmp pin, count_down - ; fall through -count_up: - ; for a clockwise move - we'll add 1 by inverting - mov x, ~ osr ; store inverted OSR on x - jmp x--, fake ; use jump to take off 1 -fake: - mov x, ~ x ; invert back - jmp send -count_down: - ; for a clockwise move, just take one off - mov x, osr ; store osr in x - jmp x--, send ; dec and send -send: - ; send x. - mov isr, x ; send it - push noblock ; put ISR into input FIFO - mov osr, x ; put X back in OSR - jmp read ; loop back -""" - -assembled = adafruit_pioasm.assemble(program) - - -class QuadratureEncoder: - def __init__(self, first_pin, second_pin, reversed=False): - """Encoder with 2 pins. Must use sequential pins on the board""" - self.sm = rp2pio.StateMachine( - assembled, - frequency=0, - first_in_pin=first_pin, - jmp_pin=second_pin, - in_pin_count=2, - ) - self.reversed = reversed - self._buffer = array.array("i", [0]) - asyncio.create_task(self.poll_loop()) - - async def poll_loop(self): - while True: - await asyncio.sleep(0) - while self.sm.in_waiting: - self.sm.readinto(self._buffer) - - def read(self): - if self.reversed: - return -self._buffer[0] - else: - return self._buffer[0] diff --git a/ch-13/layer-1/robot/robot.py b/ch-13/layer-1/robot/robot.py deleted file mode 100755 index 5e5e085..0000000 --- a/ch-13/layer-1/robot/robot.py +++ /dev/null @@ -1,78 +0,0 @@ -import board -import pwmio -import pio_encoder -import busio -import adafruit_vl53l1x -import math -import busio -import adafruit_bno055 - -uart = busio.UART(board.GP12, board.GP13, baudrate=9600) - -wheel_diameter_mm = 70 -wheel_circumference_mm = math.pi * wheel_diameter_mm -gear_ratio = 298 -encoder_poles = 28 -ticks_per_revolution = encoder_poles * gear_ratio -ticks_to_m = (wheel_circumference_mm / ticks_per_revolution) / 1000 -m_to_ticks = 1 / ticks_to_m - - -motor_A2 = pwmio.PWMOut(board.GP17, frequency=100) -motor_A1 = pwmio.PWMOut(board.GP16, frequency=100) -motor_B2 = pwmio.PWMOut(board.GP18, frequency=100) -motor_B1 = pwmio.PWMOut(board.GP19, frequency=100) - -right_motor = motor_A1, motor_A2 -left_motor = motor_B1, motor_B2 - -right_encoder = pio_encoder.QuadratureEncoder(board.GP20, board.GP21) -left_encoder = pio_encoder.QuadratureEncoder(board.GP26, board.GP27, reversed=True) - -i2c0 = busio.I2C(sda=board.GP0, scl=board.GP1) -i2c1 = busio.I2C(sda=board.GP2, scl=board.GP3) - -left_distance = adafruit_vl53l1x.VL53L1X(i2c0) -right_distance = adafruit_vl53l1x.VL53L1X(i2c1) - -distance_sensor_from_middle = 40 # approx mm - -imu = adafruit_bno055.BNO055_I2C(i2c0) -imu.mode = adafruit_bno055.NDOF_MODE # should be in chapter 12! - -def stop(): - motor_A1.duty_cycle = 0 - motor_A2.duty_cycle = 0 - motor_B1.duty_cycle = 0 - motor_B2.duty_cycle = 0 - - -def set_speed(motor, speed): - # Swap motor pins if we reverse the speed - if abs(speed) < 0.1: - motor[0].duty_cycle = 0 - motor[1].duty_cycle = 1 - return - if speed < 0: - direction = motor[1], motor[0] - speed = -speed - else: - direction = motor - speed = min(speed, 1) # limit to 1.0 - max_speed = 2 ** 16 - 1 - - direction[0].duty_cycle = int(max_speed * speed) - direction[1].duty_cycle = 0 - - -def set_left(speed): - set_speed(left_motor, speed) - - -def set_right(speed): - set_speed(right_motor, speed) - -def check_imu_status(): - sys_status, gyro, accel, mag = imu.calibration_status - uart.write(f"Sys: {sys_status}, Gyro: {gyro}, Accel: {accel}, Mag: {mag}\n".encode()) - return sys_status == 3