dragonpilot mod for 0.8.5-4
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 76 KiB |
@@ -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 ""
|
||||
@@ -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 "制限速度以上の運転をしてください"
|
||||
@@ -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 ""
|
||||
@@ -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 "准备好后请松开放向盘"
|
||||
@@ -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 "準備好後請鬆開放向盤"
|
||||
|
After Width: | Height: | Size: 15 KiB |
@@ -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 = []
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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 = ®ion_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 = ®ion_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 = ®ion_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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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 = \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}],
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -26,6 +26,7 @@ class CANBUS:
|
||||
pt = 0
|
||||
cam = 2
|
||||
|
||||
NetworkLocation = car.CarParams.NetworkLocation
|
||||
TransmissionType = car.CarParams.TransmissionType
|
||||
GearShifter = car.CarState.GearShifter
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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 @@
|
||||
#define COMMA_VERSION "0.8.5-d4ab1f1e2-2021-06-07T22:13:55"
|
||||
#define COMMA_VERSION "0.8.5-dp-4"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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,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())
|
||||
|
||||
@@ -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; }
|
||||
};
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"); };
|
||||
};
|
||||
@@ -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")
|
||||
@@ -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:
|
||||
|
||||
@@ -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/'
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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}
|
||||
|
||||