IQ.Pilot Release Commit @ 24b1ade

This commit is contained in:
IQ.Lvbs CI [bot]
2026-08-31 20:34:00 -05:00
parent 67a2b4955e
commit 9312ded8e2
37 changed files with 141 additions and 141 deletions

View File

@@ -316,8 +316,8 @@
},
"python/_iqclosure/iqpilot/system/manager/process_config.py": {
"mode": 420,
"sha256": "1676d1350461c917f2ac8412d68b85a4181e05075755823d34d530866f37ce62",
"size": 13361
"sha256": "8b8de3f4d266213530dbc37248cf86c6a36241ec9b2f04afe0389e126fd2282f",
"size": 13597
},
"python/_iqclosure/iqpilot/system/micd.py": {
"mode": 420,
@@ -376,27 +376,27 @@
},
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "e5766a76611ae1e6a16f16bed9899c0a1617e9ec8390487ac1c76bd68102aec8",
"sha256": "8d8808534c26b97369f5a69da3afbb2f6bdb2e2708c2479ff55a07574eab3cbd",
"size": 135552
},
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "f3434b919fbbcf9fc2bb29c3af817214b4b025eda7d8a50ab331637e41e3fc30",
"sha256": "5ec7c8dc4e4d21f47b9e949a8960baacb470ab267752681ae840ea537646d29a",
"size": 67664
},
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "c2a3cbc4411bee79c6b9cf284385152f4c1d8a50fd4beb246872bf47a5059878",
"sha256": "91e0fab17809c6a7231a956ef082033c906a8e5e44972a10bd32f9b653d634ea",
"size": 204640
},
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "13f241fc7fb7cdd3afc01ce65936e3054d60910461c384b6f8ccabb65e50e61b",
"sha256": "d7356d8cb1ef60ac025ec806f6fe1c1c734c234f5fe5256f17c1bfd3ff36052f",
"size": 69768
},
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "c9d4a41687f057074f520b693c3d208cb8c78951f8c2e24b8cf6ea95c1690f14",
"sha256": "58c1601759b2f61b942d18bf7a07d16050c53424337882e040afb6d083dbd4a4",
"size": 203088
},
"python/iqpilot_private/konn3kt/flockd/__init__.py": {
@@ -406,12 +406,12 @@
},
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "bd6e7bdcd9186240febe0cba2b66dc5ff92e5d7b65f91d8b146e81114a8c6090",
"sha256": "3dea6e1a02a92a5cbebda37b768bcb4ba65224b4920307cded9247f738e6bdfe",
"size": 202184
},
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "9bea4ab85fdc103fc451031d99e1235ca7f84358a65424db902bbfd839278b30",
"sha256": "34a58774d1243add0c0dc5cc95d78e0b17b13ede3bbfb8f0de63dd47a4c6a39f",
"size": 68080
},
"python/iqpilot_private/konn3kt/hephaestus/__init__.py": {
@@ -421,67 +421,67 @@
},
"python/iqpilot_private/konn3kt/hephaestus/_vendor/localapi_runtime.zip": {
"mode": 420,
"sha256": "5bccf8ab5fb8a3d648ba8be6f1e9a9263c1577b2a959f202763a6fcbe02eacb9",
"sha256": "60ce72178566082562ceeeeb84693f04640a2436d5d6c88657ee10fbf570adaa",
"size": 1379342
},
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "6681689c2a20680be9a5c588fc6234a57eba1bc023ff209e9ba16534955d760c",
"sha256": "c83f7947d210eee887750ca5e494e859cd6a099371eede6740282ee5f95fc725",
"size": 268080
},
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "cc9c70a616928fe18e3ec7a49b80b127bb827438cd536146d57013ad006cb9ac",
"sha256": "f7e0c6471e5ae85e4bdb7225d60cdd67e2a54bd7e9386436e6f9eef7249354b3",
"size": 406176
},
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "ac9f9b0467d64935e0a4f81a5e3525aacc8b243937eb339462086a447d7c6210",
"sha256": "83e7f6f18984c947811e2a17707def76fc2e563aea9eb37e9f37f5e09e377548",
"size": 68048
},
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "33e3f6f65a0000d89c5b7e66054232a9773adc4d01fa28cb1ac658c20432e56b",
"size": 335776
"sha256": "20f4505b5c0a320c2bab7f5026f55a0a405d85840b40f89a624b417f764f8a07",
"size": 335848
},
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "c3306fc198b7b9cbf4b481debf4af79ff3d3e9dd23a6cc52137e763427d8f4cd",
"sha256": "b1a14c8534fc8b20bef3661b9390db53a3f39086337d241f931af72a368f7da2",
"size": 272112
},
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "a3e3e45c6c9091620ee1d25f840bac287e166d7fb967d48f04d985c801d72711",
"sha256": "cf3c6b74668adb6f8830e52c25aa17f4211c5fe4cbea88e50dbd3c077e92bd84",
"size": 134408
},
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "9151341dad54e3d27335a1e34592a35dc96e7f82431512cb9387a6ce35ac9661",
"sha256": "2f30fe07926a2b6d51c6ec88ee4d57d0895d841e080bd3866a8750b5f9608aa1",
"size": 3915272
},
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "b3481836a4f580539882bf0781b6aa196940c247e6050f074727501599a04eaa",
"sha256": "823b330d38eac09dbc22a01d1abe00d110f9d2cf8c5dc489ce58b05050db3dbe",
"size": 136472
},
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "7f557d6349f6feb313896fb063b7cdd1b81d13bc3adaa51072730b62e51f2199",
"sha256": "02b76b8792b8f62ec4278dad6e63e5c8574479b8e714538c2cc73ebc216872eb",
"size": 68208
},
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "32257f70289748828910bcdefeb689221a9b9f1b60b669aa454e0c4ed0514194",
"sha256": "46197da34eed0bf10c17baf32081b6a9871ddc9f3807f5de376e41699286e38c",
"size": 67840
},
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "a3de8a57ec88a7a7900e360f274ff4a4a55cb6c693282f000ab9e1a804d1aadf",
"sha256": "144af2138c5e8f90c8432d9b90a8acafe995c1a030eb864aeb4e1b210b53b871",
"size": 135664
},
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "28a68065a70ceea382ac3773d79f0251f0bf862900a7a353d11fe9cb52561b08",
"sha256": "3918430ba6f7dd7b654c73222bb7444afa2ef78be7bf595092b0813cebd61606",
"size": 269600
},
"python/iqpilot_private/konn3kt/uploaderd/__init__.py": {
@@ -491,7 +491,7 @@
},
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "beda75859f40628aaea1890d1207225bd633c76bc975f5a3cc741066508cc709",
"sha256": "77a0da7cf61eaa05df08c448460cb2e563929ee7c41257d9b5f0814d6d32016f",
"size": 336280
},
"runtime": {
@@ -535,25 +535,25 @@
}
},
"signatures": {
"python/iqpilot_private/konn3kt/backups/archive_codec.cpython-312-aarch64-linux-gnu.so": "/uV0KncXN88hxSYogRunz1SJTaeiZtYzMfVXiOwr+QA3AwatE3ZHouzIiPxqYsH/AngmSPBqk9sBHOCmPuTiCw==",
"python/iqpilot_private/konn3kt/backups/backup_keys.cpython-312-aarch64-linux-gnu.so": "skmbTy7FxaZggM1kT1qKUoQijD7s0TJjs7FZB+JSUt4ocf248pQMC55bbKM9P4yFX2QKk7LJ9P0NzXglwTi4CA==",
"python/iqpilot_private/konn3kt/backups/backup_orchestrator.cpython-312-aarch64-linux-gnu.so": "pVG+KU133RzRnnJ71ocvMO5c6lnAhXf3eq7wB3Vr1U3KeITBE/7dJemwbvVfN9bciD8/mUFeurVpBslBDlp1Bw==",
"python/iqpilot_private/konn3kt/backups/cbc_vault.cpython-312-aarch64-linux-gnu.so": "/N1l31Ks/riHSDMhyqBpguzrPNGNPg3WlNRBBnloST7kvAEvphcBnT5+yIQvPWtIZfDN6uKNFavUi06Q3/2JDA==",
"python/iqpilot_private/konn3kt/backups/imahelper.cpython-312-aarch64-linux-gnu.so": "2m5TXcCRT3Shxw5k8Ch3G3UtCIE5Lq5pZwp/R0Npn3hBIqAHi7lVU2q8YuaAPEuR09vbL+dStL3aqy/CbCqXBw==",
"python/iqpilot_private/konn3kt/flockd/flockd.cpython-312-aarch64-linux-gnu.so": "YtzOVOh9rRQT3fbT4a4UDMbmKxPAUL/fLsA7WvQiI4YaUOgy5vx3i/FMx7N+2FswSbAL1Si+jab85zZbJbGaCQ==",
"python/iqpilot_private/konn3kt/flockd/signatures.cpython-312-aarch64-linux-gnu.so": "+zB9FYrJAU6/equ/5EUmCTKV+ukSnPb3NdFuLVDxrbQ0wOKLpwU5fL+760Nk4anp8bpOVABQeS5LMSK+jvhqDA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_auth.cpython-312-aarch64-linux-gnu.so": "Uny9JAJkWPPCJbAkE9PkQvF2XNdHBKqZqdJraA6c2ywzbTx+F8Y+ge054N7Pfgj/oY2rZqHHwC66sz6zUXNbBg==",
"python/iqpilot_private/konn3kt/hephaestus/ble_gatt.cpython-312-aarch64-linux-gnu.so": "EGHn14z9HhVK4WDAiv1k3MKPm9YRkXThjee3PKte9hMB6wF0LWCMNul0pUWcmauPSjhBIU7h9DSIFg9GmgKiAw==",
"python/iqpilot_private/konn3kt/hephaestus/ble_rpc_dispatch.cpython-312-aarch64-linux-gnu.so": "Cmy6QWRx+jkndmCXb2Inr7KSWnB8MeN3IVYoR+GUR7Al2H28bTkB4aroCHc6JRIIIyiE+L3RHn8OZfbfszRICA==",
"python/iqpilot_private/konn3kt/hephaestus/ble_transportd.cpython-312-aarch64-linux-gnu.so": "vAEIgGKcJnr8NmZDkgoJlVQczr2JmQoORbj5jUmFIidDyw2biwH/hhnhAUEbd7DMs2AgcUKsaCozIdD2SYi8CQ==",
"python/iqpilot_private/konn3kt/hephaestus/bt_gamepad.cpython-312-aarch64-linux-gnu.so": "qA+C/uOh+uLHDi8j2HwLUa+Mx3CMOY5hVOjTaw86opkE8GFiCJEMnZnD1+gLfHhSw686VNswDgrp2oUmz97MBQ==",
"python/iqpilot_private/konn3kt/hephaestus/cloud_routes.cpython-312-aarch64-linux-gnu.so": "A/t3xlcV3TPh3o9rfH1JhX7nhUVsDH9foqFKjwpqvpuOlm7X4pfgJXLlxCeEN/YAOkaFEL2ITxpTR/LxxI+sAQ==",
"python/iqpilot_private/konn3kt/hephaestus/hephaestusd.cpython-312-aarch64-linux-gnu.so": "oQC/Edkjh7OGSHjWyYdY0SKRJst5drk4GjXnMuFbZQu53INbrGEuZnpQ8x5Mjb6LxLOiKGU4Yu+ibhZTl7+oAw==",
"python/iqpilot_private/konn3kt/hephaestus/kwp2000.cpython-312-aarch64-linux-gnu.so": "P1y+n8sFHjL+0EMD3+5dHYCUZ5fGLeznzf+1/zszr45fBsHJbSYqPDBepAEx+TrXwDrxEONo8aaVC6PA193pDg==",
"python/iqpilot_private/konn3kt/hephaestus/manage_hephaestusd.cpython-312-aarch64-linux-gnu.so": "yZY/mAzII1O/xMrmQueULxTgXf6Ze6P9PvMNM41LYEaLWlNSJLbYu+umhGQeru8LUGAO+xpuGahDloNMKa+dDg==",
"python/iqpilot_private/konn3kt/hephaestus/motd.cpython-312-aarch64-linux-gnu.so": "zQoY1eHKdlMZW3ITM8G6+UwMBCGR+xt+0dx/ovz5u1uGkbrVHm6A8tfk6Zx27iBKle0qFdye6Al2PQK02kXMBQ==",
"python/iqpilot_private/konn3kt/hephaestus/tp20.cpython-312-aarch64-linux-gnu.so": "10YGOLrImdCOB7LXlDkwkEdj6beXsFfc5AixI5Zq097mBiAcfoWFKiCSPeN3pk4CxuehNXtebw5UuLXsx2ABDg==",
"python/iqpilot_private/konn3kt/hephaestus/vw_pq_flasher.cpython-312-aarch64-linux-gnu.so": "QQ2CnLrT79NeQzODxK9/QbduXtCrp6u/Ca6U5KAdnKVPD86+TndxeiX01wgYUZMLmIFCJh4rPGiFBI2f+oS7AA==",
"python/iqpilot_private/konn3kt/uploaderd/iquploaderd.cpython-312-aarch64-linux-gnu.so": "CqJ0BMkC09FCG+XDybTNULBSobSDBWAPL8YMqXv7QVGCut/9pO1NON5s5zQPVsN6IHUOdt94Iz+h5Ehu1yPjAQ=="
"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=="
}
}

