dragonpilot mod for 0.8.5-4

This commit is contained in:
Rick Lan
2021-07-02 12:49:43 +08:00
parent 145b222f0d
commit 522fb06db7
224 changed files with 9120 additions and 7777 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 76 KiB

+540
View File
@@ -0,0 +1,540 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr ""
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr ""
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr ""
#: selfdrive/controls/lib/events.py:188
#, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr ""
#: selfdrive/controls/lib/events.py:196
#, python-format
msgid "Calibration in Progress: %d%%"
msgstr ""
#: selfdrive/controls/lib/events.py:197
#, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr ""
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr ""
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr ""
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr ""
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr ""
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr ""
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr ""
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr ""
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr ""
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr ""
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr ""
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr ""
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr ""
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr ""
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr ""
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr ""
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr ""
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr ""
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr ""
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr ""
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr ""
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr ""
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr ""
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr ""
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr ""
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr ""
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr ""
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr ""
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr ""
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr ""
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr ""
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr ""
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr ""
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr ""
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr ""
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr ""
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr ""
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr ""
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr ""
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr ""
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr ""
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr ""
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr ""
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr ""
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr ""
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr ""
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr ""
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr ""
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr ""
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr ""
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr ""
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr ""
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr ""
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr ""
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr ""
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr ""
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr ""
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr ""
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr ""
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr ""
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr ""
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr ""
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr ""
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr ""
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr ""
#: selfdrive/controls/lib/events.py:594
msgid "Calibration Invalid"
msgstr ""
#: selfdrive/controls/lib/events.py:595
msgid "Reposition Device and Recalibrate"
msgstr ""
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr ""
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr ""
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr ""
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr ""
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr ""
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr ""
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr ""
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr ""
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr ""
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr ""
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr ""
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr ""
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr ""
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr ""
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr ""
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr ""
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr ""
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr ""
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:722
msgid ""
"Reverse\n"
"Gear"
msgstr ""
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr ""
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr ""
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr ""
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr ""
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr ""
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr ""
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr ""
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr ""
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr ""
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr ""
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr ""
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr ""
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr ""
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr ""
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr ""
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr ""
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr ""
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr ""
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr ""
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr ""
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr ""
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr ""
Binary file not shown.
@@ -0,0 +1,545 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: nikkurie <@nikkurie>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ja-JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "オープンパイロットは利用できません"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "すぐにハンドルを持って"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "ハンドルを持って"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "横の制御が無効になり速度が以下になります"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "キャリブレーション中:"
#: selfdrive/controls/lib/events.py:197
#, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "%(speed)d %(unit)s 制限速度以上の運転をしてください"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS受信不良"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "地下・トンネルでない場合は、カスタマーサービスに連絡ください"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "GPSアンテナの位置を確認してください。"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "クルーズモードをオフ"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr "メインスイッチをオフ"
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr "テストメッセージを削除"
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "いつでも引き継げるよう準備しておいてください。"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "常にハンドルに触れ、道路から目を離さない"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "警告: このブランチはテストされていません"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "ダッシュカムモード"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "未対応車のためダッシュカムモードのみ"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "サポートされていないGiraffeの設定"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "comma.ai/tg を参照"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "ホワイトパンダはサポート終了しました"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "コンマ2やブラックパンダにアップグレード"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "ホワイトパンダはサポート終了しました"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "純正LKASがオン"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "純正LKASをオフにしてエンゲージ"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "コミュニティ開発の機能を検出"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "開発者設定でコミュニティ機能を有効にする"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "ダッシュカムモード"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "認識できない車"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "ブレーキ!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "衝突の危険"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "衝突の危険"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "衝突の危険"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "車線逸脱を検知"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "アクセル中、オープンパイロットはブレーキをかけません"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "車両パラメータの識別に失敗しました。"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "ステアリングは一時的に利用不可"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "道路から目を離さないで:注意散漫です"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "道路から目を離さないで"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "ドライバーは注意散漫に見えます"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "すぐに解除してください"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "ドライバーは注意力散漫"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "ハンドルに触れて:顔が検出できない"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "ハンドルに触れて"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "ドライバーが無反応"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "ドライバーが無反応でした"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "ドライバーの顔の視認性を確認"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "ドライバー監視モデルが不完全"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "手動で運転を再開"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "停止"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "Resumeを押して移動します。"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "左ハンドルで車線変更を開始"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "他の車両を監視"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "右ハンドルで車線変更を開始"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "ブラインドスポットで車両を発見"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "レーンチェンジ中"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr "ステアリングリミットを超えています"
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "サイドブレーキが作動"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "サイドブレーキ作動中"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "ペダル/ブレーキを検出"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "ACCを有効化"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "再フォーカス中です"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "空き容量不足"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "速度が遅すぎます"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOSの更新が必要"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "更新をお待ちください"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "デバイスセンサからのデータがありません"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "デバイスを再起動"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "スピーカーが見つかりません"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "注意力散漫すぎます"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "オーバーヒート"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "オーバーヒート"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "Dではない"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "キャリブレーション"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "キャリブレーションが無効です。再実行してください。"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "キャリブレーションが無効です。再実行してください。"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "キャリブレーション"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "ドアが開いています"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "ドアが開いています"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "シートベルト未着用"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "シートベルト未着用"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESPオフ"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "低バッテリー"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "プロセス間の通信の問題"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "レーダー通信問題"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "レーダーエラー:車を再起動"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "制御モデルに遅延がある"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "映像が不明瞭です"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr ""
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "ローメモリ:デバイスを再起動"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "RAMが致命的に低い"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "制御失敗"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr "制御不一致"
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CANエラー:接続を確認"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKASの故障:車を再起動"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKASの故障:車を再起動後発進"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "クルーズ失敗:車を再起動"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "クルーズ失敗:車を再起動後発進"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "アクセル故障:車を再起動"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "アクセルエラー:車を再起動"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "Rに切り替え"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "Rに切り替え"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "クルーズコントロールオフ"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr "Planner Solution エラー"
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "ハーネスが故障"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "ハードウェアを確認して"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "オープンパイロットはキャンセルされました"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "リードカー不在"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "リードカー不在"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "速度が遅すぎる"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "速度が速すぎる"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "速度を下げてオープンパイロットを再開"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "速度を落として発進"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "インターネット接続を確認"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "発進するには更新が必要です"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "インターネット接続を確認"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr "左車線に移動します"
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr "右車線に移動します"
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr "操作が必要:レーンキープオフ"
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr "操作が必要:ウインカーオン"
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr "リードカーが移動しました"
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr ""
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr ""
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr ""
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr ""
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr ""
#~ msgid "Drive Above"
#~ msgstr "制限速度以上の運転をしてください"
Binary file not shown.
@@ -0,0 +1,543 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ko-KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "오픈파일럿 사용불가"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "핸들을 잡아주세요"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "핸들을 잡아주세요"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "%d %s 이하에서는 조향제어가 불가합니다"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "캘리브레이션 진행중: %d%%"
#: selfdrive/controls/lib/events.py:197
#, fuzzy, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "%(speed)d %(unit)s 이상의 속도로 주행하세요"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS 신호 약함"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "환경에 문제가 없을경우 서비스팀에 연락하세요"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "GPS안테나 위치를 점검하세요"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "크루즈 모드 꺼짐"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr ""
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr ""
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "오픈파일럿 사용준비가 되었습니다"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "안전운전을 위해 항상 핸들을 잡고 도로교통 상황을 주시하세요"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "경고: 이 Branch는 테스트되지 않았습니다"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "대시캠 모드"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "안전운전을 위해 항상 핸들을 잡고 도로교통 상황을 주시하세요"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "지원되지 않는 지라프 설정"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "comma.ai/tg 방문하세요"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "화이트판다는 더 이상 지원되지 않습니다"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "콤마2나 블랙판다로 업그레이드 하세요"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "화이트판다는 더 이상 지원되지 않습니다"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "차량의 LKAS 기능이 켜져 있습니다"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "오픈파일럿 사용을 위해 LKAS를 끄세요"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "커뮤니티 기능 감지됨"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "개발자 설정에서 커뮤니티 기능을 활성화하세요"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "대시캠 모드"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "미인식 차량"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "브레이크!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "순정 AEB: 충돌 위험"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "순정 FCW: 충돌 위험"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "충돌 위험"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "차선이탈이 감지되었습니다"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "가속중에는 오픈파일럿 브레이크 작동불가"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "차량 매개 변수 식별 실패"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "조향제어가 일시적으로 비활성화 되었습니다"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "도로상황에 주의를 기울이세요"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "도로상황에 주의하세요"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "전방주시 필요"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "경고: 조향제어가 즉시 해제됩니다"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "운전자 전방주시 불안"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "핸들을 터치하세요: 모니터링 없음"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "핸들을 터치하세요"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "운전자 모니터링 없음"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "운전자 모니터링 없음"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "운전자 얼굴 확인 중"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "운전자 얼굴 인식이 어렵습니다"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "수동으로 재출발 하세요"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "잠시멈춤"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "재출발을 위해 RES버튼을 누르세요"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "차선 변경을 위해 핸들을 좌측으로 살짝 돌리세요"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "다른 차량에 주의하세요"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "차선 변경을 위해 핸들을 우측으로 살짝 돌리세요"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "측면 차량 접근 중"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "차선 변경 중"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr ""
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "브레이크 홀드 중"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "파킹브레이크 체결 됨"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "시작 중 페달 밟음"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "어댑티브 크루즈를 활성화하세요"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "카메라 포커스 조정중: 카메라 포커스 부정확"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "저장공간 부족"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "차량의 속도 낮음"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOS 업데이트 필요"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "업데이트를 위해 기다리세요"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "EON센서로부터 데이터를 받지 못했습니다"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "장치를 재시작 하세요"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "스피커를 찾을 수 없습니다"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "운전자 전방주시 매우 불안"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "시스템이 과열되었습니다"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "시스템이 과열되었습니다"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "기어가 드라이브모드가 아닙니다"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "캘리브레이션 진행 중"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "캘리브레이션 유효하지 않음: 장치 위치 조정 및 재 캘리브레이션"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "캘리브레이션 유효하지 않음: 장치 위치 조정 및 재 캘리브레이션"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "캘리브레이션 진행 중"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "도어가 열려있습니다"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "도어가 열려있습니다"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "안전벨트를 체결하세요"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "안전벨트를 체결하세요"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESP 꺼짐"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "배터리 부족"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "프로세스 간 통신 오류가 있습니다"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "레이더 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "레이더 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "주행 모델 지연"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "전방 영상 인식 불안"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr ""
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "메모리 부족: 장치를 재시작하세요"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "메모리 부족 심각"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "차량제어 불가"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr ""
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CAN 오류: CAN 신호를 확인하세요"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKAS 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKAS 오류: 시작을 위해 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "크루즈 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "크루즈 오류: 시작을 위해 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "가속페달 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "가속페달 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "후진 기어"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "후진 기어"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "크루즈 꺼짐"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr ""
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "하네스 오작동"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "장치를 점검하세요"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "오픈파일럿 시작불가"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "선행차량이 없습니다"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "선행차량이 없습니다"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "선행차량이 없습니다"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "속도가 너무 높습니다"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "재 작동을 위해 차량의 속도를 낮추세요"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "시작을 위해 차량의 속도를 낮추세요"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "인터넷에 연결하세요"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "시작을 위해 업데이트를 확인해야 합니다"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "인터넷에 연결하세요"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr ""
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr ""
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr ""
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr ""
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr ""
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr ""
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr ""
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr ""
Binary file not shown.
@@ -0,0 +1,542 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Rick Lan <ricklan@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: zh-CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "无法使用 openpilot"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "即刻接管控制"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "接管控制"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "横向控制暂时失效,车速低于 %d %s"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "正在校准中:%d%%"
#: selfdrive/controls/lib/events.py:197
#, fuzzy, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "车速请高于 %(speed)d %(unit)s"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS 讯号不良"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "如果您不在地下室/隧道,请联系客服"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "请检查 GPS 天线位置"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "巡航模式关闭"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr "主开关已关闭"
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr "除错用警示讯息"
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "请准备好随时接管"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "将手放在方向盘上并持续监视路况"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "注意:这个分支未经过测试"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "行车记录模式"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "行车记录模式 (尚未支援车种)"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "未支援的 Giraffe 设置"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "请查阅 comma.ai/tg"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "不再支持 White Panda"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "请升级至 comma two 或是使用 black panda"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "不再支持 White panda"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "原厂 LKAS 已开启"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "需关闭原厂 LKAS 才能启用"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "检测到社群开发功能"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "请至开发人员设定裡启用社群开发功能"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "行车记录模式"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "无法辨识车款"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "刹车!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "有碰撞的风险"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "有碰撞的风险"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "有碰撞的风险"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "偏离车道"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "在您踩着油门的时候 openpilot 将不会刹车"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "车子参数识别失败"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "横向控制暂时失效"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "注意路况:驾驶分心"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "注意路况"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "驾驶分心"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "立即解除"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "驾驶分心"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "请触碰方向盘:未侦测到驾驶面容"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "请触碰方向盘"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "驾驶没有反应"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "驾驶没有反应"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "请检查驾驶面部的可见度"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "驾驶监控模型判断不明确"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "请自行恢復驾驶"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "已停止"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "请按 RES 继续"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "请往左打方向盘切换至左车道"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "请注意其它车辆"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "请往右打方向盘切换至右车道"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "盲点侦测到车辆"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "切换车道中"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr "弯道超过横向操控限制"
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "驻车煞车已启用"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "电子驻车已启动"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "启用时侦测到驾驶踩踏油门/刹车"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "启用自适应巡航"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "尝试对焦:相机已失焦"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "存储空间不足"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "车速过慢"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOS 需要更新"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "更新中请稍候"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "未收到装置传感器数据"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "请重启装置"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "找不到音效装置"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "驾驶分心太多次"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "系统过热"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "系统过热"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "不在 D 档位"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "正在校准中"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "校准无效:请将装置放于新的位置并重新校准"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "校准无效:请将装置放于新的位置并重新校准"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "正在校准中"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "车门开启"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "车门未关"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "安全带未繫"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "安全带未繫"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESP 关闭"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "电量过低"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "行程间出现通讯问题"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "雷达通讯出现问题"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "雷达讯号错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "操控模型有延迟"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "视觉模型判断不明确"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr "装置掉落侦测"
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "记忆体不足:请重启您的装置"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "记忆体严重不足"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "控制发生错误"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr "控制不匹配"
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CAN 讯号错误:请检查线路"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKAS 错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKAS 错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "巡航系统错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "巡航系统错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "油门错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "油门错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "切换至倒车档"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "切换至倒车档"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "巡航系统关闭"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr "Planner Solution 错误"
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "Harness 故障"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "请检查硬体"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "openpilot 已取消"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "前方没有车辆"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "前方没有车辆"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "车速过慢"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "车速过快"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "请减速后再启用"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "请减速后再启用"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "请连接网路"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "需检查更新后才能启用"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "请连接网路"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr "准备自动切至左车道"
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr "准备自动切至右车道"
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr "请接管方向盘:车道维持关闭"
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr "请接管方向盘:方向灯开启"
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr "前方车辆车移动中"
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr "警告"
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr "请握好方向盘以绕过时间限制"
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr "绕过时间限制中"
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr "握好方向盘"
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr "时间限制已绕过"
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr "准备好后请松开放向盘"
Binary file not shown.
@@ -0,0 +1,542 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Rick Lan <ricklan@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: zh-TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "無法使用 openpilot"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "即刻接管控制"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "接管控制"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "橫向控制暫時失效,車速低於 %d %s"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "正在校準中:%d%%"
#: selfdrive/controls/lib/events.py:197
#, fuzzy, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "車速請高於 %(speed)d %(unit)s"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS 訊號不良"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "如果您不在地下室/隧道,請聯系客服"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "請檢查 GPS 天線位置"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "巡航模式關閉"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr "主開關已關閉"
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr "除錯用警示訊息"
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "請準備好隨時接管"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "將手放在方向盤上並持續監視路況"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "注意:這個分支未經過測試"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "行車記錄模式"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "行車記錄模式 (尚未支援車種)"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "未支援的 Giraffe 設置"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "請查閱 comma.ai/tg"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "不再支援 White Panda"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "請升級至 comma two 或是使用 black panda"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "不再支援 White panda"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "原廠 LKAS 已開啟"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "需關閉原廠 LKAS 才能啟用"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "檢測到社群開發功能"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "請至開發人員設定裡啟用社群開發功能"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "行車記錄模式"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "無法辨識車款"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "剎車!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "有碰撞的風險"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "有碰撞的風險"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "有碰撞的風險"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "偏離車道"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "在您踩著油門的時候 openpilot 將不會剎車"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "車子參數識別失敗"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "橫向控制暫時失效"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "注意路況:駕駛分心"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "注意路況"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "駕駛分心"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "立即解除"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "駕駛分心"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "請觸碰方向盤:未偵測到駕駛面容"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "請觸碰方向盤"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "駕駛沒有反應"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "駕駛沒有反應"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "請檢查駕駛面部的可見度"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "駕駛監控模型判斷不明確"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "請自行恢復駕駛"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "已停止"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "請按 RES 繼續"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "請往左打方向盤切換至左車道"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "請注意其它車輛"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "請往右打方向盤切換至右車道"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "盲點偵測到車輛"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "切換車道中"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr "彎道超過橫向操控限制"
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "駐車煞車已啟用"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "電子駐車已啟動"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "啟用時偵測到駕駛踩踏油門/剎車"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "啟用主動定速巡航"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "嘗試對焦:相機已失焦"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "儲存空間不足"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "車速過慢"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOS 需要更新"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "更新中請稍候"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "未收到裝置傳感器數據"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "請重啟裝置"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "找不到音效裝置"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "駕駛分心太多次"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "系統過熱"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "系統過熱"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "不在 D 檔位"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "正在校準中"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "校準無效:請將裝置放於新的位置並重新校準"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "校準無效:請將裝置放於新的位置並重新校準"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "正在校準中"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "車門開啟"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "車門未關"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "安全帶未繫"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "安全帶未繫"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESP 關閉"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "電量過低"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "行程間出現通訊問題"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "雷達通訊出現問題"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "雷達訊號錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "操控模型有延遲"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "視覺模型判斷不明確"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr "裝置掉落偵測"
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "記憶體不足:請重啟您的裝置"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "記憶體嚴重不足"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "控制發生錯誤"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr "控制不匹配"
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CAN 訊號錯誤:請檢查線路"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKAS 錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKAS 錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "巡航系統錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "巡航系統錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "油門錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "油門錯誤:請重新發動車輛"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "切換至倒車檔"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "切換至倒車檔"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "巡航系統關閉"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr "Planner Solution 錯誤"
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "Harness 故障"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "請檢查硬體"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "openpilot 已取消"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "前方沒有車輛"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "前方沒有車輛"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "車速過慢"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "車速過快"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "請減速後再啟用"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "請減速後再啟用"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "請連接網路"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "需檢查更新後才能啟用"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "請連接網路"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr "準備自動切至左車道"
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr "準備自動切至右車道"
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr "請接管方向盤:車道維持關閉"
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr "請接管方向盤:方向燈開啟"
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr "前方車輛車移動中"
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr "警告"
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr "請握好方向盤以繞過時間限制"
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr "繞過時間限制中"
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr "握好方向盤"
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr "時間限制已繞過"
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr "準備好後請鬆開放向盤"
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+2 -2
View File
@@ -25,7 +25,7 @@ from common.api import Api
from common.basedir import PERSIST
from common.params import Params
from common.realtime import sec_since_boot
from selfdrive.hardware import HARDWARE, PC, TICI
from selfdrive.hardware import HARDWARE, PC, TICI, JETSON
from selfdrive.loggerd.config import ROOT
from selfdrive.loggerd.xattr_cache import getxattr, setxattr
from selfdrive.swaglog import cloudlog, SWAGLOG_DIR
@@ -304,7 +304,7 @@ def get_logs_to_send_sorted():
def log_handler(end_event):
if PC:
if PC or JETSON:
return
log_files = []
+5 -1
View File
@@ -11,7 +11,7 @@ from common.spinner import Spinner
from common.file_helpers import mkdirs_exists_ok
from common.basedir import PERSIST
from selfdrive.controls.lib.alertmanager import set_offroad_alert
from selfdrive.hardware import HARDWARE
from selfdrive.hardware import HARDWARE, JETSON
from selfdrive.swaglog import cloudlog
@@ -20,6 +20,10 @@ UNREGISTERED_DONGLE_ID = "UnregisteredDevice"
def register(show_spinner=False) -> str:
params = Params()
if not params.get_bool('dp_reg') or params.get_bool('dp_jetson'):
return UNREGISTERED_DONGLE_ID
if JETSON:
return UNREGISTERED_DONGLE_ID
params.put("SubscriberInfo", HARDWARE.get_subscriber_info())
IMEI = params.get("IMEI", encoding='utf8')
+10
View File
@@ -1,4 +1,14 @@
Import('env', 'envCython', 'common', 'cereal', 'messaging')
# dp - Add read dp_toyota_disable_relay value
if FindFile('dp_toyota_disable_relay', '/data/params/d') != None:
with open('/data/params/d/dp_toyota_disable_relay') as f:
if (int(f.read().strip())) == 1:
env.Append(CCFLAGS='-DDisableRelay')
if FindFile('dp_panda_no_gps', '/data/params/d') != None:
with open('/data/params/d/dp_panda_no_gps') as f:
if (int(f.read().strip())) == 1:
env.Append(CCFLAGS='-DNoGPS')
env.Program('boardd', ['boardd.cc', 'panda.cc', 'pigeon.cc'], LIBS=['usb-1.0', common, cereal, messaging, 'pthread', 'zmq', 'capnp', 'kj'])
env.Library('libcan_list_to_can_capnp', ['can_list_to_can_capnp.cc'])
+20 -7
View File
@@ -45,10 +45,13 @@ ExitHandler do_exit;
void safety_setter_thread() {
LOGD("Starting safety setter thread");
// diagnostic only is the default, needed for VIN query
#ifndef DisableRelay
panda->set_safety_model(cereal::CarParams::SafetyModel::ELM327);
#endif
Params p = Params();
#ifndef DisableRelay
// switch to SILENT when CarVin param is read
while (true) {
if (do_exit || !panda->connected){
@@ -68,7 +71,7 @@ void safety_setter_thread() {
// VIN query done, stop listening to OBDII
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
#endif
std::string params;
LOGW("waiting for params to set safety model");
while (true) {
@@ -90,7 +93,7 @@ void safety_setter_thread() {
cereal::CarParams::Reader car_params = cmsg.getRoot<cereal::CarParams>();
cereal::CarParams::SafetyModel safety_model = car_params.getSafetyModel();
panda->set_unsafe_mode(0); // see safety_declarations.h for allowed values
panda->set_unsafe_mode(9); // see safety_declarations.h for allowed values
auto safety_param = car_params.getSafetyParam();
LOGW("setting safety model: %d with param %d", (int)safety_model, safety_param);
@@ -276,12 +279,12 @@ void panda_state_thread(bool spoofing_started) {
if (spoofing_started) {
pandaState.ignition_line = 1;
}
#ifndef DisableRelay
// Make sure CAN buses are live: safety_setter_thread does not work if Panda CAN are silent and there is only one other CAN node
if (pandaState.safety_model == (uint8_t)(cereal::CarParams::SafetyModel::SILENT)) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
}
#endif
ignition = ((pandaState.ignition_line != 0) || (pandaState.ignition_can != 0));
if (ignition) {
@@ -295,11 +298,12 @@ void panda_state_thread(bool spoofing_started) {
if (pandaState.power_save_enabled != power_save_desired){
panda->set_power_saving(power_save_desired);
}
#ifndef DisableRelay
// set safety mode to NO_OUTPUT when car is off. ELM327 is an alternative if we want to leverage athenad/connect
if (!ignition && (pandaState.safety_model != (uint8_t)(cereal::CarParams::SafetyModel::NO_OUTPUT))) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
}
#endif
#endif
// clear VIN, CarParams, and set new safety on car start
@@ -415,7 +419,7 @@ void hardware_control_thread() {
cnt++;
sm.update(1000); // TODO: what happens if EINTR is sent while in sm.update?
if (!Hardware::PC() && sm.updated("deviceState")){
if (!Hardware::PC() && !Hardware::JETSON() && sm.updated("deviceState")){
// Charging mode
bool charging_disabled = sm["deviceState"].getDeviceState().getChargingDisabled();
if (charging_disabled != prev_charging_disabled){
@@ -475,6 +479,15 @@ static void pigeon_publish_raw(PubMaster &pm, const std::string &dat) {
}
void pigeon_thread() {
// dp - use toyota directly
#ifdef DisableRelay
panda->set_safety_model(cereal::CarParams::SafetyModel::TOYOTA);
#endif
// from @florianbrede-ayet, disable gps for white panda
#ifdef NoGPS
return;
#endif
PubMaster pm({"ubloxRaw"});
bool ignition_last = false;
@@ -556,7 +569,7 @@ int main() {
err = set_realtime_priority(54);
LOG("set priority returns %d", err);
err = set_core_affinity(Hardware::TICI() ? 4 : 3);
err = set_core_affinity(Hardware::TICI() || Hardware::JETSON() ? 4 : 3);
LOG("set affinity returns %d", err);
while (!do_exit){
+9 -2
View File
@@ -1,4 +1,4 @@
Import('env', 'arch', 'cereal', 'messaging', 'common', 'gpucommon', 'visionipc', 'USE_WEBCAM')
Import('env', 'arch', 'cereal', 'messaging', 'common', 'gpucommon', 'visionipc', 'USE_WEBCAM', 'USE_MIPI')
libs = ['m', 'pthread', common, 'jpeg', 'OpenCL', cereal, messaging, 'zmq', 'capnp', 'kj', visionipc, gpucommon]
@@ -9,7 +9,14 @@ elif arch == "larch64":
libs += ['atomic']
cameras = ['cameras/camera_qcom2.cc']
else:
if USE_WEBCAM:
if USE_MIPI:
libs += ['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_videoio']
cameras = ['cameras/camera_mipi.cc']
env = env.Clone()
env.Append(CXXFLAGS = '-DMIPI')
env.Append(CFLAGS = '-DMIPI')
env.Append(CPPPATH = '/usr/local/include/opencv4')
elif USE_WEBCAM:
libs += ['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_videoio']
cameras = ['cameras/camera_webcam.cc']
env = env.Clone()
@@ -23,6 +23,8 @@
#include "selfdrive/camerad/cameras/camera_qcom2.h"
#elif WEBCAM
#include "selfdrive/camerad/cameras/camera_webcam.h"
#elif MIPI
#include "selfdrive/camerad/cameras/camera_mipi.h"
#else
#include "selfdrive/camerad/cameras/camera_frame_stream.h"
#endif
+2 -1
View File
@@ -25,7 +25,8 @@
#define CAMERA_ID_LGC920 6
#define CAMERA_ID_LGC615 7
#define CAMERA_ID_AR0231 8
#define CAMERA_ID_MAX 9
#define CAMERA_ID_IMX219 9
#define CAMERA_ID_MAX 10
#define UI_BUF_COUNT 4
#define YUV_COUNT 40
+154
View File
@@ -0,0 +1,154 @@
#include "selfdrive/camerad/cameras/camera_mipi.h"
#include <assert.h>
#include <string.h>
#include <unistd.h>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundefined-inline"
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#pragma clang diagnostic pop
#include "selfdrive/common/clutil.h"
#include "selfdrive/common/swaglog.h"
#include "selfdrive/common/timing.h"
#include "selfdrive/common/util.h"
// id of the video capturing device
const int ROAD_CAMERA_ID = getenv("ROADCAM_ID") ? atoi(getenv("ROADCAM_ID")) : 1;
#define FRAME_WIDTH 1164
#define FRAME_HEIGHT 874
#define FRAME_WIDTH_FRONT 1152
#define FRAME_HEIGHT_FRONT 864
extern ExitHandler do_exit;
namespace {
CameraInfo cameras_supported[CAMERA_ID_MAX] = {
// road facing
[CAMERA_ID_IMX219] = {
.frame_width = FRAME_WIDTH,
.frame_height = FRAME_HEIGHT,
.frame_stride = FRAME_WIDTH*3,
.bayer = false,
.bayer_flip = false,
},
};
std::string gstreamer_pipeline(int sensor_id, int capture_width, int capture_height, int framerate, int flip_method, int display_width, int display_height) {
return "nvarguscamerasrc sensor_mode=1 sensor-id=" + std::to_string(sensor_id) + " ! video/x-raw(memory:NVMM), width=(int)" + std::to_string(capture_width) + ", height=(int)" +
std::to_string(capture_height) + ", format=(string)NV12, framerate=(fraction)" + std::to_string(framerate) +
"/1 ! nvvidconv flip-method=" + std::to_string(flip_method) + " ! video/x-raw, width=(int)" + std::to_string(display_width) + ", height=(int)" +
std::to_string(display_height) + ", format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
}
void camera_open(CameraState *s, bool rear) {
// empty
}
void camera_close(CameraState *s) {
// empty
}
void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type) {
assert(camera_id < std::size(cameras_supported));
s->ci = cameras_supported[camera_id];
assert(s->ci.frame_width != 0);
s->camera_num = camera_id;
s->fps = fps;
s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type);
}
void run_camera(CameraState *s, cv::VideoCapture &video_cap, float *ts) {
assert(video_cap.isOpened());
cv::Size size(s->ci.frame_width, s->ci.frame_height);
const cv::Mat transform = cv::Mat(3, 3, CV_32F, ts);
uint32_t frame_id = 0;
size_t buf_idx = 0;
while (!do_exit) {
cv::Mat frame_mat, transformed_mat;
video_cap >> frame_mat;
cv::warpPerspective(frame_mat, transformed_mat, transform, size, cv::INTER_LINEAR, cv::BORDER_CONSTANT, 0);
s->buf.camera_bufs_metadata[buf_idx] = {.frame_id = frame_id};
auto &buf = s->buf.camera_bufs[buf_idx];
int transformed_size = transformed_mat.total() * transformed_mat.elemSize();
CL_CHECK(clEnqueueWriteBuffer(buf.copy_q, buf.buf_cl, CL_TRUE, 0, transformed_size, transformed_mat.data, 0, NULL, NULL));
s->buf.queue(buf_idx);
++frame_id;
buf_idx = (buf_idx + 1) % FRAME_BUF_COUNT;
}
}
static void road_camera_thread(CameraState *s) {
set_thread_name("mipi_road_camera_thread");
std::string pipeline = gstreamer_pipeline(
1,
1920,
1280,
s->fps,
2,
800,
600);
cv::VideoCapture cap_road(pipeline, cv::CAP_GSTREAMER); // road
// transforms calculation see tools/webcam/warp_vis.py
float ts[9] = {1.50330396, 0.0, -59.40969163,
0.0, 1.50330396, 76.20704846,
0.0, 0.0, 1.0};
run_camera(s, cap_road, ts);
}
} // namespace
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {
camera_init(v, &s->road_cam, CAMERA_ID_IMX219, 20, device_id, ctx,
VISION_STREAM_RGB_BACK, VISION_STREAM_YUV_BACK);
s->pm = new PubMaster({"roadCameraState", /*"driverCameraState,"*/ "thumbnail"});
}
void camera_autoexposure(CameraState *s, float grey_frac) {}
void cameras_open(MultiCameraState *s) {
camera_open(&s->road_cam, true);
}
void cameras_close(MultiCameraState *s) {
camera_close(&s->road_cam);
delete s->pm;
}
void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) {
const CameraBuf *b = &c->buf;
MessageBuilder msg;
auto framed = msg.initEvent().initRoadCameraState();
fill_frame_data(framed, b->cur_frame_data);
framed.setImage(kj::arrayPtr((const uint8_t *)b->cur_yuv_buf->addr, b->cur_yuv_buf->len));
framed.setTransform(b->yuv_transform.v);
s->pm->send("roadCameraState", msg);
}
void cameras_run(MultiCameraState *s) {
std::vector<std::thread> threads;
threads.push_back(start_process_thread(s, &s->road_cam, process_road_camera));
std::thread t_rear = std::thread(road_camera_thread, &s->road_cam);
set_thread_name("mipi_thread");
t_rear.join();
for (auto &t : threads) t.join();
cameras_close(s);
}
+28
View File
@@ -0,0 +1,28 @@
#pragma once
#ifdef __APPLE__
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif
#include "selfdrive/camerad/cameras/camera_common.h"
#define FRAME_BUF_COUNT 16
typedef struct CameraState {
CameraInfo ci;
int camera_num;
int fps;
float digital_gain;
CameraBuf buf;
} CameraState;
typedef struct MultiCameraState {
CameraState road_cam;
CameraState driver_cam;
SubMaster *sm;
PubMaster *pm;
} MultiCameraState;
+612 -165
View File
@@ -27,7 +27,7 @@
// leeco actuator (DW9800W H-Bridge Driver IC)
// from sniff
const uint16_t INFINITY_DAC = 364;
//const uint16_t INFINITY_DAC = 364;
extern ExitHandler do_exit;
@@ -48,9 +48,25 @@ CameraInfo cameras_supported[CAMERA_ID_MAX] = {
.frame_height = 1748,
.frame_stride = 2912,
.bayer = true,
.bayer_flip = 3,
.bayer_flip = 0,
.hdr = true
},
[CAMERA_ID_IMX179] = {
.frame_width = 3280,
.frame_height = 2464,
.frame_stride = 4104,
.bayer = true,
.bayer_flip = 0,
.hdr = false
},
[CAMERA_ID_S5K3P8SP] = {
.frame_width = 2304,
.frame_height = 1728,
.frame_stride = 2880,
.bayer = true,
.bayer_flip = 1,
.hdr = false
},
[CAMERA_ID_OV8865] = {
.frame_width = 1632,
.frame_height = 1224,
@@ -162,6 +178,24 @@ static int ov8865_apply_exposure(CameraState *s, int gain, int integ_lines, uint
return sensor_write_regs(s, reg_array, std::size(reg_array), MSM_CAMERA_I2C_BYTE_DATA);
}
static int imx179_s5k3p8sp_apply_exposure(CameraState *s, int gain, int integ_lines, uint32_t frame_length) {
//printf("driver camera: %d %d %d\n", gain, integ_lines, frame_length);
struct msm_camera_i2c_reg_array reg_array[] = {
{0x104,0x1,0},
// FRM_LENGTH
{0x340, (uint16_t)(frame_length >> 8), 0}, {0x341, (uint16_t)(frame_length & 0xff), 0},
// coarse_int_time
{0x202, (uint16_t)(integ_lines >> 8), 0}, {0x203, (uint16_t)(integ_lines & 0xff),0},
// global_gain
{0x204, (uint16_t)(gain >> 8), 0}, {0x205, (uint16_t)(gain & 0xff),0},
// REG_HOLD
{0x104,0x0,0},
};
return sensor_write_regs(s, reg_array, std::size(reg_array), MSM_CAMERA_I2C_BYTE_DATA);
}
static void camera_init(VisionIpcServer *v, CameraState *s, int camera_id, int camera_num,
uint32_t pixel_clock, uint32_t line_length_pclk,
uint32_t max_gain, uint32_t fps, cl_device_id device_id, cl_context ctx,
@@ -179,18 +213,41 @@ static void camera_init(VisionIpcServer *v, CameraState *s, int camera_id, int c
s->frame_length = s->pixel_clock / line_length_pclk / s->fps;
s->self_recover = 0;
s->apply_exposure = (camera_id == CAMERA_ID_IMX298) ? imx298_apply_exposure : ov8865_apply_exposure;
if (camera_id == CAMERA_ID_IMX298) {
s->apply_exposure = imx298_apply_exposure;
} else if (camera_id == CAMERA_ID_S5K3P8SP || camera_id == CAMERA_ID_IMX179) {
s->apply_exposure = imx179_s5k3p8sp_apply_exposure;
} else {
s->apply_exposure = ov8865_apply_exposure;
}
s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type, camera_release_buffer);
}
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {
char project_name[1024] = {0};
property_get("ro.boot.project_name", project_name, "");
assert(strlen(project_name) == 0);
// sensor is flipped in LP3
// IMAGE_ORIENT = 3
init_array_imx298[0].reg_data = 3;
char product_name[1024] = {0};
property_get("ro.product.name", product_name, "");
if (strlen(project_name) == 0) {
LOGD("LePro 3 op system detected");
s->device = DEVICE_LP3;
// sensor is flipped in LP3
// IMAGE_ORIENT = 3
init_array_imx298[0].reg_data = 3;
cameras_supported[CAMERA_ID_IMX298].bayer_flip = 3;
} else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") != 0) {
// no more OP3 support
s->device = DEVICE_OP3;
assert(false);
} else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") == 0) {
// only OP3T support
s->device = DEVICE_OP3T;
} else {
assert(false);
}
// 0 = ISO 100
// 256 = ISO 200
@@ -212,11 +269,30 @@ void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_i
#endif
device_id, ctx,
VISION_STREAM_RGB_BACK, VISION_STREAM_YUV_BACK);
s->road_cam.apply_exposure = imx298_apply_exposure;
camera_init(v, &s->driver_cam, CAMERA_ID_OV8865, 1,
/*pixel_clock=*/72000000, /*line_length_pclk=*/1602,
/*max_gain=*/510, 10, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
if (s->device == DEVICE_OP3T) {
camera_init(v, &s->driver_cam, CAMERA_ID_S5K3P8SP, 1,
/*pixel_clock=*/560000000, /*line_length_pclk=*/5120,
/*max_gain=*/510, 10, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
s->driver_cam.apply_exposure = imx179_s5k3p8sp_apply_exposure;
} else if (s->device == DEVICE_LP3) {
camera_init(v, &s->driver_cam, CAMERA_ID_OV8865, 1,
/*pixel_clock=*/72000000, /*line_length_pclk=*/1602,
/*max_gain=*/510, 10, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
s->driver_cam.apply_exposure = ov8865_apply_exposure;
} else {
camera_init(v, &s->driver_cam, CAMERA_ID_IMX179, 1,
/*pixel_clock=*/251200000, /*line_length_pclk=*/3440,
/*max_gain=*/224, 20, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
s->driver_cam.apply_exposure = imx179_s5k3p8sp_apply_exposure;
}
s->road_cam.device = s->device;
s->driver_cam.device = s->device;
s->sm = new SubMaster({"driverState"});
s->pm = new PubMaster({"roadCameraState", "driverCameraState", "thumbnail"});
@@ -260,8 +336,10 @@ static void set_exposure(CameraState *s, float exposure_frac, float gain_frac) {
if (gain != s->cur_gain || integ_lines != s->cur_integ_lines) {
if (s->apply_exposure == ov8865_apply_exposure) {
gain = 800 * gain_frac; // ISO
err = s->apply_exposure(s, gain, integ_lines, s->frame_length);
} else if (s->apply_exposure) {
err = s->apply_exposure(s, gain, integ_lines, s->frame_length);
}
err = s->apply_exposure(s, gain, integ_lines, s->frame_length);
if (err == 0) {
std::lock_guard lk(s->frame_info_lock);
s->cur_gain = gain;
@@ -320,95 +398,310 @@ static void do_autoexposure(CameraState *s, float grey_frac) {
}
}
static void sensors_init(MultiCameraState *s) {
msm_camera_sensor_slave_info slave_infos[2] = {
(msm_camera_sensor_slave_info){ // road camera
.sensor_name = "imx298",
.eeprom_name = "sony_imx298",
.actuator_name = "dw9800w",
.ois_name = "",
.flash_name = "pmic",
.camera_id = CAMERA_0,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664, .module_id = 9, .vcm_id = 6},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_GPIO, .seq_val = 5, .config_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 10},
},
.size = 7,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_GPIO, .seq_val = 5},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
},
.size_down = 6,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 90},
.output_format = MSM_SENSOR_BAYER,
},
(msm_camera_sensor_slave_info){ // driver camera
.sensor_name = "ov8865_sunny",
.eeprom_name = "ov8865_plus",
.actuator_name = "",
.ois_name = "",
.flash_name = "",
.camera_id = CAMERA_2,
.slave_addr = 108,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 12299, .sensor_id = 34917, .module_id = 2},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1},
},
.size = 6,
.power_down_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
}};
static uint8_t* get_eeprom(int eeprom_fd, size_t *out_len) {
msm_eeprom_cfg_data cfg = {.cfgtype = CFG_EEPROM_GET_CAL_DATA};
int err = cam_ioctl(eeprom_fd, VIDIOC_MSM_EEPROM_CFG, &cfg, "get_eeprom begin");
assert(err >= 0);
unique_fd sensorinit_fd = open("/dev/v4l-subdev11", O_RDWR | O_NONBLOCK);
assert(sensorinit_fd >= 0);
for (auto &info : slave_infos) {
info.power_setting_array.power_setting = &info.power_setting_array.power_setting_a[0];
info.power_setting_array.power_down_setting = &info.power_setting_array.power_down_setting_a[0];
sensor_init_cfg_data sensor_init_cfg = {.cfgtype = CFG_SINIT_PROBE, .cfg.setting = &info};
int err = cam_ioctl(sensorinit_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &sensor_init_cfg, "sensor init cfg");
assert(err >= 0);
uint32_t num_bytes = cfg.cfg.get_data.num_bytes;
assert(num_bytes > 100);
uint8_t* buffer = (uint8_t*)malloc(num_bytes);
assert(buffer);
memset(buffer, 0, num_bytes);
cfg.cfgtype = CFG_EEPROM_READ_CAL_DATA;
cfg.cfg.read_data.num_bytes = num_bytes;
cfg.cfg.read_data.dbuffer = buffer;
err = cam_ioctl(eeprom_fd, VIDIOC_MSM_EEPROM_CFG, &cfg, "get_eeprom end");
assert(err >= 0);
*out_len = num_bytes;
return buffer;
}
static void imx298_ois_calibration(int ois_fd, uint8_t* eeprom) {
const int ois_registers[][2] = {
// == SET_FADJ_PARAM() == (factory adjustment)
// Set Hall Current DAC
{0x8230, *(uint16_t*)(eeprom+0x102)}, //_P_30_ADC_CH0 (CURDAT)
// Set Hall PreAmp Offset
{0x8231, *(uint16_t*)(eeprom+0x104)}, //_P_31_ADC_CH1 (HALOFS_X)
{0x8232, *(uint16_t*)(eeprom+0x106)}, //_P_32_ADC_CH2 (HALOFS_Y)
// Set Hall-X/Y PostAmp Offset
{0x841e, *(uint16_t*)(eeprom+0x108)}, //_M_X_H_ofs
{0x849e, *(uint16_t*)(eeprom+0x10a)}, //_M_Y_H_ofs
// Set Residual Offset
{0x8239, *(uint16_t*)(eeprom+0x10c)}, //_P_39_Ch3_VAL_1 (PSTXOF)
{0x823b, *(uint16_t*)(eeprom+0x10e)}, //_P_3B_Ch3_VAL_3 (PSTYOF)
// DIGITAL GYRO OFFSET
{0x8406, *(uint16_t*)(eeprom+0x110)}, //_M_Kgx00
{0x8486, *(uint16_t*)(eeprom+0x112)}, //_M_Kgy00
{0x846a, *(uint16_t*)(eeprom+0x120)}, //_M_TMP_X_
{0x846b, *(uint16_t*)(eeprom+0x122)}, //_M_TMP_Y_
// HALLSENSE
// Set Hall Gain
{0x8446, *(uint16_t*)(eeprom+0x114)}, //_M_KgxHG
{0x84c6, *(uint16_t*)(eeprom+0x116)}, //_M_KgyHG
// Set Cross Talk Canceller
{0x8470, *(uint16_t*)(eeprom+0x124)}, //_M_KgxH0
{0x8472, *(uint16_t*)(eeprom+0x126)}, //_M_KgyH0
// LOOPGAIN
{0x840f, *(uint16_t*)(eeprom+0x118)}, //_M_KgxG
{0x848f, *(uint16_t*)(eeprom+0x11a)}, //_M_KgyG
// Position Servo ON ( OIS OFF )
{0x847f, 0x0c0c}, //_M_EQCTL
};
struct msm_camera_i2c_seq_reg_array ois_reg_settings[std::size(ois_registers)] = {{0}};
for (int i=0; i<std::size(ois_registers); i++) {
ois_reg_settings[i].reg_addr = ois_registers[i][0];
ois_reg_settings[i].reg_data[0] = ois_registers[i][1] & 0xff;
ois_reg_settings[i].reg_data[1] = (ois_registers[i][1] >> 8) & 0xff;
ois_reg_settings[i].reg_data_size = 2;
}
struct msm_camera_i2c_seq_reg_setting ois_reg_setting = {
.reg_setting = &ois_reg_settings[0],
.size = std::size(ois_reg_settings),
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.delay = 0,
};
msm_ois_cfg_data cfg = {.cfgtype = CFG_OIS_I2C_WRITE_SEQ_TABLE, .cfg.settings = &ois_reg_setting};
cam_ioctl(ois_fd, VIDIOC_MSM_OIS_CFG, &cfg, "ois reg calibration");
}
static void sensors_init(MultiCameraState *s) {
int err;
unique_fd sensorinit_fd;
if (s->device == DEVICE_LP3) {
sensorinit_fd = open("/dev/v4l-subdev11", O_RDWR | O_NONBLOCK);
} else {
sensorinit_fd = open("/dev/v4l-subdev12", O_RDWR | O_NONBLOCK);
}
assert(sensorinit_fd >= 0);
// init road camera sensor
struct msm_camera_sensor_slave_info slave_info = {0};
if (s->device == DEVICE_LP3) {
slave_info = (struct msm_camera_sensor_slave_info){
.sensor_name = "imx298",
.eeprom_name = "sony_imx298",
.actuator_name = "dw9800w",
.ois_name = "",
.flash_name = "pmic",
.camera_id = CAMERA_0,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664, .module_id = 9, .vcm_id = 6},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_GPIO, .seq_val = 5, .config_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 10},
},
.size = 7,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_GPIO, .seq_val = 5},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
},
.size_down = 6,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 90},
.output_format = MSM_SENSOR_BAYER,
};
} else {
slave_info = (struct msm_camera_sensor_slave_info){
.sensor_name = "imx298",
.eeprom_name = "sony_imx298",
.actuator_name = "rohm_bu63165gwl",
.ois_name = "rohm_bu63165gwl",
.camera_id = CAMERA_0,
.slave_addr = 52,
.i2c_freq_mode = I2C_CUSTOM_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 2},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 2},
{.seq_type = SENSOR_VREG, .delay = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 2},
{.seq_type = SENSOR_GPIO, .seq_val = 6, .config_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 5},
{.seq_type = SENSOR_VREG, .seq_val = 4, .delay = 5},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 2},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 2},
},
.size = 9,
.power_down_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 10},
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 4},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
{.seq_type = SENSOR_GPIO, .seq_val = 6},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_VREG, .seq_val = 2},
},
.size_down = 8,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 360},
.output_format = MSM_SENSOR_BAYER,
};
}
slave_info.power_setting_array.power_setting =
(struct msm_sensor_power_setting *)&slave_info.power_setting_array.power_setting_a[0];
slave_info.power_setting_array.power_down_setting =
(struct msm_sensor_power_setting *)&slave_info.power_setting_array.power_down_setting_a[0];
sensor_init_cfg_data sensor_init_cfg = {.cfgtype = CFG_SINIT_PROBE, .cfg.setting = &slave_info};
err = cam_ioctl(sensorinit_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &sensor_init_cfg, "sensor init cfg (road)");
assert(err >= 0);
struct msm_camera_sensor_slave_info slave_info2 = {0};
if (s->device == DEVICE_LP3) {
slave_info2 = (struct msm_camera_sensor_slave_info){
.sensor_name = "ov8865_sunny",
.eeprom_name = "ov8865_plus",
.actuator_name = "",
.ois_name = "",
.flash_name = "",
.camera_id = CAMERA_2,
.slave_addr = 108,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 12299, .sensor_id = 34917, .module_id = 2},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1},
},
.size = 6,
.power_down_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
};
} else if (s->driver_cam.camera_id == CAMERA_ID_S5K3P8SP) {
// init driver camera
slave_info2 = (struct msm_camera_sensor_slave_info){
.sensor_name = "s5k3p8sp",
.eeprom_name = "s5k3p8sp_m24c64s",
.actuator_name = "",
.ois_name = "",
.camera_id = CAMERA_1,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id = 12552},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 1},
{.seq_type = SENSOR_VREG, .delay = 1},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1},
},
.size = 6,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
};
} else {
// init driver camera
slave_info2 = (struct msm_camera_sensor_slave_info){
.sensor_name = "imx179",
.eeprom_name = "sony_imx179",
.actuator_name = "",
.ois_name = "",
.camera_id = CAMERA_1,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 2, .sensor_id = 377, .sensor_id_mask = 4095},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_GPIO, .config_val = 2},
{.seq_type = SENSOR_CLK, .config_val = 24000000},
},
.size = 5,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .delay = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
};
}
slave_info2.power_setting_array.power_setting =
(struct msm_sensor_power_setting *)&slave_info2.power_setting_array.power_setting_a[0];
slave_info2.power_setting_array.power_down_setting =
(struct msm_sensor_power_setting *)&slave_info2.power_setting_array.power_down_setting_a[0];
sensor_init_cfg.cfgtype = CFG_SINIT_PROBE;
sensor_init_cfg.cfg.setting = &slave_info2;
err = cam_ioctl(sensorinit_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &sensor_init_cfg, "sensor init cfg (driver)");
assert(err >= 0);
}
static void camera_open(CameraState *s, bool is_road_cam) {
int err;
struct csid_cfg_data csid_cfg_data = {};
struct v4l2_event_subscription sub = {};
struct msm_actuator_cfg_data actuator_cfg_data = {};
struct msm_ois_cfg_data ois_cfg_data = {};
// open devices
const char *sensor_dev;
@@ -417,19 +710,45 @@ static void camera_open(CameraState *s, bool is_road_cam) {
assert(s->csid_fd >= 0);
s->csiphy_fd = open("/dev/v4l-subdev0", O_RDWR | O_NONBLOCK);
assert(s->csiphy_fd >= 0);
sensor_dev = "/dev/v4l-subdev17";
s->isp_fd = open("/dev/v4l-subdev13", O_RDWR | O_NONBLOCK);
if (s->device == DEVICE_LP3) {
sensor_dev = "/dev/v4l-subdev17";
} else {
sensor_dev = "/dev/v4l-subdev18";
}
if (s->device == DEVICE_LP3) {
s->isp_fd = open("/dev/v4l-subdev13", O_RDWR | O_NONBLOCK);
} else {
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK);
}
assert(s->isp_fd >= 0);
s->eeprom_fd = open("/dev/v4l-subdev8", O_RDWR | O_NONBLOCK);
assert(s->eeprom_fd >= 0);
s->actuator_fd = open("/dev/v4l-subdev7", O_RDWR | O_NONBLOCK);
assert(s->actuator_fd >= 0);
if (s->device != DEVICE_LP3) {
s->ois_fd = open("/dev/v4l-subdev10", O_RDWR | O_NONBLOCK);
assert(s->ois_fd >= 0);
}
} else {
s->csid_fd = open("/dev/v4l-subdev5", O_RDWR | O_NONBLOCK);
assert(s->csid_fd >= 0);
s->csiphy_fd = open("/dev/v4l-subdev2", O_RDWR | O_NONBLOCK);
assert(s->csiphy_fd >= 0);
sensor_dev = "/dev/v4l-subdev18";
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK);
if (s->device == DEVICE_LP3) {
sensor_dev = "/dev/v4l-subdev18";
} else {
sensor_dev = "/dev/v4l-subdev19";
}
if (s->device == DEVICE_LP3) {
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK);
} else {
s->isp_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK);
}
assert(s->isp_fd >= 0);
s->eeprom_fd = open("/dev/v4l-subdev9", O_RDWR | O_NONBLOCK);
assert(s->eeprom_fd >= 0);
}
// wait for sensor device
@@ -448,7 +767,7 @@ static void camera_open(CameraState *s, bool is_road_cam) {
struct msm_camera_csi_lane_params csi_lane_params = {0};
csi_lane_params.csi_lane_mask = 0x1f;
csiphy_cfg_data csiphy_cfg_data = { .cfg.csi_lane_params = &csi_lane_params, .cfgtype = CSIPHY_RELEASE};
int err = cam_ioctl(s->csiphy_fd, VIDIOC_MSM_CSIPHY_IO_CFG, &csiphy_cfg_data, "release csiphy");
err = cam_ioctl(s->csiphy_fd, VIDIOC_MSM_CSIPHY_IO_CFG, &csiphy_cfg_data, "release csiphy");
// CSID: release csid
csid_cfg_data.cfgtype = CSID_RELEASE;
@@ -462,6 +781,12 @@ static void camera_open(CameraState *s, bool is_road_cam) {
actuator_cfg_data.cfgtype = CFG_ACTUATOR_POWERDOWN;
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator powerdown");
if (is_road_cam && s->device != DEVICE_LP3) {
// ois powerdown
ois_cfg_data.cfgtype = CFG_OIS_POWERDOWN;
err = cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois powerdown");
}
// reset isp
// struct msm_vfe_axi_halt_cmd halt_cmd = {
// .stop_camif = 1,
@@ -487,6 +812,8 @@ static void camera_open(CameraState *s, bool is_road_cam) {
// **** GO GO GO ****
LOG("******************** GO GO GO ************************");
s->eeprom = get_eeprom(s->eeprom_fd, &s->eeprom_size);
// CSID: init csid
csid_cfg_data.cfgtype = CSID_INIT;
cam_ioctl(s->csid_fd, VIDIOC_MSM_CSID_IO_CFG, &csid_cfg_data, "init csid");
@@ -516,6 +843,10 @@ static void camera_open(CameraState *s, bool is_road_cam) {
// SENSOR: send i2c configuration
if (s->camera_id == CAMERA_ID_IMX298) {
err = sensor_write_regs(s, init_array_imx298, std::size(init_array_imx298), MSM_CAMERA_I2C_BYTE_DATA);
} else if (s->camera_id == CAMERA_ID_S5K3P8SP) {
err = sensor_write_regs(s, init_array_s5k3p8sp, std::size(init_array_s5k3p8sp), MSM_CAMERA_I2C_WORD_DATA);
} else if (s->camera_id == CAMERA_ID_IMX179) {
err = sensor_write_regs(s, init_array_imx179, std::size(init_array_imx179), MSM_CAMERA_I2C_BYTE_DATA);
} else if (s->camera_id == CAMERA_ID_OV8865) {
err = sensor_write_regs(s, init_array_ov8865, std::size(init_array_ov8865), MSM_CAMERA_I2C_BYTE_DATA);
} else {
@@ -531,56 +862,137 @@ static void camera_open(CameraState *s, bool is_road_cam) {
actuator_cfg_data.cfgtype = CFG_ACTUATOR_INIT;
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator init");
struct msm_actuator_reg_params_t actuator_reg_params[] = {
{
.reg_write_type = MSM_ACTUATOR_WRITE_DAC,
// MSB here at address 3
.reg_addr = 3,
.data_type = 9,
.addr_type = 4,
},
};
// no OIS in LP3
if (s->device != DEVICE_LP3) {
// see sony_imx298_eeprom_format_afdata in libmmcamera_sony_imx298_eeprom.so
const float far_margin = -0.28;
uint16_t macro_dac = *(uint16_t*)(s->eeprom + 0x24);
s->infinity_dac = *(uint16_t*)(s->eeprom + 0x26);
LOG("macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac);
struct reg_settings_t actuator_init_settings[] = {
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=1, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // PD = power down
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=0, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // 0 = power up
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=2, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // RING = SAC mode
{ .reg_addr=6, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=64, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // 0x40 = SAC3 mode
{ .reg_addr=7, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=113, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 },
// 0x71 = DIV1 | DIV0 | SACT0 -- Tvib x 1/4 (quarter)
// SAC Tvib = 6.3 ms + 0.1 ms = 6.4 ms / 4 = 1.6 ms
// LSC 1-step = 252 + 1*4 = 256 ms / 4 = 64 ms
};
int dac_range = macro_dac - s->infinity_dac;
s->infinity_dac += far_margin * dac_range;
struct region_params_t region_params[] = {
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128}
};
LOG(" -> macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac);
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO;
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){
.actuator_params = {
.act_type = ACTUATOR_BIVCM,
.reg_tbl_size = 1,
.data_size = 10,
.init_setting_size = 5,
.i2c_freq_mode = I2C_STANDARD_MODE,
.i2c_addr = 24,
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR,
.i2c_data_type = MSM_ACTUATOR_WORD_DATA,
.reg_tbl_params = &actuator_reg_params[0],
.init_settings = &actuator_init_settings[0],
.park_lens = {.damping_step = 1023, .damping_delay = 14000, .hw_params = 11, .max_step = 20},
},
.af_tuning_params = {
.initial_code = INFINITY_DAC,
.pwd_step = 0,
.region_size = 1,
.total_steps = 238,
.region_params = &region_params[0],
},
};
struct msm_actuator_reg_params_t actuator_reg_params[] = {
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 240, .data_type = 10, .addr_type = 4},
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 241, .data_type = 10, .addr_type = 4},
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 242, .data_type = 10, .addr_type = 4},
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 243, .data_type = 10, .addr_type = 4},
};
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set info");
//...
struct reg_settings_t actuator_init_settings[1] = {0};
struct region_params_t region_params[] = {
{.step_bound = {512, 0,}, .code_per_step = 118, .qvalue = 128}
};
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO;
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){
.actuator_params = {
.act_type = ACTUATOR_VCM,
.reg_tbl_size = 4,
.data_size = 10,
.init_setting_size = 0,
.i2c_freq_mode = I2C_CUSTOM_MODE,
.i2c_addr = 28,
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR,
.i2c_data_type = MSM_ACTUATOR_BYTE_DATA,
.reg_tbl_params = &actuator_reg_params[0],
.init_settings = &actuator_init_settings[0],
.park_lens = {
.damping_step = 1023,
.damping_delay = 15000,
.hw_params = 58404,
.max_step = 20,
}
},
.af_tuning_params = {
.initial_code = (int16_t)s->infinity_dac,
.pwd_step = 0,
.region_size = 1,
.total_steps = 512,
.region_params = &region_params[0],
},
};
err = cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set info");
// power up ois
ois_cfg_data.cfgtype = CFG_OIS_POWERUP;
err = cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois powerup");
ois_cfg_data.cfgtype = CFG_OIS_INIT;
err = cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois init");
ois_cfg_data.cfgtype = CFG_OIS_CONTROL;
ois_cfg_data.cfg.set_info.ois_params = (struct msm_ois_params_t){
// .data_size = 26312,
.setting_size = 120,
.i2c_addr = 28,
.i2c_freq_mode = I2C_CUSTOM_MODE,
// .i2c_addr_type = wtf
// .i2c_data_type = wtf
.settings = &ois_init_settings[0],
};
cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois init settings");
} else {
// leeco actuator (DW9800W H-Bridge Driver IC)
// from sniff
s->infinity_dac = 364;
struct msm_actuator_reg_params_t actuator_reg_params[] = {
{
.reg_write_type = MSM_ACTUATOR_WRITE_DAC,
// MSB here at address 3
.reg_addr = 3,
.data_type = 9,
.addr_type = 4,
},
};
struct reg_settings_t actuator_init_settings[] = {
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=1, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // PD = power down
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=0, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // 0 = power up
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=2, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // RING = SAC mode
{ .reg_addr=6, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=64, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // 0x40 = SAC3 mode
{ .reg_addr=7, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=113, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 },
// 0x71 = DIV1 | DIV0 | SACT0 -- Tvib x 1/4 (quarter)
// SAC Tvib = 6.3 ms + 0.1 ms = 6.4 ms / 4 = 1.6 ms
// LSC 1-step = 252 + 1*4 = 256 ms / 4 = 64 ms
};
struct region_params_t region_params[] = {
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128}
};
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO;
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){
.actuator_params = {
.act_type = ACTUATOR_BIVCM,
.reg_tbl_size = 1,
.data_size = 10,
.init_setting_size = 5,
.i2c_freq_mode = I2C_STANDARD_MODE,
.i2c_addr = 24,
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR,
.i2c_data_type = MSM_ACTUATOR_WORD_DATA,
.reg_tbl_params = &actuator_reg_params[0],
.init_settings = &actuator_init_settings[0],
.park_lens = {.damping_step = 1023, .damping_delay = 14000, .hw_params = 11, .max_step = 20},
},
.af_tuning_params = {
.initial_code = (int16_t)s->infinity_dac,
.pwd_step = 0,
.region_size = 1,
.total_steps = 238,
.region_params = &region_params[0],
},
};
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set info");
}
}
if (s->camera_id == CAMERA_ID_IMX298) {
@@ -592,6 +1004,10 @@ static void camera_open(CameraState *s, bool is_road_cam) {
struct msm_camera_csiphy_params csiphy_params = {};
if (s->camera_id == CAMERA_ID_IMX298) {
csiphy_params = {.lane_cnt = 4, .settle_cnt = 14, .lane_mask = 0x1f, .csid_core = 0};
} else if (s->camera_id == CAMERA_ID_S5K3P8SP) {
csiphy_params = {.lane_cnt = 4, .settle_cnt = 24, .lane_mask = 0x1f, .csid_core = 0};
} else if (s->camera_id == CAMERA_ID_IMX179) {
csiphy_params = {.lane_cnt = 4, .settle_cnt = 11, .lane_mask = 0x1f, .csid_core = 2};
} else if (s->camera_id == CAMERA_ID_OV8865) {
// guess!
csiphy_params = {.lane_cnt = 4, .settle_cnt = 24, .lane_mask = 0x1f, .csid_core = 2};
@@ -722,24 +1138,47 @@ static void camera_open(CameraState *s, bool is_road_cam) {
cam_ioctl(s->isp_fd, VIDIOC_MSM_ISP_CFG_STREAM, &s->stream_cfg, "isp start stream");
}
static struct damping_params_t actuator_ringing_params = {
.damping_step = 1023,
.damping_delay = 15000,
.hw_params = 0x0000e422,
};
static void road_camera_start(CameraState *s) {
struct msm_actuator_cfg_data actuator_cfg_data = {0};
set_exposure(s, 1.0, 1.0);
int inf_step;
int err = sensor_write_regs(s, start_reg_array, std::size(start_reg_array), MSM_CAMERA_I2C_BYTE_DATA);
LOG("sensor start regs: %d", err);
int inf_step = 512 - INFINITY_DAC;
if (s->device != DEVICE_LP3) {
imx298_ois_calibration(s->ois_fd, s->eeprom);
inf_step = 332 - s->infinity_dac;
// initial guess
s->lens_true_pos = 400;
// initial guess
s->lens_true_pos = 300;
} else {
// default is OP3, this is for LeEco
actuator_ringing_params.damping_step = 1023;
actuator_ringing_params.damping_delay = 20000;
actuator_ringing_params.hw_params = 13;
// focus on infinity assuming phone is perpendicular
inf_step = 512 - s->infinity_dac;
// initial guess
s->lens_true_pos = 400;
}
// reset lens position
struct msm_actuator_cfg_data actuator_cfg_data = {};
memset(&actuator_cfg_data, 0, sizeof(actuator_cfg_data));
actuator_cfg_data.cfgtype = CFG_SET_POSITION;
actuator_cfg_data.cfg.setpos = (struct msm_actuator_set_position_t){
.number_of_steps = 1,
.hw_params = (uint32_t)7,
.pos = {INFINITY_DAC, 0},
.hw_params = (uint32_t)((s->device != DEVICE_LP3) ? 0x0000e424 : 7),
.pos = {s->infinity_dac, 0},
.delay = {0,}
};
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set pos");
@@ -767,16 +1206,11 @@ static void road_camera_start(CameraState *s) {
}
void actuator_move(CameraState *s, uint16_t target) {
int step = target - s->cur_lens_pos;
// LP3 moves only on even positions. TODO: use proper sensor params
// focus on infinity assuming phone is perpendicular
static struct damping_params_t actuator_ringing_params = {
.damping_step = 1023,
.damping_delay = 20000,
.hw_params = 13,
};
int step = (target - s->cur_lens_pos) / 2;
if (s->device == DEVICE_LP3) {
step /= 2;
}
int dest_step_pos = s->cur_step_pos + step;
dest_step_pos = std::clamp(dest_step_pos, 0, 255);
@@ -861,6 +1295,9 @@ static std::optional<float> get_accel_z(SubMaster *sm) {
}
static void do_autofocus(CameraState *s, SubMaster *sm) {
const int dac_down = s->device == DEVICE_LP3 ? LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN;
const int dac_up = s->device == DEVICE_LP3 ? LP3_AF_DAC_UP : OP3T_AF_DAC_UP;
float lens_true_pos = s->lens_true_pos.load();
if (!isnan(s->focus_err)) {
// learn lens_true_pos
@@ -873,8 +1310,8 @@ static void do_autofocus(CameraState *s, SubMaster *sm) {
}
const float sag = (s->last_sag_acc_z / 9.8) * 128;
// stay off the walls
lens_true_pos = std::clamp(lens_true_pos, float(LP3_AF_DAC_DOWN), float(LP3_AF_DAC_UP));
int target = std::clamp(lens_true_pos - sag, float(LP3_AF_DAC_DOWN), float(LP3_AF_DAC_UP));
lens_true_pos = std::clamp(lens_true_pos, float(dac_down), float(dac_up));
int target = std::clamp(lens_true_pos - sag, float(dac_down), float(dac_up));
s->lens_true_pos.store(lens_true_pos);
/*char debug[4096];
@@ -929,7 +1366,11 @@ void cameras_open(MultiCameraState *s) {
s->v4l_fd = open("/dev/video0", O_RDWR | O_NONBLOCK);
assert(s->v4l_fd >= 0);
s->ispif_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK);
if (s->device == DEVICE_LP3) {
s->ispif_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK);
} else {
s->ispif_fd = open("/dev/v4l-subdev16", O_RDWR | O_NONBLOCK);
}
assert(s->ispif_fd >= 0);
// ISPIF: stop
@@ -990,6 +1431,7 @@ static void camera_close(CameraState *s) {
cam_ioctl(s->isp_fd, VIDIOC_MSM_ISP_RELEASE_STREAM, &stream_release, "isp release stream");
}
}
free(s->eeprom);
}
const char* get_isp_event_name(uint32_t type) {
@@ -1060,19 +1502,24 @@ static void ops_thread(MultiCameraState *s) {
}
static void setup_self_recover(CameraState *c, const uint16_t *lapres, size_t lapres_size) {
const int dac_down = c->device == DEVICE_LP3 ? LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN;
const int dac_up = c->device == DEVICE_LP3 ? LP3_AF_DAC_UP : OP3T_AF_DAC_UP;
const int dac_m = c->device == DEVICE_LP3 ? LP3_AF_DAC_M : OP3T_AF_DAC_M;
const int dac_3sig = c->device == DEVICE_LP3 ? LP3_AF_DAC_3SIG : OP3T_AF_DAC_3SIG;
const float lens_true_pos = c->lens_true_pos.load();
int self_recover = c->self_recover.load();
if (self_recover < 2 && (lens_true_pos < (LP3_AF_DAC_DOWN + 1) || lens_true_pos > (LP3_AF_DAC_UP - 1)) && is_blur(lapres, lapres_size)) {
if (self_recover < 2 && (lens_true_pos < (dac_down + 1) || lens_true_pos > (dac_up - 1)) && is_blur(lapres, lapres_size)) {
// truly stuck, needs help
if (--self_recover < -FOCUS_RECOVER_PATIENCE) {
LOGD("road camera bad state detected. attempting recovery from %.1f, recover state is %d", lens_true_pos, self_recover);
// parity determined by which end is stuck at
self_recover = FOCUS_RECOVER_STEPS + (lens_true_pos < LP3_AF_DAC_M ? 1 : 0);
self_recover = FOCUS_RECOVER_STEPS + (lens_true_pos < dac_m ? 1 : 0);
}
} else if (self_recover < 2 && (lens_true_pos < (LP3_AF_DAC_M - LP3_AF_DAC_3SIG) || lens_true_pos > (LP3_AF_DAC_M + LP3_AF_DAC_3SIG))) {
} else if (self_recover < 2 && (lens_true_pos < (dac_m - dac_3sig) || lens_true_pos > (dac_m + dac_3sig))) {
// in suboptimal position with high prob, but may still recover by itself
if (--self_recover < -(FOCUS_RECOVER_PATIENCE * 3)) {
self_recover = FOCUS_RECOVER_STEPS / 2 + (lens_true_pos < LP3_AF_DAC_M ? 1 : 0);
self_recover = FOCUS_RECOVER_STEPS / 2 + (lens_true_pos < dac_m ? 1 : 0);
}
} else if (self_recover < 0) {
self_recover += 1; // reset if fine
+15 -1
View File
@@ -19,12 +19,20 @@
#define FRAME_BUF_COUNT 4
#define METADATA_BUF_COUNT 4
#define DEVICE_OP3 0
#define DEVICE_OP3T 1
#define DEVICE_LP3 2
#define NUM_FOCUS 8
#define LP3_AF_DAC_DOWN 366
#define LP3_AF_DAC_UP 634
#define LP3_AF_DAC_M 440
#define LP3_AF_DAC_3SIG 52
#define OP3T_AF_DAC_DOWN 224
#define OP3T_AF_DAC_UP 456
#define OP3T_AF_DAC_M 300
#define OP3T_AF_DAC_3SIG 96
#define FOCUS_RECOVER_PATIENCE 50 // 2.5 seconds of complete blur
#define FOCUS_RECOVER_STEPS 240 // 6 seconds
@@ -43,6 +51,7 @@ typedef struct StreamState {
typedef struct CameraState {
int camera_num;
int camera_id;
int device;
int fps;
CameraInfo ci;
@@ -71,7 +80,7 @@ typedef struct CameraState {
camera_apply_exposure_func apply_exposure;
// rear camera only,used for focusing
unique_fd actuator_fd;
unique_fd actuator_fd, ois_fd, eeprom_fd;
std::atomic<float> focus_err;
std::atomic<float> last_sag_acc_z;
std::atomic<float> lens_true_pos;
@@ -80,10 +89,15 @@ typedef struct CameraState {
uint16_t cur_lens_pos;
int16_t focus[NUM_FOCUS];
uint8_t confidence[NUM_FOCUS];
uint16_t infinity_dac;
size_t eeprom_size;
uint8_t *eeprom;
} CameraState;
typedef struct MultiCameraState {
int device;
unique_fd ispif_fd;
unique_fd msmcfg_fd;
unique_fd v4l_fd;
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -21,6 +21,8 @@
#include "selfdrive/camerad/cameras/camera_qcom2.h"
#elif WEBCAM
#include "selfdrive/camerad/cameras/camera_webcam.h"
#elif MIPI
#include "selfdrive/camerad/cameras/camera_mipi.h"
#else
#include "selfdrive/camerad/cameras/camera_frame_stream.h"
#endif
@@ -47,7 +49,7 @@ int main(int argc, char *argv[]) {
set_realtime_priority(53);
if (Hardware::EON()) {
set_core_affinity(2);
} else if (Hardware::TICI()) {
} else if (Hardware::TICI() || Hardware::JETSON()) {
set_core_affinity(6);
}
+2 -2
View File
@@ -10,7 +10,7 @@ from typing import List
import cereal.messaging as messaging
from common.params import Params
from common.realtime import DT_MDL
from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, tici_f_frame_size
from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, leon_d_frame_size, tici_f_frame_size
from selfdrive.hardware import TICI
from selfdrive.controls.lib.alertmanager import set_offroad_alert
from selfdrive.manager.process_config import managed_processes
@@ -39,7 +39,7 @@ def rois_in_focus(lapres: List[float]) -> float:
def get_snapshots(frame="roadCameraState", front_frame="driverCameraState", focus_perc_threshold=0.):
frame_sizes = [eon_f_frame_size, eon_d_frame_size, tici_f_frame_size]
frame_sizes = [eon_f_frame_size, eon_d_frame_size, leon_d_frame_size, tici_f_frame_size]
frame_sizes = {w * h: (w, h) for (w, h) in frame_sizes}
sockets = []
+26 -10
View File
@@ -1,5 +1,5 @@
import os
from common.params import Params
from common.params import Params, put_nonblocking
from common.basedir import BASEDIR
from selfdrive.version import comma_remote, tested_branch
from selfdrive.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars
@@ -14,7 +14,7 @@ EventName = car.CarEvent.EventName
def get_startup_event(car_recognized, controller_available, fuzzy_fingerprint, fw_seen):
if comma_remote and tested_branch:
if True:
event = EventName.startup
else:
event = EventName.startupMaster
@@ -87,7 +87,8 @@ def only_toyota_left(candidate_cars):
# **** for use live only ****
def fingerprint(logcan, sendcan):
fixed_fingerprint = os.environ.get('FINGERPRINT', "")
dp_car_assigned = Params().get('dp_car_assigned', encoding='utf8')
fixed_fingerprint = os.environ.get('FINGERPRINT', "" if dp_car_assigned is None else dp_car_assigned)
skip_fw_query = os.environ.get('SKIP_FW_QUERY', False)
if not fixed_fingerprint and not skip_fw_query:
@@ -181,11 +182,26 @@ def get_car(logcan, sendcan):
cloudlog.warning("car doesn't match any fingerprints: %r", fingerprints)
candidate = "mock"
CarInterface, CarController, CarState = interfaces[candidate]
car_params = CarInterface.get_params(candidate, fingerprints, car_fw)
car_params.carVin = vin
car_params.carFw = car_fw
car_params.fingerprintSource = source
car_params.fuzzyFingerprint = not exact_match
try:
CarInterface, CarController, CarState = interfaces[candidate]
car_params = CarInterface.get_params(candidate, fingerprints, car_fw)
candidate_changed = Params().get('dp_last_candidate') != candidate
put_nonblocking("dp_sr_stock", str(car_params.steerRatio))
# update last candidate
if candidate_changed:
put_nonblocking('dp_last_candidate', candidate)
# update steering_ratio init val
dp_sr_custom = Params().get("dp_sr_custom", encoding='utf8')
if dp_sr_custom == '' or candidate_changed or (dp_sr_custom != '' and float(dp_sr_custom) <= 9.99):
put_nonblocking("dp_sr_custom", str(car_params.steerRatio))
car_params.carVin = vin
car_params.carFw = car_fw
car_params.fingerprintSource = source
car_params.fuzzyFingerprint = not exact_match
return CarInterface(car_params, CarController, CarState), car_params
return CarInterface(car_params, CarController, CarState), car_params
except KeyError:
put_nonblocking("dp_car_assigned", '')
put_nonblocking("dp_sr_custom", '9.99')
put_nonblocking("dp_sr_stock", '9.99')
return None, None
+18 -1
View File
@@ -3,9 +3,14 @@ from selfdrive.car.chrysler.chryslercan import create_lkas_hud, create_lkas_comm
create_wheel_buttons
from selfdrive.car.chrysler.values import CAR, CarControllerParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.apply_steer_last = 0
self.ccframe = 0
self.prev_frame = -1
@@ -16,7 +21,7 @@ class CarController():
self.packer = CANPacker(dbc_name)
def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert):
def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert, dragonconf):
# this seems needed to avoid steering faults and to force the sync with the EPS counter
frame = CS.lkas_counter
if self.prev_frame == frame:
@@ -40,6 +45,18 @@ class CarController():
if not lkas_active:
apply_steer = 0
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.apply_steer_last = apply_steer
can_sends = []
+10 -3
View File
@@ -3,7 +3,7 @@ from cereal import car
from selfdrive.car.chrysler.values import CAR
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
@staticmethod
@@ -15,6 +15,7 @@ class CarInterface(CarInterfaceBase):
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
ret.carName = "chrysler"
ret.safetyModel = car.CarParams.SafetyModel.chrysler
ret.lateralTuning.init('pid')
# Chrysler port is a community feature, since we don't own one to test
ret.communityFeature = True
@@ -53,15 +54,21 @@ class CarInterface(CarInterfaceBase):
ret.enableBsm = 720 in fingerprint[0]
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
# ******************* do can recv *******************
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
@@ -89,6 +96,6 @@ class CarInterface(CarInterfaceBase):
if (self.CS.frame == -1):
return [] # if we haven't seen a frame 220, then do not update.
can_sends = self.CC.update(c.enabled, self.CS, c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert)
can_sends = self.CC.update(c.enabled, self.CS, c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert, self.dragonconf)
return can_sends
+19 -1
View File
@@ -3,6 +3,7 @@ from cereal import car
from selfdrive.car import make_can_msg
from selfdrive.car.ford.fordcan import create_steer_command, create_lkas_ui, spam_cancel_button
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
MAX_STEER_DELTA = 1
@@ -10,6 +11,10 @@ TOGGLE_DEBUG = False
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.packer = CANPacker(dbc_name)
self.enable_camera = CP.enableCamera
self.enabled_last = False
@@ -19,13 +24,26 @@ class CarController():
self.steer_alert_last = False
self.lkas_action = 0
def update(self, enabled, CS, frame, actuators, visual_alert, pcm_cancel):
def update(self, enabled, CS, frame, actuators, visual_alert, pcm_cancel, dragonconf):
can_sends = []
steer_alert = visual_alert == car.CarControl.HUDControl.VisualAlert.steerRequired
apply_steer = actuators.steer
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
if self.enable_camera:
if pcm_cancel:
+3
View File
@@ -8,6 +8,9 @@ from selfdrive.car.ford.values import DBC
WHEEL_RADIUS = 0.33
class CarState(CarStateBase):
def __init__(self, CP):
super().__init__(CP)
def update(self, cp):
ret = car.CarState.new_message()
ret.wheelSpeeds.rr = cp.vl["WheelSpeed_CG1"]["WhlRr_W_Meas"] * WHEEL_RADIUS
+10 -3
View File
@@ -5,6 +5,7 @@ from selfdrive.config import Conversions as CV
from selfdrive.car.ford.values import MAX_ANGLE
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
@@ -17,6 +18,7 @@ class CarInterface(CarInterfaceBase):
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
ret.carName = "ford"
ret.lateralTuning.init('pid')
ret.safetyModel = car.CarParams.SafetyModel.ford
ret.dashcamOnly = True
@@ -46,15 +48,20 @@ class CarInterface(CarInterfaceBase):
ret.enableCamera = True
cloudlog.warning("ECU Camera Simulated: %r", ret.enableCamera)
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
# ******************* do can recv *******************
self.cp.update_strings(can_strings)
ret = self.CS.update(self.cp)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid
# events
@@ -73,7 +80,7 @@ class CarInterface(CarInterfaceBase):
def apply(self, c):
can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators,
c.hudControl.visualAlert, c.cruiseControl.cancel)
c.hudControl.visualAlert, c.cruiseControl.cancel, self.dragonconf)
self.frame += 1
return can_sends
+18 -1
View File
@@ -6,12 +6,17 @@ from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.gm import gmcan
from selfdrive.car.gm.values import DBC, CanBus, CarControllerParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.start_time = 0.
self.apply_steer_last = 0
self.lka_icon_status_last = (False, False)
@@ -24,7 +29,7 @@ class CarController():
self.packer_ch = CANPacker(DBC[CP.carFingerprint]['chassis'])
def update(self, enabled, CS, frame, actuators,
hud_v_cruise, hud_show_lanes, hud_show_car, hud_alert):
hud_v_cruise, hud_show_lanes, hud_show_car, hud_alert, dragonconf):
P = self.params
@@ -41,6 +46,18 @@ class CarController():
else:
apply_steer = 0
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.apply_steer_last = apply_steer
idx = (frame // P.STEER_STEP) % 4
+11 -3
View File
@@ -5,6 +5,7 @@ from selfdrive.car.gm.values import CAR, CruiseButtons, \
AccState
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
ButtonType = car.CarState.ButtonEvent.Type
EventName = car.CarEvent.EventName
@@ -19,6 +20,8 @@ class CarInterface(CarInterfaceBase):
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
ret.carName = "gm"
# dp
ret.lateralTuning.init('pid')
ret.safetyModel = car.CarParams.SafetyModel.gm
ret.enableCruise = False # stock cruise control is kept off
@@ -112,14 +115,19 @@ class CarInterface(CarInterfaceBase):
ret.steerLimitTimer = 0.4
ret.radarTimeStep = 0.0667 # GM radar runs at 15Hz instead of standard 20Hz
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
self.cp.update_strings(can_strings)
ret = self.CS.update(self.cp)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
@@ -188,7 +196,7 @@ class CarInterface(CarInterfaceBase):
can_sends = self.CC.update(enabled, self.CS, self.frame,
c.actuators,
hud_v_cruise, c.hudControl.lanesVisible,
c.hudControl.leadVisible, c.hudControl.visualAlert)
c.hudControl.leadVisible, c.hudControl.visualAlert, self.dragonconf)
self.frame += 1
return can_sends
+61 -9
View File
@@ -7,6 +7,7 @@ from selfdrive.car import create_gas_command
from selfdrive.car.honda import hondacan
from selfdrive.car.honda.values import CruiseButtons, CAR, VISUAL_HUD, HONDA_BOSCH, CarControllerParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
@@ -72,11 +73,33 @@ def process_hud_alert(hud_alert):
HUDData = namedtuple("HUDData",
["pcm_accel", "v_cruise", "car",
"lanes", "fcw", "acc_alert", "steer_required"])
"lanes", "fcw", "acc_alert", "steer_required", "dashed_lanes"])
class CarController():
def rough_speed(self, lead_distance):
if self.prev_lead_distance != lead_distance:
self.lead_distance_counter_prev = self.lead_distance_counter
self.rough_lead_speed += 0.3334 * (
(lead_distance - self.prev_lead_distance) / self.lead_distance_counter_prev - self.rough_lead_speed)
self.lead_distance_counter = 0.0
elif self.lead_distance_counter >= self.lead_distance_counter_prev:
self.rough_lead_speed = (self.lead_distance_counter * self.rough_lead_speed) / (self.lead_distance_counter + 1.0)
self.lead_distance_counter += 1.0
self.prev_lead_distance = lead_distance
return self.rough_lead_speed
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.prev_lead_distance = 0.0
self.stopped_lead_distance = 0.0
self.lead_distance_counter = 1
self.lead_distance_counter_prev = 1
self.rough_lead_speed = 0.0
self.braking = False
self.brake_steady = 0.
self.brake_last = 0.
@@ -89,7 +112,7 @@ class CarController():
def update(self, enabled, CS, frame, actuators,
pcm_speed, pcm_override, pcm_cancel_cmd, pcm_accel,
hud_v_cruise, hud_show_lanes, hud_show_car, hud_alert):
hud_v_cruise, hud_show_lanes, dragonconf, hud_show_car, hud_alert):
P = self.params
@@ -109,7 +132,7 @@ class CarController():
self.brake_last = rate_limit(brake, self.brake_last, -2., DT_CTRL)
# vehicle hud display, wait for one update from 10Hz 0x304 msg
if hud_show_lanes:
if hud_show_lanes and CS.lkMode:
hud_lanes = 1
else:
hud_lanes = 0
@@ -125,25 +148,37 @@ class CarController():
fcw_display, steer_required, acc_alert = process_hud_alert(hud_alert)
hud = HUDData(int(pcm_accel), int(round(hud_v_cruise)), hud_car,
hud_lanes, fcw_display, acc_alert, steer_required)
hud_lanes, fcw_display, acc_alert, steer_required, CS.lkMode)
# **** process the car messages ****
# steer torque is converted back to CAN reference (positive when steering right)
apply_steer = int(interp(-actuators.steer * P.STEER_MAX, P.STEER_LOOKUP_BP, P.STEER_LOOKUP_V))
lkas_active = enabled and not CS.steer_not_allowed
lkas_active = enabled and not CS.steer_not_allowed and CS.lkMode
# Send CAN commands.
can_sends = []
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
# Send steering command.
idx = frame % 4
can_sends.append(hondacan.create_steering_control(self.packer, apply_steer,
lkas_active, CS.CP.carFingerprint, idx, CS.CP.openpilotLongitudinalControl))
# Send dashboard UI commands.
if (frame % 10) == 0:
if not dragonconf.dpAtl and (frame % 10) == 0:
idx = (frame//10) % 4
can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, CS.is_metric, idx, CS.CP.openpilotLongitudinalControl, CS.stock_hud))
@@ -151,18 +186,35 @@ class CarController():
if (frame % 2) == 0:
idx = frame // 2
can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, CS.CP.carFingerprint, idx))
if dragonconf.dpAtl:
pass
# If using stock ACC, spam cancel command to kill gas when OP disengages.
if pcm_cancel_cmd:
elif not dragonconf.dpAllowGas and pcm_cancel_cmd:
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.CANCEL, idx, CS.CP.carFingerprint))
elif CS.out.cruiseState.standstill:
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, idx, CS.CP.carFingerprint))
if CS.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.INSIGHT):
rough_lead_speed = self.rough_speed(CS.lead_distance)
if CS.lead_distance > (self.stopped_lead_distance + 15.0) or rough_lead_speed > 0.1:
self.stopped_lead_distance = 0.0
can_sends.append(
hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, idx, CS.CP.carFingerprint))
elif CS.CP.carFingerprint in (CAR.CIVIC_BOSCH, CAR.CRV_HYBRID):
if CS.hud_lead == 1:
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, idx, CS.CP.carFingerprint))
else:
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, idx, CS.CP.carFingerprint))
else:
self.stopped_lead_distance = CS.lead_distance
self.prev_lead_distance = CS.lead_distance
else:
# Send gas and brake commands.
if (frame % 2) == 0:
idx = frame // 2
ts = frame * DT_CTRL
if CS.CP.carFingerprint in HONDA_BOSCH:
if dragonconf.dpAtl:
pass
elif CS.CP.carFingerprint in HONDA_BOSCH:
pass # TODO: implement
else:
apply_gas = clip(actuators.gas, 0., 1.)
+34 -8
View File
@@ -50,6 +50,7 @@ def get_can_signals(CP, gearbox_msg="GEARBOX"):
("PEDAL_GAS", "POWERTRAIN_DATA", 0),
("CRUISE_SETTING", "SCM_BUTTONS", 0),
("ACC_STATUS", "POWERTRAIN_DATA", 0),
("HUD_LEAD", "ACC_HUD", 0),
]
checks = [
@@ -120,12 +121,14 @@ def get_can_signals(CP, gearbox_msg="GEARBOX"):
checks += [("CRUISE_PARAMS", 10)]
else:
checks += [("CRUISE_PARAMS", 50)]
if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G):
if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.INSIGHT):
signals += [("DRIVERS_DOOR_OPEN", "SCM_FEEDBACK", 1),
("LEAD_DISTANCE", "RADAR_HUD", 0)]
elif CP.carFingerprint in (CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.ACURA_RDX_3G):
signals += [("DRIVERS_DOOR_OPEN", "SCM_FEEDBACK", 1)]
elif CP.carFingerprint == CAR.ODYSSEY_CHN:
signals += [("DRIVERS_DOOR_OPEN", "SCM_BUTTONS", 1)]
elif CP.carFingerprint == CAR.HRV:
elif CP.carFingerprint in [CAR.HRV, CAR.JADE]:
signals += [("DRIVERS_DOOR_OPEN", "SCM_BUTTONS", 1),
("WHEELS_MOVING", "STANDSTILL", 1)]
else:
@@ -164,7 +167,7 @@ def get_can_signals(CP, gearbox_msg="GEARBOX"):
checks += [
("GAS_PEDAL_2", 100),
]
elif CP.carFingerprint == CAR.HRV:
elif CP.carFingerprint in [CAR.HRV, CAR.JADE]:
signals += [("CAR_GAS", "GAS_PEDAL", 0),
("MAIN_ON", "SCM_BUTTONS", 0),
("BRAKE_HOLD_ACTIVE", "VSA_STATUS", 0)]
@@ -213,6 +216,11 @@ class CarState(CarStateBase):
self.v_cruise_pcm_prev = 0
self.cruise_mode = 0
#dp
self.lkMode = True
self.hud_lead = 0
self.lead_distance = 0.
def update(self, cp, cp_cam, cp_body):
ret = car.CarState.new_message()
@@ -226,13 +234,17 @@ class CarState(CarStateBase):
# ******************* parse out can *******************
# TODO: find wheels moving bit in dbc
if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G):
if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.INSIGHT):
ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 0.1
ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"])
self.lead_distance = cp.vl["RADAR_HUD"]["LEAD_DISTANCE"]
elif self.CP.carFingerprint in (CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.ACURA_RDX_3G):
ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 0.1
ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"])
elif self.CP.carFingerprint == CAR.ODYSSEY_CHN:
ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 0.1
ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"])
elif self.CP.carFingerprint == CAR.HRV:
elif self.CP.carFingerprint in [CAR.HRV, CAR.JADE]:
ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"])
else:
ret.standstill = not cp.vl["STANDSTILL"]["WHEELS_MOVING"]
@@ -268,6 +280,14 @@ class CarState(CarStateBase):
ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE"]
ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE_RATE"]
# dp - when user presses LKAS button on steering wheel
if self.cruise_setting == 1:
if cp.vl["SCM_BUTTONS"]["CRUISE_SETTING"] == 0:
if self.lkMode:
self.lkMode = False
else:
self.lkMode = True
self.cruise_setting = cp.vl["SCM_BUTTONS"]["CRUISE_SETTING"]
self.cruise_buttons = cp.vl["SCM_BUTTONS"]["CRUISE_BUTTONS"]
@@ -291,7 +311,7 @@ class CarState(CarStateBase):
self.pedal_gas = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"]
# crv doesn't include cruise control
if self.CP.carFingerprint in (CAR.CRV, CAR.CRV_EU, CAR.HRV, CAR.ODYSSEY, CAR.ACURA_RDX, CAR.RIDGELINE, CAR.PILOT_2019, CAR.ODYSSEY_CHN):
if self.CP.carFingerprint in (CAR.CRV, CAR.CRV_EU, CAR.HRV, CAR.ODYSSEY, CAR.ACURA_RDX, CAR.RIDGELINE, CAR.PILOT_2019, CAR.ODYSSEY_CHN, CAR.JADE):
ret.gas = self.pedal_gas / 256.
else:
ret.gas = cp.vl["GAS_PEDAL_2"]["CAR_GAS"] / 256.
@@ -338,13 +358,19 @@ class CarState(CarStateBase):
ret.cruiseState.available = bool(main_on)
ret.cruiseState.nonAdaptive = self.cruise_mode != 0
# afa feature
self.hud_lead = cp.vl["ACC_HUD"]['HUD_LEAD']
# Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models
if self.CP.carFingerprint in (CAR.PILOT, CAR.PILOT_2019, CAR.RIDGELINE):
if ret.brake > 0.05:
ret.brakePressed = True
# TODO: discover the CAN msg that has the imperial unit bit for all other cars
self.is_metric = not cp.vl["HUD_SETTING"]["IMPERIAL_UNIT"] if self.CP.carFingerprint in (CAR.CIVIC) else False
if self.CP.carFingerprint in [CAR.JADE]:
self.is_metric = True
else:
self.is_metric = not cp.vl["HUD_SETTING"]["IMPERIAL_UNIT"] if self.CP.carFingerprint in (CAR.CIVIC) else False
if self.CP.carFingerprint in HONDA_BOSCH:
ret.stockAeb = bool(cp.vl["ACC_CONTROL"]["AEB_STATUS"] and cp.vl["ACC_CONTROL"]["ACCEL_COMMAND"] < -1e-5)
+51 -5
View File
@@ -8,6 +8,8 @@ from selfdrive.car.honda.values import CruiseButtons, CAR, HONDA_BOSCH, HONDA_BO
from selfdrive.car import STD_CARGO_KG, CivicParams, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.controls.lib.longitudinal_planner import _A_CRUISE_MAX_V_FOLLOWING
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
from common.params import Params
A_ACC_MAX = max(_A_CRUISE_MAX_V_FOLLOWING)
@@ -119,6 +121,7 @@ class CarInterface(CarInterfaceBase):
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=[]): # pylint: disable=dangerous-default-value
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
ret.carName = "honda"
ret.lateralTuning.init('pid')
if candidate in HONDA_BOSCH:
ret.safetyModel = car.CarParams.SafetyModel.hondaBoschHarness
@@ -403,6 +406,20 @@ class CarInterface(CarInterfaceBase):
ret.longitudinalTuning.kiBP = [0., 35.]
ret.longitudinalTuning.kiV = [0.18, 0.12]
elif candidate == CAR.JADE:
stop_and_go = False
ret.mass = 1557. + STD_CARGO_KG
ret.wheelbase = 2.76
ret.centerToFront = ret.wheelbase * 0.41
ret.steerRatio = 15.2
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]]
tire_stiffness_factor = 0.5
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.025]]
ret.longitudinalTuning.kpBP = [0., 5., 35.]
ret.longitudinalTuning.kpV = [1.2, 0.8, 0.5]
ret.longitudinalTuning.kiBP = [0., 35.]
ret.longitudinalTuning.kiV = [0.18, 0.12]
else:
raise ValueError("unsupported car %s" % candidate)
@@ -413,7 +430,10 @@ class CarInterface(CarInterfaceBase):
# min speed to enable ACC. if car can do stop and go, then set enabling speed
# to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not
# conflict with PCM acc
ret.minEnableSpeed = -1. if (stop_and_go or ret.enableGasInterceptor) else 25.5 * CV.MPH_TO_MS
if candidate in [CAR.JADE]:
ret.minEnableSpeed = 30 * CV.KPH_TO_MS
else:
ret.minEnableSpeed = -1. if (stop_and_go or ret.enableGasInterceptor) else 25.5 * CV.MPH_TO_MS
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
@@ -436,10 +456,30 @@ class CarInterface(CarInterfaceBase):
ret.steerRateCost = 0.5
ret.steerLimitTimer = 0.8
# dp
if Params().get('dp_honda_eps_mod') == b'1':
if candidate == CAR.CIVIC:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560, 8000], [0, 2560, 3840]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.1]] #tuned by Comma
elif candidate in (CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL):
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2564, 8000], [0, 2564, 3840]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.09]] #2.5 default mod #Tuned by TMG
elif candidate in (CAR.ACCORD, CAR.ACCORDH):
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.09]]
elif candidate == CAR.CRV_5G:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560, 10000], [0, 2560, 3840]] #tuned by Titanminer (8000)
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.21], [0.07]]
elif candidate == CAR.CRV_HYBRID:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0x0, 0xB5, 0x161, 0x2D6, 0x4C0, 0x70D, 0xC42, 0x1058, 0x2C00], [0x0, 0x160, 0x1F0, 0x2E0, 0x378, 0x4A0, 0x5F0, 0x804, 0xF00]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.21], [0.07]] #still needs to finish tuning for the new car
ret.lateralTuning.pid.kf = 0.00004
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
# ******************* do can recv *******************
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
@@ -447,7 +487,10 @@ class CarInterface(CarInterfaceBase):
self.cp_body.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam, self.cp_body)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.lkMode = self.CS.lkMode
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid and (self.cp_body is None or self.cp_body.can_valid)
ret.yawRate = self.VM.yaw_rate(ret.steeringAngleDeg * CV.DEG_TO_RAD, ret.vEgo)
@@ -489,6 +532,8 @@ class CarInterface(CarInterfaceBase):
# events
events = self.create_common_events(ret, pcm_enable=self.CP.enableCruise)
if not self.CS.lkMode or (dragonconf.dpAtl and ret.vEgo <= self.CP.minEnableSpeed):
events.add(EventName.manualSteeringRequired)
if self.CS.brake_error:
events.add(EventName.brakeUnavailable)
if self.CS.brake_hold and self.CS.CP.openpilotLongitudinalControl:
@@ -505,8 +550,8 @@ class CarInterface(CarInterfaceBase):
and (c.actuators.brake <= 0. or not self.CP.openpilotLongitudinalControl):
# non loud alert if cruise disables below 25mph as expected (+ a little margin)
if ret.vEgo < self.CP.minEnableSpeed + 2.:
events.add(EventName.speedTooLow)
else:
# events.add(EventName.speedTooLow)
# else:
events.add(EventName.cruiseDisabled)
if self.CS.CP.minEnableSpeed > 0 and ret.vEgo < 0.001:
events.add(EventName.manualRestart)
@@ -546,6 +591,7 @@ class CarInterface(CarInterfaceBase):
pcm_accel,
hud_v_cruise,
c.hudControl.lanesVisible,
self.dragonconf,
hud_show_car=c.hudControl.leadVisible,
hud_alert=c.hudControl.visualAlert)
+9
View File
@@ -54,6 +54,7 @@ class CAR:
PILOT_2019 = "HONDA PILOT 2019"
RIDGELINE = "HONDA RIDGELINE 2017"
INSIGHT = "HONDA INSIGHT 2019"
JADE = "HONDA JADE 2017"
# diag message that in some Nidec cars only appear with 1s freq if VIN query is performed
DIAG_MSGS = {1600: 5, 1601: 8}
@@ -112,6 +113,9 @@ FINGERPRINTS = {
{
57: 3, 145: 8, 228: 5, 229: 4, 308: 5, 316: 8, 339: 7, 342: 6, 344: 8, 380: 8, 392: 6, 399: 7, 411: 5, 419: 8, 420: 8, 422: 8, 425: 8, 426: 8, 427: 3, 432: 7, 464: 8, 476: 4, 490: 8, 506: 8, 512: 6, 513: 6, 542: 7, 545: 5, 546: 3, 597: 8, 660: 8, 773: 7, 777: 8, 780: 8, 795: 8, 800: 8, 804: 8, 808: 8, 817: 4, 819: 7, 821: 5, 829: 5, 871: 8, 881: 8, 882: 2, 884: 7, 891: 8, 892: 8, 923: 2, 927: 8, 929: 8, 963: 8, 965: 8, 966: 8, 967: 8, 983: 8, 985: 3, 1027: 5, 1029: 8, 1039: 8, 1064: 7, 1088: 8, 1089: 8, 1092: 1, 1108: 8, 1125: 8, 1296: 8, 1424: 5, 1445: 8, 1600: 5, 1601: 8, 1612: 5, 1613: 5, 1616: 5, 1617: 8, 1618: 5, 1623: 5, 1668: 5
}],
CAR.JADE: [{
57: 3, 145: 8, 228: 5, 304: 8, 342: 6, 344: 8, 380: 8, 398: 3, 399: 7, 401: 8, 420: 8, 422: 8, 428: 8, 432: 7, 464: 8, 487: 4, 490: 8, 506: 8, 507: 1, 597: 8, 660: 8, 661: 4, 773: 7, 777: 8, 780: 8, 804: 8, 808: 8, 829: 5, 862: 8, 884: 7, 892: 8, 923: 2, 929: 4, 1057: 5, 1365: 5, 1424: 5, 1600: 5, 1601: 8
}],
}
# add DIAG_MSGS to fingerprints
@@ -770,6 +774,8 @@ FW_VERSIONS = {
b'39990-TPA-G030\x00\x00',
b'39990-TPG-A020\x00\x00',
b'39990-TMA-H020\x00\x00',
b'39990-TMA,H020\x00\x00',
b'39990,TMA-H020\x00\x00',
],
(Ecu.gateway, 0x18daeff1, None): [
b'38897-TMA-H110\x00\x00',
@@ -1248,6 +1254,7 @@ DBC = {
CAR.PILOT_2019: dbc_dict('honda_pilot_touring_2017_can_generated', 'acura_ilx_2016_nidec'),
CAR.RIDGELINE: dbc_dict('honda_ridgeline_black_edition_2017_can_generated', 'acura_ilx_2016_nidec'),
CAR.INSIGHT: dbc_dict('honda_insight_ex_2019_can_generated', None),
CAR.JADE: dbc_dict('honda_hrv_touring_2019_can_generated', 'acura_ilx_2016_nidec'),
}
STEER_THRESHOLD = {
@@ -1271,6 +1278,7 @@ STEER_THRESHOLD = {
CAR.PILOT_2019: 1200,
CAR.RIDGELINE: 1200,
CAR.INSIGHT: 1200,
CAR.JADE: 1200,
}
SPEED_FACTOR = {
@@ -1294,6 +1302,7 @@ SPEED_FACTOR = {
CAR.PILOT_2019: 1.,
CAR.RIDGELINE: 1.,
CAR.INSIGHT: 1.,
CAR.JADE: 1.025,
}
HONDA_BOSCH = set([CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G])
+21 -2
View File
@@ -4,6 +4,8 @@ from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.hyundai.hyundaican import create_lkas11, create_clu11, create_lfahda_mfc
from selfdrive.car.hyundai.values import Buttons, CarControllerParams, CAR
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
from common.params import Params
VisualAlert = car.CarControl.HUDControl.VisualAlert
@@ -34,6 +36,11 @@ def process_hud_alert(enabled, fingerprint, visual_alert, left_lane,
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.dp_hkg_smart_mdps = Params().get('dp_hkg_smart_mdps') == b'1'
self.p = CarControllerParams(CP)
self.packer = CANPacker(dbc_name)
@@ -43,7 +50,7 @@ class CarController():
self.last_resume_frame = 0
def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert,
left_lane, right_lane, left_lane_depart, right_lane_depart):
left_lane, right_lane, left_lane_depart, right_lane_depart, dragonconf):
# Steering Torque
new_steer = int(round(actuators.steer * self.p.STEER_MAX))
apply_steer = apply_std_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.p)
@@ -53,12 +60,24 @@ class CarController():
lkas_active = enabled and not CS.out.steerWarning
# fix for Genesis hard fault at low speed
if CS.out.vEgo < 16.7 and self.car_fingerprint == CAR.HYUNDAI_GENESIS:
if not self.dp_hkg_smart_mdps and CS.out.vEgo < 16.7 and self.car_fingerprint == CAR.HYUNDAI_GENESIS:
lkas_active = False
if not lkas_active:
apply_steer = 0
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.apply_steer_last = apply_steer
sys_warning, sys_state, left_lane_warning, right_lane_warning = \
+33 -9
View File
@@ -4,6 +4,8 @@ from selfdrive.config import Conversions as CV
from selfdrive.car.hyundai.values import CAR
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
from common.params import Params
class CarInterface(CarInterfaceBase):
@@ -18,6 +20,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "hyundai"
ret.safetyModel = car.CarParams.SafetyModel.hyundai
ret.radarOffCan = True
ret.lateralTuning.init('pid')
# Most Hyundai car ports are community features for now
ret.communityFeature = candidate not in [CAR.SONATA, CAR.PALISADE]
@@ -212,6 +215,15 @@ class CarInterface(CarInterfaceBase):
ret.steerRatio = 16.5
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.01]]
ret.lateralTuning.init('indi')
ret.lateralTuning.indi.innerLoopGainV = [3.5]
ret.lateralTuning.indi.innerLoopGainBP = [0.]
ret.lateralTuning.indi.outerLoopGainV = [2.0]
ret.lateralTuning.indi.outerLoopGainBP = [0.]
ret.lateralTuning.indi.timeConstantV = [1.4]
ret.lateralTuning.indi.actuatorEffectivenessV = [2.3]
ret.lateralTuning.indi.actuatorEffectivenessBP = [0.]
ret.minSteerSpeed = 60 * CV.KPH_TO_MS
elif candidate == CAR.GENESIS_G90:
ret.mass = 2200
ret.wheelbase = 3.15
@@ -239,26 +251,38 @@ class CarInterface(CarInterfaceBase):
ret.enableCamera = True
ret.enableBsm = 0x58b in fingerprint[0]
# dp
if Params().get('dp_hkg_smart_mdps') == b'1':
ret.minSteerSpeed = 0.
ret = common_interface_get_params_lqr(ret)
return ret
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam)
# dp
self.dragonconf = dragonconf
if ret.vEgo >= self.CP.minSteerSpeed:
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
events = self.create_common_events(ret)
# TODO: addd abs(self.CS.angle_steers) > 90 to 'steerTempUnavailable' event
# low speed steer alert hysteresis logic (only for cars with steer cut off above 10 m/s)
if ret.vEgo < (self.CP.minSteerSpeed + 2.) and self.CP.minSteerSpeed > 10.:
self.low_speed_alert = True
if ret.vEgo > (self.CP.minSteerSpeed + 4.):
self.low_speed_alert = False
if self.low_speed_alert:
events.add(car.CarEvent.EventName.belowSteerSpeed)
if dragonconf.dpAtl:
if ret.vEgo < self.CP.minSteerSpeed:
events.add(car.CarEvent.EventName.belowSteerSpeed)
else:
# low speed steer alert hysteresis logic (only for cars with steer cut off above 10 m/s)
if ret.vEgo < (self.CP.minSteerSpeed + 2.) and self.CP.minSteerSpeed > 10.:
self.low_speed_alert = True
if ret.vEgo > (self.CP.minSteerSpeed + 4.):
self.low_speed_alert = False
if self.low_speed_alert:
events.add(car.CarEvent.EventName.belowSteerSpeed)
ret.events = events.to_msg()
@@ -268,6 +292,6 @@ class CarInterface(CarInterfaceBase):
def apply(self, c):
can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators,
c.cruiseControl.cancel, c.hudControl.visualAlert, c.hudControl.leftLaneVisible,
c.hudControl.rightLaneVisible, c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart)
c.hudControl.rightLaneVisible, c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart, self.dragonconf)
self.frame += 1
return can_sends
+2 -1
View File
@@ -3,11 +3,12 @@
from cereal import car
from selfdrive.car import dbc_dict
Ecu = car.CarParams.Ecu
from common.params import Params
# Steer torque limits
class CarControllerParams:
def __init__(self, CP):
if CP.carFingerprint in [CAR.SONATA, CAR.PALISADE, CAR.SANTA_FE, CAR.VELOSTER, CAR.GENESIS_G70, CAR.IONIQ_EV_2020, CAR.KIA_CEED, CAR.KIA_SELTOS, CAR.ELANTRA_2021]:
if Params().get('dp_hkg_smart_mdps') == b'1' or CP.carFingerprint in [CAR.SONATA, CAR.PALISADE, CAR.SANTA_FE, CAR.VELOSTER, CAR.GENESIS_G70, CAR.IONIQ_EV_2020, CAR.KIA_CEED, CAR.KIA_SELTOS, CAR.ELANTRA_2021]:
self.STEER_MAX = 384
else:
self.STEER_MAX = 255
+22 -10
View File
@@ -29,6 +29,8 @@ class CarInterfaceBase():
self.frame = 0
self.low_speed_alert = False
self.dragonconf = None
if CarState is not None:
self.CS = CarState(CP)
self.cp = self.CS.get_can_parser(CP)
@@ -39,6 +41,8 @@ class CarInterfaceBase():
if CarController is not None:
self.CC = CarController(self.cp.dbc_name, CP, self.VM)
self.dragonconf = None
@staticmethod
def calc_accel_override(a_ego, a_target, v_ego, v_target):
return 1.
@@ -86,7 +90,7 @@ class CarInterfaceBase():
return ret
# returns a car.CarState, pass in car.CarControl
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
raise NotImplementedError
# return sendcan, pass in a car.CarControl
@@ -100,26 +104,28 @@ class CarInterfaceBase():
events.add(EventName.doorOpen)
if cs_out.seatbeltUnlatched:
events.add(EventName.seatbeltNotLatched)
if cs_out.gearShifter != GearShifter.drive and cs_out.gearShifter not in extra_gears:
if cs_out.gearShifter != GearShifter.drive and cs_out.gearShifter not in extra_gears and self.dragonconf.dpGearCheck:
events.add(EventName.wrongGear)
if cs_out.gearShifter == GearShifter.reverse:
events.add(EventName.reverseGear)
if not cs_out.cruiseState.available:
if not cs_out.cruiseState.available and not self.dragonconf.dpAtl:
events.add(EventName.wrongCarMode)
if cs_out.espDisabled:
events.add(EventName.espDisabled)
if cs_out.gasPressed:
if cs_out.gasPressed and not self.dragonconf.dpAllowGas:
events.add(EventName.gasPressed)
if cs_out.stockFcw:
events.add(EventName.stockFcw)
if cs_out.stockAeb:
events.add(EventName.stockAeb)
if cs_out.vEgo > MAX_CTRL_SPEED:
if cs_out.vEgo > MAX_CTRL_SPEED and self.dragonconf.dpSpeedCheck:
events.add(EventName.speedTooHigh)
if cs_out.cruiseState.nonAdaptive:
if cs_out.cruiseState.nonAdaptive and not self.dragonconf.dpAtl:
events.add(EventName.wrongCruiseMode)
if cs_out.steerError:
if (cs_out.leftBlinker or cs_out.rightBlinker) and self.dragonconf.dpLateralMode == 0:
events.add(EventName.manualSteeringRequiredBlinkersOn)
elif cs_out.steerError:
events.add(EventName.steerUnavailable)
elif cs_out.steerWarning:
if cs_out.steeringPressed:
@@ -130,9 +136,15 @@ class CarInterfaceBase():
# Disable on rising edge of gas or brake. Also disable on brake when speed > 0.
# Optionally allow to press gas at zero speed to resume.
# e.g. Chrysler does not spam the resume button yet, so resuming with gas is handy. FIXME!
if (cs_out.gasPressed and (not self.CS.out.gasPressed) and cs_out.vEgo > gas_resume_speed) or \
(cs_out.brakePressed and (not self.CS.out.brakePressed or not cs_out.standstill)):
events.add(EventName.pedalPressed)
if self.dragonconf.dpAtl:
pass
elif self.dragonconf.dpAllowGas:
if cs_out.brakePressed and (not self.CS.out.brakePressed or not cs_out.standstill):
events.add(EventName.pedalPressed)
else:
if (cs_out.gasPressed and (not self.CS.out.gasPressed) and cs_out.vEgo > gas_resume_speed) or \
(cs_out.brakePressed and (not self.CS.out.brakePressed or not cs_out.standstill)):
events.add(EventName.pedalPressed)
# we engage when pcm is active (rising edge)
if pcm_enable:
+18 -1
View File
@@ -2,14 +2,19 @@ from selfdrive.car.mazda import mazdacan
from selfdrive.car.mazda.values import CarControllerParams, Buttons
from opendbc.can.packer import CANPacker
from selfdrive.car import apply_std_steer_torque_limits
from common.dp_common import common_controller_ctrl
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.apply_steer_last = 0
self.packer = CANPacker(dbc_name)
self.steer_rate_limited = False
def update(self, enabled, CS, frame, actuators):
def update(self, enabled, CS, frame, actuators, dragonconf):
""" Controls thread """
can_sends = []
@@ -36,6 +41,18 @@ class CarController():
# Send at a rate of 5hz until we sync with stock ACC state
can_sends.append(mazdacan.create_button_cmd(self.packer, CS.CP.carFingerprint, Buttons.CANCEL))
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.apply_steer_last = apply_steer
can_sends.append(mazdacan.create_steering_control(self.packer, CS.CP.carFingerprint,
+10 -2
View File
@@ -4,6 +4,7 @@ from selfdrive.config import Conversions as CV
from selfdrive.car.mazda.values import CAR, LKAS_LIMITS
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
ButtonType = car.CarState.ButtonEvent.Type
EventName = car.CarEvent.EventName
@@ -20,6 +21,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "mazda"
ret.safetyModel = car.CarParams.SafetyModel.mazda
ret.lateralTuning.init('pid')
ret.dashcamOnly = True
@@ -75,15 +77,21 @@ class CarInterface(CarInterfaceBase):
ret.enableCamera = True
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
# events
@@ -101,6 +109,6 @@ class CarInterface(CarInterfaceBase):
return self.CS.out
def apply(self, c):
can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators)
can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators, self.dragonconf)
self.frame += 1
return can_sends
+1 -1
View File
@@ -49,7 +49,7 @@ class CarInterface(CarInterfaceBase):
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
# get basic data from phone and gps since CAN isn't connected
sensors = messaging.recv_sock(self.sensor)
if sensors is not None:
+18 -2
View File
@@ -3,13 +3,17 @@ from common.numpy_fast import clip, interp
from selfdrive.car.nissan import nissancan
from opendbc.can.packer import CANPacker
from selfdrive.car.nissan.values import CAR, CarControllerParams
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.CP = CP
self.car_fingerprint = CP.carFingerprint
@@ -19,7 +23,7 @@ class CarController():
self.packer = CANPacker(dbc_name)
def update(self, enabled, CS, frame, actuators, cruise_cancel, hud_alert,
left_line, right_line, left_lane_depart, right_lane_depart):
left_line, right_line, left_lane_depart, right_lane_depart, dragonconf):
""" Controls thread """
# Send CAN commands.
@@ -58,6 +62,18 @@ class CarController():
apply_angle = CS.out.steeringAngleDeg
self.lkas_max_torque = 0
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_angle = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_angle, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.last_angle = apply_angle
if not enabled and acc_active:
+10 -3
View File
@@ -3,6 +3,7 @@ from cereal import car
from selfdrive.car.nissan.values import CAR
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
def __init__(self, CP, CarController, CarState):
@@ -19,6 +20,7 @@ class CarInterface(CarInterfaceBase):
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
ret.carName = "nissan"
ret.safetyModel = car.CarParams.SafetyModel.nissan
ret.lateralTuning.init('pid')
# Nissan port is a community feature, since we don't own one to test
ret.communityFeature = True
@@ -58,16 +60,21 @@ class CarInterface(CarInterfaceBase):
# mass and CG position, so all cars will have approximately similar dyn behaviors
ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront)
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
self.cp_adas.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_adas, self.cp_cam)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid and self.cp_adas.can_valid and self.cp_cam.can_valid
buttonEvents = []
@@ -89,6 +96,6 @@ class CarInterface(CarInterfaceBase):
can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators,
c.cruiseControl.cancel, c.hudControl.visualAlert,
c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible,
c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart)
c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart, self.dragonconf)
self.frame += 1
return can_sends
+18 -2
View File
@@ -2,10 +2,14 @@ from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.subaru import subarucan
from selfdrive.car.subaru.values import DBC, PREGLOBAL_CARS, CarControllerParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.apply_steer_last = 0
self.es_distance_cnt = -1
self.es_accel_cnt = -1
@@ -15,7 +19,7 @@ class CarController():
self.packer = CANPacker(DBC[CP.carFingerprint]['pt'])
def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert, left_line, right_line):
def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert, left_line, right_line, dragonconf):
can_sends = []
@@ -33,6 +37,18 @@ class CarController():
if not enabled:
apply_steer = 0
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
if CS.CP.carFingerprint in PREGLOBAL_CARS:
can_sends.append(subarucan.create_preglobal_steering_control(self.packer, apply_steer, frame, CarControllerParams.STEER_STEP))
else:
+10 -3
View File
@@ -3,6 +3,7 @@ from cereal import car
from selfdrive.car.subaru.values import CAR, PREGLOBAL_CARS
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
@@ -16,6 +17,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "subaru"
ret.radarOffCan = True
ret.lateralTuning.init('pid')
if candidate in PREGLOBAL_CARS:
ret.safetyModel = car.CarParams.SafetyModel.subaruLegacy
@@ -102,15 +104,20 @@ class CarInterface(CarInterfaceBase):
# mass and CG position, so all cars will have approximately similar dyn behaviors
ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront)
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
@@ -122,6 +129,6 @@ class CarInterface(CarInterfaceBase):
def apply(self, c):
can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators,
c.cruiseControl.cancel, c.hudControl.visualAlert,
c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible)
c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible, self.dragonconf)
self.frame += 1
return can_sends
+4
View File
@@ -54,6 +54,10 @@ FINGERPRINTS = {
CAR.OUTBACK_PREGLOBAL_2018: [{
# OUTBACK LIMITED 3.6R 2019
2: 8, 208: 8, 209: 4, 210: 8, 211: 7, 212: 8, 316: 8, 320: 8, 321: 8, 324: 8, 328: 8, 329: 8, 336: 2, 338: 8, 342: 8, 352: 8, 353: 8, 354: 8, 356: 8, 358: 8, 359: 8, 392: 8, 554: 8, 604: 8, 640: 8, 642: 8, 644: 8, 805: 8, 864: 8, 865: 8, 866: 8, 872: 8, 880: 8, 881: 8, 882: 8, 884: 8, 885: 8, 886: 2, 977: 8, 1614: 8, 1632: 8, 1657: 8, 1658: 8, 1672: 8, 1736: 8, 1743: 8, 1745: 8, 1785: 5, 1786: 5, 1787: 5, 1788: 8, 1862: 8, 1870: 8, 1920: 8, 1927: 8, 1928: 8, 1935: 8, 1968: 8, 1976: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8
},
# OUTBACK 2.5i-ES 2019 - Taiwan
{
2: 8, 208: 8, 209: 4, 210: 8, 211: 7, 212: 8, 316: 8, 320: 8, 321: 8, 324: 8, 328: 8, 329: 8, 336: 2, 338: 8, 342: 8, 346: 8, 352: 8, 353: 8, 354: 8, 356: 8, 358: 8, 359: 8, 392: 8, 554: 8, 604: 8, 640: 8, 642: 8, 644: 8, 805: 8, 864: 8, 865: 8, 866: 8, 872: 8, 880: 8, 881: 8, 882: 8, 884: 8, 885: 8, 886: 2, 977: 8, 1614: 8, 1632: 8, 1640: 8, 1657: 8, 1658: 8, 1672: 8, 1722: 8, 1736: 8, 1745: 8, 1786: 5, 1787: 5
}],
CAR.FORESTER_PREGLOBAL: [{
# FORESTER PREMIUM 2.5i 2017
+28 -4
View File
@@ -7,6 +7,7 @@ from selfdrive.car.toyota.toyotacan import create_steer_command, create_ui_comma
from selfdrive.car.toyota.values import Ecu, CAR, STATIC_MSGS, NO_STOP_TIMER_CAR, TSS2_CAR, \
MIN_ACC_SPEED, PEDAL_HYST_GAP, CarControllerParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
@@ -28,6 +29,10 @@ def accel_hysteresis(accel, accel_steady, enabled):
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.last_steer = 0
self.accel_steady = 0.
self.alert_active = False
@@ -45,7 +50,7 @@ class CarController():
self.packer = CANPacker(dbc_name)
def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert,
left_line, right_line, lead, left_lane_depart, right_lane_depart):
left_line, right_line, lead, left_lane_depart, right_lane_depart, dragonconf):
# *** compute control surfaces ***
@@ -75,7 +80,7 @@ class CarController():
self.steer_rate_limited = new_steer != apply_steer
# Cut steering while we're in a known fault state (2s)
if not enabled or CS.steer_state in [9, 25]:
if not enabled or CS.steer_state in [9, 25] or abs(CS.out.steeringRateDeg) > 100 or (abs(CS.out.steeringAngleDeg) > 150 and CS.CP.carFingerprint in [CAR.RAV4H, CAR.PRIUS]):
apply_steer = 0
apply_steer_req = 0
else:
@@ -86,12 +91,24 @@ class CarController():
pcm_cancel_cmd = 1
# on entering standstill, send standstill request
if CS.out.standstill and not self.last_standstill and CS.CP.carFingerprint not in NO_STOP_TIMER_CAR:
if not dragonconf.dpToyotaSng and CS.out.standstill and not self.last_standstill and CS.CP.carFingerprint not in NO_STOP_TIMER_CAR:
self.standstill_req = True
if CS.pcm_acc_status != 8:
# pcm entered standstill or it's disabled
self.standstill_req = False
# dp
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.last_steer = apply_steer
self.last_accel = pcm_accel_cmd
self.last_standstill = CS.out.standstill
@@ -119,7 +136,9 @@ class CarController():
lead = lead or CS.out.vEgo < 12. # at low speed we always assume the lead is present do ACC can be engaged
# Lexus IS uses a different cancellation message
if pcm_cancel_cmd and CS.CP.carFingerprint == CAR.LEXUS_IS:
if dragonconf.dpAtl:
pass
elif pcm_cancel_cmd and CS.CP.carFingerprint == CAR.LEXUS_IS:
can_sends.append(create_acc_cancel_command(self.packer))
elif CS.CP.openpilotLongitudinalControl:
can_sends.append(create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.standstill_req, lead))
@@ -146,6 +165,11 @@ class CarController():
# forcing the pcm to disengage causes a bad fault sound so play a good sound instead
send_ui = True
# dp
if not dragonconf.dpToyotaLdw:
left_lane_depart = False
right_lane_depart = False
if (frame % 100 == 0 or send_ui) and Ecu.fwdCamera in self.fake_ecus:
can_sends.append(create_ui_command(self.packer, steer_alert, pcm_cancel_cmd, left_line, right_line, left_lane_depart, right_lane_depart))
+11 -3
View File
@@ -5,7 +5,7 @@ from selfdrive.car.interfaces import CarStateBase
from opendbc.can.parser import CANParser
from selfdrive.config import Conversions as CV
from selfdrive.car.toyota.values import CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR
from common.params import Params
class CarState(CarStateBase):
def __init__(self, CP):
@@ -19,6 +19,8 @@ class CarState(CarStateBase):
self.needs_angle_offset = True
self.accurate_steer_angle_seen = False
self.angle_offset = 0.
# dp
self.dp_toyota_zss = Params().get('dp_toyota_zss') == b'1'
def update(self, cp, cp_cam):
ret = car.CarState.new_message()
@@ -45,11 +47,14 @@ class CarState(CarStateBase):
ret.standstill = ret.vEgoRaw < 0.001
# Some newer models have a more accurate angle measurement in the TORQUE_SENSOR message. Use if non-zero
if abs(cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]) > 1e-3:
if self.dp_toyota_zss or abs(cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]) > 1e-3:
self.accurate_steer_angle_seen = True
if self.accurate_steer_angle_seen:
ret.steeringAngleDeg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"] - self.angle_offset
if self.dp_toyota_zss:
ret.steeringAngleDeg = cp.vl["SECONDARY_STEER_ANGLE"]["ZORRO_STEER"] - self.angle_offset
else:
ret.steeringAngleDeg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"] - self.angle_offset
if self.needs_angle_offset:
angle_wheel = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
if abs(angle_wheel) > 1e-3:
@@ -176,6 +181,9 @@ class CarState(CarStateBase):
("BSM", 1)
]
if Params().get('dp_toyota_zss') == b'1':
signals += [("ZORRO_STEER", "SECONDARY_STEER_ANGLE", 0)]
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 0)
@staticmethod
+34 -2
View File
@@ -5,11 +5,19 @@ from selfdrive.car.toyota.values import Ecu, CAR, TSS2_CAR, NO_DSU_CAR, MIN_ACC_
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.swaglog import cloudlog
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
from common.params import Params
EventName = car.CarEvent.EventName
class CarInterface(CarInterfaceBase):
def __init__(self, CP, CarController, CarState):
super().__init__(CP, CarController, CarState)
# dp
self.dp_cruise_speed = 0.
@staticmethod
def compute_gb(accel, speed):
return float(accel) / CarControllerParams.ACCEL_SCALE
@@ -54,6 +62,9 @@ class CarInterface(CarInterfaceBase):
ret.steerRatio = 16.88 # 14.5 is spec end-to-end
tire_stiffness_factor = 0.5533
ret.mass = 3650. * CV.LB_TO_KG + STD_CARGO_KG # mean between normal and hybrid
if ret.enableGasInterceptor:
ret.longitudinalTuning.kpV = [0.4, 0.36, 0.325] # arne's tune.
ret.longitudinalTuning.kiV = [0.195, 0.10]
ret.lateralTuning.init('lqr')
ret.lateralTuning.lqr.scale = 1500.0
@@ -349,15 +360,36 @@ class CarInterface(CarInterfaceBase):
ret.longitudinalTuning.kpV = [3.6, 2.4, 1.5]
ret.longitudinalTuning.kiV = [0.54, 0.36]
# dp
ret = common_interface_get_params_lqr(ret)
if candidate == CAR.PRIUS and Params().get('dp_toyota_zss') == b'1':
ret.mass = 3370. * CV.LB_TO_KG + STD_CARGO_KG
ret.lateralTuning.indi.timeConstantV = [0.1]
ret.lateralTuning.indi.timeConstantBP = [0.]
ret.steerRateCost = 0.5
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
# ******************* do can recv *******************
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
# if ret.cruiseState.enabled and dragonconf.dpToyotaLowestCruiseOverride and ret.cruiseState.speed < dragonconf.dpToyotaLowestCruiseOverrideAt * CV.KPH_TO_MS:
# if dragonconf.dpToyotaLowestCruiseOverrideVego:
# if self.dp_cruise_speed == 0.:
# ret.cruiseState.speed = self.dp_cruise_speed = max( dragonconf.dpToyotaLowestCruiseOverrideSpeed * CV.KPH_TO_MS,ret.vEgo)
# else:
# ret.cruiseState.speed = self.dp_cruise_speed
# else:
# ret.cruiseState.speed = dragonconf.dpToyotaLowestCruiseOverrideSpeed * CV.KPH_TO_MS
# else:
# self.dp_cruise_speed = 0.
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
@@ -389,7 +421,7 @@ class CarInterface(CarInterfaceBase):
c.actuators, c.cruiseControl.cancel,
c.hudControl.visualAlert, c.hudControl.leftLaneVisible,
c.hudControl.rightLaneVisible, c.hudControl.leadVisible,
c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart)
c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart, self.dragonconf)
self.frame += 1
return can_sends
+48 -8
View File
@@ -10,8 +10,8 @@ PEDAL_HYST_GAP = 3. * CV.MPH_TO_MS
class CarControllerParams:
ACCEL_HYST_GAP = 0.02 # don't change accel command for small oscilalitons within this value
ACCEL_MAX = 1.5 # 1.5 m/s2
ACCEL_MIN = -3.0 # 3 m/s2
ACCEL_MAX = 2.0 # 1.5 m/s2
ACCEL_MIN = -3.5 # 3 m/s2
ACCEL_SCALE = max(ACCEL_MAX, -ACCEL_MIN)
STEER_MAX = 1500
@@ -93,31 +93,43 @@ FINGERPRINTS = {
36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 512: 6, 513: 6, 547: 8, 548: 8, 552: 4, 562: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 830: 7, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 3, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1008: 2, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1207: 8, 1227: 8, 1235: 8, 1263: 8, 1279: 8, 1552: 8, 1553: 8, 1554: 8, 1555: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1596: 8, 1597: 8, 1600: 8, 1664: 8, 1728: 8, 1745: 8, 1779: 8
}],
CAR.PRIUS: [{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 512: 6, 513: 6, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 824: 2, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 869: 7, 870: 7, 871: 2, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1595: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 512: 6, 513: 6, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 824: 2, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 869: 7, 870: 7, 871: 2, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1595: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
},
#2019 LE
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
},
# 2020 Prius Prime LE
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 767: 4, 800: 8, 810: 2, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1235: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1649: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 767: 4, 800: 8, 810: 2, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1235: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1649: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
},
#2020 Prius Prime Limited
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 824: 2, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1649: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 2015: 8, 2024: 8, 2026: 8, 2027: 8, 2029: 8, 2030: 8, 2031: 8
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 824: 2, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1649: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 2015: 8, 2024: 8, 2026: 8, 2027: 8, 2029: 8, 2030: 8, 2031: 8
},
#2020 Central Europe Prime
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 767: 4, 800: 8, 810: 2, 818: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 889: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 8, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 767: 4, 800: 8, 810: 2, 818: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 889: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 8, 974: 8, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8
},
#2017 German Prius
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 869: 7, 870: 7, 871: 2, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1595: 8, 1777: 8, 1779: 8, 1792: 8, 1767: 4, 1863: 8, 1904: 8, 1912: 8, 1984: 8, 1988: 8, 1990: 8, 1992: 8, 1996: 8, 1998: 8, 2002: 8, 2010: 8, 2015: 8, 2016: 8, 2018: 8, 2024: 8, 2026: 8, 2030: 8
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 814: 8, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 869: 7, 870: 7, 871: 2, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1077: 8, 1082: 8, 1083: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1175: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1595: 8, 1777: 8, 1779: 8, 1792: 8, 1767: 4, 1863: 8, 1904: 8, 1912: 8, 1984: 8, 1988: 8, 1990: 8, 1992: 8, 1996: 8, 1998: 8, 2002: 8, 2010: 8, 2015: 8, 2016: 8, 2018: 8, 2024: 8, 2026: 8, 2030: 8
},
# Taiwan 2020 Prius 4.5
{
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 800: 8, 810: 2, 818: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 889: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1593: 8, 1595: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8
},
# Taiwan Prius 4.5
{
35: 8, 36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 512: 6, 513: 6, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 800: 8, 810: 2, 818: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 889: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1872: 8, 1880: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
#Corolla w/ added Pedal Support (512L and 513L)
CAR.COROLLA: [{
36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 512: 6, 513: 6, 547: 8, 548: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 740: 5, 767: 4, 800: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 2, 921: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 4, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1196: 8, 1227: 8, 1235: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1596: 8, 1597: 8, 1600: 8, 1664: 8, 1728: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 2016: 8, 2017: 8, 2018: 8, 2019: 8, 2020: 8, 2021: 8, 2022: 8, 2023: 8, 2024: 8
},
#2015 Corolla w/ select 2017 ECU's
{
32: 4, 36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 426: 6, 452: 8, 456: 8, 464: 8, 466: 8, 467: 8, 513: 6, 547: 8, 548: 8, 552: 4, 608: 8, 610: 5, 611: 7, 705: 8, 740: 5, 800: 8, 849: 4, 852: 1, 865: 8, 871: 2, 896: 8, 897: 8, 898: 8, 899: 8, 900: 6, 902: 6, 903: 8, 905: 8, 906: 5, 910: 8, 911: 8, 916: 2, 921: 8, 928: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 4, 956: 8, 976: 1, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1017: 8, 1024: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1078: 8, 1079: 8, 1088: 8, 1090: 8, 1091: 8, 1161: 8, 1162: 8, 1163: 8, 1196: 8, 1217: 8, 1219: 8, 1222: 8, 1224: 8, 1235: 8, 1244: 8, 1245: 8, 1279: 8, 1552: 8, 1553: 8, 1555: 8, 1556: 8, 1557: 8, 1560: 8, 1561: 8, 1562: 8, 1564: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1574: 8, 1592: 8, 1596: 8, 1597: 8, 1600: 8, 1664: 8, 1761: 8, 1762: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 643: 7
}],
CAR.LEXUS_RXH: [{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 512: 6, 513: 6, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 5, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 812: 3, 814: 8, 830: 7, 835: 8, 836: 8, 845: 5, 863: 8, 869: 7, 870: 7, 871: 2, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 6, 993: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1071: 8, 1077: 8, 1082: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1595: 8, 1777: 8, 1779: 8, 1808: 8, 1810: 8, 1816: 8, 1818: 8, 1840: 8, 1848: 8, 1904: 8, 1912: 8, 1940: 8, 1941: 8, 1948: 8, 1949: 8, 1952: 8, 1956: 8, 1960: 8, 1964: 8, 1986: 8, 1990: 8, 1994: 8, 1998: 8, 2004: 8, 2012: 8
@@ -148,6 +160,10 @@ FINGERPRINTS = {
{
# 2019 XSE
36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 608: 8, 610: 8, 643: 7, 658: 8, 705: 8, 728: 8, 740: 5, 761: 8, 764: 8, 767: 4, 800: 8, 810: 2, 812: 8, 814: 8, 818: 8, 822: 8, 824: 8, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 888: 8, 889: 8, 891: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 918: 8, 921: 8, 933: 8, 934: 8, 935: 8, 942: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 983: 8, 984: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1011: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1082: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1228: 8, 1235: 8, 1237: 8, 1263: 8, 1264: 8, 1279: 8, 1412: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1745: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1792: 8, 1767: 4, 1808: 8, 1816: 8, 1872: 8, 1880: 8, 1904: 8, 1912: 8, 1937: 8, 1945: 8, 1953: 8, 1961: 8, 1968: 8, 1976: 8, 1990: 8, 1998: 8, 2015: 8, 2016: 8, 2024: 8
},
# China 2018 Camry 2.5 from superdongle
{
36: 8, 37: 8, 119: 6, 170: 8, 180: 8, 186: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 608: 8, 610: 8, 643: 7, 705: 8, 728: 8, 740: 5, 761: 8, 764: 8, 800: 8, 810: 2, 812: 8, 818: 8, 824: 8, 830: 7, 835: 8, 836: 8, 869: 7, 870: 7, 871: 2, 888: 8, 889: 8, 898: 8, 900: 6, 902: 6, 905: 8, 913: 8, 918: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1112: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1235: 8, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1595: 8, 1745: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
CAR.CAMRYH: [
#SE, LE and LE with Blindspot Monitor
@@ -176,6 +192,10 @@ FINGERPRINTS = {
# 2018 Highlander Limited Platinum
{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 545: 5, 550: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 767: 4, 800: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 3, 918: 7, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1008: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1207: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1263: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1585: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1656: 8, 1728: 8, 1745: 8, 1779: 8, 1872: 8, 1880: 8, 1904: 8, 1912: 8, 1988: 8, 1990: 8, 1996: 8, 1998: 8, 2015: 8, 2016: 8, 2024: 8
},
# 2018 China Highlander from toyboxZ
{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 800: 8, 835: 8, 836: 8, 845: 5, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 913: 8, 916: 3, 918: 7, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1008: 2, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1200: 8, 1201: 8, 1202: 8, 1203: 8, 1206: 8, 1207: 8, 1212: 8, 1227: 8, 1235: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1556: 8, 1557: 8, 1561: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 2015: 8, 2016: 8, 2024: 8
}],
CAR.HIGHLANDERH: [{
36: 8, 37: 8, 170: 8, 180: 8, 296: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 581: 5, 608: 8, 610: 5, 643: 7, 713: 8, 740: 5, 767: 4, 800: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 3, 918: 7, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 3, 955: 8, 956: 8, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1112: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1184: 8, 1185: 8, 1186: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1212: 8, 1227: 8, 1232: 8, 1235: 8, 1237: 8, 1263: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1554: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1656: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
@@ -195,6 +215,10 @@ FINGERPRINTS = {
# XLE, Limited, and AWD
{
36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 401: 8, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 565: 8, 608: 8, 610: 8, 643: 7, 658: 8, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 767: 4, 800: 8, 810: 2, 812: 8, 814: 8, 818: 8, 822: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 882: 8, 885: 8, 889: 8, 891: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 918: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 987: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1076: 8, 1077: 8, 1082: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1228: 8, 1235: 8, 1237: 8, 1263: 8, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1696: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 2015: 8, 2016: 8, 2024: 8
},
# China 2020 RAV4 from superdongle
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 401: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 765: 8, 800: 8, 810: 2, 812: 8, 829: 2, 830: 7, 835: 8, 836: 8, 863: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 882: 8, 885: 8, 896: 8, 898: 8, 918: 7, 921: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 987: 8, 993: 8, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1063: 8, 1071: 8, 1082: 8, 1084: 8, 1085: 8, 1086: 8, 1112: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1172: 8, 1235: 8, 1263: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1745: 8, 1775: 8, 1779: 8
}],
CAR.COROLLAH_TSS2: [
# 2019 Taiwan Altis Hybrid
@@ -204,6 +228,10 @@ FINGERPRINTS = {
# 2019 Chinese Levin Hybrid
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 401: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 765: 8, 767: 4, 800: 8, 810: 2, 812: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 885: 8, 896: 8, 898: 8, 921: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 993: 8, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1172: 8, 1235: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1600: 8, 1649: 8, 1745: 8, 1775: 8, 1779: 8
},
# Taiwan Altis Hybrid by Fish
{
36: 8, 37: 8, 166: 8, 170: 8, 180: 8, 295: 8, 296: 8, 401: 8, 426: 6, 452: 8, 466: 8, 467: 8, 550: 8, 552: 4, 560: 7, 562: 6, 581: 5, 608: 8, 610: 8, 643: 7, 713: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 765: 8, 800: 8, 810: 2, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 885: 8, 896: 8, 898: 8, 918: 7, 921: 8, 942: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 8, 955: 8, 956: 8, 971: 7, 975: 5, 987: 8, 993: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1057: 8, 1059: 1, 1071: 8, 1082: 8, 1112: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1172: 8, 1235: 8, 1237: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1745: 8, 1775: 8, 1779: 8
}
],
CAR.SIENNA: [
@@ -213,8 +241,16 @@ FINGERPRINTS = {
# XLE AWD 2018
{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 545: 5, 548: 8, 550: 8, 552: 4, 562: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 764: 8, 767: 4, 800: 8, 824: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 1, 921: 8, 933: 8, 944: 6, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1008: 2, 1014: 8, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1114: 8, 1160: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1200: 8, 1201: 8, 1202: 8, 1203: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1279: 8, 1552: 8, 1553: 8, 1555: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1656: 8, 1664: 8, 1666: 8, 1667: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
},
{
# Canada 2018 Sienna LTD
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 545: 5, 548: 8, 550: 8, 552: 4, 562: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 764: 8, 800: 8, 818: 8, 822: 8, 824: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 888: 8, 889: 8, 891: 8, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 1, 918: 7, 921: 8, 933: 8, 944: 6, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1008: 2, 1014: 8, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1114: 8, 1160: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1200: 8, 1201: 8, 1202: 8, 1203: 8, 1212: 8, 1227: 8, 1228: 8, 1235: 8, 1237: 8, 1263: 8, 1264: 8, 1279: 8, 1552: 8, 1553: 8, 1555: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1656: 8, 1664: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
CAR.LEXUS_IS: [
# IS200T 2017 TW
{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 355: 5, 400: 6, 426: 6, 452: 8, 464: 8, 466: 8, 467: 5, 544: 4, 550: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 740: 5, 800: 8, 836: 8, 845: 5, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 913: 8, 916: 3, 918: 7, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1008: 2, 1009: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1112: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1168: 1, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1184: 8, 1185: 8, 1186: 8, 1187: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1207: 8, 1208: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1555: 8, 1556: 8, 1557: 8, 1561: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1728: 8, 1745: 8, 1779: 8
},
# IS300 2018
{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 400: 6, 426: 6, 452: 8, 464: 8, 466: 8, 467: 5, 544: 4, 550: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 740: 5, 767: 4, 800: 8, 836: 8, 845: 5, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 913: 8, 916: 3, 918: 7, 921: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1008: 2, 1009: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1112: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1168: 1, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1184: 8, 1185: 8, 1186: 8, 1187: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1208: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1555: 8, 1556: 8, 1557: 8, 1561: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1584: 8, 1589: 8, 1590: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1648: 8, 1666: 8, 1667: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
@@ -225,6 +261,10 @@ FINGERPRINTS = {
}],
CAR.LEXUS_CTH: [{
36: 8, 37: 8, 170: 8, 180: 8, 288: 8, 426: 6, 452: 8, 466: 8, 467: 8, 548: 8, 552: 4, 560: 7, 581: 5, 608: 8, 610: 5, 643: 7, 713: 8, 740: 5, 800: 8, 810: 2, 832: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 1, 921: 8, 933: 8, 944: 6, 945: 8, 950: 8, 951: 8, 953: 3, 955: 4, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1056: 8, 1057: 8, 1059: 1, 1076: 8, 1077: 8, 1114: 8, 1116: 8, 1160: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1184: 8, 1185: 8, 1186: 8, 1190: 8, 1191: 8, 1192: 8, 1227: 8, 1235: 8, 1279: 8, 1552: 8, 1553: 8, 1554: 8, 1555: 8, 1556: 8, 1557: 8, 1558: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1664: 8, 1728: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
},
# Taiwan CT200h FP from CloudJ
{
36: 8, 37: 8, 170: 8, 180: 8, 288: 8, 426: 6, 452: 8, 466: 8, 467: 8, 548: 8, 552: 4, 560: 7, 581: 5, 608: 8, 610: 5, 643: 7, 713: 8, 740: 5, 800: 8, 810: 2, 832: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 900: 6, 902: 6, 905: 8, 911: 8, 916: 1, 918: 7, 921: 8, 933: 8, 944: 6, 945: 8, 950: 8, 951: 8, 953: 3, 955: 4, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1056: 8, 1057: 8, 1059: 1, 1076: 8, 1077: 8, 1112: 8, 1114: 8, 1116: 8, 1160: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1184: 8, 1185: 8, 1186: 8, 1190: 8, 1191: 8, 1192: 8, 1227: 8, 1235: 8, 1279: 8, 1552: 8, 1553: 8, 1554: 8, 1555: 8, 1556: 8, 1557: 8, 1558: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1664: 8, 1728: 8, 1779: 8
}],
}
+27 -4
View File
@@ -1,12 +1,16 @@
from cereal import car
from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.volkswagen import volkswagencan
from selfdrive.car.volkswagen.values import DBC, CANBUS, MQB_LDW_MESSAGES, BUTTON_STATES, CarControllerParams
from selfdrive.car.volkswagen.values import DBC, CANBUS, MQB_LDW_MESSAGES, BUTTON_STATES, CarControllerParams, NetworkLocation
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
class CarController():
def __init__(self, dbc_name, CP, VM):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.apply_steer_last = 0
self.packer_pt = CANPacker(DBC[CP.carFingerprint]['pt'])
@@ -17,10 +21,15 @@ class CarController():
self.graMsgSentCount = 0
self.graMsgStartFramePrev = 0
self.graMsgBusCounterPrev = 0
if CP.networkLocation == NetworkLocation.fwdCamera:
self.ext_can = CANBUS.pt
else:
self.ext_can = CANBUS.cam
self.steer_rate_limited = False
def update(self, enabled, CS, frame, actuators, visual_alert, left_lane_visible, right_lane_visible, left_lane_depart, right_lane_depart):
def update(self, enabled, CS, frame, actuators, visual_alert, left_lane_visible, right_lane_visible, left_lane_depart, right_lane_depart, dragonconf):
""" Controls thread """
P = CarControllerParams
@@ -94,6 +103,20 @@ class CarController():
hcaEnabled = False
apply_steer = 0
# dp
if CS.out.stopSteering:
apply_steer = 0
blinker_on = CS.out.leftBlinker or CS.out.rightBlinker
if not enabled:
self.blinker_end_frame = 0
if self.last_blinker_on and not blinker_on:
self.blinker_end_frame = frame + dragonconf.dpSignalOffDelay
apply_steer = common_controller_ctrl(enabled,
dragonconf,
blinker_on or frame < self.blinker_end_frame,
apply_steer, CS.out.vEgo)
self.last_blinker_on = blinker_on
self.apply_steer_last = apply_steer
idx = (frame / P.HCA_STEP) % 16
can_sends.append(volkswagencan.create_mqb_steering_control(self.packer_pt, CANBUS.pt, apply_steer,
@@ -178,7 +201,7 @@ class CarController():
if self.graMsgSentCount == 0:
self.graMsgStartFramePrev = frame
idx = (CS.graMsgBusCounter + 1) % 16
can_sends.append(volkswagencan.create_mqb_acc_buttons_control(self.packer_pt, CANBUS.pt, self.graButtonStatesToSend, CS, idx))
can_sends.append(volkswagencan.create_mqb_acc_buttons_control(self.packer_pt, self.ext_can, self.graButtonStatesToSend, CS, idx))
self.graMsgSentCount += 1
if self.graMsgSentCount >= P.GRA_VBP_COUNT:
self.graButtonStatesToSend = None
+24 -14
View File
@@ -4,7 +4,7 @@ from selfdrive.config import Conversions as CV
from selfdrive.car.interfaces import CarStateBase
from opendbc.can.parser import CANParser
from opendbc.can.can_define import CANDefine
from selfdrive.car.volkswagen.values import DBC, CANBUS, TransmissionType, GearShifter, BUTTON_STATES, CarControllerParams
from selfdrive.car.volkswagen.values import DBC, CANBUS, TransmissionType, GearShifter, BUTTON_STATES, CarControllerParams, NetworkLocation
class CarState(CarStateBase):
def __init__(self, CP):
@@ -17,7 +17,7 @@ class CarState(CarStateBase):
self.hca_status_values = can_define.dv["LH_EPS_03"]["EPS_HCA_Status"]
self.buttonStates = BUTTON_STATES.copy()
def update(self, pt_cp, cam_cp, trans_type):
def update(self, pt_cp, cam_cp, ext_cp, trans_type):
ret = car.CarState.new_message()
# Update vehicle speed and acceleration from ABS wheel speeds.
ret.wheelSpeeds.fl = pt_cp.vl["ESP_19"]["ESP_VL_Radgeschw_02"] * CV.KPH_TO_MS
@@ -27,8 +27,8 @@ class CarState(CarStateBase):
ret.vEgoRaw = float(np.mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr]))
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
ret.standstill = ret.vEgoRaw < 0.1
#Fix stop and go acc self-resume +1
ret.standstill = bool(pt_cp.vl["ESP_21"]["ESP_Haltebestaetigung"]) and ret.vEgoRaw < 0.01
# Update steering angle, rate, yaw rate, and driver input torque. VW send
# the sign/direction in a separate signal so they must be recombined.
@@ -86,8 +86,8 @@ class CarState(CarStateBase):
# Refer to VW Self Study Program 890253: Volkswagen Driver Assist Systems,
# pages 32-35.
if self.CP.enableBsm:
ret.leftBlindspot = bool(pt_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(pt_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"])
ret.rightBlindspot = bool(pt_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(pt_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"])
ret.leftBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"])
ret.rightBlindspot = bool(ext_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]) or bool(ext_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"])
# Consume factory LDW data relevant for factory SWA (Lane Change Assist)
# and capture it for forwarding to the blind spot radar controller
@@ -102,8 +102,8 @@ class CarState(CarStateBase):
# braking release bits are set.
# Refer to VW Self Study Program 890253: Volkswagen Driver Assistance
# Systems, chapter on Front Assist with Braking: Golf Family for all MQB
ret.stockFcw = bool(pt_cp.vl["ACC_10"]["AWV2_Freigabe"])
ret.stockAeb = bool(pt_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(pt_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"])
ret.stockFcw = bool(ext_cp.vl["ACC_10"]["AWV2_Freigabe"])
ret.stockAeb = bool(ext_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]) or bool(ext_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"])
# Update ACC radar status.
accStatus = pt_cp.vl["TSK_06"]["TSK_Status"]
@@ -122,7 +122,7 @@ class CarState(CarStateBase):
# Update ACC setpoint. When the setpoint is zero or there's an error, the
# radar sends a set-speed of ~90.69 m/s / 203mph.
ret.cruiseState.speed = pt_cp.vl["ACC_02"]["ACC_Wunschgeschw"] * CV.KPH_TO_MS
ret.cruiseState.speed = ext_cp.vl["ACC_02"]['ACC_Wunschgeschw'] * CV.KPH_TO_MS
if ret.cruiseState.speed > 90:
ret.cruiseState.speed = 0
@@ -185,6 +185,7 @@ class CarState(CarStateBase):
("EPS_VZ_Lenkmoment", "LH_EPS_03", 0), # Driver torque input sign
("EPS_HCA_Status", "LH_EPS_03", 3), # EPS HCA control status
("ESP_Tastung_passiv", "ESP_21", 0), # Stability control disabled
("ESP_Haltebestaetigung", "ESP_21", 0), # prevents set point creep
("KBI_MFA_v_Einheit_02", "Einheiten_01", 0), # MPH vs KMH speed display
("KBI_Handbremse", "Kombi_01", 0), # Manual handbrake applied
("TSK_Status", "TSK_06", 0), # ACC engagement status from drivetrain coordinator
@@ -230,10 +231,10 @@ class CarState(CarStateBase):
("BCM1_Rueckfahrlicht_Schalter", "Gateway_72", 0)] # Reverse light from BCM
checks += [("Motor_14", 10)] # From J623 Engine control module
# TODO: Detect ACC radar bus location
signals += MqbExtraSignals.fwd_radar_signals
checks += MqbExtraSignals.fwd_radar_checks
# TODO: Detect BSM radar bus location
if CP.networkLocation == NetworkLocation.fwdCamera:
# Extended CAN devices other than the camera are here on CANBUS.pt
signals += MqbExtraSignals.fwd_radar_signals
checks += MqbExtraSignals.fwd_radar_checks
if CP.enableBsm:
signals += MqbExtraSignals.bsm_radar_signals
checks += MqbExtraSignals.bsm_radar_checks
@@ -257,7 +258,16 @@ class CarState(CarStateBase):
("LDW_02", 10) # From R242 Driver assistance camera
]
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.cam)
if CP.networkLocation == NetworkLocation.gateway:
# Extended CAN devices other than the camera are here on CANBUS.cam
signals += MqbExtraSignals.fwd_radar_signals
checks += MqbExtraSignals.fwd_radar_checks
if CP.enableBsm:
signals += MqbExtraSignals.bsm_radar_signals
checks += MqbExtraSignals.bsm_radar_checks
# TODO: Re-enable checks enforcement with CP.enableStockCamera
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CANBUS.cam, enforce_checks=False)
class MqbExtraSignals:
# Additional signal and message lists for optional or bus-portable controllers
+58 -4
View File
@@ -1,8 +1,9 @@
from cereal import car
from selfdrive.swaglog import cloudlog
from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES, TransmissionType, GearShifter
from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES, TransmissionType, GearShifter, NetworkLocation
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
EventName = car.CarEvent.EventName
@@ -13,6 +14,15 @@ class CarInterface(CarInterfaceBase):
self.displayMetricUnitsPrev = None
self.buttonStatesPrev = BUTTON_STATES.copy()
# timebomb_counter mod
self.cruise_enabled_prev = False
self.timebomb_counter = 0
self.wheel_grabbed = False
self.timebomb_bypass_counter = 0
# Alias Extended CAN parser to PT/CAM parser, based on detected network location
self.cp_ext = self.cp if CP.networkLocation == NetworkLocation.fwdCamera else self.cp_cam
@staticmethod
def compute_gb(accel, speed):
@@ -43,6 +53,12 @@ class CarInterface(CarInterfaceBase):
ret.transmissionType = TransmissionType.manual
cloudlog.info("Detected transmission type: %s", ret.transmissionType)
if 0xfd in fingerprint[1]: # ESP_21 present on bus 1, we're hooked up at the CAN gateway
ret.networkLocation = NetworkLocation.gateway
else: # We're hooked up at the LKAS camera
ret.networkLocation = NetworkLocation.fwdCamera
cloudlog.info("Detected network location: %s", ret.networkLocation)
# Global tuning defaults, can be overridden per-vehicle
ret.steerRateCost = 1.0
@@ -135,11 +151,13 @@ class CarInterface(CarInterfaceBase):
# mass and CG position, so all cars will have approximately similar dyn behaviors
ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront,
tire_stiffness_factor=tire_stiffness_factor)
# dp
ret = common_interface_get_params_lqr(ret)
return ret
# returns a car.CarState
def update(self, c, can_strings):
def update(self, c, can_strings, dragonconf):
buttonEvents = []
# Process the most recent CAN message traffic, and check for validity
@@ -148,7 +166,10 @@ class CarInterface(CarInterfaceBase):
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp, self.cp_cam, self.CP.transmissionType)
ret = self.CS.update(self.cp, self.cp_cam, self.cp_ext, self.CP.transmissionType)
# dp
self.dragonconf = dragonconf
ret.cruiseState.enabled = common_interface_atl(ret, dragonconf.dpAtl)
ret.canValid = self.cp.can_valid and self.cp_cam.can_valid
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
@@ -173,10 +194,42 @@ class CarInterface(CarInterfaceBase):
if self.CS.parkingBrakeSet:
events.add(EventName.parkBrake)
# Engagement and longitudinal control using stock ACC. Make sure OP is
# disengaged if stock ACC is disengaged.
if not ret.cruiseState.enabled:
events.add(EventName.pcmDisable)
# Attempt OP engagement only on rising edge of stock ACC engagement.
elif not self.cruise_enabled_prev:
events.add(EventName.pcmEnable)
if dragonconf.dpVwTimebombAssist:
ret.stopSteering = False
if ret.cruiseState.enabled:
self.timebomb_counter += 1
else:
self.timebomb_counter = 0
self.timebomb_bypass_counter = 0
if self.timebomb_counter >= 33000: # 330*100 time in seconds until counter threshold for timebombWarn alert
if not self.wheel_grabbed:
events.add(EventName.timebombWarn)
if self.wheel_grabbed or ret.steeringPressed:
self.wheel_grabbed = True
ret.stopSteering = True
self.timebomb_bypass_counter += 1
if self.timebomb_bypass_counter >= 300: # 3*100 time alloted for bypass
self.wheel_grabbed = False
self.timebomb_counter = 0
self.timebomb_bypass_counter = 0
events.add(EventName.timebombBypassed)
else:
events.add(EventName.timebombBypassing)
ret.events = events.to_msg()
ret.buttonEvents = buttonEvents
# update previous car states
self.cruise_enabled_prev = ret.cruiseState.enabled
self.displayMetricUnitsPrev = self.CS.displayMetricUnits
self.buttonStatesPrev = self.CS.buttonStates.copy()
@@ -189,6 +242,7 @@ class CarInterface(CarInterfaceBase):
c.hudControl.leftLaneVisible,
c.hudControl.rightLaneVisible,
c.hudControl.leftLaneDepart,
c.hudControl.rightLaneDepart)
c.hudControl.rightLaneDepart,
self.dragonconf)
self.frame += 1
return can_sends
+1
View File
@@ -26,6 +26,7 @@ class CANBUS:
pt = 0
cam = 2
NetworkLocation = car.CarParams.NetworkLocation
TransmissionType = car.CarParams.TransmissionType
GearShifter = car.CarState.GearShifter
+2 -2
View File
@@ -27,8 +27,8 @@ def create_mqb_hud_control(packer, bus, enabled, steering_pressed, hud_alert, le
values = {
"LDW_Status_LED_gelb": 1 if enabled and steering_pressed else 0,
"LDW_Status_LED_gruen": 1 if enabled and not steering_pressed else 0,
"LDW_Lernmodus_links": 3 if left_lane_depart else 1 + left_lane_visible,
"LDW_Lernmodus_rechts": 3 if right_lane_depart else 1 + right_lane_visible,
"LDW_Lernmodus_links": 3 if enabled and left_lane_visible else 1 + left_lane_visible,
"LDW_Lernmodus_rechts": 3 if enabled and right_lane_visible else 1 + right_lane_visible,
"LDW_Texte": hud_alert,
"LDW_SW_Warnung_links": ldw_lane_warning_left,
"LDW_SW_Warnung_rechts": ldw_lane_warning_right,
+1 -1
View File
@@ -28,7 +28,7 @@ if arch == "aarch64":
'touch.c',
]
_gpu_libs = ['gui', 'adreno_utils']
elif arch == "larch64":
elif arch == "larch64" or arch == "jarch64":
_gpu_libs = ["GLESv2"]
else:
_gpu_libs = ["GL"]
+70 -2
View File
@@ -33,9 +33,9 @@
namespace {
const std::string default_params_path = Hardware::PC() ? util::getenv_default("HOME", "/.comma/params", "/data/params")
const std::string default_params_path = Hardware::PC() || Hardware::JETSON() ? util::getenv_default("HOME", "/.comma/params", "/data/params")
: "/data/params";
const std::string persistent_params_path = Hardware::PC() ? default_params_path : "/persist/comma/params";
const std::string persistent_params_path = Hardware::PC() || Hardware::JETSON() ? default_params_path : "/persist/comma/params";
volatile sig_atomic_t params_do_exit = 0;
void params_sig_handler(int signal) {
@@ -217,6 +217,70 @@ std::unordered_map<std::string, uint32_t> keys = {
{"Offroad_UnofficialHardware", CLEAR_ON_MANAGER_START},
{"Offroad_NvmeMissing", CLEAR_ON_MANAGER_START},
{"ForcePowerDown", CLEAR_ON_MANAGER_START},
// dp
{"dp_atl", PERSISTENT},
{"dp_dashcamd", PERSISTENT},
{"dp_auto_shutdown", PERSISTENT},
{"dp_auto_shutdown_in", PERSISTENT},
{"dp_updated", PERSISTENT},
{"dp_logger", PERSISTENT},
{"dp_athenad", PERSISTENT},
{"dp_uploader", PERSISTENT},
{"dp_hotspot_on_boot", PERSISTENT},
{"dp_lateral_mode", PERSISTENT},
{"dp_signal_off_delay", PERSISTENT},
{"dp_lc_min_mph", PERSISTENT},
{"dp_lc_auto_cont", PERSISTENT},
{"dp_lc_auto_min_mph", PERSISTENT},
{"dp_lc_auto_delay", PERSISTENT},
{"dp_allow_gas", PERSISTENT},
{"dp_following_profile_ctrl", PERSISTENT},
{"dp_following_profile", PERSISTENT},
{"dp_accel_profile_ctrl", PERSISTENT},
{"dp_accel_profile", PERSISTENT},
{"dp_gear_check", PERSISTENT},
{"dp_speed_check", PERSISTENT},
{"dp_temp_monitor", PERSISTENT},
{"dp_ui_display_mode", PERSISTENT},
{"dp_ui_speed", PERSISTENT},
{"dp_ui_event", PERSISTENT},
{"dp_ui_max_speed", PERSISTENT},
{"dp_ui_face", PERSISTENT},
{"dp_ui_lane", PERSISTENT},
{"dp_ui_lead", PERSISTENT},
{"dp_ui_dev", PERSISTENT},
{"dp_ui_dev_mini", PERSISTENT},
{"dp_ui_blinker", PERSISTENT},
{"dp_ui_brightness", PERSISTENT},
{"dp_ui_volume", PERSISTENT},
{"dp_toyota_ldw", PERSISTENT},
{"dp_toyota_sng", PERSISTENT},
{"dp_toyota_zss", PERSISTENT},
{"dp_toyota_disable_relay", PERSISTENT},
{"dp_hkg_smart_mdps", PERSISTENT},
{"dp_honda_eps_mod", PERSISTENT},
{"dp_vw_panda", PERSISTENT},
{"dp_vw_timebomb_assist", PERSISTENT},
{"dp_fan_mode", PERSISTENT},
{"dp_last_modified", PERSISTENT},
{"dp_camera_offset", PERSISTENT},
{"dp_path_offset", PERSISTENT},
{"dp_locale", PERSISTENT},
{"dp_reg", PERSISTENT},
{"dp_sr_learner", PERSISTENT},
{"dp_sr_custom", PERSISTENT},
{"dp_sr_stock", PERSISTENT},
{"dp_lqr", PERSISTENT},
{"dp_reset_live_param_on_start", PERSISTENT},
{"dp_appd", PERSISTENT},
{"dp_jetson", PERSISTENT},
{"dp_car_assigned", PERSISTENT},
{"dp_car_list", PERSISTENT},
{"dp_no_batt", PERSISTENT},
{"dp_panda_fake_black", PERSISTENT},
{"dp_panda_no_gps", PERSISTENT},
{"dp_last_candidate", PERSISTENT},
{"dp_debug", PERSISTENT},
};
} // namespace
@@ -329,3 +393,7 @@ void Params::clearAll(ParamKeyType key_type) {
}
}
}
std::string Params::get_params_path() {
return default_params_path;
}
+1
View File
@@ -78,4 +78,5 @@ public:
inline int putBool(const std::string &key, bool val) {
return putBool(key.c_str(), val);
}
std::string get_params_path();
};
+2
View File
@@ -75,6 +75,8 @@ static void cloudlog_init() {
cloudlog_bind_locked("device", "eon");
} else if (Hardware::TICI()) {
cloudlog_bind_locked("device", "tici");
} else if (Hardware::JETSON()) {
cloudlog_bind_locked("device", "jetson");
} else {
cloudlog_bind_locked("device", "pc");
}
+1 -1
View File
@@ -1 +1 @@
#define COMMA_VERSION "0.8.5-d4ab1f1e2-2021-06-07T22:13:55"
#define COMMA_VERSION "0.8.5-dp-4"
+40 -21
View File
@@ -32,7 +32,7 @@ STEER_ANGLE_SATURATION_THRESHOLD = 2.5 # Degrees
SIMULATION = "SIMULATION" in os.environ
NOSENSOR = "NOSENSOR" in os.environ
IGNORE_PROCESSES = set(["rtshield", "uploader", "deleter", "loggerd", "logmessaged", "tombstoned", "logcatd", "proclogd", "clocksd", "updated", "timezoned", "manage_athenad"])
IGNORE_PROCESSES = set(["rtshield", "uploader", "deleter", "loggerd", "logmessaged", "tombstoned", "logcatd", "proclogd", "clocksd", "updated", "timezoned", "manage_athenad", "dragonConf"])
ThermalStatus = log.DeviceState.ThermalStatus
State = log.ControlsState.OpenpilotState
@@ -45,6 +45,9 @@ EventName = car.CarEvent.EventName
class Controls:
def __init__(self, sm=None, pm=None, can_sock=None):
params = Params()
self.dp_jetson = params.get_bool('dp_jetson')
self.dp_panda_no_gps = params.get_bool('dp_panda_no_gps')
config_realtime_process(4 if TICI else 3, Priority.CTRL_HIGH)
# Setup sockets
@@ -60,9 +63,13 @@ class Controls:
self.sm = sm
if self.sm is None:
ignore = ['driverCameraState', 'managerState'] if SIMULATION else None
if self.dp_jetson:
ignore = ['driverCameraState'] if ignore is None else ignore + ['driverCameraState']
if self.dp_panda_no_gps:
ignore = ['liveLocationKalman'] if ignore is None else ignore + ['liveLocationKalman']
self.sm = messaging.SubMaster(['deviceState', 'pandaState', 'modelV2', 'liveCalibration',
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman',
'managerState', 'liveParameters', 'radarState'] + self.camera_packets,
'managerState', 'liveParameters', 'radarState', 'dragonConf'] + self.camera_packets,
ignore_alive=ignore, ignore_avg_freq=['radarState', 'longitudinalPlan'])
self.can_sock = can_sock
@@ -80,7 +87,6 @@ class Controls:
self.CI, self.CP = get_car(self.can_sock, self.pm.sock['sendcan'])
# read params
params = Params()
self.is_metric = params.get_bool("IsMetric")
self.is_ldw_enabled = params.get_bool("IsLdwEnabled")
self.enable_lte_onroad = params.get_bool("EnableLteOnroad")
@@ -115,7 +121,9 @@ class Controls:
self.LoC = LongControl(self.CP, self.CI.compute_gb)
self.VM = VehicleModel(self.CP)
if self.CP.steerControlType == car.CarParams.SteerControlType.angle:
if params.get_bool('dp_lqr'):
self.LaC = LatControlLQR(self.CP)
elif self.CP.steerControlType == car.CarParams.SteerControlType.angle:
self.LaC = LatControlAngle(self.CP)
elif self.CP.lateralTuning.which() == 'pid':
self.LaC = LatControlPID(self.CP)
@@ -148,8 +156,8 @@ class Controls:
self.startup_event = get_startup_event(car_recognized, controller_available, self.CP.fuzzyFingerprint,
len(self.CP.carFw) > 0)
if not sounds_available:
self.events.add(EventName.soundsUnavailable, static=True)
# if not sounds_available:
# self.events.add(EventName.soundsUnavailable, static=True)
if community_feature_disallowed and car_recognized:
self.events.add(EventName.communityFeatureDisallowed, static=True)
if not car_recognized:
@@ -161,6 +169,11 @@ class Controls:
self.rk = Ratekeeper(100, print_delay_threshold=None)
self.prof = Profiler(False) # off by default
# dp
self.sm['dragonConf'].dpAtl = False
self.sm['dragonConf'].dpSrCustom = self.CP.steerRatio
self.sm['dragonConf'].dpSrLearner = True
def update_events(self, CS):
"""Compute carEvents from carState"""
@@ -179,9 +192,9 @@ class Controls:
return
# Create events for battery, temperature, disk space, and memory
if self.sm['deviceState'].batteryPercent < 1 and self.sm['deviceState'].chargingError:
# at zero percent battery, while discharging, OP should not allowed
self.events.add(EventName.lowBattery)
# if self.sm['deviceState'].batteryPercent < 1 and self.sm['deviceState'].chargingError:
# # at zero percent battery, while discharging, OP should not allowed
# self.events.add(EventName.lowBattery)
if self.sm['deviceState'].thermalStatus >= ThermalStatus.red:
self.events.add(EventName.overheat)
if self.sm['deviceState'].freeSpacePercent < 7:
@@ -215,15 +228,15 @@ class Controls:
self.events.add(EventName.laneChangeBlocked)
else:
if direction == LaneChangeDirection.left:
self.events.add(EventName.preLaneChangeLeft)
self.events.add(EventName.preLaneChangeLeftALC if self.sm['lateralPlan'].dpALCAllowed else EventName.preLaneChangeLeft)
else:
self.events.add(EventName.preLaneChangeRight)
self.events.add(EventName.preLaneChangeRightALC if self.sm['lateralPlan'].dpALCAllowed else EventName.preLaneChangeRight)
elif self.sm['lateralPlan'].laneChangeState in [LaneChangeState.laneChangeStarting,
LaneChangeState.laneChangeFinishing]:
self.events.add(EventName.laneChange)
if self.can_rcv_error or not CS.canValid:
self.events.add(EventName.canError)
self.events.add(EventName.pcmDisable if self.sm['dragonConf'].dpAtl else EventName.canError)
safety_mismatch = self.sm['pandaState'].safetyModel != self.CP.safetyModel or self.sm['pandaState'].safetyParam != self.CP.safetyParam
if safety_mismatch or self.mismatch_counter >= 200:
@@ -236,7 +249,7 @@ class Controls:
self.events.add(EventName.radarFault)
elif not self.sm.valid["pandaState"]:
self.events.add(EventName.usbError)
elif not self.sm.all_alive_and_valid():
elif not self.dp_jetson and not self.sm.all_alive_and_valid():
self.events.add(EventName.commIssue)
if not self.logged_comm_issue:
cloudlog.error(f"commIssue - valid: {self.sm.valid} - alive: {self.sm.alive}")
@@ -245,8 +258,8 @@ class Controls:
self.logged_comm_issue = False
if not self.sm['lateralPlan'].mpcSolutionValid:
self.events.add(EventName.plannerError)
if not self.sm['liveLocationKalman'].sensorsOK and not NOSENSOR:
self.events.add(EventName.steerTempUnavailableUserOverride if self.sm['dragonConf'].dpAtl else EventName.plannerError)
if not self.dp_panda_no_gps and not self.sm['liveLocationKalman'].sensorsOK and not NOSENSOR:
if self.sm.frame > 5 / DT_CTRL: # Give locationd some time to receive all the inputs
self.events.add(EventName.sensorDataInvalid)
if not self.sm['liveLocationKalman'].posenetOK:
@@ -280,16 +293,16 @@ class Controls:
# TODO: fix simulator
if not SIMULATION:
if not NOSENSOR:
if not self.dp_panda_no_gps and not NOSENSOR:
if not self.sm['liveLocationKalman'].gpsOK and (self.distance_traveled > 1000) and \
(not TICI or self.enable_lte_onroad):
# Not show in first 1 km to allow for driving out of garage. This event shows after 5 minutes
self.events.add(EventName.noGps)
if not self.sm.all_alive(self.camera_packets):
if not self.dp_jetson and not self.sm.all_alive(self.camera_packets):
self.events.add(EventName.cameraMalfunction)
if self.sm['modelV2'].frameDropPerc > 20:
self.events.add(EventName.modeldLagging)
if self.sm['liveLocationKalman'].excessiveResets:
if not self.dp_panda_no_gps and self.sm['liveLocationKalman'].excessiveResets:
self.events.add(EventName.localizerMalfunction)
# Check if all manager processes are running
@@ -298,7 +311,7 @@ class Controls:
self.events.add(EventName.processNotRunning)
# Only allow engagement with brake pressed when stopped behind another stopped car
if CS.brakePressed and self.sm['longitudinalPlan'].vTargetFuture >= STARTING_TARGET_SPEED \
if not self.sm['dragonConf'].dpAtl and CS.brakePressed and self.sm['longitudinalPlan'].vTargetFuture >= STARTING_TARGET_SPEED \
and self.CP.openpilotLongitudinalControl and CS.vEgo < 0.3:
self.events.add(EventName.noTarget)
@@ -307,7 +320,7 @@ class Controls:
# Update carState from CAN
can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True)
CS = self.CI.update(self.CC, can_strs)
CS = self.CI.update(self.CC, can_strs, self.sm['dragonConf'])
self.sm.update(0)
@@ -330,7 +343,7 @@ class Controls:
if not self.enabled:
self.mismatch_counter = 0
if not self.sm['pandaState'].controlsAllowed and self.enabled:
if not self.sm['dragonConf'].dpAtl and not self.sm['pandaState'].controlsAllowed and self.enabled:
self.mismatch_counter += 1
self.distance_traveled += CS.vEgo * DT_CTRL
@@ -421,6 +434,11 @@ class Controls:
params = self.sm['liveParameters']
x = max(params.stiffnessFactor, 0.1)
sr = max(params.steerRatio, 0.1)
if not self.sm['dragonConf'].dpSrLearner:
if self.sm['dragonConf'].dpSrCustom >= 10:
sr = self.sm['dragonConf'].dpSrCustom
else:
sr = self.CP.steerRatio
self.VM.update_params(x, sr)
lat_plan = self.sm['lateralPlan']
@@ -557,6 +575,7 @@ class Controls:
controlsState.enabled = self.enabled
controlsState.active = self.active
controlsState.curvature = curvature
controlsState.angleSteers = CS.steeringAngleDeg
controlsState.steeringAngleDesiredDeg = angle_steers_des
controlsState.state = self.state
controlsState.engageable = not self.events.any(ET.NO_ENTRY)
+207 -146
View File
@@ -1,3 +1,5 @@
# This Python file uses the following encoding: utf-8
# -*- coding: utf-8 -*-
from enum import IntEnum
from typing import Dict, Union, Callable, Any
@@ -6,6 +8,8 @@ import cereal.messaging as messaging
from common.realtime import DT_CTRL
from selfdrive.config import Conversions as CV
from selfdrive.locationd.calibrationd import MIN_SPEED_FILTER
from common.i18n import events
_ = events()
AlertSize = log.ControlsState.AlertSize
AlertStatus = log.ControlsState.AlertStatus
@@ -141,21 +145,21 @@ class Alert:
class NoEntryAlert(Alert):
def __init__(self, alert_text_2, audible_alert=AudibleAlert.chimeError,
visual_alert=VisualAlert.none, duration_hud_alert=2.):
super().__init__("openpilot Unavailable", alert_text_2, AlertStatus.normal,
super().__init__(_("openpilot Unavailable"), alert_text_2, AlertStatus.normal,
AlertSize.mid, Priority.LOW, visual_alert,
audible_alert, .4, duration_hud_alert, 3.)
class SoftDisableAlert(Alert):
def __init__(self, alert_text_2):
super().__init__("TAKE CONTROL IMMEDIATELY", alert_text_2,
super().__init__(_("TAKE CONTROL IMMEDIATELY"), alert_text_2,
AlertStatus.critical, AlertSize.full,
Priority.MID, VisualAlert.steerRequired,
AudibleAlert.chimeWarningRepeat, .1, 2., 2.),
class ImmediateDisableAlert(Alert):
def __init__(self, alert_text_2, alert_text_1="TAKE CONTROL IMMEDIATELY"):
def __init__(self, alert_text_2, alert_text_1=_("TAKE CONTROL IMMEDIATELY")):
super().__init__(alert_text_1, alert_text_2,
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.steerRequired,
@@ -180,8 +184,8 @@ def below_steer_speed_alert(CP: car.CarParams, sm: messaging.SubMaster, metric:
speed = int(round(CP.minSteerSpeed * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH)))
unit = "km/h" if metric else "mph"
return Alert(
"TAKE CONTROL",
"Steer Unavailable Below %d %s" % (speed, unit),
_("TAKE CONTROL"),
_("Steer Unavailable Below %(speed)d %(unit)s") % ({"speed": speed, "unit": unit}),
AlertStatus.userPrompt, AlertSize.mid,
Priority.MID, VisualAlert.steerRequired, AudibleAlert.none, 0., 0.4, .3)
@@ -189,23 +193,23 @@ def calibration_incomplete_alert(CP: car.CarParams, sm: messaging.SubMaster, met
speed = int(MIN_SPEED_FILTER * (CV.MS_TO_KPH if metric else CV.MS_TO_MPH))
unit = "km/h" if metric else "mph"
return Alert(
"Calibration in Progress: %d%%" % sm['liveCalibration'].calPerc,
"Drive Above %d %s" % (speed, unit),
_("Calibration in Progress: %d%%") % sm['liveCalibration'].calPerc,
_("Drive Above %(speed)d %(unit)s") % ({"speed": speed, "unit": unit}),
AlertStatus.normal, AlertSize.mid,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2)
def no_gps_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> Alert:
gps_integrated = sm['pandaState'].pandaType in [log.PandaState.PandaType.uno, log.PandaState.PandaType.dos]
return Alert(
"Poor GPS reception",
"If sky is visible, contact support" if gps_integrated else "Check GPS antenna placement",
_("Poor GPS reception"),
_("If sky is visible, contact support") if gps_integrated else _("Check GPS antenna placement"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2, creation_delay=300.)
def wrong_car_mode_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> Alert:
text = "Cruise Mode Disabled"
text = _("Cruise Mode Disabled")
if CP.carName == "honda":
text = "Main Switch Off"
text = _("Main Switch Off")
return NoEntryAlert(text, duration_hud_alert=0.)
def startup_fuzzy_fingerprint_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> Alert:
@@ -222,7 +226,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.joystickDebug: {
ET.PERMANENT: Alert(
"DEBUG ALERT",
_("DEBUG ALERT"),
"",
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1, .1, .1),
@@ -234,32 +238,32 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.startup: {
ET.PERMANENT: Alert(
"Be ready to take over at any time",
"Always keep hands on wheel and eyes on road",
_("Be ready to take over at any time"),
_("Always keep hands on wheel and eyes on road"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
},
EventName.startupMaster: {
ET.PERMANENT: Alert(
"WARNING: This branch is not tested",
"Always keep hands on wheel and eyes on road",
_("WARNING: This branch is not tested"),
_("Always keep hands on wheel and eyes on road"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
},
EventName.startupNoControl: {
ET.PERMANENT: Alert(
"Dashcam mode",
"Always keep hands on wheel and eyes on road",
_("Dashcam mode"),
_("Always keep hands on wheel and eyes on road"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
},
EventName.startupNoCar: {
ET.PERMANENT: Alert(
"Dashcam mode for unsupported car",
"Always keep hands on wheel and eyes on road",
_("Dashcam mode for unsupported car"),
_("Always keep hands on wheel and eyes on road"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., 15.),
},
@@ -286,8 +290,8 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.invalidLkasSetting: {
ET.PERMANENT: Alert(
"Stock LKAS is turned on",
"Turn off stock LKAS to engage",
_("Stock LKAS is turned on"),
_("Turn off stock LKAS to engage"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
},
@@ -295,24 +299,24 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.communityFeatureDisallowed: {
# LOW priority to overcome Cruise Error
ET.PERMANENT: Alert(
"openpilot Not Available",
"Enable Community Features in Settings to Engage",
_("openpilot Not Available"),
_("Enable Community Features in Settings to Engage"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
},
EventName.carUnrecognized: {
ET.PERMANENT: Alert(
"Dashcam Mode",
"Car Unrecognized",
_("Dashcam Mode"),
_("Car Unrecognized"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
},
EventName.stockAeb: {
ET.PERMANENT: Alert(
"BRAKE!",
"Stock AEB: Risk of Collision",
_("BRAKE!"),
_("Stock AEB: Risk of Collision"),
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 1., 2., 2.),
ET.NO_ENTRY: NoEntryAlert("Stock AEB: Risk of Collision"),
@@ -320,8 +324,8 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.stockFcw: {
ET.PERMANENT: Alert(
"BRAKE!",
"Stock FCW: Risk of Collision",
_("BRAKE!"),
_("Stock FCW: Risk of Collision"),
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 1., 2., 2.),
ET.NO_ENTRY: NoEntryAlert("Stock FCW: Risk of Collision"),
@@ -329,16 +333,16 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.fcw: {
ET.PERMANENT: Alert(
"BRAKE!",
"Risk of Collision",
_("BRAKE!"),
_("Risk of Collision"),
AlertStatus.critical, AlertSize.full,
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.chimeWarningRepeat, 1., 2., 2.),
},
EventName.ldw: {
ET.PERMANENT: Alert(
"TAKE CONTROL",
"Lane Departure Detected",
_("TAKE CONTROL"),
_("Lane Departure Detected"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 2., 3.),
},
@@ -347,7 +351,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.gasPressed: {
ET.PRE_ENABLE: Alert(
"openpilot will not brake while gas pressed",
_("openpilot will not brake while gas pressed"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .0, .0, .1, creation_delay=1.),
@@ -357,7 +361,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
ET.NO_ENTRY: NoEntryAlert("Vehicle Parameter Identification Failed"),
ET.SOFT_DISABLE: SoftDisableAlert("Vehicle Parameter Identification Failed"),
ET.WARNING: Alert(
"Vehicle Parameter Identification Failed",
_("Vehicle Parameter Identification Failed"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWEST, VisualAlert.steerRequired, AudibleAlert.none, .0, .0, .1),
@@ -365,7 +369,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.steerTempUnavailableUserOverride: {
ET.WARNING: Alert(
"Steering Temporarily Unavailable",
_("Steering Temporarily Unavailable"),
"",
AlertStatus.userPrompt, AlertSize.small,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 1., 1.),
@@ -373,7 +377,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.preDriverDistracted: {
ET.WARNING: Alert(
"KEEP EYES ON ROAD: Driver Distracted",
_("KEEP EYES ON ROAD: Driver Distracted"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1),
@@ -381,23 +385,23 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.promptDriverDistracted: {
ET.WARNING: Alert(
"KEEP EYES ON ROAD",
"Driver Distracted",
_("KEEP EYES ON ROAD"),
_("Driver Distracted"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarning2Repeat, .1, .1, .1),
},
EventName.driverDistracted: {
ET.WARNING: Alert(
"DISENGAGE IMMEDIATELY",
"Driver Distracted",
_("DISENGAGE IMMEDIATELY"),
_("Driver Distracted"),
AlertStatus.critical, AlertSize.full,
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
},
EventName.preDriverUnresponsive: {
ET.WARNING: Alert(
"TOUCH STEERING WHEEL: No Face Detected",
_("TOUCH STEERING WHEEL: No Face Detected"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
@@ -405,40 +409,40 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.promptDriverUnresponsive: {
ET.WARNING: Alert(
"TOUCH STEERING WHEEL",
"Driver Unresponsive",
_("TOUCH STEERING WHEEL"),
_("Driver Unresponsive"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.MID, VisualAlert.steerRequired, AudibleAlert.chimeWarning2Repeat, .1, .1, .1),
},
EventName.driverUnresponsive: {
ET.WARNING: Alert(
"DISENGAGE IMMEDIATELY",
"Driver Unresponsive",
_("DISENGAGE IMMEDIATELY"),
_("Driver Unresponsive"),
AlertStatus.critical, AlertSize.full,
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, .1, .1, .1),
},
EventName.driverMonitorLowAcc: {
ET.WARNING: Alert(
"CHECK DRIVER FACE VISIBILITY",
"Driver Monitoring Uncertain",
_("CHECK DRIVER FACE VISIBILITY"),
_("Driver Monitoring Uncertain"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .4, 0., 1.5),
},
EventName.manualRestart: {
ET.WARNING: Alert(
"TAKE CONTROL",
"Resume Driving Manually",
_("TAKE CONTROL"),
_("Resume Driving Manually"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
},
EventName.resumeRequired: {
ET.WARNING: Alert(
"STOPPED",
"Press Resume to Move",
_("STOPPED"),
_("Press Resume to Move"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
},
@@ -449,54 +453,54 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.preLaneChangeLeft: {
ET.WARNING: Alert(
"Steer Left to Start Lane Change",
"Monitor Other Vehicles",
_("Steer Left to Start Lane Change"),
_("Monitor Other Vehicles"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
},
EventName.preLaneChangeRight: {
ET.WARNING: Alert(
"Steer Right to Start Lane Change",
"Monitor Other Vehicles",
_("Steer Right to Start Lane Change"),
_("Monitor Other Vehicles"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1, alert_rate=0.75),
},
EventName.laneChangeBlocked: {
ET.WARNING: Alert(
"Car Detected in Blindspot",
"Monitor Other Vehicles",
_("Car Detected in Blindspot"),
_("Monitor Other Vehicles"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, .1, .1, .1),
},
EventName.laneChange: {
ET.WARNING: Alert(
"Changing Lane",
"Monitor Other Vehicles",
_("Changing Lane"),
_("Monitor Other Vehicles"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .0, .1, .1),
},
EventName.steerSaturated: {
ET.WARNING: Alert(
"TAKE CONTROL",
"Turn Exceeds Steering Limit",
_("TAKE CONTROL"),
_("Turn Exceeds Steering Limit"),
AlertStatus.userPrompt, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimePrompt, 1., 1., 1.),
},
EventName.fanMalfunction: {
ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Contact Support"),
ET.PERMANENT: NormalPermanentAlert(_("Fan Malfunction"), _("Contact Support")),
},
EventName.cameraMalfunction: {
ET.PERMANENT: NormalPermanentAlert("Camera Malfunction", "Contact Support"),
ET.PERMANENT: NormalPermanentAlert(_("Camera Malfunction"), _("Contact Support")),
},
EventName.gpsMalfunction: {
ET.PERMANENT: NormalPermanentAlert("GPS Malfunction", "Contact Support"),
ET.PERMANENT: NormalPermanentAlert(_("GPS Malfunction"), _("Contact Support")),
},
EventName.localizerMalfunction: {
@@ -523,17 +527,17 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.brakeHold: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
ET.NO_ENTRY: NoEntryAlert("Brake Hold Active"),
ET.NO_ENTRY: NoEntryAlert(_("Brake Hold Active")),
},
EventName.parkBrake: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
ET.NO_ENTRY: NoEntryAlert("Park Brake Engaged"),
ET.NO_ENTRY: NoEntryAlert(_("Park Brake Engaged")),
},
EventName.pedalPressed: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
ET.NO_ENTRY: NoEntryAlert("Pedal Pressed During Attempt",
ET.NO_ENTRY: NoEntryAlert(_("Pedal Pressed During Attempt"),
visual_alert=VisualAlert.brakePressed),
},
@@ -544,36 +548,36 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
EventName.wrongCruiseMode: {
ET.USER_DISABLE: EngagementAlert(AudibleAlert.chimeDisengage),
ET.NO_ENTRY: NoEntryAlert("Enable Adaptive Cruise"),
ET.NO_ENTRY: NoEntryAlert(_("Enable Adaptive Cruise")),
},
EventName.steerTempUnavailable: {
ET.SOFT_DISABLE: SoftDisableAlert("Steering Temporarily Unavailable"),
ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable",
ET.SOFT_DISABLE: SoftDisableAlert(_("Steering Temporarily Unavailable")),
ET.NO_ENTRY: NoEntryAlert(_("Steering Temporarily Unavailable"),
duration_hud_alert=0.),
},
EventName.outOfSpace: {
ET.PERMANENT: Alert(
"Out of Storage",
_("Out of Storage"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
ET.NO_ENTRY: NoEntryAlert("Out of Storage Space",
ET.NO_ENTRY: NoEntryAlert(_("Out of Storage Space"),
duration_hud_alert=0.),
},
EventName.belowEngageSpeed: {
ET.NO_ENTRY: NoEntryAlert("Speed Too Low"),
ET.NO_ENTRY: NoEntryAlert(_("Speed Too Low")),
},
EventName.sensorDataInvalid: {
ET.PERMANENT: Alert(
"No Data from Device Sensors",
"Reboot your Device",
_("No Data from Device Sensors"),
_("Reboot your Device"),
AlertStatus.normal, AlertSize.mid,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2, creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("No Data from Device Sensors"),
ET.NO_ENTRY: NoEntryAlert(_("No Data from Device Sensors")),
},
EventName.noGps: {
@@ -581,107 +585,107 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
},
EventName.soundsUnavailable: {
ET.PERMANENT: NormalPermanentAlert("Speaker not found", "Reboot your Device"),
ET.NO_ENTRY: NoEntryAlert("Speaker not found"),
ET.PERMANENT: NormalPermanentAlert(_("Speaker not found"), _("Reboot your Device")),
ET.NO_ENTRY: NoEntryAlert(_("Speaker not found")),
},
EventName.tooDistracted: {
ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"),
ET.NO_ENTRY: NoEntryAlert(_("Distraction Level Too High")),
},
EventName.overheat: {
ET.PERMANENT: Alert(
"System Overheated",
_("System Overheated"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
ET.SOFT_DISABLE: SoftDisableAlert("System Overheated"),
ET.NO_ENTRY: NoEntryAlert("System Overheated"),
ET.SOFT_DISABLE: SoftDisableAlert(_("System Overheated")),
ET.NO_ENTRY: NoEntryAlert(_("System Overheated")),
},
EventName.wrongGear: {
ET.SOFT_DISABLE: SoftDisableAlert("Gear not D"),
ET.NO_ENTRY: NoEntryAlert("Gear not D"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Gear not D")),
ET.NO_ENTRY: NoEntryAlert(_("Gear not D")),
},
EventName.calibrationInvalid: {
ET.PERMANENT: NormalPermanentAlert("Calibration Invalid", "Remount Device and Recalibrate"),
ET.SOFT_DISABLE: SoftDisableAlert("Calibration Invalid: Remount Device & Recalibrate"),
ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Remount Device & Recalibrate"),
ET.PERMANENT: NormalPermanentAlert(_("Calibration Invalid"), _("Remount Device and Recalibrate")),
ET.SOFT_DISABLE: SoftDisableAlert(_("Calibration Invalid: Remount Device & Recalibrate")),
ET.NO_ENTRY: NoEntryAlert(_("Calibration Invalid: Remount Device & Recalibrate")),
},
EventName.calibrationIncomplete: {
ET.PERMANENT: calibration_incomplete_alert,
ET.SOFT_DISABLE: SoftDisableAlert("Calibration in Progress"),
ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Calibration in Progress")),
ET.NO_ENTRY: NoEntryAlert(_("Calibration in Progress")),
},
EventName.doorOpen: {
ET.SOFT_DISABLE: SoftDisableAlert("Door Open"),
ET.NO_ENTRY: NoEntryAlert("Door Open"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Door Open")),
ET.NO_ENTRY: NoEntryAlert(_("Door Open")),
},
EventName.seatbeltNotLatched: {
ET.SOFT_DISABLE: SoftDisableAlert("Seatbelt Unlatched"),
ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Seatbelt Unlatched")),
ET.NO_ENTRY: NoEntryAlert(_("Seatbelt Unlatched")),
},
EventName.espDisabled: {
ET.SOFT_DISABLE: SoftDisableAlert("ESP Off"),
ET.NO_ENTRY: NoEntryAlert("ESP Off"),
ET.SOFT_DISABLE: SoftDisableAlert(_("ESP Off")),
ET.NO_ENTRY: NoEntryAlert(_("ESP Off")),
},
EventName.lowBattery: {
ET.SOFT_DISABLE: SoftDisableAlert("Low Battery"),
ET.NO_ENTRY: NoEntryAlert("Low Battery"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Low Battery")),
ET.NO_ENTRY: NoEntryAlert(_("Low Battery")),
},
EventName.commIssue: {
ET.SOFT_DISABLE: SoftDisableAlert("Communication Issue between Processes"),
ET.NO_ENTRY: NoEntryAlert("Communication Issue between Processes",
ET.SOFT_DISABLE: SoftDisableAlert(_("Communication Issue between Processes")),
ET.NO_ENTRY: NoEntryAlert(_("Communication Issue between Processes"),
audible_alert=AudibleAlert.chimeDisengage),
},
EventName.processNotRunning: {
ET.NO_ENTRY: NoEntryAlert("System Malfunction: Reboot Your Device",
ET.NO_ENTRY: NoEntryAlert(_("System Malfunction: Reboot Your Device"),
audible_alert=AudibleAlert.chimeDisengage),
},
EventName.radarFault: {
ET.SOFT_DISABLE: SoftDisableAlert("Radar Error: Restart the Car"),
ET.NO_ENTRY : NoEntryAlert("Radar Error: Restart the Car"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Radar Error: Restart the Car")),
ET.NO_ENTRY : NoEntryAlert(_("Radar Error: Restart the Car")),
},
EventName.modeldLagging: {
ET.SOFT_DISABLE: SoftDisableAlert("Driving model lagging"),
ET.NO_ENTRY : NoEntryAlert("Driving model lagging"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Driving model lagging")),
ET.NO_ENTRY : NoEntryAlert(_("Driving model lagging")),
},
EventName.posenetInvalid: {
ET.SOFT_DISABLE: SoftDisableAlert("Model Output Uncertain"),
ET.NO_ENTRY: NoEntryAlert("Model Output Uncertain"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Model Output Uncertain")),
ET.NO_ENTRY: NoEntryAlert(_("Model Output Uncertain")),
},
EventName.deviceFalling: {
ET.SOFT_DISABLE: SoftDisableAlert("Device Fell Off Mount"),
ET.NO_ENTRY: NoEntryAlert("Device Fell Off Mount"),
ET.SOFT_DISABLE: SoftDisableAlert(_("Device Fell Off Mount")),
ET.NO_ENTRY: NoEntryAlert(_("Device Fell Off Mount")),
},
EventName.lowMemory: {
ET.SOFT_DISABLE: SoftDisableAlert("Low Memory: Reboot Your Device"),
ET.PERMANENT: NormalPermanentAlert("Low Memory", "Reboot your Device"),
ET.NO_ENTRY : NoEntryAlert("Low Memory: Reboot Your Device",
ET.SOFT_DISABLE: SoftDisableAlert(_("Low Memory: Reboot Your Device")),
ET.PERMANENT: NormalPermanentAlert(_("Low Memory"), _("Reboot your Device")),
ET.NO_ENTRY : NoEntryAlert(_("Low Memory: Reboot Your Device"),
audible_alert=AudibleAlert.chimeDisengage),
},
EventName.accFaulted: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Faulted"),
ET.PERMANENT: NormalPermanentAlert("Cruise Faulted", ""),
ET.NO_ENTRY: NoEntryAlert("Cruise Faulted"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Cruise Faulted")),
ET.PERMANENT: NormalPermanentAlert(_("Cruise Faulted"), ""),
ET.NO_ENTRY: NoEntryAlert(_("Cruise Faulted")),
},
EventName.controlsMismatch: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Controls Mismatch")),
},
EventName.roadCameraError: {
@@ -706,97 +710,154 @@ EVENTS: Dict[int, Dict[str, Union[Alert, Callable[[Any, messaging.SubMaster, boo
},
EventName.canError: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Error: Check Connections"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("CAN Error: Check Connections")),
ET.PERMANENT: Alert(
"CAN Error: Check Connections",
_("CAN Error: Check Connections"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, 0., 0., .2, creation_delay=1.),
ET.NO_ENTRY: NoEntryAlert("CAN Error: Check Connections"),
ET.NO_ENTRY: NoEntryAlert(_("CAN Error: Check Connections")),
},
EventName.steerUnavailable: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("LKAS Fault: Restart the Car")),
ET.PERMANENT: Alert(
"LKAS Fault: Restart the car to engage",
_("LKAS Fault: Restart the car to engage"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"),
ET.NO_ENTRY: NoEntryAlert(_("LKAS Fault: Restart the Car")),
},
EventName.brakeUnavailable: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Cruise Fault: Restart the Car")),
ET.PERMANENT: Alert(
"Cruise Fault: Restart the car to engage",
_("Cruise Fault: Restart the car to engage"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
ET.NO_ENTRY: NoEntryAlert(_("Cruise Fault: Restart the Car")),
},
EventName.reverseGear: {
ET.PERMANENT: Alert(
"Reverse\nGear",
_("Reverse\nGear"),
"",
AlertStatus.normal, AlertSize.full,
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2, creation_delay=0.5),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Reverse Gear"),
ET.NO_ENTRY: NoEntryAlert("Reverse Gear"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Reverse Gear")),
ET.NO_ENTRY: NoEntryAlert(_("Reverse Gear")),
},
EventName.cruiseDisabled: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Is Off"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Cruise Is Off")),
},
EventName.plannerError: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Planner Solution Error"),
ET.NO_ENTRY: NoEntryAlert("Planner Solution Error"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Planner Solution Error")),
ET.NO_ENTRY: NoEntryAlert(_("Planner Solution Error")),
},
EventName.relayMalfunction: {
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Malfunction"),
ET.PERMANENT: NormalPermanentAlert("Harness Malfunction", "Check Hardware"),
ET.NO_ENTRY: NoEntryAlert("Harness Malfunction"),
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert(_("Harness Malfunction")),
ET.PERMANENT: NormalPermanentAlert(_("Harness Malfunction"), _("Check Hardware")),
ET.NO_ENTRY: NoEntryAlert(_("Harness Malfunction")),
},
EventName.noTarget: {
ET.IMMEDIATE_DISABLE: Alert(
"openpilot Canceled",
"No close lead car",
_("openpilot Canceled"),
_("No close lead car"),
AlertStatus.normal, AlertSize.mid,
Priority.HIGH, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
ET.NO_ENTRY : NoEntryAlert("No Close Lead Car"),
ET.NO_ENTRY : NoEntryAlert(_("No Close Lead Car")),
},
EventName.speedTooLow: {
ET.IMMEDIATE_DISABLE: Alert(
"openpilot Canceled",
"Speed too low",
_("openpilot Canceled"),
_("Speed too low"),
AlertStatus.normal, AlertSize.mid,
Priority.HIGH, VisualAlert.none, AudibleAlert.chimeDisengage, .4, 2., 3.),
},
EventName.speedTooHigh: {
ET.WARNING: Alert(
"Speed Too High",
"Model uncertain at this speed",
_("Speed Too High"),
_("Model uncertain at this speed"),
AlertStatus.normal, AlertSize.mid,
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.chimeWarningRepeat, 2.2, 3., 4.),
ET.NO_ENTRY: Alert(
"Speed Too High",
"Slow down to engage",
_("Speed Too High"),
_("Slow down to engage"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.),
},
EventName.lowSpeedLockout: {
ET.PERMANENT: Alert(
"Cruise Fault: Restart the car to engage",
_("Cruise Fault: Restart the car to engage"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2),
ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
ET.NO_ENTRY: NoEntryAlert(_("Cruise Fault: Restart the Car")),
},
# dp
EventName.preLaneChangeLeftALC: {
ET.WARNING: Alert(
_("Left ALC will start in 3s"),
_("Monitor Other Vehicles"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning2, .1, .1, .1, alert_rate=0.75),
},
EventName.preLaneChangeRightALC: {
ET.WARNING: Alert(
_("Right ALC will start in 3s"),
_("Monitor Other Vehicles"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning2, .1, .1, .1, alert_rate=0.75),
},
EventName.manualSteeringRequired: {
ET.WARNING: Alert(
_("STEERING REQUIRED: Lane Keeping OFF"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .0, .1, .1, alert_rate=0.25),
},
EventName.manualSteeringRequiredBlinkersOn: {
ET.WARNING: Alert(
_("STEERING REQUIRED: Blinkers ON"),
"",
AlertStatus.normal, AlertSize.small,
Priority.LOW, VisualAlert.none, AudibleAlert.none, .0, .1, .1, alert_rate=0.25),
},
# timebomb
EventName.timebombWarn: {
ET.WARNING: Alert(
_("WARNING"),
_("Grab wheel to start bypass"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 3.),
},
EventName.timebombBypassing: {
ET.WARNING: Alert(
_("BYPASSING"),
_("HOLD WHEEL"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, .4, 2., 3.),
},
EventName.timebombBypassed: {
ET.WARNING: Alert(
_("Bypassed!"),
_("Release wheel when ready"),
AlertStatus.normal, AlertSize.mid,
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.chimeWarning1, 3., 2., 3.),
},
}
+12
View File
@@ -41,6 +41,18 @@ class LanePlanner:
self.camera_offset = -CAMERA_OFFSET if wide_camera else CAMERA_OFFSET
self.path_offset = -PATH_OFFSET if wide_camera else PATH_OFFSET
self.dp_camera_offset = None
self.dp_path_offset = None
def update_dp_set_offsets(self, camera_offset, path_offset):
if self.dp_camera_offset != camera_offset:
self.dp_camera_offset = camera_offset
self.camera_offset = camera_offset / 100
if self.dp_path_offset != path_offset:
self.dp_path_offset = path_offset
self.path_offset = path_offset / 100
def parse_model(self, md):
if len(md.laneLines) == 4 and len(md.laneLines[0].t) == TRAJECTORY_SIZE:
self.ll_t = (np.array(md.laneLines[1].t) + np.array(md.laneLines[2].t))/2
+44 -2
View File
@@ -67,6 +67,13 @@ class LateralPlanner():
self.t_idxs = np.arange(TRAJECTORY_SIZE)
self.y_pts = np.zeros(TRAJECTORY_SIZE)
# dp
self.dp_lc_auto_allowed = False
self.dp_lc_auto_timer = None
self.dp_lc_auto_delay = 2.
self.dp_lc_auto_cont = False
self.dp_lc_auto_completed = False
def setup_mpc(self):
self.libmpc = libmpc_py.libmpc
self.libmpc.init()
@@ -87,6 +94,7 @@ class LateralPlanner():
v_ego = sm['carState'].vEgo
active = sm['controlsState'].active
measured_curvature = sm['controlsState'].curvature
self.LP.update_dp_set_offsets(sm['dragonConf'].dpCameraOffset, sm['dragonConf'].dpPathOffset)
md = sm['modelV2']
self.LP.parse_model(sm['modelV2'])
@@ -99,7 +107,7 @@ class LateralPlanner():
# Lane change logic
one_blinker = sm['carState'].leftBlinker != sm['carState'].rightBlinker
below_lane_change_speed = v_ego < LANE_CHANGE_SPEED_MIN
below_lane_change_speed = v_ego < (sm['dragonConf'].dpLcMinMph * CV.MPH_TO_MS)
if (not active) or (self.lane_change_timer > LANE_CHANGE_TIME_MAX):
self.lane_change_state = LaneChangeState.off
@@ -110,6 +118,20 @@ class LateralPlanner():
self.lane_change_state = LaneChangeState.preLaneChange
self.lane_change_ll_prob = 1.0
# dp alc
cur_time = sec_since_boot()
if not below_lane_change_speed and sm['dragonConf'].dpLateralMode == 2 and v_ego >= (sm['dragonConf'].dpLcAutoMinMph * CV.MPH_TO_MS):
# we allow auto lc when speed reached dragon_auto_lc_min_mph
self.dp_lc_auto_allowed = True
else:
# if too slow, we reset all the variables
self.dp_lc_auto_allowed = False
self.dp_lc_auto_timer = None
# disable auto lc when continuous is off and already did auto lc once
if self.dp_lc_auto_allowed and not sm['dragonConf'].dpLcAutoCont and self.dp_lc_auto_completed:
self.dp_lc_auto_allowed = False
# LaneChangeState.preLaneChange
elif self.lane_change_state == LaneChangeState.preLaneChange:
# Set lane change direction
@@ -127,6 +149,19 @@ class LateralPlanner():
blindspot_detected = ((sm['carState'].leftBlindspot and self.lane_change_direction == LaneChangeDirection.left) or
(sm['carState'].rightBlindspot and self.lane_change_direction == LaneChangeDirection.right))
# dp alc
if self.dp_lc_auto_allowed:
if self.dp_lc_auto_timer is None:
self.dp_lc_auto_timer = cur_time + sm['dragonConf'].dpLcAutoDelay
elif cur_time >= self.dp_lc_auto_timer:
# if timer is up, we set torque_applied to True to fake user input
torque_applied = True
self.dp_lc_auto_completed = True
# we reset the timers when torque is applied regardless
if torque_applied and not blindspot_detected:
self.dp_lc_auto_timer = None
if not one_blinker or below_lane_change_speed:
self.lane_change_state = LaneChangeState.off
elif torque_applied and not blindspot_detected:
@@ -151,11 +186,17 @@ class LateralPlanner():
elif self.lane_change_ll_prob > 0.99:
self.lane_change_state = LaneChangeState.off
# dp when finishing, we reset timer to none.
self.dp_lc_auto_timer = None
if self.lane_change_state in [LaneChangeState.off, LaneChangeState.preLaneChange]:
self.lane_change_timer = 0.0
else:
self.lane_change_timer += DT_MDL
if self.prev_one_blinker and not one_blinker:
self.dp_lc_auto_completed = False
self.prev_one_blinker = one_blinker
self.desire = DESIRES[self.lane_change_direction][self.lane_change_state]
@@ -231,7 +272,7 @@ class LateralPlanner():
def publish(self, sm, pm):
plan_solution_valid = self.solution_invalid_cnt < 2
plan_send = messaging.new_message('lateralPlan')
plan_send.valid = sm.all_alive_and_valid(service_list=['carState', 'controlsState', 'modelV2'])
plan_send.valid = sm.all_alive_and_valid(service_list=['carState', 'controlsState', 'modelV2', 'dragonConf'])
plan_send.lateralPlan.laneWidth = float(self.LP.lane_width)
plan_send.lateralPlan.dPathPoints = [float(x) for x in self.y_pts]
plan_send.lateralPlan.lProb = float(self.LP.lll_prob)
@@ -248,6 +289,7 @@ class LateralPlanner():
plan_send.lateralPlan.desire = self.desire
plan_send.lateralPlan.laneChangeState = self.lane_change_state
plan_send.lateralPlan.laneChangeDirection = self.lane_change_direction
plan_send.lateralPlan.dpALCAllowed = self.dp_lc_auto_allowed
pm.send('lateralPlan', plan_send)
+2 -2
View File
@@ -59,7 +59,7 @@ class LongitudinalMpc():
self.cur_state[0].v_ego = v
self.cur_state[0].a_ego = a
def update(self, CS, lead):
def update(self, CS, lead, dp_following_distance=1.8):
v_ego = CS.vEgo
# Setup current mpc state
@@ -94,7 +94,7 @@ class LongitudinalMpc():
# Calculate mpc
t = sec_since_boot()
self.n_its = self.libmpc.run_mpc(self.cur_state, self.mpc_solution, self.a_lead_tau, a_lead)
self.n_its = self.libmpc.run_mpc(self.cur_state, self.mpc_solution, self.a_lead_tau, a_lead, dp_following_distance)
self.duration = int((sec_since_boot() - t) * 1e9)
# Get solution. MPC timestep is 0.2 s, so interpolation to 0.05 s is needed
@@ -68,7 +68,7 @@ acadoWorkspace.evGu[lRun1 * 3 + 2] = acadoWorkspace.state[14];
return ret;
}
void acado_evaluateLSQ(const real_t* in, real_t* out)
void acado_evaluateLSQ(const real_t* in, real_t* out, double TR)
{
const real_t* xd = in;
const real_t* u = in + 3;
@@ -78,29 +78,29 @@ real_t* a = acadoWorkspace.objAuxVar;
/* Compute intermediate quantities: */
a[0] = (sqrt((xd[1]+(real_t)(5.0000000000000000e-01))));
a[1] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[1] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[2] = ((real_t)(1.0000000000000000e+00)/(a[0]+(real_t)(1.0000000000000001e-01)));
a[3] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[3] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[4] = (((real_t)(2.9999999999999999e-01)*(((real_t)(0.0000000000000000e+00)-((real_t)(0.0000000000000000e+00)-(real_t)(1.0000000000000000e+00)))*a[2]))*a[3]);
a[5] = ((real_t)(1.0000000000000000e+00)/(real_t)(1.9620000000000001e+01));
a[6] = (1.0/sqrt((xd[1]+(real_t)(5.0000000000000000e-01))));
a[7] = (a[6]*(real_t)(5.0000000000000000e-01));
a[8] = (a[2]*a[2]);
a[9] = (((real_t)(2.9999999999999999e-01)*(((((real_t)(1.8000000000000000e+00)-((real_t)(-1.8000000000000000e+00)))+((xd[1]+xd[1])*a[5]))*a[2])-((((((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))*a[7])*a[8])))*a[3]);
a[9] = (((real_t)(2.9999999999999999e-01)*(((((real_t)(TR)-((real_t)(-TR)))+((xd[1]+xd[1])*a[5]))*a[2])-((((((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))*a[7])*a[8])))*a[3]);
a[10] = ((real_t)(1.0000000000000000e+00)/(((real_t)(5.0000000000000003e-02)*xd[1])+(real_t)(5.0000000000000000e-01)));
a[11] = ((real_t)(1.0000000000000000e+00)/(real_t)(1.9620000000000001e+01));
a[12] = (a[10]*a[10]);
/* Compute outputs: */
out[0] = (a[1]-(real_t)(1.0000000000000000e+00));
out[1] = (((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))/(((real_t)(5.0000000000000003e-02)*xd[1])+(real_t)(5.0000000000000000e-01)));
out[1] = (((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))/(((real_t)(5.0000000000000003e-02)*xd[1])+(real_t)(5.0000000000000000e-01)));
out[2] = (xd[2]*(((real_t)(1.0000000000000001e-01)*xd[1])+(real_t)(1.0000000000000000e+00)));
out[3] = (u[0]*(((real_t)(1.0000000000000001e-01)*xd[1])+(real_t)(1.0000000000000000e+00)));
out[4] = a[4];
out[5] = a[9];
out[6] = (real_t)(0.0000000000000000e+00);
out[7] = (((real_t)(0.0000000000000000e+00)-(real_t)(1.0000000000000000e+00))*a[10]);
out[8] = ((((real_t)(0.0000000000000000e+00)-(((real_t)(1.8000000000000000e+00)-((real_t)(-1.8000000000000000e+00)))+((xd[1]+xd[1])*a[11])))*a[10])-((((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))*(real_t)(5.0000000000000003e-02))*a[12]));
out[8] = ((((real_t)(0.0000000000000000e+00)-(((real_t)(TR)-((real_t)(-TR)))+((xd[1]+xd[1])*a[11])))*a[10])-((((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))*(real_t)(5.0000000000000003e-02))*a[12]));
out[9] = (real_t)(0.0000000000000000e+00);
out[10] = (real_t)(0.0000000000000000e+00);
out[11] = (xd[2]*(real_t)(1.0000000000000001e-01));
@@ -114,7 +114,7 @@ out[18] = (real_t)(0.0000000000000000e+00);
out[19] = (((real_t)(1.0000000000000001e-01)*xd[1])+(real_t)(1.0000000000000000e+00));
}
void acado_evaluateLSQEndTerm(const real_t* in, real_t* out)
void acado_evaluateLSQEndTerm(const real_t* in, real_t* out, double TR)
{
const real_t* xd = in;
const real_t* od = in + 3;
@@ -123,28 +123,28 @@ real_t* a = acadoWorkspace.objAuxVar;
/* Compute intermediate quantities: */
a[0] = (sqrt((xd[1]+(real_t)(5.0000000000000000e-01))));
a[1] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[1] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[2] = ((real_t)(1.0000000000000000e+00)/(a[0]+(real_t)(1.0000000000000001e-01)));
a[3] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[3] = (exp(((real_t)(2.9999999999999999e-01)*(((((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))/(a[0]+(real_t)(1.0000000000000001e-01))))));
a[4] = (((real_t)(2.9999999999999999e-01)*(((real_t)(0.0000000000000000e+00)-((real_t)(0.0000000000000000e+00)-(real_t)(1.0000000000000000e+00)))*a[2]))*a[3]);
a[5] = ((real_t)(1.0000000000000000e+00)/(real_t)(1.9620000000000001e+01));
a[6] = (1.0/sqrt((xd[1]+(real_t)(5.0000000000000000e-01))));
a[7] = (a[6]*(real_t)(5.0000000000000000e-01));
a[8] = (a[2]*a[2]);
a[9] = (((real_t)(2.9999999999999999e-01)*(((((real_t)(1.8000000000000000e+00)-((real_t)(-1.8000000000000000e+00)))+((xd[1]+xd[1])*a[5]))*a[2])-((((((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))*a[7])*a[8])))*a[3]);
a[9] = (((real_t)(2.9999999999999999e-01)*(((((real_t)(TR)-((real_t)(-TR)))+((xd[1]+xd[1])*a[5]))*a[2])-((((((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))+(real_t)(4.0000000000000000e+00))-(od[0]-xd[0]))*a[7])*a[8])))*a[3]);
a[10] = ((real_t)(1.0000000000000000e+00)/(((real_t)(5.0000000000000003e-02)*xd[1])+(real_t)(5.0000000000000000e-01)));
a[11] = ((real_t)(1.0000000000000000e+00)/(real_t)(1.9620000000000001e+01));
a[12] = (a[10]*a[10]);
/* Compute outputs: */
out[0] = (a[1]-(real_t)(1.0000000000000000e+00));
out[1] = (((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))/(((real_t)(5.0000000000000003e-02)*xd[1])+(real_t)(5.0000000000000000e-01)));
out[1] = (((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))/(((real_t)(5.0000000000000003e-02)*xd[1])+(real_t)(5.0000000000000000e-01)));
out[2] = (xd[2]*(((real_t)(1.0000000000000001e-01)*xd[1])+(real_t)(1.0000000000000000e+00)));
out[3] = a[4];
out[4] = a[9];
out[5] = (real_t)(0.0000000000000000e+00);
out[6] = (((real_t)(0.0000000000000000e+00)-(real_t)(1.0000000000000000e+00))*a[10]);
out[7] = ((((real_t)(0.0000000000000000e+00)-(((real_t)(1.8000000000000000e+00)-((real_t)(-1.8000000000000000e+00)))+((xd[1]+xd[1])*a[11])))*a[10])-((((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(1.8000000000000000e+00))-((od[1]-xd[1])*(real_t)(1.8000000000000000e+00)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))*(real_t)(5.0000000000000003e-02))*a[12]));
out[7] = ((((real_t)(0.0000000000000000e+00)-(((real_t)(TR)-((real_t)(-TR)))+((xd[1]+xd[1])*a[11])))*a[10])-((((od[0]-xd[0])-((real_t)(4.0000000000000000e+00)+((((xd[1]*(real_t)(TR))-((od[1]-xd[1])*(real_t)(TR)))+((xd[1]*xd[1])/(real_t)(1.9620000000000001e+01)))-((od[1]*od[1])/(real_t)(1.9620000000000001e+01)))))*(real_t)(5.0000000000000003e-02))*a[12]));
out[8] = (real_t)(0.0000000000000000e+00);
out[9] = (real_t)(0.0000000000000000e+00);
out[10] = (xd[2]*(real_t)(1.0000000000000001e-01));
@@ -207,7 +207,7 @@ tmpQN1[7] = + tmpQN2[6]*tmpFx[1] + tmpQN2[7]*tmpFx[4] + tmpQN2[8]*tmpFx[7];
tmpQN1[8] = + tmpQN2[6]*tmpFx[2] + tmpQN2[7]*tmpFx[5] + tmpQN2[8]*tmpFx[8];
}
void acado_evaluateObjective( )
void acado_evaluateObjective( double TR )
{
int runObj;
for (runObj = 0; runObj < 20; ++runObj)
@@ -219,7 +219,7 @@ acadoWorkspace.objValueIn[3] = acadoVariables.u[runObj];
acadoWorkspace.objValueIn[4] = acadoVariables.od[runObj * 2];
acadoWorkspace.objValueIn[5] = acadoVariables.od[runObj * 2 + 1];
acado_evaluateLSQ( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut );
acado_evaluateLSQ( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut, TR );
acadoWorkspace.Dy[runObj * 4] = acadoWorkspace.objValueOut[0];
acadoWorkspace.Dy[runObj * 4 + 1] = acadoWorkspace.objValueOut[1];
acadoWorkspace.Dy[runObj * 4 + 2] = acadoWorkspace.objValueOut[2];
@@ -235,7 +235,7 @@ acadoWorkspace.objValueIn[1] = acadoVariables.x[61];
acadoWorkspace.objValueIn[2] = acadoVariables.x[62];
acadoWorkspace.objValueIn[3] = acadoVariables.od[40];
acadoWorkspace.objValueIn[4] = acadoVariables.od[41];
acado_evaluateLSQEndTerm( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut );
acado_evaluateLSQEndTerm( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut, TR );
acadoWorkspace.DyN[0] = acadoWorkspace.objValueOut[0];
acadoWorkspace.DyN[1] = acadoWorkspace.objValueOut[1];
@@ -4589,12 +4589,12 @@ acado_multEDu( &(acadoWorkspace.E[ 624 ]), &(acadoWorkspace.x[ 21 ]), &(acadoVar
acado_multEDu( &(acadoWorkspace.E[ 627 ]), &(acadoWorkspace.x[ 22 ]), &(acadoVariables.x[ 60 ]) );
}
int acado_preparationStep( )
int acado_preparationStep( double TR )
{
int ret;
ret = acado_modelSimulation();
acado_evaluateObjective( );
acado_evaluateObjective( TR );
acado_condensePrep( );
return ret;
}
@@ -4726,7 +4726,7 @@ kkt += fabs(acadoWorkspace.ubA[index] * prd);
return kkt;
}
real_t acado_getObjective( )
real_t acado_getObjective( TR )
{
real_t objVal;
@@ -4746,7 +4746,7 @@ acadoWorkspace.objValueIn[3] = acadoVariables.u[lRun1];
acadoWorkspace.objValueIn[4] = acadoVariables.od[lRun1 * 2];
acadoWorkspace.objValueIn[5] = acadoVariables.od[lRun1 * 2 + 1];
acado_evaluateLSQ( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut );
acado_evaluateLSQ( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut, TR );
acadoWorkspace.Dy[lRun1 * 4] = acadoWorkspace.objValueOut[0] - acadoVariables.y[lRun1 * 4];
acadoWorkspace.Dy[lRun1 * 4 + 1] = acadoWorkspace.objValueOut[1] - acadoVariables.y[lRun1 * 4 + 1];
acadoWorkspace.Dy[lRun1 * 4 + 2] = acadoWorkspace.objValueOut[2] - acadoVariables.y[lRun1 * 4 + 2];
@@ -4757,7 +4757,7 @@ acadoWorkspace.objValueIn[1] = acadoVariables.x[61];
acadoWorkspace.objValueIn[2] = acadoVariables.x[62];
acadoWorkspace.objValueIn[3] = acadoVariables.od[40];
acadoWorkspace.objValueIn[4] = acadoVariables.od[41];
acado_evaluateLSQEndTerm( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut );
acado_evaluateLSQEndTerm( acadoWorkspace.objValueIn, acadoWorkspace.objValueOut, TR );
acadoWorkspace.DyN[0] = acadoWorkspace.objValueOut[0] - acadoVariables.yN[0];
acadoWorkspace.DyN[1] = acadoWorkspace.objValueOut[1] - acadoVariables.yN[1];
acadoWorkspace.DyN[2] = acadoWorkspace.objValueOut[2] - acadoVariables.yN[2];
@@ -29,8 +29,9 @@ def _get_libmpc(mpc_id):
void init(double ttcCost, double distanceCost, double accelerationCost, double jerkCost);
void init_with_simulation(double v_ego, double x_l, double v_l, double a_l, double l);
void change_tr(double ttcCost, double distanceCost, double accelerationCost, double jerkCost);
int run_mpc(state_t * x0, log_t * solution,
double l, double a_l_0);
double l, double a_l_0, double TR);
""")
return (ffi, ffi.dlopen(libmpc_fn))
@@ -68,6 +68,25 @@ void init(double ttcCost, double distanceCost, double accelerationCost, double j
}
void change_tr(double ttcCost, double distanceCost, double accelerationCost, double jerkCost){
int i;
const int STEP_MULTIPLIER = 3;
for (i = 0; i < N; i++) {
int f = 1;
if (i > 4){
f = STEP_MULTIPLIER;
}
acadoVariables.W[16 * i + 0] = ttcCost * f; // exponential cost for time-to-collision (ttc)
acadoVariables.W[16 * i + 5] = distanceCost * f; // desired distance
acadoVariables.W[16 * i + 10] = accelerationCost * f; // acceleration
acadoVariables.W[16 * i + 15] = jerkCost * f; // jerk
}
acadoVariables.WN[0] = ttcCost * STEP_MULTIPLIER; // exponential cost for danger zone
acadoVariables.WN[4] = distanceCost * STEP_MULTIPLIER; // desired distance
acadoVariables.WN[8] = accelerationCost * STEP_MULTIPLIER; // acceleration
}
void init_with_simulation(double v_ego, double x_l_0, double v_l_0, double a_l_0, double l){
int i;
@@ -112,7 +131,7 @@ void init_with_simulation(double v_ego, double x_l_0, double v_l_0, double a_l_0
for (i = 0; i < NYN; ++i) acadoVariables.yN[ i ] = 0.0;
}
int run_mpc(state_t * x0, log_t * solution, double l, double a_l_0){
int run_mpc(state_t * x0, log_t * solution, double l, double a_l_0, double TR){
// Calculate lead vehicle predictions
int i;
double t = 0.;
@@ -152,7 +171,7 @@ int run_mpc(state_t * x0, log_t * solution, double l, double a_l_0){
acadoVariables.x[1] = acadoVariables.x0[1] = x0->v_ego;
acadoVariables.x[2] = acadoVariables.x0[2] = x0->a_ego;
acado_preparationStep();
acado_preparationStep(TR);
acado_feedbackStep();
for (i = 0; i <= N; i++){
@@ -164,7 +183,7 @@ int run_mpc(state_t * x0, log_t * solution, double l, double a_l_0){
solution->j_ego[i] = acadoVariables.u[i];
}
}
solution->cost = acado_getObjective();
solution->cost = acado_getObjective(TR);
// Dont shift states here. Current solution is closer to next timestep than if
// we shift by 0.2 seconds.
+69 -4
View File
@@ -32,6 +32,49 @@ _A_CRUISE_MAX_BP = [0., 6.4, 22.5, 40.]
_A_TOTAL_MAX_V = [1.7, 3.2]
_A_TOTAL_MAX_BP = [20., 40.]
# dp
DP_FOLLOWING_DIST = {
0: 1.8,
1: 1.5,
2: 1.2,
}
DP_ACCEL_ECO = 0
DP_ACCEL_NORMAL = 1
DP_ACCEL_SPORT = 2
# accel profile by @arne182
_DP_CRUISE_MIN_V = [-2.0, -1.5, -1.0, -0.7, -0.5]
_DP_CRUISE_MIN_V_ECO = [-1.0, -0.7, -0.6, -0.5, -0.3]
_DP_CRUISE_MIN_V_SPORT = [-3.0, -2.6, -2.3, -2.0, -1.0]
_DP_CRUISE_MIN_V_FOLLOWING = [-4.0, -4.0, -3.5, -2.5, -2.0]
_DP_CRUISE_MIN_BP = [0.0, 5.0, 10.0, 20.0, 55.0]
_DP_CRUISE_MAX_V = [2.0, 2.0, 1.5, .5, .3]
_DP_CRUISE_MAX_V_ECO = [0.8, 0.9, 1.0, 0.4, 0.2]
_DP_CRUISE_MAX_V_SPORT = [3.0, 3.5, 3.0, 2.0, 2.0]
_DP_CRUISE_MAX_V_FOLLOWING = [1.6, 1.4, 1.4, .7, .3]
_DP_CRUISE_MAX_BP = [0., 5., 10., 20., 55.]
# Lookup table for turns
_DP_TOTAL_MAX_V = [3.3, 3.0, 3.9]
_DP_TOTAL_MAX_BP = [0., 25., 55.]
def dp_calc_cruise_accel_limits(v_ego, following, dp_profile):
if following:
a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, _DP_CRUISE_MIN_V_FOLLOWING)
a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, _DP_CRUISE_MAX_V_FOLLOWING)
else:
if dp_profile == DP_ACCEL_ECO:
a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, _DP_CRUISE_MIN_V_ECO)
a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, _DP_CRUISE_MAX_V_ECO)
elif dp_profile == DP_ACCEL_SPORT:
a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, _DP_CRUISE_MIN_V_SPORT)
a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, _DP_CRUISE_MAX_V_SPORT)
else:
a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, _DP_CRUISE_MIN_V)
a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, _DP_CRUISE_MAX_V)
return np.vstack([a_cruise_min, a_cruise_max])
def calc_cruise_accel_limits(v_ego, following):
a_cruise_min = interp(v_ego, _A_CRUISE_MIN_BP, _A_CRUISE_MIN_V)
@@ -83,6 +126,13 @@ class Planner():
self.params = Params()
self.first_loop = True
# dp
self.dp_accel_profile_ctrl = False
self.dp_accel_profile = DP_ACCEL_ECO
self.dp_following_profile_ctrl = False
self.dp_following_profile = 0
self.dp_following_dist = 1.8 # default val
def choose_solution(self, v_cruise_setpoint, enabled):
if enabled:
solutions = {'cruise': self.v_cruise}
@@ -128,9 +178,21 @@ class Planner():
self.v_acc_start = self.v_acc_next
self.a_acc_start = self.a_acc_next
# dp
self.dp_accel_profile_ctrl = sm['dragonConf'].dpAccelProfileCtrl
self.dp_accel_profile = sm['dragonConf'].dpAccelProfile
self.dp_following_profile_ctrl = sm['dragonConf'].dpAccelProfileCtrl
self.dp_following_profile = sm['dragonConf'].dpFollowingProfile
self.dp_following_dist = DP_FOLLOWING_DIST[0 if not self.dp_following_profile_ctrl else self.dp_following_profile]
# dp - slow on curve from 0.7.6.1
# Calculate speed for normal cruise control
if enabled and not self.first_loop and not sm['carState'].gasPressed:
accel_limits = [float(x) for x in calc_cruise_accel_limits(v_ego, following)]
pedal_pressed = sm['carState'].gasPressed or sm['carState'].brakePressed
if enabled and not self.first_loop and not pedal_pressed:
if not self.dp_accel_profile_ctrl:
accel_limits = [float(x) for x in calc_cruise_accel_limits(v_ego, following)]
else:
accel_limits = [float(x) for x in dp_calc_cruise_accel_limits(v_ego, following, self.dp_accel_profile)]
jerk_limits = [min(-0.1, accel_limits[0]), max(0.1, accel_limits[1])] # TODO: make a separate lookup for jerk tuning
accel_limits_turns = limit_accel_in_turns(v_ego, sm['carState'].steeringAngleDeg, accel_limits, self.CP)
@@ -158,12 +220,15 @@ class Planner():
self.a_acc_start = reset_accel
self.v_cruise = reset_speed
self.a_cruise = reset_accel
# dp reset
self.v_model = reset_speed
self.a_model = reset_accel
self.mpc1.set_cur_state(self.v_acc_start, self.a_acc_start)
self.mpc2.set_cur_state(self.v_acc_start, self.a_acc_start)
self.mpc1.update(sm['carState'], lead_1)
self.mpc2.update(sm['carState'], lead_2)
self.mpc1.update(sm['carState'], lead_1, self.dp_following_dist)
self.mpc2.update(sm['carState'], lead_2, self.dp_following_dist)
self.choose_solution(v_cruise_setpoint, enabled)
+1
View File
@@ -18,6 +18,7 @@ import numpy as np
from numpy.linalg import solve
from cereal import car
from common.params import Params
class VehicleModel:
def __init__(self, CP: car.CarParams):
+1 -1
View File
@@ -26,7 +26,7 @@ def plannerd_thread(sm=None, pm=None):
lateral_planner = LateralPlanner(CP, use_lanelines=use_lanelines, wide_camera=wide_camera)
if sm is None:
sm = messaging.SubMaster(['carState', 'controlsState', 'radarState', 'modelV2'],
sm = messaging.SubMaster(['carState', 'controlsState', 'radarState', 'modelV2', 'dragonConf'],
poll=['radarState', 'modelV2'], ignore_avg_freq=['radarState'])
if pm is None:
+1 -1
View File
@@ -199,7 +199,7 @@ def radard_thread(sm=None, pm=None, can_sock=None):
RD = RadarD(CP.radarTimeStep, RI.delay)
# TODO: always log leads once we can hide them conditionally
enable_lead = CP.openpilotLongitudinalControl or not CP.radarOffCan
enable_lead = True #CP.openpilotLongitudinalControl or not CP.radarOffCan
while 1:
can_strings = messaging.drain_sock_raw(can_sock, wait_for_one=True)
+1 -1
View File
@@ -22,6 +22,6 @@ def bind_extra(**kwargs) -> None:
sentry_sdk.set_tag(k, v)
def init() -> None:
sentry_sdk.init("https://a8dc76b5bfb34908a601d67e2aa8bcf9@o33823.ingest.sentry.io/77924",
sentry_sdk.init("https://980a0cba712a4c3593c33c78a12446e1:fecab286bcaf4dba8b04f7cff0188e2d@sentry.io/1488600",
default_integrations=False, integrations=[ThreadingIntegration(propagate_hub=True)],
release=version)
+10
View File
@@ -0,0 +1,10 @@
What is appd
------
Appd is a service that runs specific android apps when on road, and then close the when offroad.
How to use appd
------
1. Create a folder: /sdcard/appd/
2. Place apks in /sdcard/appd/
3. Copy /data/openpilot/dragonpilot/appd_example.json over to /sdcard/appd/ and rename to appd.json
4. Update appd.json as per example.
+21
View File
@@ -0,0 +1,21 @@
The MIT License
Copyright (c) 2019-, Rick Lan, dragonpilot community, and a number of other of contributors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+56
View File
@@ -0,0 +1,56 @@
#!/usr/bin/env python3.8
import subprocess
import os
import json
FILE = '/sdcard/appd/appd.json'
class Appd():
def __init__(self):
self.started = False
if os.path.exists(FILE):
with open(FILE) as f:
self.app_data = json.load(f)
else:
self.app_data = None
def run(self, started):
if self.app_data is not None:
if started:
if not self.started:
self.started = True
self.onroad()
else:
if self.started:
self.started = False
self.offroad()
def onroad(self):
for app in self.app_data:
if not self.installed(app['app']) and os.path.exists(app['apk']):
self.system("pm install -r %s" % app['apk'])
for cmd in app['onroad_cmd']:
self.system(cmd)
def offroad(self):
for app in self.app_data:
if self.installed(app['app']):
for cmd in app['offroad_cmd']:
self.system(cmd)
def installed(self, app_name):
try:
result = subprocess.check_output(["dumpsys", "package", app_name, "|", "grep", "versionName"], encoding='utf8')
if len(result) > 12:
return True
except:
pass
return False
def system(self, cmd):
try:
subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
except:
pass
+28
View File
@@ -0,0 +1,28 @@
[
{
"app": "lan.rick.pandagpsservice",
"apk": "/sdcard/appd/lan.rick.pandagpsservice.apk",
"offroad_cmd": [
"pkill lan.rick.pandagpsservice",
"LD_LIBRARY_PATH= appops set lan.rick.pandagpsservice android:mock_location deny"
],
"onroad_cmd": [
"LD_LIBRARY_PATH= appops set lan.rick.pandagpsservice android:mock_location allow",
"am startservice lan.rick.pandagpsservice/lan.rick.pandagpsservice.MainService"
]
},
{
"app": "com.tomtom.speedcams.android.map",
"apk": "/sdcard/appd/com.tomtom.speedcams.android.map.apk",
"offroad_cmd": [
"pkill com.tomtom.speedcams.android.map"
],
"onroad_cmd": [
"LD_LIBRARY_PATH= appops set com.tomtom.speedcams.android.map android.permission.ACCESS_FINE_LOCATION allow",
"LD_LIBRARY_PATH= appops set com.tomtom.speedcams.android.map android.permission.ACCESS_COARSE_LOCATION allow",
"LD_LIBRARY_PATH= appops set com.tomtom.speedcams.android.map android.permission.READ_EXTERNAL_STORAGE allow",
"LD_LIBRARY_PATH= appops set com.tomtom.speedcams.android.map android.permission.WRITE_EXTERNAL_STORAGE allow",
"am start -n com.tomtom.speedcams.android.map/com.tomtom.speedcams.android.activities.SpeedCamActivity"
]
}
]
+71
View File
@@ -0,0 +1,71 @@
#!/usr/bin/env python3.7
import os
import datetime
from common.realtime import sec_since_boot
DASHCAM_VIDEOS_PATH = '/sdcard/dashcam/'
DASHCAM_DURATION = 180 # max is 180
DASHCAM_BIT_RATES = 4000000 # max is 4000000
DASHCAM_MAX_SIZE_PER_FILE = DASHCAM_BIT_RATES/8*DASHCAM_DURATION # 4Mbps / 8 * 180 = 90MB per 180 seconds
DASHCAM_FREESPACE_LIMIT = 15 # we start cleaning up footage when freespace is below 15%
DASHCAM_KEPT = DASHCAM_MAX_SIZE_PER_FILE * 240 # 12 hrs of video = 21GB
class Dashcamd():
def __init__(self):
self.dashcam_folder_exists = False
self.dashcam_mkdir_retry = 0
self.dashcam_next_time = 0
self.started = False
self.free_space_percent = 100
def run(self, started, free_space_percent):
self.started = started
self.free_space_percent = free_space_percent
self.make_folder()
if self.dashcam_folder_exists:
self.record()
self.clean_up()
def stop(self):
os.system("killall -SIGINT screenrecord")
self.dashcam_next_time = 0
def make_folder(self):
if not self.dashcam_folder_exists and self.dashcam_mkdir_retry <= 5:
# create dashcam folder if not exist
try:
if not os.path.exists(DASHCAM_VIDEOS_PATH):
os.makedirs(DASHCAM_VIDEOS_PATH)
else:
self.dashcam_folder_exists = True
except OSError:
self.dashcam_folder_exists = False
self.dashcam_mkdir_retry += 1
def record(self):
# start recording
if self.started:
ts = sec_since_boot()
if ts >= self.dashcam_next_time:
now = datetime.datetime.now()
file_name = now.strftime("%Y-%m-%d_%H-%M-%S")
os.system("LD_LIBRARY_PATH= screenrecord --bit-rate %s --time-limit %s %s%s.mp4 &" % (DASHCAM_BIT_RATES, DASHCAM_DURATION, DASHCAM_VIDEOS_PATH, file_name))
self.dashcam_next_time = ts + DASHCAM_DURATION - 1
else:
self.dashcam_next_time = 0
def clean_up(self):
# clean up
if (self.free_space_percent < DASHCAM_FREESPACE_LIMIT) or (self.get_used_spaces() > DASHCAM_KEPT):
try:
files = [f for f in sorted(os.listdir(DASHCAM_VIDEOS_PATH)) if os.path.isfile(DASHCAM_VIDEOS_PATH + f)]
os.system("rm -fr %s &" % (DASHCAM_VIDEOS_PATH + files[0]))
except (IndexError, FileNotFoundError, OSError):
pass
def get_used_spaces(self):
try:
val = sum(os.path.getsize(DASHCAM_VIDEOS_PATH + f) for f in os.listdir(DASHCAM_VIDEOS_PATH) if os.path.isfile(DASHCAM_VIDEOS_PATH + f))
except (IndexError, FileNotFoundError, OSError):
val = 0
return val
+164
View File
@@ -0,0 +1,164 @@
#!/usr/bin/env python3.7
'''
GPS cord converter: https://gist.github.com/jp1017/71bd0976287ce163c11a7cb963b04dd8
'''
import cereal.messaging as messaging
import os
import time
import datetime
import signal
import threading
import math
import zipfile
pi = 3.1415926535897932384626
x_pi = 3.14159265358979324 * 3000.0 / 180.0
a = 6378245.0
ee = 0.00669342162296594323
GPX_LOG_PATH = '/sdcard/gpx_logs/'
LOG_DELAY = 0.1 # secs, lower for higher accuracy, 0.1 seems fine
LOG_LENGTH = 60 # mins, higher means it keeps more data in the memory, will take more time to write into a file too.
LOST_SIGNAL_COUNT_LENGTH = 30 # secs, if we lost signal for this long, perform output to data
MIN_MOVE_SPEED_KMH = 5 # km/h, min speed to trigger logging
# do not change
LOST_SIGNAL_COUNT_MAX = LOST_SIGNAL_COUNT_LENGTH / LOG_DELAY # secs,
LOGS_PER_FILE = LOG_LENGTH * 60 / LOG_DELAY # e.g. 3 * 60 / 0.1 = 1800 points per file
MIN_MOVE_SPEED_MS = MIN_MOVE_SPEED_KMH / 3.6
class WaitTimeHelper:
ready_event = threading.Event()
shutdown = False
def __init__(self):
signal.signal(signal.SIGTERM, self.graceful_shutdown)
signal.signal(signal.SIGINT, self.graceful_shutdown)
signal.signal(signal.SIGHUP, self.graceful_shutdown)
def graceful_shutdown(self, signum, frame):
self.shutdown = True
self.ready_event.set()
def main():
# init
sm = messaging.SubMaster(['gpsLocationExternal'])
log_count = 0
logs = list()
lost_signal_count = 0
wait_helper = WaitTimeHelper()
started_time = datetime.datetime.utcnow().isoformat()
# outside_china_checked = False
# outside_china = False
while True:
sm.update()
if sm.updated['gpsLocationExternal']:
gps = sm['gpsLocationExternal']
# do not log when no fix or accuracy is too low, add lost_signal_count
if gps.flags % 2 == 0 or gps.accuracy > 5.:
if log_count > 0:
lost_signal_count += 1
else:
lng = gps.longitude
lat = gps.latitude
# if not outside_china_checked:
# outside_china = out_of_china(lng, lat)
# outside_china_checked = True
# if not outside_china:
# lng, lat = wgs84togcj02(lng, lat)
logs.append([datetime.datetime.utcfromtimestamp(gps.timestamp*0.001).isoformat(), lat, lng, gps.altitude])
log_count += 1
lost_signal_count = 0
'''
write to log if
1. reach per file limit
2. lost signal for a certain time (e.g. under cover car park?)
'''
if log_count > 0 and (log_count >= LOGS_PER_FILE or lost_signal_count >= LOST_SIGNAL_COUNT_MAX):
# output
to_gpx(logs, started_time)
lost_signal_count = 0
log_count = 0
logs.clear()
started_time = datetime.datetime.utcnow().isoformat()
time.sleep(LOG_DELAY)
if wait_helper.shutdown:
break
# when process end, we store any logs.
if log_count > 0:
to_gpx(logs, started_time)
'''
check to see if it's in china
'''
def out_of_china(lng, lat):
if lng < 72.004 or lng > 137.8347:
return True
elif lat < 0.8293 or lat > 55.8271:
return True
return False
def transform_lat(lng, lat):
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(abs(lng))
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0
ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0
return ret
def transform_lng(lng, lat):
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(abs(lng))
ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0
ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0
ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0
return ret
'''
Convert wgs84 to gcj02 (
'''
def wgs84togcj02(lng, lat):
if out_of_china(lng, lat):
return lng, lat
dlat = transform_lat(lng - 105.0, lat - 35.0)
dlng = transform_lng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * pi
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)
dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)
mglat = lat + dlat
mglng = lng + dlng
return mglng, mglat
'''
write logs to a gpx file and zip it
'''
def to_gpx(logs, timestamp):
if len(logs) > 0:
if not os.path.exists(GPX_LOG_PATH):
os.makedirs(GPX_LOG_PATH)
filename = timestamp.replace(':','-')
str = ''
str += "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n"
str += "<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\" version=\"1.1\">\n"
str += "\t<trk>\n"
str += "\t\t<trkseg>\n"
for trkpt in logs:
str += "\t\t\t<trkpt time=\"%sZ\" lat=\"%s\" lon=\"%s\" ele=\"%s\" />\n" % (trkpt[0], trkpt[1], trkpt[2], trkpt[3])
str += "\t\t</trkseg>\n"
str += "\t</trk>\n"
str += "</gpx>\n"
try:
zi = zipfile.ZipInfo('%sZ.gpx' % filename, time.localtime())
zi.compress_type = zipfile.ZIP_DEFLATED
zf = zipfile.ZipFile('%s%sZ.zip' % (GPX_LOG_PATH, filename), mode='w')
zf.writestr(zi, str)
zf.close()
except:
pass
if __name__ == "__main__":
main()
+296
View File
@@ -0,0 +1,296 @@
#!/usr/bin/env python3
'''
This is a service that broadcast dp config values to openpilot's messaging queues
'''
import cereal.messaging as messaging
import time
from common.dp_conf import confs, get_struct_name, to_struct_val
from common.params import Params, put_nonblocking
import subprocess
import re
import os
from selfdrive.hardware import HARDWARE
params = Params()
from common.realtime import sec_since_boot
from common.i18n import get_locale
from common.dp_common import param_get, get_last_modified
from common.dp_time import LAST_MODIFIED_SYSTEMD
from selfdrive.dragonpilot.dashcamd import Dashcamd
from selfdrive.dragonpilot.appd import Appd
from selfdrive.hardware import EON
PARAM_PATH = params.get_params_path() + '/d/'
DELAY = 0.5 # 2hz
HERTZ = 1/DELAY
last_modified_confs = {}
def confd_thread():
sm = messaging.SubMaster(['deviceState'])
pm = messaging.PubMaster(['dragonConf'])
last_dp_msg = None
frame = 0
update_params = False
modified = None
last_modified = None
last_modified_check = None
started = False
free_space = 1
battery_percent = 0
overheat = False
last_charging_ctrl = False
last_started = False
dashcamd = Dashcamd()
appd = Appd()
dashcam_recorded = False
last_dashcam_recorded = False
while True:
start_sec = sec_since_boot()
msg = messaging.new_message('dragonConf')
if last_dp_msg is not None:
msg.dragonConf = last_dp_msg
'''
===================================================
load thermald data every 3 seconds
===================================================
'''
if frame % (HERTZ * 3) == 0:
started, free_space, battery_percent, overheat = pull_thermald(frame, sm, started, free_space, battery_percent, overheat)
setattr(msg.dragonConf, get_struct_name('dp_thermal_started'), started)
setattr(msg.dragonConf, get_struct_name('dp_thermal_overheat'), overheat)
'''
===================================================
hotspot on boot
we do it after 30 secs just in case
===================================================
'''
if frame == (HERTZ * 30) and param_get("dp_hotspot_on_boot", "bool", False):
os.system("service call wifi 37 i32 0 i32 1 &")
'''
===================================================
check dp_last_modified every second
===================================================
'''
if not update_params:
last_modified_check, modified = get_last_modified(LAST_MODIFIED_SYSTEMD, last_modified_check, modified)
if last_modified != modified:
update_params = True
last_modified = modified
'''
===================================================
conditionally set update_params to true
===================================================
'''
# force updating param when `started` changed
if last_started != started:
update_params = True
if frame == 0:
update_params = True
'''
===================================================
conditionally update dp param base on stock param
===================================================
'''
# if update_params and params.get("LaneChangeEnabled") == b"1":
# params.put("dp_steering_on_signal", "0")
'''
===================================================
push param vals to message
===================================================
'''
if update_params:
msg = update_conf_all(confs, msg, frame == 0)
update_params = False
'''
===================================================
push once
===================================================
'''
if frame == 0:
setattr(msg.dragonConf, get_struct_name('dp_locale'), get_locale())
if (not os.path.isfile("/data/params/d/GithubSshKeys") or params.get("GithubSshKeys") == '') and \
os.path.isfile("/data/data/com.termux/files/home/setup_keys"):
os.system("cp /data/data/com.termux/files/home/setup_keys /data/params/d/GithubSshKeys")
'''
===================================================
push ip addr every 10 secs
===================================================
'''
if frame % (HERTZ * 10) == 0:
msg = update_ip(msg)
'''
===================================================
update msg based on some custom logic
===================================================
'''
msg = update_custom_logic(msg)
'''
===================================================
battery ctrl every 30 secs
PowerMonitor in thermald turns back on every mins
so lets turn it off more frequent
===================================================
'''
# if frame % (HERTZ * 30) == 0:
# last_charging_ctrl = process_charging_ctrl(msg, last_charging_ctrl, battery_percent)
'''
===================================================
dashcam
===================================================
'''
if msg.dragonConf.dpDashcamd:
if frame % HERTZ == 0:
dashcamd.run(started, free_space)
dashcam_recorded = True
if not started:
dashcam_recorded = False
else:
dashcam_recorded = False
if not dashcam_recorded and last_dashcam_recorded:
dashcamd.stop()
last_dashcam_recorded = dashcam_recorded
'''
===================================================
appd
===================================================
'''
if msg.dragonConf.dpAppd:
appd.run(started)
'''
===================================================
finalise
===================================================
'''
last_dp_msg = msg.dragonConf
last_started = started
pm.send('dragonConf', msg)
frame += 1
sleep = DELAY-(sec_since_boot() - start_sec)
if sleep > 0:
time.sleep(sleep)
def update_conf(msg, conf, first_run = False):
conf_type = conf.get('conf_type')
# skip checking since modified date time hasn't been changed.
if (last_modified_confs.get(conf['name'])) is not None and last_modified_confs.get(conf['name']) == os.stat(PARAM_PATH + conf['name']).st_mtime:
return msg
if 'param' in conf_type and 'struct' in conf_type:
update_this_conf = True
if not first_run:
update_once = conf.get('update_once')
if update_once is not None and update_once is True:
return msg
if update_this_conf:
update_this_conf = check_dependencies(msg, conf)
if update_this_conf:
msg = set_message(msg, conf)
if os.path.isfile(PARAM_PATH + conf['name']):
last_modified_confs[conf['name']] = os.stat(PARAM_PATH + conf['name']).st_mtime
return msg
def update_conf_all(confs, msg, first_run = False):
for conf in confs:
msg = update_conf(msg, conf, first_run)
return msg
def process_charging_ctrl(msg, last_charging_ctrl, battery_percent):
charging_ctrl = msg.dragonConf.dpChargingCtrl
if last_charging_ctrl != charging_ctrl:
HARDWARE.set_battery_charging(True)
if charging_ctrl:
if battery_percent >= msg.dragonConf.dpDischargingAt and HARDWARE.get_battery_charging():
HARDWARE.set_battery_charging(False)
elif battery_percent <= msg.dragonConf.dpChargingAt and not HARDWARE.get_battery_charging():
HARDWARE.set_battery_charging(True)
return charging_ctrl
def pull_thermald(frame, sm, started, free_space, battery_percent, overheat):
sm.update(0)
if sm.updated['deviceState']:
started = sm['deviceState'].started
free_space = sm['deviceState'].freeSpacePercent
battery_percent = sm['deviceState'].batteryPercent
overheat = sm['deviceState'].thermalStatus >= 2
return started, free_space, battery_percent, overheat
def update_custom_logic(msg):
if msg.dragonConf.dpAtl:
msg.dragonConf.dpAllowGas = True
msg.dragonConf.dpFollowingProfileCtrl = False
msg.dragonConf.dpAccelProfileCtrl = False
msg.dragonConf.dpGearCheck = False
if msg.dragonConf.dpLcMinMph > msg.dragonConf.dpLcAutoMinMph:
put_nonblocking('dp_lc_auto_min_mph', str(msg.dragonConf.dpLcMinMph))
msg.dragonConf.dpLcAutoMinMph = msg.dragonConf.dpLcMinMph
# if msg.dragonConf.dpSrCustom <= 4.99 and msg.dragonConf.dpSrStock > 0:
# put_nonblocking('dp_sr_custom', str(msg.dragonConf.dpSrStock))
# msg.dragonConf.dpSrCustom = msg.dragonConf.dpSrStock
# if msg.dragonConf.dpAppWaze or msg.dragonConf.dpAppHr:
# msg.dragonConf.dpDrivingUi = False
# if not msg.dragonConf.dpDriverMonitor:
# msg.dragonConf.dpUiFace = False
return msg
def update_ip(msg):
val = 'N/A'
if EON:
try:
result = subprocess.check_output(["ifconfig", "wlan0"], encoding='utf8')
val = re.findall(r"inet addr:((\d+\.){3}\d+)", result)[0][0]
except:
pass
setattr(msg.dragonConf, get_struct_name('dp_ip_addr'), val)
return msg
def set_message(msg, conf):
val = params.get(conf['name'], encoding='utf8')
if val is not None:
val = val.rstrip('\x00')
else:
val = conf.get('default')
params.put(conf['name'], str(val))
struct_val = to_struct_val(conf['name'], val)
orig_val = struct_val
if struct_val is not None:
if conf.get('min') is not None:
struct_val = max(struct_val, conf.get('min'))
if conf.get('max') is not None:
struct_val = min(struct_val, conf.get('max'))
if orig_val != struct_val:
params.put(conf['name'], str(struct_val))
setattr(msg.dragonConf, get_struct_name(conf['name']), struct_val)
return msg
def check_dependencies(msg, conf):
passed = True
# if has dependency and the depend param val is not in depend_vals, we dont update that conf val
# this should reduce chance of reading unnecessary params
dependencies = conf.get('depends')
if dependencies is not None:
for dependency in dependencies:
if getattr(msg.dragonConf, get_struct_name(dependency['name'])) not in dependency['vals']:
passed = False
break
return passed
def main():
confd_thread()
if __name__ == "__main__":
main()
+5 -1
View File
@@ -5,15 +5,19 @@ from selfdrive.hardware.base import HardwareBase
from selfdrive.hardware.eon.hardware import Android
from selfdrive.hardware.tici.hardware import Tici
from selfdrive.hardware.pc.hardware import Pc
from selfdrive.hardware.jetson.hardware import Jetson
EON = os.path.isfile('/EON')
TICI = os.path.isfile('/TICI')
PC = not (EON or TICI)
JETSON = os.path.isfile('/JETSON')
PC = not (EON or TICI or JETSON)
if EON:
HARDWARE = cast(HardwareBase, Android())
elif TICI:
HARDWARE = cast(HardwareBase, Tici())
elif JETSON:
HARDWARE = cast(HardwareBase, Jetson())
else:
HARDWARE = cast(HardwareBase, Pc())
+1
View File
@@ -22,4 +22,5 @@ public:
static bool PC() { return false; }
static bool EON() { return false; }
static bool TICI() { return false; }
static bool JETSON() { return false; }
};
+3
View File
@@ -8,6 +8,9 @@
#elif QCOM2
#include "selfdrive/hardware/tici/hardware.h"
#define Hardware HardwareTici
#elif XNX
#include "selfdrive/hardware/jetson/hardware.h"
#define Hardware HardwareJetson
#else
class HardwarePC : public HardwareNone {
public:
+15
View File
@@ -0,0 +1,15 @@
#pragma once
#include <cstdlib>
#include "selfdrive/common/util.h"
#include "selfdrive/hardware/base.h"
class HardwareJetson : public HardwareNone {
public:
static bool JETSON() { return true; }
static void reboot() { std::system("sudo reboot"); };
static void poweroff() { std::system("sudo poweroff"); };
};
+91
View File
@@ -0,0 +1,91 @@
import random
import os
from cereal import log
from selfdrive.hardware.base import HardwareBase, ThermalConfig
NetworkType = log.DeviceState.NetworkType
NetworkStrength = log.DeviceState.NetworkStrength
class Jetson(HardwareBase):
def get_os_version(self):
return None
def get_device_type(self):
return "jetson"
def get_sound_card_online(self):
return True
def reboot(self, reason=None):
os.system("sudo reboot")
def uninstall(self):
print("uninstall")
def get_imei(self, slot):
return "%015d" % random.randint(0, 1 << 32)
def get_serial(self):
return "cccccccc"
def get_subscriber_info(self):
return ""
def get_network_type(self):
return NetworkType.wifi
def get_sim_info(self):
return {
'sim_id': '',
'mcc_mnc': None,
'network_type': ["Unknown"],
'sim_state': ["ABSENT"],
'data_connected': False
}
def get_network_strength(self, network_type):
return NetworkStrength.unknown
def get_battery_capacity(self):
return 100
def get_battery_status(self):
return ""
def get_battery_current(self):
return 0
def get_battery_voltage(self):
return 0
def get_battery_charging(self):
return True
def set_battery_charging(self, on):
pass
def get_usb_present(self):
return False
def get_current_power_draw(self):
return 0
def shutdown(self):
os.system("sudo poweroff")
def get_thermal_config(self):
return ThermalConfig(cpu=((None,), 1), gpu=((None,), 1), mem=(None, 1), bat=(None, 1), ambient=(None, 1))
def set_screen_brightness(self, percentage):
pass
def set_power_save(self, enabled):
if enabled:
os.system("sudo nvpmodel -m 3")
else:
os.system("sudo echo 5000 > /sys/devices/c250000.i2c/i2c-7/7-0040/iio:device0/crit_current_limit_0")
os.system("sudo nvpmodel -m 2 && sudo jetson_clocks")
+1 -1
View File
@@ -87,7 +87,7 @@ def main(sm=None, pm=None):
min_sr, max_sr = 0.5 * CP.steerRatio, 2.0 * CP.steerRatio
params = params_reader.get("LiveParameters")
params = params_reader.get("LiveParameters") if not params_reader.get_bool('dp_reset_live_param_on_start') else None
# Check if car model matches
if params is not None:
+2 -2
View File
@@ -1,10 +1,10 @@
import os
from pathlib import Path
from selfdrive.hardware import PC
from selfdrive.hardware import PC, JETSON
if os.environ.get('LOGGERD_ROOT', False):
ROOT = os.environ['LOGGERD_ROOT']
elif PC:
elif PC or JETSON:
ROOT = os.path.join(str(Path.home()), ".comma", "media", "0", "realdata")
else:
ROOT = '/data/media/0/realdata/'
+1 -1
View File
@@ -16,7 +16,7 @@
#include "selfdrive/hardware/hw.h"
const std::string LOG_ROOT =
Hardware::PC() ? util::getenv_default("HOME", "/.comma/media/0/realdata", "/data/media/0/realdata")
(Hardware::PC() || Hardware::JETSON()) ? util::getenv_default("HOME", "/.comma/media/0/realdata", "/data/media/0/realdata")
: "/data/media/0/realdata";
#define LOGGER_MAX_HANDLES 16
+1 -1
View File
@@ -357,7 +357,7 @@ int main(int argc, char** argv) {
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_FCAMERA));
s.rotate_state[LOG_CAMERA_ID_FCAMERA].enabled = true;
if (!Hardware::PC() && Params().getBool("RecordFront")) {
if (!Hardware::PC() && !Hardware::JETSON() && Params().getBool("RecordFront")) {
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_DCAMERA));
s.rotate_state[LOG_CAMERA_ID_DCAMERA].enabled = true;
}
+1 -2
View File
@@ -195,8 +195,7 @@ def uploader_fn(exit_event):
dongle_id = params.get("DongleId", encoding='utf8')
if dongle_id is None:
cloudlog.info("uploader missing dongle_id")
raise Exception("uploader can't start without dongle id")
return
if TICI and not Path("/data/media").is_mount():
cloudlog.warning("NVME not mounted")
View File
+8 -1
View File
@@ -5,6 +5,7 @@ import sys
import time
import textwrap
from pathlib import Path
import re
# NOTE: Do NOT import anything here that needs be built (e.g. params)
from common.basedir import BASEDIR
@@ -74,10 +75,16 @@ def build(spinner, dirty=False):
add_file_handler(cloudlog)
cloudlog.error("scons build failed\n" + error_s)
try:
result = subprocess.check_output(["ifconfig", "wlan0"], encoding='utf8')
ip = re.findall(r"inet addr:((\d+\.){3}\d+)", result)[0][0]
except:
ip = 'N/A'
# Show TextWindow
spinner.close()
error_s = "\n \n".join(["\n".join(textwrap.wrap(e, 65)) for e in errors])
with TextWindow("openpilot failed to build\n \n" + error_s) as t:
with TextWindow(("openpilot failed to build (IP: %s)\n \n" % ip) + error_s) as t:
t.wait_for_exit()
exit(1)
else:
+48 -4
View File
@@ -12,7 +12,7 @@ from common.basedir import BASEDIR
from common.params import Params, ParamKeyType
from common.text_window import TextWindow
from selfdrive.boardd.set_time import set_time
from selfdrive.hardware import HARDWARE, PC, TICI
from selfdrive.hardware import HARDWARE, PC, TICI, EON
from selfdrive.manager.helpers import unblock_stdout
from selfdrive.manager.process import ensure_running
from selfdrive.manager.process_config import managed_processes
@@ -21,6 +21,8 @@ from selfdrive.swaglog import cloudlog, add_file_handler
from selfdrive.version import dirty, get_git_commit, version, origin, branch, commit, \
terms_version, training_version, comma_remote, \
get_git_branch, get_git_remote
from common.dp_conf import init_params_vals
def manager_init():
@@ -48,6 +50,10 @@ def manager_init():
if params.get(k) is None:
params.put(k, v)
# dp init params
init_params_vals(params)
dp_reg = params.get_bool('dp_reg')
# is this dashcam?
if os.getenv("PASSIVE") is not None:
params.put_bool("Passive", bool(int(os.getenv("PASSIVE"))))
@@ -65,6 +71,13 @@ def manager_init():
except PermissionError:
print("WARNING: failed to make /dev/shm")
# dp - make sure libmessaging_shared.so is working
if EON:
os.chmod(BASEDIR, 0o755)
os.chmod("/dev/shm", 0o777)
os.chmod(os.path.join(BASEDIR, "cereal"), 0o755)
os.chmod(os.path.join(BASEDIR, "cereal", "libmessaging_shared.so"), 0o755)
# set version params
params.put("Version", version)
params.put("TermsVersion", terms_version)
@@ -111,12 +124,43 @@ def manager_thread():
cloudlog.info("manager start")
cloudlog.info({"environ": os.environ})
# save boot log
subprocess.call("./bootlog", cwd=os.path.join(BASEDIR, "selfdrive/loggerd"))
params = Params()
dp_reg = params.get_bool('dp_reg')
dp_appd = params.get_bool('dp_appd')
dp_updated = params.get_bool('dp_updated')
dp_logger = params.get_bool('dp_logger')
dp_athenad = params.get_bool('dp_athenad')
dp_uploader = params.get_bool('dp_uploader')
dp_dashcamd = params.get_bool('dp_dashcamd')
dp_panda_no_gps = params.get_bool('dp_panda_no_gps')
if params.get_bool('dp_atl'):
dp_reg = False
if not dp_reg:
dp_logger = False
dp_athenad = False
dp_uploader = False
# save boot log
if dp_logger:
subprocess.call("./bootlog", cwd=os.path.join(BASEDIR, "selfdrive/loggerd"))
ignore = []
if not dp_appd:
ignore += ['appd']
if dp_panda_no_gps:
ignore += ['ubloxd']
if not dp_dashcamd:
ignore += ['dashcamd']
if not dp_updated:
ignore += ['updated']
if not dp_logger:
ignore += ['logcatd', 'loggerd', 'proclogd', 'logmessaged', 'tombstoned']
if not dp_athenad:
ignore += ['manage_athenad']
if not dp_uploader or not dp_reg:
ignore += ['uploader']
if not dp_athenad and not dp_uploader:
ignore += ['deleter']
if params.get("DongleId", encoding='utf8') == UNREGISTERED_DONGLE_ID:
ignore += ["manage_athenad", "uploader"]
if os.getenv("NOBOARD") is not None:
+15 -12
View File
@@ -1,29 +1,31 @@
import os
from selfdrive.manager.process import PythonProcess, NativeProcess, DaemonProcess
from selfdrive.hardware import EON, TICI, PC
from selfdrive.hardware import EON, TICI, PC, JETSON
from common.params import Params
JETSON = JETSON or Params().get_bool('dp_jetson')
WEBCAM = os.getenv("USE_WEBCAM") is not None
procs = [
DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid"),
DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid", enabled=not JETSON),
# due to qualcomm kernel bugs SIGKILLing camerad sometimes causes page table corruption
NativeProcess("camerad", "selfdrive/camerad", ["./camerad"], unkillable=True, driverview=True),
NativeProcess("clocksd", "selfdrive/clocksd", ["./clocksd"]),
NativeProcess("dmonitoringmodeld", "selfdrive/modeld", ["./dmonitoringmodeld"], enabled=(not PC or WEBCAM), driverview=True),
NativeProcess("logcatd", "selfdrive/logcatd", ["./logcatd"]),
NativeProcess("loggerd", "selfdrive/loggerd", ["./loggerd"]),
NativeProcess("dmonitoringmodeld", "selfdrive/modeld", ["./dmonitoringmodeld"], enabled=not JETSON and (not PC or WEBCAM), driverview=True),
NativeProcess("logcatd", "selfdrive/logcatd", ["./logcatd"], enabled=not JETSON),
NativeProcess("loggerd", "selfdrive/loggerd", ["./loggerd"], enabled=not JETSON),
NativeProcess("modeld", "selfdrive/modeld", ["./modeld"]),
NativeProcess("proclogd", "selfdrive/proclogd", ["./proclogd"]),
NativeProcess("proclogd", "selfdrive/proclogd", ["./proclogd"], enabled=not JETSON),
NativeProcess("sensord", "selfdrive/sensord", ["./sensord"], enabled=not PC, persistent=EON, sigkill=EON),
NativeProcess("ubloxd", "selfdrive/locationd", ["./ubloxd"], enabled=(not PC or WEBCAM)),
NativeProcess("ubloxd", "selfdrive/locationd", ["./ubloxd"], enabled=not PC or WEBCAM),
NativeProcess("ui", "selfdrive/ui", ["./ui"], persistent=True, watchdog_max_dt=(10 if TICI else None)),
NativeProcess("locationd", "selfdrive/locationd", ["./locationd"]),
PythonProcess("calibrationd", "selfdrive.locationd.calibrationd"),
PythonProcess("controlsd", "selfdrive.controls.controlsd"),
PythonProcess("deleter", "selfdrive.loggerd.deleter", persistent=True),
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", enabled=(not PC or WEBCAM), driverview=True),
PythonProcess("logmessaged", "selfdrive.logmessaged", persistent=True),
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", enabled=not JETSON and (not PC or WEBCAM), driverview=True),
PythonProcess("logmessaged", "selfdrive.logmessaged", enabled=not JETSON, persistent=True),
PythonProcess("pandad", "selfdrive.pandad", persistent=True),
PythonProcess("paramsd", "selfdrive.locationd.paramsd"),
PythonProcess("plannerd", "selfdrive.controls.plannerd"),
@@ -31,9 +33,10 @@ procs = [
PythonProcess("rtshield", "selfdrive.rtshield", enabled=EON),
PythonProcess("thermald", "selfdrive.thermald.thermald", persistent=True),
PythonProcess("timezoned", "selfdrive.timezoned", enabled=TICI, persistent=True),
PythonProcess("tombstoned", "selfdrive.tombstoned", enabled=not PC, persistent=True),
PythonProcess("updated", "selfdrive.updated", enabled=not PC, persistent=True),
PythonProcess("uploader", "selfdrive.loggerd.uploader", persistent=True),
PythonProcess("tombstoned", "selfdrive.tombstoned", enabled=not PC and not JETSON, persistent=True),
PythonProcess("updated", "selfdrive.updated", enabled=not PC and not JETSON, persistent=True),
PythonProcess("uploader", "selfdrive.loggerd.uploader", enabled=not JETSON, persistent=True),
PythonProcess("systemd", "selfdrive.dragonpilot.systemd", persistent=True),
]
managed_processes = {p.name: p for p in procs}

Some files were not shown because too many files have changed in this diff Show More