diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 6bbbbacb70..b1a14076ea 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -22,23 +22,11 @@ body:
validations:
required: true
- - type: dropdown
- id: hw
- attributes:
- label: What hardware does this issue affect?
- multiple: true
- options:
- - comma three
- - comma two
- - EON Gold
- validations:
- required: true
-
- type: input
id: route
attributes:
label: Provide a route where the issue occurs
- description: Ensure the route is fully uploaded at https://useradmin.comma.ai
+ description: Ensure the route is fully uploaded at https://useradmin.comma.ai. We cannot look into issues without routes, or at least a Dongle ID.
placeholder: 77611a1fac303767|2020-05-11--16-37-07
validations:
required: true
diff --git a/.github/ISSUE_TEMPLATE/car_bug_report.yml b/.github/ISSUE_TEMPLATE/car_bug_report.yml
index a48f984192..23527c3a43 100644
--- a/.github/ISSUE_TEMPLATE/car_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/car_bug_report.yml
@@ -21,18 +21,6 @@ body:
validations:
required: true
- - type: dropdown
- id: hw
- attributes:
- label: What hardware does this issue affect?
- multiple: true
- options:
- - comma three
- - comma two
- - EON Gold
- validations:
- required: true
-
- type: input
id: car
attributes:
diff --git a/.github/workflows/prebuilt.yaml b/.github/workflows/prebuilt.yaml
index 80942b3bc5..807ac06b94 100644
--- a/.github/workflows/prebuilt.yaml
+++ b/.github/workflows/prebuilt.yaml
@@ -3,6 +3,8 @@ on:
schedule:
- cron: '0 * * * *'
+ workflow_dispatch:
+
env:
BASE_IMAGE: openpilot-base
DOCKER_REGISTRY: ghcr.io/commaai
diff --git a/.gitignore b/.gitignore
index 06c6117b18..ce6114e58f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,7 @@ selfdrive/modeld/_dmonitoringmodeld
/src/
one
+body
openpilot
notebooks
xx
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index dd53a4200c..912ba1344e 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -20,10 +20,12 @@ repos:
hooks:
- id: mypy
exclude: '^(pyextra/)|(cereal/)|(rednose/)|(panda/)|(laika/)|(opendbc/)|(laika_repo/)|(rednose_repo/)/'
- additional_dependencies: ['git+https://github.com/numpy/numpy-stubs', 'types-requests', 'types-atomicwrites',
- 'types-pycurl']
+ additional_dependencies: ['lxml', 'numpy', 'types-atomicwrites', 'types-pycurl', 'types-requests', 'types-certifi']
args:
+ - --warn-redundant-casts
- --warn-unreachable
+ - --warn-unused-ignores
+ #- --html-report=/home/batman/openpilot
- repo: https://github.com/PyCQA/flake8
rev: 4.0.1
hooks:
diff --git a/Jenkinsfile b/Jenkinsfile
index b188539b14..c5edda56fd 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -30,7 +30,7 @@ END"""
def phone_steps(String device_type, steps) {
lock(resource: "", label: device_type, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
- timeout(time: 60, unit: 'MINUTES') {
+ timeout(time: 20, unit: 'MINUTES') {
phone(device_ip, "git checkout", readFile("selfdrive/test/setup_device_ci.sh"),)
steps.each { item ->
phone(device_ip, item[0], item[1])
@@ -46,7 +46,7 @@ pipeline {
SOURCE_DIR = "/data/openpilot_source/"
}
options {
- timeout(time: 4, unit: 'HOURS')
+ timeout(time: 4, unit: 'HOURS')
}
stages {
@@ -120,6 +120,7 @@ pipeline {
steps {
phone_steps("tici2", [
["build", "cd selfdrive/manager && ./build.py"],
+ ["test power draw", "python selfdrive/hardware/tici/test_power_draw.py"],
["test boardd loopback", "python selfdrive/boardd/tests/test_boardd_loopback.py"],
["test loggerd", "python selfdrive/loggerd/tests/test_loggerd.py"],
["test encoder", "LD_LIBRARY_PATH=/usr/local/lib python selfdrive/loggerd/tests/test_encoder.py"],
diff --git a/Pipfile b/Pipfile
index 6d30179b9d..af3e02f54a 100644
--- a/Pipfile
+++ b/Pipfile
@@ -4,6 +4,7 @@ url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
+azure-storage-blob = "~=2.1"
control = "*"
coverage = "*"
dictdiffer = "*"
@@ -81,6 +82,7 @@ tqdm = "*"
urllib3 = "*"
utm = "*"
websocket_client = "*"
+hatanaka = "*"
[requires]
python_version = "3.8"
diff --git a/Pipfile.lock b/Pipfile.lock
index 2c62e13dfa..d7372d3ca3 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "41e285b10b9b5a353b3eb9c202886e52d22403c369784877aaa35e099aa203a8"
+ "sha256": "19a7b58f24cd7542ccb9fd386c7716d77fff3c1f87de496f3f42753cf34a5dde"
},
"pipfile-spec": 6,
"requires": {
@@ -18,11 +18,11 @@
"default": {
"astroid": {
"hashes": [
- "sha256:8d0a30fe6481ce919f56690076eafbb2fb649142a89dc874f1ec0e7a011492d0",
- "sha256:cc8cc0d2d916c42d0a7c476c57550a4557a083081976bf42a73414322a6411d9"
+ "sha256:14ffbb4f6aa2cf474a0834014005487f7ecd8924996083ab411e7fa0b508ce0b",
+ "sha256:f4e4ec5294c4b07ac38bab9ca5ddd3914d4bf46f9006eb5c0ae755755061044e"
],
"markers": "python_full_version >= '3.6.2'",
- "version": "==2.11.2"
+ "version": "==2.11.5"
},
"atomicwrites": {
"hashes": [
@@ -150,11 +150,11 @@
},
"click": {
"hashes": [
- "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e",
- "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"
+ "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
+ "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
],
"markers": "python_version >= '3.7'",
- "version": "==8.1.2"
+ "version": "==8.1.3"
},
"crcmod": {
"hashes": [
@@ -168,29 +168,31 @@
},
"cryptography": {
"hashes": [
- "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b",
- "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51",
- "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7",
- "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d",
- "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6",
- "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29",
- "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9",
- "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf",
- "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815",
- "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf",
- "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85",
- "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77",
- "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86",
- "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb",
- "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e",
- "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0",
- "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3",
- "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84",
- "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2",
- "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"
- ],
- "index": "pypi",
- "version": "==36.0.2"
+ "sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804",
+ "sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178",
+ "sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717",
+ "sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982",
+ "sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004",
+ "sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe",
+ "sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452",
+ "sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336",
+ "sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4",
+ "sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15",
+ "sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d",
+ "sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c",
+ "sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0",
+ "sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06",
+ "sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9",
+ "sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1",
+ "sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023",
+ "sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de",
+ "sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f",
+ "sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181",
+ "sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e",
+ "sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a"
+ ],
+ "index": "pypi",
+ "version": "==37.0.2"
},
"cython": {
"hashes": [
@@ -252,11 +254,11 @@
},
"flask": {
"hashes": [
- "sha256:8a4cf32d904cf5621db9f0c9fbcd7efabf3003f22a04e4d0ce790c7137ec5264",
- "sha256:a8c9bd3e558ec99646d177a9739c41df1ded0629480b4c8d2975412f3c9519c8"
+ "sha256:315ded2ddf8a6281567edb27393010fe3406188bafbfe65a3339d5787d89e477",
+ "sha256:fad5b446feb0d6db6aec0c3184d16a8c1f6c3e464b511649c8918a9be100b4fe"
],
"index": "pypi",
- "version": "==2.1.1"
+ "version": "==2.1.2"
},
"flatbuffers": {
"hashes": [
@@ -281,6 +283,53 @@
"index": "pypi",
"version": "==20.1.0"
},
+ "h3": {
+ "hashes": [
+ "sha256:08a09f7a43ed142573c602ef487a058da54ab4d86c173082b29a5057805fe2d3",
+ "sha256:0a96ea1844182bd0511cdcdc89e38e3026d9a3d4139fd0c5e899709edd798ffa",
+ "sha256:1387166f453816f91d624c6ce70876a3c20356cd28a3a759920dee23c78684cf",
+ "sha256:25f0c22f4802ab71c45b86d206bd30fa0a6c7fbc3b630398b60c22907e9742e6",
+ "sha256:2bf4d75fe42a260ac23bf4cb9f9de6e6f2aa37279b2719387711f3e0727c4653",
+ "sha256:2faf304020493c5ffede34264bd28ed529b8b7238103e0904c0f3e9ca880bcfd",
+ "sha256:33b147ecc0e19ab1f27303d0e3ae28e5a457f3347ce18ca9a58b694a8b0cdd0a",
+ "sha256:38a084d74b234d48aafc01e4329cd9a92966e3f45b8cf21224118643b6eaa1c0",
+ "sha256:3b1642085939c597a9c723ae3b187f80527ffc79cad0ded0e55be9c9bac69c6c",
+ "sha256:4469fdf90034b1a67e155cac4f46b077fdc404b6182ab33abcb7081c9bfbf411",
+ "sha256:46a1284521d86cab414981056390be944dca780fe74c6c9e463a16d1c8d24871",
+ "sha256:585f375ba2a95ceb16b115a378e9118159c912c26703cf1627f57a004818c3b3",
+ "sha256:62057c1c3d1c7fe492841e42fa360825d66fafd55ac37dc4e90b2292af21cb47",
+ "sha256:68227df989274b0da54de9101a50741c70c48197ba3beacfb97c88170445c18e",
+ "sha256:7b0ddfdd02920996d7c6672c91e83efb5432c67ff83f89a03f774e84bcfe19f8",
+ "sha256:7c5366d24c2c01ef3bae68547c15f1965fac6053b2596c0073766bf7544ecaf0",
+ "sha256:8155b2de1938eb56128fe4fd96e4f6d2022d4c34d8137bc95d73cbf329f8f89e",
+ "sha256:83c2b0cd8259541f95b0493a620fb781b6a18c7c1e8fac1bda4fb234ae23ab43",
+ "sha256:8d03622433da1a2761574311af378ff1ff841f5956db25927837c6aee9d1c13c",
+ "sha256:960cd005b8817314d95fbaff3e848a72385df4e3c6c9703ff99b08581c8def69",
+ "sha256:9b0277d82578b3ed3220167ef5c5acd8b4e0ef2fcd6c2fd69dbf29e0c4e03765",
+ "sha256:a33fae02a54c63acb3c30fe49388715d658d76d42858a6ad4563e7e6859a9e57",
+ "sha256:a59d7d10597a2da9e9729637a625ae8dff2ed4e7c6c0b4952f0a5b2db6ef7152",
+ "sha256:ad21cfa8d97a62984ce30692a7ddf71a32a0c744cc247c43cbdbac1536aec4de",
+ "sha256:be63482de86bbb91db7f3f3b7dd452b9e08a11dacbda2088386831fb0e7de59c",
+ "sha256:c1108a9acb755310dce50a6e3c58ae1a2460ef60901d40e1155d633c7392f858",
+ "sha256:c644ab3f221c7faaab2d1ccd11bc3b1106f172e9bb1c85a863b0a097f6b71cce",
+ "sha256:c95c0818c163b69989c9e876dd82005e60edfbaabfd45429abebfc26f9a357e8",
+ "sha256:cdd68e684f0c6e18604d46ee04dbcfe5c79de62238b2c29f1db0f3a5d8dfa47b",
+ "sha256:ce86c6dce2c923bfb16e26586bc5f0443a8be61d4f43227be8587ccb95588a46",
+ "sha256:e61d3c6b1b66072f5b74d46dbee7df29daac6ce9738b9a6223a67dc577114515",
+ "sha256:f8edf5a546b31afdcd801b60448ea890ce1ff418fb784335e1329519f13aa85e"
+ ],
+ "version": "==3.7.4"
+ },
+ "hatanaka": {
+ "hashes": [
+ "sha256:0e095d35ed4f607eb77ae47ecb310e4c25f5a6267037b703ea258ed03e5c47da",
+ "sha256:84faa953b4f641a6d3cf8187f1775ba7e7f8d815f7bcd48cfb18553b766cbc41",
+ "sha256:ccf8be554deee2fc70be52bd2f1d3d4dd370001caa74333bf041933d69a19023",
+ "sha256:ce1628029c6b50c142a8fc5f15453c4cf2a3fd88a7128075415aeb5c9a2727d0"
+ ],
+ "index": "pypi",
+ "version": "==2.8.0"
+ },
"hexdump": {
"hashes": [
"sha256:d781a43b0c16ace3f9366aade73e8ad3a7bd5137d58f0b45ab2d3f54876f20db"
@@ -304,6 +353,14 @@
"markers": "python_version < '3.10'",
"version": "==4.11.3"
},
+ "importlib-resources": {
+ "hashes": [
+ "sha256:b6062987dfc51f0fcb809187cffbd60f35df7acb4589091f154214af6d0d49d3",
+ "sha256:e447dc01619b1e951286f3929be820029d48c75eb25d265c28b92a16548212b8"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==5.7.1"
+ },
"isort": {
"hashes": [
"sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7",
@@ -322,11 +379,11 @@
},
"jinja2": {
"hashes": [
- "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119",
- "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"
+ "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
+ "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
],
"index": "pypi",
- "version": "==3.1.1"
+ "version": "==3.1.2"
},
"json-rpc": {
"hashes": [
@@ -449,6 +506,47 @@
],
"version": "==1.2.1"
},
+ "ncompress": {
+ "hashes": [
+ "sha256:0349d7de11edd70a7efea9ce9dc67f0e47b5774832dd063f7ae68a9e3e36ea31",
+ "sha256:070044eab19586a45d1855c3e50e000ce86d6075b122a5ec8cffd480713dffac",
+ "sha256:13fa26ec8000d786a8079bb265508b5df4b445a4f460481a13549b4bd3c83824",
+ "sha256:15f10fbfa11345ff0af090e3e6ae13a1fe2b52a2bb39d4f2373c2d6aeac75e5d",
+ "sha256:2a104803fbe3ab0a96edb14927fa22c8142be838aabe7e938b4a52a4e82db56e",
+ "sha256:34754041d9bac2d6908ae0d07ba541e4d6d606cca222ddd53f3a57e15f386b0a",
+ "sha256:34c6496168fd4dbc13f1fc0c0fcbadded1957639956f8cbc6894c39999817e36",
+ "sha256:3590e66313041721ae81e72ece06b7048c9293321bb30900358638673608e264",
+ "sha256:393cc3c126b9451fb32fe2bc07773264c90e73afbd37da0df472ac23bfd1a2d5",
+ "sha256:5336a8831a7e587829ce54e9e27d1fb2e04ddbc7d2d983693e35a3a03ac3ce79",
+ "sha256:5a2ae8a9170fa1f45df7efa292eb8c437b18c225b63d4adca4f50f9da0e8e0c7",
+ "sha256:6540556d47670a8fb93878a44d0206bbdc87f32e4c5b57d6fe63691efafbb982",
+ "sha256:66d991155a1655ccd98e8433c4a7e811d63eb649adb55f47d8f9528a30cc4b7a",
+ "sha256:736dbae078107742cf6ac7ccc11ae9c5eab77ef2c02aab3ef64802877bb01cab",
+ "sha256:7608fbda43d04d9f476be2dbf4ef3c96e72d83b9557a48b07fbc9ff3ad29cdd2",
+ "sha256:78674f246878938387b6f82b10d1aa2192e02544d214541943d12ef1a45e66c6",
+ "sha256:8322482e72ac2802d1dca1007ec06aa281a4d5cf1cf9f8c75bb51e917382b756",
+ "sha256:8b9acc46cf36bb998ed215d6e76a94e2bd1e827b9a4cb5362982b7004b5a7620",
+ "sha256:8eb4a55cbeaeb238a3b412952077be6b3f37b3416cd0211cc22776391ff2fef7",
+ "sha256:916671d62167191af58d6b4a17b1c09c647e349dcff1fc0b7d764aa64c3773ee",
+ "sha256:94b3f4e851f5b37e1d4cf2d8da911fa10783a59cba3d7f1f2ae5bd2842558077",
+ "sha256:9cd040ad73a3b0e917e01cdfba507e10e0bb56849daaac3ac3d86382d4d7ad82",
+ "sha256:9d89acf209858e7940223cf35324e1b2effec119bb009a41f039e2ea4db22177",
+ "sha256:9da7c81313aed4b6c6e8020442ed8d03d04bff72947f9380ea1ce2c63ffb8ad1",
+ "sha256:aaa18a509d9fc173b4b47d53c834e43ced1eda63d2aa7d4613dc59b2f802a31a",
+ "sha256:ab9fc62baaa55faf8ed8ac67f2c64a7295fec91d7c1f306ac46aa894ca4edf91",
+ "sha256:af0011bae90e44121f4e4edbff3dccdce7e4c5fc5e354db7eb48410d71f496df",
+ "sha256:b031e06b42037b181e3514261e1e85a9eae4af990c12b9348a9f22b8042201ff",
+ "sha256:d11df815d280985dfa660974df11dbe051a1a18dca2f91f9d30fbd6548237b8f",
+ "sha256:d45ec59a8a3ce00613df0c81e5567854574dbbbf01ecd1a5a0929cd8fb04844d",
+ "sha256:da216a53db7cd4c0247376f87367dd71df457443567e55310f6d3d23a9aff2f2",
+ "sha256:e0ebd71990ef7909b6627b5341a2fe1977dcce61dd3760a29e19e3f9e4c6a275",
+ "sha256:e6f5bf381412e9d3847b76e8b6bd1f84dfadcd3d9c25903c8592facb437909a0",
+ "sha256:e7bbf10cca1376f4f17ae2c447e33a9d4067525abb0c71d488c9a5ced50552f1",
+ "sha256:f9ba6ab2aadd6fd90365fdad5219e4dc7bc2459b94f1e900a733dddaf4e9b2e6",
+ "sha256:fe0a671a2f7dc1ee0438d278ef30ab425a969536100c4352b5cb6bc0b6210818"
+ ],
+ "version": "==1.0.0"
+ },
"nose": {
"hashes": [
"sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac",
@@ -517,16 +615,16 @@
},
"onnxruntime-gpu": {
"hashes": [
- "sha256:2886a84a0e64f7ec594f787c0c941c05af230e5e3df342dd05d86382722dd78a",
- "sha256:2db2bdcb23b6b4fa08a03009bf057f42cebf6828cb418f4f5ab890cc6d1bb8ff",
- "sha256:58e9a3487820728e2140523787f0c413518f7f8ca137a7c3e015044b65d159f4",
- "sha256:63f8b8e48f33b61f7bdec9a561770a6bea5ec3c905ef088e70cb5909c88e7515",
- "sha256:766c1249c6a2fc422022348a04f747008cf171edd00c9a452454f7c35899ae88",
- "sha256:fe00066d2d350806c1099761d856ec2934ff9843c192dee6d41cbe074ad5a1a9"
+ "sha256:3f1363e9ba30051cc3d649beefbd12047e1c41b5c47bcacfbfb23b74a7d68f7b",
+ "sha256:3fad0d3df58815c11160714433ca3bcff6d9a06f721bcc97ade46abce30aea72",
+ "sha256:a4f5317838f4816a9b21fcb43d551ac95f9d35ca8ecd5c959419b3b94d458342",
+ "sha256:be1766a9d60ec774e1a7a0279ade5ec001c5d528f2f2dbe9f8d02133e49d1d68",
+ "sha256:c79f42cbdee18e059c0ba43f0efeb7117539dfb76d6ed0e4a9ecc34093ed97b3",
+ "sha256:dc34be44224aa855d7ab17f61942b665788a2136ae4f71ee857fa47b38d1fdb8"
],
"index": "pypi",
"markers": "platform_system != 'Darwin'",
- "version": "==1.11.0"
+ "version": "==1.11.1"
},
"pillow": {
"hashes": [
@@ -574,41 +672,41 @@
},
"platformdirs": {
"hashes": [
- "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d",
- "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"
+ "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788",
+ "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"
],
"markers": "python_version >= '3.7'",
- "version": "==2.5.1"
+ "version": "==2.5.2"
},
"protobuf": {
"hashes": [
- "sha256:001c2160c03b6349c04de39cf1a58e342750da3632f6978a1634a3dcca1ec10e",
- "sha256:0b250c60256c8824219352dc2a228a6b49987e5bf94d3ffcf4c46585efcbd499",
- "sha256:1d24c81c2310f0063b8fc1c20c8ed01f3331be9374b4b5c2de846f69e11e21fb",
- "sha256:1eb13f5a5a59ca4973bcfa2fc8fff644bd39f2109c3f7a60bd5860cb6a49b679",
- "sha256:25d2fcd6eef340082718ec9ad2c58d734429f2b1f7335d989523852f2bba220b",
- "sha256:32bf4a90c207a0b4e70ca6dd09d43de3cb9898f7d5b69c2e9e3b966a7f342820",
- "sha256:38fd9eb74b852e4ee14b16e9670cd401d147ee3f3ec0d4f7652e0c921d6227f8",
- "sha256:47257d932de14a7b6c4ae1b7dbf592388153ee35ec7cae216b87ae6490ed39a3",
- "sha256:4eda68bd9e2a4879385e6b1ea528c976f59cd9728382005cc54c28bcce8db983",
- "sha256:52bae32a147c375522ce09bd6af4d2949aca32a0415bc62df1456b3ad17c6001",
- "sha256:542f25a4adf3691a306dcc00bf9a73176554938ec9b98f20f929a044f80acf1b",
- "sha256:5b5860b790498f233cdc8d635a17fc08de62e59d4dcd8cdb6c6c0d38a31edf2b",
- "sha256:6efe066a7135233f97ce51a1aa007d4fb0be28ef093b4f88dac4ad1b3a2b7b6f",
- "sha256:71b2c3d1cd26ed1ec7c8196834143258b2ad7f444efff26fdc366c6f5e752702",
- "sha256:7a53d4035427b9dbfbb397f46642754d294f131e93c661d056366f2a31438263",
- "sha256:7dcd84dc31ebb35ade755e06d1561d1bd3b85e85dbdbf6278011fc97b22810db",
- "sha256:88c8be0558bdfc35e68c42ae5bf785eb9390d25915d4863bbc7583d23da77074",
- "sha256:8be43a91ab66fe995e85ccdbdd1046d9f0443d59e060c0840319290de25b7d33",
- "sha256:8d84453422312f8275455d1cb52d850d6a4d7d714b784e41b573c6f5bfc2a029",
- "sha256:9d0f3aca8ca51c8b5e204ab92bd8afdb2a8e3df46bd0ce0bd39065d79aabcaa4",
- "sha256:a1eebb6eb0653e594cb86cd8e536b9b083373fca9aba761ade6cd412d46fb2ab",
- "sha256:bc14037281db66aa60856cd4ce4541a942040686d290e3f3224dd3978f88f554",
- "sha256:fbcbb068ebe67c4ff6483d2e2aa87079c325f8470b24b098d6bf7d4d21d57a69",
- "sha256:fd7133b885e356fa4920ead8289bb45dc6f185a164e99e10279f33732ed5ce15"
+ "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf",
+ "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f",
+ "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f",
+ "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7",
+ "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996",
+ "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067",
+ "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c",
+ "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7",
+ "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9",
+ "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c",
+ "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739",
+ "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91",
+ "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c",
+ "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153",
+ "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9",
+ "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388",
+ "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e",
+ "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab",
+ "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde",
+ "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531",
+ "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8",
+ "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7",
+ "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20",
+ "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"
],
"markers": "python_version >= '3.7'",
- "version": "==3.20.0"
+ "version": "==3.20.1"
},
"psutil": {
"hashes": [
@@ -736,24 +834,26 @@
},
"pylint": {
"hashes": [
- "sha256:7cc6d0c4f61dff440f9ed8b657f4ecd615dcfe35345953eb7b1dc74afe901d7a",
- "sha256:8672cf7441b81410f5de7defdf56e2d559c956fd0579652f2e0a0a35bea2d546"
+ "sha256:ced8968c3b699df0615e2a709554dec3ddac2f5cd06efadb69554a69eeca364a",
+ "sha256:f87e863a0b08f64b5230e7e779bcb75276346995737b2c0dc2793070487b1ff6"
],
"index": "pypi",
- "version": "==2.13.4"
+ "version": "==2.13.8"
},
"pyopencl": {
"hashes": [
- "sha256:1ab792ff11a7ff271b1ba39686bd7aae271168e813a7e771bff6aa611ada383b",
- "sha256:24c6d9a0a1ff7609f3d7365ebd8778616a5433c426566c2c8e35ffab00ef22c4",
- "sha256:3b3f0d8b69923064f6d64b520c594aa2506e96ab398a0f1ed4895c4fceb20ff4",
- "sha256:4bea0e965252f477204a87cc73eca492de5c30252198bc6679ef4968880a2443",
- "sha256:7d9ec6c8daf283666dd577d6bcc49ab3d5b44c9532c2f642daf7e9c85b73606f",
- "sha256:d8af9c4ea375f51237059124f7bab1fd32e32a8893997ffa05dff88efc4d9274",
- "sha256:dee72b29c4e47a99f5ecc7fc7ba70bfc3d85e3cc9734765d6992380f5296787b"
+ "sha256:0af2271c5b3d937290d2edb82c8cc0eca7916bb6321348b261454720bf2c9b8c",
+ "sha256:18386938b54855696460b4b19a210300f241a28eb3255748be5f279aef664d6d",
+ "sha256:2b7daa78caa3ef2ff592c01b4cd9a354ad91218a45da1bdfbb59fca4ea3fb209",
+ "sha256:32fb3e320ab22afa1680d7cc4f2269fa8a83decc7de286533f466188260d3910",
+ "sha256:33ee0d0fb726c029a745f21c2619c3747da6d14d95500c02e1e97b38e4060a38",
+ "sha256:439374ca364d00e0a93ee9656d4da1d5ce57616350a6433efb981a174d583b24",
+ "sha256:828eb7fa5e6ce3a98ae0d2a230fd6f68a8f631a089fefff5c1583e8f05103129",
+ "sha256:945d331dcbe2c868b32ceb0ad2ab245ecf943f5daa33eca04c88988c0e50cf65",
+ "sha256:acd3c817b61058c6056dc67738063dbb021db1fea995c9d5426fb325e58e9ce6"
],
"index": "pypi",
- "version": "==2022.1"
+ "version": "==2022.1.3"
},
"pyserial": {
"hashes": [
@@ -773,10 +873,10 @@
},
"pytools": {
"hashes": [
- "sha256:5e824101880a246354756365880a65bb416f6a8cab6513b68fcbb48fba090fcb"
+ "sha256:9083e8b6e617560eebb7e0c22c01545b1599eb1c048fe72ca2796f22c040a317"
],
"markers": "python_version ~= '3.6'",
- "version": "==2022.1.2"
+ "version": "==2022.1.7"
},
"pyyaml": {
"hashes": [
@@ -888,46 +988,96 @@
},
"sentry-sdk": {
"hashes": [
- "sha256:32af1a57954576709242beb8c373b3dbde346ac6bd616921def29d68846fb8c3",
- "sha256:38fd16a92b5ef94203db3ece10e03bdaa291481dd7e00e77a148aa0302267d47"
+ "sha256:6c01d9d0b65935fd275adc120194737d1df317dce811e642cbf0394d0d37a007",
+ "sha256:c17179183cac614e900cbd048dab03f49a48e2820182ec686c25e7ce46f8548f"
],
"index": "pypi",
- "version": "==1.5.8"
+ "version": "==1.5.11"
},
"setproctitle": {
"hashes": [
- "sha256:077943272d0490b3f43d17379432d5e49c263f608fdf4cf624b419db762ca72b",
- "sha256:0d160d46c8f3567e0aa27b26b1f36e03122e3de475aacacc14a92b8fe45b648a",
- "sha256:0df728d0d350e6b1ad8436cc7add052faebca6f4d03257182d427d86d4422065",
- "sha256:17598f38be9ef499d74f2380bf76b558be72e87da75d66b153350e586649171b",
- "sha256:249526a06f16d493a2cb632abc1b1fdfaaa05776339a50dd9f27c941f6ff1383",
- "sha256:28b884e1cb9a53974e15838864283f9bad774b5c7db98c9609416bd123cb9fd1",
- "sha256:30bc7a769a4451639a0adcbc97bdf7a6e9ac0ef3ddad8d63eb1e338edb3ebeda",
- "sha256:3f6136966c81daaf5b4b010613fe33240a045a4036132ef040b623e35772d998",
- "sha256:4fc5bebd34f451dc87d2772ae6093adea1ea1dc29afc24641b250140decd23bb",
- "sha256:5260e8700c5793d48e79c5e607e8e552e795b698491a4b9bb9111eb74366a450",
- "sha256:7dfb472c8852403d34007e01d6e3c68c57eb66433fb8a5c77b13b89a160d97df",
- "sha256:9106bcbacae534b6f82955b176723f1b2ca6514518aab44dffec05a583f8dca8",
- "sha256:970798d948f0c90a3eb0f8750f08cb215b89dcbee1b55ffb353ad62d9361daeb",
- "sha256:a11d329f33221443317e2aeaee9442f22fcae25be3aa4fb8489e4f7b1f65cdd2",
- "sha256:ba1fb32e7267330bd9f72e69e076777a877f1cb9be5beac5e62d1279e305f37f",
- "sha256:bc4393576ed3ac87ddac7d1bd0faaa2fab24840a025cc5f3c21d14cf0c9c8a12",
- "sha256:c611f65bc9de5391a1514de556f71101e6531bb0715d240efd3e9732626d5c9e",
- "sha256:e13a5c1d9c369cb11cdfc4b75be432b83eb3205c95a69006008ffd4366f87b9e",
- "sha256:e696c93d93c23f377ccd2d72e38908d3dbfc90e45561602b805f53f2627d42ea",
- "sha256:e8ef655eab26e83ec105ce79036bb87e5f2bf8ba2d6f48afdd9595ef7647fcf4",
- "sha256:fbf914179dc4540ee6bfd8228b4cc1f1f6fb12dad66b72b5c9b955b222403220"
- ],
- "index": "pypi",
- "version": "==1.2.2"
+ "sha256:01cef383afc7ea7a3b1696818c8712029bf2f1d64f5d4777dbaf0166becf2c00",
+ "sha256:0670f2130a7ca0e167d3d5a7c8e3c707340b8693d6af7416ff55c18ab2a0a43f",
+ "sha256:06aab65e68163ead9d046b452dd9ad1fc6834ce6bde490f63fdce3be53e9cc73",
+ "sha256:0a668acec8b61a971de54bc4c733869ea7b0eb1348eae5a32b9477f788908e5c",
+ "sha256:0b207de9e4f4aa5265b36dd826a1f6ef6566b064a042033bd7447efb7e9a7664",
+ "sha256:0b444ed4051161a3b0a85dec2bb9b50922f37c75f5fb86f7784b235cf6754336",
+ "sha256:138bfa853e607f06d95b0f253e9152b32a00af3d0dbec96abf0871236a483932",
+ "sha256:14641a4ec2f2110cf4afc666eaecc82ba67814e927e02647fa1f4cf74476e752",
+ "sha256:21d6e064b8fee4e58eb00cdd8771c638de1bc30bb6c02d0208af9ca0a1c00898",
+ "sha256:25538341e56f9e75e9759229ff674282dccb5b1ce79a974f968d36208d465674",
+ "sha256:28e0df80d5069586a08a3cb463fb23503a37cbb805826ef93164bc4bfb5f35b9",
+ "sha256:2c0be45535e934deab3aa72ed1a8487174af4ea12cec124478c68a312e1c8b13",
+ "sha256:2c8c245e08f6a296fdaa1b36894ec40e20464a4fc6458e6178c8d55a2f83457a",
+ "sha256:2d083cae02e344e760bd21c28d591ac5f7ddbd6e1a0ecba62092ae724abd5c28",
+ "sha256:32a84cc309b9e595f06a55bec2fa335a23c307a55d2989864b60ecd71ea87897",
+ "sha256:335750c9eb5b18326a138a09266862a52b4f474277c3e410b419bea9a1df8bee",
+ "sha256:35b869e416a105c59133a48b569c6e808159485d916f55e80c7394a42667a386",
+ "sha256:38855b06a124361dc73c198853dee3f2b775531c4f4b7472f0e3d441192b3d8a",
+ "sha256:3b1883ccdbee624386dc046cfbcd80c4e75e24c478f35627984a79892e088b88",
+ "sha256:3dbe87e76197f9a303451512088c18c96f09a6fc4f871a92e5bd695f46f94a26",
+ "sha256:3f55493c987935fa540ef9ffb7ee7db03b4a18a9d5cc103681e2e6a6dfbd7054",
+ "sha256:4051c3a3b07f8a4cca205cd45366a22f322da2f26491c0d6b313a10f8c77b734",
+ "sha256:409a39f92e123be061626fdfd3e76625b04db103479bb4ba1c85b587db0b9498",
+ "sha256:423f8a6d8116acf975ebf93d6b5c4a752f7d2039fa9aafe175a62de86e17016e",
+ "sha256:47f97f591ea2335b7d35f5e9ad7d806385338182dc6de5732d091e9c70ed1cc0",
+ "sha256:48ac48a94040ef21be37366cbc8270fcba2ca103d6c64da6099d5a7b034f72d0",
+ "sha256:4eed53c12146de5df959d84384ffc2774651cab406ee4854e12728cf0eee5297",
+ "sha256:501c084cf3df7d848e91c97d4f8c44d799ba545858a79c6960326ce6f285b4e4",
+ "sha256:52265182fe5ac237d179d8e949248d307882a2e6ec7f189c8dac1c9d1b3631fa",
+ "sha256:5464e6812d050c986e6e9b97d54ab88c23dbe9d81151a2fa10b48bb5133a1e2c",
+ "sha256:54c7315e53b49ef2227d47a75c3d28c4c51ea9ee46a066460732c0d0f8e605a7",
+ "sha256:60f7a2f5da36a3075dda7edbee2173be5b765b0460b8d401ee01a11f68dee1d2",
+ "sha256:65a9384cafdfed98f91416e93705ad08f049c298afcb9c515882beba23153bd0",
+ "sha256:71d00ef63a1f78e13c236895badac77b6c8503377467b9c1a4f81fe729d16e03",
+ "sha256:76f59444a25fb42ca07f53a4474b1545d97a06f016e6c6b8246eee5b146820b5",
+ "sha256:791bed39e4ecbdd008b64999a60c9cc560d17b3836ca0c27cd4708e8e1bcf495",
+ "sha256:7a72bbe53191fbe574c94c0f8b9451dce535b398b7c47ce2e26e21d55eaa1d7e",
+ "sha256:97accd117392b1e57e09888792750c403d7729b7e4b193005178b3736b325ea0",
+ "sha256:9a92978030616f5e20617b7b832efee398df82072b7239c53db41c8026f5fe55",
+ "sha256:9fb5d2e66f94eebc3d06cda9e71a3fffef24c5273971180a4b5628a37fae05a5",
+ "sha256:a39b30d7400c0d50941fe19e1fe0b7d35676186fec4d9c010129ac91b883fd26",
+ "sha256:a4a3cb19346a0cd680617742f5e39fdd14596f6fd91d6c9038272663e37441b4",
+ "sha256:a546cd2dfaecb227d24122257b98b2e062762871888835c7b608f1c41c3a77ad",
+ "sha256:a81067bdc015fee1cc148c79b346f24fdad1224a8898b4239c7cbdee1add8a60",
+ "sha256:a912df3f065572cef211e9ed9f157a0dd2bd73d150281f18f00728afa1b1e5d2",
+ "sha256:a993610383028f093112dce7f77b262e88fce9d70127535fcdc78953179857e8",
+ "sha256:b213376fc779c0e1a4b60008f3fd03f74e9baa9665db37fa6646e98d31baa6d8",
+ "sha256:b2fa9f4b382a6cf88f2f345044d0916a92f37cac21355585bd14bc7ee91af187",
+ "sha256:b9d905ac84dde5227de6516ec08639759f99684148bb88ba05f4cbdaebff5d69",
+ "sha256:be0b46beeb1c92450079a7f30a025d69b63fd6a5de040ebc478fd6e6bf3b63fc",
+ "sha256:c93a2272740e60cddf59d3e1d35dbb89fcc3676f5ca9618bb4e6ae9633fdf13c",
+ "sha256:ccb0b5334dbf248f7504d88b5e9e9a09a0da119eeafacd6f7247f7c055443522",
+ "sha256:d312a170f539895c8093b5e68ba126aa131c9f0d00f6360410db27ec50bf7afa",
+ "sha256:d45dbe4171f8c27a515ecb4562f4cd9ef67d98474bea18e0c14dfbdc2b225050",
+ "sha256:d8e4da68d4d4ba46d4c5db6ae5eb61b11de9c520f25ae8334570f4d0018a8611",
+ "sha256:e24fa9251cc22ddb88ef183070063fdca826c9636381f1c4fb9d2a1dccb7c2a4",
+ "sha256:e2ac0ebd9c63c3d19f768966be2f771bf088bc7373c63ed6fcbb3444a30d0f62",
+ "sha256:e40c35564081983eab6a07f9eb5693867bc447b0edf9c61b69446223d6593814",
+ "sha256:e80fc59739a738b5c67afbbb9d1c238aa47b6d290c2ada872b15c819350ec5f8",
+ "sha256:eb06c1086cf8c8cf12ce45a02450befcb408dfd646d0ccb47d388fd6e73c333a",
+ "sha256:eb82a49aaf440232c762539ab3737b5174d31aba0141fd4bf4d8739c28d18624",
+ "sha256:ec7c3a27460ae7811e868e5494e3d8aee5012912744c48fa2d80b5e614b1b972",
+ "sha256:ecf28b1c07a799d76f4326e508157b71aeda07b84b90368ea451c0710dbd32c0",
+ "sha256:efb3001fd9e71d3ae939d826bf436f0446fd30a6ac01e0ce08cd7eb55ee5ac57",
+ "sha256:f06ff922254023eaabef6af6631f89e5f2f420cf0112865d57d7703f933d4e9f",
+ "sha256:f272b84d79bbe15af26ecf6f7c129bbe642f628866c9253659cdb519216f138f",
+ "sha256:f2a137984d3436f13e4bf7c8ca6f6f292df119c009c5e39556cabba4f4bfbf92",
+ "sha256:f47f6704880869d8e8f52efac2f2f60f5ed4cb9662b98fc1c7e916eefe76e61d",
+ "sha256:f9cf1098205c23fbcaaaef798afaff714fa9ffadf24166f5e85e6d16b9ef82a1",
+ "sha256:fc586f002fd5dd8695718e22a83771fd9f744f081a2b8e614bf6b5f44135964a",
+ "sha256:fdb2231db176e0848b757fc5d9bed08bc8a498b5b9abb8b640f39e9720f309fc"
+ ],
+ "index": "pypi",
+ "version": "==1.2.3"
},
"setuptools": {
"hashes": [
- "sha256:7999cbd87f1b6e1f33bf47efa368b224bed5e27b5ef2c4d46580186cbcb1a86a",
- "sha256:a65e3802053e99fc64c6b3b29c11132943d5b8c8facbcc461157511546510967"
+ "sha256:26ead7d1f93efc0f8c804d9fafafbe4a44b179580a7105754b245155f9af05a8",
+ "sha256:47c7b0c0f8fc10eec4cf1e71c6fdadf8decaa74ffa087e68cd1c20db7ad6a592"
],
"markers": "python_version >= '3.7'",
- "version": "==62.0.0"
+ "version": "==62.1.0"
},
"six": {
"hashes": [
@@ -955,11 +1105,11 @@
},
"timezonefinder": {
"hashes": [
- "sha256:4545533086eb25cd7ba10b97785059acbababf4577ab1b4d5c2ab56642eadfea",
- "sha256:a374570295a8dbd923630ce85f754e52578e288cb0a9cf575834415e84758352"
+ "sha256:90228f7bcf60388868ac95d3d6a8c9f710c766990909cb89dc39a893da7132ad",
+ "sha256:ce16831bc6349a82ca25ffc0e4c89df5bc5df29b286e5201701bce852f8e49f2"
],
"index": "pypi",
- "version": "==5.2.0"
+ "version": "==6.0.0"
},
"tomli": {
"hashes": [
@@ -979,11 +1129,11 @@
},
"typing-extensions": {
"hashes": [
- "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42",
- "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"
+ "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708",
+ "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"
],
- "markers": "python_version >= '3.6'",
- "version": "==4.1.1"
+ "markers": "python_version >= '3.7'",
+ "version": "==4.2.0"
},
"urllib3": {
"hashes": [
@@ -1010,81 +1160,81 @@
},
"werkzeug": {
"hashes": [
- "sha256:3c5493ece8268fecdcdc9c0b112211acd006354723b280d643ec732b6d4063d6",
- "sha256:f8e89a20aeabbe8a893c24a461d3ee5dad2123b05cc6abd73ceed01d39c3ae74"
+ "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6",
+ "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255"
],
"markers": "python_version >= '3.7'",
- "version": "==2.1.1"
+ "version": "==2.1.2"
},
"wrapt": {
"hashes": [
- "sha256:00108411e0f34c52ce16f81f1d308a571df7784932cc7491d1e94be2ee93374b",
- "sha256:01f799def9b96a8ec1ef6b9c1bbaf2bbc859b87545efbecc4a78faea13d0e3a0",
- "sha256:09d16ae7a13cff43660155383a2372b4aa09109c7127aa3f24c3cf99b891c330",
- "sha256:14e7e2c5f5fca67e9a6d5f753d21f138398cad2b1159913ec9e9a67745f09ba3",
- "sha256:167e4793dc987f77fd476862d32fa404d42b71f6a85d3b38cbce711dba5e6b68",
- "sha256:1807054aa7b61ad8d8103b3b30c9764de2e9d0c0978e9d3fc337e4e74bf25faa",
- "sha256:1f83e9c21cd5275991076b2ba1cd35418af3504667affb4745b48937e214bafe",
- "sha256:21b1106bff6ece8cb203ef45b4f5778d7226c941c83aaaa1e1f0f4f32cc148cd",
- "sha256:22626dca56fd7f55a0733e604f1027277eb0f4f3d95ff28f15d27ac25a45f71b",
- "sha256:23f96134a3aa24cc50614920cc087e22f87439053d886e474638c68c8d15dc80",
- "sha256:2498762814dd7dd2a1d0248eda2afbc3dd9c11537bc8200a4b21789b6df6cd38",
- "sha256:28c659878f684365d53cf59dc9a1929ea2eecd7ac65da762be8b1ba193f7e84f",
- "sha256:2eca15d6b947cfff51ed76b2d60fd172c6ecd418ddab1c5126032d27f74bc350",
- "sha256:354d9fc6b1e44750e2a67b4b108841f5f5ea08853453ecbf44c81fdc2e0d50bd",
- "sha256:36a76a7527df8583112b24adc01748cd51a2d14e905b337a6fefa8b96fc708fb",
- "sha256:3a0a4ca02752ced5f37498827e49c414d694ad7cf451ee850e3ff160f2bee9d3",
- "sha256:3a71dbd792cc7a3d772ef8cd08d3048593f13d6f40a11f3427c000cf0a5b36a0",
- "sha256:3a88254881e8a8c4784ecc9cb2249ff757fd94b911d5df9a5984961b96113fff",
- "sha256:47045ed35481e857918ae78b54891fac0c1d197f22c95778e66302668309336c",
- "sha256:4775a574e9d84e0212f5b18886cace049a42e13e12009bb0491562a48bb2b758",
- "sha256:493da1f8b1bb8a623c16552fb4a1e164c0200447eb83d3f68b44315ead3f9036",
- "sha256:4b847029e2d5e11fd536c9ac3136ddc3f54bc9488a75ef7d040a3900406a91eb",
- "sha256:59d7d92cee84a547d91267f0fea381c363121d70fe90b12cd88241bd9b0e1763",
- "sha256:5a0898a640559dec00f3614ffb11d97a2666ee9a2a6bad1259c9facd01a1d4d9",
- "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7",
- "sha256:5b835b86bd5a1bdbe257d610eecab07bf685b1af2a7563093e0e69180c1d4af1",
- "sha256:5f24ca7953f2643d59a9c87d6e272d8adddd4a53bb62b9208f36db408d7aafc7",
- "sha256:61e1a064906ccba038aa3c4a5a82f6199749efbbb3cef0804ae5c37f550eded0",
- "sha256:65bf3eb34721bf18b5a021a1ad7aa05947a1767d1aa272b725728014475ea7d5",
- "sha256:6807bcee549a8cb2f38f73f469703a1d8d5d990815c3004f21ddb68a567385ce",
- "sha256:68aeefac31c1f73949662ba8affaf9950b9938b712fb9d428fa2a07e40ee57f8",
- "sha256:6915682f9a9bc4cf2908e83caf5895a685da1fbd20b6d485dafb8e218a338279",
- "sha256:6d9810d4f697d58fd66039ab959e6d37e63ab377008ef1d63904df25956c7db0",
- "sha256:729d5e96566f44fccac6c4447ec2332636b4fe273f03da128fff8d5559782b06",
- "sha256:748df39ed634851350efa87690c2237a678ed794fe9ede3f0d79f071ee042561",
- "sha256:763a73ab377390e2af26042f685a26787c402390f682443727b847e9496e4a2a",
- "sha256:8323a43bd9c91f62bb7d4be74cc9ff10090e7ef820e27bfe8815c57e68261311",
- "sha256:8529b07b49b2d89d6917cfa157d3ea1dfb4d319d51e23030664a827fe5fd2131",
- "sha256:87fa943e8bbe40c8c1ba4086971a6fefbf75e9991217c55ed1bcb2f1985bd3d4",
- "sha256:88236b90dda77f0394f878324cfbae05ae6fde8a84d548cfe73a75278d760291",
- "sha256:891c353e95bb11abb548ca95c8b98050f3620a7378332eb90d6acdef35b401d4",
- "sha256:89ba3d548ee1e6291a20f3c7380c92f71e358ce8b9e48161401e087e0bc740f8",
- "sha256:8c6be72eac3c14baa473620e04f74186c5d8f45d80f8f2b4eda6e1d18af808e8",
- "sha256:9a242871b3d8eecc56d350e5e03ea1854de47b17f040446da0e47dc3e0b9ad4d",
- "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c",
- "sha256:9a5a544861b21e0e7575b6023adebe7a8c6321127bb1d238eb40d99803a0e8bd",
- "sha256:9d57677238a0c5411c76097b8b93bdebb02eb845814c90f0b01727527a179e4d",
- "sha256:9d8c68c4145041b4eeae96239802cfdfd9ef927754a5be3f50505f09f309d8c6",
- "sha256:9d9fcd06c952efa4b6b95f3d788a819b7f33d11bea377be6b8980c95e7d10775",
- "sha256:a0057b5435a65b933cbf5d859cd4956624df37b8bf0917c71756e4b3d9958b9e",
- "sha256:a65bffd24409454b889af33b6c49d0d9bcd1a219b972fba975ac935f17bdf627",
- "sha256:b0ed6ad6c9640671689c2dbe6244680fe8b897c08fd1fab2228429b66c518e5e",
- "sha256:b21650fa6907e523869e0396c5bd591cc326e5c1dd594dcdccac089561cacfb8",
- "sha256:b3f7e671fb19734c872566e57ce7fc235fa953d7c181bb4ef138e17d607dc8a1",
- "sha256:b77159d9862374da213f741af0c361720200ab7ad21b9f12556e0eb95912cd48",
- "sha256:bb36fbb48b22985d13a6b496ea5fb9bb2a076fea943831643836c9f6febbcfdc",
- "sha256:d066ffc5ed0be00cd0352c95800a519cf9e4b5dd34a028d301bdc7177c72daf3",
- "sha256:d332eecf307fca852d02b63f35a7872de32d5ba8b4ec32da82f45df986b39ff6",
- "sha256:d808a5a5411982a09fef6b49aac62986274ab050e9d3e9817ad65b2791ed1425",
- "sha256:d9bdfa74d369256e4218000a629978590fd7cb6cf6893251dad13d051090436d",
- "sha256:db6a0ddc1282ceb9032e41853e659c9b638789be38e5b8ad7498caac00231c23",
- "sha256:debaf04f813ada978d7d16c7dfa16f3c9c2ec9adf4656efdc4defdf841fc2f0c",
- "sha256:f0408e2dbad9e82b4c960274214af533f856a199c9274bd4aff55d4634dedc33",
- "sha256:f2f3bc7cd9c9fcd39143f11342eb5963317bd54ecc98e3650ca22704b69d9653"
+ "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3",
+ "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b",
+ "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4",
+ "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2",
+ "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656",
+ "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3",
+ "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff",
+ "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310",
+ "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a",
+ "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57",
+ "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069",
+ "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383",
+ "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe",
+ "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87",
+ "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d",
+ "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b",
+ "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907",
+ "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f",
+ "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0",
+ "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28",
+ "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1",
+ "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853",
+ "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc",
+ "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3",
+ "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3",
+ "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164",
+ "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1",
+ "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c",
+ "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1",
+ "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7",
+ "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1",
+ "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320",
+ "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed",
+ "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1",
+ "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248",
+ "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c",
+ "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456",
+ "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77",
+ "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef",
+ "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1",
+ "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7",
+ "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86",
+ "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4",
+ "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d",
+ "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d",
+ "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8",
+ "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5",
+ "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471",
+ "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00",
+ "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68",
+ "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3",
+ "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d",
+ "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735",
+ "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d",
+ "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569",
+ "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7",
+ "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59",
+ "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5",
+ "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb",
+ "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b",
+ "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f",
+ "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462",
+ "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015",
+ "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==1.14.0"
+ "version": "==1.14.1"
},
"zipp": {
"hashes": [
@@ -1111,29 +1261,52 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==21.4.0"
},
+ "azure-common": {
+ "hashes": [
+ "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3",
+ "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"
+ ],
+ "version": "==1.1.28"
+ },
+ "azure-storage-blob": {
+ "hashes": [
+ "sha256:a8e91a51d4f62d11127c7fd8ba0077385c5b11022f0269f8a2a71b9fc36bef31",
+ "sha256:b90323aad60f207f9f90a0c4cf94c10acc313c20b39403398dfba51f25f7b454"
+ ],
+ "index": "pypi",
+ "version": "==2.1.0"
+ },
+ "azure-storage-common": {
+ "hashes": [
+ "sha256:b01a491a18839b9d05a4fe3421458a0ddb5ab9443c14e487f40d16f9a1dc2fbe",
+ "sha256:ccedef5c67227bc4d6670ffd37cec18fb529a1b7c3a5e53e4096eb0cf23dc73f"
+ ],
+ "version": "==2.1.0"
+ },
"babel": {
"hashes": [
- "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9",
- "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"
+ "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2",
+ "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"
],
- "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
- "version": "==2.9.1"
+ "markers": "python_version >= '3.6'",
+ "version": "==2.10.1"
},
"bcrypt": {
"hashes": [
- "sha256:56e5da069a76470679f312a7d3d23deb3ac4519991a0361abc11da837087b61d",
- "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29",
- "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7",
- "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34",
- "sha256:a0584a92329210fcd75eb8a3250c5a941633f8bfaf2a18f81009b097732839b7",
- "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55",
- "sha256:b589229207630484aefe5899122fb938a5b017b0f4349f769b8c13e78d99a8fd",
- "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6",
- "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1",
- "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"
+ "sha256:2b02d6bfc6336d1094276f3f588aa1225a598e27f8e3388f4db9948cb707b521",
+ "sha256:433c410c2177057705da2a9f2cd01dd157493b2a7ac14c8593a16b3dab6b6bfb",
+ "sha256:4e029cef560967fb0cf4a802bcf4d562d3d6b4b1bf81de5ec1abbe0f1adb027e",
+ "sha256:61bae49580dce88095d669226d5076d0b9d927754cedbdf76c6c9f5099ad6f26",
+ "sha256:6d2cb9d969bfca5bc08e45864137276e4c3d3d7de2b162171def3d188bf9d34a",
+ "sha256:7180d98a96f00b1050e93f5b0f556e658605dd9f524d0b0e68ae7944673f525e",
+ "sha256:7d9ba2e41e330d2af4af6b1b6ec9e6128e91343d0b4afb9282e54e5508f31baa",
+ "sha256:7ff2069240c6bbe49109fe84ca80508773a904f5a8cb960e02a977f7f519b129",
+ "sha256:88273d806ab3a50d06bc6a2fc7c87d737dd669b76ad955f449c43095389bc8fb",
+ "sha256:a2c46100e315c3a5b90fdc53e429c006c5f962529bc27e1dfd656292c20ccc40",
+ "sha256:cd43303d6b8a165c29ec6756afd169faba9396a9472cdff753fe9f19b96ce2fa"
],
"markers": "python_version >= '3.6'",
- "version": "==3.2.0"
+ "version": "==3.2.2"
},
"breathe": {
"hashes": [
@@ -1291,29 +1464,31 @@
},
"cryptography": {
"hashes": [
- "sha256:0a3bf09bb0b7a2c93ce7b98cb107e9170a90c51a0162a20af1c61c765b90e60b",
- "sha256:1f64a62b3b75e4005df19d3b5235abd43fa6358d5516cfc43d87aeba8d08dd51",
- "sha256:32db5cc49c73f39aac27574522cecd0a4bb7384e71198bc65a0d23f901e89bb7",
- "sha256:4881d09298cd0b669bb15b9cfe6166f16fc1277b4ed0d04a22f3d6430cb30f1d",
- "sha256:4e2dddd38a5ba733be6a025a1475a9f45e4e41139d1321f412c6b360b19070b6",
- "sha256:53e0285b49fd0ab6e604f4c5d9c5ddd98de77018542e88366923f152dbeb3c29",
- "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9",
- "sha256:7b2d54e787a884ffc6e187262823b6feb06c338084bbe80d45166a1cb1c6c5bf",
- "sha256:7be666cc4599b415f320839e36367b273db8501127b38316f3b9f22f17a0b815",
- "sha256:8241cac0aae90b82d6b5c443b853723bcc66963970c67e56e71a2609dc4b5eaf",
- "sha256:82740818f2f240a5da8dfb8943b360e4f24022b093207160c77cadade47d7c85",
- "sha256:8897b7b7ec077c819187a123174b645eb680c13df68354ed99f9b40a50898f77",
- "sha256:c2c5250ff0d36fd58550252f54915776940e4e866f38f3a7866d92b32a654b86",
- "sha256:ca9f686517ec2c4a4ce930207f75c00bf03d94e5063cbc00a1dc42531511b7eb",
- "sha256:d2b3d199647468d410994dbeb8cec5816fb74feb9368aedf300af709ef507e3e",
- "sha256:da73d095f8590ad437cd5e9faf6628a218aa7c387e1fdf67b888b47ba56a17f0",
- "sha256:e167b6b710c7f7bc54e67ef593f8731e1f45aa35f8a8a7b72d6e42ec76afd4b3",
- "sha256:ea634401ca02367c1567f012317502ef3437522e2fc44a3ea1844de028fa4b84",
- "sha256:ec6597aa85ce03f3e507566b8bcdf9da2227ec86c4266bd5e6ab4d9e0cc8dab2",
- "sha256:f64b232348ee82f13aac22856515ce0195837f6968aeaa94a3d0353ea2ec06a6"
- ],
- "index": "pypi",
- "version": "==36.0.2"
+ "sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804",
+ "sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178",
+ "sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717",
+ "sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982",
+ "sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004",
+ "sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe",
+ "sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452",
+ "sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336",
+ "sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4",
+ "sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15",
+ "sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d",
+ "sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c",
+ "sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0",
+ "sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06",
+ "sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9",
+ "sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1",
+ "sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023",
+ "sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de",
+ "sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f",
+ "sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181",
+ "sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e",
+ "sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a"
+ ],
+ "index": "pypi",
+ "version": "==37.0.2"
},
"cycler": {
"hashes": [
@@ -1407,11 +1582,11 @@
},
"fonttools": {
"hashes": [
- "sha256:236b29aee6b113e8f7bee28779c1230a86ad2aac9a74a31b0aedf57e7dfb62a4",
- "sha256:2df636a3f402ef14593c6811dac0609563b8c374bd7850e76919eb51ea205426"
+ "sha256:c0fdcfa8ceebd7c1b2021240bd46ef77aa8e7408cf10434be55df52384865f8e",
+ "sha256:f829c579a8678fa939a1d9e9894d01941db869de44390adb49ce67055a06cc2a"
],
"markers": "python_version >= '3.7'",
- "version": "==4.31.2"
+ "version": "==4.33.3"
},
"hexdump": {
"hashes": [
@@ -1422,19 +1597,19 @@
},
"hypothesis": {
"hashes": [
- "sha256:ca931c5a6414f3f9636fdaf978a216ee9b5c4a6b4415adf628e9d5e5003dcd99",
- "sha256:de48abb676fc76e4397cd002926e5747cef518570d132221244d27e1075c0bec"
+ "sha256:37ca37f61939d0a92c18b5e17ab8088dccc5fc077c913d6619bbe1d233dfca1e",
+ "sha256:c671b3801527f3a8189314d9385418a67d4c7ab1b3330a3ff8b267d0d4599b3d"
],
"index": "pypi",
- "version": "==6.41.0"
+ "version": "==6.46.2"
},
"identify": {
"hashes": [
- "sha256:3f3244a559290e7d3deb9e9adc7b33594c1bc85a9dd82e0f1be519bf12a1ec17",
- "sha256:5f06b14366bd1facb88b00540a1de05b69b310cbc2654db3c7e07fa3a4339323"
+ "sha256:3acfe15a96e4272b4ec5662ee3e231ceba976ef63fd9980ed2ce9cc415df393f",
+ "sha256:c83af514ea50bf2be2c4a3f2fb349442b59dc87284558ae9ff54191bff3541d2"
],
"markers": "python_version >= '3.7'",
- "version": "==2.4.12"
+ "version": "==2.5.0"
},
"idna": {
"hashes": [
@@ -1477,11 +1652,11 @@
},
"jinja2": {
"hashes": [
- "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119",
- "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"
+ "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
+ "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
],
"index": "pypi",
- "version": "==3.1.1"
+ "version": "==3.1.2"
},
"kiwisolver": {
"hashes": [
@@ -1541,11 +1716,11 @@
},
"markdown-it-py": {
"hashes": [
- "sha256:31974138ca8cafbcb62213f4974b29571b940e78364584729233f59b8dfdb8bd",
- "sha256:7b5c153ae1ab2cde00a33938bce68f3ad5d68fbe363f946de7d28555bed4e08a"
+ "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27",
+ "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"
],
"index": "pypi",
- "version": "==2.0.1"
+ "version": "==2.1.0"
},
"markupsafe": {
"hashes": [
@@ -1595,44 +1770,44 @@
},
"matplotlib": {
"hashes": [
- "sha256:14334b9902ec776461c4b8c6516e26b450f7ebe0b3ef8703bf5cdfbbaecf774a",
- "sha256:2252bfac85cec7af4a67e494bfccf9080bcba8a0299701eab075f48847cca907",
- "sha256:2e3484d8455af3fdb0424eae1789af61f6a79da0c80079125112fd5c1b604218",
- "sha256:34a1fc29f8f96e78ec57a5eff5e8d8b53d3298c3be6df61e7aa9efba26929522",
- "sha256:3e66497cd990b1a130e21919b004da2f1dc112132c01ac78011a90a0f9229778",
- "sha256:40e0d7df05e8efe60397c69b467fc8f87a2affeb4d562fe92b72ff8937a2b511",
- "sha256:456cc8334f6d1124e8ff856b42d2cc1c84335375a16448189999496549f7182b",
- "sha256:506b210cc6e66a0d1c2bb765d055f4f6bc2745070fb1129203b67e85bbfa5c18",
- "sha256:53273c5487d1c19c3bc03b9eb82adaf8456f243b97ed79d09dded747abaf1235",
- "sha256:577ed20ec9a18d6bdedb4616f5e9e957b4c08563a9f985563a31fd5b10564d2a",
- "sha256:6803299cbf4665eca14428d9e886de62e24f4223ac31ab9c5d6d5339a39782c7",
- "sha256:68fa30cec89b6139dc559ed6ef226c53fd80396da1919a1b5ef672c911aaa767",
- "sha256:6c094e4bfecd2fa7f9adffd03d8abceed7157c928c2976899de282f3600f0a3d",
- "sha256:778d398c4866d8e36ee3bf833779c940b5f57192fa0a549b3ad67bc4c822771b",
- "sha256:7a350ca685d9f594123f652ba796ee37219bf72c8e0fc4b471473d87121d6d34",
- "sha256:87900c67c0f1728e6db17c6809ec05c025c6624dcf96a8020326ea15378fe8e7",
- "sha256:8a77906dc2ef9b67407cec0bdbf08e3971141e535db888974a915be5e1e3efc6",
- "sha256:8e70ae6475cfd0fad3816dcbf6cac536dc6f100f7474be58d59fa306e6e768a4",
- "sha256:abf67e05a1b7f86583f6ebd01f69b693b9c535276f4e943292e444855870a1b8",
- "sha256:b04fc29bcef04d4e2d626af28d9d892be6aba94856cb46ed52bcb219ceac8943",
- "sha256:b19a761b948e939a9e20173aaae76070025f0024fc8f7ba08bef22a5c8573afc",
- "sha256:b2e9810e09c3a47b73ce9cab5a72243a1258f61e7900969097a817232246ce1c",
- "sha256:b71f3a7ca935fc759f2aed7cec06cfe10bc3100fadb5dbd9c435b04e557971e1",
- "sha256:b8a4fb2a0c5afbe9604f8a91d7d0f27b1832c3e0b5e365f95a13015822b4cd65",
- "sha256:bb1c613908f11bac270bc7494d68b1ef6e7c224b7a4204d5dacf3522a41e2bc3",
- "sha256:d24e5bb8028541ce25e59390122f5e48c8506b7e35587e5135efcb6471b4ac6c",
- "sha256:d70a32ee1f8b55eed3fd4e892f0286df8cccc7e0475c11d33b5d0a148f5c7599",
- "sha256:e293b16cf303fe82995e41700d172a58a15efc5331125d08246b520843ef21ee",
- "sha256:e2f28a07b4f82abb40267864ad7b3a4ed76f1b1663e81c7efc84a9b9248f672f",
- "sha256:e3520a274a0e054e919f5b3279ee5dbccf5311833819ccf3399dab7c83e90a25",
- "sha256:e3b6f3fd0d8ca37861c31e9a7cab71a0ef14c639b4c95654ea1dd153158bf0df",
- "sha256:e486f60db0cd1c8d68464d9484fd2a94011c1ac8593d765d0211f9daba2bd535",
- "sha256:e8c87cdaf06fd7b2477f68909838ff4176f105064a72ca9d24d3f2a29f73d393",
- "sha256:edf5e4e1d5fb22c18820e8586fb867455de3b109c309cb4fce3aaed85d9468d1",
- "sha256:fe8d40c434a8e2c68d64c6d6a04e77f21791a93ff6afe0dce169597c110d3079"
- ],
- "index": "pypi",
- "version": "==3.5.1"
+ "sha256:03bbb3f5f78836855e127b5dab228d99551ad0642918ccbf3067fcd52ac7ac5e",
+ "sha256:24173c23d1bcbaed5bf47b8785d27933a1ac26a5d772200a0f3e0e38f471b001",
+ "sha256:2a0967d4156adbd0d46db06bc1a877f0370bce28d10206a5071f9ecd6dc60b79",
+ "sha256:2e8bda1088b941ead50caabd682601bece983cadb2283cafff56e8fcddbf7d7f",
+ "sha256:31fbc2af27ebb820763f077ec7adc79b5a031c2f3f7af446bd7909674cd59460",
+ "sha256:364e6bca34edc10a96aa3b1d7cd76eb2eea19a4097198c1b19e89bee47ed5781",
+ "sha256:3d8e129af95b156b41cb3be0d9a7512cc6d73e2b2109f82108f566dbabdbf377",
+ "sha256:44c6436868186564450df8fd2fc20ed9daaef5caad699aa04069e87099f9b5a8",
+ "sha256:48cf850ce14fa18067f2d9e0d646763681948487a8080ec0af2686468b4607a2",
+ "sha256:49a5938ed6ef9dda560f26ea930a2baae11ea99e1c2080c8714341ecfda72a89",
+ "sha256:4a05f2b37222319753a5d43c0a4fd97ed4ff15ab502113e3f2625c26728040cf",
+ "sha256:4a44cdfdb9d1b2f18b1e7d315eb3843abb097869cd1ef89cfce6a488cd1b5182",
+ "sha256:4fa28ca76ac5c2b2d54bc058b3dad8e22ee85d26d1ee1b116a6fd4d2277b6a04",
+ "sha256:5844cea45d804174bf0fac219b4ab50774e504bef477fc10f8f730ce2d623441",
+ "sha256:5a32ea6e12e80dedaca2d4795d9ed40f97bfa56e6011e14f31502fdd528b9c89",
+ "sha256:6c623b355d605a81c661546af7f24414165a8a2022cddbe7380a31a4170fa2e9",
+ "sha256:751d3815b555dcd6187ad35b21736dc12ce6925fc3fa363bbc6dc0f86f16484f",
+ "sha256:75c406c527a3aa07638689586343f4b344fcc7ab1f79c396699eb550cd2b91f7",
+ "sha256:77157be0fc4469cbfb901270c205e7d8adb3607af23cef8bd11419600647ceed",
+ "sha256:7d7705022df2c42bb02937a2a824f4ec3cca915700dd80dc23916af47ff05f1a",
+ "sha256:7f409716119fa39b03da3d9602bd9b41142fab7a0568758cd136cd80b1bf36c8",
+ "sha256:9480842d5aadb6e754f0b8f4ebeb73065ac8be1855baa93cd082e46e770591e9",
+ "sha256:9776e1a10636ee5f06ca8efe0122c6de57ffe7e8c843e0fb6e001e9d9256ec95",
+ "sha256:a91426ae910819383d337ba0dc7971c7cefdaa38599868476d94389a329e599b",
+ "sha256:b4fedaa5a9aa9ce14001541812849ed1713112651295fdddd640ea6620e6cf98",
+ "sha256:b6c63cd01cad0ea8704f1fd586e9dc5777ccedcd42f63cbbaa3eae8dd41172a1",
+ "sha256:b8d3f4e71e26307e8c120b72c16671d70c5cd08ae412355c11254aa8254fb87f",
+ "sha256:c4b82c2ae6d305fcbeb0eb9c93df2602ebd2f174f6e8c8a5d92f9445baa0c1d3",
+ "sha256:c772264631e5ae61f0bd41313bbe48e1b9bcc95b974033e1118c9caa1a84d5c6",
+ "sha256:c87973ddec10812bddc6c286b88fdd654a666080fbe846a1f7a3b4ba7b11ab78",
+ "sha256:e2b696699386766ef171a259d72b203a3c75d99d03ec383b97fc2054f52e15cf",
+ "sha256:ea75df8e567743207e2b479ba3d8843537be1c146d4b1e3e395319a4e1a77fe9",
+ "sha256:ebc27ad11df3c1661f4677a7762e57a8a91dd41b466c3605e90717c9a5f90c82",
+ "sha256:ee0b8e586ac07f83bb2950717e66cb305e2859baf6f00a9c39cc576e0ce9629c",
+ "sha256:ee175a571e692fc8ae8e41ac353c0e07259113f4cb063b0ec769eff9717e84bb"
+ ],
+ "index": "pypi",
+ "version": "==3.5.2"
},
"mdit-py-plugins": {
"hashes": [
@@ -1644,11 +1819,11 @@
},
"mdurl": {
"hashes": [
- "sha256:40654d6dcb8d21501ed13c21cc0bd6fc42ff07ceb8be30029e5ae63ebc2ecfda",
- "sha256:94873a969008ee48880fb21bad7de0349fef529f3be178969af5817239e9b990"
+ "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b",
+ "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"
],
- "markers": "python_version >= '3.6'",
- "version": "==0.1.0"
+ "markers": "python_version >= '3.7'",
+ "version": "==0.1.1"
},
"mpld3": {
"hashes": [
@@ -1661,32 +1836,32 @@
},
"mypy": {
"hashes": [
- "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e",
- "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16",
- "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2",
- "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c",
- "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67",
- "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5",
- "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b",
- "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6",
- "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58",
- "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d",
- "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17",
- "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0",
- "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca",
- "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6",
- "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322",
- "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534",
- "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3",
- "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db",
- "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904",
- "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c",
- "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46",
- "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8",
- "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"
- ],
- "index": "pypi",
- "version": "==0.942"
+ "sha256:0112752a6ff07230f9ec2f71b0d3d4e088a910fdce454fdb6553e83ed0eced7d",
+ "sha256:0384d9f3af49837baa92f559d3fa673e6d2652a16550a9ee07fc08c736f5e6f8",
+ "sha256:1b333cfbca1762ff15808a0ef4f71b5d3eed8528b23ea1c3fb50543c867d68de",
+ "sha256:1fdeb0a0f64f2a874a4c1f5271f06e40e1e9779bf55f9567f149466fc7a55038",
+ "sha256:4c653e4846f287051599ed8f4b3c044b80e540e88feec76b11044ddc5612ffed",
+ "sha256:563514c7dc504698fb66bb1cf897657a173a496406f1866afae73ab5b3cdb334",
+ "sha256:5b231afd6a6e951381b9ef09a1223b1feabe13625388db48a8690f8daa9b71ff",
+ "sha256:5ce6a09042b6da16d773d2110e44f169683d8cc8687e79ec6d1181a72cb028d2",
+ "sha256:5e7647df0f8fc947388e6251d728189cfadb3b1e558407f93254e35abc026e22",
+ "sha256:6003de687c13196e8a1243a5e4bcce617d79b88f83ee6625437e335d89dfebe2",
+ "sha256:61504b9a5ae166ba5ecfed9e93357fd51aa693d3d434b582a925338a2ff57fd2",
+ "sha256:77423570c04aca807508a492037abbd72b12a1fb25a385847d191cd50b2c9605",
+ "sha256:a4d9898f46446bfb6405383b57b96737dcfd0a7f25b748e78ef3e8c576bba3cb",
+ "sha256:a952b8bc0ae278fc6316e6384f67bb9a396eb30aced6ad034d3a76120ebcc519",
+ "sha256:b5b5bd0ffb11b4aba2bb6d31b8643902c48f990cc92fda4e21afac658044f0c0",
+ "sha256:ca75ecf2783395ca3016a5e455cb322ba26b6d33b4b413fcdedfc632e67941dc",
+ "sha256:cf9c261958a769a3bd38c3e133801ebcd284ffb734ea12d01457cb09eacf7d7b",
+ "sha256:dd4d670eee9610bf61c25c940e9ade2d0ed05eb44227275cce88701fee014b1f",
+ "sha256:e19736af56947addedce4674c0971e5dceef1b5ec7d667fe86bcd2b07f8f9075",
+ "sha256:eaea21d150fb26d7b4856766e7addcf929119dd19fc832b22e71d942835201ef",
+ "sha256:eaff8156016487c1af5ffa5304c3e3fd183edcb412f3e9c72db349faf3f6e0eb",
+ "sha256:ee0a36edd332ed2c5208565ae6e3a7afc0eabb53f5327e281f2ef03a6bc7687a",
+ "sha256:ef7beb2a3582eb7a9f37beaf38a28acfd801988cde688760aea9e6cc4832b10b"
+ ],
+ "index": "pypi",
+ "version": "==0.950"
},
"mypy-extensions": {
"hashes": [
@@ -1697,11 +1872,11 @@
},
"myst-parser": {
"hashes": [
- "sha256:555ec2950aba5ae5dac5c162c7e9a43ad4a7291cfac644d8f5f84da8efa6f356",
- "sha256:d412347a5cacb77ebc03d7f7ffef050cd61957d46f234313d350e84e24972260"
+ "sha256:1635ce3c18965a528d6de980f989ff64d6a1effb482e1f611b1bfb79e38f3d98",
+ "sha256:4c076d649e066f9f5c7c661bae2658be1ca06e76b002bb97f02a09398707686c"
],
"index": "pypi",
- "version": "==0.17.0"
+ "version": "==0.17.2"
},
"natsort": {
"hashes": [
@@ -1775,11 +1950,11 @@
},
"paramiko": {
"hashes": [
- "sha256:ac6593479f2b47a9422eca076b22cff9f795495e6733a64723efc75dd8c92101",
- "sha256:ddb1977853aef82804b35d72a0e597b244fa326c404c350bd00c5b01dbfee71a"
+ "sha256:3c9ed6084f4b671ab66dc3c729092d32d96c3258f1426071301cb33654b09027",
+ "sha256:3d2e650b6812ce6d160abff701d6ef4434ec97934b13e95cf1ad3da70ffb5c58"
],
"index": "pypi",
- "version": "==2.10.3"
+ "version": "==2.10.4"
},
"pillow": {
"hashes": [
@@ -1827,11 +2002,11 @@
},
"platformdirs": {
"hashes": [
- "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d",
- "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"
+ "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788",
+ "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"
],
"markers": "python_version >= '3.7'",
- "version": "==2.5.1"
+ "version": "==2.5.2"
},
"pluggy": {
"hashes": [
@@ -1850,11 +2025,11 @@
},
"pre-commit": {
"hashes": [
- "sha256:02226e69564ebca1a070bd1f046af866aa1c318dbc430027c50ab832ed2b73f2",
- "sha256:5d445ee1fa8738d506881c5d84f83c62bb5be6b2838e32207433647e8e5ebe10"
+ "sha256:10c62741aa5704faea2ad69cb550ca78082efe5697d6f04e5710c3c229afdd10",
+ "sha256:4233a1e38621c87d9dda9808c6606d7e7ba0e087cd56d3fe03202a01d2919615"
],
"index": "pypi",
- "version": "==2.18.1"
+ "version": "==2.19.0"
},
"py": {
"hashes": [
@@ -1944,11 +2119,11 @@
},
"pygments": {
"hashes": [
- "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65",
- "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"
+ "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb",
+ "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"
],
- "markers": "python_version >= '3.5'",
- "version": "==2.11.2"
+ "markers": "python_version >= '3.6'",
+ "version": "==2.12.0"
},
"pynacl": {
"hashes": [
@@ -1968,11 +2143,11 @@
},
"pyparsing": {
"hashes": [
- "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea",
- "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"
+ "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954",
+ "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"
],
- "markers": "python_version >= '3.6'",
- "version": "==3.0.7"
+ "markers": "python_full_version >= '3.6.8'",
+ "version": "==3.0.8"
},
"pyprof2calltree": {
"hashes": [
@@ -1983,11 +2158,11 @@
},
"pytest": {
"hashes": [
- "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63",
- "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"
+ "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c",
+ "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"
],
"index": "pypi",
- "version": "==7.1.1"
+ "version": "==7.1.2"
},
"pytest-forked": {
"hashes": [
@@ -2231,11 +2406,11 @@
},
"typing-extensions": {
"hashes": [
- "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42",
- "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"
+ "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708",
+ "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"
],
- "markers": "python_version >= '3.6'",
- "version": "==4.1.1"
+ "markers": "python_version >= '3.7'",
+ "version": "==4.2.0"
},
"urllib3": {
"hashes": [
@@ -2247,11 +2422,11 @@
},
"virtualenv": {
"hashes": [
- "sha256:1e8588f35e8b42c6ec6841a13c5e88239de1e6e4e4cedfd3916b306dc826ec66",
- "sha256:8e5b402037287126e81ccde9432b95a8be5b19d36584f64957060a3488c11ca8"
+ "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a",
+ "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
- "version": "==20.14.0"
+ "version": "==20.14.1"
},
"zipp": {
"hashes": [
diff --git a/RELEASES.md b/RELEASES.md
index 8d8ee06d63..6a72f8989a 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -1,11 +1,25 @@
Version 0.8.14 (2022-0X-XX)
========================
- * bigmodel!
+ * New driving model
+ * Bigger model, using both of comma three's road-facing cameras
+ * Better at cut-in detection and tight turns
+ * New driver monitoring model
+ * Tweaked network structure to improve output resolution for dsp
+ * Fixed bug in quantization aware training to reduce quantizing errors
+ * Resulted in 7x less MSE and no more random biases at runtime
+ * New lateral controller based on physical wheel torque model
+ * Much smoother control, consistent across the speed range
+ * Effective feedforward that uses road roll
+ * Simplified tuning, all car-specific parameters can be derived from data
+ * Initially used on TSS2 Corolla and TSS-P RAV4
+ * Added toggle to disable disengaging on the accelerator pedal
* comma body support
+ * Audi RS3 support thanks to jyoung8607!
* Hyundai Ioniq Plug-in Hybrid 2019 support thanks to sunnyhaibin!
* Hyundai Tucson Diesel 2019 support thanks to sunnyhaibin!
* Toyota Alphard Hybrid 2021 support
* Toyota Avalon Hybrid 2022 support
+ * Toyota RAV4 Hybrid 2022 support
Version 0.8.13 (2022-02-18)
========================
diff --git a/SConstruct b/SConstruct
index ec76448235..520716859a 100644
--- a/SConstruct
+++ b/SConstruct
@@ -183,9 +183,7 @@ env = Environment(
"#third_party/acados/include/blasfeo/include",
"#third_party/acados/include/hpipm/include",
"#third_party/catch2/include",
- "#third_party/bzip2",
"#third_party/libyuv/include",
- "#third_party/openmax/include",
"#third_party/json11",
"#third_party/curl/include",
"#third_party/libgralloc/include",
diff --git a/cereal b/cereal
index 29f4fe89ef..c7d3a0acba 160000
--- a/cereal
+++ b/cereal
@@ -1 +1 @@
-Subproject commit 29f4fe89ef710ff86a5aeb998a357187d0619fb8
+Subproject commit c7d3a0acbae267ef93d30044e1941e060dac9e48
diff --git a/common/gpio.py b/common/gpio.py
index cb0322146c..32e5ca86cc 100644
--- a/common/gpio.py
+++ b/common/gpio.py
@@ -1,4 +1,4 @@
-def gpio_init(pin, output):
+def gpio_init(pin: int, output: bool) -> None:
try:
with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f:
f.write(b"out" if output else b"in")
@@ -6,7 +6,7 @@ def gpio_init(pin, output):
print(f"Failed to set gpio {pin} direction: {e}")
-def gpio_set(pin, high):
+def gpio_set(pin: int, high: bool) -> None:
try:
with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f:
f.write(b"1" if high else b"0")
diff --git a/common/realtime.py b/common/realtime.py
index 4a37efadab..6ef27ed3a3 100644
--- a/common/realtime.py
+++ b/common/realtime.py
@@ -2,6 +2,7 @@
import gc
import os
import time
+from collections import deque
from typing import Optional, List, Union
from setproctitle import getproctitle # pylint: disable=no-name-in-module
@@ -59,6 +60,8 @@ class Ratekeeper:
self._frame = 0
self._remaining = 0.0
self._process_name = getproctitle()
+ self._dts = deque([self._interval], maxlen=100)
+ self._last_monitor_time = sec_since_boot()
@property
def frame(self) -> int:
@@ -68,6 +71,12 @@ class Ratekeeper:
def remaining(self) -> float:
return self._remaining
+ @property
+ def lagging(self) -> bool:
+ avg_dt = sum(self._dts) / len(self._dts)
+ expected_dt = self._interval * (1 / 0.9)
+ return avg_dt > expected_dt
+
# Maintain loop rate by calling this at the end of each loop
def keep_time(self) -> bool:
lagged = self.monitor_time()
@@ -77,6 +86,10 @@ class Ratekeeper:
# this only monitor the cumulative lag, but does not enforce a rate
def monitor_time(self) -> bool:
+ prev = self._last_monitor_time
+ self._last_monitor_time = sec_since_boot()
+ self._dts.append(self._last_monitor_time - prev)
+
lagged = False
remaining = self._next_frame_time - sec_since_boot()
self._next_frame_time += self._interval
diff --git a/common/transformations/orientation.py b/common/transformations/orientation.py
index 415e247ab2..134442b624 100644
--- a/common/transformations/orientation.py
+++ b/common/transformations/orientation.py
@@ -1,5 +1,6 @@
# pylint: skip-file
import numpy as np
+from typing import Callable
from common.transformations.transformations import (ecef_euler_from_ned_single,
euler2quat_single,
@@ -11,7 +12,7 @@ from common.transformations.transformations import (ecef_euler_from_ned_single,
rot2quat_single)
-def numpy_wrap(function, input_shape, output_shape):
+def numpy_wrap(function, input_shape, output_shape) -> Callable[..., np.ndarray]:
"""Wrap a function to take either an input or list of inputs and return the correct shape"""
def f(*inps):
*args, inp = inps
diff --git a/common/window.py b/common/window.py
index ce1eecb881..613b3b201b 100644
--- a/common/window.py
+++ b/common/window.py
@@ -2,7 +2,7 @@ import sys
import pygame # pylint: disable=import-error
import cv2 # pylint: disable=import-error
-class Window():
+class Window:
def __init__(self, w, h, caption="window", double=False, halve=False):
self.w = w
self.h = h
@@ -54,7 +54,7 @@ class Window():
if __name__ == "__main__":
import numpy as np
win = Window(200, 200, double=True)
- img = np.zeros((200, 200, 3), np.uint8)
+ img: np.ndarray = np.zeros((200, 200, 3), np.uint8)
while 1:
print("draw")
img += 1
diff --git a/docs/CARS.md b/docs/CARS.md
index 520359596f..d41a112468 100644
--- a/docs/CARS.md
+++ b/docs/CARS.md
@@ -12,25 +12,25 @@ How We Rate The Cars
---
### openpilot Adaptive Cruise Control (ACC)
--
- openpilot is able to control the gas and brakes.
--
- openpilot is able to control the gas and brakes with some restrictions.
--
- The gas and brakes are controlled by the car's stock Adaptive Cruise Control (ACC) system.
+-
- openpilot is able to control the gas and brakes.
+-
- openpilot is able to control the gas and brakes with some restrictions.
+-
- The gas and brakes are controlled by the car's stock Adaptive Cruise Control (ACC) system.
### Stop and Go
--
- Adaptive Cruise Control (ACC) operates down to 0 mph.
--
- Adaptive Cruise Control (ACC) available only above certain speeds. See your car's manual for the minimum speed.
+-
- Adaptive Cruise Control (ACC) operates down to 0 mph.
+-
- Adaptive Cruise Control (ACC) available only above certain speeds. See your car's manual for the minimum speed.
### Steer to 0
--
- openpilot can control the steering wheel down to 0 mph.
--
- No steering control below certain speeds.
+-
- openpilot can control the steering wheel down to 0 mph.
+-
- No steering control below certain speeds.
### Steering Torque
--
- Car has enough steering torque for comfortable highway driving.
--
- Limited ability to make turns.
+-
- Car has enough steering torque for comfortable highway driving.
+-
- Limited ability to make turns.
### Actively Maintained
--
- Mainline software support, harness hardware sold by comma, lots of users, primary development target.
--
- Low user count, community maintained, harness hardware not sold by comma.
+-
- Mainline software support, harness hardware sold by comma, lots of users, primary development target.
+-
- Low user count, community maintained, harness hardware not sold by comma.
**All supported cars can move between the tiers as support changes.**
@@ -38,179 +38,181 @@ How We Rate The Cars
|Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained|
|---|---|---|:---:|:---:|:---:|:---:|:---:|
-|comma|body|All|
|
|
|
|
|
-|Genesis|G70 2020|All|
|
|
|
|
|
-|Hyundai|Palisade 2020-21|All|
|
|
|
|
|
-|Hyundai|Santa Fe 2019-20|All|
|
|
|
|
|
-|Hyundai|Sonata 2020-22|All|
|
|
|
|
|
-|Hyundai|Sonata Hybrid 2020-22|All|
|
|
|
|
|
-|Kia|Niro Electric 2019-22|All|
|
|
|
|
|
-|Kia|Telluride 2020|SCC + LKAS|
|
|
|
|
|
-|Lexus|ES 2019-21|All|
|
|
|
|
|
-|Lexus|ES Hybrid 2019-21|All|
|
|
|
|
|
-|Lexus|NX 2020|All|
|
|
|
|
|
-|Lexus|RX 2020-22|All|
|
|
|
|
|
-|Lexus|RX Hybrid 2020-21|All|
|
|
|
|
|
-|Lexus|UX Hybrid 2019-21|All|
|
|
|
|
|
-|Toyota|Alphard 2019-20|All|
|
|
|
|
|
-|Toyota|Alphard Hybrid 2021|All|
|
|
|
|
|
-|Toyota|Avalon 2022|All|
|
|
|
|
|
-|Toyota|Avalon Hybrid 2022|All|
|
|
|
|
|
-|Toyota|Camry 2021-22|All|
|
[4](#footnotes)|
|
|
|
-|Toyota|Camry Hybrid 2021-22|All|
|
|
|
|
|
-|Toyota|Corolla 2020-22|All|
|
|
|
|
|
-|Toyota|Corolla Hatchback 2019-22|All|
|
|
|
|
|
-|Toyota|Corolla Hybrid 2020-22|All|
|
|
|
|
|
-|Toyota|Highlander 2020-22|All|
|
|
|
|
|
-|Toyota|Highlander Hybrid 2020-22|All|
|
|
|
|
|
-|Toyota|Mirai 2021|All|
|
|
|
|
|
-|Toyota|Prius 2021-22|All|
|
|
|
|
|
-|Toyota|Prius Prime 2021-22|All|
|
|
|
|
|
-|Toyota|RAV4 2019-21|All|
|
|
|
|
|
-|Toyota|RAV4 Hybrid 2019-21|All|
|
|
|
|
|
+|comma|body|All|
|
|
|
|
|
+|Genesis|G70 2020|All|
|
|
|
|
|
+|Hyundai|Palisade 2020-21|All|
|
|
|
|
|
+|Hyundai|Santa Fe 2019-20|All|
|
|
|
|
|
+|Hyundai|Sonata 2020-22|All|
|
|
|
|
|
+|Hyundai|Sonata Hybrid 2020-22|All|
|
|
|
|
|
+|Kia|Niro Electric 2019-22|All|
|
|
|
|
|
+|Kia|Telluride 2020|SCC + LKAS|
|
|
|
|
|
+|Lexus|ES 2019-21|All|
|
|
|
|
|
+|Lexus|ES Hybrid 2019-22|All|
|
|
|
|
|
+|Lexus|NX 2020|All|
|
|
|
|
|
+|Lexus|RX 2020-22|All|
|
|
|
|
|
+|Lexus|RX Hybrid 2020-21|All|
|
|
|
|
|
+|Lexus|UX Hybrid 2019-21|All|
|
|
|
|
|
+|Toyota|Alphard 2019-20|All|
|
|
|
|
|
+|Toyota|Alphard Hybrid 2021|All|
|
|
|
|
|
+|Toyota|Avalon 2022|All|
|
|
|
|
|
+|Toyota|Avalon Hybrid 2022|All|
|
|
|
|
|
+|Toyota|Camry 2021-22|All|
|
[4](#footnotes)|
|
|
|
+|Toyota|Camry Hybrid 2021-22|All|
|
|
|
|
|
+|Toyota|Corolla 2020-22|All|
|
|
|
|
|
+|Toyota|Corolla Hatchback 2019-22|All|
|
|
|
|
|
+|Toyota|Corolla Hybrid 2020-22|All|
|
|
|
|
|
+|Toyota|Highlander 2020-22|All|
|
|
|
|
|
+|Toyota|Highlander Hybrid 2020-22|All|
|
|
|
|
|
+|Toyota|Mirai 2021|All|
|
|
|
|
|
+|Toyota|Prius 2021-22|All|
|
|
|
|
|
+|Toyota|Prius Prime 2021-22|All|
|
|
|
|
|
+|Toyota|RAV4 2019-21|All|
|
|
|
|
|
+|Toyota|RAV4 Hybrid 2019-21|All|
|
|
|
|
|
## Silver Cars
|Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained|
|---|---|---|:---:|:---:|:---:|:---:|:---:|
-|Audi|A3 2014-19|ACC + Lane Assist|
|
|
|
|
|
-|Audi|A3 Sportback e-tron 2017-18|ACC + Lane Assist|
|
|
|
|
|
-|Audi|Q2 2018|ACC + Lane Assist|
|
|
|
|
|
-|Audi|Q3 2020-21|ACC + Lane Assist|
|
|
|
|
|
-|Audi|S3 2015-17|ACC + Lane Assist|
|
|
|
|
|
-|Genesis|G70 2018|All|
|
|
|
|
|
-|Genesis|G80 2018|All|
|
|
|
|
|
-|Hyundai|Elantra 2021-22|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Elantra Hybrid 2021-22|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Ioniq Electric 2020|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Ioniq Hybrid 2020-22|SCC + LFA|
|
|
|
|
|
-|Hyundai|Ioniq Plug-in Hybrid 2020-21|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Kona 2020|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Kona Electric 2018-19|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Kona Hybrid 2020|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Santa Fe 2021-22|All|
|
|
|
|
|
-|Hyundai|Santa Fe Hybrid 2022|All|
|
|
|
|
|
-|Hyundai|Santa Fe Plug-in Hybrid 2022|All|
|
|
|
|
|
-|Hyundai|Sonata 2018-19|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Tucson Diesel 2019|SCC + LKAS|
|
|
|
|
|
-|Kia|Ceed 2019|SCC + LKAS|
|
|
|
|
|
-|Kia|Forte 2018-21|SCC + LKAS|
|
|
|
|
|
-|Kia|K5 2021-22|SCC + LFA|
|
|
|
|
|
-|Kia|Niro Hybrid 2021-22|SCC + LKAS|
|
|
|
|
|
-|Kia|Optima 2019|SCC + LKAS|
|
|
|
|
|
-|Kia|Seltos 2021|SCC + LKAS|
|
|
|
|
|
-|Kia|Sorento 2018-19|SCC + LKAS|
|
|
|
|
|
-|Kia|Stinger 2018|SCC + LKAS|
|
|
|
|
|
-|Lexus|CT Hybrid 2017-18|LSS|
[3](#footnotes)|
|
|
|
|
-|Lexus|ES Hybrid 2017-18|LSS|
[3](#footnotes)|
|
|
|
|
-|Lexus|NX 2018-19|All|
[3](#footnotes)|
|
|
|
|
-|Lexus|NX Hybrid 2018-19|All|
[3](#footnotes)|
|
|
|
|
-|Lexus|RX 2016-18|All|
[3](#footnotes)|
|
|
|
|
-|Lexus|RX Hybrid 2016-19|All|
[3](#footnotes)|
|
|
|
|
-|Mazda|CX-5 2022|All|
|
|
|
|
|
-|SEAT|Ateca 2018|Driver Assistance|
|
|
|
|
|
-|SEAT|Leon 2014-20|Driver Assistance|
|
|
|
|
|
-|Subaru|Crosstrek 2018-19|EyeSight|
|
|
|
|
|
-|Subaru|Forester 2019-21|EyeSight|
|
|
|
|
|
-|Subaru|Impreza 2017-19|EyeSight|
|
|
|
|
|
-|Å koda|Kamiq 2021[6](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Å koda|Karoq 2019|Driver Assistance|
|
|
|
|
|
-|Å koda|Kodiaq 2018-19|Driver Assistance|
|
|
|
|
|
-|Å koda|Octavia 2015, 2018-19|Driver Assistance|
|
|
|
|
|
-|Å koda|Octavia RS 2016|Driver Assistance|
|
|
|
|
|
-|Å koda|Scala 2020|Driver Assistance|
|
|
|
|
|
-|Å koda|Superb 2015-18|Driver Assistance|
|
|
|
|
|
-|Toyota|Avalon 2019-21|TSS-P|
[3](#footnotes)|
|
|
|
|
-|Toyota|Avalon Hybrid 2019-21|TSS-P|
[3](#footnotes)|
|
|
|
|
-|Toyota|C-HR 2017-21|All|
|
|
|
|
|
-|Toyota|C-HR Hybrid 2017-19|All|
|
|
|
|
|
-|Toyota|Camry 2018-20|All|
|
[4](#footnotes)|
|
|
|
-|Toyota|Camry Hybrid 2018-20|All|
|
[4](#footnotes)|
|
|
|
-|Toyota|Highlander 2017-19|All|
[3](#footnotes)|
|
|
|
|
-|Toyota|Highlander Hybrid 2017-19|All|
[3](#footnotes)|
|
|
|
|
-|Toyota|RAV4 Hybrid 2016-18|TSS-P|
[3](#footnotes)|
|
|
|
|
-|Toyota|Sienna 2018-20|All|
[3](#footnotes)|
|
|
|
|
-|Volkswagen|Arteon 2018, 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Atlas 2018-19, 2022[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|e-Golf 2014, 2018-20|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf 2015-20|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf Alltrack 2017-18|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf GTE 2016|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf GTI 2018-21|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf R 2016-19|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf SportsVan 2016|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Golf SportWagen 2015|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Jetta 2018-21|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Jetta GLI 2021|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Passat 2016-18[7](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Polo 2020|Driver Assistance|
|
|
|
|
|
-|Volkswagen|T-Cross 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|T-Roc 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Taos 2022[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Tiguan 2020-22[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Touran 2017|Driver Assistance|
|
|
|
|
|
+|Audi|A3 2014-19|ACC + Lane Assist|
|
|
|
|
|
+|Audi|A3 Sportback e-tron 2017-18|ACC + Lane Assist|
|
|
|
|
|
+|Audi|Q2 2018|ACC + Lane Assist|
|
|
|
|
|
+|Audi|Q3 2020-21|ACC + Lane Assist|
|
|
|
|
|
+|Audi|RS3 2018|ACC + Lane Assist|
|
|
|
|
|
+|Audi|S3 2015-17|ACC + Lane Assist|
|
|
|
|
|
+|Genesis|G70 2018|All|
|
|
|
|
|
+|Genesis|G80 2018|All|
|
|
|
|
|
+|Hyundai|Elantra 2021-22|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Elantra Hybrid 2021-22|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Ioniq Electric 2020|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Ioniq Hybrid 2020-22|SCC + LFA|
|
|
|
|
|
+|Hyundai|Ioniq Plug-in Hybrid 2020-21|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Kona 2020|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Kona Electric 2018-21|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Kona Hybrid 2020|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Santa Fe 2021-22|All|
|
|
|
|
|
+|Hyundai|Santa Fe Hybrid 2022|All|
|
|
|
|
|
+|Hyundai|Santa Fe Plug-in Hybrid 2022|All|
|
|
|
|
|
+|Hyundai|Sonata 2018-19|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Tucson Diesel 2019|SCC + LKAS|
|
|
|
|
|
+|Kia|Ceed 2019|SCC + LKAS|
|
|
|
|
|
+|Kia|Forte 2018-21|SCC + LKAS|
|
|
|
|
|
+|Kia|K5 2021-22|SCC + LFA|
|
|
|
|
|
+|Kia|Niro Hybrid 2021-22|SCC + LKAS|
|
|
|
|
|
+|Kia|Optima 2019|SCC + LKAS|
|
|
|
|
|
+|Kia|Seltos 2021|SCC + LKAS|
|
|
|
|
|
+|Kia|Sorento 2018-19|SCC + LKAS|
|
|
|
|
|
+|Kia|Stinger 2018|SCC + LKAS|
|
|
|
|
|
+|Lexus|CT Hybrid 2017-18|LSS|
[3](#footnotes)|
|
|
|
|
+|Lexus|ES Hybrid 2017-18|LSS|
[3](#footnotes)|
|
|
|
|
+|Lexus|NX 2018-19|All|
[3](#footnotes)|
|
|
|
|
+|Lexus|NX Hybrid 2018-19|All|
[3](#footnotes)|
|
|
|
|
+|Lexus|RX 2016-18|All|
[3](#footnotes)|
|
|
|
|
+|Lexus|RX Hybrid 2016-19|All|
[3](#footnotes)|
|
|
|
|
+|Mazda|CX-5 2022|All|
|
|
|
|
|
+|SEAT|Ateca 2018|Driver Assistance|
|
|
|
|
|
+|SEAT|Leon 2014-20|Driver Assistance|
|
|
|
|
|
+|Subaru|Crosstrek 2018-19|EyeSight|
|
|
|
|
|
+|Subaru|Forester 2019-21|EyeSight|
|
|
|
|
|
+|Subaru|Impreza 2017-19|EyeSight|
|
|
|
|
|
+|Å koda|Kamiq 2021[6](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Å koda|Karoq 2019|Driver Assistance|
|
|
|
|
|
+|Å koda|Kodiaq 2018-19|Driver Assistance|
|
|
|
|
|
+|Å koda|Octavia 2015, 2018-19|Driver Assistance|
|
|
|
|
|
+|Å koda|Octavia RS 2016|Driver Assistance|
|
|
|
|
|
+|Å koda|Scala 2020|Driver Assistance|
|
|
|
|
|
+|Å koda|Superb 2015-18|Driver Assistance|
|
|
|
|
|
+|Toyota|Avalon 2019-21|TSS-P|
[3](#footnotes)|
|
|
|
|
+|Toyota|Avalon Hybrid 2019-21|TSS-P|
[3](#footnotes)|
|
|
|
|
+|Toyota|C-HR 2017-21|All|
|
|
|
|
|
+|Toyota|C-HR Hybrid 2017-19|All|
|
|
|
|
|
+|Toyota|Camry 2018-20|All|
|
[4](#footnotes)|
|
|
|
+|Toyota|Camry Hybrid 2018-20|All|
|
[4](#footnotes)|
|
|
|
+|Toyota|Highlander 2017-19|All|
[3](#footnotes)|
|
|
|
|
+|Toyota|Highlander Hybrid 2017-19|All|
[3](#footnotes)|
|
|
|
|
+|Toyota|RAV4 Hybrid 2016-18|TSS-P|
[3](#footnotes)|
|
|
|
|
+|Toyota|RAV4 Hybrid 2022|All|
|
|
|
|
|
+|Toyota|Sienna 2018-20|All|
[3](#footnotes)|
|
|
|
|
+|Volkswagen|Arteon 2018, 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Atlas 2018-19, 2022[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|e-Golf 2014, 2018-20|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf 2015-20|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf Alltrack 2017-18|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf GTE 2016|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf GTI 2018-21|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf R 2016-19|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf SportsVan 2016|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Golf SportWagen 2015|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Jetta 2018-21|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Jetta GLI 2021|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Passat 2016-18[7](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Polo 2020|Driver Assistance|
|
|
|
|
|
+|Volkswagen|T-Cross 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|T-Roc 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Taos 2022[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Tiguan 2019-22[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Touran 2017|Driver Assistance|
|
|
|
|
|
## Bronze Cars
|Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained|
|---|---|---|:---:|:---:|:---:|:---:|:---:|
-|Acura|ILX 2016-19|AcuraWatch Plus|
|
|
|
|
|
-|Acura|RDX 2016-18|AcuraWatch Plus|
|
|
|
|
|
-|Acura|RDX 2019-21|All|
|
|
|
|
|
-|Cadillac|Escalade ESV 2016[1](#footnotes)|ACC + LKAS|
|
|
|
|
|
-|Chevrolet|Volt 2017-18[1](#footnotes)|Adaptive Cruise|
|
|
|
|
|
-|Chrysler|Pacifica 2017-18|Adaptive Cruise|
|
|
|
|
|
-|Chrysler|Pacifica 2020|Adaptive Cruise|
|
|
|
|
|
-|Chrysler|Pacifica Hybrid 2017-18|Adaptive Cruise|
|
|
|
|
|
-|Chrysler|Pacifica Hybrid 2019-21|Adaptive Cruise|
|
|
|
|
|
-|Genesis|G90 2018|All|
|
|
|
|
|
-|GMC|Acadia 2018[1](#footnotes)|Adaptive Cruise|
|
|
|
|
|
-|Honda|Accord 2018-21|All|
|
|
|
|
|
-|Honda|Accord Hybrid 2018-21|All|
|
|
|
|
|
-|Honda|Civic 2016-18|Honda Sensing|
|
|
|
|
|
-|Honda|Civic 2019-20|All|
|
|
[2](#footnotes)|
|
|
-|Honda|Civic Hatchback 2017-21|Honda Sensing|
|
|
|
|
|
-|Honda|CR-V 2015-16|Touring|
|
|
|
|
|
-|Honda|CR-V 2017-21|Honda Sensing|
|
|
|
|
|
-|Honda|CR-V Hybrid 2017-19|Honda Sensing|
|
|
|
|
|
-|Honda|e 2020|All|
|
|
|
|
|
-|Honda|Fit 2018-19|Honda Sensing|
|
|
|
|
|
-|Honda|Freed 2020|Honda Sensing|
|
|
|
|
|
-|Honda|HR-V 2019-20|Honda Sensing|
|
|
|
|
|
-|Honda|Insight 2019-21|All|
|
|
|
|
|
-|Honda|Inspire 2018|All|
|
|
|
|
|
-|Honda|Odyssey 2018-20|Honda Sensing|
|
|
|
|
|
-|Honda|Passport 2019-21|All|
|
|
|
|
|
-|Honda|Pilot 2016-21|Honda Sensing|
|
|
|
|
|
-|Honda|Ridgeline 2017-21|Honda Sensing|
|
|
|
|
|
-|Hyundai|Elantra 2017-19|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Genesis 2015-16|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Ioniq Electric 2019|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Ioniq Hybrid 2017-19|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Ioniq Plug-in Hybrid 2019|SCC + LKAS|
|
|
|
|
|
-|Hyundai|Veloster 2019-20|SCC + LKAS|
|
|
|
|
|
-|Jeep|Grand Cherokee 2016-18|Adaptive Cruise|
|
|
|
|
|
-|Jeep|Grand Cherokee 2019-20|Adaptive Cruise|
|
|
|
|
|
-|Kia|Niro Plug-in Hybrid 2019|SCC + LKAS|
|
|
|
|
|
-|Kia|Optima 2017|SCC + LKAS|
|
|
|
|
|
-|Lexus|IS 2017-19|All|
|
|
|
|
|
-|Lexus|RC 2020|All|
|
|
|
|
|
-|Mazda|CX-9 2021|All|
|
|
|
|
|
-|Nissan|Altima 2019-20|ProPILOT|
|
|
|
|
|
-|Nissan|Leaf 2018-22|ProPILOT|
|
|
|
|
|
-|Nissan|Rogue 2018-20|ProPILOT|
|
|
|
|
|
-|Nissan|X-Trail 2017|ProPILOT|
|
|
|
|
|
-|Subaru|Ascent 2019-20|EyeSight|
|
|
|
|
|
-|Subaru|Crosstrek 2020-21|EyeSight|
|
|
|
|
|
-|Subaru|Impreza 2020-21|EyeSight|
|
|
|
|
|
-|Toyota|Avalon 2016-18|TSS-P|
[3](#footnotes)|
|
|
|
|
-|Toyota|Corolla 2017-19|All|
[3](#footnotes)|
|
|
|
|
-|Toyota|Prius 2016-20|TSS-P|
[3](#footnotes)|
|
|
[5](#footnotes)|
|
-|Toyota|Prius Prime 2017-20|All|
[3](#footnotes)|
|
|
[5](#footnotes)|
|
-|Toyota|Prius v 2017|TSS-P|
[3](#footnotes)|
|
|
[5](#footnotes)|
|
-|Toyota|RAV4 2016-18|TSS-P|
[3](#footnotes)|
|
|
|
|
-|Volkswagen|California 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
-|Volkswagen|Caravelle 2020[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Acura|ILX 2016-19|AcuraWatch Plus|
|
|
|
|
|
+|Acura|RDX 2016-18|AcuraWatch Plus|
|
|
|
|
|
+|Acura|RDX 2019-21|All|
|
|
|
|
|
+|Cadillac|Escalade ESV 2016[1](#footnotes)|ACC + LKAS|
|
|
|
|
|
+|Chevrolet|Volt 2017-18[1](#footnotes)|Adaptive Cruise|
|
|
|
|
|
+|Chrysler|Pacifica 2017-18|Adaptive Cruise|
|
|
|
|
|
+|Chrysler|Pacifica 2020|Adaptive Cruise|
|
|
|
|
|
+|Chrysler|Pacifica Hybrid 2017-18|Adaptive Cruise|
|
|
|
|
|
+|Chrysler|Pacifica Hybrid 2019-21|Adaptive Cruise|
|
|
|
|
|
+|Genesis|G90 2018|All|
|
|
|
|
|
+|GMC|Acadia 2018[1](#footnotes)|Adaptive Cruise|
|
|
|
|
|
+|Honda|Accord 2018-21|All|
|
|
|
|
|
+|Honda|Accord Hybrid 2018-21|All|
|
|
|
|
|
+|Honda|Civic 2016-18|Honda Sensing|
|
|
|
|
|
+|Honda|Civic 2019-20|All|
|
|
[2](#footnotes)|
|
|
+|Honda|Civic Hatchback 2017-21|Honda Sensing|
|
|
|
|
|
+|Honda|CR-V 2015-16|Touring|
|
|
|
|
|
+|Honda|CR-V 2017-21|Honda Sensing|
|
|
|
|
|
+|Honda|CR-V Hybrid 2017-19|Honda Sensing|
|
|
|
|
|
+|Honda|e 2020|All|
|
|
|
|
|
+|Honda|Fit 2018-19|Honda Sensing|
|
|
|
|
|
+|Honda|Freed 2020|Honda Sensing|
|
|
|
|
|
+|Honda|HR-V 2019-20|Honda Sensing|
|
|
|
|
|
+|Honda|Insight 2019-21|All|
|
|
|
|
|
+|Honda|Inspire 2018|All|
|
|
|
|
|
+|Honda|Odyssey 2018-20|Honda Sensing|
|
|
|
|
|
+|Honda|Passport 2019-21|All|
|
|
|
|
|
+|Honda|Pilot 2016-21|Honda Sensing|
|
|
|
|
|
+|Honda|Ridgeline 2017-22|Honda Sensing|
|
|
|
|
|
+|Hyundai|Elantra 2017-19|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Genesis 2015-16|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Ioniq Electric 2019|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Ioniq Hybrid 2017-19|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Ioniq Plug-in Hybrid 2019|SCC + LKAS|
|
|
|
|
|
+|Hyundai|Veloster 2019-20|SCC + LKAS|
|
|
|
|
|
+|Jeep|Grand Cherokee 2016-18|Adaptive Cruise|
|
|
|
|
|
+|Jeep|Grand Cherokee 2019-20|Adaptive Cruise|
|
|
|
|
|
+|Kia|Niro Plug-in Hybrid 2019|SCC + LKAS|
|
|
|
|
|
+|Kia|Optima 2017|SCC + LKAS|
|
|
|
|
|
+|Lexus|IS 2017-19|All|
|
|
|
|
|
+|Lexus|RC 2020|All|
|
|
|
|
|
+|Mazda|CX-9 2021|All|
|
|
|
|
|
+|Nissan|Altima 2019-20|ProPILOT|
|
|
|
|
|
+|Nissan|Leaf 2018-22|ProPILOT|
|
|
|
|
|
+|Nissan|Rogue 2018-20|ProPILOT|
|
|
|
|
|
+|Nissan|X-Trail 2017|ProPILOT|
|
|
|
|
|
+|Subaru|Ascent 2019-20|EyeSight|
|
|
|
|
|
+|Subaru|Crosstrek 2020-21|EyeSight|
|
|
|
|
|
+|Subaru|Impreza 2020-21|EyeSight|
|
|
|
|
|
+|Toyota|Avalon 2016-18|TSS-P|
[3](#footnotes)|
|
|
|
|
+|Toyota|Corolla 2017-19|All|
[3](#footnotes)|
|
|
|
|
+|Toyota|Prius 2016-20|TSS-P|
[3](#footnotes)|
|
|
[5](#footnotes)|
|
+|Toyota|Prius Prime 2017-20|All|
[3](#footnotes)|
|
|
[5](#footnotes)|
|
+|Toyota|Prius v 2017|TSS-P|
[3](#footnotes)|
|
|
[5](#footnotes)|
|
+|Toyota|RAV4 2016-18|TSS-P|
[3](#footnotes)|
|
|
|
|
+|Volkswagen|California 2021[8](#footnotes)|Driver Assistance|
|
|
|
|
|
+|Volkswagen|Caravelle 2020[8](#footnotes)|Driver Assistance|
|
|
|
|
|
diff --git a/laika_repo b/laika_repo
index e47ba47de2..be1a213a5f 160000
--- a/laika_repo
+++ b/laika_repo
@@ -1 +1 @@
-Subproject commit e47ba47de2ad62f3c31cfdffa5aa381557a45d08
+Subproject commit be1a213a5ffa3cafe2b4f2d53f6df5d2452ad910
diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh
index 28e3801c28..503ebb5d41 100755
--- a/launch_chffrplus.sh
+++ b/launch_chffrplus.sh
@@ -62,7 +62,6 @@ function launch {
cd $BASEDIR
echo "Restarting launch script ${LAUNCHER_LOCATION}"
- unset REQUIRED_NEOS_VERSION
unset AGNOS_VERSION
exec "${LAUNCHER_LOCATION}"
else
diff --git a/mypy.ini b/mypy.ini
index 66b82bd5df..e2da60f926 100644
--- a/mypy.ini
+++ b/mypy.ini
@@ -1,4 +1,4 @@
[mypy]
python_version = 3.8
ignore_missing_imports = True
-
+plugins = numpy.typing.mypy_plugin
diff --git a/opendbc b/opendbc
index e19ba095c3..919154efe2 160000
--- a/opendbc
+++ b/opendbc
@@ -1 +1 @@
-Subproject commit e19ba095c3ee288d629284e24ec7e0deaf645f3f
+Subproject commit 919154efe2bd07c4dd124d7e6a11a4afc8685f9d
diff --git a/panda b/panda
index 7dd9493eb1..eb662e4e50 160000
--- a/panda
+++ b/panda
@@ -1 +1 @@
-Subproject commit 7dd9493eb102ba8b96362c7265b06851ec1d4bac
+Subproject commit eb662e4e5014a3fc3c04512d708f61080c7707c1
diff --git a/release/files_common b/release/files_common
index 8c1214f73d..c44f10229e 100644
--- a/release/files_common
+++ b/release/files_common
@@ -299,19 +299,21 @@ selfdrive/proclogd/proclog.h
selfdrive/loggerd/SConscript
selfdrive/loggerd/encoder.h
-selfdrive/loggerd/omx_encoder.cc
-selfdrive/loggerd/omx_encoder.h
+selfdrive/loggerd/v4l_encoder.cc
+selfdrive/loggerd/v4l_encoder.h
selfdrive/loggerd/video_writer.cc
selfdrive/loggerd/video_writer.h
+selfdrive/loggerd/remote_encoder.cc
+selfdrive/loggerd/remote_encoder.h
selfdrive/loggerd/logger.cc
selfdrive/loggerd/logger.h
selfdrive/loggerd/loggerd.cc
selfdrive/loggerd/loggerd.h
+selfdrive/loggerd/encoderd.cc
selfdrive/loggerd/main.cc
selfdrive/loggerd/bootlog.cc
selfdrive/loggerd/raw_logger.cc
selfdrive/loggerd/raw_logger.h
-selfdrive/loggerd/include/msm_media_info.h
selfdrive/loggerd/__init__.py
selfdrive/loggerd/config.py
@@ -444,9 +446,6 @@ third_party/SConscript
third_party/linux/**
third_party/opencl/**
-third_party/zlib/*
-third_party/bzip2/*
-third_party/openmax/**
third_party/json11/json11.cpp
third_party/json11/json11.hpp
diff --git a/scripts/cell.sh b/scripts/cell.sh
new file mode 100755
index 0000000000..cae701eccc
--- /dev/null
+++ b/scripts/cell.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/bash
+
+nmcli connection modify --temporary lte ipv4.route-metric 1
+nmcli connection modify --temporary lte ipv6.route-metric 1
+nmcli con up lte
diff --git a/scripts/clwaste b/scripts/clwaste
deleted file mode 100755
index 51770f0e37..0000000000
Binary files a/scripts/clwaste and /dev/null differ
diff --git a/scripts/restart_modem.sh b/scripts/restart_modem.sh
deleted file mode 100755
index fac54b32ff..0000000000
--- a/scripts/restart_modem.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/usr/bin/bash
-echo "restart" > /sys/kernel/debug/msm_subsys/modem
diff --git a/scripts/throttling.sh b/scripts/throttling.sh
deleted file mode 100755
index d100c5f5ab..0000000000
--- a/scripts/throttling.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/data/data/com.termux/files/usr/bin/bash
-watch -n1 '
- cat /sys/kernel/debug/clk/pwrcl_clk/measure
- cat /sys/kernel/debug/clk/perfcl_clk/measure
- cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
- cat /sys/class/kgsl/kgsl-3d0/gpuclk
- echo
- echo -n "CPU0 " ; cat /sys/devices/virtual/thermal/thermal_zone5/temp
- echo -n "CPU1 " ; cat /sys/devices/virtual/thermal/thermal_zone7/temp
- echo -n "CPU2 " ; cat /sys/devices/virtual/thermal/thermal_zone10/temp
- echo -n "CPU3 " ; cat /sys/devices/virtual/thermal/thermal_zone12/temp
- echo -n "MEM " ; cat /sys/devices/virtual/thermal/thermal_zone2/temp
- echo -n "GPU " ; cat /sys/devices/virtual/thermal/thermal_zone16/temp
- echo -n "BAT " ; cat /sys/devices/virtual/thermal/thermal_zone29/temp
-'
-
diff --git a/scripts/waste b/scripts/waste
deleted file mode 100755
index e3154ab01f..0000000000
Binary files a/scripts/waste and /dev/null differ
diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py
index 919cf0c04e..b9c9acb465 100755
--- a/selfdrive/athena/athenad.py
+++ b/selfdrive/athena/athenad.py
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
import base64
+import bz2
import hashlib
import io
import json
@@ -30,7 +31,7 @@ from common.api import Api
from common.basedir import PERSIST
from common.file_helpers import CallbackReader
from common.params import Params
-from common.realtime import sec_since_boot
+from common.realtime import sec_since_boot, set_core_affinity
from selfdrive.hardware import HARDWARE, PC, TICI
from selfdrive.loggerd.config import ROOT
from selfdrive.loggerd.xattr_cache import getxattr, setxattr
@@ -64,6 +65,13 @@ UploadItem = namedtuple('UploadItem', ['path', 'url', 'headers', 'created_at', '
cur_upload_items: Dict[int, Any] = {}
+
+def strip_bz2_extension(fn):
+ if fn.endswith('.bz2'):
+ return fn[:-4]
+ return fn
+
+
class AbortTransferException(Exception):
pass
@@ -227,14 +235,29 @@ def upload_handler(end_event: threading.Event) -> None:
def _do_upload(upload_item, callback=None):
- with open(upload_item.path, "rb") as f:
- size = os.fstat(f.fileno()).st_size
+ path = upload_item.path
+ compress = False
+
+ # If file does not exist, but does exist without the .bz2 extension we will compress on the fly
+ if not os.path.exists(path) and os.path.exists(strip_bz2_extension(path)):
+ path = strip_bz2_extension(path)
+ compress = True
+
+ with open(path, "rb") as f:
+ if compress:
+ cloudlog.event("athena.upload_handler.compress", fn=path, fn_orig=upload_item.path)
+ data = bz2.compress(f.read())
+ size = len(data)
+ data = io.BytesIO(data)
+ else:
+ size = os.fstat(f.fileno()).st_size
+ data = f
if callback:
- f = CallbackReader(f, callback, size)
+ data = CallbackReader(data, callback, size)
return requests.put(upload_item.url,
- data=f,
+ data=data,
headers={**upload_item.headers, 'Content-Length': str(size)},
timeout=30)
@@ -335,8 +358,9 @@ def uploadFilesToUrls(files_data):
if len(fn) == 0 or fn[0] == '/' or '..' in fn or 'url' not in file:
failed.append(fn)
continue
+
path = os.path.join(ROOT, fn)
- if not os.path.exists(path):
+ if not os.path.exists(path) and not os.path.exists(strip_bz2_extension(path)):
failed.append(fn)
continue
@@ -680,6 +704,11 @@ def backoff(retries):
def main():
+ try:
+ set_core_affinity([0, 1, 2, 3])
+ except Exception:
+ cloudlog.exception("failed to set core affinity")
+
params = Params()
dongle_id = params.get("DongleId", encoding='utf-8')
UploadQueueCache.initialize(upload_queue)
diff --git a/selfdrive/athena/tests/test_athenad.py b/selfdrive/athena/tests/test_athenad.py
index 1742ed4347..b6457ca01d 100755
--- a/selfdrive/athena/tests/test_athenad.py
+++ b/selfdrive/athena/tests/test_athenad.py
@@ -81,7 +81,8 @@ class TestAthenadMethods(unittest.TestCase):
def test_listDataDirectory(self):
route = '2021-03-29--13-32-47'
segments = [0, 1, 2, 3, 11]
- filenames = ['qlog.bz2', 'qcamera.ts', 'rlog.bz2', 'fcamera.hevc', 'ecamera.hevc', 'dcamera.hevc']
+
+ filenames = ['qlog', 'qcamera.ts', 'rlog', 'fcamera.hevc', 'ecamera.hevc', 'dcamera.hevc']
files = [f'{route}--{s}/{f}' for s in segments for f in filenames]
for file in files:
fn = os.path.join(athenad.ROOT, file)
diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc
index 5b44f4d60b..4af69ec271 100644
--- a/selfdrive/boardd/boardd.cc
+++ b/selfdrive/boardd/boardd.cc
@@ -135,7 +135,7 @@ bool safety_setter_thread(std::vector pandas) {
util::sleep_for(20);
}
- pandas[0]->set_safety_model(cereal::CarParams::SafetyModel::ELM327, 1);
+ pandas[0]->set_safety_model(cereal::CarParams::SafetyModel::ELM327, 1U);
std::string params;
LOGW("waiting for params to set safety model");
@@ -156,7 +156,7 @@ bool safety_setter_thread(std::vector pandas) {
capnp::FlatArrayMessageReader cmsg(aligned_buf.align(params.data(), params.size()));
cereal::CarParams::Reader car_params = cmsg.getRoot();
cereal::CarParams::SafetyModel safety_model;
- uint32_t safety_param;
+ uint16_t safety_param;
auto safety_configs = car_params.getSafetyConfigs();
uint16_t alternative_experience = car_params.getAlternativeExperience();
diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc
index 394437902f..536cbd5b7e 100644
--- a/selfdrive/boardd/panda.cc
+++ b/selfdrive/boardd/panda.cc
@@ -247,7 +247,7 @@ int Panda::usb_bulk_read(unsigned char endpoint, unsigned char* data, int length
return transferred;
}
-void Panda::set_safety_model(cereal::CarParams::SafetyModel safety_model, uint32_t safety_param) {
+void Panda::set_safety_model(cereal::CarParams::SafetyModel safety_model, uint16_t safety_param) {
usb_write(0xdc, (uint16_t)safety_model, safety_param);
}
diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h
index 9bbeee86b4..23a10d5850 100644
--- a/selfdrive/boardd/panda.h
+++ b/selfdrive/boardd/panda.h
@@ -73,7 +73,7 @@ class Panda {
// Panda functionality
cereal::PandaState::PandaType get_hw_type();
- void set_safety_model(cereal::CarParams::SafetyModel safety_model, uint32_t safety_param=0U);
+ void set_safety_model(cereal::CarParams::SafetyModel safety_model, uint16_t safety_param=0U);
void set_alternative_experience(uint16_t alternative_experience);
void set_rtc(struct tm sys_time);
struct tm get_rtc();
diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py
index c6995a045f..6619afe72f 100755
--- a/selfdrive/boardd/pandad.py
+++ b/selfdrive/boardd/pandad.py
@@ -10,6 +10,7 @@ from functools import cmp_to_key
from panda import DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, Panda, PandaDFU
from common.basedir import BASEDIR
from common.params import Params
+from selfdrive.hardware import HARDWARE
from selfdrive.swaglog import cloudlog
@@ -27,6 +28,7 @@ def flash_panda(panda_serial: str) -> Panda:
panda = Panda(panda_serial)
fw_signature = get_expected_signature(panda)
+ internal_panda = panda.is_internal() and not panda.bootstub
panda_version = "bootstub" if panda.bootstub else panda.get_version()
panda_signature = b"" if panda.bootstub else panda.get_signature()
@@ -40,7 +42,9 @@ def flash_panda(panda_serial: str) -> Panda:
if panda.bootstub:
bootstub_version = panda.get_version()
cloudlog.info(f"Flashed firmware not booting, flashing development bootloader. Bootstub version: {bootstub_version}")
- panda.recover()
+ if internal_panda:
+ HARDWARE.recover_internal_panda()
+ panda.recover(reset=(not internal_panda))
cloudlog.info("Done flashing bootloader")
if panda.bootstub:
@@ -89,6 +93,10 @@ def main() -> NoReturn:
panda_serials = Panda.list()
if len(panda_serials) == 0:
+ if first_run:
+ cloudlog.info("Resetting internal panda")
+ HARDWARE.reset_internal_panda()
+ time.sleep(2) # wait to come back up
continue
cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}")
diff --git a/selfdrive/camerad/cameras/camera_common.cc b/selfdrive/camerad/cameras/camera_common.cc
index be9d0724ff..6a690d929d 100644
--- a/selfdrive/camerad/cameras/camera_common.cc
+++ b/selfdrive/camerad/cameras/camera_common.cc
@@ -13,7 +13,6 @@
#include "selfdrive/camerad/imgproc/utils.h"
#include "selfdrive/common/clutil.h"
#include "selfdrive/common/modeldata.h"
-#include "selfdrive/common/params.h"
#include "selfdrive/common/swaglog.h"
#include "selfdrive/common/util.h"
#include "selfdrive/hardware/hw.h"
@@ -37,10 +36,10 @@ public:
hdr_ = ci->hdr;
snprintf(args, sizeof(args),
"-cl-fast-relaxed-math -cl-denorms-are-zero "
- "-DFRAME_WIDTH=%d -DFRAME_HEIGHT=%d -DFRAME_STRIDE=%d "
+ "-DFRAME_WIDTH=%d -DFRAME_HEIGHT=%d -DFRAME_STRIDE=%d -DFRAME_OFFSET=%d "
"-DRGB_WIDTH=%d -DRGB_HEIGHT=%d -DRGB_STRIDE=%d "
"-DBAYER_FLIP=%d -DHDR=%d -DCAM_NUM=%d",
- ci->frame_width, ci->frame_height, ci->frame_stride,
+ ci->frame_width, ci->frame_height, ci->frame_stride, ci->frame_offset,
b->rgb_width, b->rgb_height, b->rgb_stride,
ci->bayer_flip, ci->hdr, s->camera_num);
const char *cl_file = "cameras/real_debayer.cl";
@@ -82,7 +81,7 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s,
frame_buf_count = frame_cnt;
// RAW frame
- const int frame_size = ci->frame_height * ci->frame_stride;
+ const int frame_size = (ci->frame_height + ci->extra_height) * ci->frame_stride;
camera_bufs = std::make_unique(frame_buf_count);
camera_bufs_metadata = std::make_unique(frame_buf_count);
@@ -147,6 +146,8 @@ bool CameraBuf::acquire() {
double start_time = millis_since_boot();
+ cur_camera_buf = &camera_bufs[cur_buf_idx];
+
if (debayer) {
float gain = 0.0;
float black_level = 42.0;
@@ -237,6 +238,17 @@ kj::Array get_frame_image(const CameraBuf *b) {
return kj::mv(frame_image);
}
+kj::Array get_raw_frame_image(const CameraBuf *b) {
+ const uint8_t *dat = (const uint8_t *)b->cur_camera_buf->addr;
+
+ kj::Array frame_image = kj::heapArray(b->cur_camera_buf->len);
+ uint8_t *resized_dat = frame_image.begin();
+
+ memcpy(resized_dat, dat, b->cur_camera_buf->len);
+
+ return kj::mv(frame_image);
+}
+
static kj::Array yuv420_to_jpeg(const CameraBuf *b, int thumbnail_width, int thumbnail_height) {
// make the buffer big enough. jpeg_write_raw_data requires 16-pixels aligned height to be used.
std::unique_ptr buf(new uint8_t[(thumbnail_width * ((thumbnail_height + 15) & ~15) * 3) / 2]);
@@ -377,47 +389,6 @@ std::thread start_process_thread(MultiCameraState *cameras, CameraState *cs, pro
return std::thread(processing_thread, cameras, cs, callback);
}
-static void driver_cam_auto_exposure(CameraState *c, SubMaster &sm) {
- static const bool is_rhd = Params().getBool("IsRHD");
- struct ExpRect {int x1, x2, x_skip, y1, y2, y_skip;};
- const CameraBuf *b = &c->buf;
-
- int x_offset = 0, y_offset = 0;
- int frame_width = b->rgb_width, frame_height = b->rgb_height;
-
-
- ExpRect def_rect;
- if (Hardware::TICI()) {
- x_offset = 630, y_offset = 156;
- frame_width = 668, frame_height = frame_width / 1.33;
- def_rect = {96, 1832, 2, 242, 1148, 4};
- } else {
- def_rect = {is_rhd ? 0 : b->rgb_width * 3 / 5, is_rhd ? b->rgb_width * 2 / 5 : b->rgb_width, 2,
- b->rgb_height / 3, b->rgb_height, 1};
- }
-
- static ExpRect rect = def_rect;
-
- camera_autoexposure(c, set_exposure_target(b, rect.x1, rect.x2, rect.x_skip, rect.y1, rect.y2, rect.y_skip));
-}
-
-void common_process_driver_camera(MultiCameraState *s, CameraState *c, int cnt) {
- int j = Hardware::TICI() ? 1 : 3;
- if (cnt % j == 0) {
- s->sm->update(0);
- driver_cam_auto_exposure(c, *(s->sm));
- }
- MessageBuilder msg;
- auto framed = msg.initEvent().initDriverCameraState();
- framed.setFrameType(cereal::FrameData::FrameType::FRONT);
- fill_frame_data(framed, c->buf.cur_frame_data);
- if (env_send_driver) {
- framed.setImage(get_frame_image(&c->buf));
- }
- s->pm->send("driverCameraState", msg);
-}
-
-
void camerad_thread() {
cl_device_id device_id = cl_get_device_id(CL_DEVICE_TYPE_DEFAULT);
#ifdef QCOM2
diff --git a/selfdrive/camerad/cameras/camera_common.h b/selfdrive/camerad/cameras/camera_common.h
index e415f80982..8c836e0bb8 100644
--- a/selfdrive/camerad/cameras/camera_common.h
+++ b/selfdrive/camerad/cameras/camera_common.h
@@ -47,15 +47,20 @@ const bool env_disable_road = getenv("DISABLE_ROAD") != NULL;
const bool env_disable_wide_road = getenv("DISABLE_WIDE_ROAD") != NULL;
const bool env_disable_driver = getenv("DISABLE_DRIVER") != NULL;
const bool env_debug_frames = getenv("DEBUG_FRAMES") != NULL;
+const bool env_log_raw_frames = getenv("LOG_RAW_FRAMES") != NULL;
typedef void (*release_cb)(void *cookie, int buf_idx);
typedef struct CameraInfo {
- int frame_width, frame_height;
- int frame_stride;
+ uint32_t frame_width, frame_height;
+ uint32_t frame_stride;
bool bayer;
int bayer_flip;
bool hdr;
+ uint32_t frame_offset = 0;
+ uint32_t extra_height = 0;
+ int registers_offset = -1;
+ int stats_offset = -1;
} CameraInfo;
typedef struct FrameMetadata {
@@ -111,6 +116,7 @@ public:
FrameMetadata cur_frame_data;
VisionBuf *cur_rgb_buf;
VisionBuf *cur_yuv_buf;
+ VisionBuf *cur_camera_buf;
std::unique_ptr camera_bufs;
std::unique_ptr camera_bufs_metadata;
int rgb_width, rgb_height, rgb_stride;
@@ -129,9 +135,9 @@ typedef void (*process_thread_cb)(MultiCameraState *s, CameraState *c, int cnt);
void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &frame_data);
kj::Array get_frame_image(const CameraBuf *b);
+kj::Array get_raw_frame_image(const CameraBuf *b);
float set_exposure_target(const CameraBuf *b, int x_start, int x_end, int x_skip, int y_start, int y_end, int y_skip);
std::thread start_process_thread(MultiCameraState *cameras, CameraState *cs, process_thread_cb callback);
-void common_process_driver_camera(MultiCameraState *s, CameraState *c, int cnt);
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx);
void cameras_open(MultiCameraState *s);
diff --git a/selfdrive/camerad/cameras/camera_qcom2.cc b/selfdrive/camerad/cameras/camera_qcom2.cc
index 8986351fc1..ce9b5663d8 100644
--- a/selfdrive/camerad/cameras/camera_qcom2.cc
+++ b/selfdrive/camerad/cameras/camera_qcom2.cc
@@ -31,6 +31,9 @@ const size_t FRAME_WIDTH = 1928;
const size_t FRAME_HEIGHT = 1208;
const size_t FRAME_STRIDE = 2896; // for 12 bit output. 1928 * 12 / 8 + 4 (alignment)
+const size_t AR0231_REGISTERS_HEIGHT = 2;
+const size_t AR0231_STATS_HEIGHT = 2;
+
const int MIPI_SETTLE_CNT = 33; // Calculated by camera_freqs.py
CameraInfo cameras_supported[CAMERA_ID_MAX] = {
@@ -38,17 +41,24 @@ CameraInfo cameras_supported[CAMERA_ID_MAX] = {
.frame_width = FRAME_WIDTH,
.frame_height = FRAME_HEIGHT,
.frame_stride = FRAME_STRIDE,
+ .extra_height = AR0231_REGISTERS_HEIGHT + AR0231_STATS_HEIGHT,
+
+ .registers_offset = 0,
+ .frame_offset = AR0231_REGISTERS_HEIGHT,
+ .stats_offset = AR0231_REGISTERS_HEIGHT + FRAME_HEIGHT,
+
.bayer = true,
.bayer_flip = 1,
- .hdr = false
+ .hdr = false,
},
[CAMERA_ID_IMX390] = {
.frame_width = FRAME_WIDTH,
.frame_height = FRAME_HEIGHT,
.frame_stride = FRAME_STRIDE,
+
.bayer = true,
.bayer_flip = 1,
- .hdr = false
+ .hdr = false,
},
};
@@ -87,11 +97,11 @@ int do_cam_control(int fd, int op_code, void *handle, int size) {
return ret;
}
-std::optional device_acquire(int fd, int32_t session_handle, void *data) {
+std::optional device_acquire(int fd, int32_t session_handle, void *data, uint32_t num_resources=1) {
struct cam_acquire_dev_cmd cmd = {
.session_handle = session_handle,
.handle_type = CAM_HANDLE_USER_POINTER,
- .num_resources = (uint32_t)(data ? 1 : 0),
+ .num_resources = (uint32_t)(data ? num_resources : 0),
.resource_hdl = (uint64_t)data,
};
int err = do_cam_control(fd, CAM_ACQUIRE_DEV, &cmd, sizeof(cmd));
@@ -158,6 +168,42 @@ void release_fd(int video0_fd, uint32_t handle) {
release(video0_fd, handle);
}
+void *MemoryManager::alloc(int size, uint32_t *handle) {
+ lock.lock();
+ void *ptr;
+ if (!cached_allocations[size].empty()) {
+ ptr = cached_allocations[size].front();
+ cached_allocations[size].pop();
+ *handle = handle_lookup[ptr];
+ } else {
+ ptr = alloc_w_mmu_hdl(video0_fd, size, handle);
+ handle_lookup[ptr] = *handle;
+ size_lookup[ptr] = size;
+ }
+ lock.unlock();
+ return ptr;
+}
+
+void MemoryManager::free(void *ptr) {
+ lock.lock();
+ cached_allocations[size_lookup[ptr]].push(ptr);
+ lock.unlock();
+}
+
+MemoryManager::~MemoryManager() {
+ for (auto& x : cached_allocations) {
+ while (!x.second.empty()) {
+ void *ptr = x.second.front();
+ x.second.pop();
+ LOGD("freeing cached allocation %p with size %d", ptr, size_lookup[ptr]);
+ munmap(ptr, size_lookup[ptr]);
+ release_fd(video0_fd, handle_lookup[ptr]);
+ handle_lookup.erase(ptr);
+ size_lookup.erase(ptr);
+ }
+ }
+}
+
int CameraState::clear_req_queue() {
struct cam_req_mgr_flush_info req_mgr_flush_request = {0};
req_mgr_flush_request.session_hdl = session_handle;
@@ -186,7 +232,7 @@ void CameraState::sensors_start() {
void CameraState::sensors_poke(int request_id) {
uint32_t cam_packet_handle = 0;
int size = sizeof(struct cam_packet);
- struct cam_packet *pkt = (struct cam_packet *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, size, &cam_packet_handle);
+ struct cam_packet *pkt = (struct cam_packet *)mm.alloc(size, &cam_packet_handle);
pkt->num_cmd_buf = 0;
pkt->kmd_cmd_buf_index = -1;
pkt->header.size = size;
@@ -200,15 +246,14 @@ void CameraState::sensors_poke(int request_id) {
return;
}
- munmap(pkt, size);
- release_fd(multi_cam_state->video0_fd, cam_packet_handle);
+ mm.free(pkt);
}
void CameraState::sensors_i2c(struct i2c_random_wr_payload* dat, int len, int op_code, bool data_word) {
// LOGD("sensors_i2c: %d", len);
uint32_t cam_packet_handle = 0;
int size = sizeof(struct cam_packet)+sizeof(struct cam_cmd_buf_desc)*1;
- struct cam_packet *pkt = (struct cam_packet *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, size, &cam_packet_handle);
+ struct cam_packet *pkt = (struct cam_packet *)mm.alloc(size, &cam_packet_handle);
pkt->num_cmd_buf = 1;
pkt->kmd_cmd_buf_index = -1;
pkt->header.size = size;
@@ -218,7 +263,7 @@ void CameraState::sensors_i2c(struct i2c_random_wr_payload* dat, int len, int op
buf_desc[0].size = buf_desc[0].length = sizeof(struct i2c_rdwr_header) + len*sizeof(struct i2c_random_wr_payload);
buf_desc[0].type = CAM_CMD_BUF_I2C;
- struct cam_cmd_i2c_random_wr *i2c_random_wr = (struct cam_cmd_i2c_random_wr *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, buf_desc[0].size, (uint32_t*)&buf_desc[0].mem_handle);
+ struct cam_cmd_i2c_random_wr *i2c_random_wr = (struct cam_cmd_i2c_random_wr *)mm.alloc(buf_desc[0].size, (uint32_t*)&buf_desc[0].mem_handle);
i2c_random_wr->header.count = len;
i2c_random_wr->header.op_code = 1;
i2c_random_wr->header.cmd_type = CAMERA_SENSOR_CMD_TYPE_I2C_RNDM_WR;
@@ -233,10 +278,8 @@ void CameraState::sensors_i2c(struct i2c_random_wr_payload* dat, int len, int op
return;
}
- munmap(i2c_random_wr, buf_desc[0].size);
- release_fd(multi_cam_state->video0_fd, buf_desc[0].mem_handle);
- munmap(pkt, size);
- release_fd(multi_cam_state->video0_fd, cam_packet_handle);
+ mm.free(i2c_random_wr);
+ mm.free(pkt);
}
static cam_cmd_power *power_set_wait(cam_cmd_power *power, int16_t delay_ms) {
@@ -248,10 +291,9 @@ static cam_cmd_power *power_set_wait(cam_cmd_power *power, int16_t delay_ms) {
};
int CameraState::sensors_init() {
- int video0_fd = multi_cam_state->video0_fd;
uint32_t cam_packet_handle = 0;
int size = sizeof(struct cam_packet)+sizeof(struct cam_cmd_buf_desc)*2;
- struct cam_packet *pkt = (struct cam_packet *)alloc_w_mmu_hdl(video0_fd, size, &cam_packet_handle);
+ struct cam_packet *pkt = (struct cam_packet *)mm.alloc(size, &cam_packet_handle);
pkt->num_cmd_buf = 2;
pkt->kmd_cmd_buf_index = -1;
pkt->header.op_code = 0x1000000 | CAM_SENSOR_PACKET_OPCODE_SENSOR_PROBE;
@@ -260,7 +302,7 @@ int CameraState::sensors_init() {
buf_desc[0].size = buf_desc[0].length = sizeof(struct cam_cmd_i2c_info) + sizeof(struct cam_cmd_probe);
buf_desc[0].type = CAM_CMD_BUF_LEGACY;
- struct cam_cmd_i2c_info *i2c_info = (struct cam_cmd_i2c_info *)alloc_w_mmu_hdl(video0_fd, buf_desc[0].size, (uint32_t*)&buf_desc[0].mem_handle);
+ struct cam_cmd_i2c_info *i2c_info = (struct cam_cmd_i2c_info *)mm.alloc(buf_desc[0].size, (uint32_t*)&buf_desc[0].mem_handle);
auto probe = (struct cam_cmd_probe *)(i2c_info + 1);
probe->camera_id = camera_num;
@@ -302,7 +344,7 @@ int CameraState::sensors_init() {
//buf_desc[1].size = buf_desc[1].length = 148;
buf_desc[1].size = buf_desc[1].length = 196;
buf_desc[1].type = CAM_CMD_BUF_I2C;
- struct cam_cmd_power *power_settings = (struct cam_cmd_power *)alloc_w_mmu_hdl(video0_fd, buf_desc[1].size, (uint32_t*)&buf_desc[1].mem_handle);
+ struct cam_cmd_power *power_settings = (struct cam_cmd_power *)mm.alloc(buf_desc[1].size, (uint32_t*)&buf_desc[1].mem_handle);
memset(power_settings, 0, buf_desc[1].size);
// power on
@@ -363,12 +405,9 @@ int CameraState::sensors_init() {
LOGD("probing the sensor");
int ret = do_cam_control(sensor_fd, CAM_SENSOR_PROBE_CMD, (void *)(uintptr_t)cam_packet_handle, 0);
- munmap(i2c_info, buf_desc[0].size);
- release_fd(video0_fd, buf_desc[0].mem_handle);
- munmap(power_settings, buf_desc[1].size);
- release_fd(video0_fd, buf_desc[1].mem_handle);
- munmap(pkt, size);
- release_fd(video0_fd, cam_packet_handle);
+ mm.free(i2c_info);
+ mm.free(power_settings);
+ mm.free(pkt);
return ret;
}
@@ -379,7 +418,7 @@ void CameraState::config_isp(int io_mem_handle, int fence, int request_id, int b
if (io_mem_handle != 0) {
size += sizeof(struct cam_buf_io_cfg);
}
- struct cam_packet *pkt = (struct cam_packet *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, size, &cam_packet_handle);
+ struct cam_packet *pkt = (struct cam_packet *)mm.alloc(size, &cam_packet_handle);
pkt->num_cmd_buf = 2;
pkt->kmd_cmd_buf_index = 0;
// YUV has kmd_cmd_buf_offset = 1780
@@ -387,7 +426,7 @@ void CameraState::config_isp(int io_mem_handle, int fence, int request_id, int b
// YUV also has patch_offset = 0x1030 and num_patches = 10
if (io_mem_handle != 0) {
- pkt->io_configs_offset = sizeof(struct cam_cmd_buf_desc)*2;
+ pkt->io_configs_offset = sizeof(struct cam_cmd_buf_desc)*pkt->num_cmd_buf;
pkt->num_io_configs = 1;
}
@@ -474,16 +513,16 @@ void CameraState::config_isp(int io_mem_handle, int fence, int request_id, int b
buf_desc[1].length = buf_desc[1].size - buf_desc[1].offset;
buf_desc[1].type = CAM_CMD_BUF_GENERIC;
buf_desc[1].meta_data = CAM_ISP_PACKET_META_GENERIC_BLOB_COMMON;
- uint32_t *buf2 = (uint32_t *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, buf_desc[1].size, (uint32_t*)&buf_desc[1].mem_handle, 0x20);
+ uint32_t *buf2 = (uint32_t *)mm.alloc(buf_desc[1].size, (uint32_t*)&buf_desc[1].mem_handle);
memcpy(buf2, &tmp, sizeof(tmp));
if (io_mem_handle != 0) {
io_cfg[0].mem_handle[0] = io_mem_handle;
io_cfg[0].planes[0] = (struct cam_plane_cfg){
- .width = FRAME_WIDTH,
- .height = FRAME_HEIGHT,
- .plane_stride = FRAME_STRIDE,
- .slice_height = FRAME_HEIGHT,
+ .width = ci.frame_width,
+ .height = ci.frame_height + ci.extra_height,
+ .plane_stride = ci.frame_stride,
+ .slice_height = ci.frame_height + ci.extra_height,
.meta_stride = 0x0, // YUV has meta(stride=0x400, size=0x5000)
.meta_size = 0x0,
.meta_offset = 0x0,
@@ -510,24 +549,20 @@ void CameraState::config_isp(int io_mem_handle, int fence, int request_id, int b
printf("ISP CONFIG FAILED\n");
}
- munmap(buf2, buf_desc[1].size);
- release_fd(multi_cam_state->video0_fd, buf_desc[1].mem_handle);
- // release_fd(multi_cam_state->video0_fd, buf_desc[0].mem_handle);
- munmap(pkt, size);
- release_fd(multi_cam_state->video0_fd, cam_packet_handle);
+ mm.free(buf2);
+ mm.free(pkt);
}
void CameraState::enqueue_buffer(int i, bool dp) {
int ret;
int request_id = request_ids[i];
- if (buf_handle[i]) {
- release(multi_cam_state->video0_fd, buf_handle[i]);
+ if (buf_handle[i] && sync_objs[i]) {
// wait
struct cam_sync_wait sync_wait = {0};
sync_wait.sync_obj = sync_objs[i];
sync_wait.timeout_ms = 50; // max dt tolerance, typical should be 23
- ret = do_cam_control(multi_cam_state->video1_fd, CAM_SYNC_WAIT, &sync_wait, sizeof(sync_wait));
+ ret = do_cam_control(multi_cam_state->cam_sync_fd, CAM_SYNC_WAIT, &sync_wait, sizeof(sync_wait));
// LOGD("fence wait: %d %d", ret, sync_wait.sync_obj);
buf.camera_bufs_metadata[i].timestamp_eof = (uint64_t)nanos_since_boot(); // set true eof
@@ -535,13 +570,19 @@ void CameraState::enqueue_buffer(int i, bool dp) {
// destroy old output fence
struct cam_sync_info sync_destroy = {0};
- strcpy(sync_destroy.name, "NodeOutputPortFence");
sync_destroy.sync_obj = sync_objs[i];
- ret = do_cam_control(multi_cam_state->video1_fd, CAM_SYNC_DESTROY, &sync_destroy, sizeof(sync_destroy));
+ ret = do_cam_control(multi_cam_state->cam_sync_fd, CAM_SYNC_DESTROY, &sync_destroy, sizeof(sync_destroy));
// LOGD("fence destroy: %d %d", ret, sync_destroy.sync_obj);
}
- // do stuff
+ // create output fence
+ struct cam_sync_info sync_create = {0};
+ strcpy(sync_create.name, "NodeOutputPortFence");
+ ret = do_cam_control(multi_cam_state->cam_sync_fd, CAM_SYNC_CREATE, &sync_create, sizeof(sync_create));
+ // LOGD("fence req: %d %d", ret, sync_create.sync_obj);
+ sync_objs[i] = sync_create.sync_obj;
+
+ // schedule request with camera request manager
struct cam_req_mgr_sched_request req_mgr_sched_request = {0};
req_mgr_sched_request.session_hdl = session_handle;
req_mgr_sched_request.link_hdl = link_handle;
@@ -549,28 +590,11 @@ void CameraState::enqueue_buffer(int i, bool dp) {
ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_SCHED_REQ, &req_mgr_sched_request, sizeof(req_mgr_sched_request));
// LOGD("sched req: %d %d", ret, request_id);
- // create output fence
- struct cam_sync_info sync_create = {0};
- strcpy(sync_create.name, "NodeOutputPortFence");
- ret = do_cam_control(multi_cam_state->video1_fd, CAM_SYNC_CREATE, &sync_create, sizeof(sync_create));
- // LOGD("fence req: %d %d", ret, sync_create.sync_obj);
- sync_objs[i] = sync_create.sync_obj;
-
- // configure ISP to put the image in place
- struct cam_mem_mgr_map_cmd mem_mgr_map_cmd = {0};
- mem_mgr_map_cmd.mmu_hdls[0] = multi_cam_state->device_iommu;
- mem_mgr_map_cmd.num_hdl = 1;
- mem_mgr_map_cmd.flags = CAM_MEM_FLAG_HW_READ_WRITE;
- mem_mgr_map_cmd.fd = buf.camera_bufs[i].fd;
- ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_MAP_BUF, &mem_mgr_map_cmd, sizeof(mem_mgr_map_cmd));
- // LOGD("map buf req: (fd: %d) 0x%x %d", bufs[i].fd, mem_mgr_map_cmd.out.buf_handle, ret);
- buf_handle[i] = mem_mgr_map_cmd.out.buf_handle;
-
- // poke sensor
+ // poke sensor, must happen after schedule
sensors_poke(request_id);
// LOGD("Poked sensor");
- // push the buffer
+ // submit request to the ife
config_isp(buf_handle[i], sync_objs[i], request_id, buf0_handle, 65632*(i+1));
}
@@ -616,6 +640,9 @@ void CameraState::camera_open() {
assert(sensor_fd >= 0);
LOGD("opened sensor for %d", camera_num);
+ // init memorymanager for this camera
+ mm.init(multi_cam_state->video0_fd);
+
// probe the sensor
LOGD("-- Probing sensor %d", camera_num);
ret = sensors_init();
@@ -665,23 +692,23 @@ void CameraState::camera_open() {
.lane_cfg = 0x3210,
.vc = 0x0,
- .dt = 0x2C, // CSI_RAW12
+ .dt = 0x12, // Changing stats to 0x2C doesn't work, so change pixels to 0x12 instead
.format = CAM_FORMAT_MIPI_RAW_12,
.test_pattern = 0x2, // 0x3?
.usage_type = 0x0,
.left_start = 0,
- .left_stop = FRAME_WIDTH - 1,
- .left_width = FRAME_WIDTH,
+ .left_stop = ci.frame_width - 1,
+ .left_width = ci.frame_width,
.right_start = 0,
- .right_stop = FRAME_WIDTH - 1,
- .right_width = FRAME_WIDTH,
+ .right_stop = ci.frame_width - 1,
+ .right_width = ci.frame_width,
.line_start = 0,
- .line_stop = FRAME_HEIGHT - 1,
- .height = FRAME_HEIGHT,
+ .line_stop = ci.frame_height + ci.extra_height - 1,
+ .height = ci.frame_height + ci.extra_height,
.pixel_clk = 0x0,
.batch_size = 0x0,
@@ -693,8 +720,8 @@ void CameraState::camera_open() {
.data[0] = (struct cam_isp_out_port_info){
.res_type = CAM_ISP_IFE_OUT_RES_RDI_0,
.format = CAM_FORMAT_MIPI_RAW_12,
- .width = FRAME_WIDTH,
- .height = FRAME_HEIGHT,
+ .width = ci.frame_width,
+ .height = ci.frame_height + ci.extra_height,
.comp_grp_id = 0x0, .split_point = 0x0, .secure_mode = 0x0,
},
};
@@ -729,7 +756,7 @@ void CameraState::camera_open() {
{
uint32_t cam_packet_handle = 0;
int size = sizeof(struct cam_packet)+sizeof(struct cam_cmd_buf_desc)*1;
- struct cam_packet *pkt = (struct cam_packet *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, size, &cam_packet_handle);
+ struct cam_packet *pkt = (struct cam_packet *)mm.alloc(size, &cam_packet_handle);
pkt->num_cmd_buf = 1;
pkt->kmd_cmd_buf_index = -1;
pkt->header.size = size;
@@ -738,7 +765,7 @@ void CameraState::camera_open() {
buf_desc[0].size = buf_desc[0].length = sizeof(struct cam_csiphy_info);
buf_desc[0].type = CAM_CMD_BUF_GENERIC;
- struct cam_csiphy_info *csiphy_info = (struct cam_csiphy_info *)alloc_w_mmu_hdl(multi_cam_state->video0_fd, buf_desc[0].size, (uint32_t*)&buf_desc[0].mem_handle);
+ struct cam_csiphy_info *csiphy_info = (struct cam_csiphy_info *)mm.alloc(buf_desc[0].size, (uint32_t*)&buf_desc[0].mem_handle);
csiphy_info->lane_mask = 0x1f;
csiphy_info->lane_assign = 0x3210;// skip clk. How is this 16 bit for 5 channels??
csiphy_info->csiphy_3phase = 0x0; // no 3 phase, only 2 conductors per lane
@@ -751,10 +778,8 @@ void CameraState::camera_open() {
int ret_ = device_config(csiphy_fd, session_handle, csiphy_dev_handle, cam_packet_handle);
assert(ret_ == 0);
- munmap(csiphy_info, buf_desc[0].size);
- release_fd(multi_cam_state->video0_fd, buf_desc[0].mem_handle);
- munmap(pkt, size);
- release_fd(multi_cam_state->video0_fd, cam_packet_handle);
+ mm.free(csiphy_info);
+ mm.free(pkt);
}
// link devices
@@ -781,6 +806,18 @@ void CameraState::camera_open() {
ret = device_control(multi_cam_state->isp_fd, CAM_START_DEV, session_handle, isp_dev_handle);
LOGD("start isp: %d", ret);
+ for (int i = 0; i < FRAME_BUF_COUNT; i++) {
+ // configure ISP to put the image in place
+ struct cam_mem_mgr_map_cmd mem_mgr_map_cmd = {0};
+ mem_mgr_map_cmd.mmu_hdls[0] = multi_cam_state->device_iommu;
+ mem_mgr_map_cmd.num_hdl = 1;
+ mem_mgr_map_cmd.flags = CAM_MEM_FLAG_HW_READ_WRITE;
+ mem_mgr_map_cmd.fd = buf.camera_bufs[i].fd;
+ ret = do_cam_control(multi_cam_state->video0_fd, CAM_REQ_MGR_MAP_BUF, &mem_mgr_map_cmd, sizeof(mem_mgr_map_cmd));
+ LOGD("map buf req: (fd: %d) 0x%x %d", buf.camera_bufs[i].fd, mem_mgr_map_cmd.out.buf_handle, ret);
+ buf_handle[i] = mem_mgr_map_cmd.out.buf_handle;
+ }
+
// TODO: this is unneeded, should we be doing the start i2c in a different way?
//ret = device_control(sensor_fd, CAM_START_DEV, session_handle, sensor_dev_handle);
//LOGD("start sensor: %d", ret);
@@ -807,9 +844,9 @@ void cameras_open(MultiCameraState *s) {
LOGD("opened video0");
// video1 is cam_sync, the target of some ioctls
- s->video1_fd = HANDLE_EINTR(open("/dev/v4l/by-path/platform-cam_sync-video-index0", O_RDWR | O_NONBLOCK));
- assert(s->video1_fd >= 0);
- LOGD("opened video1");
+ s->cam_sync_fd = HANDLE_EINTR(open("/dev/v4l/by-path/platform-cam_sync-video-index0", O_RDWR | O_NONBLOCK));
+ assert(s->cam_sync_fd >= 0);
+ LOGD("opened video1 (cam_sync)");
// looks like there's only one of these
s->isp_fd = open_v4l_by_name_and_index("cam-isp");
@@ -834,7 +871,7 @@ void cameras_open(MultiCameraState *s) {
LOG("-- Subscribing");
static struct v4l2_event_subscription sub = {0};
sub.type = V4L_EVENT_CAM_REQ_MGR_EVENT;
- sub.id = 2; // should use boot time for sof
+ sub.id = V4L_EVENT_CAM_REQ_MGR_SOF_BOOT_TS;
ret = HANDLE_EINTR(ioctl(s->video0_fd, VIDIOC_SUBSCRIBE_EVENT, &sub));
printf("req mgr subscribe: %d\n", ret);
@@ -883,6 +920,11 @@ void CameraState::camera_close() {
LOGD("release isp: %d", ret);
ret = device_control(csiphy_fd, CAM_RELEASE_DEV, session_handle, csiphy_dev_handle);
LOGD("release csiphy: %d", ret);
+
+ for (int i = 0; i < FRAME_BUF_COUNT; i++) {
+ release(multi_cam_state->video0_fd, buf_handle[i]);
+ }
+ LOGD("released buffers");
}
ret = device_control(sensor_fd, CAM_RELEASE_DEV, session_handle, sensor_dev_handle);
@@ -903,6 +945,70 @@ void cameras_close(MultiCameraState *s) {
delete s->pm;
}
+std::map> CameraState::ar0231_build_register_lut(uint8_t *data) {
+ // This function builds a lookup table from register address, to a pair of indices in the
+ // buffer where to read this address. The buffer contains padding bytes,
+ // as well as markers to indicate the type of the next byte.
+ //
+ // 0xAA is used to indicate the MSB of the address, 0xA5 for the LSB of the address.
+ // Every byte of data (MSB and LSB) is preceded by 0x5A. Specifying an address is optional
+ // for contigous ranges. See page 27-29 of the AR0231 Developer guide for more information.
+
+ int max_i[] = {1828 / 2 * 3, 1500 / 2 * 3};
+ auto get_next_idx = [](int cur_idx) {
+ return (cur_idx % 3 == 1) ? cur_idx + 2 : cur_idx + 1; // Every third byte is padding
+ };
+
+ std::map> registers;
+ for (int register_row = 0; register_row < 2; register_row++) {
+ uint8_t *registers_raw = data + ci.frame_stride * register_row;
+ assert(registers_raw[0] == 0x0a); // Start of line
+
+ int value_tag_count = 0;
+ int first_val_idx = 0;
+ uint16_t cur_addr = 0;
+
+ for (int i = 1; i <= max_i[register_row]; i = get_next_idx(get_next_idx(i))) {
+ int val_idx = get_next_idx(i);
+
+ uint8_t tag = registers_raw[i];
+ uint16_t val = registers_raw[val_idx];
+
+ if (tag == 0xAA) { // Register MSB tag
+ cur_addr = val << 8;
+ } else if (tag == 0xA5) { // Register LSB tag
+ cur_addr |= val;
+ cur_addr -= 2; // Next value tag will increment address again
+ } else if (tag == 0x5A) { // Value tag
+
+ // First tag
+ if (value_tag_count % 2 == 0) {
+ cur_addr += 2;
+ first_val_idx = val_idx;
+ } else {
+ registers[cur_addr] = std::make_pair(first_val_idx + ci.frame_stride * register_row, val_idx + ci.frame_stride * register_row);
+ }
+
+ value_tag_count++;
+ }
+ }
+ }
+ return registers;
+}
+
+std::map CameraState::ar0231_parse_registers(uint8_t *data, std::initializer_list addrs) {
+ if (ar0231_register_lut.empty()) {
+ ar0231_register_lut = ar0231_build_register_lut(data);
+ }
+
+ std::map registers;
+ for (uint16_t addr : addrs) {
+ auto offset = ar0231_register_lut[addr];
+ registers[addr] = ((uint16_t)data[offset.first] << 8) | data[offset.second];
+ }
+ return registers;
+}
+
void CameraState::handle_camera_event(void *evdat) {
if (!enabled) return;
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)evdat;
@@ -1082,7 +1188,49 @@ void camera_autoexposure(CameraState *s, float grey_frac) {
s->set_camera_exposure(grey_frac);
}
-// called by processing_thread
+static float ar0231_parse_temp_sensor(uint16_t calib1, uint16_t calib2, uint16_t data_reg) {
+ // See AR0231 Developer Guide - page 36
+ float slope = (125.0 - 55.0) / ((float)calib1 - (float)calib2);
+ float t0 = 55.0 - slope * (float)calib2;
+ return t0 + slope * (float)data_reg;
+}
+
+static void ar0231_process_registers(MultiCameraState *s, CameraState *c, cereal::FrameData::Builder &framed){
+ uint8_t *data = (uint8_t*)c->buf.cur_camera_buf->addr + c->ci.registers_offset;
+ auto registers = c->ar0231_parse_registers(data, {0x2000, 0x2002, 0x20b0, 0x20b2, 0x30c6, 0x30c8, 0x30ca, 0x30cc});
+
+ uint32_t frame_id = ((uint32_t)registers[0x2000] << 16) | registers[0x2002];
+ framed.setFrameIdSensor(frame_id);
+
+ float temp_0 = ar0231_parse_temp_sensor(registers[0x30c6], registers[0x30c8], registers[0x20b0]);
+ float temp_1 = ar0231_parse_temp_sensor(registers[0x30ca], registers[0x30cc], registers[0x20b2]);
+ framed.setTemperaturesC({temp_0, temp_1});
+}
+
+static void driver_cam_auto_exposure(CameraState *c, SubMaster &sm) {
+ struct ExpRect {int x1, x2, x_skip, y1, y2, y_skip;};
+ const CameraBuf *b = &c->buf;
+ static ExpRect rect = {96, 1832, 2, 242, 1148, 4};
+ camera_autoexposure(c, set_exposure_target(b, rect.x1, rect.x2, rect.x_skip, rect.y1, rect.y2, rect.y_skip));
+}
+
+static void process_driver_camera(MultiCameraState *s, CameraState *c, int cnt) {
+ s->sm->update(0);
+ driver_cam_auto_exposure(c, *(s->sm));
+
+ MessageBuilder msg;
+ auto framed = msg.initEvent().initDriverCameraState();
+ framed.setFrameType(cereal::FrameData::FrameType::FRONT);
+ fill_frame_data(framed, c->buf.cur_frame_data);
+ if (env_send_driver) {
+ framed.setImage(get_frame_image(&c->buf));
+ }
+ if (c->camera_id == CAMERA_ID_AR0231) {
+ ar0231_process_registers(s, c, framed);
+ }
+ s->pm->send("driverCameraState", msg);
+}
+
void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) {
const CameraBuf *b = &c->buf;
@@ -1091,12 +1239,19 @@ void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) {
fill_frame_data(framed, b->cur_frame_data);
if ((c == &s->road_cam && env_send_road) || (c == &s->wide_road_cam && env_send_wide_road)) {
framed.setImage(get_frame_image(b));
+ } else if (env_log_raw_frames && c == &s->road_cam && cnt % 100 == 5) { // no overlap with qlog decimation
+ framed.setImage(get_raw_frame_image(b));
}
LOGT(c->buf.cur_frame_data.frame_id, "%s: Image set", c == &s->road_cam ? "RoadCamera" : "WideRoadCamera");
if (c == &s->road_cam) {
framed.setTransform(b->yuv_transform.v);
LOGT(c->buf.cur_frame_data.frame_id, "%s: Transformed", "RoadCamera");
}
+
+ if (c->camera_id == CAMERA_ID_AR0231) {
+ ar0231_process_registers(s, c, framed);
+ }
+
s->pm->send(c == &s->road_cam ? "roadCameraState" : "wideRoadCameraState", msg);
const auto [x, y, w, h] = (c == &s->wide_road_cam) ? std::tuple(96, 250, 1734, 524) : std::tuple(96, 160, 1734, 986);
@@ -1107,7 +1262,7 @@ void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) {
void cameras_run(MultiCameraState *s) {
LOG("-- Starting threads");
std::vector threads;
- if (s->driver_cam.enabled) threads.push_back(start_process_thread(s, &s->driver_cam, common_process_driver_camera));
+ if (s->driver_cam.enabled) threads.push_back(start_process_thread(s, &s->driver_cam, process_driver_camera));
if (s->road_cam.enabled) threads.push_back(start_process_thread(s, &s->road_cam, process_road_camera));
if (s->wide_road_cam.enabled) threads.push_back(start_process_thread(s, &s->wide_road_cam, process_road_camera));
@@ -1166,3 +1321,4 @@ void cameras_run(MultiCameraState *s) {
cameras_close(s);
}
+
diff --git a/selfdrive/camerad/cameras/camera_qcom2.h b/selfdrive/camerad/cameras/camera_qcom2.h
index 199aa40e71..e0553f000e 100644
--- a/selfdrive/camerad/cameras/camera_qcom2.h
+++ b/selfdrive/camerad/cameras/camera_qcom2.h
@@ -1,6 +1,8 @@
#pragma once
#include
+#include