IQ.Pilot Release Commit @ 3b7bebf

This commit is contained in:
IQ.Lvbs CI [bot]
2026-09-05 17:59:07 -05:00
parent 4e91570cd6
commit 8e663c9234
47 changed files with 286 additions and 138 deletions
@@ -1,8 +1,8 @@
{
"python/_iqclosure/_vendored.json": {
"mode": 420,
"sha256": "4971aeda24749e9b8554757d9655115369b1764789afc80d8b4639dba812cba6",
"size": 1950
"sha256": "5f2ed2b7705f64acb637ab4f4b0c61a4c0267dcb9bba478a22b8059a529dffaf",
"size": 1911
},
"python/_iqclosure/iqpilot/__init__.py": {
"mode": 420,
@@ -156,8 +156,8 @@
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_helpers.py": {
"mode": 420,
"sha256": "0b8f118dc45ad0c3809855800960b47c893ee121ea75d94e8569dcce46d58ce5",
"size": 7312
"sha256": "07b3ace231d9912f1926ffe7cef0f2a5d9649f75b7ebac2b9f296957d98be166",
"size": 7681
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/egpu_model.py": {
"mode": 420,
@@ -171,8 +171,8 @@
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": {
"mode": 420,
"sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077",
"size": 119
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"size": 0
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": {
"mode": 420,
@@ -181,8 +181,8 @@
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py": {
"mode": 420,
"sha256": "e4f524c7595754fd9db86724a7bd9b67524c630275ac78599ab6838d1aa7d809",
"size": 11037
"sha256": "da08ff891f57bc808d78104e21bb788553973f9e775d26ab4024f24969835e34",
"size": 11793
},
"python/_iqclosure/iqpilot/selfdrive/locationd/__init__.py": {
"mode": 420,
@@ -291,8 +291,8 @@
},
"python/_iqclosure/iqpilot/system/hardware/usb.py": {
"mode": 420,
"sha256": "7c2cd7c6d5a859fb8454059da1b36e3b5ce4639aca6fea296b4f91096b46c1ba",
"size": 7257
"sha256": "8c5b26f3967100ce0e5af7043a47a852fb5e8311f00ac95e7a263934c38e4ec0",
"size": 8069
},
"python/_iqclosure/iqpilot/system/loggerd/__init__.py": {
"mode": 420,
@@ -311,13 +311,13 @@
},
"python/_iqclosure/iqpilot/system/manager/process.py": {
"mode": 420,
"sha256": "d036d82e2163a249186238375fb82f8dca250fae2272428ea47a46e4d6a8649d",
"size": 11519
"sha256": "de8956b214d5856547f8ce37eb37b76f53aff515b7f63ebccb7aa60ea5bb1dd0",
"size": 11515
},
"python/_iqclosure/iqpilot/system/manager/process_config.py": {
"mode": 420,
"sha256": "8b8de3f4d266213530dbc37248cf86c6a36241ec9b2f04afe0389e126fd2282f",
"size": 13597
"sha256": "85f02ace1b82abaec47c3e0979040b47995fd61a7aa7f41f336fff58d555cad5",
"size": 13919
},
"python/_iqclosure/iqpilot/system/micd.py": {
"mode": 420,
@@ -376,28 +376,28 @@
},
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "8d8808534c26b97369f5a69da3afbb2f6bdb2e2708c2479ff55a07574eab3cbd",
"size": 135552
"sha256": "08cfd2deac71129329be99bdec41e95fe410cf4c7a267d41d887ce0513101ac9",
"size": 135480
},
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "5ec7c8dc4e4d21f47b9e949a8960baacb470ab267752681ae840ea537646d29a",
"size": 67664
"sha256": "1be18fb3404dac99d098e817a70282403660d27647ca3a0614e7161f38b439b1",
"size": 67680
},
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "91e0fab17809c6a7231a956ef082033c906a8e5e44972a10bd32f9b653d634ea",
"size": 204640
"sha256": "4c2f37d82ff5e3c18db3139195ea682784f441639b4eb89e3caec876cc52b819",
"size": 204616
},
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "d7356d8cb1ef60ac025ec806f6fe1c1c734c234f5fe5256f17c1bfd3ff36052f",
"size": 69768
"sha256": "7428c579a0c1ae1f3897ed99d3fe5313f90653b4756b78706d8f84914e391e01",
"size": 69752
},
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "58c1601759b2f61b942d18bf7a07d16050c53424337882e040afb6d083dbd4a4",
"size": 203088
"sha256": "12d27312a6aecdfdaec3315443b1102b811f86048de60d6d1e4e82aa29f8dafb",
"size": 203064
},
"python/iqpilot_private/konn3kt/flockd/__init__.py": {
"mode": 420,
@@ -406,13 +406,13 @@
},
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "3dea6e1a02a92a5cbebda37b768bcb4ba65224b4920307cded9247f738e6bdfe",
"size": 202184
"sha256": "2e3a6754f46fc68dec0e08f771f7a2eb4744c11cb340b25e5686bf450c5c2ac8",
"size": 202128
},
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "34a58774d1243add0c0dc5cc95d78e0b17b13ede3bbfb8f0de63dd47a4c6a39f",
"size": 68080
"sha256": "0d6abae6ca2e0b62faf4261de60e45aeff23bc940707e2c6c3f39a6fa89f25b3",
"size": 68104
},
"python/iqpilot_private/konn3kt/hephaestus/__init__.py": {
"mode": 420,
@@ -421,68 +421,68 @@
},
"python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": {
"mode": 420,
"sha256": "60ce72178566082562ceeeeb84693f04640a2436d5d6c88657ee10fbf570adaa",
"sha256": "b0edbfc70a08e87a2be5b5d7be447eb5b566a25383122b48acb1cd25042d3cd4",
"size": 1379342
},
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "c83f7947d210eee887750ca5e494e859cd6a099371eede6740282ee5f95fc725",
"size": 268080
"sha256": "aac079fe0de7cf33ab7a1f136d19b02c63a5809c3b3e45ffb685028000b2abd7",
"size": 268024
},
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "f7e0c6471e5ae85e4bdb7225d60cdd67e2a54bd7e9386436e6f9eef7249354b3",
"size": 406176
"sha256": "91f673f51b7761e353d84eb7039b4cc14aa3bd170800727062e7d500e8c700b2",
"size": 406144
},
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "83e7f6f18984c947811e2a17707def76fc2e563aea9eb37e9f37f5e09e377548",
"size": 68048
"sha256": "05f12cf01d326d61f4ba2398ef935f03cd08062bf20232d744e2f669331eda5f",
"size": 68064
},
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "20f4505b5c0a320c2bab7f5026f55a0a405d85840b40f89a624b417f764f8a07",
"size": 335848
"sha256": "bf098ea52b1e6b4fad5cd103cdfcf688e52545ad12f13566fd25b90ef8c74aa6",
"size": 401368
},
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "b1a14c8534fc8b20bef3661b9390db53a3f39086337d241f931af72a368f7da2",
"size": 272112
"sha256": "2f8e0ba2693d72f454827a1fbe8db83cca04156ea2f971d0307452ec44b66bba",
"size": 337616
},
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "cf3c6b74668adb6f8830e52c25aa17f4211c5fe4cbea88e50dbd3c077e92bd84",
"size": 134408
"sha256": "ce5fb5f9def24c2f99001973ed8b0a3fff7c00a090e1b4ddcbf86af300a2f088",
"size": 134424
},
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "2f30fe07926a2b6d51c6ec88ee4d57d0895d841e080bd3866a8750b5f9608aa1",
"size": 3915272
"sha256": "0fbcd4812d5ea2ac7285b759fa7ba7ec692714405966d2a5a31b3e2e243c27d0",
"size": 4177424
},
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "823b330d38eac09dbc22a01d1abe00d110f9d2cf8c5dc489ce58b05050db3dbe",
"size": 136472
"sha256": "dd266157fe507279f572e72fccbeafab32e7c49fcac45ae184084bf0133a0b47",
"size": 136384
},
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "02b76b8792b8f62ec4278dad6e63e5c8574479b8e714538c2cc73ebc216872eb",
"size": 68208
"sha256": "a8de0bb91395a4ea8f10b576bc7f2eca979c11785207203f134d5747835d4d6f",
"size": 133752
},
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "46197da34eed0bf10c17baf32081b6a9871ddc9f3807f5de376e41699286e38c",
"size": 67840
"sha256": "e67cbd9a0b46d4b4c431644f30f6db4b89ed40382ce2691a1011b8d24d27314f",
"size": 67872
},
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "144af2138c5e8f90c8432d9b90a8acafe995c1a030eb864aeb4e1b210b53b871",
"size": 135664
"sha256": "32d3179e4fb31c10dced19f6a4dc8f3b40cc68faeddba8b7a28a95973b600cba",
"size": 135584
},
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "3918430ba6f7dd7b654c73222bb7444afa2ef78be7bf595092b0813cebd61606",
"size": 269600
"sha256": "146d4f34cd6f4ef296582c6f33e057895f9a8775539114a26377c5fc748ab7ad",
"size": 269536
},
"python/iqpilot_private/konn3kt/uploaderd/__init__.py": {
"mode": 420,
@@ -491,8 +491,8 @@
},
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "77a0da7cf61eaa05df08c448460cb2e563929ee7c41257d9b5f0814d6d32016f",
"size": 336280
"sha256": "dbd6a531b202f51124cf206e0e799452ab225947ca55e283fe8ffee70fce5bf0",
"size": 336264
},
"runtime": {
"entries": {
@@ -535,25 +535,25 @@
}
},
"signatures": {
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "lRrLXy0fYvSR0U/mJbw1BXUacNm7Jc6YRknVHM8DuT0gGsLp0y0xrYXSlarISHznZvV0JbPsNf3wgbQA5NZ3CA==",
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "H0GqhuuUrSJYyT4UXbf7GujRXxGx/zgIn+ZDaiyjPghcYdy64bGH2fVWwEm69OC409ZtVB0sI69GlqGPMKF/Dg==",
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "sF93qmp1nxbSBfqq0FBr/jI8QK1jP3wQgEYoys3McYNfC3IOk6V7eqL1AZz8Rj20j7Iu1TOpWsGsSVxo+G0xAg==",
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "FcuWnfFQt7EWTRH5Lev1PhNpQposz/8d6p8DK6Jg7Zi+Rf93GUDgg3/t74IjHTq+aPSvR1J1ArKAUGRstGmpDw==",
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "UkRfnbDSg3UPzTL6BgLM3pXTOKUqo/QA/DP1qCUVYWm7hTGX5balWH3inYKaxQTP6WkbIm0dGusMT2pldW7JAg==",
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "VLvLBhbqm6+V8udYUKpv7hXQygiu3scB6FXmfjyRVKLvGcCsVUA2LKLNtH8Ff+TPsdEXRp7wCBMrVBVUslCiBA==",
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "b9jhc7aE//J2/bE8fyglw3hO+KKSOEjnzDzKSPmfL+bVmVUvtdN/F/1lpvdYrb2RalkBvl7ktFOgymZKn0vrBA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "IovyDAeYBOAC8yv67H+UqiicwOd210iwDXMvNuTXbU4lbq0xuqa1uy7t/oCClt4P0BhZLgvJQ0KI/jqMRsbxBA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "xmIlShogvGuAh7RJOaOJSV/oB7EhvUpjPFiPHah97yvwg+pmrDYy2avmjWM8wCE3kKrKCFgEVW6ye6u4Eo0wCA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "Zbj2hW+Z5TMeXrXOVd7htJ1KAOkEOX7W4jqj1hulsO/hsUEzcIBFEYkCTGzEJ7jkU7QO1LzUjT04WyqlRAgOAA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "L+gCCPfiImd9gqtJ0jnSKzRWYnJjqB8f1ixz7WFJGDipbjMF1NDj24nwYLE21oUAqTdDSVnb3bQG9gtLkNbeBg==",
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "Tu14xhw8hc5vgg0oJ4vYZSwuml+k80ZrWjf8VgTefxvG8JGvm4ZwZ34lVdesUfvZCAVCszkEUustAXVhTLu0Cw==",
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "VvPIQ0Ffu2K0T806hzzK5sLdAtL6I0ORgLVW6Hl4VNgzwJucMPSHQChFn3q94G7KhD20F1g0UvBF+0NrgRVCDg==",
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "qMi6U7oxlcOf9s3O+o2mFRorOYNxjK/MPrw0JxRJ2cVgG64hbzXou1yw/LZTVTAjun/EGCJgfXC313G/nGP9Cg==",
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "/kjgZ33Ev8UgrJtqsyGWCMp5IIeqk6Kb9UGpwzZE5jrJiym15HjVQZnfWIqAECUOxBnJsIKrun5tcKKndfgsAQ==",
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "/eUDZy8k0jVHALTMabHt3f9Va3xGc2FnXUX0ly7oSqaWPsoB/CivrxP+jlc5NcKNsigwqox97lDye291B1LOBg==",
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "C+ObT5E4w707z7kVKW89SUsEzVb7ZExmDLKXnTh1a2oa92hzRusH60iIEMF8ofL0eZBORRmbNVsewVEEGQ6ZDQ==",
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "2vqBy+02ldRHcVMlKUT+Vk6Hz7diGSxVct+FK/LcMCpXg5N51YqhvX5YdBgtZWnQpbvIPi1wyr9Zqs3oIT5hAw==",
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "uHyniVaxBLNTVLx/40UH6pifUZF/xwwo9Jd8slS+0lyhAXMuZnmoQoHnaJRN4adTuEGOyKKyi/wisjFASuwqCA==",
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "No8Xim23VntTR9aceGofLd/vNC3jVQSZ9PmB3qwS5osNqdUrEh/5Y5RpXWKU2/azhsOMqnlbT0ppARqNGVDKCQ=="
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "y6NAdtid8XIXYz19YyYB0ZqOcd/9FIaxGYVjVZrs+Yalzm/P6lIpgZOZieRlviu0K0YDOrz/2uygyxv4h0OQAg==",
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "DUhrNXdMydpJMxMbwk85ryVeNrkBs+JGJn5XqtrtzACo4lRjVWzOAE1gWq5UKu5Z5DuJMt6BW+MQIoEmq2KbDQ==",
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "7E8GaN5p2akJ82aeVR0aUmurEbL1J8N9YW0pKApvruDbj3ATtPnRDmdIyS3ZixPzmETxVoLa5Rk6XmKCnc5HBw==",
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "jeH1BFTZ3VWdQiyQoMiyGTJUprgFsAUdg+m8AhEo5kughfk9vTQ2piRopyyHulpJnHeCzoJDxifLSdQzr3SMAA==",
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "OQ2qXMzMut3gpoGMoo2dwdre7D3bL4LoPZq5QbCrJRUJbqYh7Ij4MEjxXHrt2ntENlIhkS7v+Zxqxq6D7JokDg==",
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "VPZFE07FZXF6iO0avqEzUqsbsmkz6plCKsKjKuHQeqHtaftnuzBIPo4qwFsWAWEKhtAktxis5Znd6V6SOELgCQ==",
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "CFosySDGDob1lFFPUViC/JN3cdrHEhm+XVTZ/X7273xAWtlraudLVBk+0hfZM4F8ttHf5Z/ZhyaqZhObzh4QDw==",
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "94SKt2vBgc81LpyLyWv/U2iiLTLHoDUBQk34Gnpo2CcW+v2Pj528rcAWfgnSkDYiBcCQsqmt0jJZ+5iIwqLvDA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "/jtkUnNzMotTZ56+9qn77D+1zp24cq8zRAzJZFfWQDKjoQQsOIinLmnnShIssu8F6duQHJR75VN9PTz69A4FBQ==",
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "znyD7IW4vmmChAQkJOt5+p2tJkR2IHh6l72XjCO6pr1M++hhG37jocFMCol0xQn8qiLUJNo8ghavl0AT1n3EDg==",
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "nZxtx830u7TqiYF4UOYwIw2UhZ9jqWd/Ru2Yj9J752YRdN2kNxzT5oomCofID+hZrQJSTGqgmm6FsSDgXs7nAw==",
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "u8ekcMetg7aIfZ+dfcvubabAzoISmiKkFHESRIJ/58xcQId6dCiKMbUQq7uq+yjqTJsSlnb6PvMYfKDbbQa1AA==",
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "9Def0TAfWPk5us2l/mZlT6nYodkSuh5t4r4yDfNDdMtnvid5ZvnhciorDY1EjpN+LMEkatSrDNuIQRMA4AKOCg==",
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "kEzv4qu4BDyAhv0trjxPFN5Y/DYTVh8eRY4XR+XCg42Wl76WGJKk6/0tfM7t7ReV3ucwFJC71uLswvcynOxRDg==",
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "CWAClei3CTMzJWBGrh64nshzRplFU0r8LIIGlQOK+hOTLwQSc3/ULzhnp/sog8SFhfznU6aytN2td+WxImJdAQ==",
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "rZsFrQp4hpAt+iZY9NO3O+HX/A5QF67qJf1XJms5UKJhlbNlBokD3UGn5fDzgeH1KfA600BqnnZ6CwmRTUkSAQ==",
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "cim1skYYn7MiEaBFLdroUrNHE+AVoCbWhgoSeIhBZTJDoms9KiQznZPOhb1KRizepLxoazKGpaEdfOfm0lYCAA==",
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "C5VaMh5+7/cO6lMoxfaBb35iExodnfGr2t7MT63F87fRMFFcCYLgCvOtAutdBVcIzxhmqzkDPKngqkW3peaqAw==",
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "iN/aUvUyIC7JbB0hsoF3t3XdcIIkB0t+XlJA37SkVX2Af2MrI1h32ef1oHUX/LQCfUmEkpX876CE+/l3HrMEAg==",
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "wLjiYrvkAbwNEYKQOCbowpx8Aa1KszadC8Gz/5PuvPvwub9n+VspqxACFDc1ntGLjjzFzy2tL/F4aTgCbldnCw=="
}
}
@@ -1 +1 @@
Li23uJ7UFsHmYsNYtk8ZvF7oFHZoV8tl9yuzsFSkEzPBnX5MQJwpihQtEwVC1mn1EAHwyjj7nJ/uaZww1o9wCg==
ELqO/Kj66aU/CxO4q45RX59wSIVRVBgUtHng23ivUUi1Vivm77ZeOBE4lqc9n6ibjM0lNiye30lDYN5hnt/jAA==
@@ -25,7 +25,6 @@
"iqpilot.selfdrive.iqmodeld.egpu_helpers",
"iqpilot.selfdrive.iqmodeld.egpu_model",
"iqpilot.selfdrive.iqmodeld.model_bundle_downloader",
"iqpilot.selfdrive.iqmodeld.models",
"iqpilot.selfdrive.iqmodeld.models.fetcher",
"iqpilot.selfdrive.iqmodeld.models.helpers",
"iqpilot.selfdrive.locationd.calibrationd",
@@ -71,6 +71,11 @@ def egpu_oob_pkl_path(meta: dict) -> str:
return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_policy_oob.pkl")
def egpu_model_oob_pkl_path(meta: dict) -> str:
from iqpilot.system.hardware.hw import Paths
return os.path.join(Paths.model_root(), f"egpu_{meta['key']}_{meta['sha256'][:8]}_amd_model_oob.pkl")
def onnx_cache_path(meta: dict) -> str:
from iqpilot.system.hardware.hw import Paths
return os.path.join(Paths.model_root(), f"{meta['model_name']}_{meta['sha256'][:8]}.onnx")
@@ -156,13 +161,21 @@ def download_onnx(meta: dict, progress_cb=None) -> str:
return path
def download_precompiled(meta: dict, progress_cb=None, policy: bool = False, oob: bool = False) -> str | None:
field = "egpu_oob_artifact" if oob else "egpu_policy_artifact" if policy else "egpu_artifact"
ARTIFACT_PATHS = {
"egpu_model_oob_artifact": egpu_model_oob_pkl_path,
"egpu_oob_artifact": egpu_oob_pkl_path,
"egpu_policy_artifact": egpu_policy_pkl_path,
"egpu_artifact": egpu_pkl_path,
}
def download_precompiled(meta: dict, progress_cb=None, policy: bool = False, oob: bool = False, field: str | None = None) -> str | None:
field = field or ("egpu_oob_artifact" if oob else "egpu_policy_artifact" if policy else "egpu_artifact")
art = meta.get(field)
if not art or not (art.get("objects") or art.get("hf_path")):
return None
from iqpilot.selfdrive.iqmodeld.model_bundle_downloader import download_hf_file, download_lfs_bundle
dest = egpu_oob_pkl_path(meta) if oob else egpu_policy_pkl_path(meta) if policy else egpu_pkl_path(meta)
dest = ARTIFACT_PATHS[field](meta)
if art.get("hf_path"):
try:
return download_hf_file(art["hf_path"], dest, art["sha256"], int(art.get("size", 0)), progress_cb=progress_cb)
@@ -1,3 +0,0 @@
"""
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
"""
@@ -311,3 +311,26 @@ def get_active_model_runner(params: Params = None, force_check=False):
params.put(_RUNNER_CACHE_KEY, int(runner_type))
return runner_type
def get_selected_model_name(params: Params = None) -> str:
params = Params() if params is None else params
try:
stored = params.get(_ACTIVE_BUNDLE_KEY)
if not stored:
return "Default (CD210)"
if not isinstance(stored, dict) or not stored.get("ref"):
return "Model unavailable"
if stored["ref"] == _DEFAULT_BUNDLE_REF:
return stored.get("displayName") or "Default (CD210)"
return stored.get("internalName") or stored.get("displayName") or "Model unavailable"
except Exception:
return "Model unavailable"
def get_cached_model_bundles(params: Params = None) -> list:
params = Params() if params is None else params
try:
return _load_cached_manifest_bundles(params)
except Exception:
return []
@@ -13,6 +13,7 @@ The USB eGPU dock is identified by VID/PID only. comma's internal codename for
it is deliberately not used here: IQ.Pilot runs these models on several
backends (eGPU dock, eMac), so the naming stays about the role, not the vendor.
"""
import subprocess
from pathlib import Path
# comma's USB eGPU dock, both shipped USB IDs. The ROM ids are the same board
@@ -124,6 +125,26 @@ def get_link_error_count(soc: Path = SOC_PLATFORM_PATH) -> int:
return sum(link_errors(c) for c in usb_controllers(soc))
def host_role_controller(soc: Path = SOC_PLATFORM_PATH, udc_root: Path = UDC_PATH) -> Path | None:
ctrl = link_controller(udc_root)
return (soc / ctrl / "mode") if ctrl else None
def ensure_host_role(mode_path: Path | None = None) -> bool:
"""A usbpd blip mid-drive can leave the Type-C controller in 'none'/'peripheral', and the
dock can never re-enumerate until something puts the port back into host mode."""
path = mode_path if mode_path is not None else host_role_controller()
if path is None:
return False
current = read(path)
if current == "host":
return True
if current is None:
return False
rc = subprocess.run(["sudo", "-n", "sh", "-c", f"echo host > {path}"], check=False, capture_output=True)
return rc.returncode == 0 and read(path) == "host"
def egpu_dock_present(root: Path = USB_DEVICES_PATH) -> bool:
"""A dock in ROM/bootloader state is deliberately NOT counted as present: it
enumerates but cannot serve a GPU until vendor firmware is flashed."""
@@ -221,7 +221,6 @@ class BundleProcess(NativeProcess):
def __init__(self, name, bundle, entry, should_run, enabled=True, sigkill=False, restart_if_crash=False):
self.bundle = bundle
self.entry = entry
self.restart_if_crash = restart_if_crash
runner_path = preferred_runner_path()
runner_cmd = str(runner_path) if runner_path.is_absolute() else "./iqpilot_bundle_runner"
runner_cwd = ".iqpilot/runtime_root" if runner_path.is_absolute() else "system/proprietary_runtime"
@@ -238,6 +237,7 @@ class BundleProcess(NativeProcess):
should_run=should_run,
enabled=enabled,
sigkill=sigkill,
restart_if_crash=restart_if_crash,
)
def start(self) -> None:
@@ -67,6 +67,9 @@ def qcomgps(started: bool, params: Params, CP: car.CarParams) -> bool:
def always_run(started: bool, params: Params, CP: car.CarParams) -> bool:
return True
def nav_assist(started: bool, params: Params, CP: car.CarParams) -> bool:
return params.get_bool("IQNavAssistDev") and params.get_bool("IQAndroidNav")
def only_onroad(started: bool, params: Params, CP: car.CarParams) -> bool:
return started
@@ -176,6 +179,7 @@ procs = [
PythonProcess("journald", "iqpilot.system.journald", only_onroad, platform.system() != "Darwin"),
PythonProcess("micd", "iqpilot.system.micd", or_(iscar, livestream)),
PythonProcess("timed", "iqpilot.system.timed", always_run, enabled=not PC),
BundleProcess("navassistd", "iqpilot_navassist_private", "iqpilot_private.navassist.daemon", nav_assist, enabled=TICI, restart_if_crash=True),
PythonProcess("dmonitoringmodeld", "iqpilot.selfdrive.dmonitoringmodeld.dmonitoringmodeld", driver_monitoring, enabled=not PC),
@@ -248,7 +252,7 @@ procs += [
PythonProcess("mapd_manager", "iqpilot.iq_maps.orchestrator", and_(only_offroad, not_low_power)),
# locationd
NativeProcess("iqlocd", "iqpilot/selfdrive/iqlocd", ["./iqlocd"], only_onroad),
NativeProcess("iqlocd", "iqpilot/selfdrive/iqlocd", ["./iqlocd"], only_onroad, restart_if_crash=True),
]
managed_processes = {p.name: p for p in procs}
@@ -1,8 +1,8 @@
{
"python/_iqclosure/_vendored.json": {
"mode": 420,
"sha256": "870f5bc6aa5d8b528dc8e54bbaf03088193a5e764da6d7eb59706e1535dfd766",
"size": 868
"sha256": "4028da084b0134130e996cf62c37b9f18b04a45f0fb79e68d50cfff5274a9a03",
"size": 829
},
"python/_iqclosure/iqpilot/__init__.py": {
"mode": 420,
@@ -91,8 +91,8 @@
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/__init__.py": {
"mode": 420,
"sha256": "5865243a95ca4557d2a960302124a9898545cc3a8387e88ef569308e3d0f7077",
"size": 119
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"size": 0
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/fetcher.py": {
"mode": 420,
@@ -101,8 +101,8 @@
},
"python/_iqclosure/iqpilot/selfdrive/iqmodeld/models/helpers.py": {
"mode": 420,
"sha256": "e4f524c7595754fd9db86724a7bd9b67524c630275ac78599ab6838d1aa7d809",
"size": 11037
"sha256": "da08ff891f57bc808d78104e21bb788553973f9e775d26ab4024f24969835e34",
"size": 11793
},
"python/_iqclosure/iqpilot/system/__init__.py": {
"mode": 420,
@@ -176,7 +176,7 @@
},
"python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "6a43103927cc37690f78758c36db0fcc3bf97ce05f94acd3f5a84ebf914d2a50",
"sha256": "c3278b4461b846f8e126a7683f0167ad45c83a10fabbafcbe47fe63e1afb0438",
"size": 67640
},
"python/iqpilot_private/models/__init__.py": {
@@ -186,38 +186,38 @@
},
"python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "f3e34dd9c64d25bd2f5b729ae94e9bedd63f9b585f772f35d94f382bef4f864c",
"sha256": "ab6e34a85b4af3002f69115f3cded0e3340f29a3af37c43b7322dd76d0305d77",
"size": 133864
},
"python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "469cb16c85db9ec1f66d614039706e8243612abdb44e578fbc964009fb598608",
"sha256": "5de802e8a3f7b1ea0e89c100c87d692731e25e428f6ff49466f6c6311f88fd36",
"size": 68144
},
"python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "8c977c4fa77753b7ab325f3988ed8535a11a0f269c1f3a8d74b4ebf3fa951d33",
"sha256": "b2d02947f269bb1b13ceab9c822d350f6335e34c1111460acd8b4821fadaa7f9",
"size": 134056
},
"python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "f499359e1c4f0e7ca0b495991267d3ec96813862bc098e7cbb62afc59bb8a306",
"size": 136128
"sha256": "fa6acc2bbfaf099dc0d0676aa59ccb37c0788c07ca99ae8d12ef8c24c11102ea",
"size": 201712
},
"python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "92e357d4c38827dd85373fe231e33f67a6a139ceae13f1031696ccb82dd0e872",
"sha256": "fc15899a920fa29e26e3a6992b33ae73d7795e4758634301494c3671933e28a1",
"size": 68080
},
"python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "a5c874def693b474f2f834efb7c35041bc5b9ae94c95d8eed70119591dfebcb2",
"sha256": "e7232d83a28707b604c8f602414ea3f450b1f4d1a81ef536eddb318553198c8c",
"size": 203576
},
"python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "8cd40e577d35d9f6d263b82cd3538de9cbec1cfefb937eee62d8610fab1a55d8",
"size": 340016
"sha256": "4ea2460b166a57f4b85c13a2875abbfd16166ddf23fffb267f5962c30ec0120b",
"size": 339984
},
"runtime": {
"entries": {
@@ -228,13 +228,13 @@
}
},
"signatures": {
"python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": "gLnDq3G09ay0HyWUBNAUwdsG5UBZoVZB9WGa37xLga9AJa3Z36XI9orNi5/gdKFArIkjZXNk8RkRHfXauLQeBw==",
"python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so": "45g/h58OcdFMdfN2qL3qEgAjHDlCpgl6asqg5iC7uudqQ+hkhd5snuNG7k0mCrQJZGQQ8RoRITMUUxqi+P50CQ==",
"python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so": "2l6hQ1qK+k/rYrcnci9NwsZMXzhb+tdWkSrc8cIDgs0cvfPpzOmzTCDW9W2oKZpjmvV6fvKtIvc1mOutqc/NCA==",
"python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so": "ui3uSKS2m9PyKJOeFE5W8K6Qgzrl94JAig4eBGGJJjFcJ74r0fkdwj7Xft7g/DOjfNq0/1K5eynO41sRXGOWDw==",
"python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": "tcwYHuntp8+uT3+T6Yt6JcPNehom6gHoYHFs8vNtiXZ+ihYTUSCPx20apn+WdGKjwj7xZIsEgBzfpSBQgiKCAA==",
"python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": "RjXxVhDtSo/sqt3J5Ab6JZOqsYZUce9MltRBQ6VSEEnHXcJS/NhIrEOfodXJminO1EQxTw7nW/afbMUGM3FFBw==",
"python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": "73KWi0yqKZPYwNMztjWYUY5GbD3B+flzrlmxrCo8NgDNA4q/flsjG4lhEdq6y0Q2UBSl0u3hRSsF/aSLKZeeBA==",
"python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": "k4ZfRTRE1kiKmwVclS2wa3ylNzt1XVuWkZS9AKuajtHkQc/08tQaIDcjAsVfKYJk5diHZICkMp5lX1fyOqdPCQ=="
"python/iqpilot_private/models/__init__.cpython-312-aarch64-linux-gnu.so": "zg9OPSoUt3mdQw41+dWL8IIYA/SRdGTgnB3iSbyoPXnbMGTv3PWFyugPQUilRiWKEeAgfkpSeDccm1LzWnLZAA==",
"python/iqpilot_private/models/big_catalog.cpython-312-aarch64-linux-gnu.so": "ykk9ja8+jHrbO7Pq7LbNAXYQ1Ij5XnICV6v45QO9I7YMPwqxrSkxC7JNUNR1g/YxKhzrSiit/7ReJ42HQGIsBw==",
"python/iqpilot_private/models/egpu_model.cpython-312-aarch64-linux-gnu.so": "Z3w0t85Glo48qHbqmq0KjTVNuX+/7dwPRTVQd/zQEkWf6jVkORxbIJS97lFaEb/QiBrpis9LG8qRS0EXCSAGAg==",
"python/iqpilot_private/models/emac_model_meta.cpython-312-aarch64-linux-gnu.so": "8u38cdxd9SIORVaUuil48bxaqTlwlBb3YV3NVYX7QNjyaBK+LrAVhQvv+2VqpX49Vs0AMXgtbfBo8hKlFLukDA==",
"python/iqpilot_private/models/fetcher.cpython-312-aarch64-linux-gnu.so": "ll6Y2W7YFaJFucFcS9i5aDv4HAlUdnqEGT0CpjRTcri5Euyq+8hf2j2GHBJ17ag2T2Z+SwwnN9U4BCLy9oJoAQ==",
"python/iqpilot_private/models/git_auth.cpython-312-aarch64-linux-gnu.so": "pNuaWCTWnXjksG6wmu6BjHFvu+I5QOzXAnfAb24BThtEGQIHGGU/FRf1Kekf5Exi73SfLnaB4wxEOuGPH0zKAA==",
"python/iqpilot_private/models/helpers.cpython-312-aarch64-linux-gnu.so": "S5UzFxouWi78V0ppT1BzLc/iWObNPme+kgN9mB1yuPSOnldI6QIAf3yc8T5p0hk3CqHxR1CUYJJqJ4qCiceHBQ==",
"python/iqpilot_private/models/manager.cpython-312-aarch64-linux-gnu.so": "ELzpErId/IAkfiVr31UJyjFHxWWfNy3DUrtqGCfngpGoOUbBRatGtXtA8ZosG/cAZGXXnScZnrpKDVLImZCVBQ=="
}
}
@@ -1 +1 @@
VKaSq35mXT1Nv9JNxFhrAse02ZheQGYFKtULc85QsP/MMkDHngMcXXA3NCtPaQ6D+jnrHIzHNdQpgz88UHfRCg==
uX7Iom4jkeTc0G6lDWiznX0NTnUk98IpYuqOrYMALAhujzS/cXqquWEWOMlIPjcONh0g2ACV/ltYFidA9E+OBQ==
@@ -10,7 +10,6 @@
"iqpilot.common.utils",
"iqpilot.konn3kt.cloud_client",
"iqpilot.selfdrive.iqmodeld.config",
"iqpilot.selfdrive.iqmodeld.models",
"iqpilot.selfdrive.iqmodeld.models.fetcher",
"iqpilot.selfdrive.iqmodeld.models.helpers",
"iqpilot.system.hardware",
@@ -1,3 +0,0 @@
"""
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
"""
@@ -311,3 +311,26 @@ def get_active_model_runner(params: Params = None, force_check=False):
params.put(_RUNNER_CACHE_KEY, int(runner_type))
return runner_type
def get_selected_model_name(params: Params = None) -> str:
params = Params() if params is None else params
try:
stored = params.get(_ACTIVE_BUNDLE_KEY)
if not stored:
return "Default (CD210)"
if not isinstance(stored, dict) or not stored.get("ref"):
return "Model unavailable"
if stored["ref"] == _DEFAULT_BUNDLE_REF:
return stored.get("displayName") or "Default (CD210)"
return stored.get("internalName") or stored.get("displayName") or "Model unavailable"
except Exception:
return "Model unavailable"
def get_cached_model_bundles(params: Params = None) -> list:
params = Params() if params is None else params
try:
return _load_cached_manifest_bundles(params)
except Exception:
return []
@@ -311,3 +311,26 @@ def get_active_model_runner(params: Params = None, force_check=False):
params.put(_RUNNER_CACHE_KEY, int(runner_type))
return runner_type
def get_selected_model_name(params: Params = None) -> str:
params = Params() if params is None else params
try:
stored = params.get(_ACTIVE_BUNDLE_KEY)
if not stored:
return "Default (CD210)"
if not isinstance(stored, dict) or not stored.get("ref"):
return "Model unavailable"
if stored["ref"] == _DEFAULT_BUNDLE_REF:
return stored.get("displayName") or "Default (CD210)"
return stored.get("internalName") or stored.get("displayName") or "Model unavailable"
except Exception:
return "Model unavailable"
def get_cached_model_bundles(params: Params = None) -> list:
params = Params() if params is None else params
try:
return _load_cached_manifest_bundles(params)
except Exception:
return []
@@ -20,7 +20,7 @@ from iqpilot.selfdrive.ui.mici.widgets.stock_button import BigButton, BigParamCo
from iqpilot.selfdrive.ui.mici.widgets.stock_dialog import BigConfirmationDialog
from iqpilot.selfdrive.ui.mici.layouts.settings.iq_widgets import MappedParamToggle
from iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle
from iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle, get_selected_model_name, get_cached_model_bundles
from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH
from iqpilot.system.ui.lib.multilang import tr
@@ -328,7 +328,7 @@ class ModelsLayoutMici(NavScroller):
gui_app.push_widget(BigConfirmationDialog(tr("slide to\nredownload"), self._redownload_icon, _redownload, red=True))
def _show_folders(self):
bundles = list(self.model_manager.availableBundles)
bundles = list(self.model_manager.availableBundles) or get_cached_model_bundles(ui_state.params)
favorites = self._read_favorites()
btns = []
@@ -567,18 +567,7 @@ class ModelsLayoutMici(NavScroller):
self._steer_delay.set_value(f"+{sw:.2f} s offset")
def _active_model_name(self) -> str:
if not self._has_active_bundle_param():
return "Default (CD210)"
try:
active = self.model_manager.activeBundle
if is_default_bundle(active):
return active.displayName or "Default (CD210)"
if active and active.ref:
return _display_model_name(active)
except Exception:
pass
return "Default (CD210)"
return tr(get_selected_model_name(ui_state.params))
def _download_progress_text(self, bundle=None) -> str:
bundle = bundle or getattr(self.model_manager, "selectedBundle", None)
@@ -0,0 +1,67 @@
"""
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos
"""
import ast
import copy
from pathlib import Path
from types import SimpleNamespace
import pytest
from iqpilot.selfdrive.iqmodeld.models import helpers
class Params:
def __init__(self, values=None):
self.values = values or {}
def get(self, key):
return self.values.get(key)
def put(self, key, value):
self.values[key] = value
def remove(self, key):
self.values.pop(key, None)
def get_bool(self, key):
return bool(self.get(key))
@pytest.fixture
def saved():
bundle = helpers._load_default_bundle_dict()
bundle.update(ref="custom", internalName="Saved custom", displayName="Saved Custom Model")
return Params({"ModelManager_ActiveBundle": bundle})
def test_both_ui_names_without_manager(saved):
before = copy.deepcopy(saved.values)
for relative, cls, method in [
("ui/layouts/settings/iq_panels.py", "ModelsLayout", "_update_state"),
("selfdrive/ui/mici/layouts/settings/models.py", "ModelsLayoutMici", "_active_model_name"),
]:
path = Path(__file__).resolve().parents[3] / relative
tree = ast.parse(path.read_text())
node = next(n for c in tree.body if isinstance(c, ast.ClassDef) and c.name == cls
for n in c.body if isinstance(n, ast.FunctionDef) and n.name == method)
env = {"tr": lambda text: text, "get_selected_model_name": helpers.get_selected_model_name,
"ui_state": SimpleNamespace(params=saved, sm={"iqModelManager": None}, is_offroad=lambda: True)}
exec(compile(ast.Module(body=[node], type_ignores=[]), str(path), "exec"), env)
values = []
item = SimpleNamespace(set_value=values.append, set_enabled=lambda value: None)
ui = SimpleNamespace(_update_refresh_state=lambda: None, _handle_bundle_download_progress=lambda: None,
current_model_item=SimpleNamespace(action_item=item, set_description=lambda value: None),
redownload_item=SimpleNamespace(action_item=item), _can_redownload=lambda: False,
_redownload_target_bundle=lambda: None)
result = env[method](ui)
assert (result if method == "_active_model_name" else values[0]) == "Saved custom"
assert saved.values == before
@pytest.mark.parametrize("stored,expected", [(None, "Default (CD210)"), ({"ref": "default"}, "Default (CD210)"),
({"internalName": "Broken"}, "Model unavailable"), ("bad", "Model unavailable")])
def test_saved_name_states(stored, expected):
assert helpers.get_selected_model_name(Params({"ModelManager_ActiveBundle": stored})) == expected
+3 -10
View File
@@ -55,7 +55,7 @@ import time
from iqpilot.cereal import custom
from dataclasses import dataclass
from iqpilot.selfdrive.car.vehicle_catalog import load_catalog
from iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle
from iqpilot.selfdrive.iqmodeld.models.helpers import select_default_model, is_default_bundle, get_selected_model_name, get_cached_model_bundles
from iqpilot.selfdrive.iqmodeld.models.runners.model_runner import CUSTOM_MODEL_PATH
from iqpilot.selfdrive.ui.layouts.settings import settings as OP
from iqpilot.selfdrive.ui.layouts.settings.toggles import TogglesLayout
@@ -1908,7 +1908,7 @@ class ModelsLayout(Widget):
return PickerItem(bundle.ref, {'display_name': bundle.displayName, 'short_name': bundle.internalName})
def _get_folders(self, favorites):
bundles = self.model_manager.availableBundles
bundles = self.model_manager.availableBundles or get_cached_model_bundles(ui_state.params)
folders = {}
for bundle in bundles:
folders.setdefault(next((ov_ride.value for ov_ride in bundle.overrides if ov_ride.key == "folder"), ""), []).append(bundle)
@@ -2000,14 +2000,7 @@ class ModelsLayout(Widget):
self._update_refresh_state()
self.model_manager = ui_state.sm["iqModelManager"]
self._handle_bundle_download_progress()
active = self.model_manager.activeBundle if self.model_manager else None
if is_default_bundle(active):
active_name = active.displayName or tr("Default (CD210)")
elif self._has_active_bundle_param() and active and active.ref:
active_name = active.internalName
else:
active_name = tr("Default (CD210)")
self.current_model_item.action_item.set_value(active_name)
self.current_model_item.action_item.set_value(tr(get_selected_model_name(ui_state.params)))
self.redownload_item.action_item.set_enabled(self._can_redownload())
target = self._redownload_target_bundle()
self.redownload_item.action_item.set_value(target.internalName if target else "")