diff --git a/README.md b/README.md index 042e3ba..4901a38 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## Installation #### Installing Via Installer URL: #### Enter the following into your device custom URL box to install IQ.Pilot: -`IQLvbs/release` +`iqinc/release` #### Having Trouble? If your device is currently running AGNOS 13.1 or older, you should install latest stock openpilot, then install IQ.Pilot, or try one of the alternative methods listed below! @@ -27,11 +27,11 @@ #### Installing Via SSH: #### Once you are connected to your device via SSH, you can paste the following command below to install IQ.Pilot: -`cd .. && rm -rf openpilot && git clone https://github.com/IQLvbs/openpilot.git -b release && cd openpilot && sudo reboot` +`cd .. && rm -rf openpilot && git clone https://github.com/iqinc/openpilot.git -b release && cd openpilot && sudo reboot` #### If you'd like to backup your previous installation as well, paste the following command below to install IQ.Pilot: -`cd .. && mv openpilot openpilot_backup_X && git clone https://github.com/IQLvbs/openpilot.git -b release && cd openpilot && sudo reboot` +`cd .. && mv openpilot openpilot_backup_X && git clone https://github.com/iqinc/openpilot.git -b release && cd openpilot && sudo reboot` #### Alternatively, you can use your existing fork's built in tools to switch your branch as well: -`git remote add iqpilot https://github.com/IQLvbs/openpilot.git && op switch iqpilot release` +`git remote add iqpilot https://github.com/iqinc/openpilot.git && op switch iqpilot release` --- diff --git a/artifacts/iqpilot_alc_private/manifest.json b/artifacts/iqpilot_alc_private/manifest.json index 9398c6a..7130c64 100644 --- a/artifacts/iqpilot_alc_private/manifest.json +++ b/artifacts/iqpilot_alc_private/manifest.json @@ -16,18 +16,28 @@ }, "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "a7ac44d7ce568d335b6cd5e31c940c993c3febfbf150dbc5b625fec930789d30", + "sha256": "77a601a12a498f09f01c4b1618e164638d5d9702913b6d5bb30a3c729a1c7d54", "size": 401688 }, + "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so": { + "mode": 493, + "sha256": "ca91f99d94c8bb7842332a69896d4b3a31c109c027426d1d7386876f11710d80", + "size": 69696 + }, "runtime": { "entries": { "iqpilot_private.konn3kt.iqlvbs.alc": { "path": "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so", "type": "python-module" + }, + "iqpilot_private.konn3kt.iqlvbs.vehicle_state": { + "path": "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" } } }, "signatures": { - "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": "OgV+x72Bjg9Gxxqv8pGyaTEee7bJK2xuCcfgmeKN34YKg6jjlyBgvvsx69UVrHlJx8It6udCEfDqfGjtRbzRCA==" + "python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so": "4KY001fMJhdkiQNoUXbvtOKQ2nWocmg9ZL0umWnDjAztueIstXBoc1iqW83plm2Xq0jR9NLk1Jd4yl3AydWFBA==", + "python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so": "JqSaxsDJT9q0UYgVJUo9Pqm0J0Aqwy5gIa2C8n9/ioOg/fV6PLn2KiVGn6470U4F5oNaaOgAmm+AM9jwYrZXAA==" } } diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so index 74f8faa..e27935a 100755 Binary files a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/alc.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so new file mode 100755 index 0000000..f0abb2a Binary files /dev/null and b/artifacts/iqpilot_alc_private/python/iqpilot_private/konn3kt/iqlvbs/vehicle_state.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/manifest.json b/artifacts/iqpilot_hephaestusd_private/manifest.json index 1a6aa65..51dccf0 100644 --- a/artifacts/iqpilot_hephaestusd_private/manifest.json +++ b/artifacts/iqpilot_hephaestusd_private/manifest.json @@ -16,27 +16,27 @@ }, "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "fddb1a432475585812d5d3cea8fbb2db3770df19d205b372b0df0463b2ec0840", + "sha256": "70cbd719ded42c8fd7c841864ab88c334a2155be4a57c36df240233022a5e8d1", "size": 135536 }, "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "a996e5ef6a6451e18f7dc49bc70a1223455278215c8d96092701e4ecbb68a538", + "sha256": "b6a02ca7f2adb8788c960e931b97f9b9f40164944ad9d2a7824689beaabc53b9", "size": 67664 }, "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "59c62ac7fe547df307e5f73054e00f1f650b18b8f95adf3ca0e79de5540d7427", + "sha256": "95187b8c5f81707a7fabbd9d1d8e281405ff382260ed43bef510c0089af95d13", "size": 204624 }, "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "ad3c2e37af910f38af41a6866e8485cbdf81b3b9bb68def3a378d3960f925d75", + "sha256": "cd215251153edb32ff7a2d417ccc3e2921f3e669e98fa508cecb169b21e0bf4a", "size": 69752 }, "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "1f6909f98ae72ee50e56f797846d4c5623c0d60487c63f07a2f94945f735f45b", + "sha256": "49736fa1e12f39114a40814f142750312ac5544416bbccc6014f1337c19dc606", "size": 203072 }, "python/iqpilot_private/konn3kt/hephaestus/__init__.py": { @@ -46,67 +46,67 @@ }, "python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": { "mode": 420, - "sha256": "732160f1baf7f0161925bad753d1f577d4a1d8c78623f229484849c2052945c9", + "sha256": "8c1a71f4be436f09054bda32748c4eb094bf0e26832147d7e28ca19ce91e805f", "size": 2100238 }, "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "7b92999c3119cf76e73c0847a26961210c52fcaafc1d6d2877e2efd0a4456795", + "sha256": "0109732b5e45e846531048a649e4cd188d394aa5e64df3b36b6f4f26542dc155", "size": 268064 }, "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "ae928487c4e757cefe1f9881207c1137dc8b106563bcd78b9d9e6e10fb40b851", + "sha256": "237166f1c645447f1467f7081bc71dedb7d090076ad135f83dc189cd3a904802", "size": 340584 }, "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "f4adfd7598757a54205fa1ad91641f02d98a7df290378c74108f557bae2627d5", + "sha256": "4f493569b38e1e50e2fa6d752a30d495cb3fdf572daa94452e72db067674bc0f", "size": 68048 }, "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "174978b5f138a3c49734dcbb0e1353098ca2bdf3f2d2c81fbccd08db87ace417", + "sha256": "bf42ea50717c7bac73bec9fd48874f43d963459f1a91cf9c92596018fbe4cd62", "size": 335728 }, "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "ca3feeb930cdd5b7f6a32fdb11acd6ecc5aabe29bd67d58ace6c9ffc15e545eb", + "sha256": "11cc3a7a1c21f40a0b6719ec1b97776ab786a5c75f31b43af173bc4452697ca7", "size": 271680 }, "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "c523dacac84c4ad80181ccfa3e886252cb964fe71796d4d3c82935f68d6705d0", + "sha256": "5098e97f036dffb92eca2fce847fcbe9bc13f9277a2ae39b42300cfe56e133df", "size": 134408 }, "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "f6154067c4885232d0cc72c346a1e6462941d8956c70eaf7341457b302b13c4a", - "size": 3448272 + "sha256": "17605aaedb7b4324a4c2ea64c15c6a6f305f8d455060c7a280e2db228307a9e7", + "size": 3513840 }, "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "94b222b5bea69ad307349be5328a5043f90b1e69c30e60670c034117c52f0c6a", + "sha256": "45022394525e297bff8af3f17710bfe31f63c3526985211e4eb8924490f54600", "size": 136448 }, "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "00d9d730c09439d8b23145e38afc657486ebf5daf11501711ad4713d1ecb9f59", + "sha256": "f35fe3724a5a8f823b2ad42efc3a7bbeeba6d7f7fd61eda76596a296df51ca5a", "size": 68136 }, "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "d9e1b7bd29123482d9883e4bc47f3fe45c84fad326c06f2e861da07cbfdee13a", + "sha256": "af53a0e6fef1bbb63cbdae857aeb7b2b4c93cfc290b3e27211a5df60af462a9d", "size": 67840 }, "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "b838d67347e4983886d3c366a6461cb349cbe27064928fbf25f643253ca68c86", + "sha256": "83f5129c7a2337e63ac79e4fd4cd430e96f9570bca6b5e6e3bc5224815030913", "size": 135648 }, "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "f44609d1974b2ec11cda57db2c9c09bd4e54a224bd96a743af6a9f507dc56478", + "sha256": "afb1b9cd772fe31c6845af195f6c62ef89aeef028cebc9ea7e25187ac108f90f", "size": 269568 }, "python/iqpilot_private/konn3kt/uploaderd/__init__.py": { @@ -116,7 +116,7 @@ }, "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "bb9f65c0d0baf02144971d2c721f37b118007df9c5f45a8983400941ec7d68a6", + "sha256": "4c4589a6419e9501ec5a86385a6991a54a72b290e9de855e5aa303c2fac59cb0", "size": 204184 }, "runtime": { @@ -148,23 +148,23 @@ } }, "signatures": { - "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "njPmYch3VDP4JuJv/57vY03J1darpkL5QqjL7w07XYgkF6vzflZYFJq2ANSE0gqS3hWio2IZxOaVG16MJvxRCw==", - "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "eTwlMQbC5Z+Hplu3X00ewYQT7ftqnLCgComW9n54KIPSUiZbxwjiw4G2CeFhe28JfJUBr6sDUDlVoVNnZ9OqBA==", - "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "k09CSvePXfMH7+q5uTsdIt69+STam/crgEXWvp5WGqAh3Hl0ZDVnRNHh8f+SKmppSTzU8gtjE9Yx/wzgjjYeBw==", - "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "j0EBLQA9VD3hBRi8eiXZlB4/ZcruECmsppEr+BP9NrzLskdlKAysN83o4YDUAMMinLNq0VYOx9Ix4PHksQmJDg==", - "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "iqWiLWOAPNTB9FV/NqnFLImvPn3xEvuAqcjrQsY9v6GYBev51+uBUgVEwZhEW5VOaK3tGLjErLvhczu1s205Bg==", - "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "/RVYVsF0U1n5ZjoMMSqmrHvv0THuRauCmVMZPEDOMU5EIWW+ZYiQrgO24xPUILSV/og3S1wKpEBpUgXFm4sCBg==", - "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "PHdyy9tyV0wrwHvawZqHZv3W7MkJ6uaqluURusZF3BbIV4hdbok6i4bPyUUHIaiztFAclc7ktqm1D7nY4k7oBg==", - "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "scXkv1O9w1hFvZmfoLWBSghQW3d7stQW/Tp8u09MaCaUyzIxEMySFMGWyuLsK/+Q72neAN9PfUD75l8CAZrzAA==", - "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "REH0sYrMI7XDjqxdVt+1odlWJa/xA+47aMZ/ow/tF6N6c8RTdEAQ3bse4ylh4zONQk+ozP1FP8KESPjCx9ImDQ==", - "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "IFpGbURNm++Q+0+w/c26C7rGEA0aExvptQADdwGFpzOey8qn7Lm88w0dS4XrLmwYi46BjtbWm/nkN61steemBA==", - "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "lqzf8FZk6+1wSIHBIhRgzzv0Vd1DjvDOfVz0NdIV23y3l+2Eif/gkzUjuZpsXpIgIw9bBqh8L3PKXWW4jJFkBQ==", - "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "JbVCZ+G97IMYDzWnWP87Dk9mWnaWmxQXV41RWuDEwJWnM4HBi3+7HCziPo/GdEW9YpORyu1WBqg6Y5y0ijXlDA==", - "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "1AOr8xUf6+iUX853cpCYEsdxKpeJom/u+neR4fh3pW/xMscieI7Y5I9DJgjdU4/7Zor2M1Lstxi5FDI45W8gDQ==", - "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "lkHdhndsENTYxHNskHwva2FFmkQXs5vKKdSOcSbBmNWKDiYUSxNYzYBdUlYkYlBQqMZU6I57Dk54erq8Muj8AQ==", - "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "8ch+yvT6IdR63R6oSiqJnF6EVVZRiaNFk2QwHqYDNoT9o8h0i4/vssb6n86tVCj01ZLyT9rHvyznL36BittuAQ==", - "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "aRWcvotSk/hilzlmj867MNro2kNalEd5ySGdqJkE7DKmGHxxCaG+x9E0AYTyvbzQs0ar59o9kQe31vL4Mr9ZDw==", - "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "4SjG/+6RRSYaEVhsMnHTXRfnjnVstF2J8ttWQyfDYHhvFqmrshUf2d6r3aAZtNTDuqU3MgopfxZw7Rs/4OlqAw==", - "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "3U+IiMq2SN7NDiqwA8yFtM1eMq/64HnxDYVeeQWa7hdhwXoetfteI05VqUOG90GHgaGob026MP8f+v7rKd2WCA==" + "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "fHETfdkKuvKTn8rv9E8G6c7xzCNGE2z4BV9YqbGN4Al5F+knIeiSh2EzKkjr8TVLMHmF1BpbYqO/Hk0Le9eqBw==", + "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "oXxKlxWYX8r6eFPfFWTUgUgykuIv4Fbn4LGdLzRQcO8gBNm6ZvF1+z5vlZ3A1eX/vdutp3nilP6PVz83kE+XDg==", + "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "A2qyZYHlLEheJ7MKAWJ/t435DBRud3DDWXZZIAnS0KQthX2hSjxeYPPToQAaBOVso2yGj+02Jr6d5XjAjfGlDQ==", + "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "yq0n30lKaAYI3uwYthCUY5w+DU52v80vQQdzdJ3HU/H4Yx//us+qoulgO4y5Lh6wIkcGyVxZM8qALf6tv/uICw==", + "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "dc9Uj1Mtzs/JqAhXrRypKVXcOeDz+LhQkoC9i480cm9xTD4CwHi0uMb0R0ug3Zy/a/T6kEb1dfeLaRu8bifsAQ==", + "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "f8rBsEG6oV0FWBwF1UN/wNZstXb+I1RHgznD+IuFXdsSKD1ucPSIfu+BYzxDi9/DpPfxRXVoHS4cOgN1CadmBw==", + "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "YFxsXCJUOlnws+cDf5MO8mkKSiOo27xUqo29lwZBP8y2+BPiiknCShaI4hC+ejzWd4+59smPaKUuUsXcdmPABQ==", + "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "aC/O3UeBljXJ6QGSvJBULyPhSUmMOp6Y7pGtfXA1Nf5tw8qEAb/7kjiU6my5+f9w48fNAe1voSF1mO5eLCsLCg==", + "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "lubN92tDcIPYnpq7LLPsgqxq5qj715kBljkie2yURge7SGluI6bWyO616OIVHjdG0Wvq58/EsmvH2qKH6EbKAg==", + "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "51hAcDuyXxQcnPQUQV58KcRnIggvBJSVyRA/EzO22WgX1kLXCkhGsYbJ9lMHZH3IVUXzOpP16qEoxcdykyK/Bw==", + "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "ExuQziX7rIwMiZGQjFTnr7Rw+LA4iluxeRPZ7zxnvdKo6qagECqmv5VdqxsevAYmH6KiwYDBH/Bjn4G4sLnQDg==", + "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "T1QHRSyUFUhXl0Mw0CSrG3oIbcCuInWNdX1mMuYHKNf3O+iaAVDB7fgYB6jl9C3jzeiD2LH6jgpgvWEUqF9WAA==", + "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "YlDNaD3dT6JuYRT7P3UEnha+/W13//OtYrkoGa8KwpDFhZy7FAyQkZiENHjIQi+K3K+I7qd2phlwrWcPXvaWAg==", + "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "PxuLDE5We4EsluPRWPZBt2E9nBJTsEX0You50iDdWgjQp8+gJT5ZWfX3wG8cHF8JzOL4xZdg11SjdXpOKsoODg==", + "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "Lsz5pL5pkh5n3aqJ+SQi4vixS2CTIG1Nou3+z8/OgnPq/8nF47NWuOgL2pT2ogeElgOqSHZgEVO4v4V/FQKHBg==", + "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "hbCMagRzeN+JMb4Z/ZkiYo8WvA8ptT8r0NzwBlLRfY1LqkC1ZePGROG3Fq5RC9ylb1UotOmBcIVcOfiG3zDMCw==", + "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "zxtsmguucERIWEZXJiNU16fWzGDcbOWgsDa4oB90G1kAP73CTY9cMjchHsIkNZ+bkQNBFNSMmBsTavo6NeOTCQ==", + "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "mInwiS+voFDcEVMHBmHY4W69OQ+Vhl0N6cdmsetpX2YMS8zKfkDJIWvP7AwwX2ZFGkKJ/V8Wc2NTObJAIUqDBA==" } } diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so index ad5395a..2d46a09 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so index 6838c4d..5975b7d 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so index e6631ff..58dd980 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so index c9abb22..acc32ba 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so index 1cde4bc..3ad8f6a 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip index cb4f97d..36be043 100644 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so index ae8c286..4f71e7a 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so index 5a22b02..728e283 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so index 8d130db..6dbb83d 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so index 83be9aa..f77b531 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so index 6c12700..5ff1767 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so index 2ee9570..74339bb 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so index 3c1b091..ebea228 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so index 1aaa50e..58ee26c 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so index f8e0e14..142b519 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so index d0ff1a1..72dab1a 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so index 79cc2c5..115223b 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so index 7af788c..23d81b9 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so index f1808a5..b2e8532 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so differ diff --git a/common/params.py b/common/params.py index 9bcde11..2b7165a 100644 --- a/common/params.py +++ b/common/params.py @@ -9,12 +9,14 @@ except ImportError: pass class ParamKeyFlag(IntFlag): - PERSISTENT = 1 - CLEAR_ON_MANAGER_START = 2 - CLEAR_ON_ONROAD_TRANSITION = 4 - CLEAR_ON_OFFROAD_TRANSITION = 8 - DONT_LOG = 16 - DEVELOPMENT_ONLY = 32 + # must stay in lockstep with enum ParamKeyFlag in common/params.h + PERSISTENT = 0x02 + CLEAR_ON_MANAGER_START = 0x04 + CLEAR_ON_ONROAD_TRANSITION = 0x08 + CLEAR_ON_OFFROAD_TRANSITION = 0x10 + DONT_LOG = 0x20 + DEVELOPMENT_ONLY = 0x40 + CLEAR_ON_IGNITION_ON = 0x80 ALL = 0xFFFFFFFF class ParamKeyType(IntEnum): diff --git a/common/params_keys.h b/common/params_keys.h index e311527..d9b0544 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -165,6 +165,8 @@ inline static std::unordered_map keys = { {"IQCarParamsPersistent", {PERSISTENT, BYTES}}, {"IQCarParamsPersistentV2", {PERSISTENT, BYTES}}, {"CarPlatformBundle", {PERSISTENT, JSON}}, + {"Konn3ktVwOdometers", {PERSISTENT, JSON}}, + {"Konn3ktVehicleOdometers", {PERSISTENT, JSON}}, {"ChevronInfo", {PERSISTENT, INT, "4"}}, {"DeviceBootMode", {PERSISTENT, INT, "0"}}, {"IQDevUIInfo", {PERSISTENT, INT, "0"}}, diff --git a/iqdbc_repo/iqdbc/car/car.capnp b/iqdbc_repo/iqdbc/car/car.capnp index 9879f1b..c427998 100644 --- a/iqdbc_repo/iqdbc/car/car.capnp +++ b/iqdbc_repo/iqdbc/car/car.capnp @@ -209,6 +209,8 @@ struct CarState { lateralAvailable @61 :Bool; # lateral control is available even if cruise is faulted cruiseFaultLateralMode @62 :Bool; # cruise is faulted but lateral control is still active radarDisableFailed @66 :Bool; + # Physical vehicle odometer in kilometers. Zero means unavailable on this platform. + odometer @67 :Float64; # cruise state cruiseState @10 :CruiseState; diff --git a/iqdbc_repo/iqdbc/car/tesla/carstate.py b/iqdbc_repo/iqdbc/car/tesla/carstate.py index a75c3cc..13835f0 100644 --- a/iqdbc_repo/iqdbc/car/tesla/carstate.py +++ b/iqdbc_repo/iqdbc/car/tesla/carstate.py @@ -8,6 +8,10 @@ from iqdbc.car.tesla.values import DBC, CANBUS, GEAR_MAP, STEER_THRESHOLD, Tesla from iqdbc.iqpilot.car.tesla.carstate_ext import CarStateExt from iqdbc.iqpilot.car.tesla.values import TeslaFlagsIQ +from openpilot.common.params import Params +from openpilot.system.proprietary_runtime._verified_import import import_verified_module + +vehicle_state = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.vehicle_state") ButtonType = structs.CarState.ButtonEvent.Type @@ -27,6 +31,7 @@ class CarState(CarStateBase, CarStateExt): self.acc_state_last = 0 self.das_control = None self.das_body_controls_dat = b"" + self._odometer_store = vehicle_state.VehicleOdometerStore(CP, Params()) self.cruise_override = False def update_summon_state(self, summon_state: str, cruise_enabled: bool): @@ -155,6 +160,8 @@ class CarState(CarStateBase, CarStateExt): self.das_body_controls_dat = bytes(can_parsers[Bus.cam].dat.get(0x3E9, b"")) CarStateExt.update(self, ret, ret_iq, can_parsers) + if ret.odometer > 0.0: + ret.odometer = self._odometer_store.record(ret.odometer) or 0.0 return ret, ret_iq diff --git a/iqdbc_repo/iqdbc/car/tesla/interface.py b/iqdbc_repo/iqdbc/car/tesla/interface.py index e2c2a08..9b0eee0 100644 --- a/iqdbc_repo/iqdbc/car/tesla/interface.py +++ b/iqdbc_repo/iqdbc/car/tesla/interface.py @@ -59,7 +59,10 @@ class CarInterface(CarInterfaceBase): if candidate == CAR.TESLA_MODEL_X: stock_cp.dashcamOnly = False - if 0x3DF in fingerprint[1]: + # Vehicle-bus messages can be slow enough to miss the initial capture window. + # Accept either the established 0x3DF marker or the absolute odometer frame. + vehicle_bus_seen = any(0x3DF in bus or 0x3B6 in bus for bus in fingerprint.values()) + if vehicle_bus_seen: ret.flags |= TeslaFlagsIQ.HAS_VEHICLE_BUS.value ret.iqSafetyFlags |= TeslaSafetyFlagsIQ.HAS_VEHICLE_BUS diff --git a/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py b/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py index b36db0d..c9bb75f 100644 --- a/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py +++ b/iqdbc_repo/iqdbc/car/tesla/tests/test_tesla.py @@ -4,6 +4,7 @@ from iqdbc.car.tesla.teslacan import TeslaCAN from iqdbc.car.tesla.radar_interface import RADAR_START_ADDR from iqdbc.car.tesla.carcontroller import CarController from iqdbc.car.tesla.values import CAR +from iqdbc.can import CANPacker, CANParser class TestTeslaFingerprint: @@ -31,6 +32,19 @@ class TestTeslaCan: def make_can_msg(self, name, bus, values): return name, bus, values + def test_vehicle_bus_odometer_decodes_kilometers(self): + packer = CANPacker("tesla_model3_vehicle") + parser = CANParser("tesla_model3_vehicle", [("ID3B6UI_odometer", 1)], 1) + + message = packer.make_can_msg("ID3B6UI_odometer", 1, { + "UI_odometer": 29150.377, + "UI_odometerCounter": 1, + "UI_odometerChecksum": 0, + }) + parser.update([1_000_000_000, [message]]) + + assert parser.vl["ID3B6UI_odometer"]["UI_odometer"] == 29150.377 + def test_longitudinal_command_does_not_reference_missing_jerk_attr(self): CP = CarInterface.get_non_essential_params(CAR.TESLA_MODEL_3) tesla_can = TeslaCAN(CP, self.DummyPacker()) diff --git a/iqdbc_repo/iqdbc/car/volkswagen/carstate.py b/iqdbc_repo/iqdbc/car/volkswagen/carstate.py index f702af7..a6aedf7 100644 --- a/iqdbc_repo/iqdbc/car/volkswagen/carstate.py +++ b/iqdbc_repo/iqdbc/car/volkswagen/carstate.py @@ -15,6 +15,7 @@ from iqdbc.car.volkswagen.speed_limit_manager import SpeedLimitManager from openpilot.system.proprietary_runtime._verified_import import import_verified_module iq_lvbs_alc = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.alc") +vehicle_state = import_verified_module("iqpilot_alc_private", "iqpilot_private.konn3kt.iqlvbs.vehicle_state") iqpilot_path = os.path.join(os.path.dirname(__file__), '..', '..', '..') sys.path.insert(0, iqpilot_path) @@ -100,8 +101,15 @@ class CarState(CarStateBase): self.cruise_main_switch = False self.motor3_stock = {} self.motor1_stock = {} - self.motor1_frame = 0 self.motor3_frame = 0 + self.motor1_frame = 0 + self._odometer_store = vehicle_state.VehicleOdometerStore(CP, self._params) + + def _update_odometer(self, ret: structs.CarState, raw_km: float) -> None: + """Publish the cluster value while proprietary Konn3kt code owns persistence.""" + odometer_km = self._odometer_store.record(raw_km) + if odometer_km is not None: + ret.odometer = odometer_km def _apply_iq_private_flags(self, ret_iq: structs.IQCarState) -> None: ret_iq.alcOverrideAlert = bool(self.alcOverrideAlert) @@ -285,6 +293,7 @@ class CarState(CarStateBase): ret.fuelGauge = pt_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] / 55.0 ret.fuelTankLevelL = pt_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] # raw liters for konn3kt + self._update_odometer(ret, aux_cp.vl["Kombi_02"]["KBI_Kilometerstand"]) self.cruise_faulted = ret.accFaulted self._apply_iq_private_flags(ret_iq) @@ -400,6 +409,7 @@ class CarState(CarStateBase): psd_06_values = main_cp.vl["PSD_06"] if self.CP.flags & VolkswagenFlags.STOCK_PSD_PRESENT else {} psd_06_values = pt_cp.vl["PSD_06"] if not psd_06_values and self.CP.flags & VolkswagenFlags.STOCK_PSD_06_PRESENT else psd_06_values diagnose_01_values = pt_cp.vl["Diagnose_01"] if self.CP.flags & VolkswagenFlags.STOCK_DIAGNOSE_01_PRESENT else {} + self._update_odometer(ret, pt_cp.vl["Diagnose_01"]["KBI_Kilometerstand"]) if self.enable_speed_limit_predicative and not self.enable_predicative_speed_limit: self.enable_predicative_speed_limit = True @@ -631,6 +641,8 @@ class CarState(CarStateBase): ret.fuelGauge = 0 # pt_cp.vl["Kombi_1"]["Tankinhalt"] / 55.0 ret.fuelTankLevelL = 0 # pt_cp.vl["Kombi_1"]["Tankinhalt"] # raw liters for konn3kt + if aux_cp is not None: + self._update_odometer(ret, aux_cp.vl["Kombi_3"]["Kilometerstand"]) if self.CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB: ret.cruiseState.standstill = self.CP.pcmCruise and bool(pt_cp.vl["Bremse_5"]["BR5_Stillstand"]) and ret.cruiseState.enabled @@ -706,6 +718,7 @@ class CarState(CarStateBase): ret.fuelGauge = br_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] / 55.0 ret.fuelTankLevelL = br_cp.vl["Kombi_02"]["KBI_Inhalt_Tank"] # raw liters for konn3kt + self._update_odometer(ret, br_cp.vl["Kombi_02"]["KBI_Kilometerstand"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) @@ -794,8 +807,11 @@ class CarState(CarStateBase): ] if CP.flags & VolkswagenFlags.MLB: pt_messages += [ - ("Blinkmodi_01", math.nan) # From J519 BCM (is inactive when no lights active, 50Hz when active) + ("Blinkmodi_01", math.nan), # From J519 BCM (is inactive when no lights active, 50Hz when active) + ("Kombi_02", math.nan), # Auxiliary-bus cluster odometer ] + else: + pt_messages += [("Kombi_02", math.nan)] # Auxiliary-bus cluster odometer if CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT: cam_messages += [ ("HCA_01", 1), # From R242 Driver assistance camera, 50Hz if steering/1Hz if not @@ -809,7 +825,7 @@ class CarState(CarStateBase): @staticmethod def get_can_parsers_pq(CP): - aux_messages = [] + aux_messages = [("Kombi_3", math.nan)] # Bus 1 cluster odometer if CP.flags & VolkswagenFlagsIQ.IQ_PQ_ACC_FTS_EPB: aux_messages.append(("Motor_3", 0)) return { @@ -826,6 +842,7 @@ class CarState(CarStateBase): # TA_01 lives on bus 0 (car ECU / OP-generated when long is active). # math.nan → ignore_alive=True so it never contributes to can_valid. ("TA_01", math.nan), + ("Diagnose_01", math.nan), # Bus 0 cluster odometer ] if CP.networkLocation == NetworkLocation.fwdCamera: pt_messages.append(("AWV_03", 1)) diff --git a/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc b/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc index fa4624e..a8faeca 100644 --- a/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc +++ b/iqdbc_repo/iqdbc/dbc/tesla_model3_vehicle.dbc @@ -397,5 +397,10 @@ BO_ 826 ID33AUI_rangeSOC: 8 VehicleBus BO_ 306 ID132HVBattAmpVolt: 8 VehicleBus SG_ BattVoltage132 : 0|16@1+ (0.01,0) [0|655.35] "V" Receiver +BO_ 950 ID3B6UI_odometer: 8 VehicleBus + SG_ UI_odometer : 0|32@1+ (0.001,0) [0|4294967.295] "km" Receiver + SG_ UI_odometerCounter : 52|4@1+ (1,0) [0|15] "" Receiver + SG_ UI_odometerChecksum : 56|8@1+ (1,0) [0|255] "" Receiver + BO_ 658 ID292BMS_SOC: 8 VehicleBus SG_ SOCUI292 : 10|10@1+ (0.1,0) [0|102.3] "%" Receiver diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py b/iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py index 019ac7b..3690534 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py +++ b/iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py @@ -18,9 +18,18 @@ class CarStateExt: self.CP_IQ = CP_IQ self.infotainment_3_finger_press = 0 + self.vehicle_bus_available = bool(CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS) def update(self, ret: structs.CarState, ret_iq: structs.IQCarState, can_parsers: dict[StrEnum, CANParser]) -> None: - if self.CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS: + if Bus.adas in can_parsers: + cp_adas = can_parsers[Bus.adas] + + odometer_km = float(cp_adas.vl["ID3B6UI_odometer"].get("UI_odometer", 0.0)) + if 0.0 < odometer_km < 4294967.296: + self.vehicle_bus_available = True + ret.odometer = odometer_km + + if self.vehicle_bus_available and Bus.adas in can_parsers: cp_adas = can_parsers[Bus.adas] prev_infotainment_3_finger_press = self.infotainment_3_finger_press @@ -66,7 +75,9 @@ class CarStateExt: def get_parser(CP: structs.CarParams, CP_IQ: structs.IQCarParams) -> dict[StrEnum, CANParser]: messages = {} - if CP_IQ.flags & TeslaFlagsIQ.HAS_VEHICLE_BUS: + if Bus.adas in DBC[CP.carFingerprint]: + # Parse the absolute odometer even if the initial fingerprint missed a + # slow vehicle-bus marker. Runtime data latches support safely. messages[Bus.adas] = CANParser(DBC[CP.carFingerprint][Bus.adas], [], CANBUS.vehicle) return messages diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index 298ae0d..3805f4c 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -31,6 +31,12 @@ LAUNCH_COMMIT_T = 3.5 LAUNCH_MOVING_SPEED = 1.2 LAUNCH_MAX_ACCEL = 1.5 +E2E_CRUISE_CONVERGENCE_TAU = 15.0 +E2E_CRUISE_ACCEL_MAX = 0.5 +E2E_MODEL_SPEED_HORIZON = 5.0 +E2E_ACCEL_INTENT_BP = [-0.05, 0.05] +E2E_MODEL_SPEED_INTENT_BP = [-0.5, 0.0] + # Lookup table for turns _A_TOTAL_MAX_V = [1.7, 3.2] _A_TOTAL_MAX_BP = [20., 40.] @@ -69,6 +75,23 @@ def get_cruise_accel(e2e, v_cruise, v_ego, a_cruise_prev, angle_steers, CP, dt, return target_accel, cruise_should_stop +def get_e2e_accel(v_ego, v_cruise, model_v, a_target, should_stop): + if should_stop or v_cruise <= v_ego or len(model_v) != len(T_IDXS_MPC): + return a_target + + convergence_accel = min((v_cruise - v_ego) / E2E_CRUISE_CONVERGENCE_TAU, E2E_CRUISE_ACCEL_MAX) + if convergence_accel <= a_target: + return a_target + + # Only help the model converge to cruise when both its immediate action and + # velocity trajectory show no active deceleration intent. The lead MPC and + # cruise candidates remain hard upper bounds on the final acceleration. + accel_intent = np.interp(a_target, E2E_ACCEL_INTENT_BP, [0.0, 1.0]) + model_speed = np.interp(E2E_MODEL_SPEED_HORIZON, T_IDXS_MPC, model_v) + speed_intent = np.interp(model_speed - v_ego, E2E_MODEL_SPEED_INTENT_BP, [0.0, 1.0]) + return float(np.interp(min(accel_intent, speed_intent), [0.0, 1.0], [a_target, convergence_accel])) + + class LongitudinalPlanner(LongitudinalPlannerIQ): def __init__(self, CP, CP_IQ, init_v=0.0, init_a=0.0, dt=DT_MDL): self.CP = CP @@ -173,6 +196,8 @@ class LongitudinalPlanner(LongitudinalPlannerIQ): output_a_target_e2e = sm['modelV2'].action.desiredAcceleration output_should_stop_e2e = sm['modelV2'].action.shouldStop output_a_target_e2e, output_should_stop_e2e = self.apply_e2e_stop_distance(sm, v_ego, output_a_target_e2e, output_should_stop_e2e) + if self.is_e2e(sm): + output_a_target_e2e = get_e2e_accel(v_ego, v_cruise, model_v, output_a_target_e2e, output_should_stop_e2e) if sm['carState'].standstill: self.launch_armed = True diff --git a/selfdrive/controls/tests/test_longitudinal_planner.py b/selfdrive/controls/tests/test_longitudinal_planner.py new file mode 100644 index 0000000..af6d704 --- /dev/null +++ b/selfdrive/controls/tests/test_longitudinal_planner.py @@ -0,0 +1,31 @@ +import numpy as np +import pytest + +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import T_IDXS +from openpilot.selfdrive.controls.lib.longitudinal_planner import get_e2e_accel + + +def model_velocity(v_ego, v_future): + return np.interp(T_IDXS, [T_IDXS[0], T_IDXS[-1]], [v_ego, v_future]) + + +class TestE2eCruiseConvergence: + def test_converges_when_model_wants_to_accelerate(self): + assert get_e2e_accel(20.0, 30.0, model_velocity(20.0, 25.0), 0.1, False) == pytest.approx(0.5) + + def test_scales_down_near_cruise_speed(self): + assert get_e2e_accel(28.5, 30.0, model_velocity(28.5, 30.0), 0.0, False) == pytest.approx(0.05) + + def test_preserves_active_model_deceleration(self): + assert get_e2e_accel(20.0, 30.0, model_velocity(20.0, 25.0), -0.05, False) == pytest.approx(-0.05) + + def test_preserves_future_model_slowdown(self): + assert get_e2e_accel(20.0, 30.0, model_velocity(20.0, 18.0), 0.1, False) == pytest.approx(0.1) + + @pytest.mark.parametrize("v_ego, v_cruise, should_stop", [ + (30.0, 30.0, False), + (31.0, 30.0, False), + (20.0, 30.0, True), + ]) + def test_never_overrides_cruise_or_stop(self, v_ego, v_cruise, should_stop): + assert get_e2e_accel(v_ego, v_cruise, model_velocity(v_ego, v_ego + 5.0), -0.2, should_stop) == pytest.approx(-0.2) diff --git a/selfdrive/modeld/SConscript b/selfdrive/modeld/SConscript index caf1fcb..40e7401 100644 --- a/selfdrive/modeld/SConscript +++ b/selfdrive/modeld/SConscript @@ -72,7 +72,10 @@ for model_name in ['dmonitoring_model']: # inputs (onnx + tinygrad_repo + flags + metadata script) and output hashes; if it matches, skip # declaring the targets entirely. Any mismatch falls back to a normal on-device compile. if arch == "larch64": - from openpilot.selfdrive.modeld.prebuilt_models import verify_prebuilt, outputs_match + from openpilot.selfdrive.modeld.prebuilt_models import packaged_prebuilt_matches, verify_prebuilt, outputs_match + if packaged_prebuilt_matches(model_name): + print(lenv.PrettyNote('SKIP', f"{model_name} — packaged prebuilt pkl")) + continue if verify_prebuilt(model_name, flags): print(lenv.PrettyNote('SKIP', f"{model_name} — prebuilt pkl")) continue diff --git a/selfdrive/modeld/prebuilt_models.py b/selfdrive/modeld/prebuilt_models.py index 0f62ff3..73a16de 100644 --- a/selfdrive/modeld/prebuilt_models.py +++ b/selfdrive/modeld/prebuilt_models.py @@ -77,7 +77,13 @@ def outputs_match(model_name: str) -> bool: return True +def packaged_prebuilt_matches(model_name: str) -> bool: + return not (MODELS_DIR / f'{model_name}.onnx').is_file() and outputs_match(model_name) + + def verify_prebuilt(model_name: str, flags: str) -> bool: + if not (MODELS_DIR / f'{model_name}.onnx').is_file(): + return False data = _load_checks().get(model_name, {}) if data.get('signature') != compute_signature(model_name, flags): return False diff --git a/selfdrive/modeld/test_prebuilt_models.py b/selfdrive/modeld/test_prebuilt_models.py new file mode 100644 index 0000000..a994982 --- /dev/null +++ b/selfdrive/modeld/test_prebuilt_models.py @@ -0,0 +1,51 @@ +import hashlib +import json + +from openpilot.selfdrive.modeld import prebuilt_models + + +def write_outputs(models_dir, check_path): + outputs = {} + for name, contents in { + 'dmonitoring_model_tinygrad.pkl': b'tinygrad', + 'dmonitoring_model_metadata.pkl': b'metadata', + }.items(): + (models_dir / name).write_bytes(contents) + outputs[name] = hashlib.sha256(contents).hexdigest() + check_path.write_text(json.dumps({'dmonitoring_model': {'outputs': outputs}})) + + +def test_packaged_prebuilt_without_onnx(tmp_path, monkeypatch): + models_dir = tmp_path / 'models' + models_dir.mkdir() + check_path = models_dir / 'prebuilt_check.json' + write_outputs(models_dir, check_path) + monkeypatch.setattr(prebuilt_models, 'MODELS_DIR', models_dir) + monkeypatch.setattr(prebuilt_models, 'CHECK_PATH', check_path) + + assert prebuilt_models.packaged_prebuilt_matches('dmonitoring_model') + assert not prebuilt_models.verify_prebuilt('dmonitoring_model', 'flags') + + +def test_packaged_prebuilt_rejects_corrupt_output(tmp_path, monkeypatch): + models_dir = tmp_path / 'models' + models_dir.mkdir() + check_path = models_dir / 'prebuilt_check.json' + write_outputs(models_dir, check_path) + (models_dir / 'dmonitoring_model_tinygrad.pkl').write_bytes(b'corrupt') + monkeypatch.setattr(prebuilt_models, 'MODELS_DIR', models_dir) + monkeypatch.setattr(prebuilt_models, 'CHECK_PATH', check_path) + + assert not prebuilt_models.packaged_prebuilt_matches('dmonitoring_model') + + +def test_source_checkout_is_not_packaged_prebuilt(tmp_path, monkeypatch): + models_dir = tmp_path / 'models' + models_dir.mkdir() + check_path = models_dir / 'prebuilt_check.json' + write_outputs(models_dir, check_path) + (models_dir / 'dmonitoring_model.onnx').write_bytes(b'onnx') + monkeypatch.setattr(prebuilt_models, 'MODELS_DIR', models_dir) + monkeypatch.setattr(prebuilt_models, 'CHECK_PATH', check_path) + + assert not prebuilt_models.packaged_prebuilt_matches('dmonitoring_model') diff --git a/system/loggerd/loggerd.h b/system/loggerd/loggerd.h index 63f68b5..f4cf803 100644 --- a/system/loggerd/loggerd.h +++ b/system/loggerd/loggerd.h @@ -43,10 +43,7 @@ struct EncoderSettings { } static EncoderSettings QcamEncoderSettings() { - // qcamera.ts is the small "dashcam" copy uploaded to konn3kt. Stock 256kbps @ 526x330 is potato; - // bump the bitrate to match the higher resolution below. Still H264/.ts (web/HLS compatible) and - // ~1/4 the bitrate of fcamera.hevc, so the file stays small. Override with QCAM_BITRATE if needed. - int _qcam_bitrate = getenv("QCAM_BITRATE") ? atoi(getenv("QCAM_BITRATE")) : 1'600'000; + int _qcam_bitrate = getenv("QCAM_BITRATE") ? atoi(getenv("QCAM_BITRATE")) : 3'200'000; return EncoderSettings{.encode_type = cereal::EncodeIndex::Type::QCAMERA_H264, .bitrate = _qcam_bitrate, .gop_size = 15}; } @@ -140,8 +137,8 @@ const EncoderInfo qcam_encoder_info = { .filename = "qcamera.ts", .cbr = true, // enforce the bitrate so upload size stays predictable (no VBR overshoot) .get_settings = [](int){return EncoderSettings::QcamEncoderSettings();}, - .frame_width = 1052, // 2x the stock 526x330, same road-cam aspect ratio - .frame_height = 660, + .frame_width = 1578, // 3x the stock 526x330, same road-cam aspect ratio + .frame_height = 990, .include_audio = Params().getBool("RecordAudio"), INIT_ENCODE_FUNCTIONS(QRoadEncode), };