View File

@@ -1 +1 @@
1J/pEtI6qoBjh397jGVMx0xaeG1QXhcxuiHCXKKiU497RGTTHNmgVpKkNngATL61HgbYa7dgj7mPwLs2u7epAQ==
Li23uJ7UFsHmYsNYtk8ZvF7oFHZoV8tl9yuzsFSkEzPBnX5MQJwpihQtEwVC1mn1EAHwyjj7nJ/uaZww1o9wCg==

View File

@@ -138,6 +138,11 @@ def egpu_enabled(started, params, CP: car.CarParams) -> bool:
return (resolve_backend(params.get_bool("IQEmacEnabled"), egpu_selected(params), _egpu_present(params)) == "egpu"
and _egpu_present(params))
def egpu_prefetch_enabled(started, params, CP: car.CarParams) -> bool:
if params.get_bool("IQEgpuDisabled"):
return False
return resolve_backend(params.get_bool("IQEmacEnabled"), True, _egpu_present(params)) == "egpu"
def big_model_enabled(started, params, CP: car.CarParams) -> bool:
return params.get_bool("IQEmacEnabled") or egpu_selected(params)
@@ -223,7 +228,7 @@ procs += [
PythonProcess("iqegpumodeld", "iqpilot.selfdrive.iqmodeld.iqegpumodeld",
and_(only_onroad, and_(is_tinygrad_model, egpu_enabled)), restart_if_crash=True),
PythonProcess("egpu_prefetch", "iqpilot.selfdrive.iqmodeld.egpu_prefetch",
and_(only_offroad, and_(is_tinygrad_model, egpu_enabled)), restart_if_crash=True),
and_(only_offroad, and_(is_tinygrad_model, egpu_prefetch_enabled)), restart_if_crash=True),
BundleProcess("backup_manager_k3", "iqpilot_hephaestusd_private", "iqpilot_private.konn3kt.backups.backup_orchestrator",
and_(only_offroad, hephaestus_ready_shim, not_low_power)),

