diff --git a/artifacts/iqpilot_hephaestusd_private/manifest.json b/artifacts/iqpilot_hephaestusd_private/manifest.json index 3db2fc6..3249777 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": "5ca5099e9b33d6b06a7b09992a444f97605914e96f8a9f1bdd7de278f5574c82", + "sha256": "dfc76d7b791879501396d4de4891718d0052d23b1e6cb217b0be01f3e3e6d857", "size": 135536 }, "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "b682b580cf7a1e068120a4591b2c61fa8e0b92201779d79566c4d03248c939b1", + "sha256": "d1a7fd4e222b08c1e574ed1188943acddecc8d3f5ac02a1983bf90bde5e00a2c", "size": 67664 }, "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "0b1801c7790aefc4a0c7fd44cb94cebd6bd6c4647913987847d6432d2c856ac7", + "sha256": "5393274eb99f50917fef30f994b1ad5fab66860bd535b7d270a86d144d4e25b7", "size": 204624 }, "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "b729bdb775de9f3bb5362649aa94445bf7f8a102048468e88d1967a2545f7927", + "sha256": "9c08c3f6e3dc3b73f1a28d50d5aa76fa0894e9cd83bf02b7e9cc83bda5e84b4e", "size": 69752 }, "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "969e8544555c9b463c79541f6a73d852a57bfb9ac5121da8b09a2a8dcfc5e636", + "sha256": "fb417b7fed56353caad6d5a96429952ff0b87ee1bab7d6a8f0856d1ca40e4b4a", "size": 203072 }, "python/iqpilot_private/konn3kt/flockd/__init__.py": { @@ -46,12 +46,12 @@ }, "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "359489fee0ceb758a42de988f24922bd5d70025986f69e5c8c630c349281bd0c", - "size": 202104 + "sha256": "73164bb5c3eafe0a5409508140c093503ec40c1c58d0a8e79281bac3d22d811c", + "size": 202168 }, "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "6af9a71b99ac11bda37e32896e660edbe82bef3e6bcbc61ef3710b9c774a6a2e", + "sha256": "fb6d56fbec20965d988f936c46e7a70f31def71a2fba27a6506567b3c13574cf", "size": 68080 }, "python/iqpilot_private/konn3kt/hephaestus/__init__.py": { @@ -61,67 +61,67 @@ }, "python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": { "mode": 420, - "sha256": "59fcfd20cb32cb06e579d72129ca6c5d3b7b63add4d43b8d464e0411afe89ce2", + "sha256": "52026a3b96c4e7eee5cb33d70a323896ab0de02557196980653afb99498af84d", "size": 2100238 }, "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "ac635ec8e236104ce10942fda1c4dae7b1eb747ad8e4e6c2855c37f1dd98ebe8", + "sha256": "aa3530a7f7a44ba1de0d8c1b5de3d26405bf0ee0b9599190bfbbea55d2ed2071", "size": 268064 }, "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "12e381f1292c44b5eeee603865b4b5fd7da9b5fb7a0a6294d888e71de4988819", + "sha256": "5a6bf50d4f8e3ec43603c2b3d9743dd650b37c6dd2075ec19266d0f1368b8cff", "size": 340584 }, "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "3324404c9a66f90bd2d48b8a43e583abea98ee4b68a7fd0023d0313b1695fd57", + "sha256": "ff36bfb143294790a6ab0e2fe3d14852f3b04374185ef19a614231ca56a40999", "size": 68048 }, "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "a84efbd54a57455a8124aa9b1e54b7e6e8061905b5f76e019d85a30adcfeac3d", + "sha256": "ea54bc8d8a2ba2d803ce782898a6987457d248945da81cb9ab08bc32f6763fe1", "size": 335728 }, "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "91f7b9ec65404dbd2e0b0fffdf46b1607103ce38202df9d0d02f50582278685c", + "sha256": "f7706a6cabf49660c48609ca4a85c840c1e22e5e4b17d250114e25b56a7b9c34", "size": 271680 }, "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "560814088a2e424399aa456ce1886b763cd5a8c8a879a5b10b6049dcab3e127d", + "sha256": "5fc96f8ac2c67f3ff660b8c060d14b0e526cba7eaa5ce64fae94f3d0e784d417", "size": 134408 }, "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "2c14688dc0b066226c8b0899c35f7237726182e9973aab5ceb6817ff559fa564", + "sha256": "85ecde61b3fcc0d18dc260855a94eb8d30ab2e02adbfea67e209b3fe320608b1", "size": 3514416 }, "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "f32dbf481d03d9867ca768781eae8eb33db0ef24d2303993fb38e9806fb5cdc0", + "sha256": "c7b1b7a441f9c4ad395efb3de26d972379d9927f9c7ea9c121d1d06b8170139b", "size": 136448 }, "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "ce0944eea1c056bb646c28149428aa5c48086e41910ce1dbdf442588db714a77", + "sha256": "a7fddf4e77d804f255ae4821fe64eada65ee6f2cc41cfb5c995acd497a0caca4", "size": 68136 }, "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "d7ed7b723757a1e674baa060847232f460f68d685b6ae000e2aac5141fa9541f", + "sha256": "2ff9ebdb8887bb71a971a4d06fd362c51f5a4446595a073a45edc8bb630a642a", "size": 67840 }, "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "13f24976bb967d69585d9b5e6c975de827ca82a749177a40e61661684ed808b2", + "sha256": "789481c2f41a6a38492f4f6e62d90c18c59276ff7a9b60fd8a5063b1754efe82", "size": 135648 }, "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "da5517566850d263cbc19779e5306b651ec910e89c3ffe997c160daa07406878", + "sha256": "280bee6ecfcde50d1856835a319aaa3354ecfdc4c9d552243493ae7070f9f169", "size": 269568 }, "python/iqpilot_private/konn3kt/uploaderd/__init__.py": { @@ -131,11 +131,19 @@ }, "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "ede763389fe1b7aaf60bb9049b146e56bfab4c58b20beba8f21c15d8e8c7e78a", + "sha256": "b1df9786798beaf80ae110b20b79c2e88b7bbdf38c576fa249fc896e360f9ad1", "size": 204184 }, "runtime": { "entries": { + "iqpilot_private.konn3kt.backups.backup_orchestrator": { + "path": "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, + "iqpilot_private.konn3kt.flockd.flockd": { + "path": "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so", + "type": "python-module" + }, "iqpilot_private.konn3kt.hephaestus.ble_transportd": { "path": "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so", "type": "python-module" @@ -163,25 +171,25 @@ } }, "signatures": { - "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "q5X7Qd9gy6n/SJj3F4VmjSBgekh6+w9PcBNpsn9CzdgDLsb5ede7fNoL18rNXnoFjCi1AgZ5KocGo92cQPdqCw==", - "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "KVfZCbChNuMZijXH087FjDVGs4jXshfIj4lahpezUmg04DkR5qkrio7jGvPvJVz8rGsseK28eupI90Do2Xt+Dw==", - "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "XqUu52yTF3NgY9kSuDnHhaWXb1MuaLtSJuz3Aff+h60iTtcPzjSrPw+wLRncf87BHekB/czViEYikTgqVyrgDg==", - "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "2OwIYW90eoo7Ym34CbeFREjETgP3EvlijyWxL3vNYwU4c1hCp9QPJ/17pG7r5w9FjdK/hZzgTo2Xxyxz3GMyCg==", - "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "YbF2/FHGNB90lTUSQO7lx4MyThoaSJXZ/sXkTeKOc3DJrv/22hoNq/VlXqhFg/IZ1In5DcyRgEyMNp6GK6zjAw==", - "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "NXKmudsdaPlY+yXjafjLizXHnVtmspQoxTRUZ+k+am0HLE8pSAjXiussX+HsHZ1OUhN1KgYs2TeMiXRcIr0qAg==", - "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "Ch2bR2MPyeyrZYYe/2qcOZe84iDgtFIt4zRl1O+xDZXJrcUmZ8Q9327n0MO91Fw1nkNLjtT5s40/eB8y+IngCA==", - "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "ffxwqf1uWlPbAt/aBlmcTwcr1BAOJTBmfbOFWfZnzrCSxrsv+muX8JXp2VI9uZHQ4YtgzqXbOdF4mdzJslQ1Cg==", - "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "TcewpD48/oO4f+JhAmN5boXabdScpA6pLr1KcI8MB4NeLurFocISNmmJx66KczRRkVKhyTB8KTXN1qVUCAP5BA==", - "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "GektayZTWTUawXwr3dobxYniNfsb6TK574UmQSQnUBNKskOsS4id+4H1xz6oAWb3SrXsG8RgvdBRTrKUtzXuBg==", - "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "YoeFaTgAWR8Hoqpvb0prieEoRq1rNQq1LgpFN/uGoPSQY9J+pihTYMJ375RcO552G9UImtosAzKnlg45KSahAA==", - "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "LBEeciHykYL/oUDY44PbfepASHC+Ye9w19JdxN5KTBt2HdXH5rxqYqcuZdKIX4LuDtMfnOxvWzKEfGAzr+iNDw==", - "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "TvFMKPdVpOMOpTZex6enVpZN4KIAenz9LpLrwj55WY2ba4zn0SlUXvAdQVlr4QLV8R8HaGvI+8BDwdSAa9irCA==", - "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "5BTV95k52NKkop6eNkl3DQKqiiQD1TIysjP7+nzrYlWuf6/w6OLvu/0J4ZplojCdXKvrVOLBQo/c/n9p5qF9Dg==", - "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "Deepl4pPInDReIdeTeujBmxc73wzzMGqjhNNwZoumQ/pUuRtG27QCpMKTYgf7dDI6HwNtxbfvapDlzezeKRsDQ==", - "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "umqH+MbkA6WGHdOMrA5Le8lyC1j8KF+JrbwnRFI7OaOOUiY+ENBg2gHjgdNRM6Q9373GjrVvdNB5MK4zLJLuAA==", - "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "p1EIJ28bitg0sci8UfXLAGxiIhi08CkMNy9J5FpJ5S9GSlSBJBAi9H8Wb818mwdset638UaDv3Dk3SRB7qUlDA==", - "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "RMBckUaRqo9QzIIUvJT3JrWu1iZ1HtTO4e6REiiFLvyo2I9d8tBGSVaBmjKRoYR+Sv47ml9ER2t2AsD5XkicDg==", - "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "PGUQnKQcPz6vPNJ3trFJ1GZPWiNRxfYZXsYDDgvUN99Z+m74aCUkXJ9ACmzUT/wFKcuqfgga9GJEOWvAfHGMDw==", - "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "LmTDMoU6duKAOJWS7bw1d52z4ByPHbpxWbOaEGk1wmM70FNzmWB4Cf73AtqgliXKkNCmknYdnxjhx3ynLre8BQ==" + "python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "/YL6W76Q7ejmJvQraTclgzsGxYGpYbSBF3qql0E8Z40MZBQcm8wy+9mrMm1en5W9xGebuaT5xN2+Rji5MUCrDQ==", + "python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "0/MsPs9cfZy51uqtyCEK8/U8paw+eQXgqVnglRdUM3Xx6WaPTku3DXfx7MquCTXl+ia9XlM1xdaH/ax6zxhdAw==", + "python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "1i1wEWih2NTsQ9jgK/cpb8V/B0y5prTk/OHG1wu4qoaMx4Qm1gVm6KAWU7rkvaQHMqC5eZG5lgL7O6tGflgOBA==", + "python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "Q0TBxMRrSRv99t5NIpcYgwRcj26IycOSUSX+Yh4f4S82hY3dXwME3XSqWFLaL2wNF+uG7dMZr0pZkZnHBHmaDg==", + "python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "wFMRv5A2/dCAjlBC/x5uN876dq/kMrgMg5F7nmOKjDlrC5lZ014MbZXU0BKzI49CSch9uU3TLbvUR1p9gWPcBA==", + "python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "de2W5b0SVEEAhjf9r1Ht9tg6W4RWldp7Tc/IzUQdphK4XBOzqouXIYCItN5xgEbc1tFTmGgKu2pfMXAoXkgYDw==", + "python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "yEkA8O096lTrh5YTvZgmuGpyuZ0vTnZDvLnLGR7dhBfypiNPsF4dxp2bcgDpz14GRKPHKa3v8O2v/G/06lk4CQ==", + "python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "fpzjKBczfi9su9/BzPINkMJ8+Qx2KljBmYg/lhpaCRZDQX9kIT2qgcgbu5CqahfEQAjWDH2YKDwRhAGzkx1LBw==", + "python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "mUUGiu3/nIkcp9McjoX+qOTzBwuJlFzxxZdbW3uU2C4ppAlQ+bYMz9p33qnmkUiJUGfjcBwFnJebL8AXo/kXBQ==", + "python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "Nge3RnzUjW2gPUjEyBRxh+D6frwx9dJ/N9W0e0vzFWLLvbo+cT5zjrNAT7buA7XAKGfHSy14ssOxL8Jz+uZBBw==", + "python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "KXjqWoG0lsVWqK8uRhOOChREx/ThGtcdKoFxaDD2WpGtEoFBTz2fDsNP8lgyLcrH+9ETT6ggnXqHMf2SnEabBw==", + "python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "+0ZLw/tXrJtcempSJZFTKz9vlzs7q13YrnzSkuSpHzaGUm4Z2l4H3Syy0rPj3iJ8OLbkMAE9LegxScVq9mb1Bg==", + "python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "Q44rxaPzw1QoSLoHyoaCMtW9N45YeYUNhtgPETz6Z1zLJ5o9NPec6yP06673sX9xdOnRXr0maeLfI2ji7iFiBg==", + "python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "MUg6v8qvb7Rhhk5LPoU7krD0CKb39e8wsoh5ER+VvzWYJZ2fnra7Od14xSGfhFZoHIItPwtOlASUbqlbPKReCg==", + "python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "ERRMJ3hrOhetsuiNyWrsXH6hwtKzw5CAjg8kB/025JkDyA4OR3yLGMnqXqryygc4r4onUUF0Q55SzTbxxHWzDA==", + "python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "+gyiBvn9Uz56mpHovmDtUsNxvlnPYLH8/v5J+f0o8nr/E26f1xvSk2yQbYwYrCeZZ8AOxgY6GmdGRnkly4WCCg==", + "python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "Y/cinSdkb/kWX44T/w4woXX/Ex9+Q1KPtUC318dtygZeTiHDjCM+0IUjfS/BXwbdKETQPEpyIoKLsJaP2Gk1Cw==", + "python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "N+JrGIiTUzESxzH9fdgub5y01psxzlmEw75Y1AuxQqFx7mG4Z+Tx20UeeyQtAw27UuOctiKpGPHq9trtijJwBA==", + "python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "1MxRuPAWgjtsNORklvPZBml0OOVqIu8vMluY0QlK/pqE3S8EoC28/Gn39Bhb6hMjk8yTAUaTnTn4HlwkENpvBA==", + "python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "Uxa3OMIwXvFEYz1LP+UDWB1sVhi4z8yC9bP+Xypzw26LNRAMkJZta2r+drXGPEe1TFg4zgVWrb9Q1+Y3pA9HAQ==" } } 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 ff6fbf9..fd5714b 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 bee68c1..6ca54cd 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 cea412a..d3289e5 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 fbf8bcf..e5e41c0 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 e9eae2e..9d49c2e 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/flockd/flockd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so index 3fd6b50..fa473b5 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so index a06e111..2c9d5c6 100755 Binary files a/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_hephaestusd_private/python/iqpilot_private/konn3kt/flockd/signatures.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 c9ec5a1..1ec16bf 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 0102db9..38cd773 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 8b3cd99..36dad6a 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 a512726..4d3b251 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 2b1a1ec..a835701 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 b0ebeac..93cc0c0 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 93abd53..1b74130 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 7f7e205..448a7ba 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 3f82cc5..d7538b5 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 2a5d4ba..9f88ebd 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 3cc555e..1abab6f 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 ab9c9d1..70c0105 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 553f3f2..8736d63 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 a1d6870..06a0c1d 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/artifacts/iqpilot_navd_private/manifest.json b/artifacts/iqpilot_navd_private/manifest.json index 2cc44f7..e64b1c5 100644 --- a/artifacts/iqpilot_navd_private/manifest.json +++ b/artifacts/iqpilot_navd_private/manifest.json @@ -6,7 +6,7 @@ }, "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "8b6114f67eb7a83d47e90113a0e75801ffd55d6c732d1db9a6af620f3cfba1d8", + "sha256": "449495db52a85f8d0b0e2bb3128ee480598f8bdb5a44ec13153877fe8b372a91", "size": 67616 }, "python/iqpilot_private/navd/__init__.py": { @@ -16,72 +16,72 @@ }, "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "4ebabfe3b85a380441cb22730ea3779c3c477e7ec40a88d0ba4d8130a2827877", + "sha256": "ae2b25f52f7c7b02f3c977bbf46f5e9e938bfeda78bdb60f2f897eb04d698e43", "size": 136944 }, "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "7506530560907e8a39e54c05c988c5be3b86bbdaa5279059ada9d847d1e2889c", + "sha256": "f6ad0590f2a0bdbed56e7126203df2f6cdad86074f76ab9dded38b9e1600c8af", "size": 135936 }, "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "905391fcf31991b315abe6126797bc870066352596cd2e9574b289a9c0f386be", + "sha256": "b4ed48cada1dfb3383ff8ee106a7d93967bf65115d4c528b60dc3d73112a2f0e", "size": 135608 }, "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "33f91bfad8894347729d4fd072e8a81af766240e5ec8921de0f92230e3d5faf1", + "sha256": "e68aca6829cb00c5eda5330e1dfedd6269381ea5831abaca1055adf6df1f53ff", "size": 69728 }, "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "4572bb1d704de4b9919d4e81e7c28d64197dadbdd8d84f4f1a203ad924d000f6", + "sha256": "ebd30c5c34fbbe82d7d24343a2e791919e526997d192fd1441df749b15526704", "size": 68088 }, "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "5087cd98a1bf042e0f3d19021af43a0d12ae0ce3f502158a0f4d3a0ace2bbabe", + "sha256": "6e69c5fcac3c302e401b3ed3735b42f3de4af4e0d188d15a7add7aa02920f4c5", "size": 135440 }, "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "f26cb01eaad63b14c686932496a62a3ec5aef1ebb4f36fb46680c124c77e0e16", - "size": 664448 + "sha256": "55c88f8c5996dd7094c0feaf454fe0f1aec97276aed8926d7e8f6d1597de5a83", + "size": 664480 }, "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "3e4a79640333390203e50fb226b00b72aa97a78637544e0f616ed54547c40489", + "sha256": "b971e1093f5713a633636d6ee74891206a2d5abfb492406c7ae5df7a66bdc0d9", "size": 135560 }, "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "cc7040441e8ce97be6ba7bdb371761e7f14c3caf99ab15bf343635a69f4e0fb1", + "sha256": "882ccc23c3de2e4e34c685a7abb00075f6c5be634eaf7e81cab86461c624449d", "size": 136368 }, "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "2b9357dd886231d18e4a9b180b91ea2747f5fa23d91d2d349e032286ea330db2", + "sha256": "df0bf89d492dba3b6c3792dde1bcb30a60e692f62519be7c62a517ef514ec276", "size": 136072 }, "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "3a85759d30234271a83a9473d6d18af74d672c892f686b5d082e9b6df1b70159", + "sha256": "0311a1fbde1510b31055606db21a7c5f74e6872f9f1aabd6fb4a0a501395eaef", "size": 600528 }, "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "2423bca9e7637997d1b6a86365cbc9e9a7d47c89f96aa21be4de32a898ad795c", + "sha256": "1f08c7c462b4cb08a8de9140d968ef5dc74b31afffe16c9f8fad4e0271bec6cc", "size": 135752 }, "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "12b333b4c8904483cae4bae1346016b24b9bee0866d332b2b61dc9fbc30a14b7", + "sha256": "aea71be79c99884a0aeaaf8e5c0f70e37bb4f0c0123025cd07df830189774ba9", "size": 69832 }, "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": { "mode": 493, - "sha256": "3954330e8004abad9dd31f3a02b57306dc7e83e73ee0ba4072b1b4ecc7f88dfc", + "sha256": "5c7dd6ef7dafb9a35662ee3d22c08b17b02807df736bf146af88cb260f5bbf09", "size": 201384 }, "runtime": { @@ -105,20 +105,20 @@ } }, "signatures": { - "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": "j3fNuxY5XzC219Okj5DV4kId8oUAKcwTcZhwLpp8S/kWXpFv4gHo43Van3A+OkWPFa50ZvKqWH7WhoQc8IgPBw==", - "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": "+Pj9wj6MC4cZ8YxZvvT4XlrzS/N6gVDf5LGZ6kkWiJhVuolBW4ey5KSjbggp4NSIiZWi9aARMZfGsWabQi+nDA==", - "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": "KYCV1qnZ8+mrne7n0H7x+kTu8x/U9H71SXYZt3URy/yIgdtTTXkSS6IQs1UvusfMHzRdBGcT58ado3UcLpsNAg==", - "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": "qC8oELP8nBJSvaDsCMo7/JqoiqCZBJa/LeUE0b36DdkT7kzHSLQ+MuGP5Vc8ms8VowBh447LaLq2WWURGB/fAQ==", - "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": "6kFnnmSPQPXe1HuiBL14HrPx5cr2XmOYzTcESKHvt7DAL7M5tMKy0BWufo34F/LH4MYXQu1/k5TyzHt4wQ7jBw==", - "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": "F0JFe9uN7YtdFvtSwHXPch4l6Cz7yWTOtKPHOdBxqk9CkHh0vfO2d4EAeGTpvHINFS5Kf2KcF99qyEhWfr31Ag==", - "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": "7sQ0zXNASjEVBknO94P5wnMifC+8cVAKaBBbQjfbbaV1lsg18mm/rtTOGlFX7NJD23kJFxyLJmJ+wKjRAZXkBg==", - "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": "VTg/Ojx4I8+JJz+vf9gDwUSBY9MCUvIg9wGnNJiQwIKDJr/VkSRoaiM4nMoazauhLEgYpmlfX7C8OEAWswKhBQ==", - "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": "4i882AjYz/zCgoGlr1LGNcVGfzyybHPMOL0aKva8VNsHBEtMbnnetecRBurtAzlU6O8+p89gY1GNDaJfyi7OAQ==", - "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": "hO9yDTiAaidM3yQCfh4J8vP54R2z42ejhkqU8E6l+wWUXhRrfS4Z6qLyxeQqQGJSPSAMfsWl/yODWogqoH+MDQ==", - "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": "xPCGbuG+pQUqCjBx3NijbInbyo/rRteGLCbhVun2odrw1lGMx4JwzSyNUUsEU7xFPEZ+oZwPUaZcVOHRPnknAw==", - "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": "ZDojmbuEkZUbZ7a56pPvO8hFcYHM5zB9OvGs+r90swvPzU0GRm4SkEiDRLhG6zSyP+vHhJnrsTs+dvyaBkzvCQ==", - "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": "888SP/NpbJtdv2BKbsW7WzuD0pKh2rM50YvS4GlD8brL2xq7a7GPPeKM/b5F+pTzVvS7CbUmELqh3HmeAtOKCw==", - "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": "cmYohrfIfttybS+9x+b9DFzgxyaDGNtgr+olaMWUZ7ytgenB+EvwKAXJHmicFtvBTsKOxYzywKR2zLb71DDFDg==", - "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": "laxlmUb7INupC/eu6k/eok3bXW4c5H7Lui5MDJXLCoSFCiutla374A6rN8Dh+g3AcSY2NfLBzrnyqQDqQH0KBw==" + "python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so": "E3+Gd+btNi+4qFqM+nFMfWgCLJhP21ZgIwZrE/CJjqafB1htd/qOhh9QtrulS46HW5geZ/nwW3jlxPbFeNubBw==", + "python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so": "hHQQCCPcxRXdO9vko9476AYbgbfNwhi9bVYpoOzQQStPC8DbIO0QN/RRzaJVGr2kgJGZlXDmnGl85m7EHgC1BA==", + "python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so": "Wz5yfWlMeoASj274KqrCWwEJD/wtm5WyxLenceYu7MkXaMlN1QyztvJhq8Y8K8Jfis7R5fQ/aAnlsQgWTIVEBg==", + "python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so": "6WFWUXmkyy21rh/9xa7s7S7CTiCRnywOahU859T6iP0447NkVxHRYmXAVCH1/vRDPXASHRNPyUk8oSDLIGK1Ag==", + "python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so": "ZUsjQ/AGPa5pVKAv3IkycDPIVBWh+4jBNor/xrUi7BBPHki8G6T1grv3exeHhr2WF2JiqN727ge3JaqvlU1KDQ==", + "python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so": "t+VHmWhxf7oKcR5e+tJe6hPKy6xz0bMY84WEhujwcwBlWgIXscfc9aNSP6e4N7GITW7cOn+RlDRTTfwQsA6PDA==", + "python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so": "qOrpSi2I+aFLKN4WjBljfzbk2U1rvOgDuyV+p7IvshugeUOoqTKiYYSG9xwyi2/eB/syyfiVFoqAg+ETFXXPDA==", + "python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so": "PcFJWRYrb52pJCbTdsAPm3IC0OR9zt/7P0uc1GlQr4CVGvzfXukbnt/7sSeL8T29w7drf9MfGkpRe4BjbWwtDw==", + "python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so": "gp1noPJ35MRVcQL3t4wKbsEH0L0+n9Yf8Zty+VCY7uy9EsK8211kW2YIw7Lcyw879VLLbVntHIWz/BMankSeAw==", + "python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so": "N6yH0R8V/Cw1J3hYPfFeZXByolRwtACwNe2wHMzPEQ69UTWnSNFRXWjOLCEvtwB8Z+iglAqFx8uztZ6wXZKUCQ==", + "python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so": "oQQU70Yp8wzkqB9Ktm2KDEHNVZfB3otqIoG2mkqQNh6QdtVKXraIv6cAbt2Zjob5914C06El2z+NPZQE5NjODQ==", + "python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so": "ayPdxCUGA/o+AavLMd9mGDY6zYnZk54gAEVaMQXFYlztjXiREC+IEmV1iETOYcsEFAxr8qtUFfcwZ3p7rXljCw==", + "python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so": "Rh0wUjYjRabedjFSnsE9BAjILjA1+RHMdfuCqTye1AlhFlXVUQMRo6Ier6Z71kyiOYw+CXCOrHUF9fP69cP4DQ==", + "python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so": "13bqig90oceup9ovo8weu9UpdQN/l/pq7REFm8dwwgqquuh8jJFkzNz7dvIhDlaxIGAQwzWJe4+QzIQfhg0jAA==", + "python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so": "Vm1Inx4XY0BOmLuNizOCRNAl4tPDcvJ/4A+TwVSr1cZuMg7pg1jeFg613e6cFM6t08hYvPsysXc2+gD69zkcBA==" } } diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so index a123f65..d69fb38 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/__init__.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so index fa748f0..5484413 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/event_builder.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so index 0ad349d..d89198b 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/helpers.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so index bd4f8fb..471549c 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/iqmapd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so index 9d5c8f7..aa22559 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/long_decel.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so index dc84dd8..ed72552 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/mapbox_client.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so index 57c9b15..eebfd4e 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/nav_cameras.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so index 9dd9504..a71abd7 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so index a43f871..e768be8 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/navrenderd.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so index f832f63..e375d95 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/osm_cameras.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so index f376f1f..f50b415 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/reroute.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so index 42d05da..358a74a 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/route_manager.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so index 46f26ee..ac3768f 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/runtime_common.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so index 06db4bf..c873141 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/turn_desire.cpython-312-aarch64-linux-gnu.so differ diff --git a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so index bd8e589..0c2597f 100755 Binary files a/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so and b/artifacts/iqpilot_navd_private/python/iqpilot_private/navd/web_server.cpython-312-aarch64-linux-gnu.so differ diff --git a/cereal/custom.capnp b/cereal/custom.capnp index eeb6cdb..4b65a94 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -242,8 +242,8 @@ struct IQPlan @0xda401323ae805f2b { } struct E2eAlerts { - greenLightAlert @0 :Bool; - leadDepartAlert @1 :Bool; + pathOpen @0 :Bool; + leadPullaway @1 :Bool; } } diff --git a/common/params_keys.h b/common/params_keys.h index 7b773df..de2194c 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -171,12 +171,12 @@ inline static std::unordered_map keys = { {"DeviceBootMode", {PERSISTENT, INT, "0"}}, {"IQDevUIInfo", {PERSISTENT, INT, "0"}}, {"EnableEsimProvisioning", {PERSISTENT, BOOL, "1"}}, - {"GreenLightAlert", {PERSISTENT, BOOL, "0"}}, + {"EndToEndAlert", {PERSISTENT, BOOL, "0"}}, {"InteractivityTimeout", {PERSISTENT, INT, "0"}}, {"IsDevelopmentBranch", {CLEAR_ON_MANAGER_START, BOOL}}, {"IsReleaseIqBranch", {CLEAR_ON_MANAGER_START, BOOL}}, {"LastGPSPositionIQLoc", {PERSISTENT, STRING}}, - {"LeadDepartAlert", {PERSISTENT, BOOL, "0"}}, + {"EndToEndLeadAlert", {PERSISTENT, BOOL, "0"}}, {"LongIncrementsEnabled", {PERSISTENT, BOOL, "0"}}, {"LongIncrementTapStep", {PERSISTENT, INT, "1"}}, {"LongIncrementHoldStep", {PERSISTENT, INT, "5"}}, diff --git a/iqdbc_repo/conftest.py b/iqdbc_repo/conftest.py index 4b01283..cf76ee3 100644 --- a/iqdbc_repo/conftest.py +++ b/iqdbc_repo/conftest.py @@ -4,6 +4,61 @@ collect_ignore_glob = [ "iqdbc/safety/tests/misra/cppcheck/", ] +# --- host test harness ------------------------------------------------------- +# tesla/volkswagen carstate+carcontroller import the closed-source ALC / odometer +# runtime via import_verified_module(), which gates on a rootfs integrity manifest +# that only exists on-device. Off-device (host CI / dev), install minimal stubs so +# the whole car interface set is importable and test_car_interfaces can collect and +# run. On-device the manifest is present and these stubs are never installed, so the +# real verified modules are used. +import os as _os + +if not _os.path.exists("/usr/libexec/iqpilot/runtime_integrity.json"): + import sys as _sys + import types as _types + + def _stub_module(name, attrs): + mod = _types.ModuleType(name) + for key, value in attrs.items(): + setattr(mod, key, value) + _sys.modules[name] = mod + + _noop = lambda *args, **kwargs: None # noqa: E731 + + class _VehicleOdometerStoreStub: + def __init__(self, *args, **kwargs): + pass + + def record(self, km): + return km + + _stub_module("iqpilot_private.konn3kt.iqlvbs.vehicle_state", + {"VehicleOdometerStore": _VehicleOdometerStoreStub}) + _stub_module("iqpilot_private.konn3kt.iqlvbs.alc", { + "angle_lateral_control_enabled": lambda *a, **k: False, + "update_vw_alc": _noop, + "append_private_apd": _noop, + "update_mqb_carstate_alc_state": _noop, + "update_mlb_carstate_alc_state": _noop, + "update_pq_carstate_alc_state": _noop, + }) + _stub_module("iqpilot_private.konn3kt.iqlvbs.iqlvbs_commander", { + "update_turn_signals": _noop, + }) + _stub_module("iqpilot_private.konn3kt.hephaestus.vw_pq_flasher", {}) + + try: + from openpilot.system.proprietary_runtime import _verified_import as _vi + _real_import_verified_module = _vi.import_verified_module + + def _import_verified_module(bundle, module): + return _sys.modules.get(module) or _real_import_verified_module(bundle, module) + + _vi.import_verified_module = _import_verified_module + except Exception: + pass +# --- end host test harness --------------------------------------------------- + _ABSTRACT_BASES = frozenset(("CarSafetyTest", "AolSafetyTestBase", "SafetyTest", "SafetyTestBase")) def _method_from_base(cls, method_name): diff --git a/iqdbc_repo/iqdbc/car/car_helpers.py b/iqdbc_repo/iqdbc/car/car_helpers.py index 4266927..1c69e32 100644 --- a/iqdbc_repo/iqdbc/car/car_helpers.py +++ b/iqdbc_repo/iqdbc/car/car_helpers.py @@ -11,7 +11,7 @@ from iqdbc.car.mock.values import CAR as MOCK from iqdbc.car.values import BRANDS from iqdbc.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN -from iqdbc.iqpilot.car.interfaces import setup_interfaces as iqpilot_interfaces +from iqdbc.lvbs.car.interfaces import apply_iq_car_config as iqpilot_interfaces FRAME_FINGERPRINT = 100 # 1s diff --git a/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py b/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py index 1fcd239..1e62de3 100644 --- a/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/chrysler/carcontroller.py @@ -5,9 +5,9 @@ from iqdbc.car.chrysler import chryslercan from iqdbc.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags, RAM_DT from iqdbc.car.interfaces import CarControllerBase -from iqdbc.iqpilot.car.chrysler.carcontroller_ext import CarControllerExt -from iqdbc.iqpilot.car.chrysler.aol import AolCarController -from iqdbc.iqpilot.car.chrysler.values_ext import ChryslerFlagsIQ +from iqdbc.lvbs.car.chrysler.carcontroller_ext import CarControllerExt +from iqdbc.lvbs.car.chrysler.aol import AolCarController +from iqdbc.lvbs.car.chrysler.values_ext import ChryslerFlagsIQ class CarController(CarControllerBase, AolCarController, CarControllerExt): diff --git a/iqdbc_repo/iqdbc/car/chrysler/carstate.py b/iqdbc_repo/iqdbc/car/chrysler/carstate.py index 70d4448..83c0cb1 100644 --- a/iqdbc_repo/iqdbc/car/chrysler/carstate.py +++ b/iqdbc_repo/iqdbc/car/chrysler/carstate.py @@ -4,8 +4,8 @@ from iqdbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS from iqdbc.car.common.conversions import Conversions as CV from iqdbc.car.interfaces import CarStateBase -from iqdbc.iqpilot.car.chrysler.carstate_ext import CarStateExt -from iqdbc.iqpilot.car.chrysler.aol import AolCarState +from iqdbc.lvbs.car.chrysler.carstate_ext import CarStateExt +from iqdbc.lvbs.car.chrysler.aol import AolCarState ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py b/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py index ccfa863..87d1e5f 100644 --- a/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py +++ b/iqdbc_repo/iqdbc/car/chrysler/fingerprints.py @@ -2,8 +2,8 @@ from iqdbc.car.structs import CarParams from iqdbc.car.chrysler.values import CAR -from iqdbc.iqpilot.car.fingerprints_ext import merge_fw_versions -from iqdbc.iqpilot.car.chrysler.fingerprints_ext import FW_VERSIONS_EXT +from iqdbc.lvbs.car.fingerprints_ext import extend_fw_versions +from iqdbc.lvbs.car.chrysler.fingerprints_ext import FW_VERSIONS_EXT Ecu = CarParams.Ecu @@ -789,4 +789,4 @@ FW_VERSIONS = { }, } -FW_VERSIONS = merge_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/iqdbc_repo/iqdbc/car/chrysler/interface.py b/iqdbc_repo/iqdbc/car/chrysler/interface.py index cde33e3..de41141 100755 --- a/iqdbc_repo/iqdbc/car/chrysler/interface.py +++ b/iqdbc_repo/iqdbc/car/chrysler/interface.py @@ -5,7 +5,7 @@ from iqdbc.car.chrysler.carstate import CarState from iqdbc.car.chrysler.radar_interface import RadarInterface from iqdbc.car.chrysler.values import CAR, RAM_HD, RAM_DT, RAM_CARS, ChryslerFlags, ChryslerSafetyFlags from iqdbc.car.interfaces import CarInterfaceBase -from iqdbc.iqpilot.car.chrysler.values_ext import ChryslerFlagsIQ +from iqdbc.lvbs.car.chrysler.values_ext import ChryslerFlagsIQ class CarInterface(CarInterfaceBase): diff --git a/iqdbc_repo/iqdbc/car/ford/carstate.py b/iqdbc_repo/iqdbc/car/ford/carstate.py index ee4bdec..6c23161 100644 --- a/iqdbc_repo/iqdbc/car/ford/carstate.py +++ b/iqdbc_repo/iqdbc/car/ford/carstate.py @@ -5,7 +5,7 @@ from iqdbc.car.ford.fordcan import CanBus from iqdbc.car.ford.values import DBC, CarControllerParams, FordFlags from iqdbc.car.interfaces import CarStateBase -from iqdbc.iqpilot.car.ford.aol import AolCarState +from iqdbc.lvbs.car.ford.aol import AolCarState ButtonType = structs.CarState.ButtonEvent.Type GearShifter = structs.CarState.GearShifter diff --git a/iqdbc_repo/iqdbc/car/gm/carstate.py b/iqdbc_repo/iqdbc/car/gm/carstate.py index bd190d6..87aecd3 100644 --- a/iqdbc_repo/iqdbc/car/gm/carstate.py +++ b/iqdbc_repo/iqdbc/car/gm/carstate.py @@ -5,8 +5,8 @@ from iqdbc.car.common.conversions import Conversions as CV from iqdbc.car.interfaces import CarStateBase from iqdbc.car.gm.values import DBC, AccState, CruiseButtons, STEER_THRESHOLD, SDGM_CAR, ALT_ACCS -from iqdbc.iqpilot.car.gm.carstate_ext import CarStateExt -from iqdbc.iqpilot.car.gm.values_ext import GMFlagsIQ +from iqdbc.lvbs.car.gm.carstate_ext import CarStateExt +from iqdbc.lvbs.car.gm.values_ext import GMFlagsIQ ButtonType = structs.CarState.ButtonEvent.Type TransmissionType = structs.CarParams.TransmissionType diff --git a/iqdbc_repo/iqdbc/car/gm/fingerprints.py b/iqdbc_repo/iqdbc/car/gm/fingerprints.py index 37d8c57..3705935 100644 --- a/iqdbc_repo/iqdbc/car/gm/fingerprints.py +++ b/iqdbc_repo/iqdbc/car/gm/fingerprints.py @@ -2,8 +2,8 @@ """ AUTO-FORMATTED USING iqdbc/car/debug/format_fingerprints.py, EDIT STRUCTURE THERE.""" from iqdbc.car.gm.values import CAR -from iqdbc.iqpilot.car.fingerprints_ext import merge_fingerprints -from iqdbc.iqpilot.car.gm.fingerprints_ext import FINGERPRINTS_EXT +from iqdbc.lvbs.car.fingerprints_ext import extend_fingerprints +from iqdbc.lvbs.car.gm.fingerprints_ext import FINGERPRINTS_EXT # Trailblazer also matches as a SILVERADO, TODO: split with fw versions # FIXME: There are Equinox users with different message lengths, specifically 304 and 320 @@ -78,4 +78,4 @@ FINGERPRINTS = { FW_VERSIONS: dict[str, dict[tuple, list[bytes]]] = { } -FINGERPRINTS = merge_fingerprints(FINGERPRINTS, FINGERPRINTS_EXT) +FINGERPRINTS = extend_fingerprints(FINGERPRINTS, FINGERPRINTS_EXT) diff --git a/iqdbc_repo/iqdbc/car/gm/interface.py b/iqdbc_repo/iqdbc/car/gm/interface.py index 4a682f6..5175ba0 100755 --- a/iqdbc_repo/iqdbc/car/gm/interface.py +++ b/iqdbc_repo/iqdbc/car/gm/interface.py @@ -10,8 +10,8 @@ from iqdbc.car.gm.radar_interface import RadarInterface, RADAR_HEADER_MSG, CAMER from iqdbc.car.gm.values import CAR, CarControllerParams, EV_CAR, CAMERA_ACC_CAR, SDGM_CAR, ALT_ACCS, CanBus, GMSafetyFlags from iqdbc.car.interfaces import CarInterfaceBase, TorqueFromLateralAccelCallbackType, LateralAccelFromTorqueCallbackType -from iqdbc.iqpilot.car.gm.interface_ext import CarInterfaceExt -from iqdbc.iqpilot.car.gm.values_ext import GMFlagsIQ, GMSafetyFlagsIQ +from iqdbc.lvbs.car.gm.interface_ext import CarInterfaceExt +from iqdbc.lvbs.car.gm.values_ext import GMFlagsIQ, GMSafetyFlagsIQ TransmissionType = structs.CarParams.TransmissionType NetworkLocation = structs.CarParams.NetworkLocation diff --git a/iqdbc_repo/iqdbc/car/gm/values.py b/iqdbc_repo/iqdbc/car/gm/values.py index 369083b..4d29e5b 100644 --- a/iqdbc_repo/iqdbc/car/gm/values.py +++ b/iqdbc_repo/iqdbc/car/gm/values.py @@ -6,7 +6,7 @@ from iqdbc.car.structs import CarParams from iqdbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries -from iqdbc.iqpilot.car.gm.values_ext import GMFlagsIQ +from iqdbc.lvbs.car.gm.values_ext import GMFlagsIQ Ecu = CarParams.Ecu diff --git a/iqdbc_repo/iqdbc/car/honda/carcontroller.py b/iqdbc_repo/iqdbc/car/honda/carcontroller.py index 7325b3a..3b6ce37 100644 --- a/iqdbc_repo/iqdbc/car/honda/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/honda/carcontroller.py @@ -8,8 +8,8 @@ from iqdbc.car.honda.values import CAR, CruiseButtons, HONDA_BOSCH, HONDA_BOSCH_ HONDA_BOSCH_TJA_CONTROL, HONDA_NIDEC_ALT_PCM_ACCEL, CarControllerParams from iqdbc.car.interfaces import CarControllerBase -from iqdbc.iqpilot.car.honda.aol import AolCarController -from iqdbc.iqpilot.car.honda.gas_interceptor import GasInterceptorCarController +from iqdbc.lvbs.car.honda.aol import AolCarController +from iqdbc.lvbs.car.honda.gas_interceptor import GasInterceptorCarController VisualAlert = structs.CarControl.HUDControl.VisualAlert LongCtrlState = structs.CarControl.Actuators.LongControlState diff --git a/iqdbc_repo/iqdbc/car/honda/carstate.py b/iqdbc_repo/iqdbc/car/honda/carstate.py index 790a170..4f19e6c 100644 --- a/iqdbc_repo/iqdbc/car/honda/carstate.py +++ b/iqdbc_repo/iqdbc/car/honda/carstate.py @@ -10,7 +10,7 @@ from iqdbc.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, HONDA HondaFlags, CruiseButtons, CruiseSettings, GearShifter, CarControllerParams from iqdbc.car.interfaces import CarStateBase -from iqdbc.iqpilot.car.honda.carstate_ext import CarStateExt +from iqdbc.lvbs.car.honda.carstate_ext import CarStateExt TransmissionType = structs.CarParams.TransmissionType ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/car/honda/fingerprints.py b/iqdbc_repo/iqdbc/car/honda/fingerprints.py index de74ca8..f667c62 100644 --- a/iqdbc_repo/iqdbc/car/honda/fingerprints.py +++ b/iqdbc_repo/iqdbc/car/honda/fingerprints.py @@ -2,8 +2,8 @@ from iqdbc.car.structs import CarParams from iqdbc.car.honda.values import CAR -from iqdbc.iqpilot.car.fingerprints_ext import merge_fw_versions -from iqdbc.iqpilot.car.honda.fingerprints_ext import FW_VERSIONS_EXT +from iqdbc.lvbs.car.fingerprints_ext import extend_fw_versions +from iqdbc.lvbs.car.honda.fingerprints_ext import FW_VERSIONS_EXT Ecu = CarParams.Ecu @@ -1098,4 +1098,4 @@ FW_VERSIONS = { }, } -FW_VERSIONS = merge_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/iqdbc_repo/iqdbc/car/honda/hondacan.py b/iqdbc_repo/iqdbc/car/honda/hondacan.py index 8b8c4d2..f55cd67 100644 --- a/iqdbc_repo/iqdbc/car/honda/hondacan.py +++ b/iqdbc_repo/iqdbc/car/honda/hondacan.py @@ -2,7 +2,7 @@ from iqdbc.car import CanBusBase from iqdbc.car.common.conversions import Conversions as CV from iqdbc.car.honda.values import (HondaFlags, HONDA_BOSCH, HONDA_BOSCH_ALT_RADAR, HONDA_BOSCH_RADARLESS, HONDA_BOSCH_CANFD, CarControllerParams) -from iqdbc.iqpilot.car.honda.values_ext import HondaFlagsIQ +from iqdbc.lvbs.car.honda.values_ext import HondaFlagsIQ # CAN bus layout with relay # 0 = ACC-CAN - radar side diff --git a/iqdbc_repo/iqdbc/car/honda/interface.py b/iqdbc_repo/iqdbc/car/honda/interface.py index bb8a835..80114ca 100755 --- a/iqdbc_repo/iqdbc/car/honda/interface.py +++ b/iqdbc_repo/iqdbc/car/honda/interface.py @@ -11,7 +11,7 @@ from iqdbc.car.honda.carstate import CarState from iqdbc.car.honda.radar_interface import RadarInterface from iqdbc.car.interfaces import CarInterfaceBase -from iqdbc.iqpilot.car.honda.values_ext import HondaFlagsIQ, HondaSafetyFlagsIQ +from iqdbc.lvbs.car.honda.values_ext import HondaFlagsIQ, HondaSafetyFlagsIQ TransmissionType = structs.CarParams.TransmissionType diff --git a/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py b/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py index 98ee868..c9ff133 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/hyundai/carcontroller.py @@ -8,10 +8,10 @@ from iqdbc.car.hyundai.hyundaicanfd import CanBus from iqdbc.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CAR from iqdbc.car.interfaces import CarControllerBase -from iqdbc.iqpilot.car.hyundai.escc import EsccCarController -from iqdbc.iqpilot.car.hyundai.longitudinal.controller import LongitudinalController -from iqdbc.iqpilot.car.hyundai.lead_data_ext import LeadDataCarController -from iqdbc.iqpilot.car.hyundai.aol import AolCarController +from iqdbc.lvbs.car.hyundai.escc import EsccCarController +from iqdbc.lvbs.car.hyundai.longitudinal.controller import LongitudinalController +from iqdbc.lvbs.car.hyundai.lead_data_ext import LeadDataCarController +from iqdbc.lvbs.car.hyundai.aol import AolCarController VisualAlert = structs.CarControl.HUDControl.VisualAlert LongCtrlState = structs.CarControl.Actuators.LongControlState diff --git a/iqdbc_repo/iqdbc/car/hyundai/carstate.py b/iqdbc_repo/iqdbc/car/hyundai/carstate.py index 6b98f38..8321577 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/carstate.py +++ b/iqdbc_repo/iqdbc/car/hyundai/carstate.py @@ -9,10 +9,10 @@ from iqdbc.car.hyundai.hyundaicanfd import CanBus from iqdbc.car.hyundai.values import HyundaiFlags, CAR, DBC, Buttons, CarControllerParams from iqdbc.car.interfaces import CarStateBase -from iqdbc.iqpilot.car.hyundai.carstate_ext import CarStateExt -from iqdbc.iqpilot.car.hyundai.escc import EsccCarStateBase -from iqdbc.iqpilot.car.hyundai.aol import AolCarState -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.carstate_ext import CarStateExt +from iqdbc.lvbs.car.hyundai.escc import EsccCarStateBase +from iqdbc.lvbs.car.hyundai.aol import AolCarState +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py b/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py index b518a49..e526389 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py +++ b/iqdbc_repo/iqdbc/car/hyundai/fingerprints.py @@ -2,8 +2,8 @@ from iqdbc.car.structs import CarParams from iqdbc.car.hyundai.values import CAR -from iqdbc.iqpilot.car.fingerprints_ext import merge_fw_versions -from iqdbc.iqpilot.car.hyundai.fingerprints_ext import FW_VERSIONS_EXT +from iqdbc.lvbs.car.fingerprints_ext import extend_fw_versions +from iqdbc.lvbs.car.hyundai.fingerprints_ext import FW_VERSIONS_EXT Ecu = CarParams.Ecu @@ -1286,4 +1286,4 @@ FW_VERSIONS = { }, } -FW_VERSIONS = merge_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py b/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py index b4ed091..70d6f34 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py +++ b/iqdbc_repo/iqdbc/car/hyundai/hyundaican.py @@ -1,8 +1,8 @@ import crcmod from iqdbc.car.hyundai.values import CAR, HyundaiFlags -from iqdbc.iqpilot.car.hyundai.escc import EnhancedSmartCruiseControl -from iqdbc.iqpilot.car.hyundai.lead_data_ext import CanLeadData +from iqdbc.lvbs.car.hyundai.escc import EnhancedSmartCruiseControl +from iqdbc.lvbs.car.hyundai.lead_data_ext import CanLeadData hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf) diff --git a/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py b/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py index bc8c103..a018a03 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py +++ b/iqdbc_repo/iqdbc/car/hyundai/hyundaicanfd.py @@ -3,7 +3,7 @@ import numpy as np from iqdbc.car import CanBusBase from iqdbc.car.crc import CRC16_XMODEM from iqdbc.car.hyundai.values import HyundaiFlags -from iqdbc.iqpilot.car.hyundai.lead_data_ext import CanFdLeadData +from iqdbc.lvbs.car.hyundai.lead_data_ext import CanFdLeadData class CanBus(CanBusBase): diff --git a/iqdbc_repo/iqdbc/car/hyundai/interface.py b/iqdbc_repo/iqdbc/car/hyundai/interface.py index 9282d9d..fbc20a4 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/interface.py +++ b/iqdbc_repo/iqdbc/car/hyundai/interface.py @@ -10,9 +10,9 @@ from iqdbc.car.hyundai.carcontroller import CarController from iqdbc.car.hyundai.carstate import CarState from iqdbc.car.hyundai.radar_interface import RadarInterface -from iqdbc.iqpilot.car.hyundai.escc import ESCC_MSG -from iqdbc.iqpilot.car.hyundai.longitudinal.helpers import get_longitudinal_tune -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ, HyundaiSafetyFlagsIQ +from iqdbc.lvbs.car.hyundai.escc import ESCC_MSG +from iqdbc.lvbs.car.hyundai.longitudinal.helpers import get_longitudinal_tune +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ, HyundaiSafetyFlagsIQ ButtonType = structs.CarState.ButtonEvent.Type Ecu = structs.CarParams.Ecu diff --git a/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py b/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py index c2ed03c..3616bcc 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py +++ b/iqdbc_repo/iqdbc/car/hyundai/radar_interface.py @@ -5,7 +5,7 @@ from iqdbc.car import Bus, structs from iqdbc.car.interfaces import RadarInterfaceBase from iqdbc.car.hyundai.values import DBC -from iqdbc.iqpilot.car.hyundai.radar_interface_ext import RadarInterfaceExt +from iqdbc.lvbs.car.hyundai.radar_interface_ext import RadarInterfaceExt RADAR_START_ADDR = 0x500 RADAR_MSG_COUNT = 32 diff --git a/iqdbc_repo/iqdbc/car/hyundai/values.py b/iqdbc_repo/iqdbc/car/hyundai/values.py index 459581d..e2434dd 100644 --- a/iqdbc_repo/iqdbc/car/hyundai/values.py +++ b/iqdbc_repo/iqdbc/car/hyundai/values.py @@ -8,7 +8,7 @@ from iqdbc.car.structs import CarParams from iqdbc.car.docs_definitions import CarHarness, CarDocs, CarParts, SupportType from iqdbc.car.fw_query_definitions import FwQueryConfig, Request, p16 -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ Ecu = CarParams.Ecu diff --git a/iqdbc_repo/iqdbc/car/interfaces.py b/iqdbc_repo/iqdbc/car/interfaces.py index 1358aad..e61f667 100644 --- a/iqdbc_repo/iqdbc/car/interfaces.py +++ b/iqdbc_repo/iqdbc/car/interfaces.py @@ -18,7 +18,7 @@ from iqdbc.car.values import PLATFORMS from iqdbc.can import CANParser from iqdbc.car.carlog import carlog -from iqdbc.iqpilot.car.interfaces import CarInterfaceBaseIQ +from iqdbc.lvbs.car.interfaces import CarInterfaceBaseIQ GearShifter = structs.CarState.GearShifter ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/car/nissan/carstate.py b/iqdbc_repo/iqdbc/car/nissan/carstate.py index 517c314..acf10f1 100644 --- a/iqdbc_repo/iqdbc/car/nissan/carstate.py +++ b/iqdbc_repo/iqdbc/car/nissan/carstate.py @@ -5,7 +5,7 @@ from iqdbc.car import Bus, create_button_events, structs from iqdbc.car.common.conversions import Conversions as CV from iqdbc.car.interfaces import CarStateBase from iqdbc.car.nissan.values import CAR, DBC, CarControllerParams -from iqdbc.iqpilot.car.nissan.carstate_ext import CarStateExt +from iqdbc.lvbs.car.nissan.carstate_ext import CarStateExt ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/car/nissan/interface.py b/iqdbc_repo/iqdbc/car/nissan/interface.py index d06218e..a7b680a 100644 --- a/iqdbc_repo/iqdbc/car/nissan/interface.py +++ b/iqdbc_repo/iqdbc/car/nissan/interface.py @@ -3,7 +3,7 @@ from iqdbc.car.interfaces import CarInterfaceBase from iqdbc.car.nissan.carcontroller import CarController from iqdbc.car.nissan.carstate import CarState from iqdbc.car.nissan.values import CAR, NissanSafetyFlags -from iqdbc.iqpilot.car.nissan.values import NissanSafetyFlagsIQ +from iqdbc.lvbs.car.nissan.values import NissanSafetyFlagsIQ class CarInterface(CarInterfaceBase): CarState = CarState diff --git a/iqdbc_repo/iqdbc/car/rivian/carcontroller.py b/iqdbc_repo/iqdbc/car/rivian/carcontroller.py index 81f3954..5b9638b 100644 --- a/iqdbc_repo/iqdbc/car/rivian/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/rivian/carcontroller.py @@ -6,7 +6,7 @@ from iqdbc.car.interfaces import CarControllerBase from iqdbc.car.rivian.riviancan import create_lka_steering, create_longitudinal, create_wheel_touch, create_adas_status from iqdbc.car.rivian.values import CarControllerParams -from iqdbc.iqpilot.car.rivian.aol import AolCarController +from iqdbc.lvbs.car.rivian.aol import AolCarController class CarController(CarControllerBase, AolCarController): diff --git a/iqdbc_repo/iqdbc/car/rivian/carstate.py b/iqdbc_repo/iqdbc/car/rivian/carstate.py index d5c2471..225a043 100644 --- a/iqdbc_repo/iqdbc/car/rivian/carstate.py +++ b/iqdbc_repo/iqdbc/car/rivian/carstate.py @@ -4,7 +4,7 @@ from iqdbc.car import Bus, structs from iqdbc.car.interfaces import CarStateBase from iqdbc.car.rivian.values import DBC, GEAR_MAP from iqdbc.car.common.conversions import Conversions as CV -from iqdbc.iqpilot.car.rivian.carstate_ext import CarStateExt +from iqdbc.lvbs.car.rivian.carstate_ext import CarStateExt GearShifter = structs.CarState.GearShifter diff --git a/iqdbc_repo/iqdbc/car/rivian/interface.py b/iqdbc_repo/iqdbc/car/rivian/interface.py index 36e70e8..858bf03 100644 --- a/iqdbc_repo/iqdbc/car/rivian/interface.py +++ b/iqdbc_repo/iqdbc/car/rivian/interface.py @@ -4,7 +4,7 @@ from iqdbc.car.rivian.carcontroller import CarController from iqdbc.car.rivian.carstate import CarState from iqdbc.car.rivian.radar_interface import RadarInterface from iqdbc.car.rivian.values import RivianSafetyFlags -from iqdbc.iqpilot.car.rivian.values import RivianFlagsIQ +from iqdbc.lvbs.car.rivian.values import RivianFlagsIQ class CarInterface(CarInterfaceBase): diff --git a/iqdbc_repo/iqdbc/car/subaru/carcontroller.py b/iqdbc_repo/iqdbc/car/subaru/carcontroller.py index 3a78a17..18ba9e5 100644 --- a/iqdbc_repo/iqdbc/car/subaru/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/subaru/carcontroller.py @@ -6,7 +6,7 @@ from iqdbc.car.interfaces import CarControllerBase from iqdbc.car.subaru import subarucan from iqdbc.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarControllerParams, SubaruFlags -from iqdbc.iqpilot.car.subaru.stop_and_go import SnGCarController +from iqdbc.lvbs.car.subaru.stop_and_go import IQStopAndGoController # FIXME: These limits aren't exact. The real limit is more than likely over a larger time period and # involves the total steering angle change rather than rate, but these limits work well for now @@ -14,10 +14,10 @@ MAX_STEER_RATE = 25 # deg/s MAX_STEER_RATE_FRAMES = 7 # tx control frames needed before torque can be cut -class CarController(CarControllerBase, SnGCarController): +class CarController(CarControllerBase, IQStopAndGoController): def __init__(self, dbc_names, CP, CP_IQ): CarControllerBase.__init__(self, dbc_names, CP, CP_IQ) - SnGCarController.__init__(self, CP, CP_IQ) + IQStopAndGoController.__init__(self, CP, CP_IQ) self.apply_torque_last = 0 self.cruise_button_prev = 0 @@ -139,7 +139,7 @@ class CarController(CarControllerBase, SnGCarController): if self.frame % 2 == 0: can_sends.append(subarucan.create_es_static_2(self.packer)) - can_sends.extend(SnGCarController.create_stop_and_go(self, self.packer, CC, CS, self.frame)) + can_sends.extend(IQStopAndGoController.create_stop_and_go(self, self.packer, CC, CS, self.frame)) new_actuators = actuators.as_builder() new_actuators.torque = self.apply_torque_last / self.p.STEER_MAX diff --git a/iqdbc_repo/iqdbc/car/subaru/carstate.py b/iqdbc_repo/iqdbc/car/subaru/carstate.py index a69c05f..5fbfc87 100644 --- a/iqdbc_repo/iqdbc/car/subaru/carstate.py +++ b/iqdbc_repo/iqdbc/car/subaru/carstate.py @@ -6,15 +6,15 @@ from iqdbc.car.interfaces import CarStateBase from iqdbc.car.subaru.values import DBC, CanBus, SubaruFlags from iqdbc.car import CanSignalRateCalculator -from iqdbc.iqpilot.car.subaru.aol import AolCarState -from iqdbc.iqpilot.car.subaru.stop_and_go import SnGCarState +from iqdbc.lvbs.car.subaru.aol import AolCarState +from iqdbc.lvbs.car.subaru.stop_and_go import IQStopAndGoState -class CarState(CarStateBase, AolCarState, SnGCarState): +class CarState(CarStateBase, AolCarState, IQStopAndGoState): def __init__(self, CP, CP_IQ): CarStateBase.__init__(self, CP, CP_IQ) AolCarState.__init__(self, CP, CP_IQ) - SnGCarState.__init__(self, CP, CP_IQ) + IQStopAndGoState.__init__(self, CP, CP_IQ) can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt]) self.shifter_values = can_define.dv["Transmission"]["Gear"] @@ -144,7 +144,7 @@ class CarState(CarStateBase, AolCarState, SnGCarState): self.es_infotainment_msg = copy.copy(cp_cam.vl["ES_Infotainment"]) AolCarState.update_aol(self, ret, can_parsers) - SnGCarState.update(self, ret, can_parsers) + IQStopAndGoState.update(self, ret, can_parsers) return ret, ret_iq diff --git a/iqdbc_repo/iqdbc/car/tesla/carcontroller.py b/iqdbc_repo/iqdbc/car/tesla/carcontroller.py index df117c3..860938c 100644 --- a/iqdbc_repo/iqdbc/car/tesla/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/tesla/carcontroller.py @@ -7,7 +7,7 @@ from iqdbc.car.tesla.teslacan import TeslaCAN from iqdbc.car.tesla.values import CarControllerParams from iqdbc.car.vehicle_model import VehicleModel from openpilot.iqpilot.selfdrive.car.enhanced_stock_longitudinal_control import get_set_speed_kph_from_params -from iqdbc.iqpilot.car.tesla.coop_steering import CoopSteeringCarController +from iqdbc.lvbs.car.tesla.coop_steering import CoopSteeringCarController def get_safety_CP(): diff --git a/iqdbc_repo/iqdbc/car/tesla/carstate.py b/iqdbc_repo/iqdbc/car/tesla/carstate.py index 230a836..3519313 100644 --- a/iqdbc_repo/iqdbc/car/tesla/carstate.py +++ b/iqdbc_repo/iqdbc/car/tesla/carstate.py @@ -7,7 +7,7 @@ from iqdbc.car.interfaces import CarStateBase from iqdbc.car.tesla.teslacan import get_steer_ctrl_type from iqdbc.car.tesla.values import DBC, CANBUS, GEAR_MAP, STEER_THRESHOLD, TeslaFlags -from iqdbc.iqpilot.car.tesla.carstate_ext import CarStateExt +from iqdbc.lvbs.car.tesla.carstate_ext import CarStateExt ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/car/tesla/interface.py b/iqdbc_repo/iqdbc/car/tesla/interface.py index 9aac45b..9d191e7 100644 --- a/iqdbc_repo/iqdbc/car/tesla/interface.py +++ b/iqdbc_repo/iqdbc/car/tesla/interface.py @@ -5,7 +5,7 @@ from iqdbc.car.tesla.carstate import CarState from iqdbc.car.tesla.values import TeslaSafetyFlags, TeslaFlags, CANBUS, CAR, DBC, FSD_14_FW, Ecu from iqdbc.car.tesla.radar_interface import RadarInterface, RADAR_START_ADDR -from iqdbc.iqpilot.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ, TeslaSafetyFlagsIQ class CarInterface(CarInterfaceBase): diff --git a/iqdbc_repo/iqdbc/car/toyota/carcontroller.py b/iqdbc_repo/iqdbc/car/toyota/carcontroller.py index fa5c9f6..88548d9 100644 --- a/iqdbc_repo/iqdbc/car/toyota/carcontroller.py +++ b/iqdbc_repo/iqdbc/car/toyota/carcontroller.py @@ -13,8 +13,8 @@ from iqdbc.car.toyota.values import CAR, NO_STOP_TIMER_CAR, TSS2_CAR, \ UNSUPPORTED_DSU_CAR from iqdbc.can import CANPacker -from iqdbc.iqpilot.car.toyota.gas_interceptor import GasInterceptorCarController -from iqdbc.iqpilot.car.toyota.values import ToyotaFlagsIQ +from iqdbc.lvbs.car.toyota.gas_interceptor import GasInterceptorCarController +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ Ecu = structs.CarParams.Ecu LongCtrlState = structs.CarControl.Actuators.LongControlState diff --git a/iqdbc_repo/iqdbc/car/toyota/carstate.py b/iqdbc_repo/iqdbc/car/toyota/carstate.py index fc95f41..64a2c73 100644 --- a/iqdbc_repo/iqdbc/car/toyota/carstate.py +++ b/iqdbc_repo/iqdbc/car/toyota/carstate.py @@ -8,8 +8,8 @@ from iqdbc.car.interfaces import CarStateBase from iqdbc.car.toyota.values import ToyotaFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \ TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR, \ SECOC_CAR -from iqdbc.iqpilot.car.toyota.carstate_ext import CarStateExt -from iqdbc.iqpilot.car.toyota.values import ToyotaFlagsIQ +from iqdbc.lvbs.car.toyota.carstate_ext import CarStateExt +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ ButtonType = structs.CarState.ButtonEvent.Type SteerControlType = structs.CarParams.SteerControlType diff --git a/iqdbc_repo/iqdbc/car/toyota/fingerprints.py b/iqdbc_repo/iqdbc/car/toyota/fingerprints.py index 3f1348a..e5b5f89 100644 --- a/iqdbc_repo/iqdbc/car/toyota/fingerprints.py +++ b/iqdbc_repo/iqdbc/car/toyota/fingerprints.py @@ -2,8 +2,8 @@ from iqdbc.car.structs import CarParams from iqdbc.car.toyota.values import CAR -from iqdbc.iqpilot.car.fingerprints_ext import merge_fw_versions -from iqdbc.iqpilot.car.toyota.fingerprints_ext import FW_VERSIONS_EXT +from iqdbc.lvbs.car.fingerprints_ext import extend_fw_versions +from iqdbc.lvbs.car.toyota.fingerprints_ext import FW_VERSIONS_EXT Ecu = CarParams.Ecu @@ -1889,4 +1889,4 @@ FW_VERSIONS = { }, } -FW_VERSIONS = merge_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) +FW_VERSIONS = extend_fw_versions(FW_VERSIONS, FW_VERSIONS_EXT) diff --git a/iqdbc_repo/iqdbc/car/toyota/interface.py b/iqdbc_repo/iqdbc/car/toyota/interface.py index c1f4e96..9455b35 100644 --- a/iqdbc_repo/iqdbc/car/toyota/interface.py +++ b/iqdbc_repo/iqdbc/car/toyota/interface.py @@ -7,7 +7,7 @@ from iqdbc.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControllerPar ToyotaSafetyFlags, UNSUPPORTED_DSU_CAR from iqdbc.car.disable_ecu import disable_ecu from iqdbc.car.interfaces import CarInterfaceBase -from iqdbc.iqpilot.car.toyota.values import ToyotaFlagsIQ, ToyotaSafetyFlagsIQ +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ, ToyotaSafetyFlagsIQ SteerControlType = structs.CarParams.SteerControlType diff --git a/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py b/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py index 2a9daa2..3bac02a 100644 --- a/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py +++ b/iqdbc_repo/iqdbc/car/toyota/tests/test_toyota_iq.py @@ -1,7 +1,7 @@ from iqdbc.car import gen_empty_fingerprint, structs from iqdbc.car.toyota.interface import CarInterface from iqdbc.car.toyota.values import CAR, ToyotaFlags -from iqdbc.iqpilot.car.toyota.values import ToyotaFlagsIQ +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ def test_forced_secoc_toyota_clears_dashcam_mode(): diff --git a/iqdbc_repo/iqdbc/iqpilot/__init__.py b/iqdbc_repo/iqdbc/lvbs/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/__init__.py rename to iqdbc_repo/iqdbc/lvbs/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/aol_base.py b/iqdbc_repo/iqdbc/lvbs/aol_base.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/aol_base.py rename to iqdbc_repo/iqdbc/lvbs/aol_base.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/car_list.json b/iqdbc_repo/iqdbc/lvbs/car/car_list.json similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/car_list.json rename to iqdbc_repo/iqdbc/lvbs/car/car_list.json diff --git a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/chrysler/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/chrysler/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/aol.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/aol.py similarity index 98% rename from iqdbc_repo/iqdbc/iqpilot/car/chrysler/aol.py rename to iqdbc_repo/iqdbc/lvbs/car/chrysler/aol.py index 262546a..fd0497b 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/aol.py +++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/aol.py @@ -8,7 +8,7 @@ from collections import namedtuple from iqdbc.car import Bus, structs from iqdbc.car.chrysler.values import RAM_CARS -from iqdbc.iqpilot.aol_base import AolCarStateBase +from iqdbc.lvbs.aol_base import AolCarStateBase from iqdbc.can.parser import CANParser AolDataIQ = namedtuple("AolDataIQ", diff --git a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/carcontroller_ext.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/carcontroller_ext.py similarity index 93% rename from iqdbc_repo/iqdbc/iqpilot/car/chrysler/carcontroller_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/chrysler/carcontroller_ext.py index fdeb0a8..a19d635 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/carcontroller_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/carcontroller_ext.py @@ -4,7 +4,7 @@ Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed from iqdbc.car import structs from iqdbc.car.interfaces import CarStateBase from iqdbc.car.chrysler.values import RAM_DT -from iqdbc.iqpilot.car.chrysler.values_ext import ChryslerFlagsIQ +from iqdbc.lvbs.car.chrysler.values_ext import ChryslerFlagsIQ GearShifter = structs.CarState.GearShifter diff --git a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/carstate_ext.py similarity index 95% rename from iqdbc_repo/iqdbc/iqpilot/car/chrysler/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/chrysler/carstate_ext.py index 67cf260..7769e61 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/chrysler/carstate_ext.py @@ -8,7 +8,7 @@ from enum import StrEnum from iqdbc.car import Bus, structs from iqdbc.can.parser import CANParser from iqdbc.car.chrysler.values import RAM_HD -from iqdbc.iqpilot.car.chrysler.values_ext import BUTTONS +from iqdbc.lvbs.car.chrysler.values_ext import BUTTONS class CarStateExt: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/fingerprints_ext.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/fingerprints_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/chrysler/fingerprints_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/chrysler/fingerprints_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/chrysler/values_ext.py b/iqdbc_repo/iqdbc/lvbs/car/chrysler/values_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/chrysler/values_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/chrysler/values_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/fingerprints_ext.py b/iqdbc_repo/iqdbc/lvbs/car/fingerprints_ext.py similarity index 88% rename from iqdbc_repo/iqdbc/iqpilot/car/fingerprints_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/fingerprints_ext.py index 1bc43ae..1d43a62 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/fingerprints_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/fingerprints_ext.py @@ -3,7 +3,7 @@ Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed """ -def merge_fw_versions(fw_versions, new_fw_versions): +def extend_fw_versions(fw_versions, new_fw_versions): """ Merge firmware versions by extending lists for matching ECUs, adding all entries regardless of duplicates. @@ -22,7 +22,7 @@ def merge_fw_versions(fw_versions, new_fw_versions): return fw_versions -def merge_fingerprints(fingerprints, new_fingerprints): +def extend_fingerprints(fingerprints, new_fingerprints): """ Merge fingerprints by extending lists for matching keys, adding all entries regardless of duplicates. diff --git a/iqdbc_repo/iqdbc/iqpilot/car/ford/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/ford/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/ford/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/ford/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/ford/aol.py b/iqdbc_repo/iqdbc/lvbs/car/ford/aol.py similarity index 92% rename from iqdbc_repo/iqdbc/iqpilot/car/ford/aol.py rename to iqdbc_repo/iqdbc/lvbs/car/ford/aol.py index 510c9e0..5e427b9 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/ford/aol.py +++ b/iqdbc_repo/iqdbc/lvbs/car/ford/aol.py @@ -6,7 +6,7 @@ from enum import StrEnum from iqdbc.car import Bus,structs -from iqdbc.iqpilot.aol_base import AolCarStateBase +from iqdbc.lvbs.aol_base import AolCarStateBase from iqdbc.can.parser import CANParser diff --git a/iqdbc_repo/iqdbc/iqpilot/car/gm/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/gm/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/gm/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/gm/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/gm/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/gm/carstate_ext.py similarity index 93% rename from iqdbc_repo/iqdbc/iqpilot/car/gm/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/gm/carstate_ext.py index 4ebe9a1..6c3ffe1 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/gm/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/gm/carstate_ext.py @@ -6,7 +6,7 @@ from enum import StrEnum from iqdbc.car import Bus, structs from iqdbc.car.common.conversions import Conversions as CV from iqdbc.can.parser import CANParser -from iqdbc.iqpilot.car.gm.values_ext import GMFlagsIQ +from iqdbc.lvbs.car.gm.values_ext import GMFlagsIQ class CarStateExt: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/gm/fingerprints_ext.py b/iqdbc_repo/iqdbc/lvbs/car/gm/fingerprints_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/gm/fingerprints_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/gm/fingerprints_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/gm/interface_ext.py b/iqdbc_repo/iqdbc/lvbs/car/gm/interface_ext.py similarity index 95% rename from iqdbc_repo/iqdbc/iqpilot/car/gm/interface_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/gm/interface_ext.py index 2c1bea1..6dcdb1a 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/gm/interface_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/gm/interface_ext.py @@ -7,7 +7,7 @@ from math import exp from iqdbc.car import structs from iqdbc.car.common.basedir import BASEDIR from iqdbc.car.gm.interface import CAR -from iqdbc.iqpilot.car.interfaces import LatControlInputs, NanoFFModel, TorqueFromLateralAccelCallbackTypeTorqueSpace +from iqdbc.lvbs.car.interfaces import LatControlInputs, NanoFFModel, TorqueFromLateralAccelCallbackTypeTorqueSpace NON_LINEAR_TORQUE_PARAMS = { CAR.CHEVROLET_BOLT_EUV: [2.6531724862969748, 1.0, 0.1919764879840985, 0.009054123646805178], diff --git a/iqdbc_repo/iqdbc/iqpilot/car/gm/values_ext.py b/iqdbc_repo/iqdbc/lvbs/car/gm/values_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/gm/values_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/gm/values_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/honda/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/aol.py b/iqdbc_repo/iqdbc/lvbs/car/honda/aol.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/aol.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/aol.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/honda/carstate_ext.py similarity index 95% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/carstate_ext.py index 679e85d..006b288 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/honda/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/honda/carstate_ext.py @@ -5,7 +5,7 @@ from enum import StrEnum from iqdbc.car import Bus, structs from iqdbc.can.parser import CANParser -from iqdbc.iqpilot.car.honda.values_ext import HondaFlagsIQ +from iqdbc.lvbs.car.honda.values_ext import HondaFlagsIQ class CarStateExt: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/fingerprints_ext.py b/iqdbc_repo/iqdbc/lvbs/car/honda/fingerprints_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/fingerprints_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/fingerprints_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/gas_interceptor.py b/iqdbc_repo/iqdbc/lvbs/car/honda/gas_interceptor.py similarity index 94% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/gas_interceptor.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/gas_interceptor.py index f4e9fe4..95ed00a 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/honda/gas_interceptor.py +++ b/iqdbc_repo/iqdbc/lvbs/car/honda/gas_interceptor.py @@ -6,7 +6,7 @@ import numpy as np from iqdbc.car import structs from iqdbc.car.can_definitions import CanData -from iqdbc.iqpilot.car import create_gas_interceptor_command +from iqdbc.lvbs.car import create_gas_interceptor_command class GasInterceptorCarController: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/test_honda.py b/iqdbc_repo/iqdbc/lvbs/car/honda/test_honda.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/test_honda.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/test_honda.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/honda/values_ext.py b/iqdbc_repo/iqdbc/lvbs/car/honda/values_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/honda/values_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/honda/values_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/aol.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/aol.py similarity index 97% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/aol.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/aol.py index 5689e15..e07927f 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/aol.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/aol.py @@ -9,8 +9,8 @@ from iqdbc.car import Bus, DT_CTRL, structs from iqdbc.car.hyundai.values import CAR from iqdbc.car.hyundai.values import HyundaiFlags -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ -from iqdbc.iqpilot.aol_base import AolCarStateBase +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.aol_base import AolCarStateBase from iqdbc.can.parser import CANParser ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/carstate_ext.py similarity index 98% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/carstate_ext.py index 4fa4f3b..94d7f82 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/carstate_ext.py @@ -7,7 +7,7 @@ from enum import StrEnum from iqdbc.car import Bus, structs from iqdbc.can.parser import CANParser from iqdbc.car.hyundai.values import HyundaiFlags -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ class CarStateExt: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/enable_radar_tracks.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/enable_radar_tracks.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/enable_radar_tracks.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/enable_radar_tracks.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/escc.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/escc.py similarity index 97% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/escc.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/escc.py index edb1e37..e9fd072 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/escc.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/escc.py @@ -1,6 +1,6 @@ from iqdbc.car import structs -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ ESCC_MSG = 0x2AB diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/fingerprints_ext.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/fingerprints_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/fingerprints_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/fingerprints_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/lead_data_ext.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/lead_data_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/lead_data_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/lead_data_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/config.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/config.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/config.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/config.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/controller.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/controller.py similarity index 98% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/controller.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/controller.py index 5cee84a..7998452 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/controller.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/controller.py @@ -8,8 +8,8 @@ from dataclasses import dataclass from iqdbc.car import structs, DT_CTRL from iqdbc.car.interfaces import CarStateBase from iqdbc.car.hyundai.values import CarControllerParams -from iqdbc.iqpilot.car.hyundai.longitudinal.helpers import get_car_config, jerk_limited_integrator, ramp_update -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.longitudinal.helpers import get_car_config, jerk_limited_integrator, ramp_update +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ LongCtrlState = structs.CarControl.Actuators.LongControlState diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/helpers.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/helpers.py similarity index 93% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/helpers.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/helpers.py index ea45f57..5703bd1 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/longitudinal/helpers.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/longitudinal/helpers.py @@ -6,7 +6,7 @@ import numpy as np from iqdbc.car import structs, DT_CTRL, rate_limit from iqdbc.car.hyundai.values import HyundaiFlags -from iqdbc.iqpilot.car.hyundai.longitudinal.config import CarTuningConfig, TUNING_CONFIGS, CAR_SPECIFIC_CONFIGS +from iqdbc.lvbs.car.hyundai.longitudinal.config import CarTuningConfig, TUNING_CONFIGS, CAR_SPECIFIC_CONFIGS JERK_THRESHOLD = 0.1 JERK_STEP = 0.1 diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/radar_interface_ext.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/radar_interface_ext.py similarity index 97% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/radar_interface_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/radar_interface_ext.py index 67516f0..8528a98 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/radar_interface_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/radar_interface_ext.py @@ -3,7 +3,7 @@ from iqdbc.car import structs, Bus from iqdbc.car.hyundai.hyundaicanfd import CanBus from iqdbc.car.hyundai.values import DBC, HyundaiFlags -from iqdbc.iqpilot.car.hyundai.escc import EsccRadarInterfaceBase +from iqdbc.lvbs.car.hyundai.escc import EsccRadarInterfaceBase class RadarInterfaceExt(EsccRadarInterfaceBase): diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_escc_base.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_escc_base.py similarity index 93% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_escc_base.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_escc_base.py index 3f4bd8c..178563b 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_escc_base.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_escc_base.py @@ -1,9 +1,9 @@ import pytest from hypothesis import given, strategies as st, settings, HealthCheck -from iqdbc.iqpilot.car.hyundai.escc import EnhancedSmartCruiseControl, ESCC_MSG +from iqdbc.lvbs.car.hyundai.escc import EnhancedSmartCruiseControl, ESCC_MSG from iqdbc.car.hyundai.carstate import CarState from iqdbc.car import structs -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ @pytest.fixture diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_lead_data_car_controller.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_lead_data_car_controller.py similarity index 95% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_lead_data_car_controller.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_lead_data_car_controller.py index fa678c5..73a1f74 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_lead_data_car_controller.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_lead_data_car_controller.py @@ -1,6 +1,6 @@ from enum import IntFlag -from iqdbc.iqpilot.car.hyundai.lead_data_ext import LeadDataCarController, CanLeadData, CanFdLeadData +from iqdbc.lvbs.car.hyundai.lead_data_ext import LeadDataCarController, CanLeadData, CanFdLeadData from iqdbc.car import structs from iqdbc.car.hyundai.values import HyundaiFlags diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_radar_interface_ext.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_radar_interface_ext.py similarity index 98% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_radar_interface_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_radar_interface_ext.py index b69415d..98ff9ee 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_radar_interface_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_radar_interface_ext.py @@ -3,7 +3,7 @@ from parameterized import parameterized from iqdbc.car import CanData from iqdbc.car.car_helpers import interfaces from iqdbc.car.hyundai.values import CAR, HyundaiFlags -from iqdbc.iqpilot.car.hyundai.escc import ESCC_MSG +from iqdbc.lvbs.car.hyundai.escc import ESCC_MSG ESCC_CARS = [ (CAR.HYUNDAI_ELANTRA_2021, ESCC_MSG), diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_tuning_controller.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_tuning_controller.py similarity index 97% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_tuning_controller.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_tuning_controller.py index 9da1df7..ad5a60f 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/tests/test_tuning_controller.py +++ b/iqdbc_repo/iqdbc/lvbs/car/hyundai/tests/test_tuning_controller.py @@ -6,8 +6,8 @@ import unittest import numpy as np from unittest.mock import Mock -from iqdbc.iqpilot.car.hyundai.longitudinal.controller import LongitudinalController, LongitudinalState -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.hyundai.longitudinal.controller import LongitudinalController, LongitudinalState +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ from iqdbc.car import DT_CTRL, structs from iqdbc.car.interfaces import CarStateBase from iqdbc.car.hyundai.values import HyundaiFlags diff --git a/iqdbc_repo/iqdbc/iqpilot/car/hyundai/values.py b/iqdbc_repo/iqdbc/lvbs/car/hyundai/values.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/hyundai/values.py rename to iqdbc_repo/iqdbc/lvbs/car/hyundai/values.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/interfaces.py b/iqdbc_repo/iqdbc/lvbs/car/interfaces.py similarity index 91% rename from iqdbc_repo/iqdbc/iqpilot/car/interfaces.py rename to iqdbc_repo/iqdbc/lvbs/car/interfaces.py index 240e1d8..5737906 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/interfaces.py +++ b/iqdbc_repo/iqdbc/lvbs/car/interfaces.py @@ -10,12 +10,12 @@ from iqdbc.car import structs from iqdbc.car.can_definitions import CanRecvCallable, CanSendCallable from iqdbc.car.hyundai.values import HyundaiFlags from iqdbc.car.subaru.values import SubaruFlags -from iqdbc.iqpilot.car.hyundai.enable_radar_tracks import enable_radar_tracks as hyundai_enable_radar_tracks -from iqdbc.iqpilot.car.hyundai.longitudinal.helpers import LongitudinalTuningType -from iqdbc.iqpilot.car.hyundai.values import HyundaiFlagsIQ -from iqdbc.iqpilot.car.subaru.values_ext import SubaruFlagsIQ, SubaruSafetyFlagsIQ -from iqdbc.iqpilot.car.tesla.values import TeslaFlagsIQ -from iqdbc.iqpilot.car.toyota.values import ToyotaFlagsIQ +from iqdbc.lvbs.car.hyundai.enable_radar_tracks import enable_radar_tracks as hyundai_enable_radar_tracks +from iqdbc.lvbs.car.hyundai.longitudinal.helpers import LongitudinalTuningType +from iqdbc.lvbs.car.hyundai.values import HyundaiFlagsIQ +from iqdbc.lvbs.car.subaru.values_ext import SubaruFlagsIQ, SubaruSafetyFlagsIQ +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ class LatControlInputs(NamedTuple): @@ -71,7 +71,7 @@ class NanoFFModel: return pred -def setup_interfaces(CI, CP: structs.CarParams, CP_IQ: structs.IQCarParams, +def apply_iq_car_config(CI, CP: structs.CarParams, CP_IQ: structs.IQCarParams, params_list: list[dict[str, str]] | None = None, can_recv: CanRecvCallable | None = None, can_send: CanSendCallable | None = None) -> None: if params_list is None: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/iq_lateral.py b/iqdbc_repo/iqdbc/lvbs/car/iq_lateral.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/iq_lateral.py rename to iqdbc_repo/iqdbc/lvbs/car/iq_lateral.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/mazda/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/mazda/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/mazda/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/mazda/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/nissan/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/nissan/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/nissan/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/nissan/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/nissan/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/nissan/carstate_ext.py similarity index 95% rename from iqdbc_repo/iqdbc/iqpilot/car/nissan/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/nissan/carstate_ext.py index e28f9e4..e896d30 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/nissan/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/nissan/carstate_ext.py @@ -6,7 +6,7 @@ from enum import StrEnum from iqdbc.car import Bus, structs from iqdbc.can.parser import CANParser -from iqdbc.iqpilot.car.nissan.values import BUTTONS +from iqdbc.lvbs.car.nissan.values import BUTTONS class CarStateExt: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/nissan/values.py b/iqdbc_repo/iqdbc/lvbs/car/nissan/values.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/nissan/values.py rename to iqdbc_repo/iqdbc/lvbs/car/nissan/values.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/platform_list.py b/iqdbc_repo/iqdbc/lvbs/car/platform_list.py similarity index 91% rename from iqdbc_repo/iqdbc/iqpilot/car/platform_list.py rename to iqdbc_repo/iqdbc/lvbs/car/platform_list.py index 3dc66c6..63c215c 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/platform_list.py +++ b/iqdbc_repo/iqdbc/lvbs/car/platform_list.py @@ -12,7 +12,7 @@ CAR_LIST_JSON_OUT = os.path.join(BASEDIR, "../", "iqpilot", "car", "car_list.jso def get_car_list() -> dict[str, dict[str, list[str] | str]]: collected_footnote = get_all_footnotes() - sorted_list: dict[str, dict[str, list[str] | str]] = build_sorted_car_list(PLATFORMS, collected_footnote) + sorted_list: dict[str, dict[str, list[str] | str]] = collect_car_docs(PLATFORMS, collected_footnote) return sorted_list @@ -22,7 +22,7 @@ def _natural_sort_key(s): return [int(t) if t.isdigit() else t.lower() for t in re.split(r'(\d+)', normalized) if t] -def build_sorted_car_list(platforms, footnotes) -> dict[str, dict[str, list[str] | str]]: +def collect_car_docs(platforms, footnotes) -> dict[str, dict[str, list[str] | str]]: cars: dict[str, dict[str, list[str] | str]] = {} for model, platform in platforms.items(): car_docs = platform.config.get_all_docs() diff --git a/iqdbc_repo/iqdbc/iqpilot/car/rivian/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/rivian/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/rivian/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/rivian/aol.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/aol.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/rivian/aol.py rename to iqdbc_repo/iqdbc/lvbs/car/rivian/aol.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/rivian/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/carstate_ext.py similarity index 98% rename from iqdbc_repo/iqdbc/iqpilot/car/rivian/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/rivian/carstate_ext.py index 051ed13..13ce8ca 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/rivian/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/rivian/carstate_ext.py @@ -8,7 +8,7 @@ from iqdbc.car import Bus, structs from iqdbc.can.parser import CANParser from iqdbc.car.common.conversions import Conversions as CV from iqdbc.car.rivian.values import DBC -from iqdbc.iqpilot.car.rivian.values import RivianFlagsIQ +from iqdbc.lvbs.car.rivian.values import RivianFlagsIQ ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/iqpilot/car/rivian/values.py b/iqdbc_repo/iqdbc/lvbs/car/rivian/values.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/rivian/values.py rename to iqdbc_repo/iqdbc/lvbs/car/rivian/values.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/subaru/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/subaru/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/subaru/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/subaru/aol.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/aol.py similarity index 96% rename from iqdbc_repo/iqdbc/iqpilot/car/subaru/aol.py rename to iqdbc_repo/iqdbc/lvbs/car/subaru/aol.py index 523d06f..86c51e2 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/subaru/aol.py +++ b/iqdbc_repo/iqdbc/lvbs/car/subaru/aol.py @@ -6,7 +6,7 @@ from enum import StrEnum from iqdbc.car import Bus, structs from iqdbc.car.subaru.values import SubaruFlags -from iqdbc.iqpilot.aol_base import AolCarStateBase +from iqdbc.lvbs.aol_base import AolCarStateBase from iqdbc.can.parser import CANParser ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/iqpilot/car/subaru/stop_and_go.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/stop_and_go.py similarity index 96% rename from iqdbc_repo/iqdbc/iqpilot/car/subaru/stop_and_go.py rename to iqdbc_repo/iqdbc/lvbs/car/subaru/stop_and_go.py index a696c22..c55b1d2 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/subaru/stop_and_go.py +++ b/iqdbc_repo/iqdbc/lvbs/car/subaru/stop_and_go.py @@ -10,15 +10,15 @@ from iqdbc.car.can_definitions import CanData from iqdbc.car.interfaces import CarStateBase from iqdbc.car.subaru.values import SubaruFlags -from iqdbc.iqpilot.car.subaru import subarucan_ext -from iqdbc.iqpilot.car.subaru.values_ext import SubaruFlagsIQ +from iqdbc.lvbs.car.subaru import subarucan_ext +from iqdbc.lvbs.car.subaru.values_ext import SubaruFlagsIQ from iqdbc.can.parser import CANParser _SNG_ACC_MIN_DIST = 3 _SNG_ACC_MAX_DIST = 4.5 -class SnGCarController: +class IQStopAndGoController: def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): self.CP = CP self.CP_IQ = CP_IQ @@ -104,7 +104,7 @@ class SnGCarController: return can_sends -class SnGCarState: +class IQStopAndGoState: def __init__(self, CP: structs.CarParams, CP_IQ: structs.IQCarParams): self.CP = CP self.CP_IQ = CP_IQ diff --git a/iqdbc_repo/iqdbc/iqpilot/car/subaru/subarucan_ext.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/subarucan_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/subaru/subarucan_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/subaru/subarucan_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/subaru/values_ext.py b/iqdbc_repo/iqdbc/lvbs/car/subaru/values_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/subaru/values_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/subaru/values_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tesla/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/tesla/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/tesla/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/carstate_ext.py similarity index 98% rename from iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/tesla/carstate_ext.py index 019ac7b..fc0da12 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/tesla/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/tesla/carstate_ext.py @@ -7,7 +7,7 @@ from iqdbc.car import Bus, create_button_events, structs from iqdbc.can.parser import CANParser from iqdbc.car.common.conversions import Conversions as CV from iqdbc.car.tesla.values import DBC, CANBUS -from iqdbc.iqpilot.car.tesla.values import TeslaFlagsIQ +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ ButtonType = structs.CarState.ButtonEvent.Type diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tesla/coop_steering.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/coop_steering.py similarity index 99% rename from iqdbc_repo/iqdbc/iqpilot/car/tesla/coop_steering.py rename to iqdbc_repo/iqdbc/lvbs/car/tesla/coop_steering.py index 966edbc..e67d443 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/tesla/coop_steering.py +++ b/iqdbc_repo/iqdbc/lvbs/car/tesla/coop_steering.py @@ -10,7 +10,7 @@ from iqdbc.car import structs, rate_limit, DT_CTRL from iqdbc.car.vehicle_model import VehicleModel from iqdbc.car.lateral import apply_steer_angle_limits_vm from iqdbc.car.tesla.values import CarControllerParams -from iqdbc.iqpilot.car.tesla.values import TeslaFlagsIQ +from iqdbc.lvbs.car.tesla.values import TeslaFlagsIQ DT_LAT_CTRL = DT_CTRL * CarControllerParams.STEER_STEP diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tesla/values.py b/iqdbc_repo/iqdbc/lvbs/car/tesla/values.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/tesla/values.py rename to iqdbc_repo/iqdbc/lvbs/car/tesla/values.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tests/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/tests/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/tests/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/tests/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/tests/test_car_list.py b/iqdbc_repo/iqdbc/lvbs/car/tests/test_car_list.py similarity index 81% rename from iqdbc_repo/iqdbc/iqpilot/car/tests/test_car_list.py rename to iqdbc_repo/iqdbc/lvbs/car/tests/test_car_list.py index 3a1d215..19c4952 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/tests/test_car_list.py +++ b/iqdbc_repo/iqdbc/lvbs/car/tests/test_car_list.py @@ -1,6 +1,6 @@ import json -from iqdbc.iqpilot.car.platform_list import get_car_list, CAR_LIST_JSON_OUT +from iqdbc.lvbs.car.platform_list import get_car_list, CAR_LIST_JSON_OUT class TestCarList: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/toyota/__init__.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/__init__.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/toyota/__init__.py rename to iqdbc_repo/iqdbc/lvbs/car/toyota/__init__.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/toyota/carstate_ext.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/carstate_ext.py similarity index 99% rename from iqdbc_repo/iqdbc/iqpilot/car/toyota/carstate_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/toyota/carstate_ext.py index 1e7aa85..3508cfe 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/toyota/carstate_ext.py +++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/carstate_ext.py @@ -8,7 +8,7 @@ from iqdbc.car import Bus, structs from iqdbc.car.carlog import carlog from iqdbc.can.parser import CANParser from iqdbc.car.common.conversions import Conversions as CV -from iqdbc.iqpilot.car.toyota.values import ToyotaFlagsIQ +from iqdbc.lvbs.car.toyota.values import ToyotaFlagsIQ TRAFFIC_SIGNAL_MAP = { 1: "kph", diff --git a/iqdbc_repo/iqdbc/iqpilot/car/toyota/fingerprints_ext.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/fingerprints_ext.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/toyota/fingerprints_ext.py rename to iqdbc_repo/iqdbc/lvbs/car/toyota/fingerprints_ext.py diff --git a/iqdbc_repo/iqdbc/iqpilot/car/toyota/gas_interceptor.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/gas_interceptor.py similarity index 97% rename from iqdbc_repo/iqdbc/iqpilot/car/toyota/gas_interceptor.py rename to iqdbc_repo/iqdbc/lvbs/car/toyota/gas_interceptor.py index 7e9e697..34ab798 100644 --- a/iqdbc_repo/iqdbc/iqpilot/car/toyota/gas_interceptor.py +++ b/iqdbc_repo/iqdbc/lvbs/car/toyota/gas_interceptor.py @@ -7,7 +7,7 @@ import numpy as np from iqdbc.car import structs from iqdbc.car.can_definitions import CanData from iqdbc.car.toyota.values import CAR, MIN_ACC_SPEED, PEDAL_TRANSITION -from iqdbc.iqpilot.car import create_gas_interceptor_command +from iqdbc.lvbs.car import create_gas_interceptor_command class GasInterceptorCarController: diff --git a/iqdbc_repo/iqdbc/iqpilot/car/toyota/values.py b/iqdbc_repo/iqdbc/lvbs/car/toyota/values.py similarity index 100% rename from iqdbc_repo/iqdbc/iqpilot/car/toyota/values.py rename to iqdbc_repo/iqdbc/lvbs/car/toyota/values.py diff --git a/iqdbc_repo/iqdbc/safety/iqpilot/aol.h b/iqdbc_repo/iqdbc/safety/aol/aol.h similarity index 99% rename from iqdbc_repo/iqdbc/safety/iqpilot/aol.h rename to iqdbc_repo/iqdbc/safety/aol/aol.h index e6492db..63cd62e 100644 --- a/iqdbc_repo/iqdbc/safety/iqpilot/aol.h +++ b/iqdbc_repo/iqdbc/safety/aol/aol.h @@ -6,7 +6,7 @@ #pragma once -#include "iqdbc/safety/iqpilot/aol_declarations.h" +#include "iqdbc/safety/aol/aol_declarations.h" // =============================== // Global Variables diff --git a/iqdbc_repo/iqdbc/safety/iqpilot/aol_declarations.h b/iqdbc_repo/iqdbc/safety/aol/aol_declarations.h similarity index 100% rename from iqdbc_repo/iqdbc/safety/iqpilot/aol_declarations.h rename to iqdbc_repo/iqdbc/safety/aol/aol_declarations.h diff --git a/iqdbc_repo/iqdbc/safety/lateral.h b/iqdbc_repo/iqdbc/safety/lateral.h index ee75e2a..32e794d 100644 --- a/iqdbc_repo/iqdbc/safety/lateral.h +++ b/iqdbc_repo/iqdbc/safety/lateral.h @@ -1,4 +1,4 @@ -#include "iqdbc/safety/iqpilot/aol.h" +#include "iqdbc/safety/aol/aol.h" #include "iqdbc/safety/declarations.h" // ISO 11270 diff --git a/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py b/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py index 4327dba..54ae84a 100644 --- a/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py +++ b/iqdbc_repo/iqdbc/safety/tests/hyundai_common.py @@ -1,6 +1,6 @@ import unittest -from iqdbc.iqpilot.car.hyundai.values import HyundaiSafetyFlagsIQ +from iqdbc.lvbs.car.hyundai.values import HyundaiSafetyFlagsIQ import iqdbc.safety.tests.common as common from iqdbc.safety.tests.libsafety import libsafety_py from iqdbc.safety.tests.common import make_msg diff --git a/iqdbc_repo/iqdbc/safety/tests/test_gm.py b/iqdbc_repo/iqdbc/safety/tests/test_gm.py index 55b265a..925f357 100755 --- a/iqdbc_repo/iqdbc/safety/tests/test_gm.py +++ b/iqdbc_repo/iqdbc/safety/tests/test_gm.py @@ -7,7 +7,7 @@ from iqdbc.safety.tests.libsafety import libsafety_py import iqdbc.safety.tests.common as common from iqdbc.safety.tests.common import CANPackerSafety -from iqdbc.iqpilot.car.gm.values_ext import GMSafetyFlagsIQ +from iqdbc.lvbs.car.gm.values_ext import GMSafetyFlagsIQ class Buttons: diff --git a/iqdbc_repo/iqdbc/safety/tests/test_honda.py b/iqdbc_repo/iqdbc/safety/tests/test_honda.py index 6b73397..de5c3a6 100755 --- a/iqdbc_repo/iqdbc/safety/tests/test_honda.py +++ b/iqdbc_repo/iqdbc/safety/tests/test_honda.py @@ -9,7 +9,7 @@ from iqdbc.car.structs import CarParams from iqdbc.safety.tests.common import CANPackerSafety, MAX_WRONG_COUNTERS from iqdbc.safety.tests.gas_interceptor_common import GasInterceptorSafetyTest -from iqdbc.iqpilot.car.honda.values_ext import HondaSafetyFlagsIQ +from iqdbc.lvbs.car.honda.values_ext import HondaSafetyFlagsIQ HONDA_N_COMMON_TX_MSGS = [[0xE4, 0], [0x194, 0], [0x1FA, 0], [0x30C, 0], [0x33D, 0]] diff --git a/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py b/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py index dff2645..22db74a 100755 --- a/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py +++ b/iqdbc_repo/iqdbc/safety/tests/test_hyundai.py @@ -10,7 +10,7 @@ import iqdbc.safety.tests.common as common from iqdbc.safety.tests.common import CANPackerSafety from iqdbc.safety.tests.hyundai_common import HyundaiButtonBase, HyundaiLongitudinalBase -from iqdbc.iqpilot.car.hyundai.values import HyundaiSafetyFlagsIQ +from iqdbc.lvbs.car.hyundai.values import HyundaiSafetyFlagsIQ # LDA button availability LDA_BUTTON = [ diff --git a/iqdbc_repo/iqdbc/safety/tests/test_nissan.py b/iqdbc_repo/iqdbc/safety/tests/test_nissan.py index 7685f6c..30b2047 100755 --- a/iqdbc_repo/iqdbc/safety/tests/test_nissan.py +++ b/iqdbc_repo/iqdbc/safety/tests/test_nissan.py @@ -2,7 +2,7 @@ import unittest from iqdbc.car.nissan.values import NissanSafetyFlags -from iqdbc.iqpilot.car.nissan.values import NissanSafetyFlagsIQ +from iqdbc.lvbs.car.nissan.values import NissanSafetyFlagsIQ from iqdbc.car.structs import CarParams from iqdbc.safety.tests.libsafety import libsafety_py import iqdbc.safety.tests.common as common diff --git a/iqdbc_repo/iqdbc/safety/tests/test_tesla.py b/iqdbc_repo/iqdbc/safety/tests/test_tesla.py index 95d0c54..49432aa 100755 --- a/iqdbc_repo/iqdbc/safety/tests/test_tesla.py +++ b/iqdbc_repo/iqdbc/safety/tests/test_tesla.py @@ -6,7 +6,7 @@ import numpy as np import pytest try: from iqdbc.car.tesla.carcontroller import get_safety_CP - from iqdbc.iqpilot.car.tesla.values import TeslaSafetyFlagsIQ + from iqdbc.lvbs.car.tesla.values import TeslaSafetyFlagsIQ except ImportError: pytest.skip("requires openpilot dependencies", allow_module_level=True) diff --git a/iqdbc_repo/iqdbc/safety/tests/test_toyota.py b/iqdbc_repo/iqdbc/safety/tests/test_toyota.py index 10cbf1f..b5730eb 100755 --- a/iqdbc_repo/iqdbc/safety/tests/test_toyota.py +++ b/iqdbc_repo/iqdbc/safety/tests/test_toyota.py @@ -6,7 +6,7 @@ import unittest import itertools from iqdbc.car.toyota.values import ToyotaSafetyFlags -from iqdbc.iqpilot.car.toyota.values import ToyotaSafetyFlagsIQ +from iqdbc.lvbs.car.toyota.values import ToyotaSafetyFlagsIQ from iqdbc.car.structs import CarParams from iqdbc.safety.tests.libsafety import libsafety_py import iqdbc.safety.tests.common as common diff --git a/iqpilot/iq_maps/update_vendor_version.py b/iqpilot/iq_maps/update_vendor_version.py index 2b1675d..7573559 100755 --- a/iqpilot/iq_maps/update_vendor_version.py +++ b/iqpilot/iq_maps/update_vendor_version.py @@ -14,12 +14,14 @@ from openpilot.common.basedir import BASEDIR from openpilot.iqpilot.iq_maps import VENDOR_MAPD_PATH from openpilot.iqpilot.iq_maps.vendor_mapd_installer import ( VENDOR_RELEASE_TAG, - get_file_hash, + sha256_of_file, ) _RELEASE_SYMBOL = "VENDOR_RELEASE_TAG" _INSTALLER_SRC = os.path.join(BASEDIR, "iqpilot", "iq_maps", "vendor_mapd_installer.py") -_HASH_FILE = os.path.join(BASEDIR, "iqpilot", "iq_maps", "tests", "mapd_hash") +# public: the checked-in hash the version test compares the installed binary against +HASH_FILE = os.path.join(BASEDIR, "iqpilot", "iq_maps", "tests", "mapd_hash") +_HASH_FILE = HASH_FILE _TAG_ASSIGN = re.compile(rf'^{_RELEASE_SYMBOL}\s*=\s*["\'][^"\']*["\']', re.MULTILINE) @@ -39,7 +41,7 @@ def rewrite_pinned_tag(new_tag: str) -> bool: def refresh_hash_file() -> None: - digest = get_file_hash(VENDOR_MAPD_PATH) + digest = sha256_of_file(VENDOR_MAPD_PATH) with open(_HASH_FILE, "w") as f: f.write(digest) print(f"wrote binary hash {digest} -> {_HASH_FILE}") diff --git a/iqpilot/iq_maps/vendor_mapd_installer.py b/iqpilot/iq_maps/vendor_mapd_installer.py index 1964939..96090d4 100755 --- a/iqpilot/iq_maps/vendor_mapd_installer.py +++ b/iqpilot/iq_maps/vendor_mapd_installer.py @@ -34,7 +34,7 @@ _NET_PROBE_ATTEMPTS = 10 _NET_PROBE_INTERVAL_S = 2 -def get_file_hash(path: str) -> str: +def sha256_of_file(path: str) -> str: """Hex SHA-256 digest of a file on disk.""" digest = hashlib.sha256() with open(path, "rb") as handle: @@ -103,7 +103,7 @@ class VendorMapdInstaller: if not reference: return True try: - return get_file_hash(VENDOR_MAPD_PATH) == reference + return sha256_of_file(VENDOR_MAPD_PATH) == reference except OSError: return False diff --git a/iqpilot/selfdrive/car/interfaces.py b/iqpilot/selfdrive/car/interfaces.py index 3e0a85d..bff71f9 100644 --- a/iqpilot/selfdrive/car/interfaces.py +++ b/iqpilot/selfdrive/car/interfaces.py @@ -69,7 +69,7 @@ def _cleanup_unsupported_params(cp, cp_iq, store=None) -> None: set_speed_limit_controller_availability(cp, cp_iq, store) -def setup_interfaces(ci, store=None) -> None: +def apply_iq_car_config(ci, store=None) -> None: store = store or _Store() if _stamp_lateral_model(ci.CP, ci.CP_IQ, store): ci.configure_torque_tune(ci.CP.carFingerprint, ci.CP.lateralTuning) diff --git a/iqpilot/selfdrive/car/vehicle_catalog.py b/iqpilot/selfdrive/car/vehicle_catalog.py index 254797c..42d6e5d 100644 --- a/iqpilot/selfdrive/car/vehicle_catalog.py +++ b/iqpilot/selfdrive/car/vehicle_catalog.py @@ -81,5 +81,5 @@ def _write(vehicles: dict[str, dict], basedir: str = BASEDIR) -> str: if __name__ == "__main__": - from iqdbc.iqpilot.car.platform_list import get_car_list + from iqdbc.lvbs.car.platform_list import get_car_list print("wrote", _write(get_car_list())) diff --git a/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py b/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py index 025f19e..c7c6286 100644 --- a/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py +++ b/iqpilot/selfdrive/controls/lib/helpers/e2e_alerts.py @@ -4,152 +4,140 @@ Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed from cereal import messaging, custom +from openpilot.common.params import Params from openpilot.common.realtime import DT_MDL from openpilot.iqpilot.selfdrive.selfdrived.events import IQEvents -PATH_QUEUE_GATE = 30 -LEAD_GROWTH_GATE = 1.0 -TRIGGER_HOLD_S = 0.3 +PARAM_PATH = "EndToEndAlert" +PARAM_LEAD = "EndToEndLeadAlert" +PARAM_STRIDE_S = 2.0 + +SETTLE_S = 1.0 +CONFIRM_S = 0.4 +ROLL_MPS = 0.3 + +HORIZON_TAIL = 5 +PATH_SPEED_MPS = 3.0 + +LEAD_QUEUE_M = 12.0 +LEAD_SPEED_MPS = 1.0 +LEAD_GAP_M = 0.5 -class TriggerPhase: - IDLE = 0 - ARMED = 1 - FIRED = 2 +class _Confirm: + def __init__(self, window_s: float): + self._window = window_s + self._held = 0.0 + self._spent = False + + def clear(self) -> None: + self._held = 0.0 + self._spent = False + + def poll(self, holds: bool) -> bool: + if self._spent: + return False + self._held = self._held + DT_MDL if holds else 0.0 + if self._held < self._window: + return False + self._spent = True + return True -class StopAndLeadChimeEngine: +class _Dwell: def __init__(self): - self._frame = -1 - self._toggle = {"path_queue": False, "lead_depart": False} - self._trigger = { - "path_queue": {"phase": TriggerPhase.IDLE, "last_phase": TriggerPhase.IDLE, "fired": False, "hold_ticks": 0, "anchor": -1.0}, - "lead_depart": {"phase": TriggerPhase.IDLE, "last_phase": TriggerPhase.IDLE, "fired": False, "hold_ticks": 0, "anchor": -1.0}, - } - self._standstill_gate = {"open": False, "was_open": False, "moving_frame": -1} - self._lead_state = {"visible": False, "primed": False, "armed": False, "warmup_ticks": 0} + self.seconds = 0.0 + self.lead_floor = float('inf') - def _read_toggles(self) -> None: - self._toggle["path_queue"] = False - self._toggle["lead_depart"] = False + def clear(self) -> None: + self.seconds = 0.0 + self.lead_floor = float('inf') - def _mark_motion(self, standstill: bool, speed_mps: float) -> bool: - is_moving = (not standstill) and speed_mps > 0.1 - if is_moving: - self._standstill_gate["moving_frame"] = self._frame - return is_moving + def tick(self, lead_range: float | None) -> None: + self.seconds += DT_MDL + if lead_range is not None: + self.lead_floor = min(self.lead_floor, lead_range) - def _within_motion_grace(self) -> bool: - stamp = self._standstill_gate["moving_frame"] - if stamp == -1: - return True - return (self._frame - stamp) * DT_MDL < 2.0 + @property + def settled(self) -> bool: + return self.seconds >= SETTLE_S - def _update_gate(self, standstill: bool, speed_mps: float, gas_pressed: bool, controls_enabled: bool) -> None: - moving = self._mark_motion(standstill, speed_mps) - self._standstill_gate["open"] = (not moving) and (not gas_pressed) and (not controls_enabled) and (not self._within_motion_grace()) + @property + def queued(self) -> bool: + return self.lead_floor < LEAD_QUEUE_M - @staticmethod - def _path_end_x(path_x): - return float(path_x[-1]) if len(path_x) else 0.0 - def _path_queue_signal(self, path_x) -> bool: - node = self._trigger["path_queue"] - if node["phase"] != TriggerPhase.ARMED: - node["hold_ticks"] = 0 - return False - node["hold_ticks"] = node["hold_ticks"] + 1 if self._path_end_x(path_x) > PATH_QUEUE_GATE else 0 - return node["hold_ticks"] * DT_MDL > TRIGGER_HOLD_S +class EndToEndAlertEngine: + def __init__(self): + self._params = Params() + self._on = {"path": False, "lead": False} + self._elapsed_since_read = PARAM_STRIDE_S + self._dwell = _Dwell() + self._confirm = {"path": _Confirm(CONFIRM_S), "lead": _Confirm(CONFIRM_S)} + self._fired = {"path": False, "lead": False} - def _update_lead_prime(self, seen: bool, distance_m: float) -> None: - near_lead = seen and distance_m < 8.0 - opened_now = self._standstill_gate["open"] and not self._standstill_gate["was_open"] - - if opened_now and near_lead: - self._lead_state["primed"] = True - elif not self._standstill_gate["open"]: - self._lead_state["primed"] = False - - if self._standstill_gate["open"] and self._lead_state["primed"] and near_lead: - self._lead_state["warmup_ticks"] += 1 - self._lead_state["armed"] = self._lead_state["warmup_ticks"] * DT_MDL >= 1.0 + def _refresh_params(self) -> None: + self._elapsed_since_read += DT_MDL + if self._elapsed_since_read < PARAM_STRIDE_S: return - - self._lead_state["warmup_ticks"] = 0 - self._lead_state["armed"] = False - - def _lead_depart_signal(self, distance_m: float) -> bool: - node = self._trigger["lead_depart"] - if node["phase"] != TriggerPhase.ARMED: - node["anchor"] = -1.0 - node["hold_ticks"] = 0 - return False - - if node["anchor"] == -1.0 or distance_m < node["anchor"]: - node["anchor"] = distance_m - - grew = node["anchor"] != -1.0 and (distance_m - node["anchor"]) > LEAD_GROWTH_GATE - node["hold_ticks"] = node["hold_ticks"] + 1 if grew else 0 - return node["hold_ticks"] * DT_MDL > TRIGGER_HOLD_S - - def _sample_inputs(self, sm: messaging.SubMaster): - cs = sm['carState'] - cc = sm['carControl'] - lead_one = sm['radarState'].leadOne - - self._lead_state["visible"] = lead_one.status - lead_distance = lead_one.dRel - - self._update_gate(cs.standstill, cs.vEgo, cs.gasPressed, cc.enabled) - queue_fire = self._path_queue_signal(sm['modelV2'].position.x) - self._update_lead_prime(self._lead_state["visible"], lead_distance) - lead_fire = self._lead_depart_signal(lead_distance) - - self._standstill_gate["was_open"] = self._standstill_gate["open"] - return queue_fire, lead_fire + self._elapsed_since_read = 0.0 + self._on["path"] = self._params.get_bool(PARAM_PATH) + self._on["lead"] = self._params.get_bool(PARAM_LEAD) @staticmethod - def _step_phase(phase: int, enabled: bool, allowed: bool, fired: bool) -> tuple[int, bool]: - if phase == TriggerPhase.IDLE: - return (TriggerPhase.ARMED, fired) if (allowed and enabled) else (phase, fired) - if not allowed or not enabled: - return TriggerPhase.IDLE, fired - if phase == TriggerPhase.ARMED and fired: - return TriggerPhase.FIRED, fired - return phase, fired + def _car_holds_long(sm: messaging.SubMaster) -> bool: + # AOL steers without raising selfdriveState.enabled, so the pair reads as long authority + return bool(sm['selfdriveState'].enabled or sm['carState'].cruiseState.enabled) - def _advance_trigger(self, key: str, enabled: bool, allowed: bool, fired: bool) -> None: - node = self._trigger[key] - node["last_phase"] = node["phase"] - node["phase"], node["fired"] = self._step_phase(node["phase"], enabled, allowed, fired) + @staticmethod + def _halted(cs) -> bool: + return bool(cs.standstill) or abs(cs.vEgo) < ROLL_MPS + + @staticmethod + def _horizon_speed(model) -> float: + # capnp list readers reject slices + samples = model.velocity.x + count = len(samples) + if count < HORIZON_TAIL: + return 0.0 + return sum(samples[i] for i in range(count - HORIZON_TAIL, count)) / HORIZON_TAIL + + def _rearm(self) -> None: + self._dwell.clear() + for gate in self._confirm.values(): + gate.clear() def update(self, sm: messaging.SubMaster, iq_events: IQEvents) -> None: - self._read_toggles() - queue_fire, lead_fire = self._sample_inputs(sm) + self._refresh_params() + self._fired["path"] = self._fired["lead"] = False - self._advance_trigger("path_queue", self._toggle["path_queue"], self._standstill_gate["open"] and not self._lead_state["visible"], queue_fire) - self._advance_trigger("lead_depart", self._toggle["lead_depart"], self._standstill_gate["open"] and self._lead_state["armed"], lead_fire) + cs = sm['carState'] + lead = sm['radarState'].leadOne + lead_range = float(lead.dRel) if lead.status else None - if self._trigger["path_queue"]["fired"] or self._trigger["lead_depart"]["fired"]: + if not self._halted(cs) or cs.gasPressed or self._car_holds_long(sm): + self._rearm() + return + + self._dwell.tick(lead_range) + if not self._dwell.settled: + return + + if self._on["path"] and lead_range is None: + opened = self._horizon_speed(sm['modelV2']) > PATH_SPEED_MPS + self._fired["path"] = self._confirm["path"].poll(opened) + + if self._on["lead"] and lead_range is not None and self._dwell.queued: + pulling = lead.vLead > LEAD_SPEED_MPS and (lead_range - self._dwell.lead_floor) > LEAD_GAP_M + self._fired["lead"] = self._confirm["lead"].poll(pulling) + + if self._fired["path"] or self._fired["lead"]: iq_events.add(custom.IQOnroadEvent.EventName.e2eChime) - self._frame += 1 + @property + def path_alert(self) -> bool: + return self._fired["path"] @property - def queue_alert(self): - return self._trigger["path_queue"]["fired"] - - @queue_alert.setter - def queue_alert(self, payload): - self._trigger["path_queue"]["fired"] = bool(payload) - - @property - def lead_alert(self): - return self._trigger["lead_depart"]["fired"] - - @lead_alert.setter - def lead_alert(self, payload): - self._trigger["lead_depart"]["fired"] = bool(payload) - - -E2EAlertsHelper = StopAndLeadChimeEngine + def lead_alert(self) -> bool: + return self._fired["lead"] diff --git a/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py b/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py new file mode 100644 index 0000000..69a1f95 --- /dev/null +++ b/iqpilot/selfdrive/controls/lib/helpers/tests/test_e2e_alerts.py @@ -0,0 +1,133 @@ +""" +Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos +""" +from types import SimpleNamespace + +import pytest + +import cereal.messaging as messaging +from cereal import custom +from openpilot.common.realtime import DT_MDL +from openpilot.iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import ( + EndToEndAlertEngine, CONFIRM_S, SETTLE_S, HORIZON_TAIL, PATH_SPEED_MPS, LEAD_SPEED_MPS, LEAD_GAP_M) + +E2E_CHIME = custom.IQOnroadEvent.EventName.e2eChime + + +class _Events(list): + def add(self, name): + self.append(name) + + +def _model(horizon): + msg = messaging.new_message('modelV2') + msg.modelV2.velocity.x = [0.0] * (33 - HORIZON_TAIL) + [horizon] * HORIZON_TAIL + return msg.as_reader().modelV2 + + +def _sm(*, v_ego=0.0, standstill=True, gas=False, enabled=False, cruise=False, + horizon=0.0, lead=None): + lead = lead or SimpleNamespace(status=False, dRel=0.0, vLead=0.0) + return { + 'carState': SimpleNamespace(vEgo=v_ego, standstill=standstill, gasPressed=gas, + cruiseState=SimpleNamespace(enabled=cruise)), + 'selfdriveState': SimpleNamespace(enabled=enabled), + 'radarState': SimpleNamespace(leadOne=lead), + 'modelV2': _model(horizon), + } + + +def _engine(path=True, lead=True): + engine = EndToEndAlertEngine() + engine._refresh_params = lambda: None + engine._on = {"path": path, "lead": lead} + return engine + + +def _run(engine, sm, seconds): + events = _Events() + chimes = 0 + for _ in range(int(seconds / DT_MDL)): + engine.update(sm, events) + chimes += events.count(E2E_CHIME) + events.clear() + return chimes + + +def _lead(d_rel, v_lead=0.0): + return SimpleNamespace(status=True, dRel=d_rel, vLead=v_lead) + + +def test_path_opens_chimes_once(): + engine = _engine() + assert _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) == 0 + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1 + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), 5.0) == 0 + + +def test_path_needs_the_settle_dwell(): + engine = _engine() + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), SETTLE_S - 0.2) == 0 + + +def test_path_silent_while_openpilot_long_is_engaged(): + engine = _engine() + _run(engine, _sm(horizon=0.0, enabled=True), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, enabled=True), 5.0) == 0 + + +def test_path_silent_while_stock_acc_holds_the_car(): + engine = _engine() + _run(engine, _sm(horizon=0.0, cruise=True), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, cruise=True), 5.0) == 0 + + +def test_path_chimes_under_aol(): + engine = _engine() + _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1 + + +def test_path_ignores_a_visible_lead(): + engine = _engine(lead=False) + _run(engine, _sm(horizon=0.0, lead=_lead(6.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0, lead=_lead(6.0)), 5.0) == 0 + + +def test_lead_pullaway_chimes_once(): + engine = _engine() + assert _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) == 0 + moving = _sm(lead=_lead(6.0 + LEAD_GAP_M + 0.5, LEAD_SPEED_MPS + 1.0)) + assert _run(engine, moving, CONFIRM_S + 1.0) == 1 + assert _run(engine, moving, 5.0) == 0 + + +def test_lead_creep_inside_the_gap_stays_silent(): + engine = _engine() + _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(lead=_lead(6.0 + LEAD_GAP_M / 2, LEAD_SPEED_MPS + 1.0)), 5.0) == 0 + + +def test_lead_far_ahead_is_not_a_queue(): + engine = _engine() + _run(engine, _sm(lead=_lead(40.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(lead=_lead(44.0, LEAD_SPEED_MPS + 1.0)), 5.0) == 0 + + +def test_gas_and_motion_rearm_the_dwell(): + engine = _engine() + _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) + _run(engine, _sm(v_ego=5.0, standstill=False, horizon=8.0), 2.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), SETTLE_S - 0.2) == 0 + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), CONFIRM_S + 1.0) == 1 + + +@pytest.mark.parametrize("param_off", ["path", "lead"]) +def test_each_param_gates_only_its_own_trigger(param_off): + engine = _engine(path=param_off != "path", lead=param_off != "lead") + if param_off == "path": + _run(engine, _sm(horizon=0.0), SETTLE_S + 1.0) + assert _run(engine, _sm(horizon=PATH_SPEED_MPS + 2.0), 5.0) == 0 + else: + _run(engine, _sm(lead=_lead(6.0)), SETTLE_S + 1.0) + assert _run(engine, _sm(lead=_lead(8.0, LEAD_SPEED_MPS + 1.0)), 5.0) == 0 diff --git a/iqpilot/selfdrive/controls/lib/longitudinal_planner.py b/iqpilot/selfdrive/controls/lib/longitudinal_planner.py index 8688530..b99068b 100644 --- a/iqpilot/selfdrive/controls/lib/longitudinal_planner.py +++ b/iqpilot/selfdrive/controls/lib/longitudinal_planner.py @@ -13,7 +13,7 @@ from openpilot.selfdrive.car.cruise import V_CRUISE_MAX from openpilot.iqpilot.selfdrive.controls.lib.custom_stop_distance import CustomStopDistance from openpilot.iqpilot.selfdrive.controls.lib.iq_dynamic.engine import IQDynamicController from openpilot.iqpilot.selfdrive.controls.lib.iq_dynamic.imahelper import IQConstants -from openpilot.iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import E2EAlertsHelper +from openpilot.iqpilot.selfdrive.controls.lib.helpers.e2e_alerts import EndToEndAlertEngine from openpilot.iqpilot.selfdrive.controls.lib.slc_vcruise import SLCVCruise from openpilot.iqpilot.selfdrive.controls.lib.speed_limit_controller import LIMIT_ADAPT_ACC from openpilot.iqpilot.selfdrive.selfdrived.events import IQEvents @@ -34,7 +34,7 @@ class LongitudinalPlannerIQ: self.slimit = SLCVCruise() self.generation = int(model_bundle.generation) if (model_bundle := get_active_bundle()) else None self.source = LongitudinalPlanSource.cruise - self.iqmodeloutput = E2EAlertsHelper() + self.e2e_alerts = EndToEndAlertEngine() self.output_v_target = 0. self.output_a_target = 0. self.speed_limit_last = 0. @@ -146,7 +146,7 @@ class LongitudinalPlannerIQ: for event_name in getattr(self.slimit, 'pending_events', []): self.events_iq.add(event_name) self.custom_stop_distance.update() - self.iqmodeloutput.update(sm, self.events_iq) + self.e2e_alerts.update(sm, self.events_iq) if bool(getattr(sm["iqCarState"], "alcOverrideAlert", False)): self.events_iq.add(custom.IQOnroadEvent.EventName.steeringOverrideReengageAlc) @@ -244,10 +244,9 @@ class LongitudinalPlannerIQ: assist.vTarget = float(self.output_v_target if assist.active else 255.) assist.aTarget = float(self.slimit.slc_a_target if assist.active else 0.) - # E2E Alerts e2eAlerts = plan_msg.e2eAlerts - e2eAlerts.greenLightAlert = self.iqmodeloutput.queue_alert - e2eAlerts.leadDepartAlert = self.iqmodeloutput.lead_alert + e2eAlerts.pathOpen = self.e2e_alerts.path_alert + e2eAlerts.leadPullaway = self.e2e_alerts.lead_alert valid = sm.all_checks(service_list=['carState', 'controlsState']) diff --git a/iqpilot/ui/layouts/settings/iq_dynamic.py b/iqpilot/ui/layouts/settings/iq_dynamic.py index a3fb242..88d5478 100644 --- a/iqpilot/ui/layouts/settings/iq_dynamic.py +++ b/iqpilot/ui/layouts/settings/iq_dynamic.py @@ -8,8 +8,8 @@ import pyray as rl from openpilot.common.params import Params from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.system.ui.lib.multilang import tr -from openpilot.system.ui.iqpilot.widgets.list_view import IQListItem, IQToggleAction, SafeIQToggleAction -from openpilot.system.ui.iqpilot.widgets.list_view import OptionControl +from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, IQToggleAction, SafeIQToggleAction +from openpilot.system.ui.iqwidgets.widgets.list_view import OptionControl from openpilot.system.ui.widgets import Widget from openpilot.system.ui.widgets.network import NavButton from openpilot.system.ui.widgets.scroller_tici import Scroller diff --git a/iqpilot/ui/layouts/settings/iq_panels.py b/iqpilot/ui/layouts/settings/iq_panels.py index 4db8d54..5808f05 100644 --- a/iqpilot/ui/layouts/settings/iq_panels.py +++ b/iqpilot/ui/layouts/settings/iq_panels.py @@ -18,17 +18,17 @@ from openpilot.selfdrive.ui.layouts.settings.software import time_ago from openpilot.selfdrive.ui.ui_state import device, ui_state from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.system.hardware.hw import Paths -from openpilot.system.ui.iqpilot.lib.styles import style -from openpilot.system.ui.iqpilot.lib.utils import NoElideButtonAction -from openpilot.system.ui.iqpilot.widgets.list_view import IQListItem, toggle_item -from openpilot.system.ui.iqpilot.widgets.list_view import OptionControl -from openpilot.system.ui.iqpilot.widgets.list_view import multiple_button_item, toggle_item -from openpilot.system.ui.iqpilot.widgets.list_view import option_item, toggle_item, ToggleAction -from openpilot.system.ui.iqpilot.widgets.list_view import progress_item -from openpilot.system.ui.iqpilot.widgets.list_view import toggle_item, multiple_button_item, IQListItem, IQLineSeparator -from openpilot.system.ui.iqpilot.widgets.list_view import toggle_item, option_item, IQLineSeparator -from openpilot.system.ui.iqpilot.widgets.list_view import toggle_item, simple_button_item, option_item, IQLineSeparator -from openpilot.system.ui.iqpilot.widgets.list_view import TreeFolder, TreeNode, TreeOptionDialog +from openpilot.system.ui.iqwidgets.lib.styles import style +from openpilot.system.ui.iqwidgets.lib.utils import WideButtonAction +from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, toggle_item +from openpilot.system.ui.iqwidgets.widgets.list_view import OptionControl +from openpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item, toggle_item +from openpilot.system.ui.iqwidgets.widgets.list_view import option_item, toggle_item, ToggleAction +from openpilot.system.ui.iqwidgets.widgets.list_view import progress_item +from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, multiple_button_item, IQListItem, IQLineSeparator +from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, option_item, IQLineSeparator +from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item, simple_button_item, option_item, IQLineSeparator +from openpilot.system.ui.iqwidgets.widgets.list_view import PickerGroup, PickerItem, PickerDialog from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.lib.multilang import tr, tr_noop @@ -60,8 +60,8 @@ from openpilot.iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUS from openpilot.selfdrive.ui.layouts.settings import settings as OP from openpilot.selfdrive.ui.layouts.settings.toggles import TogglesLayout from openpilot.system.hardware import HARDWARE -from openpilot.system.ui.iqpilot.lib.styles import metrics -from openpilot.system.ui.iqpilot.widgets.list_view import ( +from openpilot.system.ui.iqwidgets.lib.styles import metrics +from openpilot.system.ui.iqwidgets.widgets.list_view import ( option_item as option_item, multiple_button_item as multiple_button_item, button_item as button_item, @@ -69,11 +69,11 @@ from openpilot.system.ui.iqpilot.widgets.list_view import ( NavSectionButton, Spacer, ) -from openpilot.system.ui.iqpilot.widgets.list_view import IQListItem -from openpilot.system.ui.iqpilot.widgets.list_view import IQListItem, IQMultipleButtonAction, IQToggleAction, IQLineSeparator -from openpilot.system.ui.iqpilot.widgets.list_view import button_item, toggle_item -from openpilot.system.ui.iqpilot.widgets.list_view import NoticeModal -from openpilot.system.ui.iqpilot.widgets.list_view import TreeOptionDialog, TreeNode, TreeFolder +from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem +from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem, IQMultipleButtonAction, IQToggleAction, IQLineSeparator +from openpilot.system.ui.iqwidgets.widgets.list_view import button_item, toggle_item +from openpilot.system.ui.iqwidgets.widgets.list_view import NoticeModal +from openpilot.system.ui.iqwidgets.widgets.list_view import PickerDialog, PickerItem, PickerGroup from openpilot.system.ui.lib.application import gui_app, MousePos from openpilot.system.ui.lib.multilang import tr_noop from openpilot.system.ui.lib.text_measure import measure_text_cached @@ -96,9 +96,9 @@ from iqdbc.car.hyundai.values import CAR, CANFD_UNSUPPORTED_LONGITUDINAL_CAR, UN from iqdbc.car.subaru.values import CAR, SubaruFlags from iqdbc.car.volkswagen.values import CAR, VolkswagenFlags from openpilot.common.basedir import BASEDIR -from openpilot.system.ui.iqpilot.lib.styles import ink -from openpilot.system.ui.iqpilot.widgets.list_view import multiple_button_item -from openpilot.system.ui.iqpilot.widgets.list_view import toggle_item +from openpilot.system.ui.iqwidgets.lib.styles import ink +from openpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item +from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item from openpilot.system.ui.lib.application import gui_app, FontWeight from openpilot.system.ui.widgets.list_view import ButtonAction import json @@ -409,15 +409,15 @@ class IQMapsLayout(Widget): "take over the moment connectivity drops. Tiles come down with your selected region."), param="OfflineOSMaps", ) - self._delete_maps_btn = IQListItem(tr("Downloaded Maps"), action_item=NoElideButtonAction(tr("DELETE"), enabled=True), + self._delete_maps_btn = IQListItem(tr("Downloaded Maps"), action_item=WideButtonAction(tr("DELETE"), enabled=True), callback=self._confirm_wipe) self._progress = progress_item(tr("Downloading Map")) self._tile_progress = progress_item(tr("Downloading Map Tiles")) - self._update_btn = IQListItem(tr("Database Update"), action_item=NoElideButtonAction(tr("CHECK"), enabled=True), + self._update_btn = IQListItem(tr("Database Update"), action_item=WideButtonAction(tr("CHECK"), enabled=True), callback=self._confirm_db_refresh) - self._country_btn = IQListItem(tr("Country"), action_item=NoElideButtonAction(tr("SELECT"), enabled=True), + self._country_btn = IQListItem(tr("Country"), action_item=WideButtonAction(tr("SELECT"), enabled=True), callback=lambda: self._open_region_picker("Country")) - self._state_btn = IQListItem(tr("State"), action_item=NoElideButtonAction(tr("SELECT"), enabled=True), + self._state_btn = IQListItem(tr("State"), action_item=WideButtonAction(tr("SELECT"), enabled=True), callback=lambda: self._open_region_picker("State")) self.items = [self._mapd_version, self._online_maps_toggle, self._offline_maps_toggle, self._delete_maps_btn, @@ -483,7 +483,7 @@ class IQMapsLayout(Widget): url = _BOUNDS_BASE_URL + ("nation_bounding_boxes.json" if region_type == "Country" else "us_states_bounding_boxes.json") try: data = requests.get(url, timeout=10).json() - return sorted((TreeNode(ref=k, data={'display_name': v['full_name']}) for k, v in data.items()), + return sorted((PickerItem(ref=k, data={'display_name': v['full_name']}) for k, v in data.items()), key=lambda n: n.data['display_name']) except Exception: return [] @@ -491,14 +491,14 @@ class IQMapsLayout(Widget): def _region_picker_worker(self, region_type, btn): locations = self._fetch_regions(region_type) if region_type == "State": - locations.insert(0, TreeNode(ref="All", data={'display_name': tr("All states (~6.0 GB)")})) + locations.insert(0, PickerItem(ref="All", data={'display_name': tr("All states (~6.0 GB)")})) btn.action_item.set_enabled(True) btn.action_item.set_text(tr("SELECT")) key = "OsmLocation" if region_type == "Country" else "OsmState" current = ui_state.params.get(f"{key}Name") or "" - dialog = TreeOptionDialog(tr(f"Select {region_type}"), [TreeFolder(folder="", nodes=locations)], + dialog = PickerDialog(tr(f"Select {region_type}"), [PickerGroup(folder="", nodes=locations)], current_ref=current, search_prompt=tr("Perform a search")) done = lambda res: self._on_region_picked(region_type, locations, key, res, dialog.selection_ref) # noqa: E731 dialog.on_exit = done @@ -1319,11 +1319,11 @@ class IQSoftwareLayout(SoftwareLayout): # single flat list: pinned branches first, then the rest alphabetically. # prebuilt ("-prebuilt") branches are internal build outputs, not user-selectable. - pinned_nodes = [TreeNode(b, {'display_name': b}) for b in top_level_branches if b in branches] - other_nodes = [TreeNode(b, {'display_name': b}) for b in sorted(branches) + pinned_nodes = [PickerItem(b, {'display_name': b}) for b in top_level_branches if b in branches] + other_nodes = [PickerItem(b, {'display_name': b}) for b in sorted(branches) if b not in top_level_branches and not b.endswith("-prebuilt")] - folders = [TreeFolder("", pinned_nodes + other_nodes)] + folders = [PickerGroup("", pinned_nodes + other_nodes)] def _on_branch_selected(result): if result == DialogResult.CONFIRM and self._branch_dialog is not None: @@ -1334,7 +1334,7 @@ class IQSoftwareLayout(SoftwareLayout): os.system("pkill -SIGUSR1 -f system.updated.updated") self._branch_dialog = None - self._branch_dialog = TreeOptionDialog(tr("Select a branch"), folders, current_target, "", + self._branch_dialog = PickerDialog(tr("Select a branch"), folders, current_target, "", on_exit=_on_branch_selected) gui_app.set_modal_overlay(self._branch_dialog, callback=_on_branch_selected) @@ -1667,7 +1667,7 @@ class IQDeviceLayout(DeviceLayout): # ===== models ===== if gui_app.iqpilot_ui(): - from openpilot.system.ui.iqpilot.widgets.list_view import button_item as button_item + from openpilot.system.ui.iqwidgets.widgets.list_view import button_item as button_item _ACTIVE_BUNDLE_KEY = "ModelManager_ActiveBundle" _DOWNLOAD_INDEX_KEY = "ModelManager_DownloadIndex" @@ -1694,7 +1694,7 @@ class ModelsLayout(Widget): self.current_model_item = IQListItem( title=tr("Current Model"), description="", - action_item=NoElideButtonAction(tr("SELECT")), + action_item=WideButtonAction(tr("SELECT")), callback=self._handle_current_model_clicked ) @@ -1707,7 +1707,7 @@ class ModelsLayout(Widget): self.clear_cache_item = IQListItem( title=tr("Clear Model Cache"), description="", - action_item=NoElideButtonAction(tr("CLEAR")), + action_item=WideButtonAction(tr("CLEAR")), callback=self._clear_cache ) @@ -1938,7 +1938,7 @@ class ModelsLayout(Widget): @staticmethod def _bundle_to_node(bundle): - return TreeNode(bundle.ref, {'display_name': bundle.displayName, 'short_name': bundle.internalName}) + return PickerItem(bundle.ref, {'display_name': bundle.displayName, 'short_name': bundle.internalName}) def _get_folders(self, favorites): bundles = self.model_manager.availableBundles @@ -1946,14 +1946,14 @@ class ModelsLayout(Widget): for bundle in bundles: folders.setdefault(next((ov_ride.value for ov_ride in bundle.overrides if ov_ride.key == "folder"), ""), []).append(bundle) - folders_list = [TreeFolder("", [TreeNode("Default", {'display_name': tr("Default (CD210)"), 'short_name': "Default"})])] + folders_list = [PickerGroup("", [PickerItem("Default", {'display_name': tr("Default (CD210)"), 'short_name': "Default"})])] for folder, folder_bundles in sorted(folders.items(), key=lambda x: max((bundle.index for bundle in x[1]), default=-1), reverse=True): folder_bundles.sort(key=lambda bundle: bundle.index, reverse=True) name = folder + (f" - (Updated: {m.group(1)})" if folder_bundles and (m := re.search(r'\(([^)]*)\)[^(]*$', folder_bundles[0].displayName)) else "") - folders_list.append(TreeFolder(name, [self._bundle_to_node(bundle) for bundle in folder_bundles])) + folders_list.append(PickerGroup(name, [self._bundle_to_node(bundle) for bundle in folder_bundles])) if favorites and (fav_bundles := [bundle for bundle in bundles if bundle.ref in favorites]): - folders_list.insert(1, TreeFolder("Favorites", [self._bundle_to_node(bundle) for bundle in fav_bundles])) + folders_list.insert(1, PickerGroup("Favorites", [self._bundle_to_node(bundle) for bundle in fav_bundles])) return folders_list def _handle_current_model_clicked(self): @@ -1962,7 +1962,7 @@ class ModelsLayout(Widget): folders_list = self._get_folders(favorites) active_ref = self.model_manager.activeBundle.ref if self._has_active_bundle_param() and self.model_manager.activeBundle else "Default" - self.model_dialog = TreeOptionDialog(tr("Select a Model"), folders_list, active_ref, "ModelManager_Favs", + self.model_dialog = PickerDialog(tr("Select a Model"), folders_list, active_ref, "ModelManager_Favs", get_folders_fn=self._get_folders, on_exit=self._on_model_selected) gui_app.set_modal_overlay(self.model_dialog, callback=self._on_model_selected) @@ -2165,7 +2165,7 @@ class IQSettingsLayout(OP.SettingsLayout): # ===== vehicle_brands_base ===== -class BrandSettings: +class BrandPanel: """Per-brand extra settings rows; brands without any simply don't register.""" def __init__(self): @@ -2184,7 +2184,7 @@ _TUNING_BLURBS = ( ) -class HyundaiSettings(BrandSettings): +class HyundaiSettings(BrandPanel): def __init__(self): super().__init__() self.alpha_long_available = False @@ -2227,7 +2227,7 @@ class HyundaiSettings(BrandSettings): _UNSUPPORTED_FLAGS = SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID -class SubaruSettings(BrandSettings): +class SubaruSettings(BrandPanel): def __init__(self): super().__init__() self._supported = False @@ -2283,7 +2283,7 @@ def _speed_text(kmh: int) -> str: return f"{round(kmh * KM_TO_MILE)} mph" -class TeslaSettings(BrandSettings): +class TeslaSettings(BrandPanel): def __init__(self): super().__init__() self.coop_steering_toggle = toggle_item(tr("VTB (Virtual Torque Blending)"), "", param="TeslaCoopSteering") @@ -2306,7 +2306,7 @@ class TeslaSettings(BrandSettings): # ===== vehicle_brands_toyota ===== -class ToyotaSettings(BrandSettings): +class ToyotaSettings(BrandPanel): def __init__(self): super().__init__() self.enforce_stock_longitudinal = toggle_item( @@ -2361,7 +2361,7 @@ DESCRIPTIONS = { } -class VolkswagenSettings(BrandSettings): +class VolkswagenSettings(BrandPanel): def __init__(self): super().__init__() @@ -2445,7 +2445,7 @@ class VolkswagenSettings(BrandSettings): # ===== vehicle_brands_factory ===== # Only brands that actually ship extra rows appear here; every other brand gets None. -_REGISTRY: dict[str, type[BrandSettings]] = { +_REGISTRY: dict[str, type[BrandPanel]] = { "hyundai": HyundaiSettings, "subaru": SubaruSettings, "tesla": TeslaSettings, @@ -2454,12 +2454,12 @@ _REGISTRY: dict[str, type[BrandSettings]] = { } -def brand_settings_for(brand: str) -> BrandSettings | None: +def brand_settings_for(brand: str) -> BrandPanel | None: cls = _REGISTRY.get(brand) return cls() if cls else None -class BrandSettingsFactory: +class BrandPanelFactory: """Legacy shim for callers using the old factory name.""" create_brand_settings = staticmethod(brand_settings_for) @@ -2516,22 +2516,22 @@ class VehicleSelection: def clear(): ui_state.params.remove("CarPlatformBundle") - def picker_folders(self) -> list[TreeFolder]: - def node_for(name: str) -> TreeNode: + def picker_folders(self) -> list[PickerGroup]: + def node_for(name: str) -> PickerItem: info = self.platforms[name] years = ' '.join(map(str, info.get('year', []))) - return TreeNode(name, { + return PickerItem(name, { 'display_name': name, 'search_tags': f"{name} {info.get('make')} {years} {info.get('model', name)}", }) names = sorted(self.platforms) makes = sorted({self.platforms[n].get('make') for n in names}) - return [TreeFolder(make, [node_for(n) for n in names if self.platforms[n].get('make') == make]) + return [PickerGroup(make, [node_for(n) for n in names if self.platforms[n].get('make') == make]) for make in makes] -class PlatformSelector(Button): +class VehiclePicker(Button): """Row button that either clears a forced platform or opens the vehicle picker.""" def __init__(self, on_platform_change: Callable[[], None] | None = None): @@ -2574,7 +2574,7 @@ class PlatformSelector(Button): self._open_picker() def _open_picker(self): - dialog = TreeOptionDialog( + dialog = PickerDialog( tr("Pick your vehicle"), self.selection.picker_folders(), search_prompt=tr("Search make or model"), @@ -2609,7 +2609,7 @@ _LEGEND = ( class LegendWidget(Widget): """Explains the fingerprint status colours; the active row is highlighted.""" - def __init__(self, platform_selector: PlatformSelector): + def __init__(self, platform_selector: VehiclePicker): super().__init__() self.set_rect(rl.Rectangle(0, 0, 0, 350)) self._selector = platform_selector @@ -2650,7 +2650,7 @@ class VehicleLayout(Widget): super().__init__() self._brand_settings = None self._current_brand = None - self._platform_selector = PlatformSelector(self._on_vehicle_changed) + self._platform_selector = VehiclePicker(self._on_vehicle_changed) self._vehicle_item = IQListItem(title=self._platform_selector.text, action_item=ButtonAction(text=tr("SELECT")), callback=self._platform_selector._on_clicked) self._legend_widget = LegendWidget(self._platform_selector) diff --git a/iqpilot/ui/mici/onroad/hud_renderer.py b/iqpilot/ui/mici/onroad/hud_renderer.py index 5895ffa..e080640 100644 --- a/iqpilot/ui/mici/onroad/hud_renderer.py +++ b/iqpilot/ui/mici/onroad/hud_renderer.py @@ -4,7 +4,7 @@ Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed import pyray as rl from openpilot.selfdrive.ui.mici.onroad.hud_renderer import HudRenderer -from openpilot.iqpilot.ui.onroad.hud_overlays import BlindSpotIndicators +from openpilot.iqpilot.ui.onroad.hud_overlays import IQBlindSpotOverlay class IQMiciHudRenderer(HudRenderer): @@ -16,7 +16,7 @@ class IQMiciHudRenderer(HudRenderer): def __init__(self): super().__init__() - self._overlays = [BlindSpotIndicators()] + self._overlays = [IQBlindSpotOverlay()] def _update_state(self) -> None: super()._update_state() diff --git a/iqpilot/ui/onroad/driver_state.py b/iqpilot/ui/onroad/driver_state.py index 216d4b5..1f3a93d 100644 --- a/iqpilot/ui/onroad/driver_state.py +++ b/iqpilot/ui/onroad/driver_state.py @@ -8,7 +8,7 @@ import pyray as rl from openpilot.common.params import Params from openpilot.selfdrive.ui import UI_BORDER_SIZE from openpilot.selfdrive.ui.onroad.driver_state import DriverStateRenderer, BTN_SIZE, ARC_LENGTH -from openpilot.iqpilot.ui.onroad.hud_overlays import DeveloperUiRenderer +from openpilot.iqpilot.ui.onroad.hud_overlays import IQDevMetricsOverlay from openpilot.system.ui.lib.application import gui_app, FontWeight from openpilot.system.ui.lib.text_measure import measure_text_cached @@ -50,7 +50,7 @@ class DriverStateRendererIQ(DriverStateRenderer): self._toast_color: rl.Color = rl.WHITE self._font = gui_app.font(FontWeight.SEMI_BOLD) - self.dev_ui_offset = DeveloperUiRenderer.get_bottom_dev_ui_offset() + self.dev_ui_offset = IQDevMetricsOverlay.get_bottom_dev_ui_offset() self._dm_background = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_background.png", BTN_SIZE, BTN_SIZE) self._dm_person = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_person.png", 118, 118) self._dm_cone = gui_app.texture("icons_mici/onroad/driver_monitoring/dm_cone.png", 118, 118) diff --git a/iqpilot/ui/onroad/hud_overlays.py b/iqpilot/ui/onroad/hud_overlays.py index e58968a..33598f6 100644 --- a/iqpilot/ui/onroad/hud_overlays.py +++ b/iqpilot/ui/onroad/hud_overlays.py @@ -22,7 +22,7 @@ from openpilot.selfdrive.ui.mici.onroad.alert_renderer import IconSide, TURN_SIG from openpilot.system.ui.lib.application import gui_app, FontWeight from openpilot.system.ui.lib.multilang import tr from openpilot.system.ui.widgets import Widget -from openpilot.system.ui.iqpilot.lib import canvas +from openpilot.system.ui.iqwidgets.lib import canvas from iqdbc.car.volkswagen.values import VolkswagenFlags @@ -50,14 +50,19 @@ _STRIP_DECEL = (255, 0, 247) _STRIP_DECEL_NEON = (255, 145, 251) _STRIP_TIP_ALPHA = 235 _STRIP_ROOT_ALPHA = 55 -# neon edge: opaque core inside the cap, then non-overlapping halo bands outside it -_STRIP_CORE = 3.0 +_STRIP_CORE_DEPTH = 7.0 +_STRIP_CORE_LAYERS = 8 +_STRIP_CORE_ALPHA = 0.15 _STRIP_CORE_FLOOR = 0.3 -_STRIP_HALO = ((3.0, 0.42), (5.0, 0.14)) +_STRIP_CORE_TAIL = 22.0 +_STRIP_HALO_SPREAD = 11.0 +_STRIP_HALO_LAYERS = 11 +_STRIP_HALO_ALPHA = 0.095 +_STRIP_HALO_TAIL = 34.0 _STRIP_NEON_FULL = 2.0 # m/s^2 at which the edges reach full brightness -class RocketFuel: +class IQAccelBar: def __init__(self): self._eased = 0.0 @@ -70,16 +75,46 @@ class RocketFuel: return canvas.shade(*fill, int(_STRIP_TIP_ALPHA + (_STRIP_ROOT_ALPHA - _STRIP_TIP_ALPHA) * frac)) @staticmethod - def _cap(center, cap: float, up: bool, fill, neon, heat: float) -> None: + def _halo(center, cap: float, up: bool, neon, heat: float, tail: float) -> None: + step = int(255 * _STRIP_HALO_ALPHA * heat) + if step < 1: + return + start, end = (180.0, 360.0) if up else (0.0, 180.0) + tint = canvas.shade(*neon, step) + faded = canvas.shade(*neon, 0) + top, bottom = (tint, faded) if up else (faded, tint) + for i in range(_STRIP_HALO_LAYERS): + spread = _STRIP_HALO_SPREAD * (1.0 - i / _STRIP_HALO_LAYERS) + if spread <= 0.0: + continue + canvas.annulus(center, cap, cap + spread, start, end, _STRIP_ARC_SEGMENTS, tint) + if tail <= 0.0: + continue + run = min(tail, _STRIP_HALO_TAIL) + y = center.y if up else center.y - run + canvas.v_sweep(center.x - cap - spread, y, spread, run, top, bottom) + canvas.v_sweep(center.x + cap, y, spread, run, top, bottom) + + @staticmethod + def _cap(center, cap: float, up: bool, fill, neon, heat: float, tail: float) -> None: start, end = (180.0, 360.0) if up else (0.0, 180.0) canvas.annulus(center, 0.0, cap, start, end, _STRIP_ARC_SEGMENTS, fill) - edge = cap - for spread, weight in _STRIP_HALO: - canvas.annulus(center, edge, edge + spread, start, end, _STRIP_ARC_SEGMENTS, - canvas.shade(*neon, int(255 * heat * weight))) - edge += spread - core = canvas.shade(*neon, int(255 * (_STRIP_CORE_FLOOR + (1.0 - _STRIP_CORE_FLOOR) * heat))) - canvas.annulus(center, max(0.0, cap - _STRIP_CORE), cap, start, end, _STRIP_ARC_SEGMENTS, core) + IQAccelBar._halo(center, cap, up, neon, heat, tail) + lit = _STRIP_CORE_FLOOR + (1.0 - _STRIP_CORE_FLOOR) * heat + core = canvas.shade(*neon, max(1, int(255 * _STRIP_CORE_ALPHA * lit))) + faded = canvas.shade(*neon, 0) + top, bottom = (core, faded) if up else (faded, core) + run = min(tail, _STRIP_CORE_TAIL) + for i in range(_STRIP_CORE_LAYERS): + depth = _STRIP_CORE_DEPTH * (1.0 - i / _STRIP_CORE_LAYERS) + if depth <= 0.0: + continue + canvas.annulus(center, max(0.0, cap - depth), cap, start, end, _STRIP_ARC_SEGMENTS, core) + if run <= 0.0: + continue + y = center.y if up else center.y - run + canvas.v_sweep(center.x - cap, y, depth, run, top, bottom) + canvas.v_sweep(center.x + cap - depth, y, depth, run, top, bottom) def render(self, rect, sm) -> None: if not ui_state.rocket_fuel: @@ -100,8 +135,9 @@ class RocketFuel: canvas.v_sweep(x, top + cap, cap * 2.0, reach - cap * 2.0, self._tint(fill, frac_top), self._tint(fill, frac_bottom)) - self._cap(canvas.Pt(x + cap, top + cap), cap, True, self._tint(fill, frac_top), neon, heat) - self._cap(canvas.Pt(x + cap, top + reach - cap), cap, False, self._tint(fill, frac_bottom), neon, heat) + tail = max(0.0, reach / 2.0 - cap) + self._cap(canvas.Pt(x + cap, top + cap), cap, True, self._tint(fill, frac_top), neon, heat, tail) + self._cap(canvas.Pt(x + cap, top + reach - cap), cap, False, self._tint(fill, frac_bottom), neon, heat, tail) # ============================================================================ @@ -130,7 +166,7 @@ class _BlindSide: canvas.stamp(tex, x, rect.y + _BS_DROP, canvas.shade(255, 255, 255, int(255 * self.glow.x))) -class BlindSpotIndicators: +class IQBlindSpotOverlay: def __init__(self): self._left = _BlindSide("left") self._right = _BlindSide("right") @@ -159,7 +195,7 @@ _MQB_CLUSTER_EXEMPT = (VolkswagenFlags.PQ | VolkswagenFlags.MLB | VolkswagenFlag VolkswagenFlags.MEB_GEN2 | VolkswagenFlags.MQB_EVO) -class SpeedRenderer: +class IQSpeedOverlay: def __init__(self): self.speed: float = 0.0 self._cluster_ever_live: bool = False @@ -323,7 +359,7 @@ def _lamp_modes(event_name: str, cs, remembered): return left, right, None -class TurnSignalController: +class IQTurnSignalOverlay: def __init__(self, config: TurnSignalConfig | None = None): self._config = config or TurnSignalConfig() self._lamps = {IconSide.left: _IndicatorLamp(IconSide.left), @@ -740,7 +776,7 @@ def _desired_probe(sm): return desired_lat_accel -class DeveloperUiRenderer(Widget): +class IQDevMetricsOverlay(Widget): DEV_UI_OFF = 0 DEV_UI_RIGHT = 1 DEV_UI_BOTTOM = 2 @@ -754,7 +790,7 @@ class DeveloperUiRenderer(Widget): @staticmethod def get_bottom_dev_ui_offset(): - return DeveloperUiRenderer.BOTTOM_BAR_HEIGHT if ui_state.developer_ui != DeveloperUiRenderer.DEV_UI_OFF else 0 + return IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT if ui_state.developer_ui != IQDevMetricsOverlay.DEV_UI_OFF else 0 def _update_state(self) -> None: self.dev_ui_mode = ui_state.developer_ui @@ -813,7 +849,7 @@ def _dim(color, alpha: float): return canvas.with_opacity(color, 255 * alpha) -class SpeedLimitRenderer(Widget): +class IQSpeedLimitOverlay(Widget): """Regulatory sign, upcoming-limit preview and pre-active nudge arrows.""" def __init__(self): diff --git a/iqpilot/ui/onroad/hud_renderer.py b/iqpilot/ui/onroad/hud_renderer.py index 59930d4..d0505db 100644 --- a/iqpilot/ui/onroad/hud_renderer.py +++ b/iqpilot/ui/onroad/hud_renderer.py @@ -11,12 +11,12 @@ from openpilot.selfdrive.ui.mici.onroad.torque_bar import TorqueBar from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.selfdrive.ui.onroad.hud_renderer import HudRenderer from openpilot.iqpilot.ui.onroad.hud_overlays import ( - DeveloperUiRenderer, + IQDevMetricsOverlay, RoadNameRenderer, - RocketFuel, - SpeedLimitRenderer, - TurnSignalController, - SpeedRenderer, + IQAccelBar, + IQSpeedLimitOverlay, + IQTurnSignalOverlay, + IQSpeedOverlay, ) from openpilot.iqpilot.ui.onroad.nav_map_panel import NavMapPanel from openpilot.iqpilot.ui.onroad.soft_warning import SoftWarningRenderer @@ -28,13 +28,13 @@ ENABLE_SPLIT_NAV_MAP_PANEL = True class IQHudRenderer(HudRenderer): def __init__(self): super().__init__() - self.developer_ui = DeveloperUiRenderer() + self.developer_ui = IQDevMetricsOverlay() self.nav_map_panel = NavMapPanel() self.road_name_renderer = RoadNameRenderer() - self.rocket_fuel = RocketFuel() - self.speed_limit_renderer = SpeedLimitRenderer() - self.turn_signal_controller = TurnSignalController() - self.speed_renderer = SpeedRenderer() + self.rocket_fuel = IQAccelBar() + self.speed_limit_renderer = IQSpeedLimitOverlay() + self.turn_signal_controller = IQTurnSignalOverlay() + self.speed_renderer = IQSpeedOverlay() self.soft_warning_renderer = SoftWarningRenderer() self._torque_bar = TorqueBar(scale=3.0, always=True) @@ -59,8 +59,8 @@ class IQHudRenderer(HudRenderer): if ui_state.torque_bar: torque_rect = rect - if ui_state.developer_ui in (DeveloperUiRenderer.DEV_UI_BOTTOM, DeveloperUiRenderer.DEV_UI_BOTH): - torque_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height - DeveloperUiRenderer.BOTTOM_BAR_HEIGHT) + if ui_state.developer_ui in (IQDevMetricsOverlay.DEV_UI_BOTTOM, IQDevMetricsOverlay.DEV_UI_BOTH): + torque_rect = rl.Rectangle(rect.x, rect.y, rect.width, rect.height - IQDevMetricsOverlay.BOTTOM_BAR_HEIGHT) self._torque_bar.render(torque_rect) if not self.split_nav_enabled(): diff --git a/launch_env.sh b/launch_env.sh index 1ca9150..2869567 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -23,7 +23,7 @@ if [ -z "$AGNOS_VERSION" ]; then case "$DEVICE_MODEL" in *) - export AGNOS_VERSION="IQ.OS 4.8" + export AGNOS_VERSION="IQ.OS 4.9" ;; esac fi diff --git a/msgq_repo/msgq/msgq.cc b/msgq_repo/msgq/msgq.cc index d9e4ed4..2b2493a 100644 --- a/msgq_repo/msgq/msgq.cc +++ b/msgq_repo/msgq/msgq.cc @@ -161,6 +161,7 @@ void msgq_init_publisher(msgq_queue_t * q) { //std::cout << "Starting publisher" << std::endl; uint64_t uid = msgq_get_uid(); + q->last_reap_us = 0; *q->write_uid = uid; *q->num_readers = 0; @@ -173,6 +174,7 @@ void msgq_init_publisher(msgq_queue_t * q) { } static void thread_signal(uint32_t tid) { + if (tid == 0) return; #ifdef __APPLE__ // macOS doesn't have tkill, rely on polling instead (void)tid; @@ -184,6 +186,39 @@ static void thread_signal(uint32_t tid) { #endif } +#ifdef __linux__ +// Zero reader slots whose owning thread died without closing, so the notify loop +// stops signaling their TIDs: the kernel recycles TIDs, and a stale slot means +// every send fires SIGUSR2 at an unrelated process — fatal for one with no +// handler installed (e.g. a subscriber's short-lived compiler child). Amortized +// to ~1Hz per publisher; reclaim-at-overflow alone leaves stale slots signaled +// indefinitely while the table has free space. +static void msgq_reap_dead_readers(msgq_queue_t *q) { + int64_t now_us = std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()).count(); + if (now_us - q->last_reap_us < 1000000) + return; + q->last_reap_us = now_us; + + uint64_t num_readers = std::min(NUM_READERS, *q->num_readers); + for (uint64_t i = 0; i < num_readers; i++){ + uint64_t slot_uid = *q->read_uids[i]; + uint32_t slot_tid = slot_uid & 0xFFFFFFFF; + if (slot_uid == 0 || slot_tid == 0) + continue; + char proc_path[32]; + snprintf(proc_path, sizeof(proc_path), "/proc/%u", slot_tid); + struct stat st; + if (stat(proc_path, &st) == 0) + continue; + uint64_t expected = slot_uid; + if (std::atomic_compare_exchange_strong(q->read_uids[i], &expected, (uint64_t)0)){ + *q->read_valids[i] = false; + } + } +} +#endif + // claim slot i (its uid CAS already succeeded) for the calling thread static void msgq_claim_slot(msgq_queue_t * q, size_t i, uint64_t uid) { q->reader_id = i; @@ -378,6 +413,10 @@ int msgq_msg_send(msgq_msg_t * msg, msgq_queue_t *q){ uint32_t new_ptr = ALIGN(write_pointer + msg->size + sizeof(int64_t)); PACK64(*q->write_pointer, write_cycles, new_ptr); +#ifdef __linux__ + msgq_reap_dead_readers(q); +#endif + // Notify readers for (uint64_t i = 0; i < num_readers; i++){ uint64_t reader_uid = *q->read_uids[i]; diff --git a/msgq_repo/msgq/msgq.h b/msgq_repo/msgq/msgq.h index 195ae06..539e4dc 100644 --- a/msgq_repo/msgq/msgq.h +++ b/msgq_repo/msgq/msgq.h @@ -41,6 +41,7 @@ struct msgq_queue_t { int reader_id; uint64_t read_uid_local; uint64_t write_uid_local; + int64_t last_reap_us; bool read_conflate; std::string endpoint; diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index a0b6d47..0b2bdc1 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -129,7 +129,7 @@ class Car: self.CI = get_car(*self.can_callbacks, obd_callback(self.params), alpha_long_allowed, is_release, num_pandas, cached_params, fixed_fingerprint, init_params_list_iq, is_release_iq) - iqpilot_interfaces.setup_interfaces(self.CI, self.params) + iqpilot_interfaces.apply_iq_car_config(self.CI, self.params) self.RI = interfaces[self.CI.CP.carFingerprint].RadarInterface(self.CI.CP, self.CI.CP_IQ) self.CP = self.CI.CP self.CP_IQ = self.CI.CP_IQ diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index 286cdbb..2991300 100644 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -39,7 +39,7 @@ class TestCarInterfaces: car_interface.CP.openpilotLongitudinalControl = False car_params = car_interface.CP.as_reader() car_params_iq = car_interface.CP_IQ - iqpilot_interfaces.setup_interfaces(car_interface) + iqpilot_interfaces.apply_iq_car_config(car_interface) cc_msg = FuzzyGenerator.get_random_msg(data.draw, car.CarControl, real_floats=True) cc_sp_msg = FuzzyGenerator.get_random_msg(data.draw, custom.IQCarControl, real_floats=True) diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index 24227de..a407ffa 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -10,8 +10,8 @@ import numpy as np from cereal import log, custom # noqa: F401 (custom kept available for downstream imports) from iqdbc.car import structs from iqdbc.car.lateral import FRICTION_THRESHOLD, get_friction -from iqdbc.iqpilot.car.interfaces import LatControlInputs -from iqdbc.iqpilot.car.iq_lateral import get_friction as get_friction_in_torque_space +from iqdbc.lvbs.car.interfaces import LatControlInputs +from iqdbc.lvbs.car.iq_lateral import get_friction as get_friction_in_torque_space from openpilot.common.basedir import BASEDIR from openpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY from openpilot.common.filter_simple import FirstOrderFilter diff --git a/selfdrive/controls/tests/test_latcontrol.py b/selfdrive/controls/tests/test_latcontrol.py index 5d54397..93e8f30 100644 --- a/selfdrive/controls/tests/test_latcontrol.py +++ b/selfdrive/controls/tests/test_latcontrol.py @@ -26,7 +26,7 @@ class TestLatControl: CP = CarInterface.get_non_essential_params(car_name) CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name) CI = CarInterface(CP, CP_IQ) - iqpilot_interfaces.setup_interfaces(CI) + iqpilot_interfaces.apply_iq_car_config(CI) CP_IQ = convert_to_capnp(CP_IQ) VM = VehicleModel(CP) diff --git a/selfdrive/controls/tests/test_latcontrol_torque_buffer.py b/selfdrive/controls/tests/test_latcontrol_torque_buffer.py index 798d49b..06aac5e 100644 --- a/selfdrive/controls/tests/test_latcontrol_torque_buffer.py +++ b/selfdrive/controls/tests/test_latcontrol_torque_buffer.py @@ -17,7 +17,7 @@ def get_controller(car_name): CP = CarInterface.get_non_essential_params(car_name) CP_IQ = CarInterface.get_non_essential_params_iq(CP, car_name) CI = CarInterface(CP, CP_IQ) - iqpilot_interfaces.setup_interfaces(CI) + iqpilot_interfaces.apply_iq_car_config(CI) CP_IQ = convert_to_capnp(CP_IQ) VM = VehicleModel(CP) controller = LatControlTorque(CP.as_reader(), CP_IQ.as_reader(), CI, DT_CTRL) diff --git a/selfdrive/ui/layouts/settings/developer.py b/selfdrive/ui/layouts/settings/developer.py index c2004e9..7a45da0 100644 --- a/selfdrive/ui/layouts/settings/developer.py +++ b/selfdrive/ui/layouts/settings/developer.py @@ -9,7 +9,7 @@ from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.multilang import tr, tr_noop if gui_app.iqpilot_ui(): - from openpilot.system.ui.iqpilot.widgets.list_view import toggle_item + from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item # Description constants DESCRIPTIONS = { diff --git a/selfdrive/ui/layouts/settings/device.py b/selfdrive/ui/layouts/settings/device.py index 30aebc7..f65eb7a 100644 --- a/selfdrive/ui/layouts/settings/device.py +++ b/selfdrive/ui/layouts/settings/device.py @@ -21,7 +21,7 @@ from openpilot.system.ui.widgets.option_dialog import MultiOptionDialog from openpilot.system.ui.widgets.scroller_tici import Scroller if gui_app.iqpilot_ui(): - from openpilot.system.ui.iqpilot.widgets.list_view import button_item + from openpilot.system.ui.iqwidgets.widgets.list_view import button_item # Description constants DESCRIPTIONS = { diff --git a/selfdrive/ui/layouts/settings/software.py b/selfdrive/ui/layouts/settings/software.py index 9dc8e3e..712eb9f 100644 --- a/selfdrive/ui/layouts/settings/software.py +++ b/selfdrive/ui/layouts/settings/software.py @@ -12,7 +12,7 @@ from openpilot.system.ui.widgets.option_dialog import MultiOptionDialog from openpilot.system.ui.widgets.scroller_tici import Scroller if gui_app.iqpilot_ui(): - from openpilot.system.ui.iqpilot.widgets.list_view import button_item + from openpilot.system.ui.iqwidgets.widgets.list_view import button_item # TODO: remove this. updater fails to respond on startup if time is not correct UPDATED_TIMEOUT = 10 # seconds to wait for updated to respond @@ -237,7 +237,7 @@ class SoftwareLayout(Widget): def _on_auth_branch(self): # Collect username then token; store encrypted and signal the updater to # re-check (refreshing the available-branch list for private repos). - from openpilot.system.ui.iqpilot.widgets.list_view import open_text_prompt + from openpilot.system.ui.iqwidgets.widgets.list_view import open_text_prompt from openpilot.common import git_creds creds = git_creds.get_credentials() diff --git a/selfdrive/ui/layouts/settings/toggles.py b/selfdrive/ui/layouts/settings/toggles.py index 9974ebf..eda7e3b 100644 --- a/selfdrive/ui/layouts/settings/toggles.py +++ b/selfdrive/ui/layouts/settings/toggles.py @@ -10,8 +10,8 @@ from openpilot.system.ui.widgets import DialogResult from openpilot.selfdrive.ui.ui_state import ui_state if gui_app.iqpilot_ui(): - from openpilot.system.ui.iqpilot.widgets.list_view import toggle_item - from openpilot.system.ui.iqpilot.widgets.list_view import multiple_button_item + from openpilot.system.ui.iqwidgets.widgets.list_view import toggle_item + from openpilot.system.ui.iqwidgets.widgets.list_view import multiple_button_item from openpilot.iqpilot.ui.layouts.settings.iq_dynamic import IQDynamicLayout PERSONALITY_TO_INT = log.LongitudinalPersonality.schema.enumerants diff --git a/selfdrive/ui/mici/layouts/settings/models.py b/selfdrive/ui/mici/layouts/settings/models.py index d6d1aba..1d24f1a 100644 --- a/selfdrive/ui/mici/layouts/settings/models.py +++ b/selfdrive/ui/mici/layouts/settings/models.py @@ -10,7 +10,7 @@ import pyray as rl from cereal import custom -from openpilot.system.ui.iqpilot.widgets.helpers.glyphs import draw_star +from openpilot.system.ui.iqwidgets.widgets.helpers.glyphs import draw_star from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.system.ui.lib.application import gui_app diff --git a/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py b/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py index ea48633..cfca724 100644 --- a/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py +++ b/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py @@ -99,6 +99,32 @@ class ForgetButton(Widget): rl.draw_texture_ex(self._trash_txt, (trash_x, trash_y), 0, 1.0, rl.WHITE) +class DisconnectButton(Widget): + MARGIN = 12 + RADIUS = 42 + # the only round button art is the destructive red one, and dropping a connection is not destructive + BG = rl.Color(56, 56, 61, 255) + BG_PRESSED = rl.Color(84, 84, 90, 255) + + def __init__(self, disconnect_network: Callable): + super().__init__() + self._disconnect_network = disconnect_network + self._slash_txt = gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 38, 38) + self.set_rect(rl.Rectangle(0, 0, 84 + self.MARGIN * 2, 84 + self.MARGIN * 2)) + + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + dlg = BigConfirmationDialog("slide to\ndisconnect", gui_app.texture("icons_mici/settings/network/wifi_strength_slash.png", 54, 54), + self._disconnect_network) + gui_app.push_widget(dlg) + + def _render(self, _): + center = rl.Vector2(self._rect.x + self._rect.width / 2, self._rect.y + self._rect.height / 2) + rl.draw_circle_v(center, self.RADIUS, self.BG_PRESSED if self.is_pressed else self.BG) + rl.draw_texture_ex(self._slash_txt, (center.x - self._slash_txt.width / 2, center.y - self._slash_txt.height / 2), + 0, 1.0, rl.WHITE) + + class WifiButton(BigButton): LABEL_PADDING = 98 LABEL_WIDTH = 402 - 98 - 28 @@ -111,9 +137,11 @@ class WifiButton(BigButton): self._connecting_ssid = connecting_ssid self._wifi_icon = WifiIcon(network) self._forget_btn = ForgetButton(self._forget_network) + self._disconnect_btn = DisconnectButton(self._disconnect_network) self._check_txt = gui_app.texture("icons_mici/setup/driver_monitoring/dm_check.png", 32, 32) self._network_missing = False self._network_forgetting = False + self._network_disconnecting = False self._wrong_password = False @property @@ -142,9 +170,18 @@ class WifiButton(BigButton): self._network_forgetting = True self._wifi_manager.forget_connection(self._network.ssid) + def _disconnect_network(self): + if self._network_disconnecting: + return + self._network_disconnecting = True + self._wifi_manager.disconnect_connection(self._network.ssid) + def on_forgotten(self): self._network_forgetting = False + def on_disconnected(self): + self._network_disconnecting = False + def set_network_missing(self, missing: bool): self._network_missing = missing self._wifi_icon.set_network_missing(missing) @@ -171,31 +208,44 @@ class WifiButton(BigButton): @property def _show_forget_btn(self) -> bool: - if self._is_tethering or self._network_forgetting: + if self._is_tethering or self._network_forgetting or self._show_disconnect_btn: return False return (self._is_saved and not self._wrong_password) or self._is_connecting + @property + def _show_disconnect_btn(self) -> bool: + # 402 units of row cannot hold both buttons plus the status word, so the slot is contextual: + # disconnect while connected, forget once it is only saved + if self._is_tethering or self._network_forgetting or self._network_disconnecting: + return False + return self._is_connected + def _handle_mouse_release(self, mouse_pos: MousePos): if self._show_forget_btn and rl.check_collision_point_rec(mouse_pos, self._forget_btn.rect): return + if self._show_disconnect_btn and rl.check_collision_point_rec(mouse_pos, self._disconnect_btn.rect): + return super()._handle_mouse_release(mouse_pos) def _get_label_font_size(self): return 48 def set_touch_valid_callback(self, touch_callback: Callable[[], bool]) -> None: - super().set_touch_valid_callback(lambda: touch_callback() and not self._forget_btn.is_pressed) + super().set_touch_valid_callback(lambda: touch_callback() and not self._forget_btn.is_pressed and not self._disconnect_btn.is_pressed) self._forget_btn.set_touch_valid_callback(touch_callback) + self._disconnect_btn.set_touch_valid_callback(touch_callback) def _update_state(self): super()._update_state() if any((self._network_missing, self._is_connecting, self._is_connected, self._network_forgetting, - self._network.security_type == SecurityType.UNSUPPORTED)): + self._network_disconnecting, self._network.security_type == SecurityType.UNSUPPORTED)): self.set_enabled(False) self._sub_label.set_color(rl.Color(255, 255, 255, int(255 * 0.585))) self._sub_label.set_font_weight(FontWeight.ROMAN) if self._network_forgetting: self.set_value("forgetting...") + elif self._network_disconnecting: + self.set_value("disconnecting...") elif self._is_connecting: self.set_value("starting..." if self._is_tethering else "connecting...") elif self._is_connected: @@ -219,9 +269,10 @@ class WifiButton(BigButton): if self.value: sub_label_x = self._rect.x + self.LABEL_HORIZONTAL_PADDING label_y = btn_y + self._rect.height - self.LABEL_VERTICAL_PADDING - sub_label_w = self.SUB_LABEL_WIDTH - (self._forget_btn.rect.width if self._show_forget_btn else 0) + sub_label_w = self.SUB_LABEL_WIDTH - (self._forget_btn.rect.width if self._show_forget_btn else 0) \ + - (self._disconnect_btn.rect.width if self._show_disconnect_btn else 0) sub_label_height = self._sub_label.get_content_height(sub_label_w) - if self._is_connected and not self._network_forgetting: + if self._is_connected and not self._network_forgetting and not self._network_disconnecting: check_y = int(label_y - sub_label_height + (sub_label_height - self._check_txt.height) / 2) rl.draw_texture_ex(self._check_txt, rl.Vector2(sub_label_x, check_y), 0.0, 1.0, rl.Color(255, 255, 255, int(255 * 0.9 * 0.65))) sub_label_x += self._check_txt.width + 14 @@ -230,11 +281,19 @@ class WifiButton(BigButton): self._wifi_icon.render(rl.Rectangle(self._rect.x + 30, btn_y + 30, self._wifi_icon.rect.width, self._wifi_icon.rect.height)) + btn_right = self._rect.x + self._rect.width if self._show_forget_btn: self._forget_btn.render(rl.Rectangle( - self._rect.x + self._rect.width - self._forget_btn.rect.width, + btn_right - self._forget_btn.rect.width, btn_y + self._rect.height - self._forget_btn.rect.height, self._forget_btn.rect.width, self._forget_btn.rect.height)) + btn_right -= self._forget_btn.rect.width + + if self._show_disconnect_btn: + self._disconnect_btn.render(rl.Rectangle( + btn_right - self._disconnect_btn.rect.width, + btn_y + self._rect.height - self._disconnect_btn.rect.height, + self._disconnect_btn.rect.width, self._disconnect_btn.rect.height)) class ScanningButton(BigButton): @@ -298,6 +357,9 @@ class WifiUIMici(NavScroller): def _on_disconnected(self): self._connecting = None + for btn in self._scroller.items: + if isinstance(btn, WifiButton): + btn.on_disconnected() def _on_forgotten(self, ssid=None): self._connecting = None diff --git a/selfdrive/ui/onroad/model_renderer.py b/selfdrive/ui/onroad/model_renderer.py index 667761e..ec10c64 100644 --- a/selfdrive/ui/onroad/model_renderer.py +++ b/selfdrive/ui/onroad/model_renderer.py @@ -89,7 +89,7 @@ class ModelRenderer(Widget, IQModelRenderer): self._path_offset_z = HEIGHT_INIT[0] self._counter = -1 self._camera_offset = ui_state.params.get("CameraOffset", return_default=True) if ui_state.active_bundle else 0.0 - self._ambient_dots = ui_state.params.get_bool("AmbientTrackDots") + self._ambient_dots = bool(ui_state.params.get("AmbientTrackDots", return_default=True)) # Initialize ModelPoints objects self._path = ModelPoints() self._lane_lines = [ModelPoints() for _ in range(4)] @@ -143,7 +143,7 @@ class ModelRenderer(Widget, IQModelRenderer): if self._counter % 60 == 0: self._camera_offset = ui_state.params.get("CameraOffset", return_default=True) if ui_state.active_bundle else 0.0 - self._ambient_dots = ui_state.params.get_bool("AmbientTrackDots") + self._ambient_dots = bool(ui_state.params.get("AmbientTrackDots", return_default=True)) self._counter += 1 if sm.updated['carParams']: @@ -456,18 +456,17 @@ class ModelRenderer(Widget, IQModelRenderer): draw_polygon(self._rect, self._path.projected_points, gradient=gradient) def _draw_vision_dots(self): - src = rl.Rectangle(0, 0, self._lead_orb.width, self._lead_orb.height) for dot in self._vision_dots: a = dot.alpha if a <= 0.02: continue + x, y, r = int(dot.x), int(dot.y), dot.radius if dot.rgb is None: - r = dot.radius - dest = rl.Rectangle(dot.x, dot.y, r * 2.0, r * 2.0) - rl.draw_texture_pro(self._lead_orb, src, dest, rl.Vector2(r, r), 0.0, rl.Color(255, 255, 255, int(90 * a))) + # soft teal glow, brighter in the center fading to transparent at the edge + rl.draw_circle_gradient(x, y, r, rl.Color(120, 235, 225, int(165 * a)), rl.Color(0, 150, 150, 0)) else: - rl.draw_circle(int(dot.x), int(dot.y), dot.radius, rl.Color(dot.rgb[0], dot.rgb[1], dot.rgb[2], int(200 * a))) - rl.draw_circle_lines(int(dot.x), int(dot.y), dot.radius, rl.Color(255, 255, 255, int(160 * a))) + rl.draw_circle_gradient(x, y, r, rl.Color(dot.rgb[0], dot.rgb[1], dot.rgb[2], int(210 * a)), + rl.Color(dot.rgb[0], dot.rgb[1], dot.rgb[2], 0)) def _draw_track_dots(self): src = rl.Rectangle(0, 0, self._lead_orb.width, self._lead_orb.height) diff --git a/system/hardware/base.py b/system/hardware/base.py index 455dcfa..6dac5f6 100644 --- a/system/hardware/base.py +++ b/system/hardware/base.py @@ -200,6 +200,9 @@ class HardwareBase(ABC): def reboot_modem(self): pass + def recover_sim_detection(self) -> bool: + return False + def get_networks(self): return None diff --git a/system/hardware/hardwared.py b/system/hardware/hardwared.py index f55d5d3..8a9a7e0 100755 --- a/system/hardware/hardwared.py +++ b/system/hardware/hardwared.py @@ -204,6 +204,7 @@ def hw_state_thread(end_event, hw_queue): modem_configured = False modem_missing_count = 0 modem_restart_count = 0 + sim_detection_recovered = False while not end_event.is_set(): # these are expensive calls. update every 10s @@ -254,6 +255,10 @@ def hw_state_thread(end_event, hw_queue): HARDWARE.configure_modem() modem_configured = True + if modem_configured and not sim_detection_recovered and HARDWARE.recover_sim_detection(): + cloudlog.event("sim missing with hot-swap detect armed, rebooting modem with detect disabled", error=True) + sim_detection_recovered = True + prev_hw_state = hw_state except Exception: cloudlog.exception("Error getting hardware state") @@ -549,15 +554,17 @@ def hardware_thread(end_event, hw_queue) -> None: som_power_draw = HARDWARE.get_som_power_draw() msg.deviceState.somPowerDrawW = som_power_draw - # FastSleep deep standby: shed heavy processes at low battery instead of shutting down, - # recover on ignition or once the alternator is charging + # FastSleep deep standby: shed heavy processes once parked with the screen idled off + # (or at low battery) instead of shutting down, recover on ignition or once the + # alternator is charging fast_sleep = params.get_bool("FastSleep") if fast_sleep and not tesla_no_sleep: if low_power: if onroad_conditions["ignition"] or power_monitor.car_voltage_mV >= (VBATT_LOW_POWER_EXIT * 1e3): low_power = False else: - low_power = power_monitor.should_enter_low_power(onroad_conditions["ignition"], in_car, off_ts) + screen_off = msg.deviceState.screenBrightnessPercent < 1e-3 + low_power = power_monitor.should_enter_low_power(onroad_conditions["ignition"], in_car, off_ts, screen_off) else: low_power = False diff --git a/system/hardware/power_monitoring.py b/system/hardware/power_monitoring.py index ff7adfa..a72ee58 100644 --- a/system/hardware/power_monitoring.py +++ b/system/hardware/power_monitoring.py @@ -13,11 +13,13 @@ CAR_CHARGING_RATE_W = 45 VBATT_PAUSE_CHARGING = 11.8 # Lower limit on the LPF car battery voltage -# FastSleep (deep standby): enter low power at the normal shutdown voltage, shut down -# at a lower floor, exit once the alternator is charging +# FastSleep (deep standby): enter low power once parked with the screen idled off, or +# immediately at the normal shutdown voltage; shut down at a lower floor, exit once the +# alternator is charging VBATT_LOW_POWER_ENTRY = 11.8 VBATT_LOW_POWER_EXIT = 12.8 VBATT_HARD_SHUTDOWN = 11.5 +LOW_POWER_ENTRY_TIME_S = 300 MAX_TIME_OFFROAD_S = 30*3600 MIN_ON_TIME_S = 3600 DELAY_SHUTDOWN_TIME_S = 300 # Wait at least DELAY_SHUTDOWN_TIME_S seconds after offroad_time to shutdown. @@ -124,14 +126,18 @@ class PowerMonitoring: return 0 < iq_max_time_val_s <= offroad_time # FastSleep: see if we should enter low power mode instead of shutting down - def should_enter_low_power(self, ignition: bool, in_car: bool, offroad_timestamp: float | None) -> bool: + def should_enter_low_power(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, screen_off: bool) -> bool: if offroad_timestamp is None or ignition or not in_car: return False if not self.params.get_bool("FastSleep"): return False offroad_time = time.monotonic() - offroad_timestamp - return (self.car_voltage_mV < (VBATT_LOW_POWER_ENTRY * 1e3) and - offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) + # a healthy battery rests above VBATT_LOW_POWER_ENTRY, so parked entry must be + # time-based; the voltage trigger stays as the sagging-battery fast path + low_voltage = (self.car_voltage_mV < (VBATT_LOW_POWER_ENTRY * 1e3) and + offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) + parked_idle = screen_off and offroad_time > LOW_POWER_ENTRY_TIME_S + return low_voltage or parked_idle # See if we need to shutdown def should_shutdown(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, started_seen: bool): @@ -141,12 +147,15 @@ class PowerMonitoring: now = time.monotonic() should_shutdown = False offroad_time = (now - offroad_timestamp) - vbatt_min = VBATT_HARD_SHUTDOWN if self.params.get_bool("FastSleep") else VBATT_PAUSE_CHARGING + fast_sleep = self.params.get_bool("FastSleep") + vbatt_min = VBATT_HARD_SHUTDOWN if fast_sleep else VBATT_PAUSE_CHARGING low_voltage_shutdown = (self.car_voltage_mV < (vbatt_min * 1e3) and offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) should_shutdown |= self.max_time_offroad_exceeded(offroad_time) should_shutdown |= low_voltage_shutdown - should_shutdown |= (self.car_battery_capacity_uWh <= 0) + # the 30 Wh bookkeeping model empties within hours at offroad draw regardless of the + # real battery state; under FastSleep the measured voltage floors govern instead + should_shutdown |= (self.car_battery_capacity_uWh <= 0) and not fast_sleep should_shutdown &= not ignition should_shutdown &= (not self.params.get_bool("DisablePowerDown")) should_shutdown &= in_car diff --git a/system/hardware/tests/test_power_monitoring.py b/system/hardware/tests/test_power_monitoring.py index 451efcd..c0b0146 100644 --- a/system/hardware/tests/test_power_monitoring.py +++ b/system/hardware/tests/test_power_monitoring.py @@ -2,7 +2,8 @@ import pytest from openpilot.common.params import Params from openpilot.system.hardware.power_monitoring import PowerMonitoring, CAR_BATTERY_CAPACITY_uWh, \ - CAR_CHARGING_RATE_W, VBATT_PAUSE_CHARGING, DELAY_SHUTDOWN_TIME_S, MAX_TIME_OFFROAD_S + CAR_CHARGING_RATE_W, VBATT_PAUSE_CHARGING, DELAY_SHUTDOWN_TIME_S, MAX_TIME_OFFROAD_S, \ + VBATT_HARD_SHUTDOWN, LOW_POWER_ENTRY_TIME_S # Create fake time ssb = 0. @@ -232,3 +233,59 @@ class TestPowerMonitoring: result = pm.max_time_offroad_exceeded(offroad_time_s) assert result == expected_result + + # FastSleep must not shut down on the empty bookkeeping model while voltage is healthy + def test_fast_sleep_ignores_battery_capacity_model(self, mocker): + self.params.put_bool("FastSleep", True) + self.params.put("MaxTimeOffroad", 0) + try: + pm_patch(mocker, "HARDWARE.get_current_power_draw", 0) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = 0 + start_time = ssb + for _ in range(DELAY_SHUTDOWN_TIME_S + 100): + pm.calculate(GOOD_VOLTAGE, False) + assert not pm.should_shutdown(False, True, start_time, True) + finally: + self.params.put_bool("FastSleep", False) + + # FastSleep still shuts down below the hard voltage floor + def test_fast_sleep_hard_voltage_floor(self, mocker): + self.params.put_bool("FastSleep", True) + try: + pm_patch(mocker, "HARDWARE.get_current_power_draw", 0) + pm = PowerMonitoring() + pm.car_battery_capacity_uWh = CAR_BATTERY_CAPACITY_uWh + start_time = ssb + for _ in range(DELAY_SHUTDOWN_TIME_S + 100): + pm.calculate((VBATT_HARD_SHUTDOWN - 0.5) * 1e3, False) + assert pm.should_shutdown(False, True, start_time, True) + finally: + self.params.put_bool("FastSleep", False) + + def test_fast_sleep_low_power_entry(self, mocker): + self.params.put_bool("FastSleep", True) + try: + pm_patch(mocker, "HARDWARE.get_current_power_draw", 0) + + # parked with the screen idled off: time-based entry at healthy voltage + pm = PowerMonitoring() + start_time = ssb + for _ in range(LOW_POWER_ENTRY_TIME_S + 10): + pm.calculate(GOOD_VOLTAGE, False) + assert pm.should_enter_low_power(False, True, start_time, screen_off=True) + assert not pm.should_enter_low_power(False, True, start_time, screen_off=False) + assert not pm.should_enter_low_power(True, True, start_time, screen_off=True) + assert not pm.should_enter_low_power(False, False, start_time, screen_off=True) + + # sagging battery: voltage entry regardless of screen state + pm = PowerMonitoring() + start_time = ssb + for _ in range(100): + pm.calculate((VBATT_HARD_SHUTDOWN + 0.1) * 1e3, False) + assert pm.should_enter_low_power(False, True, start_time, screen_off=False) + + self.params.put_bool("FastSleep", False) + assert not pm.should_enter_low_power(False, True, start_time, screen_off=True) + finally: + self.params.put_bool("FastSleep", False) diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index 582f604..2c4b332 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -78,17 +78,17 @@ }, { "name": "system", - "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b.img.xz", - "hash": "654de83dd64190701c5a9dc7297fb569ba106cc63217725893920df6b8c9eaa0", - "hash_raw": "756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b", + "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a.img.xz", + "hash": "0c9e7dee6c7365600c77b33c4996456459d04aad005e3e41bf6ee2e8af74ceb9", + "hash_raw": "03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a", "size": 6291456000, "sparse": true, "full_check": false, "has_ab": true, - "ondevice_hash": "8269bd017b18a1a4fd5e093b96efa181fd803e200fa92364fe9307f25445f596", + "ondevice_hash": "1ee589d3d728a03561718383bf640171f1aef048573e46fe17239617c7c19fff", "alt": { - "hash": "756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b", - "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b.img", + "hash": "03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a", + "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a.img", "size": 6291456000 } } diff --git a/system/hardware/tici/agnos.json.sig b/system/hardware/tici/agnos.json.sig index 2a4b9e7..362267f 100644 --- a/system/hardware/tici/agnos.json.sig +++ b/system/hardware/tici/agnos.json.sig @@ -1 +1 @@ -6ZRxEduDaLm1coUVvI/0QAZtmbf+tY0TWMZtaEaxV7I2fKFfGPG/6oOizuFsmd/SSQls84kap9MwKDEc8XfIDA== ++LyP/p4uBBxbTwRwPrwR/2qPaHkAXmlFkg0GdxOBuujPY89GxP4t5SNKxirqiw9LmMcfA0JfVwMeR3QD9rQ6Dg== diff --git a/system/hardware/tici/agnos_tici_15_1.json b/system/hardware/tici/agnos_tici_15_1.json index 2acf2e7..da5a9ab 100644 --- a/system/hardware/tici/agnos_tici_15_1.json +++ b/system/hardware/tici/agnos_tici_15_1.json @@ -67,17 +67,17 @@ }, { "name": "system", - "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b.img.xz", - "hash": "654de83dd64190701c5a9dc7297fb569ba106cc63217725893920df6b8c9eaa0", - "hash_raw": "756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b", + "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a.img.xz", + "hash": "0c9e7dee6c7365600c77b33c4996456459d04aad005e3e41bf6ee2e8af74ceb9", + "hash_raw": "03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a", "size": 6291456000, "sparse": true, "full_check": false, "has_ab": true, - "ondevice_hash": "8269bd017b18a1a4fd5e093b96efa181fd803e200fa92364fe9307f25445f596", + "ondevice_hash": "1ee589d3d728a03561718383bf640171f1aef048573e46fe17239617c7c19fff", "alt": { - "hash": "756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b", - "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-756453317d208f873d44e14e9429d466c90cdcee70de52fede0bfdd6f6571c7b.img", + "hash": "03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a", + "url": "https://sdn.konn3kt.com/agnos/16-iqlvbs/system-03397de3da2e9a6d2808b95b72c945b3af71ab79f7f0298624aed62b8749fc5a.img", "size": 6291456000 } } diff --git a/system/hardware/tici/agnos_tici_15_1.json.sig b/system/hardware/tici/agnos_tici_15_1.json.sig index db7a65e..fc701fd 100644 --- a/system/hardware/tici/agnos_tici_15_1.json.sig +++ b/system/hardware/tici/agnos_tici_15_1.json.sig @@ -1 +1 @@ -+gqhJbKMr9i9lW7WrtKebqKXlM0Asr/i7ZodOzIAHzAgzGEvPCWbfco2jo0/jO7O2UzZwKJUl/WzHlsOtJvnCw== +RCYk34Ifjx7S9PIhPm6p49vFMhamPwvw8Lfbb6a6HO8sUOi3J2PcY4VDUcqQZWU6+Am++HP3nJSea8OmAsckAg== diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 7091275..e1b17c8 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -69,6 +69,9 @@ NetworkStrength = log.DeviceState.NetworkStrength MM_MODEM_ACCESS_TECHNOLOGY_UMTS = 1 << 5 MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14 +# MMModemStateFailedReason +MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2 + def affine_irq(val, action): irqs = get_irqs_for_action(action) @@ -605,6 +608,32 @@ class Tici(HardwareBase): os.system(f"sudo cp {tf.name} {dest}") os.system(f"sudo nmcli con load {dest}") + def recover_sim_detection(self) -> bool: + # A worn SIM-tray presence switch can read "removed" while the SIM pads still make + # contact; with hot-swap detect armed (AT+QSIMDET=1) the modem never powers the SIM + # and lands in failed/sim-missing. Disabling detect and rebooting the modem makes it + # probe the SIM electrically. Safe to retry on failure: firing disarms the QSIMDET + # gate, so a genuinely SIM-less device gets at most one extra modem reboot per boot. + if self.get_device_type() not in ("tici", "tizi"): + return False + + try: + modem = self.get_modem() + state = modem.Get(MM_MODEM, 'State', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if state != MM_MODEM_STATE.FAILED: + return False + reason = modem.Get(MM_MODEM, 'StateFailedReason', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if reason != MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: + return False + detect = str(modem.Command('AT+QSIMDET?', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT)).strip() + if not detect.startswith('+QSIMDET: 1'): + return False + modem.Command('AT+QSIMDET=0,0', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + modem.Command('AT+CFUN=1,1', math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) + return True + except Exception: + return False + def reboot_modem(self): modem = None try: diff --git a/system/ui/iqpilot/__init__.py b/system/ui/iqwidgets/__init__.py similarity index 100% rename from system/ui/iqpilot/__init__.py rename to system/ui/iqwidgets/__init__.py diff --git a/system/ui/iqpilot/lib/__init__.py b/system/ui/iqwidgets/lib/__init__.py similarity index 100% rename from system/ui/iqpilot/lib/__init__.py rename to system/ui/iqwidgets/lib/__init__.py diff --git a/system/ui/iqpilot/lib/application.py b/system/ui/iqwidgets/lib/application.py similarity index 100% rename from system/ui/iqpilot/lib/application.py rename to system/ui/iqwidgets/lib/application.py diff --git a/system/ui/iqpilot/lib/canvas.py b/system/ui/iqwidgets/lib/canvas.py similarity index 100% rename from system/ui/iqpilot/lib/canvas.py rename to system/ui/iqwidgets/lib/canvas.py diff --git a/system/ui/iqpilot/lib/styles.py b/system/ui/iqwidgets/lib/styles.py similarity index 100% rename from system/ui/iqpilot/lib/styles.py rename to system/ui/iqwidgets/lib/styles.py diff --git a/system/ui/iqpilot/lib/utils.py b/system/ui/iqwidgets/lib/utils.py similarity index 61% rename from system/ui/iqpilot/lib/utils.py rename to system/ui/iqwidgets/lib/utils.py index 3bd63df..213b2ea 100644 --- a/system/ui/iqpilot/lib/utils.py +++ b/system/ui/iqwidgets/lib/utils.py @@ -1,9 +1,9 @@ """ Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos """ -from openpilot.system.ui.iqpilot.widgets.list_view import IQButtonAction +from openpilot.system.ui.iqwidgets.widgets.list_view import IQButtonAction -class NoElideButtonAction(IQButtonAction): +class WideButtonAction(IQButtonAction): def get_width_hint(self): return super().get_width_hint() + 1 diff --git a/system/ui/iqpilot/widgets/__init__.py b/system/ui/iqwidgets/widgets/__init__.py similarity index 100% rename from system/ui/iqpilot/widgets/__init__.py rename to system/ui/iqwidgets/widgets/__init__.py diff --git a/system/ui/iqpilot/widgets/helpers/__init__.py b/system/ui/iqwidgets/widgets/helpers/__init__.py similarity index 100% rename from system/ui/iqpilot/widgets/helpers/__init__.py rename to system/ui/iqwidgets/widgets/helpers/__init__.py diff --git a/system/ui/iqpilot/widgets/helpers/glyphs.py b/system/ui/iqwidgets/widgets/helpers/glyphs.py similarity index 100% rename from system/ui/iqpilot/widgets/helpers/glyphs.py rename to system/ui/iqwidgets/widgets/helpers/glyphs.py diff --git a/system/ui/iqpilot/widgets/list_view.py b/system/ui/iqwidgets/widgets/list_view.py similarity index 99% rename from system/ui/iqpilot/widgets/list_view.py rename to system/ui/iqwidgets/widgets/list_view.py index 11d3c16..9e7ea55 100644 --- a/system/ui/iqpilot/widgets/list_view.py +++ b/system/ui/iqwidgets/widgets/list_view.py @@ -7,9 +7,9 @@ import time from collections.abc import Callable import pyray as rl -from openpilot.system.ui.iqpilot.lib.styles import ink, metrics +from openpilot.system.ui.iqwidgets.lib.styles import ink, metrics from openpilot.system.ui.widgets.button import Button, ButtonStyle -from openpilot.system.ui.iqpilot.lib import canvas +from openpilot.system.ui.iqwidgets.lib import canvas from openpilot.system.ui.widgets.scroller_tici import LineSeparator, LINE_COLOR, LINE_PADDING from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.widgets.toggle import Toggle @@ -899,8 +899,8 @@ def progress_item(title): from dataclasses import dataclass, field from openpilot.common.params import Params -from openpilot.system.ui.iqpilot.lib.styles import ink -from openpilot.system.ui.iqpilot.widgets.helpers.glyphs import draw_star +from openpilot.system.ui.iqwidgets.lib.styles import ink +from openpilot.system.ui.iqwidgets.widgets.helpers.glyphs import draw_star from openpilot.system.ui.lib.application import FontWeight, gui_app from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.multilang import tr @@ -925,13 +925,13 @@ _FRAME_PAD = 50 @dataclass -class TreeNode: +class PickerItem: ref: str data: dict = field(default_factory=dict) @dataclass -class TreeFolder: +class PickerGroup: folder: str nodes: list @@ -999,7 +999,7 @@ class _TreeRow(Button): return super()._handle_mouse_release(mouse_pos) -class TreeOptionDialog(MultiOptionDialog): +class PickerDialog(MultiOptionDialog): """Folder/leaf picker with search, favourites, and a pinned current selection.""" def __init__(self, title, folders, current_ref="", fav_param="", option_font_weight=FontWeight.MEDIUM, search_prompt=None, diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index b145bad..404854a 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -26,7 +26,7 @@ from openpilot.system.hardware import HARDWARE, PC from openpilot.system.ui.lib.multilang import multilang from openpilot.common.realtime import Ratekeeper -from openpilot.system.ui.iqpilot.lib.application import IQAppHooks +from openpilot.system.ui.iqwidgets.lib.application import IQAppHooks from openpilot.system.ui.lib.screen_recorder import ScreenRecorder _DEFAULT_FPS = int(os.getenv("FPS", {'tizi': 20, 'tici': 20}.get(HARDWARE.get_device_type(), 60))) diff --git a/system/ui/lib/wifi_manager.py b/system/ui/lib/wifi_manager.py index 4fe310a..e5659df 100644 --- a/system/ui/lib/wifi_manager.py +++ b/system/ui/lib/wifi_manager.py @@ -636,6 +636,7 @@ class WifiManager: cloudlog.warning("No WiFi device found") return + self._set_device_autoconnect(True) self._connecting_to_ssid = ssid self._router_main.send(new_method_call(self._nm, 'ActivateConnection', 'ooo', (conn_path, self._wifi_device, "/"))) @@ -645,6 +646,37 @@ class WifiManager: else: threading.Thread(target=worker, daemon=True).start() + def disconnect_connection(self, ssid: str, block: bool = False): + def worker(): + if self._router_main is None: + cloudlog.warning(f"WiFi not ready while disconnecting {ssid}") + return + + if ssid not in self._get_connections(): + return + + # the profile stays saved and untouched; without clearing autoconnect on the device + # NetworkManager re-associates within seconds + self._set_device_autoconnect(False) + self._connecting_to_ssid = "" + self._deactivate_connection(ssid) + self._update_networks() + self._enqueue_callbacks(self._disconnected) + + if block: + worker() + else: + threading.Thread(target=worker, daemon=True).start() + + def _set_device_autoconnect(self, enabled: bool) -> None: + if self._router_main is None or self._wifi_device is None: + return + + dev_addr = DBusAddress(self._wifi_device, bus_name=NM, interface=NM_DEVICE_IFACE) + reply = self._router_main.send_and_get_reply(Properties(dev_addr).set('Autoconnect', 'b', enabled)) + if reply.header.message_type == MessageType.error: + cloudlog.warning(f'Failed to set device autoconnect={enabled}: {reply}') + def _deactivate_connection(self, ssid: str): target_conn_path = self._get_connections().get(ssid, None) if target_conn_path is None: diff --git a/system/ui/widgets/network.py b/system/ui/widgets/network.py index cc3167d..c67d26c 100644 --- a/system/ui/widgets/network.py +++ b/system/ui/widgets/network.py @@ -17,10 +17,10 @@ from openpilot.system.ui.widgets.scroller_tici import Scroller from openpilot.system.ui.widgets.list_view import ButtonAction, ListItem, MultipleButtonAction, ToggleAction, button_item, text_item if gui_app.iqpilot_ui(): - from openpilot.system.ui.iqpilot.widgets.list_view import button_item - from openpilot.system.ui.iqpilot.widgets.list_view import IQListItem as ListItem - from openpilot.system.ui.iqpilot.widgets.list_view import IQToggleAction as ToggleAction - from openpilot.system.ui.iqpilot.widgets.list_view import IQMultipleButtonAction as MultipleButtonAction + from openpilot.system.ui.iqwidgets.widgets.list_view import button_item + from openpilot.system.ui.iqwidgets.widgets.list_view import IQListItem as ListItem + from openpilot.system.ui.iqwidgets.widgets.list_view import IQToggleAction as ToggleAction + from openpilot.system.ui.iqwidgets.widgets.list_view import IQMultipleButtonAction as MultipleButtonAction # These are only used for AdvancedNetworkSettings, standalone apps just need WifiManagerUI try: @@ -66,6 +66,7 @@ class UIState(IntEnum): NEEDS_AUTH = 2 SHOW_FORGET_CONFIRM = 3 FORGETTING = 4 + DISCONNECTING = 5 class NavButton(Widget): @@ -328,6 +329,7 @@ class WifiManagerUI(Widget): self._state_network: Network | None = None # for CONNECTING / NEEDS_AUTH / SHOW_FORGET_CONFIRM / FORGETTING self._password_retry: bool = False # for NEEDS_AUTH self.btn_width: int = 200 + self.disconnect_btn_width: int = 300 self.scroll_panel = GuiScrollPanel() self.keyboard = Keyboard(max_text_size=MAX_PASSWORD_LENGTH, min_text_size=MIN_PASSWORD_LENGTH, show_password_toggle=True) self._load_icons() @@ -335,6 +337,7 @@ class WifiManagerUI(Widget): self._networks: list[Network] = [] self._networks_buttons: dict[str, Button] = {} self._forget_networks_buttons: dict[str, Button] = {} + self._disconnect_networks_buttons: dict[str, Button] = {} self._wifi_manager.add_callbacks(need_auth=self._on_need_auth, activated=self._on_activated, @@ -417,7 +420,9 @@ class WifiManagerUI(Widget): def _draw_network_item(self, rect, network: Network): spacing = 50 - ssid_rect = rl.Rectangle(rect.x, rect.y, rect.width - self.btn_width * 2, ITEM_HEIGHT) + show_disconnect = network.is_connected and self.state not in (UIState.CONNECTING, UIState.DISCONNECTING) + reserved = self.btn_width * 2 + (self.disconnect_btn_width + spacing if show_disconnect else 0) + ssid_rect = rl.Rectangle(rect.x, rect.y, rect.width - reserved, ITEM_HEIGHT) signal_icon_rect = rl.Rectangle(rect.x + rect.width - ICON_SIZE, rect.y + (ITEM_HEIGHT - ICON_SIZE) / 2, ICON_SIZE, ICON_SIZE) security_icon_rect = rl.Rectangle(signal_icon_rect.x - spacing - ICON_SIZE, rect.y + (ITEM_HEIGHT - ICON_SIZE) / 2, ICON_SIZE, ICON_SIZE) @@ -434,6 +439,10 @@ class WifiManagerUI(Widget): if self._state_network.ssid == network.ssid: self._networks_buttons[network.ssid].set_enabled(False) status_text = tr("FORGETTING...") + elif self.state == UIState.DISCONNECTING and self._state_network: + if self._state_network.ssid == network.ssid: + self._networks_buttons[network.ssid].set_enabled(False) + status_text = tr("DISCONNECTING...") elif network.security_type == SecurityType.UNSUPPORTED: self._networks_buttons[network.ssid].set_enabled(False) else: @@ -455,6 +464,15 @@ class WifiManagerUI(Widget): ) self._forget_networks_buttons[network.ssid].render(forget_btn_rect) + if show_disconnect: + disconnect_btn_rect = rl.Rectangle( + forget_btn_rect.x - self.btn_width - spacing, + forget_btn_rect.y, + self.btn_width, + 80, + ) + self._disconnect_networks_buttons[network.ssid].render(disconnect_btn_rect) + self._draw_status_icon(security_icon_rect, network) self._draw_signal_strength_icon(signal_icon_rect, network) @@ -470,6 +488,9 @@ class WifiManagerUI(Widget): self.state = UIState.SHOW_FORGET_CONFIRM self._state_network = network + def _disconnect_networks_buttons_callback(self, network): + self.disconnect_network(network) + def _draw_status_icon(self, rect, network: Network): """Draw the status icon based on network's connection state""" icon_file = None @@ -506,6 +527,11 @@ class WifiManagerUI(Widget): self._state_network = network self._wifi_manager.forget_connection(network.ssid) + def disconnect_network(self, network: Network): + self.state = UIState.DISCONNECTING + self._state_network = network + self._wifi_manager.disconnect_connection(network.ssid) + def _on_network_updated(self, networks: list[Network]): self._networks = networks for n in self._networks: @@ -515,6 +541,9 @@ class WifiManagerUI(Widget): self._forget_networks_buttons[n.ssid] = Button(tr("Forget"), partial(self._forget_networks_buttons_callback, n), button_style=ButtonStyle.FORGET_WIFI, font_size=45) self._forget_networks_buttons[n.ssid].set_touch_valid_callback(lambda: self.scroll_panel.is_touch_valid()) + self._disconnect_networks_buttons[n.ssid] = Button(tr("Disconnect"), partial(self._disconnect_networks_buttons_callback, n), + button_style=ButtonStyle.FORGET_WIFI, font_size=45) + self._disconnect_networks_buttons[n.ssid].set_touch_valid_callback(lambda: self.scroll_panel.is_touch_valid()) def _on_need_auth(self, ssid): network = next((n for n in self._networks if n.ssid == ssid), None) @@ -532,7 +561,7 @@ class WifiManagerUI(Widget): self.state = UIState.IDLE def _on_disconnected(self): - if self.state == UIState.CONNECTING: + if self.state in (UIState.CONNECTING, UIState.DISCONNECTING): self.state = UIState.IDLE