View File

@@ -16,22 +16,22 @@
},
"python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "f18e3a7886a2e6835c91936cc4a11b118c02576f827683cff2a8d8788c3d1628",
"sha256": "69b858142aeb82cf730f042f6bc354dabb19579654872eaed3f73d482a856802",
"size": 67616
},
"python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "9bb73ab877e3c87f415b07a780c807f6f686bf5d5c01f4f4866260d2812f0b8d",
"sha256": "d8d9ccc3059b6239f2be41437e97b160b96278e419d84f9c0c243a2ba3ebf94c",
"size": 67616
},
"python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "8e33ab06991537400b3c50d2bfe3483627b50c999d6ad0c44d27d09eacac9235",
"sha256": "cea69f651768732bcbbd1a7edff668876dcf6787c332e859f6f01c945d74cbe0",
"size": 67616
},
"python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": {
"mode": 493,
"sha256": "55db05006382a9212c300db2236590260b66489d904e19656f2cf03309de89bf",
"sha256": "384782451d53a5ca89809f05bf5c68577596dfbaca3f2f82bb0a972663897491",
"size": 136608
},
"runtime": {
@@ -43,9 +43,9 @@
}
},
"signatures": {
"python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so": "8MfmjOuuJgGPd2959u6zSnbsfCGIcY8ut4vH4JW//Vqb51508zKFSZYbmsKYFSYmUYcsNrDdKlzG7cyxwi25CQ==",
"python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so": "7ygpLdx/E5TgYoL8OINkv4mYLVkAHlAG0Wh4ZBnXCdTi+fd1bySI+7WmQczoQMlk0VjtIqyJTus+tsRkXEjQDg==",
"python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": "79iU094xiuJ25sF9qXaLqTS/f9AidQhDoTlj2HVBIWt6biVmBY0MpgHOXK7lhCskykR7H/8j9zp2SsA2dToaDA==",
"python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": "rxKmOjUbaJRdo65i8bDae/zEDUXIWvOay4k+KJ3vuH1Z+jQQvRXuWjKAMtJX7a7v/zzTcg7ijY2CBfXEFZJRCQ=="
"python/iqpilot_private/updater/_hf_maps_blob.cpython-312-aarch64-linux-gnu.so": "2hlUdv1cuGpzNrKoSx3VqRGdaVsgkkGhiHKBirfYkEwJmQJizQ966d6iZQoIzh8LEmRdhi+77iLFXQiEWApSDQ==",
"python/iqpilot_private/updater/_iqos_pat_blob.cpython-312-aarch64-linux-gnu.so": "EHoKO6/esRwuP7oxR9a5FXiQVPjh+3CmtXS1jNQor7yOpra/LijNPHvvu423y+vlOn1KkVCbhZgaHrsB/3oJDA==",
"python/iqpilot_private/updater/_pat_blob.cpython-312-aarch64-linux-gnu.so": "oqWDyKXImMpVEHwBohGW1nL7oZaNMu12aP/zMfowkjDAsHZJOM+TOicUNketIi990nJMbhApcJk3zpoM+1nGCw==",
"python/iqpilot_private/updater/git_remote.cpython-312-aarch64-linux-gnu.so": "xp2MN37LX95Rbt3zGC/ZysyTCv8wUi6xpzbHoTLMwRfq4cDpWafItWgFiypcn5ANsAQA7weqMbihmtq6EbV3Bg=="
}
}

View File

@@ -1 +1 @@
0OdQnuSdywA/tTTIVWGwz2gpZ5H50RoDjjWrXlgYDivBPpTU83nj3jbFtFenrzVNDouRC/PbTvEFNwcnHAe8DA==
Q62ipKl3jmGXHvKYVnhQY7sk4ZSS7AmhXf23DY4sYqoTP7hn9WDDlQD82bMhQJdcY+Obcr9fRn1EGmGTuMUjDw==

View File

@@ -429,55 +429,38 @@ class CarController(CarControllerBase, AolCarController, GasInterceptorCarContro
self.gas = pcm_accel / self.params.NIDEC_GAS_MAX
# Render OP's lane and lead cars on the dash. On CAN FD these are radar look-alikes that only
# exist (and are only allowed by panda safety) when the radar is disabled; in stock ACC the real
# radar still owns LANE_PATH/HUD_OBJECTS
if ((self.frame % 2 == 0 and self.CP.carFingerprint in HONDA_BOSCH_RADARLESS) or
(CS.radar_50hz_tick and self.CP.carFingerprint in HONDA_BOSCH_CANFD and self.CP.openpilotLongitudinalControl
and not CS.stock_acc_alive)):
# exist (and are only allowed by panda safety) when the radar is disabled. Radarless keeps the
# camera as the dash authority (known-good), so OP does not author these there
if (CS.radar_50hz_tick and self.CP.carFingerprint in HONDA_BOSCH_CANFD and self.CP.openpilotLongitudinalControl
and not CS.stock_acc_alive):
leads = dash_objects.leads_from_model(self.model, CS.out.vEgo)
lead = leads[0]
lead_d = lead.dRel if lead.status else 0.0
self.rendered_lane = self.lane_renderer.update(self.model, CS.out.vEgo, lead_d)
# the dash freezes the lane display if LANE_PATH and HUD_OBJECTS muxes don't match
if self.CP.carFingerprint in HONDA_BOSCH_CANFD:
mux = self.radar_mux
# no LKAS_HUD_2 on CAN FD: the dash reads the lane length from the in-band terminator, so the
# path is reshaped into the terminated-prefix form
lane_offsets = dash_lane.canfd_lane_offsets(self.rendered_lane)
else:
mux = dash_lane.MUX_CYCLE[(self.frame // 2) % len(dash_lane.MUX_CYCLE)]
lane_offsets = self.rendered_lane.offsets
mux = self.radar_mux
# no LKAS_HUD_2 on CAN FD: the dash reads the lane length from the in-band terminator, so the
# path is reshaped into the terminated-prefix form
lane_offsets = dash_lane.canfd_lane_offsets(self.rendered_lane)
lane_msg = dash_lane.create_lane_path(self.packer, self.CAN.lkas, lane_offsets, mux)
can_sends.append(lane_msg)
# CAN FD cars have no camera HUD_OBJECTS to poll (the disabled radar owned it): author OP's
# lead in slot 0 with the other slots blank (tracks=None)
tracks = CS.camera_object_tracker.snapshot() if CS.camera_object_tracker is not None else None
if self.CP.openpilotLongitudinalControl:
hud_msg = self.dash_object_author.create(self.packer, self.CAN.lkas, lead, tracks, mux, now_nanos * 1e-9,
extra_leads=leads[1:])
else:
# for stock ACC, forward the camera's objects but with our mux
hud_msg = dash_objects.forward_hud_object(self.packer, self.CAN.lkas, mux, tracks)
hud_msg = self.dash_object_author.create(self.packer, self.CAN.lkas, lead, tracks, mux, now_nanos * 1e-9,
extra_leads=leads[1:])
can_sends.append(hud_msg)
# on CAN FD the camera (behind the relay) also consumes these; mirror the identical packed
# bytes onto the camera bus (packed once, so the counter/checksum stay in lockstep)
if self.CP.carFingerprint in HONDA_BOSCH_CANFD:
for addr, dat, _ in (lane_msg, hud_msg):
can_sends.append((addr, dat, self.CAN.camera))
# the camera (behind the relay) also consumes these; mirror the identical packed bytes onto the
# camera bus (packed once, so the counter/checksum stay in lockstep)
for addr, dat, _ in (lane_msg, hud_msg):
can_sends.append((addr, dat, self.CAN.camera))
if self.frame % 20 == 0 and self.CP.carFingerprint in HONDA_BOSCH_RADARLESS:
# COUNTER_2 trails the packer's COUNTER (frame//20 % 4) by one
rl = self.rendered_lane
can_sends.append(dash_lane.create_lkas_hud_2(self.packer, self.CAN.lkas, (self.frame // 20 - 1) % 4,
rl.reach, rl.lane_cross, rl.left_line, rl.right_line))
# Radarless + CAN FD: when stock LKAS is active, the touch-steering-wheel nag eventually forces an
# ACC disengagement (on CAN FD it shows up as a brake tap from the VSA). Disable LKAS automatically
# and block the driver's LKAS button by taking over SCM_BUTTONS on the camera bus while engaged
# (panda blocks the forwarded stock SCM_BUTTONS while this stream flows)
if self.CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD) and CC.enabled and self.frame % 4 == 0 and \
# CAN FD: when stock LKAS is active, the touch-steering-wheel nag eventually forces an ACC
# disengagement (a brake tap from the VSA). Disable LKAS automatically and block the driver's LKAS
# button by taking over SCM_BUTTONS on the camera bus while engaged (panda blocks the forwarded
# stock SCM_BUTTONS while this stream flows). Radarless keeps the stock camera LKAS untouched
if self.CP.carFingerprint in HONDA_BOSCH_CANFD and CC.enabled and self.frame % 4 == 0 and \
not pcm_cancel_cmd and not CC.cruiseControl.resume:
if self.lkas_button_send_remaining == 0 and CS.lkas_hud["LKAS_READY"] and self.frame >= self.last_lkas_button_frame + 500:
self.lkas_button_send_remaining = 3

View File

@@ -197,18 +197,19 @@ def create_lkas_hud(packer, bus, CP, hud_control, lat_active, steering_available
if CP.carFingerprint in (HONDA_BOSCH_RADARLESS | HONDA_BOSCH_CANFD):
lkas_hud_values['LANE_LINES'] = 3
lkas_hud_values['LKAS_PROBLEM'] = steer_fault_permanent
lkas_hud_values['DASHED_LANES'] = lat_active
# car likely needs to see LKAS_PROBLEM fall within a specific time frame, so forward from camera
if CP.carFingerprint in HONDA_BOSCH_RADARLESS:
# gray lanes when disengaged
lkas_hud_values['DASHED_LANES'] = 1
else:
lkas_hud_values['LKAS_PROBLEM'] = lkas_hud['LKAS_PROBLEM']
if CP.carFingerprint in HONDA_BOSCH_CANFD:
lkas_hud_values['LKAS_PROBLEM'] = steer_fault_permanent
# CAN FD: dashed lanes are the AOL armed indication (dashed_lanes is aol.enabled and not
# latActive, which is not standstill-gated - so parked LKAS button presses produce cluster
# feedback). ORed with lat_active so the engaged payload keeps SOLID and DASHED set together,
# byte-matching the stock camera's lanes-on state
lkas_hud_values['DASHED_LANES'] = dashed_lanes or lat_active
if CP.carFingerprint in HONDA_BOSCH_CANFD:
# every payload change must coincide with an LKAS_STATE_CHANGE pulse (see carcontroller); keyed
# on lat_active, not lanesVisible, so the dash LKAS indication follows AOL's lateral state
lkas_hud_values['SOLID_LANES'] = lat_active

View File

@@ -323,9 +323,9 @@ static bool honda_tx_hook(const CANPacket_t *msg) {
// FORCE CANCEL: safety check only relevant when spamming the cancel button in Bosch HW
// ensuring that only the cancel button press is sent (VAL 2) when controls are off.
// This avoids unintended engagements while still allowing resume spam
// On CAN FD and radarless, buttons are also sent to the camera (bus 2) to take over SCM_BUTTONS
// while engaged, so the same check applies there
const bool is_buttons_bus = (msg->bus == bus_buttons) || ((honda_bosch_canfd || honda_bosch_radarless) && (msg->bus == 2U));
// On CAN FD, buttons are also sent to the camera (bus 2) to take over SCM_BUTTONS while engaged, so
// the same check applies there (radarless already sends buttons on bus 2 via bus_buttons)
const bool is_buttons_bus = (msg->bus == bus_buttons) || (honda_bosch_canfd && (msg->bus == 2U));
if ((msg->addr == 0x296U) && !controls_allowed && is_buttons_bus) {
if (((msg->data[0] >> 5) & 0x7U) != 2U) {
tx = false;
@@ -454,13 +454,10 @@ static safety_config honda_bosch_init(uint16_t param) {
{0x33DA, 1, 5, .check_relay = true}, {0x33DB, 1, 8, .check_relay = true}, {0x39F, 1, 8, .check_relay = false},
{0x18DAB0F1, 1, 8, .check_relay = false}}; // Bosch w/ gas and brakes
static CanMsg HONDA_RADARLESS_TX_MSGS[] = {{0xE4, 0, 5, .check_relay = true}, {0x296, 2, 4, .check_relay = false}, {0x33D, 0, 8, .check_relay = true},
{0x6CD5554, 0, 8, .check_relay = true}, {0xF31AA54, 0, 8, .check_relay = true},
{0x6CD5557, 0, 8, .check_relay = true}}; // Bosch radarless (LANE_PATH/LKAS_HUD_2/HUD_OBJECTS authored in stock ACC too)
static CanMsg HONDA_RADARLESS_TX_MSGS[] = {{0xE4, 0, 5, .check_relay = true}, {0x296, 2, 4, .check_relay = false}, {0x33D, 0, 8, .check_relay = true}}; // Bosch radarless
static CanMsg HONDA_RADARLESS_LONG_TX_MSGS[] = {{0xE4, 0, 5, .check_relay = true}, {0x33D, 0, 8, .check_relay = true}, {0x1C8, 0, 8, .check_relay = true},
{0x30C, 0, 8, .check_relay = true}, {0x296, 2, 4, .check_relay = false}, {0x6CD5554, 0, 8, .check_relay = true},
{0xF31AA54, 0, 8, .check_relay = true}, {0x6CD5557, 0, 8, .check_relay = true}}; // Bosch radarless w/ gas and brakes
{0x30C, 0, 8, .check_relay = true}}; // Bosch radarless w/ gas and brakes
// 0x296 on bus 2: OP takes over SCM_BUTTONS towards the camera to auto-disable stock LKAS and to block
// the driver's LKAS button while engaged (the physical SCM_BUTTONS is blocked from forwarding, see fwd hook)
@@ -585,7 +582,7 @@ static bool honda_bosch_fwd_hook(int bus_num, int addr) {
// actually flowing (honda_op_buttons_fresh): the camera needs SCM_BUTTONS content beyond the buttons
// (it raises an adaptive high beam error when the message goes missing), so a bare controls_allowed
// gate would starve it whenever the panda allows controls but OP refuses to engage
if ((honda_bosch_radarless || honda_bosch_canfd) && controls_allowed && (honda_op_buttons_fresh > 0) &&
if (honda_bosch_canfd && controls_allowed && (honda_op_buttons_fresh > 0) &&
(bus_num == 0) && (addr == 0x296)) {
block_msg = true;
}

View File

@@ -39,6 +39,7 @@
#define TOYOTA_COMMON_RX_CHECKS(lta) \
{.msg = {{ 0xaa, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
{.msg = {{0x260, 0, 8, 50U, .ignore_counter = true, .ignore_quality_flag=!(lta)}, { 0 }, { 0 }}}, \
{.msg = {{0x412, 2, 8, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true, .frequency = 1U}, { 0 }, { 0 }}}, \
#define TOYOTA_RX_CHECKS(lta) \
TOYOTA_COMMON_RX_CHECKS(lta) \
@@ -98,6 +99,15 @@ static int TOYOTA_GET_INTERCEPTOR(const CANPacket_t *msg) {
}
static void toyota_rx_hook(const CANPacket_t *msg) {
if (msg->bus == 2U) {
// TSS2 LKAS/LDA button is only observable via the camera's LKAS_HUD; it reads 1 or 2 while
// pressed and rests at 0, and without this edge AOL can never be granted lateral on Toyota.
if (msg->addr == 0x412U) {
unsigned int lda_on_message = (msg->data[3] >> 6U) & 0x3U;
aol_button_press = (lda_on_message != 0U) ? AOL_BUTTON_PRESSED : AOL_BUTTON_NOT_PRESSED;
}
}
if (msg->bus == 0U) {
// get eps motor torque (0.66 factor in dbc)

View File

@@ -609,41 +609,14 @@ class TestHondaBoschRadarlessSafetyBase(TestHondaBoschSafetyBase):
STEER_BUS = 0
BUTTONS_BUS = 2 # camera controls ACC, need to send buttons on bus 2
TX_MSGS = [[0xE4, 0], [0x296, 2], [0x33D, 0], [0x6CD5554, 0], [0xF31AA54, 0], [0x6CD5557, 0]]
FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D, 0x6CD5554, 0xF31AA54, 0x6CD5557]}
# STEERING_CONTROL, LANE_PATH, LKAS_HUD_2, HUD_OBJECTS
RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x33D, 0x6CD5554, 0xF31AA54, 0x6CD5557)}
TX_MSGS = [[0xE4, 0], [0x296, 2], [0x33D, 0]]
FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D]}
RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x33D)} # STEERING_CONTROL
def setUp(self):
self.packer = CANPackerSafety("honda_bosch_radarless_generated")
self.safety = libsafety_py.libsafety
def test_buttons_fwd(self):
# SCM_BUTTONS (0x296) forwards to the camera unless OP's replacement button stream is flowing
# (engaged + a recent OP SCM_BUTTONS tx on the camera bus). The camera needs the message content
# beyond the buttons, so the block fails safe back to forwarding when OP stops sending
self.safety.set_controls_allowed(False)
self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296))
# engaged but OP not sending buttons: keep forwarding
self.safety.set_controls_allowed(True)
self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296))
# OP button stream flowing: block the stock buttons
self.assertTrue(self._tx(self._button_msg(Btn.NONE, bus=2)))
self.assertEqual(-1, self.safety.safety_fwd_hook(0, 0x296))
# never blocked while disengaged
self.safety.set_controls_allowed(False)
self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296))
self.safety.set_controls_allowed(True)
self.assertEqual(-1, self.safety.safety_fwd_hook(0, 0x296))
# freshness decays after 10 stock button frames without an OP tx
for _ in range(10):
self._rx(self._button_msg(Btn.NONE, main_on=True))
self.assertEqual(2, self.safety.safety_fwd_hook(0, 0x296))
class TestHondaBoschRadarlessSafety(HondaPcmEnableBase, TestHondaBoschRadarlessSafetyBase):
"""
@@ -672,9 +645,9 @@ class TestHondaBoschRadarlessLongSafety(common.LongitudinalAccelSafetyTest, Hond
"""
Covers the Honda Bosch Radarless safety mode with longitudinal control
"""
TX_MSGS = [[0xE4, 0], [0x33D, 0], [0x1C8, 0], [0x30C, 0], [0x296, 2], [0x6CD5554, 0], [0xF31AA54, 0], [0x6CD5557, 0]]
FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D, 0x1C8, 0x30C, 0x6CD5554, 0xF31AA54, 0x6CD5557]}
RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x1C8, 0x30C, 0x33D, 0x6CD5554, 0xF31AA54, 0x6CD5557)}
TX_MSGS = [[0xE4, 0], [0x33D, 0], [0x1C8, 0], [0x30C, 0]]
FWD_BLACKLISTED_ADDRS = {2: [0xE4, 0x33D, 0x1C8, 0x30C]}
RELAY_MALFUNCTION_ADDRS = {0: (0xE4, 0x1C8, 0x30C, 0x33D)}
def setUp(self):
super().setUp()

View File

@@ -91,6 +91,35 @@ class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyT
values = {"MAIN_ON": enabled}
return self.packer.make_can_msg_safety(msg, 0, values)
def _lkas_button_msg(self, lkas_button=False, lda_value=None):
values = {"LDA_ON_MESSAGE": (1 if lkas_button else 0) if lda_value is None else lda_value}
return self.packer.make_can_msg_safety("LKAS_HUD", 2, values)
def test_enable_control_allowed_with_aol_button(self):
for enable_aol in (True, False):
with self.subTest("enable_aol", aol_enabled=enable_aol):
self.safety.set_aol_params(enable_aol, False, False)
self._rx(self._lkas_button_msg(False))
self.assertEqual(0, self.safety.get_aol_button_press())
self.assertFalse(self.safety.get_controls_allowed_lat())
self._rx(self._lkas_button_msg(True))
self.assertEqual(1, self.safety.get_aol_button_press())
self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
self._rx(self._lkas_button_msg(False))
self.assertEqual(0, self.safety.get_aol_button_press())
self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
self.safety.set_controls_allowed_lat(False)
self._rx(self._lkas_button_msg(False, lda_value=2))
self.assertEqual(1, self.safety.get_aol_button_press())
self.assertEqual(enable_aol, self.safety.get_controls_allowed_lat())
self._rx(self._lkas_button_msg(False))
self.safety.set_controls_allowed_lat(False)
self.safety.set_aol_params(False, False, False)
def test_diagnostics(self, stock_longitudinal: bool = False, ecu_disabled: bool = True):
for should_tx, msg in ((False, b"\x6D\x02\x3E\x00\x00\x00\x00\x00"), # fwdCamera tester present
(False, b"\x0F\x03\xAA\xAA\x00\x00\x00\x00"), # non-tester present

View File

@@ -161,13 +161,15 @@ def _resolve_object_url(session: requests.Session, url: str, headers: dict) -> t
probe = session.get(url, headers={**headers, "Accept-Encoding": None}, stream=True,
timeout=HTTP_TIMEOUT_S)
probe.raise_for_status()
# A host that serves the bytes itself still needs the caller's auth on the real GET --
# returning {} here sends the download out anonymous and a private host answers 401.
if int(probe.headers.get("content-length") or 0) >= 1024:
probe.close()
return url, {}
return url, dict(headers)
body = probe.content
probe.close()
if not body.startswith(LFS_POINTER_MAGIC):
return url, {}
return url, dict(headers)
meta = dict(line.split(" ", 1) for line in body.decode().strip().splitlines() if " " in line)
oid = meta["oid"].split(":", 1)[1]