Compare commits

...

42 Commits
0.8.7 ... 0.8.0

Author SHA1 Message Date
Rick Lan
e0f80460eb Bug fixes 2020-12-07 08:47:55 +10:00
Rick Lan
9c6abcae45 Merge branch 'testing' of https://github.com/dragonpilot-community/dragonpilot into testing 2020-12-05 15:14:04 +10:00
Rick Lan
3064cefbbb revert uno change 2020-12-05 15:13:50 +10:00
toyboxZ
d7068a1f19 revert uno.h change to 0.7.10 2020-12-05 11:42:16 +08:00
Rick Lan
c744ac0ffd * Added git error fix. (Thanks to @toyboxZ) 2020-12-04 12:50:46 +10:00
Rick Lan
fc14ec2d55 Merge branch 'devel' of https://github.com/commaai/openpilot into testing 2020-12-04 12:35:55 +10:00
Adeeb Shihadeh
11ce6152dd Fix commIssue due to frame drop and power draw (#2689)
* Don't re-init pigeon while offroad (#2687)

* don't re-init pigeon while offroad

* we don't need this

* update panda

* remove check on frame drop in modeld (#2638)

Co-authored-by: robbederks <robbe.derks@gmail.com>
Co-authored-by: Willem Melching <willem.melching@gmail.com>
2020-12-03 13:12:43 -08:00
Rick Lan
7860ab7a71 dragonpilot v0.8.0 2020-12-03 11:58:48 +10:00
Rick Lan
7f41aa954e Merge branch 'devel' of https://github.com/commaai/openpilot into testing 2020-12-01 10:43:01 +10:00
Rick Lan
d972f6d9fe attempt to fix lead_distance bug 2020-11-30 21:40:14 +10:00
Rick Lan
8f6453898a smart mdps steering speed override 2020-11-30 16:48:03 +10:00
Rick Lan
829ecd71f0 * Added dp_toyota_lowest_cruise_override_vego. (Thanks to @toyboxZ) 2020-11-28 11:03:00 +10:00
Rick Lan
274e75cf6c * Added Honda inspire, accord, crv SnG optimisation from afa fork. (Thanks to @menwenliang) 2020-11-28 10:53:02 +10:00
Rick Lan
168136e7a0 multiple bug fixes 2020-11-25 21:22:29 +10:00
Rick Lan
af020da7c7 bug fixes 2020-11-25 21:14:43 +10:00
Rick Lan
2894cd2a9d 71930a4b96
160fd207a5
b75259ad07
2020-11-25 10:43:01 +10:00
Rick Lan
6704c8d2ec fix bugs 2020-11-24 14:49:18 +10:00
Rick Lan
b92f36a83b fix bugs 2020-11-24 14:20:17 +10:00
Rick Lan
ba0fb4fc0b fix bugs 2020-11-24 14:03:12 +10:00
Rick Lan
bafbab18a0 fix bugs 2020-11-24 13:58:56 +10:00
Rick Lan
e0b7cce478 2020-11-21, 2020-11-23, 2020-11-24 changes in master-ci 2020-11-24 13:21:41 +10:00
eFini
325c9b273d Merge pull request #69 from sebastian4k/patch-7
Update values.py
2020-11-23 12:33:57 +10:00
Rick Lan
12b4f9aa4f bug fixes 2020-11-22 17:41:38 +10:00
Rick Lan
3363228d79 bug fixes 2020-11-22 17:08:06 +10:00
Rick Lan
aee4f9719c https://github.com/commaai/openpilot/pull/2590
https://github.com/commaai/openpilot/pull/2578
2020-11-22 16:44:54 +10:00
Rick Lan
4c34b3cae7 * Added Dynamic Gas Lite. (Thanks to toyboxZ) 2020-11-22 16:30:24 +10:00
sebastian4k
4a11adb782 Update values.py 2020-11-21 19:50:16 -07:00
Rick Lan
28515145f9 genesis should all have switch signal 2020-11-20 15:02:08 +10:00
Rick Lan
0fbf2029db fixed VW 0x117 CRC error 2020-11-20 12:15:18 +10:00
Rick Lan
c09c2bcd07 https://github.com/commaai/openpilot/pull/2569 2020-11-20 12:13:51 +10:00
Rick Lan
43e9274455 fix bugs 2020-11-20 10:22:09 +10:00
Rick Lan
02e1036349 fix bugs 2020-11-19 11:45:30 +10:00
Rick Lan
1c75d1c76b * updated all honda/hyunda/toyota fingerprints 2020-11-19 11:07:06 +10:00
Rick Lan
8a8dfafa56 torch model 2020-11-18 15:21:51 +10:00
Rick Lan
d6b3cb2e32 * Support 2018 Taiwan Hyundai IONIQ + smart MDPS (dp_hkg_smart_mdps) (Thanks to @andy741217) 2020-11-13 12:58:30 +10:00
Rick Lan
4cb5e99ab6 update logic 2020-11-11 10:09:08 +10:00
Rick Lan
078935b807 update logic 2020-11-11 10:08:45 +10:00
Rick Lan
59b52126ee update logic 2020-11-11 10:04:28 +10:00
Rick Lan
1e53607614 added minSteerSpeed back to hkg 2020-11-10 14:39:19 +10:00
Rick Lan
2665d308ca * HYUNDAI_GENESIS added Cruise button event and lkMode feature. (Thanks to @donfyffe) 2020-11-05 16:17:54 +10:00
Rick Lan
3cb8df8c49 * HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe) 2020-11-04 10:40:48 +10:00
Rick Lan
4a3d5e2182 dragonpilot 0.7.10 2020-10-30 15:23:01 +10:00
147 changed files with 15370 additions and 3116 deletions

602
CHANGELOGS-DEV.md Normal file
View File

@@ -0,0 +1,602 @@
dragonpilot 0.8.0
========================
* 基於最新 openpilot 0.8.0 devel.
* Based on latest openpilot 0.8.0 devel.
* 加入 git 錯誤修正。(感謝 @toyboxZ 提供)
* Added git error fix. (Thanks to @toyboxZ)
dragonpilot 0.7.10.1
========================
* HYUNDAI_GENESIS 使用 INDI 控制器。(感謝 @donfyffe 提供)
* HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe)
* HYUNDAI_GENESIS 加入 Cruise 按紐 和 lkMode 支援。(感謝 @donfyffe 建議)
* HYUNDAI_GENESIS added Cruise button event and lkMode feature. (Thanks to @donfyffe)
* 支援台灣版 2018 Huyndai IONIQ + smart MDPS (dp_hkg_smart_mdps) (感謝 @andy741217 提供)
* Support 2018 Taiwan Hyundai IONIQ + smart MDPS (dp_hkg_smart_mdps) (Thanks to @andy741217)
* 使用 openpilot v0.8 的模型。(感謝 @eisenheim)
* Use openpilot v0.8 model. (Thanks to @eisenheim)
* 加入 0.8 測試版的部分優化。
* Added optimizations from pre-0.8.
* 加入 dp_honda_eps_mod 設定來使用更高的扭力 (需 eps mod)。(感謝 @Wuxl_369 提供)
* Added dp_honda_eps_mod setting to enable higher torque (eps mod required). (Thanks to @Wuxl_369)
* 修正 VW 對白/灰熊的支援 (感謝 @lirudy 提供)
* Fixed issue with white/grey panda support for VW (Thanks to @lirudy)
* GENESIS_G70 優化 (感謝 @sebastian4k 提供)
* GENESIS_G70 Optimisation (Thanks to @sebastian4k)
* HYUNDAI_GENESIS 優化 (感謝 @donfyffe 提供)
* HYUNDAI_GENESIS Optimisation (Thanks to @donfyffe)
* 加入 Dynamic gas Lite。(感謝 @toyboxZ 提供)
* Added Dynamic Gas Lite. (Thanks to @toyboxZ)
* 加入來自 afa 的 Honda inspire, accord, crv SnG 優化。(感謝 @menwenliang 提供)
* Added Honda inspire, accord, crv SnG optimisation from afa fork. (Thanks to @menwenliang)
* 加入 dp_toyota_lowest_cruise_override_vego。(感謝 @toyboxZ 提供)
* Added dp_toyota_lowest_cruise_override_vego. (Thanks to @toyboxZ)
dragonpilot 0.7.10.0
========================
* 基於最新 openpilot 0.7.10 devel.
* Based on latest openpilot 0.7.10 devel.
* 修正 Prius 特定情況下無法操控方向盤的問題。
* Fixed unable to regain Prius steering control under certain condition.
* 更新 VW MQB 的支援。(需執行 scripts/vw.sh 腳本)
* Updated support of VW MQB. (scripts/vw.sh script required)
* 新增 2018 China Toyota CHR 指紋v2。感謝 @xiaohongcheung 提供)
* Added 2018 China Toyota CHR FPv2. (Thanks to @xiaohongcheung)
* 加入 Headunit Reloaded Android Auto App 支援。(感謝 @Ninjaa 提供)
* Added Headunit Reloaded Android Auto App Support. (Thanks to @Ninjaa)
* 優化 nanovg。(感謝 @piggy 提供)
* Optomized nanovg. (Thanks to @piggy)
* 加入 complete_setup.sh (感謝 @深鲸希西 提供)
* Added complete_setup.sh (Thanks to @深鲸希西)
* Based on latest openpilot 0.7.10 devel.
* 修正 EON 接 PC/USB 充電器時仍會自動關機的錯誤。(感謝 @小愛 回報)
* Fixed auto shutdown issue when EON connect to PC/USB Charger. (Thanks to @LOVEChen)
* HYUNDAI_GENESIS 使用 INDI 控制器。(感謝 @donfyffe 提供)
* HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe)
dragonpilot 0.7.8.3
========================
* VW 加入 6 分鐘時間方向盤控制限制輔助方案。(特別感謝 @actuallylemoncurd 提供代碼)
* VW added 6 minutes timebomb assist. (dp_timebomb_assist, special thanks to @actuallylemoncurd)
dragonpilot 0.7.8.2
========================
* 修正在沒網路的情況下,開機超過五分鐘的問題。
* Fixed 5+ minutes boot time issue when there is no internet connection.
* 錯誤回傳改使用 dp 的主機。
* Used dp server for error reporting.
* 更新服務改使用 gitee 的 IP 檢查連線狀態。
* updated service uses gitee IP address instead.
dragonpilot 0.7.8.1
========================
* 加入 ko-KR 翻譯。
* Added ko-KR translation.
* 加入 Honda Jade 支援。(感謝 @李俊灝)
* Added Honda Jade support. (Thanks to @lijunhao731)
* 修正 ui.cc 內存越界的問題。(感謝 @piggy 提供)
* Fixed ui.cc memory out of bound issue. (Thanks to @piggy)
* gpxd 記錄改自動存成 zip 格式。
* gpxd now store in zip format.
* 強制關閉 panda 檢查 DOS 硬體。
* Force disabled DOS hardware check in panda.
dragonpilot 0.7.8.0
========================
* 基於最新 openpilot 0.7.8 devel.
* Based on latest openpilot 0.7.8 devel.
* 加入重置 DP 設定按鈕。(感謝 @LOVEChen 建議)
* Added "Reset DP Settings" button. (Thanks to @LOVEChen)
* 將警示訊息更改為類似於概念 UI 的設計。
* Alert messages changed to concept UI alike design.
* 當 manager 出現錯誤後,按 Exit 按鈕會執行 reset_update 腳本。
* Added ability to execute reset_update.sh when press "Exit" button once manager returned errors.
dragonpilot 0.7.7.3
========================
* 修正方向盤監控。
* Fixed steering monitor timer param.
* 修正行駛時關閉畫面導致當機的錯誤。(感謝 @salmankhan, @stevej99, @bobbydough 回報)
* Fixed screen frozen issue when "screen off while driving" toggle is enabled. (Thanks to @salmankhan, @stevej99, @bobbydough)
* 加回 Dev Mini UI 開關。(感謝 @Ninjaa 建議)
* Re-added Dev Mini UI. (Thanks to @Ninjaa)
* 新增 (dp_reset_live_parameters_on_start) 每次發車重設 LiveParameters 值。(感謝 @eisenheim)
* Added ability (dp_reset_live_param_on_start) to reset LiveParameters on each start. (Thanks @eisenheim)
* 修正同時開啟 dp_toyota_zss 和 dp_lqr 產生的錯誤。(感謝 @bobbydough)
* Fixed error cuased by enabling both dp_toyota_zss and dp_lqr at the same time. (Thanks to @bobbydough)
* 新增 (dp_gpxd) 將 GPS 軌跡導出至 GPX 格式 (/sdcard/gpx_logs/)的功能。 (感謝 @mageymoo1
* Added ability (dp_gpxd) to export GPS track into GPX files (/sdcard/gpx_logs/). (Thanks to @mageymoo1)
* 使用德國的車道寬度估算值。 (感謝 @arne182
* Used lane width estimate value from Germany. (Thanks to @arne182)
dragonpilot 0.7.7.2
========================
* 加入 d_poly offset。 (感謝 @ShaneSmiskol)
* Added d_poly offset. (Thanks to @ShaneSmiskol)
* 加入 ZSS 支援。(感謝 @bobbydough, @WilliamPrius 建議, @bobbydough 測試)
* Added ZSS support. (Thanks to @bobbydough, @WilliamPrius for recommendation, @bobbydough for testing)
* 加入錯誤記錄至 /sdcard/crash_logs/ (感謝 @ShaneSmiskol 提供代碼)
* Added error logs to /sdcard/crash_logs/ (Special Thanks to @ShaneSmiskol)
* 加入 LQR 控制器開關進設定畫面。
* Added LQR Controller toggle to settings.
dragonpilot 0.7.7.1
========================
* 加入 C2 風扇靜音模式。(感謝 @dingliangxue)
* Added C2 quiet fan mode. (Thanks to @dingliangxue)
* 加入「輔助換道最低啟動速度」、「自動換道最低啟動速度」設定。
* Added "Assisted Lane Change Min Engage Speed" and "Auto Lane Change Min Engage Speed" settings.
* 加入回調校介面。(感謝 @Kent)
* Re-added Dev UI. (Thanks to @Kent)
* 加入 "dp_lqr" 設定來強制使用 RAV4 的 lqr 調校。(感謝 @eisenheim)
* Added "dp_lqr" setting to force enable lqr tuning from RAV4. (Thanks to eisenheim)
dragonpilot 0.7.7.0
========================
* 基於最新 openpilot 0.7.7 devel.
* Based on latest openpilot 0.7.7 devel.
* 當 Manager 出現錯誤時,顯示 IP 位置。(感謝 @dingliangxue)
* When Manager failed, display IP address. (Thanks to @dingliangxue)
* 加回 sr learner 開關。
* Re-added sr learner toggle.
* 加回 加速模式 開關。
* Re-added Accel Profile toggle.
* Toyota 加入改寫最低巡航速度功能。(感謝 @Mojo)
* Added Toyota to override lowerest cruise speed. (Thanks to @Mojo)
* 介面加入盲點偵測顯示。(感謝 @wabes)
* Added BSM indicator to UI. (Thanks to @wabes)
* 加回彎道減速功能。(感謝 @Mojo)
* re-added Slow On Curve functionality. (Thanks to @Mojo)
dragonpilot 0.7.6.2
========================
* 修正無法正確關閉駕駛監控的問題。
* Fixed unable to properly turn off driver monitor issue.
dragonpilot 0.7.6.1
========================
* 基於最新 openpilot 0.7.6.1 devel.
* Based on latest openpilot 0.7.6.1 devel.
* 優化並整合 dp 服務。 (所有的設定檔已改名,請重新設定所有的功能)
* Optimized and integrated several dp services. (Settings have been renamed, please re-config all settings)
* 完全關閉 steer ratio learner。
* Completely disabled steer ratio learner.
* 移除「加速模式」。
* Removed Accel Profile.
* 加入本田皓影混電版指紋v1。(感謝 @劉駿)
* Added Honda Breeze Hybrid FPv1. (Thanks to @劉駿)
* 加入台灣版 Toyota Prius 4.5 指紋v1。(感謝 @jeekid)
* Added Taiwan Toyota Prius 4.5 FPv1. (Thanks to @jeekid)
dragonpilot 0.7.5.4
========================
* Dynamic Follow 更新模型。(感謝 @ShaneSmiskol 提供代碼、 @cgw1968 測試)
* Updated Dynamic Follow model. (Special Thanks to @ShaneSmiskol for the feature and @cgw1968 for testing)
dragonpilot 0.7.5.3
========================
* Dynamic Follow 更新至 ShaneSmiskol:stock_additions 0.7.5 版。(感謝 @ShaneSmiskol 提供代碼、 @Wei 測試)
* Updated Dynamic Follow to ShaneSmiskol:stock_additions 0.7.5. (Special Thanks to @ShaneSmiskol for the feature and @Wei for testing)
* 優化 Lexus GSH 轉向。(感謝 @簡銘佑 測試)
* Optimize Lexus GSH steering. (Thanks to @簡銘佑)
* C2 支援自動關機「DragonAutoShutdownAt」參數。(感謝 @cgw1968 建議)
* C2 to support auto shutdown "DragonAutoShutDownAt" param. (Thanks to @cgw1968)
* 修正出現「pedalPressed」的錯誤。(感謝 @Wei 回報)
* Fixed issue showing "pedalPressed" error. (Thanks to @Wei)
* 將剎車狀熊顯示於 dp 資訊欄。
* Added brake indicator to dp infobar.
* 修正「溫度監控」燈示。
* Fixed "Temp monitor" indicator.
* 加入「方向燈取消控制」延遲控制設。(感謝 @wabes 建議)
* Added delay config to "Disable Lat Control on Blinker". (Thanks to @wabes)
* 加入巴西版 2020 Corolla Hybrid 指紋v2。(感謝 @berno22 提供)
* Added Brazil 2020 Corolla Hybrid FPv2. (Thanks to @berno22)
dragonpilot 0.7.5.2
========================
* 加入對 VW MQB/PQ 的支援。(感謝 @dingliangxue 移植)
* Added support to VW MQB/PQ platform. (Thanks to @dingliangxue)
* 修改成 3 小時後停止供電。(感謝 @Wei 建議)
* Updated to stop charging after 3 hrs. (Thanks to @Wei)
* 移除行車記錄下的「碰撞偵測」功能。
* Removed Impact Detection in Dashcam.
* 修正開啟「Noctua 風扇」模式導致的錯誤。(感謝 @阿濤 回報)
* Fixed a bug caused by enabling "Noctua Mod". (Thanks to @阿濤)
* 修正「位智模式」無法顯示警示的問題。(感謝 @axandres 回報)
* Fixed alert issue in waze mode. (Thanks to @axandres)
* 修正無法顯示更新中圖示的問題。
* Fixed unable to display "UPDATING" icon issue.
* 加入「允許多次自動換道」功能。(感謝 @阿濤 建議)
* Added "Allow Continuous Auto Lane Change" Toggle. (Thanks to @阿濤)
* 修正開機後設定頁面有時會錯誤的問題。(感謝 @salmankhan@Wei 回報)
* Fixed setting page crash issue. (Thanks to @salmankhan, @Wei)
* 修正熄火後一直出現更新訊息的錯誤。(感謝 @Sky Chang 回報)
* Fixed issue that keep showing update prompt. (Thanks to @Sky Chang)
dragonpilot 0.7.5.1
========================
* 修正因同時使用「社群功能」和「自定車型」造成的加減速問題。(特別感謝 @Wei@Sky Chang、@Han9365@鄧育林 的測試以及回報。)
* Fixed acceleration issue caused by used of both "Community Maintain Feature" and "Custom Car Model". (Special Thanks to @Wei, @Sky Chang, @Han9365, @鄧育林)
* 新增 DragonMaxSpeedLimit 設定值 (mph),當如果車速高於此值 op 將會停止操控。(感謝 @Anthony 建議)
* Added DragonMaxSpeedLimit parameter (mph), op will stop controlling when car speed is high than the value. (Thanks to @Anthony)
* 更新 appd 使用 cnpmjs 來下載 APKs。
* Updated appd to use cnpmjs to download APKs.
* 修正更新服務。(感謝 @Wei)
* Fixed Update Service. (Thanks to @Wei)
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v2)。(感謝 明峰 提供)
* Added Canada 2018 Toyota Sienna LTD fingerprint (v2). (Thanks to 明峰)
* 新增「通過移動網路上傳」開關
* Added Upload Over Mobile Network toggle.
* 新增「通過熱點上傳」開關
* Added Upload Over Hotspot toggle.
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v1)。(感謝 明峰 提供)
* Added Canada 2018 Toyota Sienna LTD fingerprint (v1). (Thanks to 明峰)
* 新增大陸版 Volkswagen Golf GTI 指紋 (v1)。(感謝 easyeiji 提供)
* Added China Volkswagen Golf GTI fingerprint (v1). (Thanks to easyeiji)
dragonpilot 0.7.5.0
========================
* 基於最新 openpilot 0.7.5 devel-staging.
* Based on latest openpilot 0.7.5 devel-staging.
* 更新 dp 圖示 (特別感謝 @wabes 的設計與提供)。
* Updated dp logo, special thanks to @wabes for the design.
* 簡/繁中文版和 i18n 整合成為單一版本。
* Merged zhs/zht/i18n versions into one.
* 新增大陸版 CAMRY HYBRID 指紋v2。(感謝 @杜子腾)
* Added China Camery Hybrid FPv2. (Thanks to @杜子腾)
* 新增台灣版 Altis HYBRID 指紋v1。(感謝 @Fish)
* Added Taiwan Altis Hybrid FPv1. (Thanks to @Fish)
* 新增行駛時關閉畫面功能。
* Added Screen off while driving feature.
* 新增倒車時關閉畫面功能。
* Added Screen off while reversing feature.
* 新增駕駛介面加入「加速模式」切換鈕。
* Added acceleration profile toggle onto driving UI.
* 新增自定車型功能,取代指紋暫存功能。
* Replaced fingerprint cache with custom car model selector.
* 新增可調亮度。
* Added Brightness changer.
* 新增部分德語支持。(特別感謝 @arne182 提供)
* Added partial de_DE language support (Thanks to @arne182)
* 新增停車碰撞偵測記錄功能。
* Added off road impact detection to dashcam.
2020-05-06
========================
* 更新 dp 圖示 (特別感謝 @wabes 的設計與提供)。
* 中文版整合進 i18n 版。
* 刪除指紋暫存功能。
* 新增 CAMERY HIBRID 指紋。(感謝 @杜子腾)
* 新增行駛時關閉畫面功能。
* 新增倒車時關閉畫面功能。
* 新增駕駛介面加入「加速模式」切換鈕。
* 新增自定義車型。
2020-04-16
========================
* [DEVEL] 加入台灣版 2016 Lexus IS200t 指紋。(感謝 Philip / Cody Dai)
* [DEVEL] 加入台灣版 2016 Toyota Prius 4.5 代指紋。(感謝 Philip)
* [DEVEL] 加入台灣版 201x Toyota RAV4 4WD 指紋。(感謝 Philip)
* [DEVEL] 加入台灣版 2020 Toyota Auris w/ LTA 指紋。(感謝 Philip)
* [DEVEL] 修正 commIssue 錯誤。(感謝 Kent 協助)
2020-04-13
========================
* [DEVEL] 加入可調整 Toyota Sng 起步反應值 (DragonToyotaSngResponse)。 (特別感謝 @Wei 提供 PR)
* [DEVEL] 駕駛介面加入「動態調整車距」按鈕。(感謝 @cgw1968-5779 建議)
* [DEVEL] 更新 update script。(感謝 深鯨希西 回報)
2020-04-10
========================
* [DEVEL] 更新 panda 至最新的 comma:master 分支。
* [DEVEL] 移除所有的第三方應用改為自動下載。
* [DEVEL] 移除「啟用原廠 DSU 模式」、「安全帶檢查」、「車門檢查」開關。
2020-03-31
========================
* [DEVEL] 更新至 2020-03-31 testing 分支。
2020-03-27
========================
* [DEVEL] 更新至最新的 testing 分支:
* 加入波蘭版 2015 Lexus NX200T 支援。(感謝 wabes 提供)
* 調整「啟用原廠 DSU 模式」為不再需要 AHB 。(Enable Stock DSU Mode no longer requires "AHB" toggle)
* 加入「安全帶檢查」、「車門檢查」、「檔位檢查」、「溫度檢查」開關。
* 加入曲率學習功能 - Curvature Learner 。(感謝 zorrobyte 提供)
* 加入大陸版 2018 Toyota Highlander 支援。(感謝 toyboxZ 提供)
* 加入大陸版 2018 Toyota Camry 2.0 支援。(感謝 Rming 提供)
* 加入韓文支持。(感謝 crwusiz 提供)
* 調整 OFFROAD 主頁翻譯將 "dragonpilot" 改回 "openpilot"。
2020-03-22
========================
* [DEVEL] 更新至最新的 testing 分支。
2020-03-17
========================
* [DEVEL] 更新至最新的 testing 分支 (commaai:devel-staging 0.7.4)。
* [DEVEL] 加入動態調整車距功能。(特別感謝 @ShaneSmiskol 提供 PR)
2020-03-14
========================
* [DEVEL] 更新 pt-Br (葡萄牙語) 翻譯。(感謝 berno22 提供)
* [DEVEL] 加入自動關機開關。(感謝 Rzxd 建議)
* [DEVEL] 調高 Toyota 扭力容錯值。
* [DEVEL] 優化讀取 dp 設定值。
* [DEVEL] 加入 2019 手動 Civic 指紋。感謝 (AlexNoop 提供)
* [DEVEL] dp 功能加入對 Subaru 車系的支援。
2020-03-06
========================
* [DEVEL] 加入葡萄牙語支持。(感謝 berno22 提供)
* [DEVEL] 加入大陸 2018 Camry、2020 RAV4 指紋。(感謝 笨木匠 提供)
* [DEVEL] 建立 devel-i18n 取代 devel-en。
* [DEVEL] devel-en is deprecated, please switch to devel-i18n instead.
2020-03-04
========================
* [DEVEL] 加入顯示駕駛監控畫面。
* [DEVEL] 加入加速模式選項。(特別感謝 @arne182, @cgw1968-5779 提供 PR)
* [DEVEL] 修正 shutdownd 在 comma two 可能會不正常關機的錯誤。(感謝 @Wei, @Rzxd 回報)
2020-02-25
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.3)。
2020-02-21
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.3)。
2020-02-14
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.2)。
* [DEVEL] 修正錯誤。
2020-02-08
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.2)。
* [DEVEL] dp 功能加入對現代 (Hyundai) 車系的支援。
* [DEVEL] 加入神盾測速照相自動啟動的開關。
* [DEVEL] 更新高德地圖至 v4.5.0.600053。
* [DEVEL] 使用 0.6.6 版的更新系統。
* [DEVEL] 修正急剎問題。(感謝 kumar 提供)
2020-01-31
========================
* [DEVEL] 移除行車介面電量、溫度顯示,(修正畫面當機、黑屏問題)
2020-01-29
========================
* [DEVEL] 修正行車介面錯誤。(感謝 深鲸希西 測試eisenheim、HeatNation 反應)
2020-01-23
========================
* [DEVEL] 加入 Steer Ratio Learner 關閉。(感謝 eisenheim 建議)
* [DEVEL] 行車介面加入電量、溫度。(感謝 eisenheim 建議)
* [DEVEL] 優化 appd。
2020-01-19
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.1)。
* [DEVEL] 調整 appd 和 ALC 邏輯。
2020-01-14
========================
* [DEVEL] 加入開機啟動個人熱點。(感謝 eisenheim 建議)
2020-01-08
========================
* [DEVEL] 加入大陸版 2018 Lexus RX300 支援。(感謝 cafe 提供)
* [DEVEL] 加入 DragonBTG 設定。(感謝 CloudJ、低調哥、歐姓Altis車主 提供)
2019-12-31
========================
* [DEVEL-ZHS] 加回第三方應用。
2019-12-29
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.0)。
* [DEVEL] 輔助/自動變道改為可調整參數 (進階用戶)。(DragonAssistedLCMinMPH、DragonAutoLCMinMPH、DragonAutoLCDelay)
* [DEVEL-ZHS] 修正無法運行第三方應用錯誤。(感謝 深鲸希西 反應)
2019-12-18
========================
* [DEVEL] 修正自動換道邏輯。
* [DEVEL] 更新 offroad 翻譯。
* [DEVEL] 錯誤修正。
* [DEVEL] 移除美版 2017 Civic Hatchback 指紋。(與其它車型衝突)
2019-12-17
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.0)。
* [DEVEL] 加入輔助換道開關。24mph / 40kph 以上)
* [DEVEL] 加入自動換道開關。40mph / 65kph 以上)
* [DEVEL] 加入大陸版 2019 雷凌汽油版指紋。 (感謝 Shell 提供)
* [DEVEL] 加入大陸版 2019 卡羅拉汽油版指紋。 (感謝 Shell 提供)
* [DEVEL] 加入美版 2017 Civic Hatchback 指紋。(感謝 CFranHonda 提供)
2019-12-10
========================
* [DEVEL] 加入位智車機模式。 (Waze Mode)
2019-11-21
========================
* [DEVEL] 修正 offroad 翻譯。(感謝 鄧育林 回報)
* [DEVEL] 調整前車靜止移動偵測參數。
* [DEVEL] 前車靜止移動偵測可在未啟用 dp 時運作。
2019-11-18
========================
* [DEVEL] 修正 offroad 翻譯。(感謝 Cody、鄧育林 回報)
2019-11-18
========================
* [DEVEL] 修正 frame 翻譯。
2019-11-15
========================
* [DEVEL] 修正不會充電的錯誤。 (感謝 袁昊 反應)
2019-11-15
========================
* [DEVEL] 修正充電控制。 (感謝 KT 反應)
* [DEVEL] 更新 frame 翻譯,改為多語言版。 (感謝 深鲸希西、shaoching885、鄧育林 反應)
* [DEVEL] 更新至最新的 commaai:devel (0.6.6)。
2019-11-12
========================
* [DEVEL] 只顯示電量文字 (注意:有時不會更新,需要拔插 USB 線)
* [DEVEL] 自動偵測並鎖定硬體 (EON / UNO)。
2019-11-12
========================
* [DEVEL] 加入鎖定硬體 (EON / UNO) 的程式碼。
2019-11-11
========================
* [DEVEL] 更新高德地圖至 v4.3.0.600310 R2098NSLAE
* [DEVEL] 更新 MiXplorer 至 v6.40.3
* [DEVEL] 更新至最新的 commaai:devel (0.6.6)。
* [DEVEL] 前車靜止移動偵測加入偵測警示。
2019-11-07
========================
* [DEVEL] 讓 Bosch 系統顯示三角。 (感謝 ching885 回報)
* [DEVEL] 更新 offroad 多語言版簡體中文翻譯 (感謝 Rming 提供)
2019-11-06
========================
* [DEVEL] 修正 0.6.6 appd 和 dashcamd 錯誤。 (感謝 鄧育林 回報)
* [DEVEL] 更新至最新的 commaai:devel (0.6.6)。
2019-11-05
========================
* [DEVEL] 加入台灣 Lexus 2017 GS450h 支援。 (感謝 簡銘佑 提供指紋)
2019-11-01
========================
* [DEVEL] 新增神盾測速照相。 (感謝 Sky Chang 和 Wei Yi Chen)
* [DEVEL] 修正 offroad 翻譯。 (感謝 Leo Hsieh)
2019-11-01
========================
* [DEVEL] 移除 Miui 字型,縮小 dp 使用空間。
* [DEVEL] 更新 offroad 為多語言版
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
2019-10-29
========================
* [DEVEL] 加入 SnG 補丁。(感謝 楊雅智)
2019-10-28
========================
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
* [DEVEL] 調整 dragon_allow_gas 邏輯 (請回報任何問題,需更新 Panda 韌體)
2019-10-18
========================
* [DEVEL] 加入前車靜止移動偵測。(測試版,感謝 ucolchen)
* [DEVEL] 移除強迫網路連線提示。(感謝 Shell)
* [DEVEL] 修正 allow_gas 功能。
2019-10-18
========================
* [DEVEL] 加入彎道減速功能開關。
* [DEVEL] 強迫使用 dp 版 Panda 韌體。
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
2019-10-17
========================
* [DEVEL] 加入「車型」顯示於 dp 設定畫面。
* [DEVEL] 修正充電控制讀取預設值的錯誤。
* [DEVEL] 修正無法顯示更新記錄的錯誤。
2019-10-16
========================
* [DEVEL] 刷新 Panda 韌體按鈕將會自動重啟 EON。(感謝 鄧育林 建議)
* [DEVEL] 下載更新記錄時使用 "no-cache" 標頭。
* [DEVEL] 更新高德地圖至 v4.3.0
* [DEVEL] 刪除 bs (Branch Switcher)
2019-10-14
========================
* [DEVEL] 啟用自動更新功能。(感謝 鄧育林 提供)
* [DEVEL] 清除不再使用的 dp params。
* [DEVEL] 加入數字電量指示。(感謝 鄧育林 建議)
* [DEVEL] 加入刷新 Panda 韌體按鈕。
2019-10-11
========================
* [DEVEL] 更新至最新的 commaai:devel (0.6.5)。
* [DEVEL] 加入台灣 2019 RAV4 汽油版指紋。 (感謝 Max Duan / CloudJ 提供)
2019-10-09
========================
* [DEVEL] 加入當 LatCtrl 關閉時,畫面顯示提示訊息。
2019-10-08
========================
* [DEVEL] 加回駕駛監控開關。
* [DEVEL] 加入 bs (branch switcher) 程式。
2019-10-07
========================
* [DEVEL] 加入台灣版 2019 RAV4H 油電版指紋。(感謝 Max Duan 提供)
2019-10-05
========================
* [DEVEL] 移除 curvature learner: 轉角明顯比原廠小。
* [DEVEL] 更新至最新的 commaai:devel (0.6.4)。
2019-09-30
========================
* [DEVEL] 更新 curvature learner 版本至 v4。
* [DEVEL] Lexus ISH 使用更精確的 EPS Steering Angle Sensor
2019-09-27
========================
* [DEVEL] 加入 Zorrobyte 的 curvature learner (https://github.com/zorrobyte/openpilot)
* [DEVEL] 加入可開關駕駛監控的程式碼。
* [DEVEL] 取消當 steering 出現錯誤時,自動切斷方向控制 2 秒的機制。
* [DEVEL] 讓行車介面的「方向盤」/「轉彎」圖示半透明化。
2019-09-26
========================
* [DEVEL] 修正當「啟用記錄服務」關閉時make 會有問題的錯誤。 (感謝 shaoching885 和 afa 回報)
2019-09-24
========================
* [DEVEL] 行車介面加入可開關的「前車」、「路線」、「車道」設定。
* [DEVEL] 行車介面加入可開關的「方向燈號」提示。 (感謝 CloudJ 建議,程式碼來源: https://github.com/kegman/openpilot)
2019-09-23
========================
* [DEVEL] 優化讀取 params 的次數。
* [DEVEL] 加入可開關的車道偏移警示。
* [DEVEL] 修正充電控制邏輯。
* [DEVEL] 加入台灣 Prius 4.5 指紋。 (感謝 Lin Hsin Hung 提供)
2019-09-20
========================
* [DEVEL] 加入充電控制功能。 (感謝 loveloveses 和 KT 建議)
2019-09-16
========================
* [DEVEL] 加入台灣 CT200h 指紋。 (感謝 CloudJ 提供)
* [DEVEL] 加入美版 CT200h 移植。 (感謝 thomaspich 提供)
2019-09-13
========================
* [DEVEL] 行車介面加入可開關的「速度顯示」設定。
2019-09-09
========================
* [DEVEL] 加入 GreyPanda 模式。
2019-08-28
========================
* [DEVEL] 加入可調警示音量。
2019-08-27
========================
* [DEVEL] 自動關機改為可調時長。

301
CHANGELOGS-REL.md Normal file
View File

@@ -0,0 +1,301 @@
dragonpilot 0.8.0
========================
* 基於最新 openpilot 0.8.0 devel.
* Based on latest openpilot 0.8.0 devel.
* 加入 git 錯誤修正。(感謝 @toyboxZ 提供)
* Added git error fix. (Thanks to @toyboxZ)
dragonpilot 0.7.10.0
========================
* 基於最新 openpilot 0.7.10 devel.
* Based on latest openpilot 0.7.10 devel.
* 修正 Prius 特定情況下無法操控方向盤的問題。
* Fixed unable to regain Prius steering control under certain condition.
* 更新 VW MQB 的支援。(需執行 scripts/vw.sh 腳本)
* Updated support of VW MQB. (scripts/vw.sh script required)
* 新增 2018 China Toyota CHR 指紋v2。感謝 @xiaohongcheung 提供)
* Added 2018 China Toyota CHR FPv2. (Thanks to @xiaohongcheung)
* 加入 Headunit Reloaded Android Auto App 支援。(感謝 @Ninjaa 提供)
* Added Headunit Reloaded Android Auto App Support. (Thanks to @Ninjaa)
* 優化 nanovg。(感謝 @piggy 提供)
* Optomized nanovg. (Thanks to @piggy)
* 加入 complete_setup.sh (感謝 @深鲸希西 提供)
* Added complete_setup.sh (Thanks to @深鲸希西)
* Based on latest openpilot 0.7.10 devel.
* 修正 EON 接 PC/USB 充電器時仍會自動關機的錯誤。(感謝 @小愛 回報)
* Fixed auto shutdown issue when EON connect to PC/USB Charger. (Thanks to @LOVEChen)
* HYUNDAI_GENESIS 使用 INDI 控制器。(感謝 @donfyffe 提供)
* HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe)
* HYUNDAI_GENESIS 加入 Cruise 按紐 和 lkMode 支援。(感謝 @donfyffe 建議)
* HYUNDAI_GENESIS added Cruise button event and lkMode feature. (Thanks to @donfyffe)
* 支援台灣版 2018 Huyndai IONIQ + smart MDPS (dp_hkg_smart_mdps) (感謝 @andy741217 提供)
* Support 2018 Taiwan Hyundai IONIQ + smart MDPS (dp_hkg_smart_mdps) (Thanks to @andy741217)
* 使用 openpilot v0.8 的模型。(感謝 @eisenheim)
* Use openpilot v0.8 model. (Thanks to @eisenheim)
* 加入 0.8 測試版的部分優化。
* Added optimizations from pre-0.8.
* 加入 dp_honda_eps_mod 設定來使用更高的扭力 (需 eps mod)。(感謝 @Wuxl_369 提供)
* Added dp_honda_eps_mod setting to enable higher torque (eps mod required). (Thanks to @Wuxl_369)
* 修正 VW 對白/灰熊的支援 (感謝 @lirudy 提供)
* Fixed issue with white/grey panda support for VW (Thanks to @lirudy)
* GENESIS_G70 優化 (感謝 @sebastian4k 提供)
* GENESIS_G70 Optimisation (Thanks to @sebastian4k)
* HYUNDAI_GENESIS 優化 (感謝 @donfyffe 提供)
* HYUNDAI_GENESIS Optimisation (Thanks to @donfyffe)
* 加入 Dynamic gas Lite。(感謝 @toyboxZ 提供)
* Added Dynamic Gas Lite. (Thanks to @toyboxZ)
* 加入來自 afa 的 Honda inspire, accord, crv SnG 優化。(感謝 @menwenliang 提供)
* Added Honda inspire, accord, crv SnG optimisation from afa fork. (Thanks to @menwenliang)
* 加入 dp_toyota_lowest_cruise_override_vego。(感謝 @toyboxZ 提供)
* Added dp_toyota_lowest_cruise_override_vego. (Thanks to @toyboxZ)
dragonpilot 0.7.8
========================
* 基於最新 openpilot 0.7.8 devel.
* Based on latest openpilot 0.7.8 devel.
* 加入重置 DP 設定按鈕。(感謝 @LOVEChen 建議)
* Added "Reset DP Settings" button. (Thanks to @LOVEChen)
* 將警示訊息更改為類似於概念 UI 的設計。
* Alert messages changed to concept UI alike design.
* 當 manager 出現錯誤後,按 Exit 按鈕會執行 reset_update 腳本。
* Added ability to execute reset_update.sh when press "Exit" button once manager returned errors.
* 加入 ko-KR 翻譯。
* Added ko-KR translation.
* 加入 Honda Jade 支援。(感謝 @李俊灝)
* Added Honda Jade support. (Thanks to @lijunhao731)
* 修正 ui.cc 內存越界的問題。(感謝 @piggy 提供)
* Fixed ui.cc memory out of bound issue. (Thanks to @piggy)
* gpxd 記錄改自動存成 zip 格式。
* gpxd now store in zip format.
* 強制關閉 panda 檢查 DOS 硬體。
* Force disabled DOS hardware check in panda.
* 修正在沒網路的情況下,開機超過五分鐘的問題。
* Fixed 5+ minutes boot time issue when there is no internet connection.
* 錯誤回傳改使用 dp 的主機。
* Used dp server for error reporting.
* 更新服務改使用 gitee 的 IP 檢查連線狀態。
* updated service uses gitee IP address instead.
* VW 加入 6 分鐘時間方向盤控制限制輔助方案。(特別感謝 @actuallylemoncurd 提供代碼)
* VW added 6 minutes timebomb assist. (dp_timebomb_assist, special thanks to @actuallylemoncurd)
dragonpilot 0.7.7.0
========================
* 基於最新 openpilot 0.7.7 devel.
* Based on latest openpilot 0.7.7 devel.
* 當 Manager 出現錯誤時,顯示 IP 位置。(感謝 @dingliangxue)
* When Manager failed, display IP address. (Thanks to @dingliangxue)
* 加回 sr learner 開關。
* Re-added sr learner toggle.
dragonpilot 0.7.6
========================
* 基於最新 openpilot 0.7.6.1 devel.
* Based on latest openpilot 0.7.6.1 devel.
* 優化並整合 dp 服務。 (所有的設定檔已改名,請重新設定所有的功能)
* Optimized and integrated several dp services. (Settings have been renamed, please re-config all settings)
* 完全關閉 steer ratio learner。
* Completely disabled steer ratio learner.
* 移除「加速模式」。
* Removed Accel Profile.
* 加入本田皓影混電版指紋v1。(感謝 @劉駿)
* Added Honda Breeze Hybrid FPv1. (Thanks to @劉駿)
* 加入台灣版 Toyota Prius 4.5 指紋v1。(感謝 @jeekid)
* Added Taiwan Toyota Prius 4.5 FPv1. (Thanks to @jeekid)
* 加入 2020 Toyota Prius 指紋v2。(感謝 @Trae)
* Added Toyota Prius 2020 FPv2. (Thanks to @Trae)
* 優化 Honda CR-V Hybrid 轉向。(感謝 @martint1980)
× Optomised Honda CR-V Hybrid lateral control. (Thanks to @martint1980)
dragonpilot 0.7.5
========================
* 優化 Lexus GSH 轉向。(感謝 @簡銘佑 測試)
* Optimize Lexus GSH steering. (Thanks to @簡銘佑)
* C2 支援自動關機「DragonAutoShutdownAt」參數。(感謝 @cgw1968 建議)
* C2 to support auto shutdown "DragonAutoShutDownAt" param. (Thanks to @cgw1968)
* 將剎車狀熊顯示於 dp 資訊欄。
* Added brake indicator to dp infobar.
* 加入「方向燈取消控制」延遲控制設。(感謝 @wabes 建議)
* Added delay config to "Disable Lat Control on Blinker". (Thanks to @wabes)
* 加入巴西版 2020 Corolla Hybrid 指紋v2。(感謝 @berno22 提供)
* Added Brazil 2020 Corolla Hybrid FPv2. (Thanks to @berno22)
* 加入對 VW MQB/PQ 的支援。(感謝 @dingliangxue 移植)
* Added support to VW MQB/PQ platform. (Thanks to @dingliangxue)
* 加入「允許多次自動換道」功能。(感謝 @阿濤 建議)
* Added "Allow Continuous Auto Lane Change" Toggle. (Thanks to @阿濤)
* 新增 DragonMaxSpeedLimit 設定值 (mph),當如果車速高於此值 op 將會停止操控。(感謝 @Anthony 建議)
* Added DragonMaxSpeedLimit parameter (mph), op will stop controlling when car speed is high than the value. (Thanks to @Anthony)
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v2)。(感謝 明峰 提供)
* Added Canada 2018 Toyota Sienna LTD fingerprint (v2). (Thanks to 明峰)
* 新增「通過移動網路上傳」開關
* Added Upload Over Mobile Network toggle.
* 新增「通過熱點上傳」開關
* Added Upload Over Hotspot toggle.
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v1)。(感謝 明峰 提供)
* Added Canada 2018 Toyota Sienna LTD fingerprint (v1). (Thanks to 明峰)
* 新增大陸版 Volkswagen Golf GTI 指紋 (v1)。(感謝 easyeiji 提供)
* Added China Volkswagen Golf GTI fingerprint (v1). (Thanks to easyeiji)
* 更新 dp 圖示 (特別感謝 @wabes 的設計與提供)。
* Updated dp logo, special thanks to @wabes for the design.
* 簡/繁中文版和 i18n 整合成為單一版本。
* Merged zhs/zht/i18n versions into one.
* 新增大陸版 CAMRY HYBRID 指紋v2。(感謝 @杜子腾)
* Added China Camery Hybrid FPv2. (Thanks to @杜子腾)
* 新增台灣版 Altis HYBRID 指紋v1。(感謝 @Fish)
* Added Taiwan Altis Hybrid FPv1. (Thanks to @Fish)
* 新增行駛時關閉畫面功能。
* Added Screen off while driving feature.
* 新增倒車時關閉畫面功能。
* Added Screen off while reversing feature.
* 新增駕駛介面加入「加速模式」切換鈕。
* Added acceleration profile toggle onto driving UI.
* 新增自定車型功能,取代指紋暫存功能。
* Replaced fingerprint cache with custom car model selector.
* 新增可調亮度。
* Added Brightness changer.
* 新增部分德語支持。(特別感謝 @arne182 提供)
* Added partial de_DE language support (Thanks to @arne182)
dragonpilot 0.7.4
========================
* [2020-04-10] 移除所有的第三方應用改為自動下載。
* [2020-04-10] 移除「啟用原廠 DSU 模式」、「安全帶檢查」、「車門檢查」開關。
* [2020-03-31] 還原部分修改代碼以達到 comma ai 安全準則。 (Reverted changes to panda safety code to comply with comma ai safety guideline.)
* [2020-03-31] 調整「啟用原廠 DSU 模式」為踩剎車時會暫時斷開控制 。(Enable Stock DSU Mode will temporary disable controls when brake is pressed.)
* [2020-03-27] 加入波蘭版 2015 Lexus NX200T 支援。(感謝 wabes 提供)
* [2020-03-27] 調整「啟用原廠 DSU 模式」為不再需要 AHB 。(Enable Stock DSU Mode no longer requires "AHB" toggle)
* [2020-03-27] 加入「安全帶檢查」、「車門檢查」、「檔位檢查」、「溫度檢查」開關。
* [2020-03-27] 加入曲率學習功能 - Curvature Learner 。(感謝 zorrobyte 提供)
* [2020-03-27] 加入大陸版 2018 Toyota Highlander 支援。(感謝 toyboxZ 提供)
* [2020-03-27] 加入大陸版 2018 Toyota Camry 2.0 支援。(感謝 Rming 提供)
* [2020-03-27] 加入韓文支持。(感謝 crwusiz 提供)
* [2020-03-27] 調整 OFFROAD 主頁翻譯將 "dragonpilot" 改回 "openpilot"。
dragonpilot 0.7.3
========================
* [2020-03-17] 加入動態調整車距功能。(特別感謝 @ShaneSmiskol 提供 PR)
* [2020-03-14] 更新 pt-Br (葡萄牙語) 翻譯。(感謝 berno22 提供)
* [2020-03-14] 加入自動關機開關。(感謝 Rzxd 建議)
* [2020-03-14] 調高 Toyota 扭力容錯值。
* [2020-03-14] 優化讀取 dp 設定值。
* [2020-03-14] 加入 2019 手動 Civic 指紋。感謝 (AlexNoop 提供)
* [2020-03-14] dp 功能加入對 Subaru 車系的支援。
* [2020-03-06] 加入葡萄牙語支持。(感謝 berno22 提供)
* [2020-03-06] 加入大陸 2018 Camry、2020 RAV4 指紋。(感謝 笨木匠 提供)
* [2020-03-04] 加入顯示駕駛監控畫面。
* [2020-03-04] 加入加速模式選項。(特別感謝 @arne182, @cgw1968-5779 提供 PR)
* [2020-03-04] 修正 shutdownd 在 comma two 可能會不正常關機的錯誤。(感謝 @Wei, @Rzxd 回報)
dragonpilot 0.7.2
========================
* [2020-02-08] dp 功能加入對現代 (Hyundai) 車系的支援。
* [2020-02-08] 加入神盾測速照相自動啟動的開關。
* [2020-02-08] 更新高德地圖至 v4.5.0.600053。
* [2020-02-08] 使用 0.6.6 版的更新系統。
* [2020-02-08] 修正急剎問題。(感謝 kumar 提供)
* [2020-01-31] 移除行車介面電量、溫度顯示,(修正畫面當機、黑屏問題)
* [2020-01-29] 修正行車介面錯誤。(感謝 深鲸希西 測試eisenheim、HeatNation 反應)
* [2020-01-23] 加入 Steer Ratio Learner 關閉。(感謝 eisenheim 建議)
* [2020-01-23] 行車介面加入電量、溫度。(感謝 eisenheim 建議)
* [2020-01-23] 優化 appd。
dragonpilot 0.7.1
========================
* [2020-01-19] 調整 appd 和 ALC 邏輯。
* [2020-01-14] 加入開機啟動個人熱點。(感謝 eisenheim 建議)
* [2020-01-18] 加入大陸版 2018 Lexus RX300 支援。(感謝 cafe 提供)
* [2020-01-18] 加入 DragonBTG 設定。(感謝 CloudJ、低調哥、歐姓Altis車主 提供)
dragonpilot 0.7.0
========================
* [DEVEL] 更新至最新的 commaai:devel (0.7.0)。
* [2019-12-29] 輔助/自動變道改為可調整參數 (進階用戶)。(DragonAssistedLCMinMPH、DragonAutoLCMinMPH、DragonAutoLCDelay)
* [2019-12-29] 修正無法運行第三方應用錯誤。(感謝 深鲸希西 反應)
* [2019-12-18] 修正自動換道邏輯。
* [2019-12-18] 更新 offroad 翻譯。
* [2019-12-18] 錯誤修正。
* [2019-12-18] 移除美版 2017 Civic Hatchback 指紋。(與其它車型衝突)
* [2019-12-17] 加入輔助換道開關。24mph / 40kph 以上)
* [2019-12-17] 加入自動換道開關。40mph / 65kph 以上)
* [2019-12-17] 加入大陸版 2019 雷凌汽油版指紋。 (感謝 Shell 提供)
* [2019-12-17] 加入大陸版 2019 卡羅拉汽油版指紋。 (感謝 Shell 提供)
* [2019-12-17] 加入美版 2017 Civic Hatchback 指紋。(感謝 CFranHonda 提供)
* [2019-12-10] 加入位智車機模式。 (Waze Mode)
* [2019-11-21] 修正 offroad 翻譯。(感謝 鄧育林 回報)
* [2019-11-21] 調整前車靜止移動偵測參數。
* [2019-11-21] 前車靜止移動偵測可在未啟用 dp 時運作。
* [2019-11-18] 修正 offroad 翻譯。(感謝 Cody、鄧育林 回報)
* [2019-11-18] 修正 frame 翻譯。
dragonpilot 0.6.6
========================
* [2019-11-15] 修正不會充電的錯誤。 (感謝 袁昊 反應)
* [2019-11-15] 修正充電控制。 (感謝 KT 反應)
* [2019-11-15] 更新 frame 翻譯,改為多語言版。 (感謝 深鲸希西、shaoching885、鄧育林 反應)
* [2019-11-12] 只顯示電量文字 (注意:有時不會更新,需要拔插 USB 線)
* [2019-11-12] 自動偵測並鎖定硬體 (EON / UNO)。
* [2019-11-12] 加入鎖定硬體 (EON / UNO) 的程式碼。
* [2019-11-11] 更新高德地圖至 v4.3.0.600310 R2098NSLAE
* [2019-11-11] 更新 MiXplorer 至 v6.40.3
* [2019-11-11] 前車靜止移動偵測加入偵測警示。
* [2019-11-07] 讓 Bosch 系統顯示三角。 (感謝 ching885 回報)
* [2019-11-07] 更新 offroad 多語言版簡體中文翻譯 (感謝 Rming 提供)
* [2019-11-06] 修正 0.6.6 appd 和 dashcamd 錯誤。 (感謝 鄧育林 回報)
dragonpilot 0.6.5
========================
* [2019-11-05] 加入台灣 Lexus 2017 GS450h 支援。 (感謝 簡銘佑 提供指紋)
* [2019-11-01] 新增神盾測速照相。 (感謝 Sky Chang 和 Wei Yi Chen)
* [2019-11-01] 修正 offroad 翻譯。 (感謝 Leo Hsieh)
* [2019-11-01] 移除 Miui 字型,縮小 dp 使用空間。
* [2019-11-01] 更新 offroad 為多語言版
* [2019-10-29] 加入 SnG 補丁。(感謝 楊雅智)
* [2019-10-28] 調整 dragon_allow_gas 邏輯 (請回報任何問題,需更新 Panda 韌體)
* [2019-10-22] 移除強迫網路連線提示。(感謝 Shell)
* [2019-10-18] 加入前車靜止移動偵測。(測試版,感謝 ucolchen)
* [2019-10-18] 移除強迫網路連線提示。(感謝 Shell)
* [2019-10-18] 修正 allow_gas 功能。
* [2019-10-18] 加入彎道減速功能開關。
* [2019-10-18] 強迫使用 dp 版 Panda 韌體。
* [2019-10-17] 加入「車型」顯示於 dp 設定畫面。
* [2019-10-17] 修正充電控制讀取預設值的錯誤。
* [2019-10-17] 修正無法顯示更新記錄的錯誤。
* [2019-10-17] 刷新 Panda 韌體按鈕將會自動重啟 EON。(感謝 鄧育林 建議)
* [2019-10-17] 下載更新記錄時使用 "no-cache" 標頭。
* [2019-10-17] 更新高德地圖至 v4.3.0
* [2019-10-14] 啟用自動更新功能。(感謝 鄧育林 提供)
* [2019-10-14] 清除不再使用的 dp params。
* [2019-10-14] 加入數字電量指示。(感謝 鄧育林 建議)
* [2019-10-14] 加入刷新 Panda 韌體按鈕。
* [2019-10-11] 加入台灣 2019 RAV4 汽油版指紋。 (感謝 Max Duan / CloudJ 提供)
* [2019-10-11] 加入當 LatCtrl 關閉時,畫面顯示提示訊息。
dragonpilot 0.6.4
========================
* [2019-10-11] 加入台灣版 2019 RAV4H 油電版指紋。
* [2019-10-08] 加回駕駛監控開關。
* [2019-10-07] 加入台灣版 2019 RAV4H 油電版指紋。(感謝 Max Duan 提供)
* [2019-10-05] 移除 curvature learner: 轉角明顯比原廠小。
* [2019-09-30] 更新 curvature learner 版本至 v4。
* [2019-09-30] Lexus ISH 使用更精確的 EPS Steering Angle Sensor
* [2019-09-27] 加入 Zorrobyte 的 curvature learner (https://github.com/zorrobyte/openpilot)
* [2019-09-27] 加入可開關駕駛監控的程式碼。
* [2019-09-27] 取消當 steering 出現錯誤時,自動切斷方向控制 2 秒的機制。
* [2019-09-27] 讓行車介面的「方向盤」/「轉彎」圖示半透明化。
* [2019-09-26] 修正當「啟用記錄服務」關閉時make 會有問題的錯誤。 (感謝 shaoching885 和 afa 回報)
* [2019-09-24] 行車介面加入可開關的「前車」、「路線」、「車道」設定。
* [2019-09-24] 行車介面加入可開關的「方向燈號」提示。 (感謝 CloudJ 建議,程式碼來源: https://github.com/kegman/openpilot)
* [2019-09-23] 優化讀取 params 的次數。
* [2019-09-23] 加入可開關的車道偏移警示。
* [2019-09-23] 修正充電控制邏輯。
* [2019-09-23] 加入台灣 Prius 4.5 指紋。 (感謝 Lin Hsin Hung 提供)
* [2019-09-20] 加入充電控制功能。 (感謝 loveloveses 和 KT 建議)
* [2019-09-16] 加入台灣 CT200h 指紋。 (感謝 CloudJ 提供)
* [2019-09-16] 加入美版 CT200h 移植。 (感謝 thomaspich 提供)
* [2019-09-13] 行車介面加入可開關的「速度顯示」設定。
* [2019-09-09] 加入 GreyPanda 模式。
* [2019-08-28] 加入可調警示音量。
* [2019-08-27] 自動關機改為可調時長。
dragonpilot 0.6.3
========================
* [2019-10-11] 加入台灣版 2019 RAV4H 油電版指紋。

414
CHANGELOGS.md Normal file
View File

@@ -0,0 +1,414 @@
2020-12-07 (0.8.0.0)
========================
* 錯誤修正。
* Bug fixes.
2020-12-04 (0.8.0.0)
========================
* 加入 git 錯誤修正。(感謝 @toyboxZ 提供)
* Added git error fix. (Thanks to @toyboxZ)
2020-12-02 (0.8.0.0)
========================
* 基於最新 openpilot 0.8.0 devel.
* Based on latest openpilot 0.8.0 devel.
2020-11-28 (0.7.10.0)
========================
* 加入來自 afa 的 Honda inspire, accord, crv SnG 優化。(感謝 @menwenliang 提供)
* Added Honda inspire, accord, crv SnG optimisation from afa fork. (Thanks to @menwenliang)
* 加入 dp_toyota_lowest_cruise_override_vego。(感謝 @toyboxZ 提供)
* Added dp_toyota_lowest_cruise_override_vego. (Thanks to @toyboxZ)
2020-11-20 (0.7.10.0)
========================
* 加入 Dynamic gas Lite。(感謝 @toyboxZ 提供)
* Added Dynamic Gas Lite. (Thanks to @toyboxZ)
2020-11-19 (0.7.10.0)
========================
* 更新所有 honda/hyunda/toyota 指紋。
* Updated all honda/hyunda/toyota fingerprints.
2020-11-18 (0.7.10.0)
========================
* 支援台灣版 2018 Huyndai IONIQ + smart MDPS (dp_hkg_smart_mdps) (感謝 @andy741217 提供)
* Support 2018 Taiwan Hyundai IONIQ + smart MDPS (dp_hkg_smart_mdps) (Thanks to @andy741217)
* 使用 openpilot v0.8 的模型。(感謝 @eisenheim)
* Use openpilot v0.8 model. (Thanks to @eisenheim)
* 加入 0.8 測試版的部分優化。
* Added optimizations from pre-0.8.
* 加入 dp_honda_eps_mod 設定來使用更高的扭力 (需 eps mod)。(感謝 @Wuxl_369 提供)
* Added dp_honda_eps_mod setting to enable higher torque (eps mod required). (Thanks to @Wuxl_369)
* 修正 VW 對白/灰熊的支援 (感謝 @lirudy 提供)
* Fixed issue with white/grey panda support for VW (Thanks to @lirudy)
* GENESIS_G70 優化 (感謝 @sebastian4k 提供)
* GENESIS_G70 Optimisation (Thanks to @sebastian4k)
* HYUNDAI_GENESIS 優化 (感謝 @donfyffe 提供)
* HYUNDAI_GENESIS Optimisation (Thanks to @donfyffe)
2020-11-05 (0.7.10.0)
========================
* HYUNDAI_GENESIS 加入 Cruise 按紐 和 lkMode 支援。(感謝 @donfyffe 建議)
* HYUNDAI_GENESIS added Cruise button event and lkMode feature. (Thanks to @donfyffe)
2020-11-04 (0.7.10.0)
========================
* HYUNDAI_GENESIS 使用 INDI 控制器。(感謝 @donfyffe 提供)
* HYUNDAI_GENESIS uses INDI controller. (Thanks to @donfyffe)
2020-10-30 (0.7.10.0)
========================
* 基於最新 openpilot 0.7.10 devel.
* Based on latest openpilot 0.7.10 devel.
* 修正 EON 接 PC/USB 充電器時仍會自動關機的錯誤。(感謝 @小愛 回報)
* Fixed auto shutdown issue when EON connect to PC/USB Charger. (Thanks to @LOVEChen)
* 新增大陸版 2018 Inspire 指紋。(感謝 @)
* Added China Camry Hybrid FPv2. (Thanks to @杜子腾)
2020-10-23 (0.7.9.0)
========================
* 加入 Headunit Reloaded Android Auto 斷線偵側。
* Added Disconnect detection for Headunit Reloaded Android Auto.
* 加入 complete_setup.sh (感謝 @深鲸希西 提供)
* Added complete_setup.sh (Thanks to @深鲸希西)
2020-10-21 (0.7.9.0)
========================
* 基於最新 openpilot 0.7.9 devel.
* Based on latest openpilot 0.7.9 devel.
* 修正 Prius 特定情況下無法操控方向盤的問題。
* Fixed unable to regain Prius steering control under certain condition.
* 更新 VW MQB 的支援。(需執行 scripts/vw.sh 腳本)
* Updated support of VW MQB. (scripts/vw.sh script required)
* 加入 HKG mdps/sas 的支援。(需執行 scripts/hkg.sh 腳本)
* Added support to HKG mdps/sas. (scripts/hkg.sh script required)
* 新增 2018 China Toyota CHR 指紋v2。感謝 @xiaohongcheung 提供)
* Added 2018 China Toyota CHR FPv2. (Thanks to @xiaohongcheung)
* 加入 Headunit Reloaded Android Auto App 支援。(感謝 @Ninjaa 提供)
* Added Headunit Reloaded Android Auto App Support. (Thanks to @Ninjaa)
* 優化 nanovg。(感謝 @piggy 提供)
* Optomized nanovg. (Thanks to @piggy)
2020-09-25 (0.7.8.0)
========================
* VW 加入 6 分鐘時間方向盤控制限制輔助方案。(特別感謝 @actuallylemoncurd 提供代碼)
* VW added 6 minutes timebomb assist. (dp_timebomb_assist, special thanks to @actuallylemoncurd)
2020-09-23 (0.7.8.0)
========================
* 修正在沒網路的情況下,開機超過五分鐘的問題。
* Fixed 5+ minutes boot time issue when there is no internet connection.
* 錯誤回傳改使用 dp 的主機。
* Used dp server for error reporting.
* 更新服務改使用 gitee 的 IP 檢查連線狀態。
* updated service uses gitee IP address instead.
2020-09-21 (0.7.8.0)
========================
* 強制關閉 panda 檢查 DOS 硬體。
* Force disabled DOS hardware check in panda.
2020-09-18 (0.7.8.0)
========================
* gpxd 記錄改自動存成 zip 格式。
* gpxd now store in zip format.
2020-09-15 (0.7.8.0)
========================
* 加入 Honda Jade 支援。(感謝 @李俊灝)
* Added Honda Jade support. (Thanks to @lijunhao731)
* 修正 ui.cc 內存越界的問題。(感謝 @piggy 提供)
* Fixed ui.cc memory out of bound issue. (Thanks to @piggy)
2020-09-01 (0.7.8.0)
========================
* 加入 ko-KR 翻譯。
* Added ko-KR translation.
2020-08-21 (0.7.8.0)
========================
* 基於最新 openpilot 0.7.8 devel.
* Based on latest openpilot 0.7.8 devel.
* 加入重置 DP 設定按鈕。(感謝 @LOVEChen 建議)
* Added "Reset DP Settings" button. (Thanks to @LOVEChen)
* 將警示訊息更改為類似於概念 UI 的設計。
* Alert messages changed to concept UI alike design.
* 當 manager 出現錯誤後,按 Exit 按鈕會執行 reset_update 腳本。
* Added ability to execute reset_update.sh when press "Exit" button once manager returned errors.
2020-08-18 (0.7.7.0)
========================
* gpxd 不再切換至 GCJ-02 格式。(感謝 @arne182 建議)
* gpxd no longer switch to GCJ-02 format automatically. (Thanks to @arne182)
* 修正方向盤監控。
* Fixed steering monitor timer param.
* 修正行駛時關閉畫面導致當機的錯誤。(感謝 @salmankhan, @stevej99, @bobbydough 回報)
* Fixed screen frozen issue when "screen off while driving" toggle is enabled. (Thanks to @salmankhan, @stevej99, @bobbydough)
* 加回 Dev Mini UI 開關。(感謝 @Ninjaa 建議)
* Re-added Dev Mini UI. (Thanks to @Ninjaa)
2020-08-17 (0.7.7.0)
========================
* gpxd 只儲存高精度數據。(感謝 @arne182)
* gpxd now only stored high accuracy data. (Thanks to @arne182)
* gpxd 加入自動切換成 GCJ-02 格式。
* added ability to switch to GCJ-02 format in gpxd.
* 新增 (dp_reset_live_parameters_on_start) 每次發車重設 LiveParameters 值。(感謝 @eisenheim)
* Added ability (dp_reset_live_param_on_start) to reset LiveParameters on each start. (Thanks @eisenheim)
2020-08-12 (0.7.7.0)
========================
* 修正同時開啟 dp_toyota_zss 和 dp_lqr 產生的錯誤。(感謝 @bobbydough)
* Fixed error cuased by enabling both dp_toyota_zss and dp_lqr at the same time. (Thanks to @bobbydough)
2020-08-12 (0.7.7.0)
========================
* 新增 (dp_gpxd) 將 GPS 軌跡導出至 GPX 格式 (/sdcard/gpx_logs/)的功能。 (感謝 @mageymoo1
* Added ability (dp_gpxd) to export GPS track into GPX files (/sdcard/gpx_logs/). (Thanks to @mageymoo1)
* 使用德國的車道寬度估算值。 (感謝 @arne182
* Used lane width estimate value from Germany. (Thanks to @arne182)
2020-08-11 (0.7.7.0)
========================
* 加入 d_poly offset。 (感謝 @ShaneSmiskol)
* Added d_poly offset. (Thanks to @ShaneSmiskol)
2020-08-05 (0.7.7.0)
========================
* 修正 Dev UI 顯示。
* Fixed Dev UI display.
* 加入 LQR 控制器開關進設定畫面。
* Added LQR Controller toggle to settings.
2020-08-04 (0.7.7.0)
========================
* 嘗試修正非 Toyota 使用 lqr 產生的錯誤。
* Attempted to fix lqr issue on non-Toyota Cars.
* 加入錯誤記錄至 /sdcard/crash_logs/ (感謝 @ShaneSmiskol 提供代碼)
* Added error logs to /sdcard/crash_logs/ (Special Thanks to @ShaneSmiskol)
2020-08-02 (0.7.7.0)
========================
* 加入 ZSS 支援。(感謝 @bobbydough, @WilliamPrius 建議, @bobbydough 測試)
* Added ZSS support. (Thanks to @bobbydough, @WilliamPrius for recommendation, @bobbydough for testing)
2020-07-28 (0.7.7.0)
========================
* 修正 steer ratio learner 關閉。(感謝 @Mojo 回報, @ShaneSmiskol 提供代碼)
* Fixed steer ratio learner toggle. (Thanks to @Mojo, @ShaneSmiskol)
* 加入 "dp_lqr" 設定來強制使用 RAV4 的 lqr 調校。(感謝 @eisenheim)
* Added "dp_lqr" setting to force enable lqr tuning from RAV4. (Thanks to eisenheim)
2020-07-28 (0.7.7.0)
========================
* 修正無法上傳記錄的問題。(感謝 @Mojo)
* Fixed unable to upload log issue. (Thanks to @Mojo)
* 修正無法關閉警示音的問題。(感謝 @Mojo)
* Fixed unable to disable audio alert (-100%) issue. ($Thanks to @Mojo)
2020-07-27 (0.7.7.0)
========================
* 加入回調校介面。(感謝 @Kent)
* Re-added Dev UI. (Thanks to @Kent)
2020-07-27 (0.7.7.0)
========================
* 加入 C2 風扇靜音模式。(感謝 @dingliangxue)
* Added C2 quiet fan mode. (Thanks to @dingliangxue)
* 加入「輔助換道最低啟動速度」、「自動換道最低啟動速度」設定。
* Added "Assisted Lane Change Min Engage Speed" and "Auto Lane Change Min Engage Speed" settings.
2020-07-23 (0.7.7.0)
========================
* 修正 appd。(感謝 @cgw1968)
* Fixed appd. (Thanks to @cgw1968)
2020-07-22 (0.7.7.0)
========================
* 修正 waze 顯示。(感謝 @Mojo)
* Fixed waze display. (Thanks to @Mojo)
* 加回彎道減速功能。(感謝 @Mojo)
* re-added Slow On Curve functionality. (Thanks to @Mojo)
* 加入日文支援。(特別感謝 @ponzu07 提供)
* Added Japanese support. (Special thanks to @ponzu07)
* 刪除部分設定對 dp_steering_on_signal 的依賴。
* Removed dp_steering_on_signal dependencies.
* 介面加入盲點偵測顯示。(感謝 @wabes)
* Added BSM indicator to UI. (Thanks to @wabes)
2020-07-21 (0.7.7.0)
========================
* Toyota 加入改寫最低巡航速度功能。(感謝 @Mojo)
* Added Toyota to override lowest cruise speed. (Thanks to @Mojo)
* 修正 gm 錯誤。
* Fixed bugs in gm cars.
2020-07-20 (0.7.7.0)
========================
* 加回 加速模式 開關。
* Re-added Accel Profile toggle.
* 修正 gm 錯誤。
* Fixed bugs in gm cars.
2020-07-19 (0.7.7.0)
========================
* 限制 dp_conf int / float 範圍。
* Limited dp_conf int/float range.
* 修復行車記錄文件夾不存在的錯誤。
* Fixed dashcam folder not exist error.
2020-07-18 (0.7.7.0)
========================
* 優化 camera offset 讀取。
* optomised loading camera offset value.
* 更換模型延遲警示為一般警示。
* Replaced model lagging loud alert to normal alert.
2020-07-17 (0.7.7.0)
========================
* 更新至最新 openpilot 0.7.7 devel。
* Updated to latest openpilot 0.7.7 devel.
2020-07-17 (0.7.7.0)
========================
* 當 Manager 出現錯誤時,顯示 IP 位置。(感謝 @dingliangxue)
* When Manager failed, display IP address. (Thanks to @dingliangxue)
* 加回 sr learner 開關。
* Re-added sr learner toggle.
2020-07-13 (0.7.7.0)
========================
* 基於最新 openpilot 0.7.7 devel.
* Based on latest openpilot 0.7.7 devel.
2020-06-22 (0.7.6.1)
========================
* 更新至 openpilot 0.7.6.1。 (特別感謝 @rockindy 協助更新)
* Updated to openpilot 0.7.6.1. (Special thanks to @rockindy for initial merge)
* 優化並整合 dp 服務。 (所有的設定檔已改名,請重新設定所有的功能)
* Optimized and integrated several dp services. (Settings have been renamed, please re-config all settings)
* 完全關閉 steer ratio learner。
* Completely disabled steer ratio learner.
* 移除「加速模式」。
* Removed Accel Profile.
* 加入本田皓影混電版指紋v1。(感謝 @劉駿)
* Added Honda Breeze Hybrid FPv1. (Thanks to @劉駿)
* 加入台灣版 Toyota Prius 4.5 指紋v1。(感謝 @jeekid)
* Added Taiwan Toyota Prius 4.5 FPv1. (Thanks to @jeekid)
2020-06-18 (0.7.5)
========================
* Dynamic Follow 更新模型。(感謝 @ShaneSmiskol 提供代碼、 @cgw1968 測試)
* Updated Dynamic Follow model. (Special Thanks to @ShaneSmiskol for the feature and @cgw1968 for testing)
2020-05-30 (0.7.5)
========================
* Dynamic Follow 更新至 ShaneSmiskol:stock_additions 0.7.5 版。(感謝 @ShaneSmiskol 提供代碼、 @Wei 測試)
* Updated Dynamic Follow to ShaneSmiskol:stock_additions 0.7.5. (Special Thanks to @ShaneSmiskol for the feature and @Wei for testing)
2020-05-28 (0.7.5)
========================
* 優化 Lexus GSH 轉向。(感謝 @簡銘佑 測試)
* Optimize Lexus GSH steering. (Thanks to @簡銘佑)
* C2 支援自動關機「DragonAutoShutdownAt」參數。(感謝 @cgw1968 建議)
* C2 to support auto shutdown "DragonAutoShutDownAt" param. (Thanks to @cgw1968)
* 修正出現「pedalPressed」的錯誤。(感謝 @Wei 回報)
* Fixed issue showing "pedalPressed" error. (Thanks to @Wei)
2020-05-26 (0.7.5)
========================
* 將剎車狀熊顯示於 dp 資訊欄。
* Added brake indicator to dp infobar.
* 修正「溫度監控」燈示。
* Fixed "Temp monitor" indicator.
* 加入「方向燈取消控制」延遲控制設。(感謝 @wabes 建議)
* Added delay config to "Disable Lat Control on Blinker". (Thanks to @wabes)
* 加入巴西版 2020 Corolla Hybrid 指紋v2。(感謝 @berno22 提供)
* Added Brazil 2020 Corolla Hybrid FPv2. (Thanks to @berno22)
2020-05-25 (0.7.5)
========================
* 加入對 VW MQB/PQ 的支援。(感謝 @dingliangxue 移植)
* Added support to VW MQB/PQ platform. (Thanks to @dingliangxue)
2020-05-21 (0.7.5)
========================
* 修改成 3 小時後停止供電。(感謝 @Wei 建議)
* Updated to stop charging after 3 hrs. (Thanks to @Wei)
* 移除行車記錄下的「碰撞偵測」功能。
* Removed Impact Detection in Dashcam.
* 修正開啟「Noctua 風扇」模式導致的錯誤。(感謝 @阿濤 回報)
* Fixed a bug caused by enabling "Noctua Mod". (Thanks to @阿濤)
* 修正「位智模式」無法顯示警示的問題。(感謝 @axandres 回報)
* Fixed alert issue in waze mode. (Thanks to @axandres)
* 修正無法顯示更新中圖示的問題。
* Fixed unable to display "UPDATING" icon issue.
2020-05-20 (0.7.5)
========================
* 加入「允許多次自動換道」功能。(感謝 @阿濤 建議)
* Added "Allow Continuous Auto Lane Change" Toggle. (Thanks to @阿濤)
* 修正開機後設定頁面有時會錯誤的問題。(感謝 @salmankhan@Wei 回報)
* Fixed setting page crash issue. (Thanks to @salmankhan, @Wei)
* 修正熄火後一直出現更新訊息的錯誤。(感謝 @Sky Chang 回報)
* Fixed issue that keep showing update prompt. (Thanks to @Sky Chang)
2020-05-19 (0.7.5)
========================
* 加入 DragonEnableAutoUpdate 預設值。
* Added DragonEnableAutoUpdate default value.
2020-05-18 (0.7.5)
========================
* 修正因同時使用「社群功能」和「自定車型」造成的加減速問題。(特別感謝 @Wei@Sky Chang、@Han9365@鄧育林 的測試以及回報。)
* Fixed acceleration issue caused by used of both "Community Maintain Feature" and "Custom Car Model"
2020-05-16 (0.7.5)
========================
* 新增 DragonMaxSpeedLimit 設定值 (mph),當如果車速高於此值 op 將會停止操控。(感謝 @Anthony 建議)
* Added DragonMaxSpeedLimit parameter (mph), op will stop controlling when car speed is high than the value. (Thanks to @Anthony)
* 更新 appd 使用 cnpmjs 來下載 APKs。
* Updated appd to use cnpmjs to download APKs.
* 修正更新服務。(感謝 @Wei)
* Fixed Update Service. (Thanks to @Wei)
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v2)。(感謝 明峰 提供)
* Added Canada 2018 Toyota Sienna LTD fingerprint (v2). (Thanks to 明峰)
2020-05-15 (0.7.5)
========================
* 新增「通過移動網路上傳」開關
* Added Upload Over Mobile Network toggle.
* 新增「通過熱點上傳」開關
* Added Upload Over Hotspot toggle.
* 新增加拿大版 2018 Toyota Sienna LTD 指紋(v1)。(感謝 明峰 提供)
* Added Canada 2018 Toyota Sienna LTD fingerprint (v1). (Thanks to 明峰)
* 新增大陸版 Volkswagen Golf GTI 指紋 (v1)。(感謝 easyeiji 提供)
* Added China Volkswagen Golf GTI fingerprint (v1). (Thanks to easyeiji)
2020-05-10
========================
* 基於最新 openpilot 0.7.5 devel-staging.
* Based on latest openpilot 0.7.5 devel-staging.
* 更新 dp 圖示 (特別感謝 @wabes 的設計與提供)。
* Updated dp logo, special thanks to @wabes for the design.
* 簡/繁中文版和 i18n 整合成為單一版本。
* Merged zhs/zht/i18n versions into one.
* 新增大陸版 CAMRY HYBRID 指紋v2。(感謝 @杜子腾)
* Added China Camry Hybrid FPv2. (Thanks to @杜子腾)
* 新增台灣版 Altis HYBRID 指紋v1。(感謝 @Fish)
* Added Taiwan Altis Hybrid FPv1. (Thanks to @Fish)
* 新增行駛時關閉畫面功能。
* Added Screen off while driving feature.
* 新增倒車時關閉畫面功能。
* Added Screen off while reversing feature.
* 新增駕駛介面加入「加速模式」切換鈕。
* Added acceleration profile toggle onto driving UI.
* 新增自定車型功能,取代指紋暫存功能。
* Replaced fingerprint cache with custom car model selector.
* 新增可調亮度。
* Added Brightness changer.
* 新增部分德語支持。(特別感謝 @arne182 提供)
* Added partial de_DE language support (Thanks to @arne182)
* 新增停車碰撞偵測記錄功能。
* Added off road impact detection to dashcam.

Binary file not shown.

View File

@@ -117,6 +117,18 @@ struct CarEvent @0x9b1657f34caf3ad3 {
focusRecoverActiveDEPRECATED @86;
neosUpdateRequiredDEPRECATED @88;
modelLagWarningDEPRECATED @93;
#dp
preLaneChangeLeftALC @94;
preLaneChangeRightALC @95;
manualSteeringRequired @96;
manualSteeringRequiredBlinkersOn @97;
leadCarMoving @98;
# timebomb assist
timebombWarn @99;
timebombBypassing @100;
timebombBypassed @101;
}
}
@@ -184,6 +196,10 @@ struct CarState {
leftBlindspot @33 :Bool; # Is there something blocking the left lane change
rightBlindspot @34 :Bool; # Is there something blocking the right lane change
# dp
lkMode @37 :Bool;
stopSteering @38 :Bool; # timebomb - stopSteering
struct WheelSpeeds {
# optional wheel speeds
fl @0 :Float32;

View File

@@ -874,6 +874,9 @@ struct PathPlan {
laneChangeState @18 :LaneChangeState;
laneChangeDirection @19 :LaneChangeDirection;
# dp
dpALCAllowed @20 :Bool;
enum Desire {
none @0;
turnLeft @1;
@@ -2138,5 +2141,84 @@ struct Event {
modelV2 @75 :ModelDataV2;
frontEncodeIdx @76 :EncodeIndex; # driver facing camera
wideEncodeIdx @77 :EncodeIndex;
dragonConf @78 :DragonConf;
}
}
struct DragonConf {
dpThermalStarted @0 :Bool;
dpThermalOverheat @1 :Bool;
dpVw @2 :Bool;
dpAtl @3 :Bool;
dpAppWaze @4 :Bool;
dpAppWazeManual @5 :Int8;
dpAppHr @6 :Bool;
dpAppHrManual @7 :Int8;
dpDashcam @8 :Bool;
dpDashcamHoursStored @9 :UInt8;
dpAutoShutdown @10 :Bool;
dpAthenad @11 :Bool;
dpUploader @12 :Bool;
dpLatCtrl @13 :Bool;
dpSteeringLimitAlert @14 :Bool;
dpSteeringOnSignal @15 :Bool;
dpSignalOffDelay @16 :UInt8;
dpAssistedLcMinMph @17 :Float32;
dpAutoLc @18 :Bool;
dpAutoLcCont @19 :Bool;
dpAutoLcMinMph @20 :Float32;
dpAutoLcDelay @21 :Float32;
dpSlowOnCurve @22 :Bool;
dpAllowGas @23 :Bool;
dpMaxCtrlSpeed @24 :Float32;
dpLeadCarAlert @25 :Bool;
dpDynamicFollow @26 :UInt8;
dpAccelProfile @27 :UInt8;
dpDriverMonitor @28 :Bool;
dpSteeringMonitor @29 :Bool;
dpSteeringMonitorTimer @30 :UInt8;
dpGearCheck @31 :Bool;
dpDrivingUi @32 :Bool;
dpUiScreenOffReversing @33 :Bool;
dpUiScreenOffDriving @34 :Bool;
dpUiSpeed @35 :Bool;
dpUiEvent @36 :Bool;
dpUiMaxSpeed @37 :Bool;
dpUiFace @38 :Bool;
dpUiLane @39 :Bool;
dpUiPath @40 :Bool;
dpUiLead @41 :Bool;
dpUiDev @42 :Bool;
dpUiDevMini @43 :Bool;
dpUiBlinker @44 :Bool;
dpUiBrightness @45 :UInt8;
dpUiVolumeBoost @46 :Int8;
dpAppAutoUpdate @47 :Bool;
dpAppExtGps @48 :Bool;
dpAppTomtom @49 :Bool;
dpAppTomtomAuto @50 :Bool;
dpAppTomtomManual @51 :Int8;
dpAppAutonavi @52 :Bool;
dpAppAutonaviAuto @53 :Bool;
dpAppAutonaviManual @54 :Int8;
dpAppAegis @55 :Bool;
dpAppAegisAuto @56 :Bool;
dpAppAegisManual @57 :Int8;
dpAppMixplorer @58 :Bool;
dpAppMixplorerManual @59 :Int8;
dpCarDetected @60 :Text;
dpToyotaLdw @61 :Bool;
dpToyotaSng @62 :Bool;
dpToyotaLowestCruiseOverride @63 :Bool;
dpToyotaLowestCruiseOverrideVego @64 :Bool;
dpToyotaLowestCruiseOverrideAt @65 :Float32;
dpToyotaLowestCruiseOverrideSpeed @66 :Float32;
dpIpAddr @67 :Text;
dpCameraOffset @68 :Int8;
dpLocale @69 :Text;
dpChargingCtrl @70 :Bool;
dpChargingAt @71 :UInt8;
dpDischargingAt @72 :UInt8;
dpIsUpdating @73 :Bool;
dpTimebombAssist @74 :Bool;
}

View File

@@ -81,6 +81,8 @@ wideEncodeIdx: [8075, true, 20.]
wideFrame: [8076, true, 20.]
modelV2: [8077, true, 20., 20]
dragonConf: [8088, false, 2.]
testModel: [8040, false, 0.]
testLiveLocation: [8045, false, 0.]
testJoystick: [8056, false, 0.]

80
common/dp_common.py Normal file
View File

@@ -0,0 +1,80 @@
#!/usr/bin/env python3.7
import subprocess
from cereal import car
from common.params import Params
from common.realtime import sec_since_boot
import os
params = Params()
PARAM_PATH = "/data/params/d/"
LAST_MODIFIED = PARAM_PATH + "dp_last_modified"
def is_online():
try:
return not subprocess.call(["ping", "-W", "4", "-c", "1", "117.28.245.92"])
except ProcessLookupError:
return False
def common_controller_ctrl(enabled, dragonconf, blinker_on, steer_req, v_ego):
if enabled:
if (dragonconf.dpSteeringOnSignal and blinker_on) or not dragonconf.dpLatCtrl:
steer_req = 0 if isinstance(steer_req, int) else False
return steer_req
def common_interface_atl(ret, atl):
# dp
enable_acc = ret.cruiseState.enabled
if atl and ret.cruiseState.available:
enable_acc = True
if ret.gearShifter in [car.CarState.GearShifter.reverse, car.CarState.GearShifter.park]:
enable_acc = False
if ret.seatbeltUnlatched or ret.doorOpen:
enable_acc = False
return enable_acc
def common_interface_get_params_lqr(ret):
if params.get('dp_lqr') == b'1':
ret.lateralTuning.init('lqr')
ret.lateralTuning.lqr.scale = 1500.0
ret.lateralTuning.lqr.ki = 0.05
ret.lateralTuning.lqr.a = [0., 1., -0.22619643, 1.21822268]
ret.lateralTuning.lqr.b = [-1.92006585e-04, 3.95603032e-05]
ret.lateralTuning.lqr.c = [1., 0.]
ret.lateralTuning.lqr.k = [-110.73572306, 451.22718255]
ret.lateralTuning.lqr.l = [0.3233671, 0.3185757]
ret.lateralTuning.lqr.dcGain = 0.002237852961363602
return ret
def get_last_modified(delay, old_check, old_modified):
new_check = sec_since_boot()
if old_check is None or new_check - old_check >= delay:
return new_check, os.stat(LAST_MODIFIED).st_mtime
else:
return old_check, old_modified
def param_get_if_updated(param, type, old_val, old_modified):
try:
modified = os.stat(PARAM_PATH + param).st_mtime
except OSError:
return old_val, old_modified
if old_modified != modified:
new_val = param_get(param, type, old_val)
new_modified = modified
else:
new_val = old_val
new_modified = old_modified
return new_val, new_modified
def param_get(param_name, type, default):
try:
val = params.get(param_name, encoding='utf8').rstrip('\x00')
if type == 'bool':
val = val == '1'
elif type == 'int':
val = int(val)
elif type == 'float':
val = float(val)
except (TypeError, ValueError):
val = default
return val

249
common/dp_conf.py Normal file
View File

@@ -0,0 +1,249 @@
#!/usr/bin/env python3.7
import os
import json
import time
from math import floor
'''
* type: Bool, Int8, UInt8, UInt16, Float32
* conf_type: param, struct
* dependencies needs to use struct and loaded prior so we don't have to read the param multiple times.
* update_once: True, False (the param will only load up once.)
'''
confs = [
# thermald data
{'name': 'dp_thermal_started', 'default': False, 'type': 'Bool', 'conf_type': ['struct']},
{'name': 'dp_thermal_overheat', 'default': False, 'type': 'Bool', 'conf_type': ['struct']},
# car specific
{'name': 'dp_vw', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_atl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct'], 'update_once': True},
# full screen apps
{'name': 'dp_app_waze', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_waze_manual', 'default': 0, 'type': 'Int8', 'min': -1, 'max': 1, 'depends': [{'name': 'dp_app_waze', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_hr', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_hr_manual', 'default': 0, 'type': 'Int8', 'min': -1, 'max': 1, 'depends': [{'name': 'dp_app_hr', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# dashcam related
{'name': 'dp_dashcam', 'default': 0, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_dashcam_hours_stored', 'default': 24, 'type': 'UInt8', 'min': 1, 'max': 255, 'depends': [{'name': 'dp_dashcam', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# auto shutdown
{'name': 'dp_auto_shutdown', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_auto_shutdown_in', 'default': 90, 'type': 'UInt16', 'min': 1, 'max': 65535, 'depends': [{'name': 'dp_auto_shutdown', 'vals': [True]}], 'conf_type': ['param']},
# service
{'name': 'dp_logger', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_athenad', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_uploader', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_upload_on_mobile', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_uploader', 'vals': [True]}], 'conf_type': ['param']},
{'name': 'dp_upload_on_hotspot', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_uploader', 'vals': [True]}], 'conf_type': ['param']},
{'name': 'dp_updated', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_hotspot_on_boot', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# lat ctrl
{'name': 'dp_lat_ctrl', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_steering_limit_alert', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_lat_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_steering_on_signal', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_lat_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_signal_off_delay', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 10, 'conf_type': ['param', 'struct']},
# assist/auto lane change
{'name': 'dp_assisted_lc_min_mph', 'default': 45, 'type': 'Float32', 'min': 0, 'max': 255., 'conf_type': ['param', 'struct']},
{'name': 'dp_auto_lc', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_auto_lc_cont', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_auto_lc', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_auto_lc_min_mph', 'default': 60, 'type': 'Float32', 'min': 0, 'max': 255., 'depends': [{'name': 'dp_auto_lc', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_auto_lc_delay', 'default': 3, 'type': 'Float32', 'min': 0, 'max': 10., 'depends': [{'name': 'dp_auto_lc', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# long ctrl
{'name': 'dp_slow_on_curve', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_allow_gas', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_max_ctrl_speed', 'default': 92., 'type': 'Float32', 'conf_type': ['param', 'struct']},
{'name': 'dp_lead_car_alert', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_lead_car_away_alert', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_dynamic_follow', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 4, 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_dynamic_follow_multiplier', 'default': 1., 'type': 'Float32', 'min': 0.85, 'max': 1.2, 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param']},
{'name': 'dp_dynamic_follow_min_tr', 'default': 0.9, 'type': 'Float32', 'min': 0.85, 'max': 1.6, 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param']},
{'name': 'dp_dynamic_gas', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param']},
{'name': 'dp_accel_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 3, 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
# safety
{'name': 'dp_driver_monitor', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_steering_monitor', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driver_monitor', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_steering_monitor_timer', 'default': 70, 'type': 'UInt8', 'min': 70, 'max': 360, 'depends': [{'name': 'dp_driver_monitor', 'vals': [False]}, {'name': 'dp_steering_monitor', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_gear_check', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_temp_monitor', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
# UIs
{'name': 'dp_driving_ui', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_screen_off_reversing', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_screen_off_driving', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_speed', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_event', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_max_speed', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_face', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_driver_monitor', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_lane', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_path', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_lead', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_dev', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_dev_mini', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_blinker', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_driving_ui', 'vals': [True]}, {'name': 'dp_ui_screen_off_driving', 'vals': [False]}, {'name': 'dp_app_waze', 'vals': [False]}, {'name': 'dp_app_hr', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_brightness', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 100, 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_volume_boost', 'default': 0, 'type': 'Int8', 'min': -100, 'max': 100, 'conf_type': ['param', 'struct']},
# Apps
{'name': 'dp_app_auto_update', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_ext_gps', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_tomtom', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_tomtom_auto', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_app_tomtom', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_tomtom_manual', 'default': 0, 'type': 'Int8', 'min': -1, 'max': 1, 'depends': [{'name': 'dp_app_tomtom', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_autonavi', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_autonavi_auto', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_app_autonavi', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_autonavi_manual', 'default': 0, 'type': 'Int8', 'min': -1, 'max': 1, 'depends': [{'name': 'dp_app_autonavi', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_aegis', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_aegis_auto', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_app_aegis', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_aegis_manual', 'default': 0, 'type': 'Int8', 'min': -1, 'max': 1, 'depends': [{'name': 'dp_app_aegis', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_app_mixplorer', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_app_mixplorer_manual', 'default': 0, 'type': 'Int8', 'min': -1, 'max': 1, 'depends': [{'name': 'dp_app_mixplorer', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# custom car
{'name': 'dp_car_selected', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_car_list', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_car_detected', 'default': '', 'type': 'Text', 'conf_type': ['param', 'struct']},
# toyota
{'name': 'dp_toyota_ldw', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}], 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_sng', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}, {'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_zss', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}], 'conf_type': ['param']},
{'name': 'dp_toyota_lowest_cruise_override', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}, {'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_lowest_cruise_override_vego', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}, {'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_lowest_cruise_override_at', 'default': 44, 'type': 'Float32', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}, {'name': 'dp_toyota_lowest_cruise_override', 'vals': [True]}], 'min': 0, 'max': 255., 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_lowest_cruise_override_speed', 'default': 32, 'type': 'Float32', 'depends': [{'name': 'dp_car_detected', 'vals': ['toyota']}, {'name': 'dp_toyota_lowest_cruise_override_speed', 'vals': [True]}], 'min': 0, 'max': 255., 'conf_type': ['param', 'struct']},
# hyundai
{'name': 'dp_hkg_smart_mdps', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# honda
{'name': 'dp_honda_eps_mod', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
#misc
{'name': 'dp_ip_addr', 'default': '', 'type': 'Text', 'conf_type': ['struct']},
{'name': 'dp_full_speed_fan', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_uno_fan_mode', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_last_modified', 'default': str(floor(time.time())), 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_camera_offset', 'default': 6, 'type': 'Int8', 'min': -255, 'max': 255, 'conf_type': ['param', 'struct']},
{'name': 'dp_locale', 'default': 'en-US', 'type': 'Text', 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_disable_relay', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_charging_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_charging_at', 'default': 60, 'type': 'UInt8', 'min': 0, 'max': 100, 'depends': [{'name': 'dp_charging_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_discharging_at', 'default': 70, 'type': 'UInt8', 'min': 0, 'max': 100, 'depends': [{'name': 'dp_charging_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_reg', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_is_updating', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_sr_learner', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_lqr', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_reset_live_param_on_start', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_timebomb_assist', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
]
def get_definition(name):
for conf in confs:
if conf['name'] == name:
return conf
return None
def to_param_val(name, val):
conf = get_definition(name)
if conf is not None:
type = conf['type'].lower()
try:
if 'bool' in type:
val = '1' if val else '0'
elif 'int' in type:
val = int(val)
elif 'float' in type:
val = float(val)
return str(val)
except (ValueError, TypeError):
return ''
return ''
def to_struct_val(name, val):
conf = get_definition(name)
if conf is not None:
try:
type = conf['type'].lower()
if 'bool' in type:
val = True if val == '1' else False
elif 'int' in type:
val = int(val)
elif 'float' in type:
val = float(val)
return val
except (ValueError, TypeError):
return None
return None
'''
function to convert param name into struct name.
'''
def get_struct_name(snake_str):
components = snake_str.split('_')
# We capitalize the first letter of each component except the first one
# with the 'title' method and join them together.
return components[0] + ''.join(x.title() for x in components[1:])
'''
function to generate struct for log.capnp
'''
def gen_log_struct():
count = 0
str = "# dp\n"
str += "struct DragonConf {\n"
for conf in confs:
name = get_struct_name(conf['name'])
if 'struct' in conf['conf_type']:
str += f" {name} @{count} :{conf['type']};\n"
count += 1
str += "}"
print(str)
'''
function to append new keys to params.py
'''
def init_params_keys(keys, type):
for conf in confs:
if 'param' in conf['conf_type']:
keys[conf['name'].encode('utf-8')] = type
return keys
'''
function to generate support car list
'''
def get_support_car_list():
attrs = ['FINGERPRINTS', 'FW_VERSIONS']
cars = dict()
for car_folder in [x[0] for x in os.walk('/data/openpilot/selfdrive/car')]:
try:
car_name = car_folder.split('/')[-1]
if car_name != "mock":
names = []
for attr in attrs:
values = __import__('selfdrive.car.%s.values' % car_name, fromlist=[attr])
if hasattr(values, attr):
attr_values = getattr(values, attr)
else:
continue
if isinstance(attr_values, dict):
for f, v in attr_values.items():
if f not in names:
names.append(f)
names.sort()
cars[car_name] = names
except (ImportError, IOError, ValueError):
pass
return json.dumps(cars)
'''
function to init param value.
should add this into manager.py
'''
def init_params_vals(params):
for conf in confs:
if 'param' in conf['conf_type']:
if conf['name'] == 'dp_car_list':
params.put(conf['name'], get_support_car_list())
elif params.get(conf['name']) is None:
params.put(conf['name'], to_param_val(conf['name'], conf['default']))
if __name__ == "__main__":
gen_log_struct()

8
common/dp_time.py Normal file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env python3.7
# delay of reading last modified
LAST_MODIFIED_DYNAMIC_FOLLOW = 3.
LAST_MODIFIED_THERMALD = 10.
LAST_MODIFIED_SYSTEMD = 1.
LAST_MODIFIED_LANE_PLANNER = 3.
LAST_MODIFIED_UPLOADER = 10.

14
common/i18n.py Normal file
View File

@@ -0,0 +1,14 @@
import gettext
from common.hardware import EON
from common.hardware_android import getprop
locale_dir = '/data/openpilot/selfdrive/assets/locales'
supported_language = ['en-US', 'zh-TW', 'zh-CN', 'ja-JP', 'ko-KR']
def get_locale():
return getprop("persist.sys.locale") if EON else 'en-US'
def events():
i18n = gettext.translation('events', localedir=locale_dir, fallback=True, languages=[get_locale()])
i18n.install()
return i18n.gettext

View File

@@ -3,6 +3,7 @@
from libcpp cimport bool
from libcpp.string cimport string
from common.params_pxd cimport Params as c_Params
from common.dp_conf import init_params_keys
import os
import threading
@@ -72,6 +73,8 @@ keys = {
b"Offroad_HardwareUnsupported": [TxType.CLEAR_ON_MANAGER_START],
}
keys = init_params_keys(keys, [TxType.PERSISTENT])
def ensure_bytes(v):
if isinstance(v, str):
return v.encode()

View File

@@ -33,6 +33,7 @@ class TextWindow:
if self.text_proc is not None:
while True:
if self.get_status() == 1:
os.system('/data/openpilot/scripts/reset_update.sh')
return
time.sleep(0.1)

View File

@@ -0,0 +1,56 @@
Make a python script translatable
--
1. add following codes to the top
```python
# This Python file uses the following encoding: utf-8
# -*- coding: utf-8 -*-
from common.i18n import events
_ = events()
```
2. wrap ```_()``` function around the string.
3. generate pot file (template file)
```bash
# e.g. xgettext -d base -o /data/openpilot/selfdrive/assets/locales/events.pot /data/openpilot/selfdrive/controls/lib/events.py
xgettext -d base -o <openpilot_path>/selfdrive/assets/locales/<template_file>.pot <file_to_translate>.py
```
4. add po file to languages
```bash
# e.g. cp /data/openpilot/selfdrive/assets/locales/events.pot /data/openpilot/selfdrive/assets/locales/zh-TW/LC_MESSAGES/events.po
cp <openpilot_path>/selfdrive/assets/locales/<template_file>.pot <openpilot_path>/selfdrive/assets/locales/<language>/LC_MESSAGES/<template_file>.po
```
5. translate po file with your favorite editor.
6. generate mo file.
```bash
# e.g. msgfmt -o /data/openpilot/selfdrive/assets/locales/zh-TW/LC_MESSAGES/events.mo /data/openpilot/selfdrive/assets/locales/zh-TW/LC_MESSAGES/events
msgfmt -o <openpilot_path>/selfdrive/assets/locales/<language>/LC_MESSAGES/<template_file>.mo <openpilot_path>/selfdrive/assets/locales/<language>/LC_MESSAGES/<template_file>
```
Update translations
---
1. add ```_()``` around the new strings
2. generate pot file again (template file)
```bash
# e.g. xgettext -d base -o /data/openpilot/selfdrive/assets/locales/events.pot /data/openpilot/selfdrive/controls/lib/events.py
xgettext -d base -o <openpilot_path>/selfdrive/assets/locales/<template_file>.pot <file_to_translate>.py
```
3. update already translated file (merge)
```bash
# e.g. msgmerge --update /data/openpilot/selfdrive/assets/locales/zh-TW/LC_MESSAGES/events.po /data/openpilot/selfdrive/assets/locales/events.pot
msgmerge --update <openpilot_path>/selfdrive/assets/locales/<language>/LC_MESSAGES/<file_to_translate>.po <openpilot_path>/selfdrive/assets/locales/<template_file>.pot
```
4. generate mo file again.
```bash
# e.g. msgfmt -o /data/openpilot/selfdrive/assets/locales/zh-TW/LC_MESSAGES/events.mo /data/openpilot/selfdrive/assets/locales/zh-TW/LC_MESSAGES/events
msgfmt -o <openpilot_path>/selfdrive/assets/locales/<language>/LC_MESSAGES/<template_file>.mo <openpilot_path>/selfdrive/assets/locales/<language>/LC_MESSAGES/<template_file>
```
Reference
---
https://simpleit.rocks/python/how-to-translate-a-python-project-with-gettext-the-easy-way/

21
dragonpilot/LICENSE.md Normal file
View File

@@ -0,0 +1,21 @@
The MIT License
Copyright (c) 2019-, Rick Lan, dragonpilot community, and a number of other of contributors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1,92 @@
This Font Software is licensed under the SIL Open Font License,
Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to
provide a free and open framework in which fonts may be shared and
improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software
components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to,
deleting, or substituting -- in part or in whole -- any of the
components of the Original Version, by changing formats or by porting
the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed,
modify, redistribute, and sell modified and unmodified copies of the
Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created using
the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,372 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
NOTE: this is the newer (L) version of the system font configuration,
supporting richer weight selection. Some apps will expect the older
version, so please keep system_fonts.xml and fallback_fonts.xml in sync
with any changes, even though framework will only read this file.
All fonts withohut names are added to the default list. Fonts are chosen
based on a match: full BCP-47 language tag including script, then just
language, and finally order (the first font containing the glyph).
Order of appearance is also the tiebreaker for weight matching. This is
the reason why the 900 weights of Roboto precede the 700 weights - we
prefer the former when an 800 weight is requested. Since bold spans
effectively add 300 to the weight, this ensures that 900 is the bold
paired with the 500 weight, ensuring adequate contrast.
-->
<familyset version="22">
<!-- first font is default -->
<family name="sans-serif">
<font weight="100" style="normal">Roboto-Thin.ttf</font>
<font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
<font weight="300" style="normal">Roboto-Light.ttf</font>
<font weight="300" style="italic">Roboto-LightItalic.ttf</font>
<font weight="400" style="normal">Roboto-Regular.ttf</font>
<font weight="400" style="italic">Roboto-Italic.ttf</font>
<font weight="500" style="normal">Roboto-Medium.ttf</font>
<font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
<font weight="900" style="normal">Roboto-Black.ttf</font>
<font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
<font weight="700" style="normal">Roboto-Bold.ttf</font>
<font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
</family>
<!-- Note that aliases must come after the fonts they reference. -->
<alias name="sans-serif-thin" to="sans-serif" weight="100" />
<alias name="sans-serif-light" to="sans-serif" weight="300" />
<alias name="sans-serif-medium" to="sans-serif" weight="500" />
<alias name="sans-serif-black" to="sans-serif" weight="900" />
<alias name="arial" to="sans-serif" />
<alias name="helvetica" to="sans-serif" />
<alias name="tahoma" to="sans-serif" />
<alias name="verdana" to="sans-serif" />
<family name="sans-serif-condensed">
<font weight="300" style="normal">RobotoCondensed-Light.ttf</font>
<font weight="300" style="italic">RobotoCondensed-LightItalic.ttf</font>
<font weight="400" style="normal">RobotoCondensed-Regular.ttf</font>
<font weight="400" style="italic">RobotoCondensed-Italic.ttf</font>
<font weight="700" style="normal">RobotoCondensed-Bold.ttf</font>
<font weight="700" style="italic">RobotoCondensed-BoldItalic.ttf</font>
</family>
<alias name="sans-serif-condensed-light" to="sans-serif-condensed" weight="300" />
<family name="serif">
<font weight="400" style="normal">NotoSerif-Regular.ttf</font>
<font weight="700" style="normal">NotoSerif-Bold.ttf</font>
<font weight="400" style="italic">NotoSerif-Italic.ttf</font>
<font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font>
</family>
<alias name="times" to="serif" />
<alias name="times new roman" to="serif" />
<alias name="palatino" to="serif" />
<alias name="georgia" to="serif" />
<alias name="baskerville" to="serif" />
<alias name="goudy" to="serif" />
<alias name="fantasy" to="serif" />
<alias name="ITC Stone Serif" to="serif" />
<family name="monospace">
<font weight="400" style="normal">DroidSansMono.ttf</font>
</family>
<alias name="sans-serif-monospace" to="monospace" />
<alias name="monaco" to="monospace" />
<family name="serif-monospace">
<font weight="400" style="normal">CutiveMono.ttf</font>
</family>
<alias name="courier" to="serif-monospace" />
<alias name="courier new" to="serif-monospace" />
<family name="casual">
<font weight="400" style="normal">ComingSoon.ttf</font>
</family>
<family name="cursive">
<font weight="400" style="normal">DancingScript-Regular.ttf</font>
<font weight="700" style="normal">DancingScript-Bold.ttf</font>
</family>
<family name="sans-serif-smallcaps">
<font weight="400" style="normal">CarroisGothicSC-Regular.ttf</font>
</family>
<!-- fallback fonts -->
<family variant="elegant">
<font weight="400" style="normal">NotoNaskhArabic-Regular.ttf</font>
<font weight="700" style="normal">NotoNaskhArabic-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font>
<font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font>
<font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font>
<font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansThai-Regular.ttf</font>
<font weight="700" style="normal">NotoSansThai-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font>
<font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font>
<font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansDevanagari-Regular.ttf</font>
<font weight="700" style="normal">NotoSansDevanagari-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font>
</family>
<!-- Gujarati should come after Devanagari -->
<family variant="elegant">
<font weight="400" style="normal">NotoSansGujarati-Regular.ttf</font>
<font weight="700" style="normal">NotoSansGujarati-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font>
</family>
<!-- Gurmukhi should come after Devanagari -->
<family variant="elegant">
<font weight="400" style="normal">NotoSansGurmukhi-Regular.ttf</font>
<font weight="700" style="normal">NotoSansGurmukhi-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansTamil-Regular.ttf</font>
<font weight="700" style="normal">NotoSansTamil-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansMalayalam-Regular.ttf</font>
<font weight="700" style="normal">NotoSansMalayalam-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansBengali-Regular.ttf</font>
<font weight="700" style="normal">NotoSansBengali-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansTelugu-Regular.ttf</font>
<font weight="700" style="normal">NotoSansTelugu-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansKannada-Regular.ttf</font>
<font weight="700" style="normal">NotoSansKannada-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansOriya-Regular.ttf</font>
<font weight="700" style="normal">NotoSansOriya-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font>
<font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansKhmer-Regular.ttf</font>
<font weight="700" style="normal">NotoSansKhmer-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansLao-Regular.ttf</font>
<font weight="700" style="normal">NotoSansLao-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font>
</family>
<family variant="elegant">
<font weight="400" style="normal">NotoSansMyanmar-Regular.ttf</font>
<font weight="700" style="normal">NotoSansMyanmar-Bold.ttf</font>
</family>
<family variant="compact">
<font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font>
<font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansThaana-Regular.ttf</font>
<font weight="700" style="normal">NotoSansThaana-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansCham-Regular.ttf</font>
<font weight="700" style="normal">NotoSansCham-Bold.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansBamum-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansBatak-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansLisu-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansNKo-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansRejang-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansVai-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansYi-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font>
</family>
<family lang="ja">
<font weight="400" style="normal">NotoSansJP-Regular.otf</font>
</family>
<family lang="ko">
<font weight="400" style="normal">NotoSansKR-Regular.otf</font>
</family>
<family>
<font weight="400" style="normal">NanumGothic.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoColorEmoji.ttf</font>
</family>
<family lang="zh-Hans">
<font weight="400" style="normal">NotoSansCJKtc-Regular.otf</font>
<font weight="500" style="normal">NotoSansCJKtc-Medium.otf</font>
<font weight="700" style="normal">NotoSansCJKtc-Bold.otf</font>
</family>
<family lang="zh-Hant">
<font weight="400" style="normal">NotoSansCJKtc-Regular.otf</font>
<font weight="500" style="normal">NotoSansCJKtc-Medium.otf</font>
<font weight="700" style="normal">NotoSansCJKtc-Bold.otf</font>
</family>
<family lang="ja">
<font weight="400" style="normal">MTLmr3m.ttf</font>
</family>
<!--
Tai Le and Mongolian are intentionally kept last, to make sure they don't override
the East Asian punctuation for Chinese.
-->
<family>
<font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansMongolian-Regular.ttf</font>
</family>
</familyset>

View File

@@ -0,0 +1,70 @@
#!/usr/bin/bash
###############################################################################
# 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.
#
# Noto is a trademark of Google Inc. Noto fonts are open source.
# All Noto fonts are published under the SIL Open Font License,
# Version 1.1. Language data and some sample texts are from the Unicode CLDR project.
#
###############################################################################
# Android system locale, zh-TW = Traditional Chinese, zh-CN = Simplified Chinese
#lang=en
update_font=0
remove_old_font=0
# temp fix for lib change
if [ ! -f "/system/comma/usr/lib/libcapnp-0.6.1.so" ]; then
mount -o remount,rw /system
ln -sf /system/comma/usr/lib/libcapnp.so /system/comma/usr/lib/libcapnp-0.6.1.so
ln -sf /system/comma/usr/lib/libkj.so /system/comma/usr/lib/libkj-0.6.1.so
mount -o remount,r /system
fi
# check regular font
if [ ! -f "/system/fonts/NotoSansCJKtc-Regular.otf" ]; then
update_font=1
fi
if [ $update_font -eq "1" ] || [ $remove_old_font -eq "1" ]; then
# sleep 3 secs in case, make sure the /system is re-mountable
sleep 3
mount -o remount,rw /system
if [ $update_font -eq "1" ]; then
# install font
cp -rf /data/openpilot/dragonpilot/cjk-fonts/NotoSansCJKtc-* /system/fonts/
# install font mapping
cp -rf /data/openpilot/dragonpilot/cjk-fonts/fonts.xml /system/etc/fonts.xml
# change permissions
chmod 644 /system/etc/fonts.xml
chmod 644 /system/fonts/NotoSansCJKtc-*
fi
mount -o remount,r /system
# change system locale
fi
#setprop persist.sys.locale $lang
#setprop persist.sys.local $lang

View File

@@ -97,10 +97,10 @@ function launch {
# that completed successfully and synced to disk.
if [ -f "${BASEDIR}/.overlay_init" ]; then
find ${BASEDIR}/.git -newer ${BASEDIR}/.overlay_init | grep -q '.' 2> /dev/null
if [ $? -eq 0 ]; then
echo "${BASEDIR} has been modified, skipping overlay update installation"
else
# find ${BASEDIR}/.git -newer ${BASEDIR}/.overlay_init | grep -q '.' 2> /dev/null
# if [ $? -eq 0 ]; then
# echo "${BASEDIR} has been modified, skipping overlay update installation"
# else
if [ -f "${STAGING_ROOT}/finalized/.overlay_consistent" ]; then
if [ ! -d /data/safe_staging/old_openpilot ]; then
echo "Valid overlay update found, installing"
@@ -123,7 +123,7 @@ function launch {
# TODO: restore backup? This means the updater didn't start after swapping
fi
fi
fi
# fi
fi
# comma two init
@@ -139,6 +139,10 @@ function launch {
ln -sfn $(pwd) /data/pythonpath
export PYTHONPATH="$PWD"
if [ -f "/sdcard/dp_patcher.py" ]; then
/data/data/com.termux/files/usr/bin/python /sdcard/dp_patcher.py
fi
# write tmux scrollback to a file
tmux capture-pane -pq -S-1000 > /tmp/launch_log

View File

@@ -1,5 +1,11 @@
#!/usr/bin/bash
size=$(du -sb .git/index 2>/dev/null|awk '{print $1}')
echo $size|grep -E '^[0-9]+$' >/dev/null || size=0
if [ $size -le 1024 ];then
rm .git/index 2>/dev/null
git reset
fi
/usr/bin/sh /data/openpilot/dragonpilot/cjk-fonts/installer.sh &
export PASSIVE="0"
exec ./launch_chffrplus.sh

View File

@@ -125,7 +125,7 @@ unsigned int volkswagen_crc(unsigned int address, uint64_t d, int l) {
crc ^= (uint8_t[]){0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07}[counter];
break;
case 0x117: // ACC_10 Automatic Cruise Control
crc ^= (uint8_t[]){0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC,0xAC}[counter];
crc ^= (uint8_t[]){0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16}[counter];
break;
case 0x120: // TSK_06 Drivetrain Coordinator
crc ^= (uint8_t[]){0xC4,0xE2,0x4F,0xE4,0xF8,0x2F,0x56,0x81,0x9F,0xE5,0x83,0x44,0x05,0x3F,0x97,0xDF}[counter];

View File

@@ -418,13 +418,15 @@ BO_ 892 CRUISE_PARAMS: 8 PCM
BO_ 927 RADAR_HUD: 8 RADAR
SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
SG_ ZEROS_BOH3 : 31|32@0+ (1,0) [0|4294967295] "" XXX
SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
SG_ BOH : 40|1@0+ (1,0) [0|1] "" XXX
SG_ BOH_2 : 30|1@0+ (1,0) [0|1] "" XXX
SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX

View File

@@ -405,13 +405,15 @@ BO_ 432 STANDSTILL: 7 VSA
BO_ 927 RADAR_HUD: 8 RADAR
SG_ ZEROS_BOH : 7|10@0+ (1,0) [0|127] "" BDY
SG_ CMBS_OFF : 12|1@0+ (1,0) [0|1] "" BDY
SG_ ZEROS_BOH3 : 31|32@0+ (1,0) [0|4294967295] "" XXX
SG_ RESUME_INSTRUCTION : 21|1@0+ (1,0) [0|1] "" XXX
SG_ SET_TO_1 : 13|1@0+ (1,0) [0|1] "" BDY
SG_ ZEROS_BOH2 : 11|4@0+ (1,0) [0|1] "" XXX
SG_ APPLY_BRAKES_FOR_CANC : 23|1@0+ (1,0) [0|1] "" XXX
SG_ ACC_ALERTS : 20|5@0+ (1,0) [0|1] "" BDY
SG_ SET_TO_0 : 22|1@0+ (1,0) [0|1] "" XXX
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|255] "" XXX
SG_ BOH : 40|1@0+ (1,0) [0|1] "" XXX
SG_ BOH_2 : 30|1@0+ (1,0) [0|1] "" XXX
SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" XXX
SG_ CHECKSUM : 59|4@0+ (1,0) [0|15] "" XXX

View File

@@ -0,0 +1,411 @@
CM_ "AUTOGENERATED FILE, DO NOT EDIT"
CM_ "Imported file _comma.dbc starts here"
BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 55|8@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
CM BO_ STEERING_IPAS_COMMA "Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
BO_ 512 GAS_COMMAND: 6 EON
SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
SG_ INTERCEPTOR_GAS : 7|16@0+ (0.159375,-75.555) [0|1] "" EON
SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.159375,-151.111) [0|1] "" EON
SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" EON
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" EON
VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
CM_ "Imported file _toyota_2017.dbc starts here"
VERSION ""
NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_
BS_:
BU_: XXX DSU HCU EPS IPAS CGW
BO_ 36 KINEMATICS: 8 XXX
SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/sec" XXX
SG_ STEERING_TORQUE : 17|10@0+ (1,-512) [0|65535] "" XXX
BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
BO_ 166 BRAKE: 8 XXX
SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BRAKE_PEDAL : 23|8@0+ (1,0) [0|255] "" XXX
BO_ 170 WHEEL_SPEEDS: 8 XXX
SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "kph" XXX
SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "kph" XXX
SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "kph" XXX
SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "kph" XXX
BO_ 180 SPEED: 8 XXX
SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "kph" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 353 DSU_SPEED: 7 XXX
SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "kph" XXX
BO_ 452 ENGINE_RPM: 8 CGW
SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
BO_ 466 PCM_CRUISE: 8 XXX
SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
SG_ STANDSTILL_ON : 12|1@0+ (1,0) [0|1] "" XXX
SG_ ACCEL_NET : 23|16@0- (0.001,0) [-20|20] "m/s2" XXX
SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 467 PCM_CRUISE_2: 8 XXX
SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "kph" XXX
SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "kph" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 552 ACCELEROMETER: 8 XXX
SG_ ACCEL_Z : 22|15@0- (1,0) [0|32767] "" XXX
SG_ ACCEL_X : 6|15@0- (0.001,0) [-20|20] "m/s2" XXX
BO_ 560 BRAKE_MODULE2: 7 XXX
SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
BO_ 614 STEERING_IPAS: 8 IPAS
SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 643 PRE_COLLISION: 7 DSU
SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
BO_ 740 STEERING_LKA: 5 XXX
SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
BO_ 742 LEAD_INFO: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
BO_ 835 ACC_CONTROL: 8 DSU
SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s2" HCU
SG_ SET_ME_X01 : 23|2@0+ (1,0) [0|3] "" HCU
SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X3 : 19|4@0+ (1,0) [0|15] "" XXX
SG_ PERMIT_BRAKING : 30|1@0+ (1,0) [0|1] "" HCU
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
SG_ ACCEL_CMD_ALT : 47|8@0- (0.05,0) [0|0] "m/s^2" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 869 DSU_CRUISE : 7 DSU
SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
BO_ 921 PCM_CRUISE_SM: 8 XXX
SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
BO_ 951 ESP_CONTROL: 8 ESP
SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
BO_ 1041 ACC_HUD: 8 DSU
SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X80 : 55|8@0+ (1,0) [0|1] "" XXX
BO_ 1042 LKAS_HUD: 8 XXX
SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X01 : 7|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X01_2 : 11|2@0+ (1,0) [0|3] "" XXX
SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X0C : 23|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X2C : 47|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X38 : 55|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
BO_ 1043 TIME : 8 CGW
SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
BO_ 1408 VIN_PART_1: 8 CGW
SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 1409 VIN_PART_2: 8 CGW
SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 1410 VIN_PART_3: 8 CGW
SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
BO_ 1553 UI_SETTING: 8 XXX
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
BO_ 1556 STEERING_LEVERS: 8 XXX
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
BO_ 1568 SEATS_DOORS: 8 XXX
SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
BO_ 1570 LIGHT_STALK: 8 SCM
SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
BO_ 1161 RSA1: 8 FCM
SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "kph" XXX
SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
BO_ 1162 RSA2: 8 FCM
SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
BO_ 1163 RSA3: 8 FCM
SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
CM_ SG_ 36 ACCEL_Y "unit is tbd";
CM_ SG_ 36 YAW_RATE "verify";
CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
CM_ SG_ 37 STEER_RATE "factor is tbd";
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
CM_ SG_ 643 COUNTER "only used on cars that use this msg for cruise control";
CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front is detected. In openpilot and before the PERMIT_BRAKING name, this was "SET_ME_1" and is hardcoded to be high. Unsure if only informational or has an effect though existing usage in openpilot is to always set it to 1. Originally 'PMTBRKG' in the leaked toyota_2017_ref_pt.dbc file and name expansion speculated to be PerMiT BRaKinG.";
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
CM_ SG_ 921 UI_SET_SPEED "set speed shown in UI with user set unit";
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
CM_ SG_ 1042 SET_ME_1 "unclear what this is, but it's always 1 in drive traces";
CM_ SG_ 1042 REPEATED_BEEPS "recommended for fcw and other important alerts";
CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"
CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
CM_ SG_ 1163 TSREQPD "always 1";
CM_ SG_ 1163 TSRMSW "always 1";
CM_ SG_ 1163 OTSGNNTM "always 3";
CM_ SG_ 1163 NTLVLSPD "always 3";
CM_ SG_ 1163 OVSPNTM "always 3";
CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
CM_ SG_ 1163 TSRSPU "always 1";
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
VAL_ 614 STATE 3 "enabled" 1 "disabled";
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none";
VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
VAL_ 1553 UNITS 1 "km" 2 "miles";
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
CM_ "lexus_is_2018_pt.dbc starts here"
BO_ 550 BRAKE_MODULE: 8 XXX
SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
BO_ 581 GAS_PEDAL_ALT: 5 XXX
SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
BO_ 705 GAS_PEDAL: 8 XXX
SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
SG_ GAS_PEDAL : 55|8@0+ (0.005,0) [0|1] "" XXX
BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
SG_ STEER_TORQUE_EPS : 47|16@0- (1.30,0) [-20000|20000] "" XXX
SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
BO_ 610 EPS_STATUS: 5 EPS
SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
BO_ 956 GEAR_PACKET: 8 XXX
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
BO_ 1009 PCM_CRUISE_ALT: 8 XXX
SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
BO_ 1599 LIGHT_STALK_ISH: 8 SCM
SG_ AUTO_HIGH_BEAM : 19|1@0+ (1,0) [0|1] "" XXX
CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
CM_ SG_ 1009 SET_SPEED "units seem to be whatever the car is set to";
VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";

View File

@@ -0,0 +1,408 @@
CM_ "AUTOGENERATED FILE, DO NOT EDIT"
CM_ "Imported file _comma.dbc starts here"
BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 55|8@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
CM BO_ STEERING_IPAS_COMMA "Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
BO_ 512 GAS_COMMAND: 6 EON
SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
SG_ INTERCEPTOR_GAS : 7|16@0+ (0.159375,-75.555) [0|1] "" EON
SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.159375,-151.111) [0|1] "" EON
SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" EON
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" EON
VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
CM_ "Imported file _toyota_2017.dbc starts here"
VERSION ""
NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
SG_MUL_VAL_
BS_:
BU_: XXX DSU HCU EPS IPAS CGW
BO_ 36 KINEMATICS: 8 XXX
SG_ ACCEL_Y : 33|10@0+ (0.03589,-18.375) [0|65535] "m/s^2" XXX
SG_ YAW_RATE : 1|10@0+ (0.244,-125) [0|65535] "deg/sec" XXX
SG_ STEERING_TORQUE : 17|10@0+ (1,-512) [0|65535] "" XXX
BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
BO_ 166 BRAKE: 8 XXX
SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
SG_ BRAKE_PEDAL : 23|8@0+ (1,0) [0|255] "" XXX
BO_ 170 WHEEL_SPEEDS: 8 XXX
SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "kph" XXX
SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "kph" XXX
SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "kph" XXX
SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "kph" XXX
BO_ 180 SPEED: 8 XXX
SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "kph" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 353 DSU_SPEED: 8 XXX
SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "kph" XXX
BO_ 452 ENGINE_RPM: 8 CGW
SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
BO_ 466 PCM_CRUISE: 8 XXX
SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
SG_ STANDSTILL_ON : 12|1@0+ (1,0) [0|1] "" XXX
SG_ ACCEL_NET : 23|16@0- (0.001,0) [-20|20] "m/s2" XXX
SG_ CRUISE_STATE : 55|4@0+ (1,0) [0|15] "" XXX
SG_ CANCEL_REQ : 49|1@1+ (1,0) [0|1] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 467 PCM_CRUISE_2: 8 XXX
SG_ MAIN_ON : 15|1@0+ (1,0) [0|1] "" XXX
SG_ LOW_SPEED_LOCKOUT : 14|2@0+ (1,0) [0|3] "kph" XXX
SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "kph" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 552 ACCELEROMETER: 8 XXX
SG_ ACCEL_Z : 22|15@0- (1,0) [0|32767] "" XXX
SG_ ACCEL_X : 6|15@0- (0.001,0) [-20|20] "m/s2" XXX
BO_ 560 BRAKE_MODULE2: 7 XXX
SG_ BRAKE_PRESSED : 26|1@0+ (1,0) [0|1] "" XXX
BO_ 614 STEERING_IPAS: 8 IPAS
SG_ STATE : 7|4@0+ (1,0) [0|15] "" XXX
SG_ ANGLE : 3|12@0- (1.5,0) [-510|510] "deg" XXX
SG_ SET_ME_X10 : 23|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 31|8@0+ (1,0) [0|255] "" XXX
SG_ DIRECTION_CMD : 38|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X40 : 47|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 643 PRE_COLLISION: 7 DSU
SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX
SG_ FORCE : 23|16@0- (2,0) [0|255] "N" XXX
SG_ SET_ME_X002 : 33|8@0+ (1,0) [0|3] "" XXX
SG_ BRAKE_STATUS : 39|3@0+ (1,0) [0|255] "" XXX
SG_ STATE : 36|3@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X003 : 40|1@0+ (1,0) [0|1] "" XXX
SG_ PRECOLLISION_ACTIVE : 41|1@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 55|8@0+ (1,0) [0|255] "" XXX
BO_ 740 STEERING_LKA: 5 XXX
SG_ LKA_STATE : 31|8@0+ (1,0) [0|255] "" XXX
SG_ STEER_REQUEST : 0|1@0+ (1,0) [0|1] "" XXX
SG_ COUNTER : 6|6@0+ (1,0) [0|63] "" XXX
SG_ SET_ME_1 : 7|1@0+ (1,0) [0|1] "" XXX
SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
BO_ 742 LEAD_INFO: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" HCU
SG_ LEAD_REL_SPEED : 23|12@0- (0.025,0) [-100|100] "m/s" HCU
SG_ LEAD_LONG_DIST : 7|13@0+ (0.05,0) [0|300] "m" HCU
BO_ 835 ACC_CONTROL: 8 DSU
SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s2" HCU
SG_ SET_ME_X01 : 23|2@0+ (1,0) [0|3] "" HCU
SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X3 : 19|4@0+ (1,0) [0|15] "" XXX
SG_ SET_ME_1 : 30|1@0+ (1,0) [0|1] "" HCU
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 836 PRE_COLLISION_2: 8 DSU
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 869 DSU_CRUISE : 7 DSU
SG_ RES_BTN : 3|1@0+ (1,0) [0|0] "" XXX
SG_ SET_BTN : 2|1@0+ (1,0) [0|0] "" XXX
SG_ CANCEL_BTN : 1|1@0+ (1,0) [0|0] "" XXX
SG_ MAIN_ON : 0|1@0+ (1,0) [0|0] "" XXX
SG_ SET_SPEED : 15|8@0+ (1,0) [0|0] "km/h" XXX
SG_ CRUISE_REQUEST : 31|8@0+ (100,-12800) [0|0] "N" XXX
SG_ LEAD_DISTANCE : 39|8@0+ (1,0) [0|0] "m" XXX
BO_ 921 PCM_CRUISE_SM: 8 XXX
SG_ MAIN_ON : 4|1@0+ (1,0) [0|1] "" XXX
SG_ CRUISE_CONTROL_STATE : 11|4@0+ (1,0) [0|15] "" XXX
SG_ DISTANCE_LINES : 14|2@0+ (1,0) [0|3] "" XXX
SG_ UI_SET_SPEED : 31|8@0+ (1,0) [0|255] "" XXX
BO_ 951 ESP_CONTROL: 8 ESP
SG_ TC_DISABLED : 13|1@0+ (1,0) [0|1] "" XXX
SG_ VSC_DISABLED : 12|2@0+ (1,0) [0|1] "" XXX
SG_ BRAKE_LIGHTS_ACC : 18|1@0+ (1,0) [0|1] "" XXX
BO_ 1041 ACC_HUD: 8 DSU
SG_ FCW : 4|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X20 : 15|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X10 : 39|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X80 : 55|8@0+ (1,0) [0|1] "" XXX
BO_ 1042 LKAS_HUD: 8 XXX
SG_ BARRIERS : 1|2@0+ (1,0) [0|3] "" XXX
SG_ RIGHT_LINE : 3|2@0+ (1,0) [0|3] "" XXX
SG_ LEFT_LINE : 5|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X01 : 7|2@0+ (1,0) [0|3] "" XXX
SG_ SET_ME_X01_2 : 11|2@0+ (1,0) [0|3] "" XXX
SG_ LDA_ALERT : 9|2@0+ (1,0) [0|3] "" XXX
SG_ TWO_BEEPS : 12|1@0+ (1,0) [0|1] "" XXX
SG_ ADJUSTING_CAMERA : 13|1@0+ (1,0) [0|1] "" XXX
SG_ LDA_MALFUNCTION : 15|1@0+ (1,0) [0|1] "" XXX
SG_ REPEATED_BEEPS : 32|1@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X0C : 23|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X2C : 47|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X38 : 55|8@0+ (1,0) [0|1] "" XXX
SG_ SET_ME_X02 : 63|8@0+ (1,0) [0|1] "" XXX
BO_ 1043 TIME : 8 CGW
SG_ YEAR : 7|8@0+ (1,0) [0|0] "year" XXX
SG_ MONTH : 15|8@0+ (1,0) [0|0] "month" XXX
SG_ DAY : 23|8@0+ (1,0) [0|0] "day" XXX
SG_ HOUR : 31|8@0+ (1,0) [0|0] "hour" XXX
SG_ MINUTE : 39|8@0+ (1,0) [0|0] "minute" XXX
SG_ GMT_DIFF : 55|1@0+ (1,0) [0|0] "" XXX
SG_ GMTDIFF_HOURS : 54|4@0+ (1,0) [0|0] "hours" XXX
SG_ GMTDIFF_MINUTES : 50|6@0+ (1,0) [0|0] "minutes" XXX
SG_ SUMMER : 60|1@0+ (1,0) [0|0] "" XXX
BO_ 1408 VIN_PART_1: 8 CGW
SG_ VIN_1 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_2 : 15|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_3 : 23|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_4 : 31|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_5 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_6 : 47|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_7 : 55|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_8 : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 1409 VIN_PART_2: 8 CGW
SG_ VIN_9 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_10 : 15|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_11 : 23|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_12 : 31|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_13 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_14 : 47|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_15 : 55|8@0+ (1,0) [0|0] "" XXX
SG_ VIN_16 : 63|8@0+ (1,0) [0|0] "" XXX
BO_ 1410 VIN_PART_3: 8 CGW
SG_ VIN_17 : 7|8@0+ (1,0) [0|0] "" XXX
BO_ 1553 UI_SETTING: 8 XXX
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
BO_ 1556 STEERING_LEVERS: 8 XXX
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
BO_ 1568 SEATS_DOORS: 8 XXX
SG_ SEATBELT_DRIVER_UNLATCHED : 62|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_FL : 45|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_RL : 42|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_RR : 43|1@0+ (1,0) [0|1] "" XXX
SG_ DOOR_OPEN_FR : 44|1@0+ (1,0) [0|1] "" XXX
BO_ 1570 LIGHT_STALK: 8 SCM
SG_ AUTO_HIGH_BEAM : 37|1@0+ (1,0) [0|1] "" XXX
BO_ 1161 RSA1: 8 FCM
SG_ TSGN1 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY1 : 12|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT1 : 9|2@0+ (1,0) [0|0] "" XXX
SG_ SPDVAL1 : 23|8@0+ (1,0) [0|0] "kph" XXX
SG_ SPLSGN1 : 31|4@0+ (1,0) [0|0] "" XXX
SG_ SPLSGN2 : 27|4@0+ (1,0) [0|0] "" XXX
SG_ TSGN2 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY2 : 44|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT2 : 41|2@0+ (1,0) [0|0] "" XXX
SG_ SPDVAL2 : 55|8@0+ (1,0) [0|0] "" XXX
SG_ BZRRQ_P : 63|2@0+ (1,0) [0|0] "" XXX
SG_ BZRRQ_A : 61|2@0+ (1,0) [0|0] "" XXX
SG_ SYNCID1 : 59|4@0+ (1,0) [0|0] "" XXX
BO_ 1162 RSA2: 8 FCM
SG_ TSGN3 : 7|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY3 : 12|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT3 : 9|2@0+ (1,0) [0|0] "" XXX
SG_ SPLSGN3 : 31|4@0+ (1,0) [0|0] "" XXX
SG_ SPLSGN4 : 27|4@0+ (1,0) [0|0] "" XXX
SG_ TSGN4 : 39|8@0+ (1,0) [0|0] "" XXX
SG_ TSGNGRY4 : 44|3@0+ (1,0) [0|0] "" XXX
SG_ TSGNHLT4 : 41|2@0+ (1,0) [0|0] "" XXX
SG_ DPSGNREQ : 54|1@0+ (1,0) [0|0] "" XXX
SG_ SGNNUMP : 53|3@0+ (1,0) [0|0] "" XXX
SG_ SGNNUMA : 50|3@0+ (1,0) [0|0] "" XXX
SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
BO_ 1163 RSA3: 8 FCM
SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
SG_ OTSGNNTM : 5|2@0+ (1,0) [0|0] "" XXX
SG_ NTLVLSPD : 3|2@0+ (1,0) [0|0] "" XXX
SG_ OVSPNTM : 1|2@0+ (1,0) [0|0] "" XXX
SG_ OVSPVALL : 11|4@0+ (1,-5) [0|0] "" XXX
SG_ OVSPVALM : 19|4@0+ (1,-5) [0|0] "" XXX
SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
CM_ SG_ 36 ACCEL_Y "unit is tbd";
CM_ SG_ 36 YAW_RATE "verify";
CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
CM_ SG_ 37 STEER_FRACTION "1/15th of the signal STEER_ANGLE, which is 1.5 deg; note that 0x8 is never set";
CM_ SG_ 37 STEER_RATE "factor is tbd";
CM_ SG_ 466 ACCEL_NET "net acceleration produced by the system, given ACCEL_CMD, road grade and other factors";
CM_ SG_ 467 SET_SPEED "43 kph are shown as 28mph, so conversion isn't perfect";
CM_ SG_ 467 LOW_SPEED_LOCKOUT "in low speed lockout, system would always disengage below 28mph";
CM_ SG_ 560 BRAKE_PRESSED "another brake pressed?";
CM_ SG_ 608 STEER_TORQUE_DRIVER "driver torque";
CM_ SG_ 608 STEER_OVERRIDE "set when driver torque exceeds a certain value";
CM_ SG_ 614 ANGLE "set to measured angle when ipas control isn't active";
CM_ SG_ 643 COUNTER "only used on cars that use this msg for cruise control";
CM_ SG_ 643 BRAKE_STATUS "only used on cars that use this msg for cruise control";
CM_ SG_ 643 PRECOLLISION_ACTIVE "set 0.5s before any braking";
CM_ SG_ 921 UI_SET_SPEED "set speed shown in UI with user set unit";
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";
CM_ SG_ 1042 SET_ME_1 "unclear what this is, but it's always 1 in drive traces";
CM_ SG_ 1042 REPEATED_BEEPS "recommended for fcw and other important alerts";
CM_ SG_ 1161 SPDVAL1 "Numbers 0-199 is displayed, 200-254 displays circle without number and 255 is for no limit.";
CM_ SG_ 1161 SYNCID1 "counter from 1 to f at 1 Hz";
CM_ SG_ 1161 SPDVAL2 "conditional speed value 70"
CM_ SG_ 1162 SGNNUMP "1 if SPDVAL1 is set, otherwise 0";
CM_ SG_ 1162 SYNCID2 "counter from 1 to f at 1 Hz";
CM_ SG_ 1163 TSREQPD "always 1";
CM_ SG_ 1163 TSRMSW "always 1";
CM_ SG_ 1163 OTSGNNTM "always 3";
CM_ SG_ 1163 NTLVLSPD "always 3";
CM_ SG_ 1163 OVSPNTM "always 3";
CM_ SG_ 1163 OVSPVALL "-5 at start then 2 after 2 seconds";
CM_ SG_ 1163 OVSPVALM "-5 at start then 5 after 2 seconds";
CM_ SG_ 1163 OVSPVALH "-5 at start then 10 after 2 seconds";
CM_ SG_ 1163 TSRSPU "always 1";
VAL_ 466 CRUISE_STATE 8 "active" 7 "standstill" 1 "off";
VAL_ 467 LOW_SPEED_LOCKOUT 2 "low speed locked" 1 "ok";
VAL_ 614 STATE 3 "enabled" 1 "disabled";
VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none";
VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
VAL_ 1553 UNITS 1 "km" 2 "miles";
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
CM_ "lexus_nxt_2015_pt.dbc starts here"
BO_ 550 BRAKE_MODULE: 8 XXX
SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
SG_ BRAKE_POSITION : 16|9@0+ (1,0) [0|511] "" XXX
SG_ BRAKE_PRESSED : 37|1@0+ (1,0) [0|1] "" XXX
BO_ 581 GAS_PEDAL_ALT: 5 XXX
SG_ GAS_PEDAL : 23|8@0+ (0.005,0) [0|1] "" XXX
BO_ 705 GAS_PEDAL: 8 XXX
SG_ GAS_RELEASED : 3|1@0+ (1,0) [0|1] "" XXX
SG_ GAS_PEDAL : 55|8@0+ (0.005,0) [0|1] "" XXX
BO_ 608 STEER_TORQUE_SENSOR: 8 XXX
SG_ STEER_TORQUE_EPS : 47|16@0- (1.0,0) [-20000|20000] "" XXX
SG_ STEER_TORQUE_DRIVER : 15|16@0- (1,0) [-32768|32767] "" XXX
SG_ STEER_OVERRIDE : 0|1@0+ (1,0) [0|1] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
SG_ STEER_ANGLE : 31|16@0- (0.0573,0) [-500|500] "" XXX
BO_ 610 EPS_STATUS: 5 EPS
SG_ IPAS_STATE : 3|4@0+ (1,0) [0|15] "" XXX
SG_ LKA_STATE : 31|7@0+ (1,0) [0|127] "" XXX
SG_ TYPE : 24|1@0+ (1,0) [0|1] "" XXX
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
BO_ 956 GEAR_PACKET: 8 XXX
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
BO_ 1009 PCM_CRUISE_ALT: 8 XXX
SG_ MAIN_ON : 13|1@0+ (1,0) [0|3] "" XXX
SG_ CRUISE_STATE : 10|1@0+ (1,0) [0|1] "" XXX
SG_ SET_SPEED : 23|8@0+ (1,0) [0|255] "mph" XXX
BO_ 1599 LIGHT_STALK_ISH: 8 SCM
SG_ AUTO_HIGH_BEAM : 19|1@0+ (1,0) [0|1] "" XXX
CM_ SG_ 550 BRAKE_PRESSURE "seems prop to pedal force";
CM_ SG_ 550 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
CM_ SG_ 610 TYPE "seems 1 on Corolla, 0 on all others";
CM_ SG_ 1009 SET_SPEED "units seem to be whatever the car is set to";
VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
VAL_ 610 IPAS_STATE 5 "override" 3 "enabled" 1 "disabled";
VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "standby";

View File

@@ -132,6 +132,9 @@ BO_ 614 STEERING_IPAS: 8 IPAS
SG_ SET_ME_X00_1 : 55|8@0+ (1,0) [0|255] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 35 SECONDARY_STEER_ANGLE: 8 XXX
SG_ ZORRO_STEER : 7|24@0- (0.004901594652,0) [-500|500] "" XXX
BO_ 643 PRE_COLLISION: 7 DSU
SG_ COUNTER : 7|8@0+ (1,0) [0|255] "" XXX
SG_ SET_ME_X00 : 15|8@0+ (1,0) [0|255] "" XXX

1400
opendbc/vw_golf_mk4.dbc Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,11 @@ CFLAGS = -g -Wall -Wextra -Wstrict-prototypes -Werror
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4
CFLAGS += -mhard-float -DSTM32F4 -DSTM32F413xx -mfpu=fpv4-sp-d16 -fsingle-precision-constant
dp_vw := $(shell cat /data/params/d/dp_vw)
$(info dp_vw is ${dp_vw})
ifeq ($(dp_vw), 1)
CFLAGS += -Dvw
endif
STARTUP_FILE = startup_stm32f413xx
include build.mk

View File

@@ -72,9 +72,11 @@ void uno_set_usb_power_mode(uint8_t mode) {
bool valid = false;
switch (mode) {
case USB_POWER_CLIENT:
uno_set_phone_power(false);
valid = true;
break;
case USB_POWER_CDP:
uno_set_phone_power(true);
uno_bootkick();
valid = true;
break;

View File

@@ -124,10 +124,24 @@ void set_safety_mode(uint16_t mode, int16_t param) {
switch (mode_copy) {
case SAFETY_SILENT:
set_intercept_relay(false);
#ifdef vw
// Volkswagen community port:
// J533 integrations with White/Grey Panda really need Panda to respond
// at all times. Let the CAN transceivers ACK traffic unless this is
// BP/Uno where the physical relay makes it irrelevant. This makes
// SILENT identical to NOOUTPUT for White/Grey Panda.
if (board_has_obd()) {
current_board->set_can_mode(CAN_MODE_NORMAL);
can_silent = ALL_CAN_SILENT;
} else {
can_silent = ALL_CAN_LIVE;
}
#else
if (board_has_obd()) {
current_board->set_can_mode(CAN_MODE_NORMAL);
}
can_silent = ALL_CAN_SILENT;
#endif
break;
case SAFETY_NOOUTPUT:
set_intercept_relay(false);

View File

@@ -28,7 +28,14 @@ void set_power_save_state(int state) {
enable = true;
}
#ifdef vw
// Volkswagen community port:
// If this is a White or Grey Panda, always keep the CAN transceivers
// powered up so that transparent forwarding is maintained.
current_board->enable_can_transceivers(board_has_obd() ? enable : true);
#else
current_board->enable_can_transceivers(enable);
#endif
// Switch EPS/GPS
if (enable) {

View File

@@ -24,9 +24,31 @@ static int nooutput_tx_lin_hook(int lin_num, uint8_t *data, int len) {
}
static int default_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
UNUSED(bus_num);
UNUSED(to_fwd);
#ifdef vw
// Volkswagen community port: Advanced Virtual Relay Technology!
// Make Panda fully transparent from bus 0->2 and bus 2->0 if not otherwise
// instructed by EON/OP, returning the car to stock behavior under NOOUTPUT.
// Don't do this for BP/C2, where we have Advanced Actual Relay Technology.
int bus_fwd = -1;
if(!board_has_relay()) {
switch (bus_num) {
case 0:
bus_fwd = 2;
break;
case 2:
bus_fwd = 0;
break;
default:
bus_fwd = -1;
break;
}
}
#else
UNUSED(bus_num);
return -1;
#endif
}
const safety_hooks nooutput_hooks = {

View File

@@ -1,8 +1,8 @@
// Safety-relevant steering constants for Volkswagen
const int VOLKSWAGEN_MAX_STEER = 300; // 3.0 Nm (EPS side max of 3.0Nm with fault if violated)
const int VOLKSWAGEN_MAX_RT_DELTA = 75; // 4 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 50 ; 50 * 1.5 for safety pad = 75
const int VOLKSWAGEN_MAX_RT_DELTA = 188; // 10 max rate up * 50Hz send rate * 250000 RT interval / 1000000 = 125 ; 125 * 1.5 for safety pad = 187.5
const uint32_t VOLKSWAGEN_RT_INTERVAL = 250000; // 250ms between real time checks
const int VOLKSWAGEN_MAX_RATE_UP = 4; // 2.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
const int VOLKSWAGEN_MAX_RATE_UP = 10; // 5.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
const int VOLKSWAGEN_MAX_RATE_DOWN = 10; // 5.0 Nm/s RoC limit (EPS rack has own soft-limit of 5.0 Nm/s)
const int VOLKSWAGEN_DRIVER_TORQUE_ALLOWANCE = 80;
const int VOLKSWAGEN_DRIVER_TORQUE_FACTOR = 3;

View File

@@ -38,6 +38,11 @@ enum FONSalign {
FONS_ALIGN_BASELINE = 1<<6, // Default
};
enum FONSglyphBitmap {
FONS_GLYPH_BITMAP_OPTIONAL = 1,
FONS_GLYPH_BITMAP_REQUIRED = 2,
};
enum FONSerrorCode {
// Font atlas is full.
FONS_ATLAS_FULL = 1,
@@ -78,6 +83,7 @@ struct FONStextIter {
const char* next;
const char* end;
unsigned int utf8state;
int bitmapOption;
};
typedef struct FONStextIter FONStextIter;
@@ -87,6 +93,8 @@ typedef struct FONScontext FONScontext;
FONScontext* fonsCreateInternal(FONSparams* params);
void fonsDeleteInternal(FONScontext* s);
void fontsDeleteFontByName(FONScontext* stash, const char* name);
void fonsSetErrorCallback(FONScontext* s, void (*callback)(void* uptr, int error, int val), void* uptr);
// Returns current atlas size.
void fonsGetAtlasSize(FONScontext* s, int* width, int* height);
@@ -122,7 +130,7 @@ void fonsLineBounds(FONScontext* s, float y, float* miny, float* maxy);
void fonsVertMetrics(FONScontext* s, float* ascender, float* descender, float* lineh);
// Text iterator
int fonsTextIterInit(FONScontext* stash, FONStextIter* iter, float x, float y, const char* str, const char* end);
int fonsTextIterInit(FONScontext* stash, FONStextIter* iter, float x, float y, const char* str, const char* end, int bitmapOption);
int fonsTextIterNext(FONScontext* stash, FONStextIter* iter, struct FONSquad* quad);
// Pull texture changes
@@ -156,11 +164,19 @@ static FT_Library ftLibrary;
int fons__tt_init(FONScontext *context)
{
FT_Error ftError;
FONS_NOTUSED(context);
FONS_NOTUSED(context);
ftError = FT_Init_FreeType(&ftLibrary);
return ftError == 0;
}
int fons__tt_done(FONScontext *context)
{
FT_Error ftError;
FONS_NOTUSED(context);
ftError = FT_Done_FreeType(ftLibrary);
return ftError == 0;
}
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize)
{
FT_Error ftError;
@@ -198,7 +214,7 @@ int fons__tt_buildGlyphBitmap(FONSttFontImpl *font, int glyph, float size, float
ftError = FT_Set_Pixel_Sizes(font->font, 0, (FT_UInt)(size * (float)font->font->units_per_EM / (float)(font->font->ascender - font->font->descender)));
if (ftError) return 0;
ftError = FT_Load_Glyph(font->font, glyph, FT_LOAD_RENDER);
ftError = FT_Load_Glyph(font->font, glyph, FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT);
if (ftError) return 0;
ftError = FT_Get_Advance(font->font, glyph, FT_LOAD_NO_SCALE, &advFixed);
if (ftError) return 0;
@@ -258,6 +274,12 @@ int fons__tt_init(FONScontext *context)
return 1;
}
int fons__tt_done(FONScontext *context)
{
FONS_NOTUSED(context);
return 1;
}
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize)
{
int stbError;
@@ -265,6 +287,7 @@ int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char
font->font.userdata = context;
stbError = stbtt_InitFont(&font->font, data, 0);
return stbError;
}
@@ -306,7 +329,7 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2)
#endif
#ifndef FONS_SCRATCH_BUF_SIZE
# define FONS_SCRATCH_BUF_SIZE 64000
# define FONS_SCRATCH_BUF_SIZE 96000
#endif
#ifndef FONS_HASH_LUT_SIZE
# define FONS_HASH_LUT_SIZE 256
@@ -869,7 +892,6 @@ error:
return FONS_INVALID;
}
int fonsAddFont(FONScontext* stash, const char* name, const char* path)
{
FILE* fp = 0;
@@ -922,7 +944,7 @@ int fonsAddFontMem(FONScontext* stash, const char* name, unsigned char* data, in
// Init font
stash->nscratch = 0;
if (!fons__tt_loadFont(stash, &font->font, data, dataSize)) goto error;
// Store normalized line height. The real line height is got
// by multiplying the lineh by font size.
fons__tt_getFontVMetrics( &font->font, &ascent, &descent, &lineGap);
@@ -1028,7 +1050,7 @@ static void fons__blur(FONScontext* stash, unsigned char* dst, int w, int h, int
}
static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned int codepoint,
short isize, short iblur)
short isize, short iblur, int bitmapOption)
{
int i, g, advance, lsb, x0, y0, x1, y1, gw, gh, gx, gy, x, y;
float scale;
@@ -1038,6 +1060,7 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
int pad, added;
unsigned char* bdst;
unsigned char* dst;
FONSfont* renderFont = font;
if (isize < 2) return NULL;
if (iblur > 20) iblur = 20;
@@ -1050,41 +1073,66 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
h = fons__hashint(codepoint) & (FONS_HASH_LUT_SIZE-1);
i = font->lut[h];
while (i != -1) {
if (font->glyphs[i].codepoint == codepoint && font->glyphs[i].size == isize && font->glyphs[i].blur == iblur)
return &font->glyphs[i];
if (font->glyphs[i].codepoint == codepoint && font->glyphs[i].size == isize && font->glyphs[i].blur == iblur) {
glyph = &font->glyphs[i];
if (bitmapOption == FONS_GLYPH_BITMAP_OPTIONAL || (glyph->x0 >= 0 && glyph->y0 >= 0)) {
return glyph;
}
// At this point, glyph exists but the bitmap data is not yet created.
break;
}
i = font->glyphs[i].next;
}
// Could not find glyph, create it.
scale = fons__tt_getPixelHeightScale(&font->font, size);
// Create a new glyph or rasterize bitmap data for a cached glyph.
g = fons__tt_getGlyphIndex(&font->font, codepoint);
// Try to find the glyph in fallback fonts.
if (g == 0) {
for (i = 0; i < font->nfallbacks; ++i) {
FONSglyph* fallbackGlyph = fons__getGlyph(stash, stash->fonts[font->fallbacks[i]], codepoint, isize, iblur);
if (fallbackGlyph != NULL && fallbackGlyph->index != 0) {
return fallbackGlyph;
FONSfont* fallbackFont = stash->fonts[font->fallbacks[i]];
int fallbackIndex = fons__tt_getGlyphIndex(&fallbackFont->font, codepoint);
if (fallbackIndex != 0) {
g = fallbackIndex;
renderFont = fallbackFont;
break;
}
}
// It is possible that we did not find a fallback glyph.
// In that case the glyph index 'g' is 0, and we'll proceed below and cache empty glyph.
}
fons__tt_buildGlyphBitmap(&font->font, g, size, scale, &advance, &lsb, &x0, &y0, &x1, &y1);
scale = fons__tt_getPixelHeightScale(&renderFont->font, size);
fons__tt_buildGlyphBitmap(&renderFont->font, g, size, scale, &advance, &lsb, &x0, &y0, &x1, &y1);
gw = x1-x0 + pad*2;
gh = y1-y0 + pad*2;
// Find free spot for the rect in the atlas
added = fons__atlasAddRect(stash->atlas, gw, gh, &gx, &gy);
if (added == 0 && stash->handleError != NULL) {
// Atlas is full, let the user to resize the atlas (or not), and try again.
stash->handleError(stash->errorUptr, FONS_ATLAS_FULL, 0);
// Determines the spot to draw glyph in the atlas.
if (bitmapOption == FONS_GLYPH_BITMAP_REQUIRED) {
// Find free spot for the rect in the atlas
added = fons__atlasAddRect(stash->atlas, gw, gh, &gx, &gy);
if (added == 0 && stash->handleError != NULL) {
// Atlas is full, let the user to resize the atlas (or not), and try again.
stash->handleError(stash->errorUptr, FONS_ATLAS_FULL, 0);
added = fons__atlasAddRect(stash->atlas, gw, gh, &gx, &gy);
}
if (added == 0) return NULL;
} else {
// Negative coordinate indicates there is no bitmap data created.
gx = -1;
gy = -1;
}
if (added == 0) return NULL;
// Init glyph.
glyph = fons__allocGlyph(font);
glyph->codepoint = codepoint;
glyph->size = isize;
glyph->blur = iblur;
if (glyph == NULL) {
glyph = fons__allocGlyph(font);
glyph->codepoint = codepoint;
glyph->size = isize;
glyph->blur = iblur;
glyph->next = 0;
// Insert char to hash lookup.
glyph->next = font->lut[h];
font->lut[h] = font->nglyphs-1;
}
glyph->index = g;
glyph->x0 = (short)gx;
glyph->y0 = (short)gy;
@@ -1093,15 +1141,14 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
glyph->xadv = (short)(scale * advance * 10.0f);
glyph->xoff = (short)(x0 - pad);
glyph->yoff = (short)(y0 - pad);
glyph->next = 0;
// Insert char to hash lookup.
glyph->next = font->lut[h];
font->lut[h] = font->nglyphs-1;
if (bitmapOption == FONS_GLYPH_BITMAP_OPTIONAL) {
return glyph;
}
// Rasterize
dst = &stash->texData[(glyph->x0+pad) + (glyph->y0+pad) * stash->params.width];
fons__tt_renderGlyphBitmap(&font->font, dst, gw-pad*2,gh-pad*2, stash->params.width, scale,scale, g);
fons__tt_renderGlyphBitmap(&renderFont->font, dst, gw-pad*2,gh-pad*2, stash->params.width, scale, scale, g);
// Make sure there is one pixel empty border.
dst = &stash->texData[glyph->x0 + glyph->y0 * stash->params.width];
@@ -1128,7 +1175,7 @@ static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned in
if (iblur > 0) {
stash->nscratch = 0;
bdst = &stash->texData[glyph->x0 + glyph->y0 * stash->params.width];
fons__blur(stash, bdst, gw,gh, stash->params.width, iblur);
fons__blur(stash, bdst, gw, gh, stash->params.width, iblur);
}
stash->dirtyRect[0] = fons__mini(stash->dirtyRect[0], glyph->x0);
@@ -1290,7 +1337,7 @@ float fonsDrawText(FONScontext* stash,
for (; str != end; ++str) {
if (fons__decutf8(&utf8state, &codepoint, *(const unsigned char*)str))
continue;
glyph = fons__getGlyph(stash, font, codepoint, isize, iblur);
glyph = fons__getGlyph(stash, font, codepoint, isize, iblur, FONS_GLYPH_BITMAP_REQUIRED);
if (glyph != NULL) {
fons__getQuad(stash, font, prevGlyphIndex, glyph, scale, state->spacing, &x, &y, &q);
@@ -1313,7 +1360,7 @@ float fonsDrawText(FONScontext* stash,
}
int fonsTextIterInit(FONScontext* stash, FONStextIter* iter,
float x, float y, const char* str, const char* end)
float x, float y, const char* str, const char* end, int bitmapOption)
{
FONSstate* state = fons__getState(stash);
float width;
@@ -1353,6 +1400,7 @@ int fonsTextIterInit(FONScontext* stash, FONStextIter* iter,
iter->end = end;
iter->codepoint = 0;
iter->prevGlyphIndex = -1;
iter->bitmapOption = bitmapOption;
return 1;
}
@@ -1373,7 +1421,8 @@ int fonsTextIterNext(FONScontext* stash, FONStextIter* iter, FONSquad* quad)
// Get glyph and quad
iter->x = iter->nextx;
iter->y = iter->nexty;
glyph = fons__getGlyph(stash, iter->font, iter->codepoint, iter->isize, iter->iblur);
glyph = fons__getGlyph(stash, iter->font, iter->codepoint, iter->isize, iter->iblur, iter->bitmapOption);
// If the iterator was initialized with FONS_GLYPH_BITMAP_OPTIONAL, then the UV coordinates of the quad will be invalid.
if (glyph != NULL)
fons__getQuad(stash, iter->font, iter->prevGlyphIndex, glyph, iter->scale, iter->spacing, &iter->nextx, &iter->nexty, quad);
iter->prevGlyphIndex = glyph != NULL ? glyph->index : -1;
@@ -1470,7 +1519,7 @@ float fonsTextBounds(FONScontext* stash,
for (; str != end; ++str) {
if (fons__decutf8(&utf8state, &codepoint, *(const unsigned char*)str))
continue;
glyph = fons__getGlyph(stash, font, codepoint, isize, iblur);
glyph = fons__getGlyph(stash, font, codepoint, isize, iblur, FONS_GLYPH_BITMAP_OPTIONAL);
if (glyph != NULL) {
fons__getQuad(stash, font, prevGlyphIndex, glyph, scale, state->spacing, &x, &y, &q);
if (q.x0 < minx) minx = q.x0;
@@ -1579,6 +1628,35 @@ int fonsValidateTexture(FONScontext* stash, int* dirty)
return 0;
}
void fontsDeleteFontByName(FONScontext* stash, const char* name)
{
int id = 0;
if (stash == NULL) return;
if(name == NULL) {
for (id = 0; id < stash->nfonts; ++id) {
fons__freeFont(stash->fonts[id]);
}
stash->nfonts = 0;
}
else {
id = fonsGetFontByName(stash, name);
if(id >= 0) {
fons__freeFont(stash->fonts[id]);
for(; id < stash->nfonts; id++) {
if(id + 1 < stash->nfonts) {
stash->fonts[id] = stash->fonts[id + 1];
}
else {
stash->fonts[id] = NULL;
break;
}
}
stash->nfonts--;
}
}
}
void fonsDeleteInternal(FONScontext* stash)
{
int i;
@@ -1595,6 +1673,7 @@ void fonsDeleteInternal(FONScontext* stash)
if (stash->texData) free(stash->texData);
if (stash->scratch) free(stash->scratch);
free(stash);
fons__tt_done(stash);
}
void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr)

View File

@@ -1,4 +1,4 @@
//
//
// Copyright (c) 2013 Mikko Mononen memon@inside.org
//
// This software is provided 'as-is', without any express or implied
@@ -17,15 +17,20 @@
//
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <memory.h>
#include "nanovg.h"
#ifdef WITH_NANOVG_GPU
#include <stdio.h>
#include <memory.h>
#define FONTSTASH_IMPLEMENTATION
#include "fontstash.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#else
#include <string.h>
#define printf(...)
#endif/*WITH_NANOVG_GPU*/
#ifdef _MSC_VER
#pragma warning(disable: 4100) // unreferenced formal parameter
@@ -67,6 +72,7 @@ enum NVGpointFlags
struct NVGstate {
NVGcompositeOperationState compositeOperation;
int shapeAntiAlias;
NVGpaint fill;
NVGpaint stroke;
float strokeWidth;
@@ -140,7 +146,7 @@ static float nvg__acosf(float a) { return acosf(a); }
static int nvg__mini(int a, int b) { return a < b ? a : b; }
static int nvg__maxi(int a, int b) { return a > b ? a : b; }
static int nvg__clampi(int a, int mn, int mx) { return a < mn ? mn : (a > mx ? mx : a); }
__attribute__((unused)) static int nvg__clampi(int a, int mn, int mx) { return a < mn ? mn : (a > mx ? mx : a); }
static float nvg__minf(float a, float b) { return a < b ? a : b; }
static float nvg__maxf(float a, float b) { return a > b ? a : b; }
static float nvg__absf(float a) { return a >= 0.0f ? a : -a; }
@@ -263,6 +269,11 @@ static NVGcompositeOperationState nvg__compositeOperationState(int op)
sfactor = NVG_ONE_MINUS_DST_ALPHA;
dfactor = NVG_ONE_MINUS_SRC_ALPHA;
}
else
{
sfactor = NVG_ONE;
dfactor = NVG_ZERO;
}
NVGcompositeOperationState state;
state.srcRGB = sfactor;
@@ -277,9 +288,19 @@ static NVGstate* nvg__getState(NVGcontext* ctx)
return &ctx->states[ctx->nstates-1];
}
void nvgGetStateXfrom(NVGcontext* ctx, float* xform)
{
if(xform != NULL) {
memcpy(xform, &(ctx->states[ctx->nstates-1].xform), sizeof(float) * 6);
}
}
NVGcontext* nvgCreateInternal(NVGparams* params)
{
#ifdef WITH_NANOVG_GPU
FONSparams fontParams;
#endif/*WITH_NANOVG_GPU*/
NVGcontext* ctx = (NVGcontext*)malloc(sizeof(NVGcontext));
int i;
if (ctx == NULL) goto error;
@@ -304,6 +325,7 @@ NVGcontext* nvgCreateInternal(NVGparams* params)
if (ctx->params.renderCreate(ctx->params.userPtr) == 0) goto error;
#ifdef WITH_NANOVG_GPU
// Init font rendering
memset(&fontParams, 0, sizeof(fontParams));
fontParams.width = NVG_INIT_FONTIMAGE_SIZE;
@@ -318,9 +340,10 @@ NVGcontext* nvgCreateInternal(NVGparams* params)
if (ctx->fs == NULL) goto error;
// Create font texture
ctx->fontImages[0] = ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_ALPHA, fontParams.width, fontParams.height, 0, NULL);
ctx->fontImages[0] = ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_ALPHA, fontParams.width, fontParams.height, 0, 0, NULL);
if (ctx->fontImages[0] == 0) goto error;
ctx->fontImageIdx = 0;
#endif/*WITH_NANOVG_GPU*/
return ctx;
@@ -341,6 +364,7 @@ void nvgDeleteInternal(NVGcontext* ctx)
if (ctx->commands != NULL) free(ctx->commands);
if (ctx->cache != NULL) nvg__deletePathCache(ctx->cache);
#ifdef WITH_NANOVG_GPU
if (ctx->fs)
fonsDeleteInternal(ctx->fs);
@@ -350,6 +374,9 @@ void nvgDeleteInternal(NVGcontext* ctx)
ctx->fontImages[i] = 0;
}
}
#else
(void)i;
#endif/*WITH_NANOVG_GPU*/
if (ctx->params.renderDelete != NULL)
ctx->params.renderDelete(ctx->params.userPtr);
@@ -357,7 +384,7 @@ void nvgDeleteInternal(NVGcontext* ctx)
free(ctx);
}
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio)
void nvgBeginFrame(NVGcontext* ctx, float windowWidth, float windowHeight, float devicePixelRatio)
{
/* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n",
ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount,
@@ -384,8 +411,7 @@ void nvgCancelFrame(NVGcontext* ctx)
void nvgEndFrame(NVGcontext* ctx)
{
NVGstate* state = nvg__getState(ctx);
ctx->params.renderFlush(ctx->params.userPtr, state->compositeOperation);
ctx->params.renderFlush(ctx->params.userPtr);
if (ctx->fontImageIdx != 0) {
int fontImage = ctx->fontImages[ctx->fontImageIdx];
int i, j, iw, ih;
@@ -461,7 +487,7 @@ NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u)
{
int i;
float oneminu;
NVGcolor cint = {0};
NVGcolor cint = {{{0}}};
u = nvg__clampf(u, 0.0f, 1.0f);
oneminu = 1.0f - u;
@@ -641,6 +667,7 @@ void nvgReset(NVGcontext* ctx)
nvg__setPaintColor(&state->fill, nvgRGBA(255,255,255,255));
nvg__setPaintColor(&state->stroke, nvgRGBA(0,0,0,255));
state->compositeOperation = nvg__compositeOperationState(NVG_SOURCE_OVER);
state->shapeAntiAlias = 1;
state->strokeWidth = 1.0f;
state->miterLimit = 10.0f;
state->lineCap = NVG_BUTT;
@@ -660,6 +687,12 @@ void nvgReset(NVGcontext* ctx)
}
// State setting
void nvgShapeAntiAlias(NVGcontext* ctx, int enabled)
{
NVGstate* state = nvg__getState(ctx);
state->shapeAntiAlias = enabled;
}
void nvgStrokeWidth(NVGcontext* ctx, float width)
{
NVGstate* state = nvg__getState(ctx);
@@ -676,12 +709,20 @@ void nvgLineCap(NVGcontext* ctx, int cap)
{
NVGstate* state = nvg__getState(ctx);
state->lineCap = cap;
if(ctx->params.setLineJoin != NULL)
{
ctx->params.setLineCap(ctx->params.userPtr, cap);
}
}
void nvgLineJoin(NVGcontext* ctx, int join)
{
NVGstate* state = nvg__getState(ctx);
state->lineJoin = join;
if(ctx->params.setLineJoin != NULL)
{
ctx->params.setLineJoin(ctx->params.userPtr, join);
}
}
void nvgGlobalAlpha(NVGcontext* ctx, float alpha)
@@ -776,6 +817,7 @@ void nvgFillPaint(NVGcontext* ctx, NVGpaint paint)
nvgTransformMultiply(state->fill.xform, state->xform);
}
#ifdef WITH_NANOVG_GPU
int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags)
{
int w, h, n, image;
@@ -804,10 +846,21 @@ int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int
stbi_image_free(img);
return image;
}
#else
int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags)
{
return -1;
}
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int ndata)
{
return -1;
}
#endif/*WITH_NANOVG_GPU*/
int nvgCreateImageRGBA(NVGcontext* ctx, int w, int h, int imageFlags, const unsigned char* data)
{
return ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_RGBA, w, h, imageFlags, data);
return ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_RGBA, w, h, w * 4, imageFlags, data);
}
void nvgUpdateImage(NVGcontext* ctx, int image, const unsigned char* data)
@@ -822,6 +875,15 @@ void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h)
ctx->params.renderGetTextureSize(ctx->params.userPtr, image, w, h);
}
void nvgDeleteFontByName(NVGcontext* ctx, const char* name)
{
#ifdef WITH_NANOVG_GPU
if (ctx->fs) {
fontsDeleteFontByName(ctx->fs, name);
}
#endif
}
void nvgDeleteImage(NVGcontext* ctx, int image)
{
ctx->params.renderDeleteTexture(ctx->params.userPtr, image);
@@ -948,7 +1010,12 @@ void nvgScissor(NVGcontext* ctx, float x, float y, float w, float h)
w = nvg__maxf(0.0f, w);
h = nvg__maxf(0.0f, h);
/* 消除着色器精度不够引起的漏出颜色的问题 */
if (w == 0.0f || h == 0.0f) {
w = 0.0f;
h = 0.0f;
}
nvgTransformIdentity(state->scissor.xform);
state->scissor.xform[4] = x+w*0.5f;
state->scissor.xform[5] = y+h*0.5f;
@@ -972,6 +1039,66 @@ static void nvg__isectRects(float* dst,
dst[3] = nvg__maxf(0.0f, maxy - miny);
}
void nvgIntersectScissorForOtherRect(NVGcontext* ctx, float x, float y, float w, float h, float dx, float dy, float dw, float dh)
{
NVGstate* state = nvg__getState(ctx);
float rect[4];
float invxorm[6];
float ex = 0.0f, ey = 0.0f, tex = 0.0f, tey = 0.0f;
/* 因为脏矩形默认坐标系就是没有旋转没有缩放没有平移的状态 */
float pxform[6] = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
ex = dw * 0.5f;
ey = dh * 0.5f;
pxform[4] = dx + dw * 0.5f;
pxform[5] = dy + dh * 0.5f;
memset(invxorm, 0, sizeof(float) * 6);
nvgTransformInverse(invxorm, state->xform);
nvgTransformMultiply(pxform, invxorm);
tex = ex*nvg__absf(pxform[0]) + ey*nvg__absf(pxform[2]);
tey = ex*nvg__absf(pxform[1]) + ey*nvg__absf(pxform[3]);
// Intersect rects.
nvg__isectRects(rect, pxform[4] - tex, pxform[5] - tey, tex * 2, tey * 2, x, y, w, h);
nvgScissor(ctx, rect[0], rect[1], rect[2], rect[3]);
}
void nvgIntersectScissor_ex(NVGcontext* ctx, float* x, float* y, float* w, float* h)
{
NVGstate* state = nvg__getState(ctx);
float pxform[6], invxorm[6];
float rect[4];
float ex, ey, tex, tey;
// If no previous scissor has been set, set the scissor as current scissor.
if (state->scissor.extent[0] < 0) {
nvgScissor(ctx, *x, *y, *w, *h);
return;
}
// Transform the current scissor rect into current transform space.
// If there is difference in rotation, this will be approximation.
memcpy(pxform, state->scissor.xform, sizeof(float)*6);
ex = state->scissor.extent[0];
ey = state->scissor.extent[1];
nvgTransformInverse(invxorm, state->xform);
nvgTransformMultiply(pxform, invxorm);
tex = ex*nvg__absf(pxform[0]) + ey*nvg__absf(pxform[2]);
tey = ex*nvg__absf(pxform[1]) + ey*nvg__absf(pxform[3]);
// Intersect rects.
nvg__isectRects(rect, pxform[4]-tex,pxform[5]-tey,tex*2,tey*2, *x, *y, *w, *h);
*x = rect[0];
*y = rect[1];
*w = rect[2];
*h = rect[3];
nvgScissor(ctx, rect[0], rect[1], rect[2], rect[3]);
}
void nvgIntersectScissor(NVGcontext* ctx, float x, float y, float w, float h)
{
NVGstate* state = nvg__getState(ctx);
@@ -1411,6 +1538,7 @@ static int nvg__curveDivs(float r, float arc, float tol)
return nvg__maxi(2, (int)ceilf(arc / da));
}
#ifdef WITH_NANOVG_GPU
static void nvg__chooseBevel(int bevel, NVGpoint* p0, NVGpoint* p1, float w,
float* x0, float* y0, float* x1, float* y1)
{
@@ -1428,7 +1556,8 @@ static void nvg__chooseBevel(int bevel, NVGpoint* p0, NVGpoint* p1, float w,
}
static NVGvertex* nvg__roundJoin(NVGvertex* dst, NVGpoint* p0, NVGpoint* p1,
float lw, float rw, float lu, float ru, int ncap, float fringe)
float lw, float rw, float lu, float ru, int ncap,
float fringe)
{
int i, n;
float dlx0 = p0->dy;
@@ -1561,36 +1690,39 @@ static NVGvertex* nvg__bevelJoin(NVGvertex* dst, NVGpoint* p0, NVGpoint* p1,
}
static NVGvertex* nvg__buttCapStart(NVGvertex* dst, NVGpoint* p,
float dx, float dy, float w, float d, float aa)
float dx, float dy, float w, float d,
float aa, float u0, float u1)
{
float px = p->x - dx*d;
float py = p->y - dy*d;
float dlx = dy;
float dly = -dx;
nvg__vset(dst, px + dlx*w - dx*aa, py + dly*w - dy*aa, 0,0); dst++;
nvg__vset(dst, px - dlx*w - dx*aa, py - dly*w - dy*aa, 1,0); dst++;
nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
nvg__vset(dst, px + dlx*w - dx*aa, py + dly*w - dy*aa, u0,0); dst++;
nvg__vset(dst, px - dlx*w - dx*aa, py - dly*w - dy*aa, u1,0); dst++;
nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
return dst;
}
static NVGvertex* nvg__buttCapEnd(NVGvertex* dst, NVGpoint* p,
float dx, float dy, float w, float d, float aa)
float dx, float dy, float w, float d,
float aa, float u0, float u1)
{
float px = p->x + dx*d;
float py = p->y + dy*d;
float dlx = dy;
float dly = -dx;
nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
nvg__vset(dst, px + dlx*w + dx*aa, py + dly*w + dy*aa, 0,0); dst++;
nvg__vset(dst, px - dlx*w + dx*aa, py - dly*w + dy*aa, 1,0); dst++;
nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
nvg__vset(dst, px + dlx*w + dx*aa, py + dly*w + dy*aa, u0,0); dst++;
nvg__vset(dst, px - dlx*w + dx*aa, py - dly*w + dy*aa, u1,0); dst++;
return dst;
}
static NVGvertex* nvg__roundCapStart(NVGvertex* dst, NVGpoint* p,
float dx, float dy, float w, int ncap, float aa)
float dx, float dy, float w, int ncap,
float aa, float u0, float u1)
{
int i;
float px = p->x;
@@ -1601,16 +1733,17 @@ static NVGvertex* nvg__roundCapStart(NVGvertex* dst, NVGpoint* p,
for (i = 0; i < ncap; i++) {
float a = i/(float)(ncap-1)*NVG_PI;
float ax = cosf(a) * w, ay = sinf(a) * w;
nvg__vset(dst, px - dlx*ax - dx*ay, py - dly*ax - dy*ay, 0,1); dst++;
nvg__vset(dst, px - dlx*ax - dx*ay, py - dly*ax - dy*ay, u0,1); dst++;
nvg__vset(dst, px, py, 0.5f,1); dst++;
}
nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
return dst;
}
static NVGvertex* nvg__roundCapEnd(NVGvertex* dst, NVGpoint* p,
float dx, float dy, float w, int ncap, float aa)
float dx, float dy, float w, int ncap,
float aa, float u0, float u1)
{
int i;
float px = p->x;
@@ -1618,13 +1751,13 @@ static NVGvertex* nvg__roundCapEnd(NVGvertex* dst, NVGpoint* p,
float dlx = dy;
float dly = -dx;
NVG_NOTUSED(aa);
nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
for (i = 0; i < ncap; i++) {
float a = i/(float)(ncap-1)*NVG_PI;
float ax = cosf(a) * w, ay = sinf(a) * w;
nvg__vset(dst, px, py, 0.5f,1); dst++;
nvg__vset(dst, px - dlx*ax + dx*ay, py - dly*ax + dy*ay, 0,1); dst++;
nvg__vset(dst, px - dlx*ax + dx*ay, py - dly*ax + dy*ay, u0,1); dst++;
}
return dst;
}
@@ -1700,15 +1833,24 @@ static void nvg__calculateJoins(NVGcontext* ctx, float w, int lineJoin, float mi
}
static int nvg__expandStroke(NVGcontext* ctx, float w, int lineCap, int lineJoin, float miterLimit)
static int nvg__expandStroke(NVGcontext* ctx, float w, float fringe, int lineCap, int lineJoin, float miterLimit)
{
NVGpathCache* cache = ctx->cache;
NVGvertex* verts;
NVGvertex* dst;
int cverts, i, j;
float aa = ctx->fringeWidth;
float aa = fringe;//ctx->fringeWidth;
float u0 = 0.0f, u1 = 1.0f;
int ncap = nvg__curveDivs(w, NVG_PI, ctx->tessTol); // Calculate divisions per half circle.
w += aa * 0.5f;
// Disable the gradient used for antialiasing when antialiasing is not used.
if (aa == 0.0f) {
u0 = 0.5f;
u1 = 0.5f;
}
nvg__calculateJoins(ctx, w, lineJoin, miterLimit);
// Calculate max vertex usage.
@@ -1769,42 +1911,42 @@ static int nvg__expandStroke(NVGcontext* ctx, float w, int lineCap, int lineJoin
dy = p1->y - p0->y;
nvg__normalize(&dx, &dy);
if (lineCap == NVG_BUTT)
dst = nvg__buttCapStart(dst, p0, dx, dy, w, -aa*0.5f, aa);
dst = nvg__buttCapStart(dst, p0, dx, dy, w, -aa*0.5f, aa, u0, u1);
else if (lineCap == NVG_BUTT || lineCap == NVG_SQUARE)
dst = nvg__buttCapStart(dst, p0, dx, dy, w, w-aa, aa);
dst = nvg__buttCapStart(dst, p0, dx, dy, w, w-aa, aa, u0, u1);
else if (lineCap == NVG_ROUND)
dst = nvg__roundCapStart(dst, p0, dx, dy, w, ncap, aa);
dst = nvg__roundCapStart(dst, p0, dx, dy, w, ncap, aa, u0, u1);
}
for (j = s; j < e; ++j) {
if ((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) {
if (lineJoin == NVG_ROUND) {
dst = nvg__roundJoin(dst, p0, p1, w, w, 0, 1, ncap, aa);
dst = nvg__roundJoin(dst, p0, p1, w, w, u0, u1, ncap, aa);
} else {
dst = nvg__bevelJoin(dst, p0, p1, w, w, 0, 1, aa);
dst = nvg__bevelJoin(dst, p0, p1, w, w, u0, u1, aa);
}
} else {
nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), 0,1); dst++;
nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), 1,1); dst++;
nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), u0,1); dst++;
nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), u1,1); dst++;
}
p0 = p1++;
}
if (loop) {
// Loop it
nvg__vset(dst, verts[0].x, verts[0].y, 0,1); dst++;
nvg__vset(dst, verts[1].x, verts[1].y, 1,1); dst++;
nvg__vset(dst, verts[0].x, verts[0].y, u0,1); dst++;
nvg__vset(dst, verts[1].x, verts[1].y, u1,1); dst++;
} else {
// Add cap
dx = p1->x - p0->x;
dy = p1->y - p0->y;
nvg__normalize(&dx, &dy);
if (lineCap == NVG_BUTT)
dst = nvg__buttCapEnd(dst, p1, dx, dy, w, -aa*0.5f, aa);
dst = nvg__buttCapEnd(dst, p1, dx, dy, w, -aa*0.5f, aa, u0, u1);
else if (lineCap == NVG_BUTT || lineCap == NVG_SQUARE)
dst = nvg__buttCapEnd(dst, p1, dx, dy, w, w-aa, aa);
dst = nvg__buttCapEnd(dst, p1, dx, dy, w, w-aa, aa, u0, u1);
else if (lineCap == NVG_ROUND)
dst = nvg__roundCapEnd(dst, p1, dx, dy, w, ncap, aa);
dst = nvg__roundCapEnd(dst, p1, dx, dy, w, ncap, aa, u0, u1);
}
path->nstroke = (int)(dst - verts);
@@ -1935,6 +2077,197 @@ static int nvg__expandFill(NVGcontext* ctx, float w, int lineJoin, float miterLi
return 1;
}
#else
static int nvg__expandStroke(NVGcontext* ctx, float w, float fringe, int lineCap, int lineJoin, float miterLimit)
{
NVGpathCache* cache = ctx->cache;
NVGvertex* verts;
NVGvertex* dst;
int cverts, i, j;
float aa = fringe;//ctx->fringeWidth;
float u0 = 0.0f, u1 = 1.0f;
int ncap = nvg__curveDivs(w, NVG_PI, ctx->tessTol); // Calculate divisions per half circle.
w += aa * 0.5f;
// Disable the gradient used for antialiasing when antialiasing is not used.
if (aa == 0.0f) {
u0 = 0.5f;
u1 = 0.5f;
}
// Calculate max vertex usage.
cverts = 0;
for (i = 0; i < cache->npaths; i++) {
NVGpath* path = &cache->paths[i];
int loop = (path->closed == 0) ? 0 : 1;
cverts += (path->count + path->nbevel*5 + 1) * 2; // plus one for loop
if (loop == 0) {
// space for caps
if (lineCap == NVG_ROUND) {
cverts += (ncap*2 + 2)*2;
} else {
cverts += (3+3)*2;
}
}
}
verts = nvg__allocTempVerts(ctx, cverts);
if (verts == NULL) return 0;
for (i = 0; i < cache->npaths; i++) {
NVGpath* path = &cache->paths[i];
NVGpoint* pts = &cache->points[path->first];
NVGpoint* p0;
NVGpoint* p1;
int s, e, loop;
path->fill = 0;
path->nfill = 0;
// Calculate fringe or stroke
loop = (path->closed == 0) ? 0 : 1;
dst = verts;
path->stroke = dst;
if (loop) {
// Looping
p0 = &pts[path->count-1];
p1 = &pts[0];
s = 0;
e = path->count;
} else {
// Add cap
p0 = &pts[0];
p1 = &pts[1];
s = 1;
e = path->count-1;
}
if (loop == 0) {
// Add cap
nvg__vset(dst, p0->x, p0->y, u0,1); dst++;
}
for (j = s; j < e; ++j) {
nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), u0,1); dst++;
nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), u1,1); dst++;
p0 = p1++;
}
if (loop) {
// Loop it
nvg__vset(dst, verts[0].x, verts[0].y, u0,1); dst++;
nvg__vset(dst, verts[1].x, verts[1].y, u1,1); dst++;
} else {
// Add cap
nvg__vset(dst, p1->x, p1->y, u0,1); dst++;
}
path->nstroke = (int)(dst - verts);
verts = dst;
}
return 1;
}
static int nvg__expandFill(NVGcontext* ctx, float w, int lineJoin, float miterLimit)
{
NVGpathCache* cache = ctx->cache;
NVGvertex* verts;
NVGvertex* dst;
int cverts, convex, i, j;
float aa = ctx->fringeWidth;
int fringe = w > 0.0f;
// Calculate max vertex usage.
cverts = 0;
for (i = 0; i < cache->npaths; i++) {
NVGpath* path = &cache->paths[i];
cverts += path->count + path->nbevel + 1;
if (fringe)
cverts += (path->count + path->nbevel*5 + 1) * 2; // plus one for loop
}
verts = nvg__allocTempVerts(ctx, cverts);
if (verts == NULL) return 0;
convex = cache->npaths == 1 && cache->paths[0].convex;
for (i = 0; i < cache->npaths; i++) {
NVGpath* path = &cache->paths[i];
NVGpoint* pts = &cache->points[path->first];
NVGpoint* p0;
NVGpoint* p1;
float rw, lw, woff;
float ru, lu;
// Calculate shape vertices.
woff = 0.5f*aa;
dst = verts;
path->fill = dst;
if (fringe) {
// Looping
p0 = &pts[path->count-1];
p1 = &pts[0];
for (j = 0; j < path->count; ++j) {
nvg__vset(dst, p1->x + (p1->dmx * woff), p1->y + (p1->dmy * woff), 0.5f,1); dst++;
p0 = p1++;
}
} else {
for (j = 0; j < path->count; ++j) {
nvg__vset(dst, pts[j].x, pts[j].y, 0.5f,1);
dst++;
}
}
path->nfill = (int)(dst - verts);
verts = dst;
// Calculate fringe
if (fringe) {
lw = w + woff;
rw = w - woff;
lu = 0;
ru = 1;
dst = verts;
path->stroke = dst;
// Create only half a fringe for convex shapes so that
// the shape can be rendered without stenciling.
if (convex) {
lw = woff; // This should generate the same vertex as fill inset above.
lu = 0.5f; // Set outline fade at middle.
}
// Looping
p0 = &pts[path->count-1];
p1 = &pts[0];
for (j = 0; j < path->count; ++j) {
nvg__vset(dst, p1->x + (p1->dmx * lw), p1->y + (p1->dmy * lw), lu,1); dst++;
nvg__vset(dst, p1->x - (p1->dmx * rw), p1->y - (p1->dmy * rw), ru,1); dst++;
p0 = p1++;
}
// Loop it
nvg__vset(dst, verts[0].x, verts[0].y, lu,1); dst++;
nvg__vset(dst, verts[1].x, verts[1].y, ru,1); dst++;
path->nstroke = (int)(dst - verts);
verts = dst;
} else {
path->stroke = NULL;
path->nstroke = 0;
}
}
return 1;
}
#endif/*WITH_NANOVG_GPU*/
// Draw
void nvgBeginPath(NVGcontext* ctx)
@@ -2168,6 +2501,14 @@ void nvgCircle(NVGcontext* ctx, float cx, float cy, float r)
nvgEllipse(ctx, cx,cy, r,r);
}
int nvgClearCache(NVGcontext* ctx) {
if(ctx->params.clearCache != NULL) {
ctx->params.clearCache(ctx->params.userPtr);
}
return 0;
}
#ifdef WITH_NANOVG_GPU
void nvgDebugDumpPathCache(NVGcontext* ctx)
{
const NVGpath* path;
@@ -2189,6 +2530,7 @@ void nvgDebugDumpPathCache(NVGcontext* ctx)
}
}
}
#endif/*WITH_NANOVG_GPU*/
void nvgFill(NVGcontext* ctx)
{
@@ -2198,7 +2540,7 @@ void nvgFill(NVGcontext* ctx)
int i;
nvg__flattenPaths(ctx);
if (ctx->params.edgeAntiAlias)
if (ctx->params.edgeAntiAlias && state->shapeAntiAlias)
nvg__expandFill(ctx, ctx->fringeWidth, NVG_MITER, 2.4f);
else
nvg__expandFill(ctx, 0.0f, NVG_MITER, 2.4f);
@@ -2207,7 +2549,12 @@ void nvgFill(NVGcontext* ctx)
fillPaint.innerColor.a *= state->alpha;
fillPaint.outerColor.a *= state->alpha;
ctx->params.renderFill(ctx->params.userPtr, &fillPaint, &state->scissor, ctx->fringeWidth,
/* 把 nanovg 的坐标系传入到适量画布算法中 */
if(ctx->params.setStateXfrom != NULL) {
ctx->params.setStateXfrom(ctx->params.userPtr, state->xform);
}
ctx->params.renderFill(ctx->params.userPtr, &fillPaint, state->compositeOperation, &state->scissor, ctx->fringeWidth,
ctx->cache->bounds, ctx->cache->paths, ctx->cache->npaths);
// Count triangles
@@ -2228,6 +2575,7 @@ void nvgStroke(NVGcontext* ctx)
const NVGpath* path;
int i;
if (strokeWidth < ctx->fringeWidth) {
// If the stroke width is less than pixel size, use alpha to emulate coverage.
// Since coverage is area, scale by alpha*alpha.
@@ -2243,12 +2591,17 @@ void nvgStroke(NVGcontext* ctx)
nvg__flattenPaths(ctx);
if (ctx->params.edgeAntiAlias)
nvg__expandStroke(ctx, strokeWidth*0.5f + ctx->fringeWidth*0.5f, state->lineCap, state->lineJoin, state->miterLimit);
if (ctx->params.edgeAntiAlias && state->shapeAntiAlias)
nvg__expandStroke(ctx, strokeWidth*0.5f, ctx->fringeWidth, state->lineCap, state->lineJoin, state->miterLimit);
else
nvg__expandStroke(ctx, strokeWidth*0.5f, state->lineCap, state->lineJoin, state->miterLimit);
nvg__expandStroke(ctx, strokeWidth*0.5f, 0.0f, state->lineCap, state->lineJoin, state->miterLimit);
ctx->params.renderStroke(ctx->params.userPtr, &strokePaint, &state->scissor, ctx->fringeWidth,
/* 把 nanovg 的坐标系传入到适量画布算法中 */
if(ctx->params.setStateXfrom != NULL) {
ctx->params.setStateXfrom(ctx->params.userPtr, state->xform);
}
ctx->params.renderStroke(ctx->params.userPtr, &strokePaint, state->compositeOperation, &state->scissor, ctx->fringeWidth,
strokeWidth, ctx->cache->paths, ctx->cache->npaths);
// Count triangles
@@ -2259,6 +2612,7 @@ void nvgStroke(NVGcontext* ctx)
}
}
#ifdef WITH_NANOVG_GPU
// Add fonts
int nvgCreateFont(NVGcontext* ctx, const char* name, const char* path)
{
@@ -2377,7 +2731,7 @@ static int nvg__allocTextAtlas(NVGcontext* ctx)
iw *= 2;
if (iw > NVG_MAX_FONTIMAGE_SIZE || ih > NVG_MAX_FONTIMAGE_SIZE)
iw = ih = NVG_MAX_FONTIMAGE_SIZE;
ctx->fontImages[ctx->fontImageIdx+1] = ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_ALPHA, iw, ih, 0, NULL);
ctx->fontImages[ctx->fontImageIdx+1] = ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_ALPHA, iw, ih, 0, 0, NULL);
}
++ctx->fontImageIdx;
fonsResetAtlas(ctx->fs, iw, ih);
@@ -2396,7 +2750,7 @@ static void nvg__renderText(NVGcontext* ctx, NVGvertex* verts, int nverts)
paint.innerColor.a *= state->alpha;
paint.outerColor.a *= state->alpha;
ctx->params.renderTriangles(ctx->params.userPtr, &paint, &state->scissor, verts, nverts);
ctx->params.renderTriangles(ctx->params.userPtr, &paint, state->compositeOperation, &state->scissor, verts, nverts);
ctx->drawCallCount++;
ctx->textTriCount += nverts/3;
@@ -2428,17 +2782,17 @@ float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char*
verts = nvg__allocTempVerts(ctx, cverts);
if (verts == NULL) return x;
fonsTextIterInit(ctx->fs, &iter, x*scale, y*scale, string, end);
fonsTextIterInit(ctx->fs, &iter, x*scale, y*scale, string, end, FONS_GLYPH_BITMAP_REQUIRED);
prevIter = iter;
while (fonsTextIterNext(ctx->fs, &iter, &q)) {
float c[4*2];
if (iter.prevGlyphIndex == -1) { // can not retrieve glyph?
if (!nvg__allocTextAtlas(ctx))
break; // no memory :(
if (nverts != 0) {
nvg__renderText(ctx, verts, nverts);
nverts = 0;
}
if (!nvg__allocTextAtlas(ctx))
break; // no memory :(
iter = prevIter;
fonsTextIterNext(ctx->fs, &iter, &q); // try again
if (iter.prevGlyphIndex == -1) // still can not find glyph?
@@ -2466,7 +2820,7 @@ float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char*
nvg__renderText(ctx, verts, nverts);
return iter.x;
return iter.nextx / scale;
}
void nvgTextBox(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end)
@@ -2525,7 +2879,7 @@ int nvgTextGlyphPositions(NVGcontext* ctx, float x, float y, const char* string,
fonsSetAlign(ctx->fs, state->textAlign);
fonsSetFont(ctx->fs, state->fontId);
fonsTextIterInit(ctx->fs, &iter, x*scale, y*scale, string, end);
fonsTextIterInit(ctx->fs, &iter, x*scale, y*scale, string, end, FONS_GLYPH_BITMAP_OPTIONAL);
prevIter = iter;
while (fonsTextIterNext(ctx->fs, &iter, &q)) {
if (iter.prevGlyphIndex < 0 && nvg__allocTextAtlas(ctx)) { // can not retrieve glyph?
@@ -2549,6 +2903,7 @@ enum NVGcodepointType {
NVG_SPACE,
NVG_NEWLINE,
NVG_CHAR,
NVG_CJK_CHAR,
};
int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, NVGtextRow* rows, int maxRows)
@@ -2590,7 +2945,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
breakRowWidth *= scale;
fonsTextIterInit(ctx->fs, &iter, 0, 0, string, end);
fonsTextIterInit(ctx->fs, &iter, 0, 0, string, end, FONS_GLYPH_BITMAP_OPTIONAL);
prevIter = iter;
while (fonsTextIterNext(ctx->fs, &iter, &q)) {
if (iter.prevGlyphIndex < 0 && nvg__allocTextAtlas(ctx)) { // can not retrieve glyph?
@@ -2616,7 +2971,15 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
type = NVG_NEWLINE;
break;
default:
type = NVG_CHAR;
if ((iter.codepoint >= 0x4E00 && iter.codepoint <= 0x9FFF) ||
(iter.codepoint >= 0x3000 && iter.codepoint <= 0x30FF) ||
(iter.codepoint >= 0xFF00 && iter.codepoint <= 0xFFEF) ||
(iter.codepoint >= 0x1100 && iter.codepoint <= 0x11FF) ||
(iter.codepoint >= 0x3130 && iter.codepoint <= 0x318F) ||
(iter.codepoint >= 0xAC00 && iter.codepoint <= 0xD7AF))
type = NVG_CJK_CHAR;
else
type = NVG_CHAR;
break;
}
@@ -2643,7 +3006,7 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
} else {
if (rowStart == NULL) {
// Skip white space until the beginning of the line
if (type == NVG_CHAR) {
if (type == NVG_CHAR || type == NVG_CJK_CHAR) {
// The current char is the row so far
rowStartX = iter.x;
rowStart = iter.str;
@@ -2663,26 +3026,26 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
float nextWidth = iter.nextx - rowStartX;
// track last non-white space character
if (type == NVG_CHAR) {
if (type == NVG_CHAR || type == NVG_CJK_CHAR) {
rowEnd = iter.next;
rowWidth = iter.nextx - rowStartX;
rowMaxX = q.x1 - rowStartX;
}
// track last end of a word
if (ptype == NVG_CHAR && type == NVG_SPACE) {
if (((ptype == NVG_CHAR || ptype == NVG_CJK_CHAR) && type == NVG_SPACE) || type == NVG_CJK_CHAR) {
breakEnd = iter.str;
breakWidth = rowWidth;
breakMaxX = rowMaxX;
}
// track last beginning of a word
if (ptype == NVG_SPACE && type == NVG_CHAR) {
if ((ptype == NVG_SPACE && (type == NVG_CHAR || type == NVG_CJK_CHAR)) || type == NVG_CJK_CHAR) {
wordStart = iter.str;
wordStartX = iter.x;
wordMinX = q.x0 - rowStartX;
}
// Break to new line when a character is beyond break width.
if (type == NVG_CHAR && nextWidth > breakRowWidth) {
if ((type == NVG_CHAR || type == NVG_CJK_CHAR) && nextWidth > breakRowWidth) {
// The run length is too long, need to break to new line.
if (breakEnd == rowStart) {
// The current word is longer than the row length, just break it from here.
@@ -2867,4 +3230,73 @@ void nvgTextMetrics(NVGcontext* ctx, float* ascender, float* descender, float* l
if (lineh != NULL)
*lineh *= invscale;
}
#else
// State setting
void nvgFontSize(NVGcontext* ctx, float size)
{
NVGstate* state = nvg__getState(ctx);
state->fontSize = size;
}
void nvgFontBlur(NVGcontext* ctx, float blur)
{
}
void nvgTextLetterSpacing(NVGcontext* ctx, float spacing)
{
}
void nvgTextLineHeight(NVGcontext* ctx, float lineHeight)
{
}
void nvgTextAlign(NVGcontext* ctx, int align)
{
}
void nvgFontFaceId(NVGcontext* ctx, int font)
{
}
void nvgFontFace(NVGcontext* ctx, const char* font)
{
}
int nvgCreateFontMem(NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData)
{
return 0;
}
int nvgFindFont(NVGcontext* ctx, const char* name) {
return 0;
}
float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char* end) {
return 0;
}
float nvgTextBounds(NVGcontext* ctx, float x, float y, const char* string, const char* end, float* bounds)
{
return 0;
}
#endif/*WITH_NANOVG_GPU*/
NVGparams* nvgGetParams(NVGcontext* ctx) {
return &(ctx->params);
}
int nvgCreateImageRaw(NVGcontext* ctx, int w, int h, int format, int stride, int imageFlags, const unsigned char* data)
{
return ctx->params.renderCreateTexture(ctx->params.userPtr, format, w, h, stride, imageFlags, data);
}
int nvgFindTextureRaw(NVGcontext* ctx, const void* data)
{
if(ctx->params.findTexture != NULL) {
return ctx->params.findTexture(ctx->params.userPtr, data);
}
return -1;
}
// vim: ft=c nu noet ts=4

View File

@@ -1,4 +1,4 @@
//
//
// Copyright (c) 2013 Mikko Mononen memon@inside.org
//
// This software is provided 'as-is', without any express or implied
@@ -24,6 +24,7 @@ extern "C" {
#endif
#define NVG_PI 3.14159265358979323846264338327f
#define WITH_NANOVG_GPU
#ifdef _MSC_VER
#pragma warning(push)
@@ -141,6 +142,7 @@ enum NVGimageFlags {
NVG_IMAGE_REPEATY = 1<<2, // Repeat image in Y direction.
NVG_IMAGE_FLIPY = 1<<3, // Flips (inverses) image in Y direction when rendered.
NVG_IMAGE_PREMULTIPLIED = 1<<4, // Image data has premultiplied alpha.
NVG_IMAGE_NEAREST = 1<<5, // Image interpolation is Nearest instead Linear
};
// Begin drawing a new frame
@@ -151,7 +153,7 @@ enum NVGimageFlags {
// For example, GLFW returns two dimension for an opened window: window size and
// frame buffer size. In that case you would set windowWidth/Height to the window size
// devicePixelRatio to: frameBufferWidth / windowWidth.
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio);
void nvgBeginFrame(NVGcontext* ctx, float windowWidth, float windowHeight, float devicePixelRatio);
// Cancels drawing the current frame.
void nvgCancelFrame(NVGcontext* ctx);
@@ -237,6 +239,9 @@ void nvgReset(NVGcontext* ctx);
//
// Current render style can be saved and restored using nvgSave() and nvgRestore().
// Sets whether to draw antialias for nvgStroke() and nvgFill(). It's enabled by default.
void nvgShapeAntiAlias(NVGcontext* ctx, int enabled);
// Sets current stroke style to a solid color.
void nvgStrokeColor(NVGcontext* ctx, NVGcolor color);
@@ -384,6 +389,9 @@ void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h);
// Deletes created image.
void nvgDeleteImage(NVGcontext* ctx, int image);
// Deletes font's assets for font's name.
void nvgDeleteFontByName(NVGcontext* ctx, const char* name);
//
// Paints
//
@@ -416,6 +424,9 @@ NVGpaint nvgRadialGradient(NVGcontext* ctx, float cx, float cy, float inr, float
NVGpaint nvgImagePattern(NVGcontext* ctx, float ox, float oy, float ex, float ey,
float angle, int image, float alpha);
// get xfrom data
void nvgGetStateXfrom(NVGcontext* ctx, float* xform);
//
// Scissoring
//
@@ -434,9 +445,45 @@ void nvgScissor(NVGcontext* ctx, float x, float y, float w, float h);
// transform space. The resulting shape is always rectangle.
void nvgIntersectScissor(NVGcontext* ctx, float x, float y, float w, float h);
/**
* @method nvgIntersectScissor_ex
* 设置一个与前一个裁剪区做交集的矩形裁剪区。
* 输入要设置的裁剪区,做交集后把新的裁剪区返回来给用户。
*
* @annotation ["scriptable"]
* @param {NVGcontext*} ctx nanovg的对象
* @param {float_t} x 裁剪区x坐标。
* @param {float_t} y 裁剪区y坐标。
* @param {float_t} w 裁剪区宽度。
* @param {float_t} h 裁剪区高度。
*
* @return {ret_t} 返回RET_OK表示成功否则表示失败。
*/
void nvgIntersectScissor_ex(NVGcontext* ctx, float* x, float* y, float* w, float* h);
// Reset and disables scissoring.
void nvgResetScissor(NVGcontext* ctx);
/**
* @method nvgIntersectScissorForOtherRect
* 设置一个裁剪区,但是该裁剪区收到脏矩形的影响
* 首先会把脏矩形根据当前 nanovg 的坐标系转换为新的脏矩形区域,再和裁剪区做交集,把交集设为新的裁剪区
*
* @annotation ["scriptable"]
* @param {NVGcontext*} ctx nanovg的对象
* @param {float_t} x 裁剪区x坐标。
* @param {float_t} y 裁剪区y坐标。
* @param {float_t} w 裁剪区宽度。
* @param {float_t} h 裁剪区高度。
* @param {float_t} dx 脏矩形x坐标。
* @param {float_t} dy 脏矩形y坐标。
* @param {float_t} dw 脏矩形宽度。
* @param {float_t} dh 脏矩形高度。
*
*/
void nvgIntersectScissorForOtherRect(NVGcontext* ctx, float x, float y, float w, float h, float dx, float dy, float dw, float dh);
//
// Paths
//
@@ -612,8 +659,13 @@ int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, floa
// Internal Render API
//
enum NVGtexture {
NVG_TEXTURE_ALPHA = 0x01,
NVG_TEXTURE_RGBA = 0x02,
NVG_TEXTURE_ALPHA = 1,
NVG_TEXTURE_RGBA = 2,
NVG_TEXTURE_BGRA = 4,
NVG_TEXTURE_RGB = 8,
NVG_TEXTURE_BGR = 16,
NVG_TEXTURE_RGB565 = 32,
NVG_TEXTURE_BGR565 = 64
};
struct NVGscissor {
@@ -644,17 +696,24 @@ typedef struct NVGpath NVGpath;
struct NVGparams {
void* userPtr;
int edgeAntiAlias;
void (*setLineCap)(void* uptr, int lineCap);
void (*setLineJoin)(void* uptr, int lineJoin);
int (*clearCache)(void* uptr);
int (*renderCreate)(void* uptr);
int (*renderCreateTexture)(void* uptr, int type, int w, int h, int imageFlags, const unsigned char* data);
int (*findTexture)(void* uptr, const void* data);
void (*setStateXfrom)(void* uptr, float* xform);
int (*renderCreateTexture)(void* uptr, int type, int w, int h, int stride, int imageFlags, const unsigned char* data);
int (*renderDeleteTexture)(void* uptr, int image);
int (*renderUpdateTexture)(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data);
int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h);
void (*renderViewport)(void* uptr, int width, int height, float devicePixelRatio);
void (*renderViewport)(void* uptr, float width, float height, float devicePixelRatio);
void (*renderCancel)(void* uptr);
void (*renderFlush)(void* uptr, NVGcompositeOperationState compositeOperation);
void (*renderFill)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths);
void (*renderStroke)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, float strokeWidth, const NVGpath* paths, int npaths);
void (*renderTriangles)(void* uptr, NVGpaint* paint, NVGscissor* scissor, const NVGvertex* verts, int nverts);
void (*renderFlush)(void* uptr);
void (*renderFill)(void* uptr, NVGpaint* paint, NVGcompositeOperationState compositeOperation, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths);
void (*renderStroke)(void* uptr, NVGpaint* paint, NVGcompositeOperationState compositeOperation, NVGscissor* scissor, float fringe, float strokeWidth, const NVGpath* paths, int npaths);
void (*renderTriangles)(void* uptr, NVGpaint* paint, NVGcompositeOperationState compositeOperation, NVGscissor* scissor, const NVGvertex* verts, int nverts);
void (*renderDelete)(void* uptr);
};
typedef struct NVGparams NVGparams;
@@ -674,6 +733,13 @@ void nvgDebugDumpPathCache(NVGcontext* ctx);
#define NVG_NOTUSED(v) for (;;) { (void)(1 ? (void)0 : ( (void)(v) ) ); break; }
NVGparams* nvgGetParams(NVGcontext* ctx);
int nvgCreateImageRaw(NVGcontext* ctx, int w, int h, int format, int stride, int imageFlags, const unsigned char* data);
int nvgFindTextureRaw(NVGcontext* ctx, const void* data);
int nvgClearCache(NVGcontext* ctx);
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -49,6 +49,16 @@ void nvgluDeleteFramebuffer(NVGLUframebuffer* fb);
static GLint defaultFBO = -1;
int nvgluGetCurrFramebuffer() {
#ifdef NANOVG_FBO_VALID
GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO);
return defaultFBO;
#else
return -1;
#endif
}
NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags)
{
#ifdef NANOVG_FBO_VALID
@@ -90,7 +100,18 @@ NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imag
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) goto error;
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
#ifdef GL_DEPTH24_STENCIL8
// If GL_STENCIL_INDEX8 is not supported, try GL_DEPTH24_STENCIL8 as a fallback.
// Some graphics cards require a depth buffer along with a stencil.
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
#endif // GL_DEPTH24_STENCIL8
goto error;
}
glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO);
@@ -119,6 +140,14 @@ void nvgluBindFramebuffer(NVGLUframebuffer* fb)
#endif
}
void nvgluReadCurrentFramebufferData(unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int width, unsigned int height, void* pixels)
{
if(x + w <= width && y + h <= height && pixels != NULL) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
}
void nvgluDeleteFramebuffer(NVGLUframebuffer* fb)
{
#ifdef NANOVG_FBO_VALID

View File

@@ -411,7 +411,7 @@ extern "C" {
#endif
#ifdef STB_IMAGE_STATIC
#define STBIDEF static
#define STBIDEF static inline
#else
#define STBIDEF extern
#endif

21
scripts/atl.sh Executable file
View File

@@ -0,0 +1,21 @@
#!/usr/bin/bash
export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
export HOME=/data/data/com.termux/files/home
export PATH=/usr/local/bin:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/sbin:/data/data/com.termux/files/usr/bin/applets:/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/data/data/com.termux/files/usr/bin/git
export PYTHONPATH=/data/openpilot
echo -n 1 > /data/params/d/dp_is_updating
if [ $1 -eq 1 ]; then
printf %s "1" > /data/params/d/CommunityFeaturesToggle
printf %s "1" > /data/params/d/dp_atl
printf %s "0" > /data/params/d/dp_uploader
printf %s "0" > /data/params/d/dp_accel_profile
printf %s "0" > /data/params/d/dp_dynamic_follow
fi
if [ $1 -eq 0 ]; then
printf %s "0" > /data/params/d/dp_atl
cd /data/openpilot || exit
git reset --hard @{u}
git clean -xdf
fi
reboot

9
scripts/complete_setup.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/bash
touch /data/data/com.termux/files/continue.sh
echo "#!/usr/bin/bash" >> /data/data/com.termux/files/continue.sh
echo "cd /data/openpilot" >> /data/data/com.termux/files/continue.sh
echo "exec ./launch_openpilot.sh" >> /data/data/com.termux/files/continue.sh
chmod u+x /data/data/com.termux/files/continue.sh
reboot

10
scripts/disable_relay.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/bash
if [ $1 -eq 1 ]; then
printf %s "1" > /data/params/d/dp_disable_relay
fi
if [ $1 -eq 0 ]; then
printf %s "0" > /data/params/d/dp_disable_relay
fi
rm -rf /data/openpilot/selfdrive/boardd/boardd && reboot

13
scripts/rebuild.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/usr/bin/bash
export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
export HOME=/data/data/com.termux/files/home
export PATH=/usr/local/bin:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/sbin:/data/data/com.termux/files/usr/bin/applets:/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/data/data/com.termux/files/usr/bin/git
printf %s "1" > /data/params/d/DragonUpdating
cd /data/openpilot || exit
#git reset --hard @{u}
git clean -xdf
rm -fr /tmp/scons_cache/
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
scons --clean
reboot

10
scripts/reset_dp.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/bash
export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
export HOME=/data/data/com.termux/files/home
export PATH=/usr/local/bin:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/sbin:/data/data/com.termux/files/usr/bin/applets:/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/data/data/com.termux/files/usr/bin/git
export PYTHONPATH=/data/openpilot
echo -n 1 > /data/params/d/dp_is_updating
rm -fr /data/params/d/dp_*
rm -fr /data/params/d/Dragon*
reboot

9
scripts/reset_update.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/bash
export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
export HOME=/data/data/com.termux/files/home
export PATH=/usr/local/bin:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/sbin:/data/data/com.termux/files/usr/bin/applets:/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/data/data/com.termux/files/usr/bin/git
export PYTHONPATH=/data/openpilot
echo -n 1 > /data/params/d/dp_is_updating
rm /data/openpilot/panda/board/obj/panda.bin
cd /data/openpilot && git fetch --all && git reset --hard @{u} && git clean -xdf && scons --clean && reboot

View File

@@ -0,0 +1,9 @@
#!/usr/bin/bash
export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
export HOME=/data/data/com.termux/files/home
export PATH=/usr/local/bin:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/sbin:/data/data/com.termux/files/usr/bin/applets:/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/data/data/com.termux/files/usr/bin/python
export PYTHONPATH=/data/openpilot
printf %s "1" > /data/params/d/DragonUpdating
rm /data/openpilot/panda/board/obj/panda.bin
cd /data/openpilot/panda || exit ; pkill -f boardd ; python -c "from panda import Panda; Panda().flash()" && reboot

9
scripts/vw.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/bash
if [ $1 -eq 1 ]; then
printf %s "1" > /data/params/d/dp_vw
fi
if [ $1 -eq 0 ]; then
printf %s "0" > /data/params/d/dp_vw
fi
rm /data/openpilot/panda/board/obj/panda.bin

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

@@ -0,0 +1,540 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr ""
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr ""
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr ""
#: selfdrive/controls/lib/events.py:188
#, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr ""
#: selfdrive/controls/lib/events.py:196
#, python-format
msgid "Calibration in Progress: %d%%"
msgstr ""
#: selfdrive/controls/lib/events.py:197
#, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr ""
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr ""
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr ""
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr ""
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr ""
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr ""
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr ""
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr ""
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr ""
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr ""
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr ""
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr ""
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr ""
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr ""
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr ""
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr ""
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr ""
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr ""
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr ""
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr ""
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr ""
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr ""
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr ""
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr ""
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr ""
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr ""
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr ""
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr ""
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr ""
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr ""
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr ""
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr ""
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr ""
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr ""
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr ""
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr ""
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr ""
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr ""
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr ""
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr ""
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr ""
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr ""
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr ""
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr ""
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr ""
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr ""
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr ""
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr ""
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr ""
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr ""
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr ""
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr ""
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr ""
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr ""
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr ""
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr ""
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr ""
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr ""
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr ""
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr ""
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr ""
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr ""
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr ""
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr ""
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr ""
#: selfdrive/controls/lib/events.py:594
msgid "Calibration Invalid"
msgstr ""
#: selfdrive/controls/lib/events.py:595
msgid "Reposition Device and Recalibrate"
msgstr ""
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr ""
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr ""
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr ""
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr ""
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr ""
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr ""
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr ""
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr ""
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr ""
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr ""
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr ""
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr ""
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr ""
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr ""
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr ""
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr ""
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr ""
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr ""
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr ""
#: selfdrive/controls/lib/events.py:722
msgid ""
"Reverse\n"
"Gear"
msgstr ""
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr ""
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr ""
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr ""
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr ""
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr ""
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr ""
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr ""
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr ""
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr ""
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr ""
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr ""
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr ""
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr ""
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr ""
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr ""
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr ""
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr ""
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr ""
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr ""
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr ""
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr ""
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr ""
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr ""

Binary file not shown.

View File

@@ -0,0 +1,545 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: nikkurie <@nikkurie>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ja-JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "オープンパイロットは利用できません"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "すぐにハンドルを持って"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "ハンドルを持って"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "横の制御が無効になり速度が以下になります"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "キャリブレーション中:"
#: selfdrive/controls/lib/events.py:197
#, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "%(speed)d %(unit)s 制限速度以上の運転をしてください"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS受信不良"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "地下・トンネルでない場合は、カスタマーサービスに連絡ください"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "GPSアンテナの位置を確認してください。"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "クルーズモードをオフ"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr "メインスイッチをオフ"
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr "テストメッセージを削除"
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "いつでも引き継げるよう準備しておいてください。"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "常にハンドルに触れ、道路から目を離さない"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "警告: このブランチはテストされていません"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "ダッシュカムモード"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "未対応車のためダッシュカムモードのみ"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "サポートされていないGiraffeの設定"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "comma.ai/tg を参照"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "ホワイトパンダはサポート終了しました"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "コンマ2やブラックパンダにアップグレード"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "ホワイトパンダはサポート終了しました"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "純正LKASがオン"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "純正LKASをオフにしてエンゲージ"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "コミュニティ開発の機能を検出"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "開発者設定でコミュニティ機能を有効にする"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "ダッシュカムモード"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "認識できない車"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "ブレーキ!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "衝突の危険"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "衝突の危険"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "衝突の危険"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "車線逸脱を検知"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "アクセル中、オープンパイロットはブレーキをかけません"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "車両パラメータの識別に失敗しました。"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "ステアリングは一時的に利用不可"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "道路から目を離さないで:注意散漫です"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "道路から目を離さないで"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "ドライバーは注意散漫に見えます"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "すぐに解除してください"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "ドライバーは注意力散漫"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "ハンドルに触れて:顔が検出できない"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "ハンドルに触れて"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "ドライバーが無反応"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "ドライバーが無反応でした"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "ドライバーの顔の視認性を確認"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "ドライバー監視モデルが不完全"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "手動で運転を再開"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "停止"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "Resumeを押して移動します。"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "左ハンドルで車線変更を開始"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "他の車両を監視"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "右ハンドルで車線変更を開始"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "ブラインドスポットで車両を発見"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "レーンチェンジ中"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr "ステアリングリミットを超えています"
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "サイドブレーキが作動"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "サイドブレーキ作動中"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "ペダル/ブレーキを検出"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "ACCを有効化"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "再フォーカス中です"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "空き容量不足"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "速度が遅すぎます"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOSの更新が必要"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "更新をお待ちください"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "デバイスセンサからのデータがありません"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "デバイスを再起動"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "スピーカーが見つかりません"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "注意力散漫すぎます"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "オーバーヒート"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "オーバーヒート"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "Dではない"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "キャリブレーション"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "キャリブレーションが無効です。再実行してください。"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "キャリブレーションが無効です。再実行してください。"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "キャリブレーション"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "ドアが開いています"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "ドアが開いています"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "シートベルト未着用"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "シートベルト未着用"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESPオフ"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "低バッテリー"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "プロセス間の通信の問題"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "レーダー通信問題"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "レーダーエラー:車を再起動"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "制御モデルに遅延がある"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "映像が不明瞭です"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr ""
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "ローメモリ:デバイスを再起動"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "RAMが致命的に低い"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "制御失敗"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr "制御不一致"
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CANエラー:接続を確認"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKASの故障:車を再起動"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKASの故障:車を再起動後発進"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "クルーズ失敗:車を再起動"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "クルーズ失敗:車を再起動後発進"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "アクセル故障:車を再起動"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "アクセルエラー:車を再起動"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "Rに切り替え"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "Rに切り替え"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "クルーズコントロールオフ"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr "Planner Solution エラー"
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "ハーネスが故障"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "ハードウェアを確認して"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "オープンパイロットはキャンセルされました"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "リードカー不在"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "リードカー不在"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "速度が遅すぎる"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "速度が速すぎる"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "速度を下げてオープンパイロットを再開"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "速度を落として発進"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "インターネット接続を確認"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "発進するには更新が必要です"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "インターネット接続を確認"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr "左車線に移動します"
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr "右車線に移動します"
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr "操作が必要:レーンキープオフ"
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr "操作が必要:ウインカーオン"
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr "リードカーが移動しました"
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr ""
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr ""
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr ""
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr ""
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr ""
#~ msgid "Drive Above"
#~ msgstr "制限速度以上の運転をしてください"

Binary file not shown.

View File

@@ -0,0 +1,543 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ko-KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "오픈파일럿 사용불가"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "핸들을 잡아주세요"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "핸들을 잡아주세요"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "%d %s 이하에서는 조향제어가 불가합니다"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "캘리브레이션 진행중: %d%%"
#: selfdrive/controls/lib/events.py:197
#, fuzzy, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "%(speed)d %(unit)s 이상의 속도로 주행하세요"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS 신호 약함"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "환경에 문제가 없을경우 서비스팀에 연락하세요"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "GPS안테나 위치를 점검하세요"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "크루즈 모드 꺼짐"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr ""
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr ""
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "오픈파일럿 사용준비가 되었습니다"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "안전운전을 위해 항상 핸들을 잡고 도로교통 상황을 주시하세요"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "경고: 이 Branch는 테스트되지 않았습니다"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "대시캠 모드"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "안전운전을 위해 항상 핸들을 잡고 도로교통 상황을 주시하세요"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "지원되지 않는 지라프 설정"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "comma.ai/tg 방문하세요"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "화이트판다는 더 이상 지원되지 않습니다"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "콤마2나 블랙판다로 업그레이드 하세요"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "화이트판다는 더 이상 지원되지 않습니다"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "차량의 LKAS 기능이 켜져 있습니다"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "오픈파일럿 사용을 위해 LKAS를 끄세요"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "커뮤니티 기능 감지됨"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "개발자 설정에서 커뮤니티 기능을 활성화하세요"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "대시캠 모드"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "미인식 차량"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "브레이크!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "순정 AEB: 충돌 위험"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "순정 FCW: 충돌 위험"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "충돌 위험"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "차선이탈이 감지되었습니다"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "가속중에는 오픈파일럿 브레이크 작동불가"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "차량 매개 변수 식별 실패"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "조향제어가 일시적으로 비활성화 되었습니다"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "도로상황에 주의를 기울이세요"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "도로상황에 주의하세요"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "전방주시 필요"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "경고: 조향제어가 즉시 해제됩니다"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "운전자 전방주시 불안"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "핸들을 터치하세요: 모니터링 없음"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "핸들을 터치하세요"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "운전자 모니터링 없음"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "운전자 모니터링 없음"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "운전자 얼굴 확인 중"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "운전자 얼굴 인식이 어렵습니다"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "수동으로 재출발 하세요"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "잠시멈춤"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "재출발을 위해 RES버튼을 누르세요"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "차선 변경을 위해 핸들을 좌측으로 살짝 돌리세요"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "다른 차량에 주의하세요"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "차선 변경을 위해 핸들을 우측으로 살짝 돌리세요"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "측면 차량 접근 중"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "차선 변경 중"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr ""
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "브레이크 홀드 중"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "파킹브레이크 체결 됨"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "시작 중 페달 밟음"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "어댑티브 크루즈를 활성화하세요"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "카메라 포커스 조정중: 카메라 포커스 부정확"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "저장공간 부족"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "차량의 속도 낮음"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOS 업데이트 필요"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "업데이트를 위해 기다리세요"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "EON센서로부터 데이터를 받지 못했습니다"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "장치를 재시작 하세요"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "스피커를 찾을 수 없습니다"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "운전자 전방주시 매우 불안"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "시스템이 과열되었습니다"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "시스템이 과열되었습니다"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "기어가 드라이브모드가 아닙니다"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "캘리브레이션 진행 중"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "캘리브레이션 유효하지 않음: 장치 위치 조정 및 재 캘리브레이션"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "캘리브레이션 유효하지 않음: 장치 위치 조정 및 재 캘리브레이션"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "캘리브레이션 진행 중"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "도어가 열려있습니다"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "도어가 열려있습니다"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "안전벨트를 체결하세요"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "안전벨트를 체결하세요"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESP 꺼짐"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "배터리 부족"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "프로세스 간 통신 오류가 있습니다"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "레이더 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "레이더 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "주행 모델 지연"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "전방 영상 인식 불안"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr ""
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "메모리 부족: 장치를 재시작하세요"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "메모리 부족 심각"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "차량제어 불가"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr ""
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CAN 오류: CAN 신호를 확인하세요"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKAS 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKAS 오류: 시작을 위해 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "크루즈 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "크루즈 오류: 시작을 위해 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "가속페달 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "가속페달 오류: 차량을 재시작하세요"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "후진 기어"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "후진 기어"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "크루즈 꺼짐"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr ""
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "하네스 오작동"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "장치를 점검하세요"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "오픈파일럿 시작불가"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "선행차량이 없습니다"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "선행차량이 없습니다"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "선행차량이 없습니다"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "속도가 너무 높습니다"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "재 작동을 위해 차량의 속도를 낮추세요"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "시작을 위해 차량의 속도를 낮추세요"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "인터넷에 연결하세요"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "시작을 위해 업데이트를 확인해야 합니다"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "인터넷에 연결하세요"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr ""
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr ""
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr ""
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr ""
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr ""
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr ""
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr ""
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr ""
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr ""
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr ""

Binary file not shown.

View File

@@ -0,0 +1,542 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-15 13:37+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Rick Lan <ricklan@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: zh-CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: selfdrive/controls/lib/events.py:153
msgid "openpilot Unavailable"
msgstr "无法使用 openpilot"
#: selfdrive/controls/lib/events.py:160 selfdrive/controls/lib/events.py:167
msgid "TAKE CONTROL IMMEDIATELY"
msgstr "即刻接管控制"
#: selfdrive/controls/lib/events.py:187 selfdrive/controls/lib/events.py:328
#: selfdrive/controls/lib/events.py:354 selfdrive/controls/lib/events.py:418
#: selfdrive/controls/lib/events.py:470 selfdrive/controls/lib/events.py:522
#: selfdrive/controls/lib/events.py:532
msgid "TAKE CONTROL"
msgstr "接管控制"
#: selfdrive/controls/lib/events.py:188
#, fuzzy, python-format
msgid "Steer Unavailable Below %(speed)d %(unit)s"
msgstr "横向控制暂时失效,车速低于 %d %s"
#: selfdrive/controls/lib/events.py:196
#, fuzzy, python-format
msgid "Calibration in Progress: %d%%"
msgstr "正在校准中:%d%%"
#: selfdrive/controls/lib/events.py:197
#, fuzzy, python-format
msgid "Drive Above %(speed)d %(unit)s"
msgstr "车速请高于 %(speed)d %(unit)s"
#: selfdrive/controls/lib/events.py:204
msgid "Poor GPS reception"
msgstr "GPS 讯号不良"
#: selfdrive/controls/lib/events.py:205
msgid "If sky is visible, contact support"
msgstr "如果您不在地下室/隧道,请联系客服"
#: selfdrive/controls/lib/events.py:205
msgid "Check GPS antenna placement"
msgstr "请检查 GPS 天线位置"
#: selfdrive/controls/lib/events.py:210
msgid "Cruise Mode Disabled"
msgstr "巡航模式关闭"
#: selfdrive/controls/lib/events.py:212
msgid "Main Switch Off"
msgstr "主开关已关闭"
#: selfdrive/controls/lib/events.py:222
msgid "DEBUG ALERT"
msgstr "除错用警示讯息"
#: selfdrive/controls/lib/events.py:230
msgid "Be ready to take over at any time"
msgstr "请准备好随时接管"
#: selfdrive/controls/lib/events.py:231 selfdrive/controls/lib/events.py:239
#: selfdrive/controls/lib/events.py:247 selfdrive/controls/lib/events.py:255
msgid "Always keep hands on wheel and eyes on road"
msgstr "将手放在方向盘上并持续监视路况"
#: selfdrive/controls/lib/events.py:238
msgid "WARNING: This branch is not tested"
msgstr "注意:这个分支未经过测试"
#: selfdrive/controls/lib/events.py:246
msgid "Dashcam mode"
msgstr "行车记录模式"
#: selfdrive/controls/lib/events.py:254
msgid "Dashcam mode for unsupported car"
msgstr "行车记录模式 (尚未支援车种)"
#: selfdrive/controls/lib/events.py:262
msgid "Unsupported Giraffe Configuration"
msgstr "未支援的 Giraffe 设置"
#: selfdrive/controls/lib/events.py:263
msgid "Visit comma.ai/tg"
msgstr "请查阅 comma.ai/tg"
#: selfdrive/controls/lib/events.py:270
msgid "White Panda Is No Longer Supported"
msgstr "不再支持 White Panda"
#: selfdrive/controls/lib/events.py:271
msgid "Upgrade to comma two or black panda"
msgstr "请升级至 comma two 或是使用 black panda"
#: selfdrive/controls/lib/events.py:274
msgid "White panda is no longer supported"
msgstr "不再支持 White panda"
#: selfdrive/controls/lib/events.py:279
msgid "Stock LKAS is turned on"
msgstr "原厂 LKAS 已开启"
#: selfdrive/controls/lib/events.py:280
msgid "Turn off stock LKAS to engage"
msgstr "需关闭原厂 LKAS 才能启用"
#: selfdrive/controls/lib/events.py:288
msgid "Community Feature Detected"
msgstr "检测到社群开发功能"
#: selfdrive/controls/lib/events.py:289
msgid "Enable Community Features in Developer Settings"
msgstr "请至开发人员设定裡启用社群开发功能"
#: selfdrive/controls/lib/events.py:296
msgid "Dashcam Mode"
msgstr "行车记录模式"
#: selfdrive/controls/lib/events.py:297
msgid "Car Unrecognized"
msgstr "无法辨识车款"
#: selfdrive/controls/lib/events.py:304 selfdrive/controls/lib/events.py:312
#: selfdrive/controls/lib/events.py:320
msgid "BRAKE!"
msgstr "刹车!"
#: selfdrive/controls/lib/events.py:305
msgid "Stock AEB: Risk of Collision"
msgstr "有碰撞的风险"
#: selfdrive/controls/lib/events.py:313
msgid "Stock FCW: Risk of Collision"
msgstr "有碰撞的风险"
#: selfdrive/controls/lib/events.py:321
msgid "Risk of Collision"
msgstr "有碰撞的风险"
#: selfdrive/controls/lib/events.py:329
msgid "Lane Departure Detected"
msgstr "偏离车道"
#: selfdrive/controls/lib/events.py:338
msgid "openpilot will not brake while gas pressed"
msgstr "在您踩着油门的时候 openpilot 将不会刹车"
#: selfdrive/controls/lib/events.py:346
msgid "Vehicle Parameter Identification Failed"
msgstr "车子参数识别失败"
#: selfdrive/controls/lib/events.py:355 selfdrive/controls/lib/events.py:523
#: selfdrive/controls/lib/events.py:526
msgid "Steering Temporarily Unavailable"
msgstr "横向控制暂时失效"
#: selfdrive/controls/lib/events.py:362
msgid "KEEP EYES ON ROAD: Driver Distracted"
msgstr "注意路况:驾驶分心"
#: selfdrive/controls/lib/events.py:370
msgid "KEEP EYES ON ROAD"
msgstr "注意路况"
#: selfdrive/controls/lib/events.py:371
msgid "Driver Appears Distracted"
msgstr "驾驶分心"
#: selfdrive/controls/lib/events.py:378 selfdrive/controls/lib/events.py:402
msgid "DISENGAGE IMMEDIATELY"
msgstr "立即解除"
#: selfdrive/controls/lib/events.py:379
msgid "Driver Was Distracted"
msgstr "驾驶分心"
#: selfdrive/controls/lib/events.py:386
msgid "TOUCH STEERING WHEEL: No Face Detected"
msgstr "请触碰方向盘:未侦测到驾驶面容"
#: selfdrive/controls/lib/events.py:394
msgid "TOUCH STEERING WHEEL"
msgstr "请触碰方向盘"
#: selfdrive/controls/lib/events.py:395
msgid "Driver Is Unresponsive"
msgstr "驾驶没有反应"
#: selfdrive/controls/lib/events.py:403
msgid "Driver Was Unresponsive"
msgstr "驾驶没有反应"
#: selfdrive/controls/lib/events.py:410
msgid "CHECK DRIVER FACE VISIBILITY"
msgstr "请检查驾驶面部的可见度"
#: selfdrive/controls/lib/events.py:411
msgid "Driver Monitor Model Output Uncertain"
msgstr "驾驶监控模型判断不明确"
#: selfdrive/controls/lib/events.py:419
msgid "Resume Driving Manually"
msgstr "请自行恢復驾驶"
#: selfdrive/controls/lib/events.py:426
msgid "STOPPED"
msgstr "已停止"
#: selfdrive/controls/lib/events.py:427
msgid "Press Resume to Move"
msgstr "请按 RES 继续"
#: selfdrive/controls/lib/events.py:438
msgid "Steer Left to Start Lane Change"
msgstr "请往左打方向盘切换至左车道"
#: selfdrive/controls/lib/events.py:439 selfdrive/controls/lib/events.py:447
#: selfdrive/controls/lib/events.py:455 selfdrive/controls/lib/events.py:463
#: selfdrive/controls/lib/events.py:802 selfdrive/controls/lib/events.py:810
msgid "Monitor Other Vehicles"
msgstr "请注意其它车辆"
#: selfdrive/controls/lib/events.py:446
msgid "Steer Right to Start Lane Change"
msgstr "请往右打方向盘切换至右车道"
#: selfdrive/controls/lib/events.py:454
msgid "Car Detected in Blindspot"
msgstr "盲点侦测到车辆"
#: selfdrive/controls/lib/events.py:462
msgid "Changing Lane"
msgstr "切换车道中"
#: selfdrive/controls/lib/events.py:471
msgid "Turn Exceeds Steering Limit"
msgstr "弯道超过横向操控限制"
#: selfdrive/controls/lib/events.py:496
msgid "Brake Hold Active"
msgstr "驻车煞车已启用"
#: selfdrive/controls/lib/events.py:501
msgid "Park Brake Engaged"
msgstr "电子驻车已启动"
#: selfdrive/controls/lib/events.py:506
msgid "Pedal Pressed During Attempt"
msgstr "启用时侦测到驾驶踩踏油门/刹车"
#: selfdrive/controls/lib/events.py:517
msgid "Enable Adaptive Cruise"
msgstr "启用自适应巡航"
#: selfdrive/controls/lib/events.py:533
msgid "Attempting Refocus: Camera Focus Invalid"
msgstr "尝试对焦:相机已失焦"
#: selfdrive/controls/lib/events.py:539
msgid "Out of Storage Space"
msgstr "存储空间不足"
#: selfdrive/controls/lib/events.py:544
msgid "Speed Too Low"
msgstr "车速过慢"
#: selfdrive/controls/lib/events.py:549 selfdrive/controls/lib/events.py:553
msgid "NEOS Update Required"
msgstr "NEOS 需要更新"
#: selfdrive/controls/lib/events.py:550
msgid "Please Wait for Update"
msgstr "更新中请稍候"
#: selfdrive/controls/lib/events.py:558 selfdrive/controls/lib/events.py:562
msgid "No Data from Device Sensors"
msgstr "未收到装置传感器数据"
#: selfdrive/controls/lib/events.py:559 selfdrive/controls/lib/events.py:572
#: selfdrive/controls/lib/events.py:669
msgid "Reboot your Device"
msgstr "请重启装置"
#: selfdrive/controls/lib/events.py:571 selfdrive/controls/lib/events.py:575
msgid "Speaker not found"
msgstr "找不到音效装置"
#: selfdrive/controls/lib/events.py:579
msgid "Distraction Level Too High"
msgstr "驾驶分心太多次"
#: selfdrive/controls/lib/events.py:583
msgid "System Overheated"
msgstr "系统过热"
#: selfdrive/controls/lib/events.py:584
msgid "System overheated"
msgstr "系统过热"
#: selfdrive/controls/lib/events.py:588 selfdrive/controls/lib/events.py:589
msgid "Gear not D"
msgstr "不在 D 档位"
#: selfdrive/controls/lib/events.py:594
#, fuzzy
msgid "Calibration Invalid"
msgstr "正在校准中"
#: selfdrive/controls/lib/events.py:595
#, fuzzy
msgid "Reposition Device and Recalibrate"
msgstr "校准无效:请将装置放于新的位置并重新校准"
#: selfdrive/controls/lib/events.py:598 selfdrive/controls/lib/events.py:599
msgid "Calibration Invalid: Reposition Device & Recalibrate"
msgstr "校准无效:请将装置放于新的位置并重新校准"
#: selfdrive/controls/lib/events.py:603 selfdrive/controls/lib/events.py:605
msgid "Calibration in Progress"
msgstr "正在校准中"
#: selfdrive/controls/lib/events.py:609
msgid "Door Open"
msgstr "车门开启"
#: selfdrive/controls/lib/events.py:610
msgid "Door open"
msgstr "车门未关"
#: selfdrive/controls/lib/events.py:614
msgid "Seatbelt Unlatched"
msgstr "安全带未繫"
#: selfdrive/controls/lib/events.py:615
msgid "Seatbelt unlatched"
msgstr "安全带未繫"
#: selfdrive/controls/lib/events.py:619 selfdrive/controls/lib/events.py:620
msgid "ESP Off"
msgstr "ESP 关闭"
#: selfdrive/controls/lib/events.py:624 selfdrive/controls/lib/events.py:625
msgid "Low Battery"
msgstr "电量过低"
#: selfdrive/controls/lib/events.py:629 selfdrive/controls/lib/events.py:630
msgid "Communication Issue between Processes"
msgstr "行程间出现通讯问题"
#: selfdrive/controls/lib/events.py:635 selfdrive/controls/lib/events.py:636
msgid "Radar Communication Issue"
msgstr "雷达通讯出现问题"
#: selfdrive/controls/lib/events.py:641 selfdrive/controls/lib/events.py:642
#: selfdrive/controls/lib/events.py:646 selfdrive/controls/lib/events.py:647
msgid "Radar Error: Restart the Car"
msgstr "雷达讯号错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:651 selfdrive/controls/lib/events.py:652
msgid "Driving model lagging"
msgstr "操控模型有延迟"
#: selfdrive/controls/lib/events.py:656 selfdrive/controls/lib/events.py:657
msgid "Vision Model Output Uncertain"
msgstr "视觉模型判断不明确"
#: selfdrive/controls/lib/events.py:661 selfdrive/controls/lib/events.py:662
msgid "Device Fell Off Mount"
msgstr "装置掉落侦测"
#: selfdrive/controls/lib/events.py:666 selfdrive/controls/lib/events.py:672
msgid "Low Memory: Reboot Your Device"
msgstr "记忆体不足:请重启您的装置"
#: selfdrive/controls/lib/events.py:668
msgid "RAM Critically Low"
msgstr "记忆体严重不足"
#: selfdrive/controls/lib/events.py:677 selfdrive/controls/lib/events.py:678
msgid "Controls Failed"
msgstr "控制发生错误"
#: selfdrive/controls/lib/events.py:682
msgid "Controls Mismatch"
msgstr "控制不匹配"
#: selfdrive/controls/lib/events.py:686 selfdrive/controls/lib/events.py:688
#: selfdrive/controls/lib/events.py:692
msgid "CAN Error: Check Connections"
msgstr "CAN 讯号错误:请检查线路"
#: selfdrive/controls/lib/events.py:696 selfdrive/controls/lib/events.py:702
msgid "LKAS Fault: Restart the Car"
msgstr "LKAS 错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:698
msgid "LKAS Fault: Restart the car to engage"
msgstr "LKAS 错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:706 selfdrive/controls/lib/events.py:712
#: selfdrive/controls/lib/events.py:795
msgid "Cruise Fault: Restart the Car"
msgstr "巡航系统错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:708 selfdrive/controls/lib/events.py:791
msgid "Cruise Fault: Restart the car to engage"
msgstr "巡航系统错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:716
msgid "Gas Fault: Restart the Car"
msgstr "油门错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:717
msgid "Gas Error: Restart the Car"
msgstr "油门错误:请重新发动车辆"
#: selfdrive/controls/lib/events.py:722
#, fuzzy
msgid ""
"Reverse\n"
"Gear"
msgstr "切换至倒车档"
#: selfdrive/controls/lib/events.py:726
msgid "Reverse Gear"
msgstr "切换至倒车档"
#: selfdrive/controls/lib/events.py:731
msgid "Cruise Is Off"
msgstr "巡航系统关闭"
#: selfdrive/controls/lib/events.py:735 selfdrive/controls/lib/events.py:736
msgid "Planner Solution Error"
msgstr "Planner Solution 错误"
#: selfdrive/controls/lib/events.py:740 selfdrive/controls/lib/events.py:742
#: selfdrive/controls/lib/events.py:746
msgid "Harness Malfunction"
msgstr "Harness 故障"
#: selfdrive/controls/lib/events.py:743
msgid "Please Check Hardware"
msgstr "请检查硬体"
#: selfdrive/controls/lib/events.py:751 selfdrive/controls/lib/events.py:760
msgid "openpilot Canceled"
msgstr "openpilot 已取消"
#: selfdrive/controls/lib/events.py:752
msgid "No close lead car"
msgstr "前方没有车辆"
#: selfdrive/controls/lib/events.py:755
msgid "No Close Lead Car"
msgstr "前方没有车辆"
#: selfdrive/controls/lib/events.py:761
msgid "Speed too low"
msgstr "车速过慢"
#: selfdrive/controls/lib/events.py:768 selfdrive/controls/lib/events.py:773
msgid "Speed Too High"
msgstr "车速过快"
#: selfdrive/controls/lib/events.py:769
msgid "Slow down to resume operation"
msgstr "请减速后再启用"
#: selfdrive/controls/lib/events.py:774
msgid "Slow down to engage"
msgstr "请减速后再启用"
#: selfdrive/controls/lib/events.py:781
msgid "Please connect to Internet"
msgstr "请连接网路"
#: selfdrive/controls/lib/events.py:782
msgid "An Update Check Is Required to Engage"
msgstr "需检查更新后才能启用"
#: selfdrive/controls/lib/events.py:785
msgid "Please Connect to Internet"
msgstr "请连接网路"
#: selfdrive/controls/lib/events.py:801
msgid "Left ALC will start in 3s"
msgstr "准备自动切至左车道"
#: selfdrive/controls/lib/events.py:809
msgid "Right ALC will start in 3s"
msgstr "准备自动切至右车道"
#: selfdrive/controls/lib/events.py:817
msgid "STEERING REQUIRED: Lane Keeping OFF"
msgstr "请接管方向盘:车道维持关闭"
#: selfdrive/controls/lib/events.py:825
msgid "STEERING REQUIRED: Blinkers ON"
msgstr "请接管方向盘:方向灯开启"
#: selfdrive/controls/lib/events.py:833 selfdrive/controls/lib/events.py:838
msgid "Lead Car Is Moving"
msgstr "前方车辆车移动中"
#: selfdrive/controls/lib/events.py:847
msgid "WARNING"
msgstr "警告"
#: selfdrive/controls/lib/events.py:848
msgid "Grab wheel to start bypass"
msgstr "请握好方向盘以绕过时间限制"
#: selfdrive/controls/lib/events.py:855
msgid "BYPASSING"
msgstr "绕过时间限制中"
#: selfdrive/controls/lib/events.py:856
msgid "HOLD WHEEL"
msgstr "握好方向盘"
#: selfdrive/controls/lib/events.py:863
msgid "Bypassed!"
msgstr "时间限制已绕过"
#: selfdrive/controls/lib/events.py:864
msgid "Release wheel when ready"
msgstr "准备好后请松开放向盘"

Binary file not shown.

View File

@@ -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 "準備好後請鬆開放向盤"

View File

@@ -1,5 +1,9 @@
Import('env', 'envCython', 'common', 'cereal', 'messaging')
# dp - Add read dp_disable_relay value
if FindFile('dp_disable_relay', '/data/params/d') != None:
with open('/data/params/d/dp_disable_relay') as f:
if (int(f.read())) == 1:
env.Append(CCFLAGS='-DDisableRelay')
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'])

View File

@@ -62,6 +62,7 @@ bool time_valid(struct tm sys_time){
}
void safety_setter_thread() {
#ifndef DisableRelay
LOGD("Starting safety setter thread");
// diagnostic only is the default, needed for VIN query
panda->set_safety_model(cereal::CarParams::SafetyModel::ELM327);
@@ -86,7 +87,7 @@ void safety_setter_thread() {
// VIN query done, stop listening to OBDII
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
#endif
std::vector<char> params;
LOGW("waiting for params to set safety model");
while (1) {
@@ -109,7 +110,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);
@@ -297,12 +298,12 @@ void can_health_thread() {
if (spoofing_started) {
health.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 (health.safety_model == (uint8_t)(cereal::CarParams::SafetyModel::SILENT)) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
}
#endif
ignition = ((health.ignition_line != 0) || (health.ignition_can != 0));
if (ignition) {
@@ -316,11 +317,12 @@ void can_health_thread() {
if (health.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 && (health.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
@@ -483,6 +485,11 @@ void pigeon_thread() {
pigeon->init();
// dp
#ifdef DisableRelay
panda->set_safety_model(cereal::CarParams::SafetyModel::TOYOTA);
#endif
while (!do_exit && panda->connected) {
std::string recv = pigeon->receive();
if (recv.length() > 0) {
@@ -505,7 +512,9 @@ void pigeon_thread() {
int main() {
int err;
LOGW("starting boardd");
#ifdef DisableRelay
LOGW("boardd is in DisableRelay mode.");
#endif
// set process priority and affinity
err = set_realtime_priority(54);
LOG("set priority returns %d", err);

View File

@@ -1,5 +1,5 @@
import os
from common.params import Params
from common.params import Params, put_nonblocking
from common.basedir import BASEDIR
from selfdrive.version import comma_remote, tested_branch
from selfdrive.car.fingerprints import eliminate_incompatible_cars, all_known_cars
@@ -9,15 +9,16 @@ from selfdrive.swaglog import cloudlog
import cereal.messaging as messaging
from selfdrive.car import gen_empty_fingerprint
from common.dp_common import is_online
import threading
import selfdrive.crash as crash
from cereal import car
EventName = car.CarEvent.EventName
def get_startup_event(car_recognized, controller_available):
if comma_remote and tested_branch:
event = EventName.startup
else:
event = EventName.startupMaster
event = EventName.startup
if not car_recognized:
event = EventName.startupNoCar
@@ -82,14 +83,23 @@ def only_toyota_left(candidate_cars):
# **** for use live only ****
def fingerprint(logcan, sendcan):
params = Params()
car_selected = params.get('dp_car_selected', encoding='utf8')
car_detected = params.get('dp_car_detected', encoding='utf8')
cached_params = params.get("CarParamsCache")
if cached_params is None and car_selected == "" and car_detected != "":
params.put('dp_car_selected', car_detected)
params.put('dp_car_detected', "")
fixed_fingerprint = os.environ.get('FINGERPRINT', "")
if fixed_fingerprint == "" and cached_params is None and car_selected != "":
fixed_fingerprint = car_selected
skip_fw_query = os.environ.get('SKIP_FW_QUERY', False)
if not fixed_fingerprint and not skip_fw_query:
# Vin query only reliably works thorugh OBDII
bus = 1
cached_params = Params().get("CarParamsCache")
if cached_params is not None:
cached_params = car.CarParams.from_bytes(cached_params)
if cached_params.carName == "mock":
@@ -164,6 +174,7 @@ def fingerprint(logcan, sendcan):
source = car.CarParams.FingerprintSource.fixed
cloudlog.warning("fingerprinted %s", car_fingerprint)
put_nonblocking('dp_car_detected', car_fingerprint)
return car_fingerprint, finger, vin, car_fw, source
@@ -174,6 +185,10 @@ def get_car(logcan, sendcan):
cloudlog.warning("car doesn't match any fingerprints: %r", fingerprints)
candidate = "mock"
if is_online():
x = threading.Thread(target=log_fingerprinted, args=(candidate,))
x.start()
CarInterface, CarController, CarState = interfaces[candidate]
car_params = CarInterface.get_params(candidate, fingerprints, car_fw)
car_params.carVin = vin
@@ -181,3 +196,8 @@ def get_car(logcan, sendcan):
car_params.fingerprintSource = source
return CarInterface(car_params, CarController, CarState), car_params
def log_fingerprinted(candidate):
while True:
crash.capture_warning("fingerprinted %s" % candidate)
break

View File

@@ -3,6 +3,7 @@ from selfdrive.car.chrysler.chryslercan import create_lkas_hud, create_lkas_comm
create_wheel_buttons
from selfdrive.car.chrysler.values import CAR, SteerLimitParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
class CarController():
def __init__(self, dbc_name, CP, VM):
@@ -16,7 +17,11 @@ class CarController():
self.packer = CANPacker(dbc_name)
def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
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 = []

View File

@@ -111,7 +111,7 @@ class CarState(CarStateBase):
("DOORS", 1),
("TRACTION_BUTTON", 1),
]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
@staticmethod
@@ -127,5 +127,5 @@ class CarState(CarStateBase):
("LKAS_HEARTBIT", 10),
("LKAS_HUD", 4),
]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)

View File

@@ -3,7 +3,7 @@ from cereal import car
from selfdrive.car.chrysler.values import CAR
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
@staticmethod
@@ -18,6 +18,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
@@ -38,6 +39,9 @@ class CarInterface(CarInterfaceBase):
ret.steerRatio = 12.7
ret.steerActuatorDelay = 0.2 # in seconds
# dp
ret = common_interface_get_params_lqr(ret)
ret.centerToFront = ret.wheelbase * 0.44
ret.minSteerSpeed = 3.8 # m/s
@@ -57,13 +61,15 @@ class CarInterface(CarInterfaceBase):
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
# speeds
@@ -90,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

View File

@@ -2,7 +2,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
TOGGLE_DEBUG = False
@@ -18,13 +18,29 @@ class CarController():
self.steer_alert_last = False
self.lkas_action = 0
def update(self, enabled, CS, frame, actuators, visual_alert, pcm_cancel):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
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:

View File

@@ -8,6 +8,9 @@ from selfdrive.car.ford.values import DBC
WHEEL_RADIUS = 0.33
class CarState(CarStateBase):
def __init__(self, CP):
super().__init__(CP)
def update(self, cp):
ret = car.CarState.new_message()
ret.wheelSpeeds.rr = cp.vl["WheelSpeed_CG1"]['WhlRr_W_Meas'] * WHEEL_RADIUS

View File

@@ -5,7 +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):
@@ -19,6 +19,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "ford"
ret.safetyModel = car.CarParams.SafetyModel.ford
ret.dashcamOnly = True
ret.lateralTuning.init('pid')
ret.wheelbase = 2.85
ret.steerRatio = 14.8
@@ -32,6 +33,9 @@ class CarInterface(CarInterfaceBase):
ret.centerToFront = ret.wheelbase * 0.44
tire_stiffness_factor = 0.5328
# dp
ret = common_interface_get_params_lqr(ret)
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
@@ -49,12 +53,14 @@ class CarInterface(CarInterfaceBase):
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 +79,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

View File

@@ -6,6 +6,7 @@ from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.gm import gmcan
from selfdrive.car.gm.values import DBC, CanBus
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
@@ -51,8 +52,12 @@ class CarController():
self.packer_obj = CANPacker(DBC[CP.carFingerprint]['radar'])
self.packer_ch = CANPacker(DBC[CP.carFingerprint]['chassis'])
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
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
@@ -69,6 +74,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

View File

@@ -5,6 +5,7 @@ from selfdrive.car.gm.values import CAR, CruiseButtons, \
AccState
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
ButtonType = car.CarState.ButtonEvent.Type
EventName = car.CarEvent.EventName
@@ -21,6 +22,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "gm"
ret.safetyModel = car.CarParams.SafetyModel.gm
ret.enableCruise = False # stock cruise control is kept off
ret.lateralTuning.init('pid')
# GM port is a community feature
# TODO: make a port that uses a car harness and it only intercepts the camera
@@ -92,6 +94,9 @@ class CarInterface(CarInterfaceBase):
ret.steerRatioRear = 0.
ret.centerToFront = ret.wheelbase * 0.49
# dp
ret = common_interface_get_params_lqr(ret)
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
@@ -115,11 +120,13 @@ class CarInterface(CarInterfaceBase):
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 +195,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

View File

@@ -7,6 +7,7 @@ from selfdrive.car import create_gas_command
from selfdrive.car.honda import hondacan
from selfdrive.car.honda.values import CruiseButtons, CAR, VISUAL_HUD, HONDA_BOSCH
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
@@ -72,17 +73,17 @@ 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 CarControllerParams():
def __init__(self, CP):
self.BRAKE_MAX = 1024//4
self.STEER_MAX = CP.lateralParams.torqueBP[-1]
# mirror of list (assuming first item is zero) for interp of signed request values
assert(CP.lateralParams.torqueBP[0] == 0)
assert(CP.lateralParams.torqueBP[0] == 0)
self.STEER_LOOKUP_BP = [v * -1 for v in CP.lateralParams.torqueBP][1:][::-1] + list(CP.lateralParams.torqueBP)
self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV)
self.BRAKE_MAX = 1024//4
self.STEER_MAX = CP.lateralParams.torqueBP[-1]
# mirror of list (assuming first item is zero) for interp of signed request values
assert(CP.lateralParams.torqueBP[0] == 0)
assert(CP.lateralParams.torqueBP[0] == 0)
self.STEER_LOOKUP_BP = [v * -1 for v in CP.lateralParams.torqueBP][1:][::-1] + list(CP.lateralParams.torqueBP)
self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV)
class CarController():
def __init__(self, dbc_name, CP, VM):
@@ -96,9 +97,30 @@ class CarController():
self.params = CarControllerParams(CP)
# 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
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 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
@@ -114,7 +136,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
@@ -130,25 +152,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))
@@ -156,12 +190,27 @@ 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.ACCORD_15, CAR.ACCORDH):
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:
@@ -170,16 +219,17 @@ class CarController():
if CS.CP.carFingerprint in HONDA_BOSCH:
pass # TODO: implement
else:
apply_gas = clip(actuators.gas, 0., 1.)
apply_brake = int(clip(self.brake_last * P.BRAKE_MAX, 0, P.BRAKE_MAX - 1))
pump_on, self.last_pump_ts = brake_pump_hysteresis(apply_brake, self.apply_brake_last, self.last_pump_ts, ts)
can_sends.append(hondacan.create_brake_command(self.packer, apply_brake, pump_on,
pcm_override, pcm_cancel_cmd, hud.fcw, idx, CS.CP.carFingerprint, CS.stock_brake))
self.apply_brake_last = apply_brake
if not dragonconf.dpAtl:
apply_gas = clip(actuators.gas, 0., 1.)
apply_brake = int(clip(self.brake_last * P.BRAKE_MAX, 0, P.BRAKE_MAX - 1))
pump_on, self.last_pump_ts = brake_pump_hysteresis(apply_brake, self.apply_brake_last, self.last_pump_ts, ts)
can_sends.append(hondacan.create_brake_command(self.packer, apply_brake, pump_on,
pcm_override, pcm_cancel_cmd, hud.fcw, idx, CS.CP.carFingerprint, CS.stock_brake))
self.apply_brake_last = apply_brake
if CS.CP.enableGasInterceptor:
# send exactly zero if apply_gas is zero. Interceptor will send the max between read value and apply_gas.
# This prevents unexpected pedal range rescaling
can_sends.append(create_gas_command(self.packer, apply_gas, idx))
if CS.CP.enableGasInterceptor:
# send exactly zero if apply_gas is zero. Interceptor will send the max between read value and apply_gas.
# This prevents unexpected pedal range rescaling
can_sends.append(create_gas_command(self.packer, apply_gas, idx))
return can_sends

View File

@@ -22,41 +22,42 @@ def calc_cruise_offset(offset, speed):
def get_can_signals(CP):
# this function generates lists for signal, messages and initial values
signals = [
("XMISSION_SPEED", "ENGINE_DATA", 0),
("WHEEL_SPEED_FL", "WHEEL_SPEEDS", 0),
("WHEEL_SPEED_FR", "WHEEL_SPEEDS", 0),
("WHEEL_SPEED_RL", "WHEEL_SPEEDS", 0),
("WHEEL_SPEED_RR", "WHEEL_SPEEDS", 0),
("STEER_ANGLE", "STEERING_SENSORS", 0),
("STEER_ANGLE_RATE", "STEERING_SENSORS", 0),
("MOTOR_TORQUE", "STEER_MOTOR_TORQUE", 0),
("STEER_TORQUE_SENSOR", "STEER_STATUS", 0),
("LEFT_BLINKER", "SCM_FEEDBACK", 0),
("RIGHT_BLINKER", "SCM_FEEDBACK", 0),
("GEAR", "GEARBOX", 0),
("SEATBELT_DRIVER_LAMP", "SEATBELT_STATUS", 1),
("SEATBELT_DRIVER_LATCHED", "SEATBELT_STATUS", 0),
("BRAKE_PRESSED", "POWERTRAIN_DATA", 0),
("BRAKE_SWITCH", "POWERTRAIN_DATA", 0),
("CRUISE_BUTTONS", "SCM_BUTTONS", 0),
("ESP_DISABLED", "VSA_STATUS", 1),
("USER_BRAKE", "VSA_STATUS", 0),
("BRAKE_HOLD_ACTIVE", "VSA_STATUS", 0),
("STEER_STATUS", "STEER_STATUS", 5),
("GEAR_SHIFTER", "GEARBOX", 0),
("PEDAL_GAS", "POWERTRAIN_DATA", 0),
("CRUISE_SETTING", "SCM_BUTTONS", 0),
("ACC_STATUS", "POWERTRAIN_DATA", 0),
("XMISSION_SPEED", "ENGINE_DATA", 0),
("WHEEL_SPEED_FL", "WHEEL_SPEEDS", 0),
("WHEEL_SPEED_FR", "WHEEL_SPEEDS", 0),
("WHEEL_SPEED_RL", "WHEEL_SPEEDS", 0),
("WHEEL_SPEED_RR", "WHEEL_SPEEDS", 0),
("STEER_ANGLE", "STEERING_SENSORS", 0),
("STEER_ANGLE_RATE", "STEERING_SENSORS", 0),
("MOTOR_TORQUE", "STEER_MOTOR_TORQUE", 0),
("STEER_TORQUE_SENSOR", "STEER_STATUS", 0),
("LEFT_BLINKER", "SCM_FEEDBACK", 0),
("RIGHT_BLINKER", "SCM_FEEDBACK", 0),
("GEAR", "GEARBOX", 0),
("SEATBELT_DRIVER_LAMP", "SEATBELT_STATUS", 1),
("SEATBELT_DRIVER_LATCHED", "SEATBELT_STATUS", 0),
("BRAKE_PRESSED", "POWERTRAIN_DATA", 0),
("BRAKE_SWITCH", "POWERTRAIN_DATA", 0),
("CRUISE_BUTTONS", "SCM_BUTTONS", 0),
("ESP_DISABLED", "VSA_STATUS", 1),
("USER_BRAKE", "VSA_STATUS", 0),
("BRAKE_HOLD_ACTIVE", "VSA_STATUS", 0),
("HUD_LEAD", "ACC_HUD", 0),
("STEER_STATUS", "STEER_STATUS", 5),
("GEAR_SHIFTER", "GEARBOX", 0),
("PEDAL_GAS", "POWERTRAIN_DATA", 0),
("CRUISE_SETTING", "SCM_BUTTONS", 0),
("ACC_STATUS", "POWERTRAIN_DATA", 0),
]
checks = [
("ENGINE_DATA", 100),
("WHEEL_SPEEDS", 50),
("STEERING_SENSORS", 100),
("SEATBELT_STATUS", 10),
("CRUISE", 10),
("POWERTRAIN_DATA", 100),
("VSA_STATUS", 50),
("ENGINE_DATA", 100),
("WHEEL_SPEEDS", 50),
("STEERING_SENSORS", 100),
("SEATBELT_STATUS", 10),
("CRUISE", 10),
("POWERTRAIN_DATA", 100),
("VSA_STATUS", 50),
]
if CP.carFingerprint == CAR.ODYSSEY_CHN:
@@ -106,11 +107,16 @@ def get_can_signals(CP):
checks += [("CRUISE_PARAMS", 10)]
else:
checks += [("CRUISE_PARAMS", 50)]
if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORD_15, 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.ACCORD_15, CAR.ACCORDH, CAR.INSIGHT):
signals += [("DRIVERS_DOOR_OPEN", "SCM_FEEDBACK", 1),
("LEAD_DISTANCE", "RADAR_HUD", 0)]
checks += [("RADAR_HUD", 50)]
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)]
checks += [("RADAR_HUD", 50)]
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:
@@ -135,7 +141,7 @@ def get_can_signals(CP):
signals += [("CAR_GAS", "GAS_PEDAL_2", 0),
("MAIN_ON", "SCM_BUTTONS", 0),
("BRAKE_HOLD_ACTIVE", "VSA_STATUS", 0)]
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)]
@@ -175,6 +181,10 @@ class CarState(CarStateBase):
self.v_cruise_pcm_prev = 0
self.cruise_mode = 0
#dp
self.lkMode = True
self.lead_distance = 0.
def update(self, cp, cp_cam, cp_body):
ret = car.CarState.new_message()
@@ -188,13 +198,17 @@ class CarState(CarStateBase):
# ******************* parse out can *******************
# TODO: find wheels moving bit in dbc
if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORD_15, 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.ACCORD_15, 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']
@@ -230,6 +244,14 @@ class CarState(CarStateBase):
ret.steeringAngle = cp.vl["STEERING_SENSORS"]['STEER_ANGLE']
ret.steeringRate = 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']
@@ -253,7 +275,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.JADE, CAR.ODYSSEY, CAR.ACURA_RDX, CAR.RIDGELINE, CAR.PILOT_2019, CAR.ODYSSEY_CHN):
ret.gas = self.pedal_gas / 256.
else:
ret.gas = cp.vl["GAS_PEDAL_2"]['CAR_GAS'] / 256.
@@ -304,6 +326,9 @@ 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:
@@ -337,6 +362,7 @@ class CarState(CarStateBase):
def get_can_parser(CP):
signals, checks = get_can_signals(CP)
bus_pt = 1 if CP.carFingerprint in HONDA_BOSCH else 0
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, bus_pt)
@staticmethod
@@ -360,7 +386,7 @@ class CarState(CarStateBase):
checks = [(0xe4, 100)]
if CP.carFingerprint in [CAR.CRV, CAR.CRV_EU, CAR.ACURA_RDX, CAR.ODYSSEY_CHN]:
checks = [(0x194, 100)]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)
@staticmethod

View File

@@ -10,6 +10,8 @@ from selfdrive.car.honda.values import CruiseButtons, CAR, HONDA_BOSCH
from selfdrive.car import STD_CARGO_KG, CivicParams, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.controls.lib.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)
@@ -122,6 +124,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
@@ -305,6 +308,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]
elif candidate == CAR.ACURA_RDX:
stop_and_go = False
ret.mass = 3935. * CV.LB_TO_KG + STD_CARGO_KG
@@ -407,6 +424,26 @@ class CarInterface(CarInterfaceBase):
else:
raise ValueError("unsupported car %s" % candidate)
# dp
if Params().get('dp_honda_eps_mod') == b'1':
if candidate == CAR.CIVIC:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2566, 8000], [0, 2566, 3840]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.32], [0.1]] #2.5x tuned by @CFranHonda
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.32], [0.1]] #2.5 default mod #TMG put your values here
elif candidate in (CAR.ACCORD, CAR.ACCORD_15, 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)
# 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
@@ -436,7 +473,7 @@ class CarInterface(CarInterfaceBase):
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)
@@ -444,7 +481,9 @@ 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.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.steeringAngle * CV.DEG_TO_RAD, ret.vEgo)
# FIXME: read sendcan for brakelights
@@ -452,6 +491,9 @@ class CarInterface(CarInterfaceBase):
ret.brakeLights = bool(self.CS.brake_switch or
c.actuators.brake > brakelights_threshold)
# dp
ret.lkMode = self.CS.lkMode
buttonEvents = []
if self.CS.cruise_buttons != self.CS.prev_cruise_buttons:
@@ -490,6 +532,8 @@ class CarInterface(CarInterfaceBase):
# events
events = self.create_common_events(ret, pcm_enable=False)
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:
@@ -506,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)
@@ -563,6 +607,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)

View File

@@ -37,6 +37,7 @@ class CAR:
CRV_HYBRID = "HONDA CR-V 2019 HYBRID"
FIT = "HONDA FIT 2018 EX"
HRV = "HONDA HRV 2019 TOURING"
JADE = "HONDA JADE 2017"
ODYSSEY = "HONDA ODYSSEY 2018 EX-L"
ODYSSEY_CHN = "HONDA ODYSSEY 2019 EXCLUSIVE CHN"
ACURA_RDX = "ACURA RDX 2018 ACURAWATCH PLUS"
@@ -54,10 +55,10 @@ FINGERPRINTS = {
148: 8, 228: 5, 304: 8, 330: 8, 344: 8, 380: 8, 399: 7, 419: 8, 420: 8, 427: 3, 432: 7, 441: 5, 446: 3, 450: 8, 464: 8, 477: 8, 479: 8, 495: 8, 545: 6, 662: 4, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 829: 5, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 1302: 8, 1600: 5, 1601: 8, 1652: 8
}],
CAR.ACCORD_15: [{
148: 8, 228: 5, 304: 8, 330: 8, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 427: 3, 432: 7, 441: 5, 446: 3, 450: 8, 464: 8, 477: 8, 479: 8, 495: 8, 545: 6, 662: 4, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 829: 5, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 1302: 8, 1600: 5, 1601: 8, 1652: 8
148: 8, 228: 5, 229: 8, 304: 8, 330: 8, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 427: 3, 432: 7, 441: 5, 446: 3, 450: 8, 464: 8, 477: 8, 479: 8, 495: 8, 513: 8, 545: 6, 576: 8, 577: 8, 579: 8, 580: 8, 582: 8, 583: 8, 585: 8, 586: 8, 640: 8, 641: 8, 642: 8, 643: 8, 644: 8, 645: 8, 646: 8, 647: 8, 648: 8, 649: 8, 650: 8, 651: 8, 652: 8, 653: 8, 654: 8, 655: 8, 656: 8, 657: 8, 658: 8, 659: 8, 660: 8, 661: 8, 662: 4, 663: 8, 712: 8, 713: 8, 714: 8, 715: 8, 716: 8, 717: 8, 718: 8, 719: 8, 720: 8, 721: 8, 722: 8, 723: 8, 724: 8, 725: 8, 726: 8, 727: 8, 728: 8, 729: 8, 730: 8, 731: 8, 732: 8, 733: 8, 734: 8, 735: 8, 736: 8, 737: 8, 738: 8, 739: 8, 740: 8, 741: 8, 742: 8, 743: 8, 744: 8, 745: 8, 746: 8, 747: 8, 748: 8, 749: 8, 750: 8, 751: 8, 752: 8, 753: 8, 754: 8, 755: 8, 756: 8, 757: 8, 758: 8, 759: 8, 760: 8, 761: 8, 762: 8, 763: 8, 764: 8, 765: 8, 766: 8, 767: 8, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 829: 5, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 1024: 4, 1040: 6, 1056: 8, 1088: 3, 1104: 8, 1302: 8, 1416: 5, 1600: 5, 1601: 8, 1641: 8, 1652: 8, 1872: 8
}],
CAR.ACCORDH: [{
148: 8, 228: 5, 304: 8, 330: 8, 344: 8, 380: 8, 387: 8, 388: 8, 399: 7, 419: 8, 420: 8, 427: 3, 432: 7, 441: 5, 450: 8, 464: 8, 477: 8, 479: 8, 495: 8, 525: 8, 545: 6, 662: 4, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 829: 5, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 1302: 8, 1600: 5, 1601: 8, 1652: 8
148: 8, 228: 5, 304: 8, 330: 8, 344: 8, 380: 8, 387: 8, 388: 8, 399: 7, 408: 6, 419: 8, 420: 8, 427: 3, 432: 7, 441: 5, 450: 8, 464: 8, 475: 8, 477: 8, 479: 8, 481: 8, 495: 8, 525: 8, 545: 6, 662: 4, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 829: 5, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 1302: 8, 1416: 5, 1600: 5, 1601: 8, 1652: 8
}],
CAR.ACURA_ILX: [{
57: 3, 145: 8, 228: 5, 304: 8, 316: 8, 342: 6, 344: 8, 380: 8, 398: 3, 399: 7, 419: 8, 420: 8, 422: 8, 428: 8, 432: 7, 464: 8, 476: 4, 490: 8, 506: 8, 512: 6, 513: 6, 542: 7, 545: 4, 597: 8, 660: 8, 773: 7, 777: 8, 780: 8, 800: 8, 804: 8, 808: 8, 819: 7, 821: 5, 829: 5, 882: 2, 884: 7, 887: 8, 888: 8, 892: 8, 923: 2, 929: 4, 983: 8, 985: 3, 1024: 5, 1027: 5, 1029: 8, 1030: 5, 1034: 5, 1036: 8, 1039: 8, 1057: 5, 1064: 7, 1108: 8, 1365: 5,
@@ -87,8 +88,12 @@ FINGERPRINTS = {
CAR.CRV: [{
57: 3, 145: 8, 316: 8, 340: 8, 342: 6, 344: 8, 380: 8, 398: 3, 399: 6, 401: 8, 404: 4, 420: 8, 422: 8, 426: 8, 432: 7, 464: 8, 474: 5, 476: 4, 487: 4, 490: 8, 493: 3, 506: 8, 507: 1, 512: 6, 513: 6, 542: 7, 545: 4, 597: 8, 660: 8, 661: 4, 773: 7, 777: 8, 780: 8, 800: 8, 804: 8, 808: 8, 829: 5, 882: 2, 884: 7, 888: 8, 891: 8, 892: 8, 923: 2, 929: 8, 983: 8, 985: 3, 1024: 5, 1027: 5, 1029: 8, 1033: 5, 1036: 8, 1039: 8, 1057: 5, 1064: 7, 1108: 8, 1125: 8, 1296: 8, 1365: 5, 1424: 5, 1600: 5, 1601: 8,
}],
CAR.CRV_5G: [{
57: 3, 148: 8, 199: 4, 228: 5, 231: 5, 232: 7, 304: 8, 330: 8, 340: 8, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 423: 2, 427: 3, 428: 8, 432: 7, 441: 5, 446: 3, 450: 8, 464: 8, 467: 2, 469: 3, 470: 2, 474: 8, 476: 7, 477: 8, 479: 8, 490: 8, 493: 5, 495: 8, 507: 1, 545: 6, 597: 8, 661: 4, 662: 4, 773: 7, 777: 8, 780: 8, 795: 8, 800: 8, 804: 8, 806: 8, 808: 8, 814: 4, 815: 8, 817: 4, 825: 4, 829: 5, 862: 8, 881: 8, 882: 4, 884: 8, 888: 8, 891: 8, 927: 8, 918: 7, 929: 8, 983: 8, 985: 3, 1024: 5, 1027: 5, 1029: 8, 1036: 8, 1039: 8, 1064: 7, 1108: 8, 1092: 1, 1115: 2, 1125: 8, 1127: 2, 1296: 8, 1302: 8, 1322: 5, 1361: 5, 1365: 5, 1424: 5, 1600: 5, 1601: 8, 1618: 5, 1633: 8, 1670: 5
CAR.CRV_5G: [
{
57: 3, 148: 8, 199: 4, 228: 5, 231: 5, 232: 7, 304: 8, 330: 8, 340: 8, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 423: 2, 427: 3, 428: 8, 432: 7, 441: 5, 446: 3, 450: 8, 464: 8, 467: 2, 469: 3, 470: 2, 474: 8, 476: 7, 477: 8, 479: 8, 490: 8, 493: 5, 495: 8, 507: 1, 545: 6, 597: 8, 661: 4, 662: 4, 773: 7, 777: 8, 780: 8, 795: 8, 800: 8, 804: 8, 806: 8, 808: 8, 814: 4, 815: 8, 817: 4, 825: 4, 829: 5, 862: 8, 881: 8, 882: 4, 884: 8, 888: 8, 891: 8, 927: 8, 918: 7, 929: 8, 983: 8, 985: 3, 1024: 5, 1027: 5, 1029: 8, 1036: 8, 1039: 8, 1040: 6, 1056: 8, 1064: 7, 1088: 3, 1108: 8, 1092: 1, 1115: 2, 1125: 8, 1127: 2, 1296: 8, 1302: 8, 1322: 5, 1361: 5, 1365: 5, 1424: 5, 1600: 5, 1601: 8, 1618: 5, 1626: 5, 1627: 5, 1633: 8, 1670: 5
},
{
57: 3, 148: 8, 199: 4, 228: 5, 231: 5, 232: 7, 304: 8, 330: 8, 340: 8, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 423: 2, 427: 3, 428: 8, 432: 7, 441: 5, 446: 3, 450: 8, 464: 8, 467: 2, 469: 3, 470: 2, 474: 8, 476: 7, 477: 8, 479: 8, 490: 8, 493: 5, 495: 8, 507: 1, 545: 6, 597: 8, 661: 4, 662: 4, 773: 7, 777: 8, 780: 8, 795: 8, 800: 8, 804: 8, 806: 8, 808: 8, 814: 4, 815: 8, 817: 4, 825: 4, 829: 5, 862: 8, 881: 8, 882: 4, 884: 8, 888: 8, 891: 8, 927: 8, 918: 7, 929: 8, 983: 8, 985: 3, 1024: 4, 1027: 5, 1029: 8, 1036: 8, 1039: 8, 1040: 6, 1056: 8, 1064: 7, 1088: 3, 1108: 8, 1092: 1, 1115: 2, 1125: 8, 1127: 2, 1296: 8, 1302: 8, 1322: 5, 1361: 5, 1365: 5, 1424: 5, 1600: 5, 1601: 8, 1618: 5, 1626: 5, 1627: 5, 1633: 8, 1670: 5
}],
# 1057: 5 1024: 5 are also on the OBD2 bus. their lengths differ from the camera's f-can bus. re-fingerprint after obd2 connection is split in panda firmware from bus 1.
CAR.CRV_EU: [{
@@ -96,6 +101,10 @@ FINGERPRINTS = {
}],
CAR.CRV_HYBRID: [{
57: 3, 148: 8, 228: 5, 304: 8, 330: 8, 344: 8, 380: 8, 387: 8, 388: 8, 399: 7, 408: 6, 415: 6, 419: 8, 420: 8, 427: 3, 428: 8, 432: 7, 441: 5, 450: 8, 464: 8, 477: 8, 479: 8, 490: 8, 495: 8, 525: 8, 531: 8, 545: 6, 662: 4, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 814: 4, 829: 5, 833: 6, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 930: 8, 931: 8, 1302: 8, 1361: 5, 1365: 5, 1600: 5, 1601: 8, 1626: 5, 1627: 5
},
{
# honda breeze hybrid
57: 3, 148: 8, 228: 5, 229: 8, 304: 8, 330: 8, 344: 8, 380: 8, 387: 8, 388: 8, 399: 7, 419: 8, 420: 8, 427: 3, 432: 7, 441: 5, 450: 8, 464: 8, 477: 8, 479: 8, 490: 8, 495: 8, 513: 8, 525: 8, 531: 8, 545: 6, 560: 8, 576: 8, 577: 8, 579: 8, 580: 8, 582: 8, 583: 8, 585: 8, 586: 8, 640: 8, 641: 8, 642: 8, 643: 8, 644: 8, 645: 8, 646: 8, 647: 8, 648: 8, 649: 8, 650: 8, 651: 8, 652: 8, 653: 8, 654: 8, 655: 8, 656: 8, 657: 8, 658: 8, 659: 8, 660: 8, 661: 8, 662: 4, 663: 8, 712: 8, 713: 8, 714: 8, 715: 8, 716: 8, 717: 8, 718: 8, 719: 8, 720: 8, 721: 8, 722: 8, 723: 8, 724: 8, 725: 8, 726: 8, 727: 8, 728: 8, 729: 8, 730: 8, 731: 8, 732: 8, 733: 8, 734: 8, 735: 8, 736: 8, 737: 8, 738: 8, 739: 8, 740: 8, 741: 8, 742: 8, 743: 8, 744: 8, 745: 8, 746: 8, 747: 8, 748: 8, 749: 8, 750: 8, 751: 8, 752: 8, 753: 8, 754: 8, 755: 8, 756: 8, 757: 8, 758: 8, 759: 8, 760: 8, 761: 8, 762: 8, 763: 8, 764: 8, 765: 8, 766: 8, 767: 8, 773: 7, 777: 8, 780: 8, 804: 8, 806: 8, 808: 8, 814: 4, 829: 5, 833: 6, 862: 8, 884: 8, 891: 8, 927: 8, 929: 8, 985: 3, 1024: 4, 1040: 6, 1056: 8, 1302: 8, 1361: 5, 1365: 5, 1600: 5, 1601: 8, 1641: 8, 1872: 8
}],
CAR.FIT: [{
57: 3, 145: 8, 228: 5, 304: 8, 342: 6, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 422: 8, 427: 3, 428: 8, 432: 7, 464: 8, 487: 4, 490: 8, 506: 8, 597: 8, 660: 8, 661: 4, 773: 7, 777: 8, 780: 8, 800: 8, 804: 8, 808: 8, 829: 5, 862: 8, 884: 7, 892: 8, 929: 8, 985: 3, 1024: 5, 1027: 5, 1029: 8, 1036: 8, 1039: 8, 1108: 8, 1322: 5, 1361: 5, 1365: 5, 1424: 5, 1600: 5, 1601: 8
@@ -103,6 +112,9 @@ FINGERPRINTS = {
CAR.HRV: [{
57: 3, 145: 8, 228: 5, 316: 8, 340: 8, 342: 6, 344: 8, 380: 8, 399: 7, 401: 8, 420: 8, 422: 8, 423: 2, 426: 8, 427: 3, 432: 7, 441: 5, 450: 8, 464: 8, 474: 8, 490: 8, 493: 3, 506: 8, 538: 5, 578: 2, 597: 8, 660: 8, 661: 4, 773: 7, 777: 8, 780: 8, 804: 8, 808: 8, 829: 5, 862: 8, 882: 2, 884: 7, 892: 8, 929: 8, 985: 3, 1030: 5, 1033: 5, 1108: 8, 1137: 8, 1348: 5, 1361: 5, 1365: 5, 1600: 5, 1601: 8, 1618: 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
}],
# 2018 Odyssey w/ Added Comma Pedal Support (512L & 513L)
CAR.ODYSSEY: [{
57: 3, 148: 8, 228: 5, 229: 4, 316: 8, 342: 6, 344: 8, 380: 8, 399: 7, 411: 5, 419: 8, 420: 8, 427: 3, 432: 7, 450: 8, 463: 8, 464: 8, 476: 4, 490: 8, 506: 8, 512: 6, 513: 6, 542: 7, 545: 6, 597: 8, 662: 4, 773: 7, 777: 8, 780: 8, 795: 8, 800: 8, 804: 8, 806: 8, 808: 8, 817: 4, 819: 7, 821: 5, 825: 4, 829: 5, 837: 5, 856: 7, 862: 8, 871: 8, 881: 8, 882: 4, 884: 8, 891: 8, 892: 8, 905: 8, 923: 2, 927: 8, 929: 8, 963: 8, 965: 8, 966: 8, 967: 8, 983: 8, 985: 3, 1029: 8, 1036: 8, 1052: 8, 1064: 7, 1088: 8, 1089: 8, 1092: 1, 1108: 8, 1110: 8, 1125: 8, 1296: 8, 1302: 8, 1600: 5, 1601: 8, 1612: 5, 1613: 5, 1614: 5, 1615: 8, 1616: 5, 1619: 5, 1623: 5, 1668: 5
@@ -113,6 +125,10 @@ FINGERPRINTS = {
}],
CAR.ODYSSEY_CHN: [{
57: 3, 145: 8, 316: 8, 342: 6, 344: 8, 380: 8, 398: 3, 399: 7, 401: 8, 404: 4, 411: 5, 420: 8, 422: 8, 423: 2, 426: 8, 432: 7, 450: 8, 464: 8, 490: 8, 506: 8, 507: 1, 512: 6, 513: 6, 597: 8, 610: 8, 611: 8, 612: 8, 617: 8, 660: 8, 661: 4, 773: 7, 780: 8, 804: 8, 808: 8, 829: 5, 862: 8, 884: 7, 892: 8, 923: 2, 929: 8, 1030: 5, 1137: 8, 1302: 8, 1348: 5, 1361: 5, 1365: 5, 1600: 5, 1601: 8, 1639: 8
},
# Odyssey from Shell
{
57: 3, 145: 8, 316: 8, 342: 6, 344: 8, 380: 8, 398: 3, 399: 7, 401: 8, 408: 6, 411: 5, 415: 6, 420: 8, 422: 8, 423: 2, 426: 8, 432: 7, 450: 8, 464: 8, 490: 8, 507: 1, 597: 8, 610: 8, 611: 8, 612: 8, 617: 8, 660: 8, 661: 4, 773: 7, 804: 8, 808: 8, 884: 7, 892: 8, 923: 2, 929: 8, 1030: 5, 1137: 8, 1302: 8, 1348: 5, 1361: 5, 1365: 5, 1639: 8
}],
# 2017 Pilot Touring AND 2016 Pilot EX-L w/ Added Comma Pedal Support (512L & 513L)
CAR.PILOT: [{
@@ -433,6 +449,7 @@ FW_VERSIONS = {
b'37805-5AN-AJ30\x00\x00',
b'37805-5AN-AK20\x00\x00',
b'37805-5AN-AR20\x00\x00',
b'37805-5AN-E410\x00\x00', # AlexNoop's Manual CIVIC_BOSCH
b'37805-5AN-L940\x00\x00',
b'37805-5AN-LF20\x00\x00',
b'37805-5AN-LH20\x00\x00',
@@ -471,6 +488,7 @@ FW_VERSIONS = {
b'57114-TGG-C320\x00\x00',
b'57114-TGG-L320\x00\x00',
b'57114-TGG-L330\x00\x00',
b'57114-TGL-G130\x00\x00', # AlexNoop's Manual CIVIC_BOSCH
b'57114-TGL-G330\x00\x00',
],
@@ -480,6 +498,7 @@ FW_VERSIONS = {
b'39990-TEZ-T020\x00\x00',
b'39990-TGG-A020\x00\x00',
b'39990-TGG-A120\x00\x00',
b'39990-TGN-E120\x00\x00', # AlexNoop's Manual CIVIC_BOSCH
b'39990-TGL-E130\x00\x00',
],
(Ecu.srs, 0x18da53f1, None): [
@@ -488,6 +507,7 @@ FW_VERSIONS = {
b'77959-TGG-A020\x00\x00',
b'77959-TGG-A030\x00\x00',
b'77959-TGG-G010\x00\x00',
b'77959-TGG-A020\x00\x00',
],
(Ecu.combinationMeter, 0x18da60f1, None): [
b'78109-TBA-A110\x00\x00',
@@ -505,10 +525,12 @@ FW_VERSIONS = {
b'78109-TGG-A620\x00\x00',
b'78109-TGG-A810\x00\x00',
b'78109-TGG-A820\x00\x00',
b'78109-TGG-BA10\x00\x00', # AlexNoop's Manual CIVIC_BOSCH
b'78109-TGL-G120\x00\x00',
],
(Ecu.fwdRadar, 0x18dab0f1, None): [
b'36802-TBA-A150\x00\x00',
b'36802-TGG-G040\x00\x00', # AlexNoop's Manual CIVIC_BOSCH
b'36802-TFJ-G060\x00\x00',
b'36802-TGG-A050\x00\x00',
b'36802-TGG-A060\x00\x00',
@@ -523,6 +545,7 @@ FW_VERSIONS = {
b'36161-TGG-A080\x00\x00',
b'36161-TGG-A120\x00\x00',
b'36161-TGL-G050\x00\x00',
b'36161-TGG-G070\x00\x00', # AlexNoop's Manual CIVIC_BOSCH
],
(Ecu.gateway, 0x18daeff1, None): [
b'38897-TBA-A110\x00\x00',
@@ -723,6 +746,7 @@ FW_VERSIONS = {
(Ecu.gateway, 0x18daeff1, None): [
b'38897-THR-A010\x00\x00',
b'38897-THR-A020\x00\x00',
b'38897-TKN-H030\x00\x00',
],
(Ecu.programmedFuelInjection, 0x18da10f1, None): [
b'37805-5MR-A250\x00\x00',
@@ -734,6 +758,7 @@ FW_VERSIONS = {
(Ecu.eps, 0x18da30f1, None): [
b'39990-THR-A020\x00\x00',
b'39990-THR-A030\x00\x00',
b'77959-T6A-H140\x00\x00',
],
(Ecu.srs, 0x18da53f1, None): [
b'77959-THR-A010\x00\x00',
@@ -780,6 +805,7 @@ FW_VERSIONS = {
b'78109-THR-AN10\x00\x00',
b'78109-THR-C330\x00\x00',
b'78109-THR-CE20\x00\x00',
b'78109-TKN-H110\x00\x00'
],
(Ecu.shiftByWire, 0x18da0bf1, None): [
b'54008-THR-A020\x00\x00',
@@ -980,6 +1006,7 @@ DBC = {
CAR.CRV_HYBRID: dbc_dict('honda_crv_hybrid_2019_can_generated', None),
CAR.FIT: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
CAR.HRV: dbc_dict('honda_hrv_touring_2019_can_generated', 'acura_ilx_2016_nidec'),
CAR.JADE: dbc_dict('honda_hrv_touring_2019_can_generated', 'acura_ilx_2016_nidec'),
CAR.ODYSSEY: dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'),
CAR.ODYSSEY_CHN: dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'),
CAR.PILOT: dbc_dict('honda_pilot_touring_2017_can_generated', 'acura_ilx_2016_nidec'),
@@ -1004,6 +1031,7 @@ STEER_THRESHOLD = {
CAR.CRV_HYBRID: 1200,
CAR.FIT: 1200,
CAR.HRV: 1200,
CAR.JADE: 1200,
CAR.ODYSSEY: 1200,
CAR.ODYSSEY_CHN: 1200,
CAR.PILOT: 1200,
@@ -1028,6 +1056,7 @@ SPEED_FACTOR = {
CAR.CRV_HYBRID: 1.025,
CAR.FIT: 1.,
CAR.HRV: 1.025,
CAR.JADE: 1.025,
CAR.ODYSSEY: 1.,
CAR.ODYSSEY_CHN: 1.,
CAR.PILOT: 1.,

View File

@@ -4,6 +4,8 @@ from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.hyundai.hyundaican import create_lkas11, create_clu11, create_lfa_mfa
from selfdrive.car.hyundai.values import Buttons, SteerLimitParams, 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
@@ -42,8 +44,13 @@ class CarController():
self.steer_rate_limited = False
self.last_resume_frame = 0
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
self.dp_hkg_smart_mdps = Params().get('dp_hkg_smart_mdps') == b'1'
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 = 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,7 +60,7 @@ class CarController():
lkas_active = enabled and abs(CS.out.steeringAngle) < 90.
# 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:
@@ -65,6 +72,18 @@ class CarController():
process_hud_alert(enabled, self.car_fingerprint, visual_alert,
left_lane, right_lane, left_lane_depart, right_lane_depart)
# 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
can_sends = []
can_sends.append(create_lkas11(self.packer, frame, self.car_fingerprint, apply_steer, lkas_active,
CS.lkas11, sys_warning, sys_state, enabled,

View File

@@ -1,6 +1,6 @@
import copy
from cereal import car
from selfdrive.car.hyundai.values import DBC, STEER_THRESHOLD, FEATURES, EV_HYBRID
from selfdrive.car.hyundai.values import CAR, DBC, STEER_THRESHOLD, FEATURES, EV_HYBRID
from selfdrive.car.interfaces import CarStateBase
from opendbc.can.parser import CANParser
from selfdrive.config import Conversions as CV
@@ -37,7 +37,7 @@ class CarState(CarStateBase):
ret.steerWarning = cp.vl["MDPS12"]['CF_Mdps_ToiUnavail'] != 0
# cruise state
ret.cruiseState.available = True
ret.cruiseState.available = cp.vl["SCC11"]["MainMode_ACC"] != 0 if self.CP.carFingerprint in [CAR.HYUNDAI_GENESIS, CAR.GENESIS_G70, CAR.GENESIS_G80, CAR.GENESIS_G90, CAR.IONIQ] else True
ret.cruiseState.enabled = cp.vl["SCC12"]['ACCMode'] != 0
ret.cruiseState.standstill = cp.vl["SCC11"]['SCCInfoDisplay'] == 4.

View File

@@ -4,6 +4,8 @@ from selfdrive.config import Conversions as CV
from selfdrive.car.hyundai.values import CAR
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
from common.params import Params
class CarInterface(CarInterfaceBase):
@@ -18,6 +20,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "hyundai"
ret.safetyModel = car.CarParams.SafetyModel.hyundai
ret.radarOffCan = True
ret.lateralTuning.init('pid')
# Most Hyundai car ports are community features for now
ret.communityFeature = candidate not in [CAR.SONATA, CAR.PALISADE]
@@ -68,16 +71,17 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.25], [0.05]]
ret.minSteerSpeed = 32 * CV.MPH_TO_MS
elif candidate == CAR.HYUNDAI_GENESIS:
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 2060. + STD_CARGO_KG
ret.wheelbase = 3.01
ret.steerRatio = 16.5
ret.steerRatio = 15
# dp - indi value from donfyffe
ret.lateralTuning.init('indi')
ret.lateralTuning.indi.innerLoopGain = 3.5
ret.lateralTuning.indi.outerLoopGain = 2.0
ret.lateralTuning.indi.innerLoopGain = 3.1
ret.lateralTuning.indi.outerLoopGain = 2.1
ret.lateralTuning.indi.timeConstant = 1.4
ret.lateralTuning.indi.actuatorEffectiveness = 2.3
ret.minSteerSpeed = 60 * CV.KPH_TO_MS
ret.lateralTuning.indi.actuatorEffectiveness = 1.4
ret.minSteerSpeed = 32 * CV.MPH_TO_MS
ret.minEnableSpeed = 10 * CV.MPH_TO_MS
elif candidate == CAR.KONA:
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 1275. + STD_CARGO_KG
@@ -155,22 +159,29 @@ class CarInterface(CarInterfaceBase):
# Genesis
elif candidate == CAR.GENESIS_G70:
ret.lateralTuning.init('indi')
ret.lateralTuning.indi.innerLoopGain = 2.5
ret.lateralTuning.indi.outerLoopGain = 3.5
ret.lateralTuning.indi.timeConstant = 1.4
ret.lateralTuning.indi.actuatorEffectiveness = 1.8
ret.steerActuatorDelay = 0.1
ret.mass = 1640.0 + STD_CARGO_KG
ret.wheelbase = 2.84
ret.steerRatio = 13.56
ret.lateralTuning.init('indi') # TODO: BPs for city speeds - this tuning is great on the highway but a bit lazy in town
ret.lateralTuning.indi.innerLoopGain = 2.4 # higher values steer more
ret.lateralTuning.indi.outerLoopGain = 3.0 # higher values steer more
ret.lateralTuning.indi.timeConstant = 1.0 # lower values steer more
ret.lateralTuning.indi.actuatorEffectiveness = 2.0 # lower values steer more
ret.steerActuatorDelay = 0.4 # 0.08 stock
ret.steerLimitTimer = 0.4 # down from 0.4
tire_stiffness_factor = 1.0
ret.steerRateCost = 1.0
ret.mass = 1825. + STD_CARGO_KG
ret.wheelbase = 2.906
ret.steerRatio = 14.4
elif candidate == CAR.GENESIS_G80:
ret.lateralTuning.pid.kf = 0.00005
ret.mass = 2060. + STD_CARGO_KG
ret.wheelbase = 3.01
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.innerLoopGain = 3.5
ret.lateralTuning.indi.outerLoopGain = 2.0
ret.lateralTuning.indi.timeConstant = 1.4
ret.lateralTuning.indi.actuatorEffectiveness = 2.3
ret.minSteerSpeed = 60 * CV.KPH_TO_MS
elif candidate == CAR.GENESIS_G90:
ret.mass = 2200
ret.wheelbase = 3.15
@@ -178,7 +189,6 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.01]]
# these cars require a special panda safety mode due to missing counters and checksums in the messages
if candidate in [CAR.HYUNDAI_GENESIS, CAR.IONIQ_EV_LTD, CAR.IONIQ, CAR.KONA_EV, CAR.KIA_SORENTO, CAR.SONATA_2019,
CAR.KIA_NIRO_EV, CAR.KIA_OPTIMA, CAR.VELOSTER, CAR.KIA_STINGER, CAR.GENESIS_G70, CAR.GENESIS_G80]:
@@ -186,6 +196,11 @@ class CarInterface(CarInterfaceBase):
ret.centerToFront = ret.wheelbase * 0.4
# dp
if Params().get('dp_hkg_smart_mdps') == b'1':
ret.minSteerSpeed = 0.
ret = common_interface_get_params_lqr(ret)
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
@@ -199,23 +214,31 @@ class CarInterface(CarInterfaceBase):
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
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()
@@ -225,6 +248,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

View File

@@ -3,11 +3,12 @@
from cereal import car
from selfdrive.car import dbc_dict
Ecu = car.CarParams.Ecu
from common.params import Params
# Steer torque limits
class SteerLimitParams:
def __init__(self, CP):
if CP.carFingerprint in [CAR.SONATA, CAR.PALISADE, CAR.SANTA_FE, CAR.VELOSTER, CAR.GENESIS_G70]:
if Params().get('dp_hkg_smart_mdps') == b'1' or CP.carFingerprint in [CAR.SONATA, CAR.PALISADE, CAR.SANTA_FE, CAR.VELOSTER, CAR.HYUNDAI_GENESIS, CAR.GENESIS_G70]:
self.STEER_MAX = 384
else:
self.STEER_MAX = 255
@@ -106,7 +107,7 @@ FINGERPRINTS = {
67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 576: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 4, 1379: 8, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1456: 4, 1470: 8
}],
CAR.GENESIS_G70: [{
67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 576: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832:8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1168: 7, 1170: 8, 1173:8, 1184: 8, 1186: 2, 1191: 2, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1379: 8, 1384: 8, 1407: 8, 1419:8, 1427: 6, 1456: 4, 1470: 8, 1988: 8, 1996: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8, 2015: 8
67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 576: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832:8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1168: 7, 1170: 8, 1173:8, 1184: 8, 1186: 2, 1191: 2, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1379: 8, 1384: 8, 1407: 8, 1419:8, 1425:2, 1427: 6, 1456: 4, 1470: 8, 1988: 8, 1996: 8, 2000: 8, 2004: 8, 2008: 8, 2012: 8, 2015: 8
}],
CAR.GENESIS_G80: [{
67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1024: 2, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1191: 2, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1434: 2, 1456: 4, 1470: 8
@@ -313,7 +314,7 @@ FEATURES = {
"use_elect_gears": set([CAR.KIA_NIRO_EV, CAR.KIA_OPTIMA_H, CAR.IONIQ_EV_LTD, CAR.KONA_EV, CAR.IONIQ]),
# these cars use the FCA11 message for the AEB and FCW signals, all others use SCC12
"use_fca": set([CAR.SONATA, CAR.ELANTRA, CAR.ELANTRA_GT_I30, CAR.KIA_STINGER, CAR.IONIQ, CAR.KONA_EV, CAR.KIA_FORTE, CAR.KIA_NIRO_EV, CAR.PALISADE, CAR.GENESIS_G70, CAR.KONA]),
"use_fca": set([CAR.SONATA, CAR.ELANTRA, CAR.ELANTRA_GT_I30, CAR.KIA_STINGER, CAR.KONA_EV, CAR.KIA_FORTE, CAR.KIA_NIRO_EV, CAR.PALISADE, CAR.GENESIS_G70, CAR.KONA]),
"use_bsm": set([CAR.SONATA, CAR.PALISADE, CAR.HYUNDAI_GENESIS, CAR.GENESIS_G70, CAR.GENESIS_G80, CAR.GENESIS_G90, CAR.KONA]),
}

View File

@@ -33,6 +33,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.
@@ -78,7 +80,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
@@ -92,26 +94,30 @@ 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 self.dragonconf.dpGearCheck and cs_out.gearShifter != GearShifter.drive and cs_out.gearShifter not in extra_gears:
events.add(EventName.wrongGear)
if cs_out.gearShifter == GearShifter.reverse:
events.add(EventName.reverseGear)
if not cs_out.cruiseState.available:
if not self.dragonconf.dpAtl and not cs_out.cruiseState.available:
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 and not self.dragonconf.dpAtl:
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 > self.dragonconf.dpMaxCtrlSpeed:
events.add(EventName.speedTooHigh)
if cs_out.cruiseState.nonAdaptive:
events.add(EventName.wrongCruiseMode)
if cs_out.steerError:
if not self.dragonconf.dpLatCtrl:
events.add(EventName.manualSteeringRequired)
elif self.dragonconf.dpSteeringOnSignal and (cs_out.leftBlinker or cs_out.rightBlinker):
events.add(EventName.manualSteeringRequiredBlinkersOn)
elif cs_out.steerError:
events.add(EventName.steerUnavailable)
elif cs_out.steerWarning:
events.add(EventName.steerTempUnavailable)
@@ -119,9 +125,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:

View File

@@ -2,6 +2,7 @@ from selfdrive.car.mazda import mazdacan
from selfdrive.car.mazda.values import SteerLimitParams, 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):
@@ -9,7 +10,11 @@ class CarController():
self.packer = CANPacker(dbc_name)
self.steer_rate_limited = False
def update(self, enabled, CS, frame, actuators):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
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,

View File

@@ -4,6 +4,7 @@ from selfdrive.config import Conversions as CV
from selfdrive.car.mazda.values import CAR, LKAS_LIMITS
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
ButtonType = car.CarState.ButtonEvent.Type
EventName = car.CarEvent.EventName
@@ -20,6 +21,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "mazda"
ret.safetyModel = car.CarParams.SafetyModel.mazda
ret.lateralTuning.init('pid')
ret.dashcamOnly = True
@@ -56,6 +58,9 @@ class CarInterface(CarInterfaceBase):
# No steer below disable speed
ret.minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED * CV.KPH_TO_MS
# dp
ret = common_interface_get_params_lqr(ret)
ret.centerToFront = ret.wheelbase * 0.41
# TODO: get actual value, for now starting with reasonable value for
@@ -72,12 +77,15 @@ class CarInterface(CarInterfaceBase):
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
@@ -95,6 +103,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

View File

@@ -48,7 +48,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:

View File

@@ -3,6 +3,7 @@ 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, STEER_THRESHOLD
from common.dp_common import common_controller_ctrl
# Steer angle limits
ANGLE_DELTA_BP = [0., 5., 15.]
@@ -23,8 +24,12 @@ class CarController():
self.packer = CANPacker(dbc_name)
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
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.
@@ -63,6 +68,18 @@ class CarController():
apply_angle = CS.out.steeringAngle
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:

View File

@@ -3,6 +3,7 @@ from cereal import car
from selfdrive.car.nissan.values import CAR
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
def __init__(self, CP, CarController, CarState):
@@ -19,6 +20,7 @@ class CarInterface(CarInterfaceBase):
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
ret.carName = "nissan"
ret.safetyModel = car.CarParams.SafetyModel.nissan
ret.lateralTuning.init('pid')
# Nissan port is a community feature, since we don't own one to test
ret.communityFeature = True
@@ -45,6 +47,9 @@ class CarInterface(CarInterfaceBase):
ret.centerToFront = ret.wheelbase * 0.44
ret.steerRatio = 17
# dp
ret = common_interface_get_params_lqr(ret)
ret.steerControlType = car.CarParams.SteerControlType.angle
ret.radarOffCan = True
@@ -59,13 +64,15 @@ class CarInterface(CarInterfaceBase):
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 = []
@@ -87,6 +94,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

View File

@@ -2,6 +2,7 @@ from selfdrive.car import apply_std_steer_torque_limits
from selfdrive.car.subaru import subarucan
from selfdrive.car.subaru.values import DBC, PREGLOBAL_CARS
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
class CarControllerParams():
@@ -27,7 +28,11 @@ class CarController():
self.params = CarControllerParams()
self.packer = CANPacker(DBC[CP.carFingerprint]['pt'])
def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert, left_line, right_line):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert, left_line, right_line, dragonconf):
can_sends = []
@@ -45,6 +50,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, self.params.STEER_STEP))
else:

View File

@@ -146,7 +146,7 @@ class CarState(CarStateBase):
("Dashlights", 10),
("CruiseControl", 50),
]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
@staticmethod
@@ -226,5 +226,5 @@ class CarState(CarStateBase):
("ES_Distance", 20),
("ES_LKAS_State", 10),
]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)

View File

@@ -3,6 +3,7 @@ from cereal import car
from selfdrive.car.subaru.values import CAR, PREGLOBAL_CARS
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
from selfdrive.car.interfaces import CarInterfaceBase
from common.dp_common import common_interface_atl, common_interface_get_params_lqr
class CarInterface(CarInterfaceBase):
@@ -16,6 +17,7 @@ class CarInterface(CarInterfaceBase):
ret.carName = "subaru"
ret.radarOffCan = True
ret.lateralTuning.init('pid')
if candidate in PREGLOBAL_CARS:
ret.safetyModel = car.CarParams.SafetyModel.subaruLegacy
@@ -92,6 +94,9 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0., 10., 20.], [0., 10., 20.]]
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.01, 0.05, 0.2], [0.003, 0.018, 0.025]]
# dp
ret = common_interface_get_params_lqr(ret)
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
@@ -103,12 +108,14 @@ class CarInterface(CarInterfaceBase):
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
@@ -120,6 +127,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

View File

@@ -6,13 +6,14 @@ from selfdrive.car.toyota.toyotacan import create_steer_command, create_ui_comma
create_fcw_command
from selfdrive.car.toyota.values import Ecu, CAR, STATIC_MSGS, SteerLimitParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
VisualAlert = car.CarControl.HUDControl.VisualAlert
# Accel limits
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 # 2.0 m/s2
ACCEL_MIN = -3.5 # -3.5 m/s2
ACCEL_SCALE = max(ACCEL_MAX, -ACCEL_MIN)
def accel_hysteresis(accel, accel_steady, enabled):
@@ -49,8 +50,12 @@ class CarController():
self.packer = CANPacker(dbc_name)
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
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 ***
@@ -78,7 +83,7 @@ class CarController():
self.last_fault_frame = frame
# Cut steering for 2s after fault
if not enabled or (frame - self.last_fault_frame < 200):
if not enabled or (frame - self.last_fault_frame < 100) or abs(CS.out.steeringRate) > 100 or (abs(CS.out.steeringAngle) > 150 and CS.CP.carFingerprint in [CAR.RAV4H, CAR.PRIUS]):
apply_steer = 0
apply_steer_req = 0
else:
@@ -89,12 +94,24 @@ class CarController():
pcm_cancel_cmd = 1
# on entering standstill, send standstill request
if CS.out.standstill and not self.last_standstill:
if not dragonconf.dpToyotaSng and CS.out.standstill and not self.last_standstill:
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 = apply_accel
self.last_standstill = CS.out.standstill
@@ -120,12 +137,13 @@ 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:
can_sends.append(create_acc_cancel_command(self.packer))
elif CS.CP.openpilotLongitudinalControl:
can_sends.append(create_accel_command(self.packer, apply_accel, pcm_cancel_cmd, self.standstill_req, lead))
else:
can_sends.append(create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead))
if not dragonconf.dpAtl:
if 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, apply_accel, pcm_cancel_cmd, self.standstill_req, lead))
else:
can_sends.append(create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead))
if (frame % 2 == 0) and (CS.CP.enableGasInterceptor):
# send exactly zero if apply_gas is zero. Interceptor will send the max between read value and apply_gas.
@@ -147,8 +165,17 @@ class CarController():
# forcing the pcm to disengage causes a bad fault sound so play a good sound instead
send_ui = True
# dp
if dragonconf.dpToyotaLdw:
dragon_left_lane_depart = left_lane_depart
dragon_right_lane_depart = right_lane_depart
else:
dragon_left_lane_depart = False
dragon_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))
can_sends.append(create_ui_command(self.packer, steer_alert, pcm_cancel_cmd, left_line, right_line, dragon_left_lane_depart, dragon_right_lane_depart))
if frame % 100 == 0 and Ecu.dsu in self.fake_ecus:
can_sends.append(create_fcw_command(self.packer, fcw_alert))

View File

@@ -5,6 +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, TSS2_CAR, NO_STOP_TIMER_CAR
from common.params import Params
class CarState(CarStateBase):
@@ -13,13 +14,16 @@ class CarState(CarStateBase):
can_define = CANDefine(DBC[CP.carFingerprint]['pt'])
self.shifter_values = can_define.dv["GEAR_PACKET"]['GEAR']
# dp
self.dp_toyota_zss = Params().get('dp_toyota_zss') == b'1'
# All TSS2 car have the accurate sensor
self.accurate_steer_angle_seen = CP.carFingerprint in TSS2_CAR
self.accurate_steer_angle_seen = CP.carFingerprint in TSS2_CAR or CP.carFingerprint in [CAR.LEXUS_ISH] or self.dp_toyota_zss
# On NO_DSU cars but not TSS2 cars the cp.vl["STEER_TORQUE_SENSOR"]['STEER_ANGLE']
# is zeroed to where the steering angle is at start.
# Need to apply an offset as soon as the steering angle measurements are both received
self.needs_angle_offset = CP.carFingerprint not in TSS2_CAR
self.needs_angle_offset = CP.carFingerprint not in TSS2_CAR or CP.carFingerprint in [CAR.LEXUS_ISH] or self.dp_toyota_zss
self.angle_offset = 0.
def update(self, cp, cp_cam):
@@ -34,6 +38,9 @@ class CarState(CarStateBase):
if self.CP.enableGasInterceptor:
ret.gas = (cp.vl["GAS_SENSOR"]['INTERCEPTOR_GAS'] + cp.vl["GAS_SENSOR"]['INTERCEPTOR_GAS2']) / 2.
ret.gasPressed = ret.gas > 15
elif self.CP.carFingerprint in [CAR.LEXUS_ISH, CAR.LEXUS_GSH]:
ret.gas = cp.vl["GAS_PEDAL_ALT"]['GAS_PEDAL']
ret.gasPressed = ret.gas > 1e-5
else:
ret.gas = cp.vl["GAS_PEDAL"]['GAS_PEDAL']
ret.gasPressed = cp.vl["PCM_CRUISE"]['GAS_RELEASED'] == 0
@@ -52,11 +59,14 @@ class CarState(CarStateBase):
self.accurate_steer_angle_seen = True
if self.accurate_steer_angle_seen:
ret.steeringAngle = cp.vl["STEER_TORQUE_SENSOR"]['STEER_ANGLE'] - self.angle_offset
if self.dp_toyota_zss:
ret.steeringAngle = cp.vl["SECONDARY_STEER_ANGLE"]['ZORRO_STEER'] - self.angle_offset
else:
ret.steeringAngle = 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 and abs(ret.steeringAngle) > 1e-3:
if (abs(angle_wheel) > 1e-3 and abs(ret.steeringAngle) > 1e-3) or self.dp_toyota_zss:
self.needs_angle_offset = False
self.angle_offset = ret.steeringAngle - angle_wheel
else:
@@ -74,15 +84,23 @@ class CarState(CarStateBase):
ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD
ret.steerWarning = cp.vl["EPS_STATUS"]['LKA_STATE'] not in [1, 5]
if self.CP.carFingerprint == CAR.LEXUS_IS:
if self.CP.carFingerprint in [CAR.LEXUS_IS, CAR.LEXUS_NXT]:
ret.cruiseState.available = cp.vl["DSU_CRUISE"]['MAIN_ON'] != 0
ret.cruiseState.speed = cp.vl["DSU_CRUISE"]['SET_SPEED'] * CV.KPH_TO_MS
self.low_speed_lockout = False
elif self.CP.carFingerprint in [CAR.LEXUS_ISH, CAR.LEXUS_GSH]:
ret.cruiseState.available = cp.vl["PCM_CRUISE_ALT"]['MAIN_ON'] != 0
ret.cruiseState.speed = cp.vl["PCM_CRUISE_ALT"]['SET_SPEED'] * CV.KPH_TO_MS
self.low_speed_lockout = False
else:
ret.cruiseState.available = cp.vl["PCM_CRUISE_2"]['MAIN_ON'] != 0
ret.cruiseState.speed = cp.vl["PCM_CRUISE_2"]['SET_SPEED'] * CV.KPH_TO_MS
self.low_speed_lockout = cp.vl["PCM_CRUISE_2"]['LOW_SPEED_LOCKOUT'] == 2
self.pcm_acc_status = cp.vl["PCM_CRUISE"]['CRUISE_STATE']
if self.CP.carFingerprint in [CAR.LEXUS_ISH, CAR.LEXUS_GSH]:
# Lexus ISH does not have CRUISE_STATUS value (always 0), so we use CRUISE_ACTIVE value instead
self.pcm_acc_status = cp.vl["PCM_CRUISE"]['CRUISE_ACTIVE']
else:
self.pcm_acc_status = cp.vl["PCM_CRUISE"]['CRUISE_STATE']
if self.CP.carFingerprint in NO_STOP_TIMER_CAR or self.CP.enableGasInterceptor:
# ignore standstill in hybrid vehicles, since pcm allows to restart without
# receiving any special command. Also if interceptor is detected
@@ -143,8 +161,8 @@ class CarState(CarStateBase):
]
checks = [
("BRAKE_MODULE", 40),
("GAS_PEDAL", 33),
#("BRAKE_MODULE", 40),
#("GAS_PEDAL", 33),
("WHEEL_SPEEDS", 80),
("STEER_ANGLE_SENSOR", 80),
("PCM_CRUISE", 33),
@@ -152,7 +170,27 @@ class CarState(CarStateBase):
("EPS_STATUS", 25),
]
if CP.carFingerprint == CAR.LEXUS_IS:
if CP.carFingerprint in [CAR.LEXUS_ISH, CAR.LEXUS_GSH]:
signals.append(("GAS_PEDAL", "GAS_PEDAL_ALT", 0))
signals.append(("MAIN_ON", "PCM_CRUISE_ALT", 0))
signals.append(("SET_SPEED", "PCM_CRUISE_ALT", 0))
signals.append(("AUTO_HIGH_BEAM", "LIGHT_STALK_ISH", 0))
checks += [
("BRAKE_MODULE", 50),
("GAS_PEDAL_ALT", 50),
("PCM_CRUISE_ALT", 1),
]
else:
signals += [
("AUTO_HIGH_BEAM", "LIGHT_STALK", 0),
("GAS_PEDAL", "GAS_PEDAL", 0),
]
checks += [
("BRAKE_MODULE", 40),
("GAS_PEDAL", 33),
]
if CP.carFingerprint in [CAR.LEXUS_IS, CAR.LEXUS_NXT]:
signals.append(("MAIN_ON", "DSU_CRUISE", 0))
signals.append(("SET_SPEED", "DSU_CRUISE", 0))
checks.append(("DSU_CRUISE", 5))
@@ -177,6 +215,10 @@ class CarState(CarStateBase):
signals += [("R_ADJACENT", "BSM", 0)]
signals += [("R_APPROACHING", "BSM", 0)]
if Params().get('dp_toyota_zss') == b'1':
signals += [("ZORRO_STEER", "SECONDARY_STEER_ANGLE", 0)]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
@staticmethod
@@ -191,5 +233,5 @@ class CarState(CarStateBase):
checks = [
("STEERING_LKA", 42)
]
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)

View File

@@ -5,10 +5,18 @@ from selfdrive.car.toyota.values import Ecu, ECU_FINGERPRINT, CAR, TSS2_CAR, FIN
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, is_ecu_disconnected, 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) / 3.0
@@ -49,6 +57,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
@@ -263,9 +274,48 @@ class CarInterface(CarInterfaceBase):
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.35], [0.15]]
ret.lateralTuning.pid.kf = 0.00007818594
elif candidate == CAR.LEXUS_ISH:
stop_and_go = True # set to true because it's a hybrid
ret.safetyParam = 130
ret.wheelbase = 2.79908
ret.steerRatio = 13.3
tire_stiffness_factor = 0.444
ret.mass = 3736.8 * CV.LB_TO_KG + STD_CARGO_KG
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]]
ret.lateralTuning.pid.kf = 0.00006
elif candidate == CAR.LEXUS_GSH:
stop_and_go = True # set to true because it's a hybrid
ret.safetyParam = 130
ret.wheelbase = 2.84988
ret.steerRatio = 14.35 # range from 11.5 - 17.2, lets try 14.35
tire_stiffness_factor = 0.444
ret.mass = 4112 * CV.LB_TO_KG + STD_CARGO_KG
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]]
ret.lateralTuning.pid.kf = 0.00006
elif candidate == CAR.LEXUS_NXT:
stop_and_go = True
ret.safetyParam = 100
ret.wheelbase = 2.66
ret.steerRatio = 14.7
tire_stiffness_factor = 0.444 # not optimized yet
ret.mass = 4070 * CV.LB_TO_KG + STD_CARGO_KG
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.05]]
ret.lateralTuning.pid.kf = 0.00006
ret.steerRateCost = 1.
ret.centerToFront = ret.wheelbase * 0.44
# 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
if Params().get('dp_lqr') == b'0':
ret.lateralTuning.indi.timeConstant = 0.1
ret.steerRateCost = 0.5
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
@@ -314,12 +364,25 @@ class CarInterface(CarInterfaceBase):
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
@@ -351,7 +414,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

View File

@@ -41,6 +41,10 @@ class CAR:
RAV4H_TSS2 = "TOYOTA RAV4 HYBRID 2019"
LEXUS_NXH = "LEXUS NX300H 2018"
LEXUS_NX = "LEXUS NX300 2018"
LEXUS_ISH = "LEXUS IS300h 2017"
LEXUS_GSH = "LEXUS GS450h 2017"
LEXUS_NXT = "LEXUS NX200T 2015"
# addr: (ecu, cars, bus, 1/freq*100, vl)
STATIC_MSGS = [
@@ -82,36 +86,52 @@ 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_RX: [{
# 2016 Lexus RX 350
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 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: 5, 643: 7, 705: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 812: 3, 818: 8, 819: 8, 820: 8, 821: 8, 822: 8, 830: 7, 835: 8, 836: 8, 845: 5, 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, 951: 8, 955: 8, 956: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1077: 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, 1263: 8, 1264: 8, 1279: 8, 1349: 8, 1350: 8, 1351: 8, 1413: 8, 1414: 8, 1415: 8, 1416: 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, 1904: 8, 1912: 8, 1990: 8, 1998: 8, 2015: 8, 2016: 8, 2024: 8
},
{
# RX300 China
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 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: 5, 643: 7, 705: 8, 740: 5, 742: 8, 743: 8, 744: 8, 800: 8, 810: 2, 812: 3, 830: 7, 835: 8, 836: 8, 845: 5, 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, 951: 8, 955: 8, 956: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1077: 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, 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, 1904: 8, 1912: 8, 1990: 8, 1998: 8
},
# 2017 Lexus RX 350
{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 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: 5, 643: 7, 658: 8, 705: 8, 740: 5, 742: 8, 743: 8, 767: 4, 800: 8, 810: 2, 812: 3, 814: 8, 818: 8, 819: 8, 820: 8, 821: 8, 822: 8, 830: 7, 835: 8, 836: 8, 869: 7, 870: 7, 871: 2, 898: 8, 900: 6, 902: 6, 905: 8, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 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, 1263: 8, 1264: 8, 1279: 8, 1349: 8, 1350: 8, 1351: 8, 1413: 8, 1414: 8, 1415: 8, 1416: 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, 1904: 8, 1912: 8, 1990: 8, 1998: 8
@@ -161,6 +181,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
@@ -189,6 +213,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.HIGHLANDER_TSS2: [{
# 2020 highlander limited
@@ -215,11 +243,27 @@ 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.COROLLA_TSS2: [
# hatch 2019+ and sedan 2020+
{
36: 8, 37: 8, 114: 5, 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, 608: 8, 610: 8, 643: 7, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 767: 4, 800: 8, 810: 2, 812: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 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, 951: 8, 955: 8, 956: 8, 976: 1, 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, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 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, 1595: 8, 1649: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1808: 8, 1809: 8, 1816: 8, 1817: 8, 1840: 8, 1848: 8, 1904: 8, 1912: 8, 1940: 8, 1941: 8, 1948: 8, 1949: 8, 1952: 8, 1960: 8, 1981: 8, 1986: 8, 1990: 8, 1994: 8, 1998: 8, 2004: 8
},
#2020 AURIS with LTA, number of messages:
{
36: 8, 37: 8, 114: 5, 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, 608: 8, 610: 8, 643: 7, 705: 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, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 896: 8, 898: 8, 921: 8, 942: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 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, 1595: 8, 1745: 8, 1775: 8, 1779: 8
},
{
# 2019 Taiwan Altis
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, 608: 8, 610: 8, 643: 7, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 765: 8, 800: 8, 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, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 987: 8, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1082: 8, 1112: 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, 1745: 8, 1775: 8, 1779: 8
},
{
# 2019 Chinese Levin (Petrol) from Shell
36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 355: 5, 401: 8, 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, 742: 8, 743: 8, 761: 8, 765: 8, 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, 951: 8, 955: 8, 956: 8, 976: 1, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 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, 1808: 8, 1816: 8, 1904: 8, 1912: 8, 1984: 8, 1992: 8, 2002: 8
}],
CAR.COROLLAH_TSS2: [
# 2019 Taiwan Altis Hybrid
@@ -229,10 +273,18 @@ 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.LEXUS_ES_TSS2: [{
36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 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, 608: 8, 610: 8, 643: 7, 658: 8, 705: 8, 728: 8, 740: 5, 761: 8, 764: 8, 765: 8, 767: 4, 800: 8, 810: 2, 812: 8, 814: 8, 818: 8, 824: 8, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 882: 8, 885: 8, 889: 8, 896: 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, 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, 1076: 8, 1077: 8, 1082: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1228: 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, 1575: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1696: 8, 1775: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8,
},
# 2019 Lexus ES200 from Shell
{
36: 8, 37: 8, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 355: 5, 401: 8, 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, 765: 8, 800: 8, 810: 2, 812: 8, 818: 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, 896: 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, 987: 8, 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, 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, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1592: 8, 1594: 8, 1595: 8, 1775: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
CAR.LEXUS_ESH_TSS2: [
{
@@ -245,15 +297,19 @@ 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
},
# IS300H 2017
{
36: 8, 37: 8, 170: 8, 180: 8, 295: 8, 296: 8, 400: 6, 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, 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: 7, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 3, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1009: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1057: 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, 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, 1232: 8, 1235: 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, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
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
}],
CAR.RAV4H_TSS2: [
#Hybrid Limited
@@ -263,6 +319,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
}],
CAR.LEXUS_NXH: [{
36: 8, 37: 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: 5, 643: 7, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 800: 8, 810: 2, 812: 3, 818: 8, 822: 8, 824: 8, 835: 8, 836: 8, 845: 5, 849: 4, 869: 7, 870: 7, 871: 2, 889: 8, 891: 8, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 913: 8, 916: 3, 918: 8, 921: 8, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 3, 955: 8, 956: 8, 979: 2, 987: 8, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1006: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1056: 8, 1057: 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, 1168: 1, 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, 1195: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1208: 8, 1212: 8, 1227: 8, 1228: 8, 1232: 8, 1235: 8, 1237: 8, 1263: 8, 1264: 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, 1656: 8, 1728: 8, 1745: 8, 1777: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
@@ -272,7 +332,18 @@ FINGERPRINTS = {
}],
CAR.PRIUS_TSS2: [{
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, 614: 8, 643: 7, 658: 8, 713: 8, 740: 5, 742: 8, 743: 8, 764: 8, 765: 8, 800: 8, 810: 2, 814: 8, 824: 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, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 918: 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, 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, 1172: 8, 1175: 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, 1593: 8, 1595: 8, 1649: 8, 1653: 8, 1654: 8, 1655: 8, 1775: 8, 1777: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}]
}],
CAR.LEXUS_ISH: [{
# IS300H 2017
36: 8, 37: 8, 170: 8, 180: 8, 295: 8, 296: 8, 400: 6, 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, 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: 7, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 3, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1009: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1057: 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, 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, 1232: 8, 1235: 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, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
CAR.LEXUS_GSH: [{
# GS450H 2017
36: 8, 37: 8, 38: 8, 42: 8, 44: 8, 170: 8, 180: 8, 295: 8, 296: 8, 426: 6, 452: 8, 466: 8, 548: 8, 550: 2, 552: 4, 560: 7, 581: 5, 608: 8, 610: 5, 643: 7, 713: 8, 740: 5, 744: 8, 800: 8, 810: 2, 812: 3, 832: 8, 836: 8, 845: 5, 849: 4, 864: 1, 869: 7, 870: 7, 871: 2, 896: 8, 897: 8, 900: 6, 902: 6, 905: 8, 911: 8, 913: 8, 916: 2, 917: 4, 918: 7, 919: 1, 921: 7, 933: 8, 944: 8, 945: 8, 950: 8, 951: 8, 953: 3, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1009: 8, 1014: 8, 1017: 8, 1041: 8, 1042: 8, 1043: 8, 1056: 8, 1057: 8, 1059: 1, 1112: 8, 1114: 8, 1116: 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, 1188: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1193: 8, 1195: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1200: 8, 1201: 8, 1206: 8, 1208: 8, 1226: 8, 1227: 8, 1235: 8, 1237: 8, 1250: 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, 1596: 8, 1597: 8, 1599: 8, 1664: 8, 1728: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
CAR.LEXUS_NXT: [{
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: 7, 544: 4, 550: 8, 562: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 800: 8, 810: 2, 812: 3, 836: 8, 845: 5, 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, 998: 5, 999: 7, 1000: 8, 1001: 8, 1008: 2, 1009: 8, 1014: 8, 1017: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1112: 8, 1114: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1184: 8, 1185: 8, 1186: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1195: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1200: 8, 1201: 8, 1202: 8, 1203: 8, 1206: 8, 1208: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1263: 8, 1552: 8, 1553: 8, 1555: 8, 1556: 8, 1557: 8, 1561: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1575: 8, 1584: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1656: 8, 1728: 8, 1745: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8
}],
}
# Don't use theses fingerprints for fingerprinting, they are still needed for ECU detection
@@ -364,6 +435,7 @@ FW_VERSIONS = {
},
CAR.CAMRYH: {
(Ecu.engine, 0x700, None): [
b'\x018966306N9000\x00\x00\x00\x00', # from a358063504 @wechat
b'\x018966333N4300\x00\x00\x00\x00',
b'\x018966333X0000\x00\x00\x00\x00',
b'\x028966306B2100\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00',
@@ -392,6 +464,7 @@ FW_VERSIONS = {
b'8821F0601200 ',
b'8821F0601300 ',
b'8821F0603400 ',
b'8821F0603600 ', # from a358063504 @wechat
b'8821F0604200 ',
b'8821F0606200 ',
b'8821F0607200 ',
@@ -413,6 +486,7 @@ FW_VERSIONS = {
b'8821F0601200 ',
b'8821F0601300 ',
b'8821F0603400 ',
b'8821F0603600 ', # from a358063504 @wechat
b'8821F0604200 ',
b'8821F0606200 ',
b'8821F0607200 ',
@@ -439,6 +513,7 @@ FW_VERSIONS = {
b'\x01896631017200\x00\x00\x00\x00',
b'\x0189663F413100\x00\x00\x00\x00',
b'\x0189663F414100\x00\x00\x00\x00',
b'\x0189663F421100\x00\x00\x00\x00', # 2018 China Toyota CHR
],
(Ecu.dsu, 0x791, None): [
b'8821F0W01000 ',
@@ -448,6 +523,7 @@ FW_VERSIONS = {
b'8821FF405100 ',
b'8821FF406000 ',
b'8821F0W01100 ',
b'8821FF403100 ', # 2018 China Toyota CHR
],
(Ecu.esp, 0x7b0, None): [
b'F152610020\x00\x00\x00\x00\x00\x00',
@@ -457,10 +533,12 @@ FW_VERSIONS = {
b'F1526F4073\x00\x00\x00\x00\x00\x00',
b'F1526F4121\x00\x00\x00\x00\x00\x00',
b'F1526F4122\x00\x00\x00\x00\x00\x00',
b'F1526F4100\x00\x00\x00\x00\x00\x00', # 2018 China Toyota CHR
],
(Ecu.eps, 0x7a1, None): [
b'8965B10011\x00\x00\x00\x00\x00\x00',
b'8965B10040\x00\x00\x00\x00\x00\x00',
b'8965B10020\x00\x00\x00\x00\x00\x00', # 2018 China Toyota CHR
],
(Ecu.engine, 0x7e0, None): [
b'\x033F401100\x00\x00\x00\x00\x00\x00\x00\x00A0202000\x00\x00\x00\x00\x00\x00\x00\x00895231203102\x00\x00\x00\x00',
@@ -475,11 +553,13 @@ FW_VERSIONS = {
b'8821FF405100 ',
b'8821FF406000 ',
b'8821F0W01100 ',
b'8821FF403100 ', # 2018 China Toyota CHR
],
(Ecu.fwdCamera, 0x750, 0x6d): [
b'8646FF401800 ',
b'8646FF404000 ',
b'8646FF406000 ',
b'8646FF403100 ', # 2018 China Toyota CHR
],
},
CAR.CHRH: {
@@ -613,6 +693,7 @@ FW_VERSIONS = {
b'\x028966312Q4000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00',
b'\x038966312L7000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1205001\x00\x00\x00\x00',
b'\x038966312N1000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF1203001\x00\x00\x00\x00',
b'\x02896630ZN8000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', # Brazil 2020 Corolla Hybrid FPv2 from berno22
],
(Ecu.eps, 0x7a1, None): [
b'8965B12361\x00\x00\x00\x00\x00\x00',
@@ -622,6 +703,7 @@ FW_VERSIONS = {
b'\x018965B12500\x00\x00\x00\x00\x00\x00',
b'\x018965B12520\x00\x00\x00\x00\x00\x00',
b'\x018965B12530\x00\x00\x00\x00\x00\x00',
b'\x018965B12490\x00\x00\x00\x00\x00\x00', # Brazil 2020 Corolla Hybrid FPv2 from berno22
],
(Ecu.esp, 0x7b0, None): [
b'F152612590\x00\x00\x00\x00\x00\x00',
@@ -633,6 +715,7 @@ FW_VERSIONS = {
b'F152612A10\x00\x00\x00\x00\x00\x00',
b'F152642540\x00\x00\x00\x00\x00\x00',
b'F152612A00\x00\x00\x00\x00\x00\x00',
b'F152612820\x00\x00\x00\x00\x00\x00', # Brazil 2020 Corolla Hybrid FPv2 from berno22
],
(Ecu.fwdRadar, 0x750, 0xf): [
b'\x018821F3301100\x00\x00\x00\x00',
@@ -1060,6 +1143,7 @@ FW_VERSIONS = {
b'\x01896630852100\x00\x00\x00\x00',
b'\x01896630859000\x00\x00\x00\x00',
b'\x01896630860000\x00\x00\x00\x00',
b'\x01896630852000\x00\x00\x00\x00', # 2018 Toyota Sienna LTD fingerprint (v2) by ming-feng
],
(Ecu.eps, 0x7a1, None): [
b'8965B45070\x00\x00\x00\x00\x00\x00',
@@ -1322,8 +1406,11 @@ DBC = {
CAR.LEXUS_NXH: dbc_dict('lexus_nx300h_2018_pt_generated', 'toyota_adas'),
CAR.LEXUS_NX: dbc_dict('lexus_nx300_2018_pt_generated', 'toyota_adas'),
CAR.PRIUS_TSS2: dbc_dict('toyota_nodsu_hybrid_pt_generated', 'toyota_tss2_adas'),
CAR.LEXUS_ISH: dbc_dict('lexus_is300h_2017_pt_generated', 'toyota_adas'),
CAR.LEXUS_GSH: dbc_dict('lexus_is300h_2017_pt_generated', 'toyota_adas'),
CAR.LEXUS_NXT: dbc_dict('lexus_nxt_2015_pt_generated', 'toyota_adas'),
}
NO_DSU_CAR = set([CAR.CHR, CAR.CHRH, CAR.CAMRY, CAR.CAMRYH, CAR.RAV4_TSS2, CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2, CAR.RAV4H_TSS2, CAR.LEXUS_RX_TSS2, CAR.LEXUS_RXH_TSS2, CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2])
NO_DSU_CAR = set([CAR.CHR, CAR.CHRH, CAR.CAMRY, CAR.CAMRYH, CAR.RAV4_TSS2, CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2, CAR.RAV4H_TSS2, CAR.LEXUS_RX_TSS2, CAR.LEXUS_RXH_TSS2, CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2, CAR.LEXUS_NXT])
TSS2_CAR = set([CAR.RAV4_TSS2, CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2, CAR.RAV4H_TSS2, CAR.LEXUS_RX_TSS2, CAR.LEXUS_RXH_TSS2, CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2, CAR.PRIUS_TSS2])
NO_STOP_TIMER_CAR = set([CAR.RAV4H, CAR.HIGHLANDERH, CAR.HIGHLANDER, CAR.RAV4_TSS2, CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2, CAR.SIENNA, CAR.RAV4H_TSS2, CAR.LEXUS_RX_TSS2, CAR.LEXUS_RXH_TSS2, CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2, CAR.PRIUS_TSS2]) # no resume button press required
NO_STOP_TIMER_CAR = set([CAR.RAV4H, CAR.HIGHLANDERH, CAR.HIGHLANDER, CAR.RAV4_TSS2, CAR.COROLLA_TSS2, CAR.COROLLAH_TSS2, CAR.LEXUS_ES_TSS2, CAR.LEXUS_ESH_TSS2, CAR.SIENNA, CAR.RAV4H_TSS2, CAR.LEXUS_RX_TSS2, CAR.LEXUS_RXH_TSS2, CAR.HIGHLANDER_TSS2, CAR.HIGHLANDERH_TSS2, CAR.LEXUS_NXT, CAR.PRIUS_TSS2]) # no resume button press required

View File

@@ -1,8 +1,9 @@
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, NWL, MQB_LDW_MESSAGES, BUTTON_STATES, CarControllerParams
from opendbc.can.packer import CANPacker
from common.dp_common import common_controller_ctrl
class CarController():
@@ -10,6 +11,16 @@ class CarController():
self.apply_steer_last = 0
self.packer_pt = CANPacker(DBC[CP.carFingerprint]['pt'])
self.acc_bus = CANBUS.pt if CP.networkLocation == NWL.fwdCamera else CANBUS.cam
if CP.safetyModel == car.CarParams.SafetyModel.volkswagen:
self.create_steering_control = volkswagencan.create_mqb_steering_control
self.create_acc_buttons_control = volkswagencan.create_mqb_acc_buttons_control
self.create_hud_control = volkswagencan.create_mqb_hud_control
elif CP.safetyModel == car.CarParams.SafetyModel.volkswagenPq:
self.create_steering_control = volkswagencan.create_pq_steering_control
self.create_acc_buttons_control = volkswagencan.create_pq_acc_buttons_control
self.create_hud_control = volkswagencan.create_pq_hud_control
self.hcaSameTorqueCount = 0
self.hcaEnabledFrameCount = 0
@@ -20,7 +31,11 @@ class CarController():
self.steer_rate_limited = False
def update(self, enabled, CS, frame, actuators, visual_alert, audible_alert, leftLaneVisible, rightLaneVisible):
# dp
self.last_blinker_on = False
self.blinker_end_frame = 0.
def update(self, enabled, CS, frame, actuators, visual_alert, audible_alert, leftLaneVisible, rightLaneVisible, dragonconf):
""" Controls thread """
P = CarControllerParams
@@ -94,9 +109,24 @@ class CarController():
hcaEnabled = False
apply_steer = 0
# dp
# timebomb
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,
can_sends.append(self.create_steering_control(self.packer_pt, CANBUS.pt, apply_steer,
idx, hcaEnabled))
#--------------------------------------------------------------------------
@@ -117,9 +147,11 @@ class CarController():
else:
hud_alert = MQB_LDW_MESSAGES["none"]
can_sends.append(volkswagencan.create_mqb_hud_control(self.packer_pt, CANBUS.pt, hcaEnabled,
can_sends.append(self.create_hud_control(self.packer_pt, CANBUS.pt, hcaEnabled,
CS.out.steeringPressed, hud_alert, leftLaneVisible,
rightLaneVisible))
rightLaneVisible, CS.ldw_lane_warning_left,
CS.ldw_lane_warning_right, CS.ldw_side_dlc_tlc,
CS.ldw_dlc, CS.ldw_tlc))
#--------------------------------------------------------------------------
# #
@@ -176,7 +208,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(self.create_acc_buttons_control(self.packer_pt, self.acc_bus, self.graButtonStatesToSend, CS, idx))
self.graMsgSentCount += 1
if self.graMsgSentCount >= P.GRA_VBP_COUNT:
self.graButtonStatesToSend = None

View File

@@ -4,16 +4,33 @@ 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, BUTTON_STATES, CarControllerParams
from selfdrive.car.volkswagen.values import DBC, CANBUS, NWL, TRANS, GEAR, BUTTON_STATES, CarControllerParams
class CarState(CarStateBase):
def __init__(self, CP):
super().__init__(CP)
can_define = CANDefine(DBC[CP.carFingerprint]['pt'])
self.shifter_values = can_define.dv["Getriebe_11"]['GE_Fahrstufe']
if CP.safetyModel == car.CarParams.SafetyModel.volkswagenPq:
# Configure for PQ35/PQ46/NMS network messaging
self.get_can_parser = self.get_pq_can_parser
self.get_cam_can_parser = self.get_pq_cam_can_parser
self.update = self.update_pq
if CP.transmissionType == TRANS.automatic:
self.shifter_values = can_define.dv["Getriebe_1"]['Waehlhebelposition__Getriebe_1_']
else:
# Configure for MQB network messaging (default)
self.get_can_parser = self.get_mqb_can_parser
self.get_cam_can_parser = self.get_mqb_cam_can_parser
self.update = self.update_mqb
if CP.transmissionType == TRANS.automatic:
self.shifter_values = can_define.dv["Getriebe_11"]['GE_Fahrstufe']
elif CP.transmissionType == TRANS.direct:
self.shifter_values = can_define.dv["EV_Gearshift"]['GearPosition']
self.buttonStates = BUTTON_STATES.copy()
def update(self, pt_cp):
def update_mqb(self, pt_cp, cam_cp, acc_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
@@ -28,9 +45,9 @@ class CarState(CarStateBase):
# Update steering angle, rate, yaw rate, and driver input torque. VW send
# the sign/direction in a separate signal so they must be recombined.
ret.steeringAngle = pt_cp.vl["LWI_01"]['LWI_Lenkradwinkel'] * (1, -1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradwinkel'])]
ret.steeringRate = pt_cp.vl["LWI_01"]['LWI_Lenkradw_Geschw'] * (1, -1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradwinkel'])]
ret.steeringTorque = pt_cp.vl["EPS_01"]['Driver_Strain'] * (1, -1)[int(pt_cp.vl["EPS_01"]['Driver_Strain_VZ'])]
ret.steeringAngle = pt_cp.vl["LH_EPS_03"]['EPS_Berechneter_LW'] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]['EPS_VZ_BLW'])]
ret.steeringRate = pt_cp.vl["LWI_01"]['LWI_Lenkradw_Geschw'] * (1, -1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradw_Geschw'])]
ret.steeringTorque = pt_cp.vl["LH_EPS_03"]['EPS_Lenkmoment'] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]['EPS_VZ_Lenkmoment'])] * 100.0
ret.steeringPressed = abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE
ret.yawRate = pt_cp.vl["ESP_02"]['ESP_Gierrate'] * (1, -1)[int(pt_cp.vl["ESP_02"]['ESP_VZ_Gierrate'])] * CV.DEG_TO_RAD
@@ -41,9 +58,23 @@ class CarState(CarStateBase):
ret.brakePressed = bool(pt_cp.vl["ESP_05"]['ESP_Fahrer_bremst'])
ret.brakeLights = bool(pt_cp.vl["ESP_05"]['ESP_Status_Bremsdruck'])
# Additional safety checks performed in CarInterface.
self.parkingBrakeSet = bool(pt_cp.vl["Kombi_01"]['KBI_Handbremse']) # FIXME: need to include an EPB check as well
ret.espDisabled = pt_cp.vl["ESP_21"]['ESP_Tastung_passiv'] != 0
# Update gear and/or clutch position data.
can_gear_shifter = int(pt_cp.vl["Getriebe_11"]['GE_Fahrstufe'])
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear_shifter, None))
if trans_type == TRANS.automatic:
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["Getriebe_11"]['GE_Fahrstufe'], None))
elif trans_type == TRANS.direct:
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["EV_Gearshift"]['GearPosition'], None))
elif trans_type == TRANS.manual:
ret.clutchPressed = not pt_cp.vl["Motor_14"]['MO_Kuppl_schalter']
reverse_light = bool(pt_cp.vl["Gateway_72"]['BCM1_Rueckfahrlicht_Schalter'])
# TODO: consider gating an OP minimum engage speed on whether the clutch is pressed, to prevent stalling
if reverse_light:
ret.gearShifter = GEAR.reverse
else:
ret.gearShifter = GEAR.drive
# Update door and trunk/hatch lid open status.
ret.doorOpen = any([pt_cp.vl["Gateway_72"]['ZV_FT_offen'],
@@ -60,6 +91,29 @@ class CarState(CarStateBase):
# We use the speed preference for OP.
self.displayMetricUnits = not pt_cp.vl["Einheiten_01"]["KBI_MFA_v_Einheit_02"]
# Stock FCW is considered active if a warning is displayed to the driver
# or the release bit for brake-jerk warning is set. Stock AEB considered
# active if the partial braking or target braking release bits are set.
# Ref: VW SSP 890253 "Volkswagen Driver Assistance Systems V2", "Front
# Assist with Braking: Golf Family" (applies to all MQB)
ret.stockFcw = bool(acc_cp.vl["ACC_10"]["AWV2_Freigabe"])
ret.stockAeb = any([bool(acc_cp.vl["ACC_10"]["ANB_Teilbremsung_Freigabe"]),
bool(acc_cp.vl["ACC_10"]["ANB_Zielbremsung_Freigabe"])])
# Consume blind-spot radar info/warning LED states, if available
ret.leftBlindspot = any([bool(acc_cp.vl["SWA_01"]["SWA_Infostufe_SWA_li"]),
bool(acc_cp.vl["SWA_01"]["SWA_Warnung_SWA_li"])])
ret.rightBlindspot = any([bool(acc_cp.vl["SWA_01"]["SWA_Infostufe_SWA_re"]),
bool(acc_cp.vl["SWA_01"]["SWA_Warnung_SWA_re"])])
# Consume SWA (Lane Change Assist) relevant info from factory LDW message
# to pass along to the blind spot radar controller
self.ldw_lane_warning_left = bool(cam_cp.vl["LDW_02"]["LDW_SW_Warnung_links"])
self.ldw_lane_warning_right = bool(cam_cp.vl["LDW_02"]["LDW_SW_Warnung_rechts"])
self.ldw_side_dlc_tlc = bool(cam_cp.vl["LDW_02"]["LDW_Seite_DLCTLC"])
self.ldw_dlc = cam_cp.vl["LDW_02"]["LDW_DLC"]
self.ldw_tlc = cam_cp.vl["LDW_02"]["LDW_TLC"]
# Update ACC radar status.
accStatus = pt_cp.vl["TSK_06"]['TSK_Status']
if accStatus == 2:
@@ -77,7 +131,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"]['SetSpeed']
ret.cruiseState.speed = acc_cp.vl["ACC_02"]["ACC_Wunschgeschw"] * CV.KPH_TO_MS
if ret.cruiseState.speed > 90:
ret.cruiseState.speed = 0
@@ -98,27 +152,127 @@ class CarState(CarStateBase):
self.graTypHauptschalter = pt_cp.vl["GRA_ACC_01"]['GRA_Typ_Hauptschalter']
self.graButtonTypeInfo = pt_cp.vl["GRA_ACC_01"]['GRA_ButtonTypeInfo']
self.graTipStufe2 = pt_cp.vl["GRA_ACC_01"]['GRA_Tip_Stufe_2']
self.graTyp468 = pt_cp.vl["GRA_ACC_01"]['GRA_Typ468']
# Pick up the GRA_ACC_01 CAN message counter so we can sync to it for
# later cruise-control button spamming.
self.graMsgBusCounter = pt_cp.vl["GRA_ACC_01"]['COUNTER']
# Check to make sure the electric power steering rack is configured to
# accept and respond to HCA_01 messages and has not encountered a fault.
self.steeringFault = not pt_cp.vl["EPS_01"]["HCA_Ready"]
self.steeringFault = not pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"]
return ret
def update_pq(self, pt_cp, cam_cp, acc_cp, trans_type):
ret = car.CarState.new_message()
# Update vehicle speed and acceleration from ABS wheel speeds.
ret.wheelSpeeds.fl = pt_cp.vl["Bremse_3"]['Radgeschw__VL_4_1'] * CV.KPH_TO_MS
ret.wheelSpeeds.fr = pt_cp.vl["Bremse_3"]['Radgeschw__VR_4_1'] * CV.KPH_TO_MS
ret.wheelSpeeds.rl = pt_cp.vl["Bremse_3"]['Radgeschw__HL_4_1'] * CV.KPH_TO_MS
ret.wheelSpeeds.rr = pt_cp.vl["Bremse_3"]['Radgeschw__HR_4_1'] * CV.KPH_TO_MS
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
# Update steering angle, rate, yaw rate, and driver input torque. VW send
# the sign/direction in a separate signal so they must be recombined.
ret.steeringAngle = pt_cp.vl["Lenkhilfe_3"]['LH3_BLW'] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]['LH3_BLWSign'])]
ret.steeringRate = pt_cp.vl["Lenkwinkel_1"]['Lenkradwinkel_Geschwindigkeit'] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]['Lenkradwinkel_Geschwindigkeit_S'])]
ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]['LH3_LM'] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]['LH3_LMSign'])]
ret.steeringPressed = abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE
ret.yawRate = pt_cp.vl["Bremse_5"]['Giergeschwindigkeit'] * (1, -1)[int(pt_cp.vl["Bremse_5"]['Vorzeichen_der_Giergeschwindigk'])] * CV.DEG_TO_RAD
# Update gas, brakes, and gearshift.
ret.gas = pt_cp.vl["Motor_3"]['Fahrpedal_Rohsignal'] / 100.0
ret.gasPressed = ret.gas > 0
ret.brake = pt_cp.vl["Bremse_5"]['Bremsdruck'] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects
ret.brakePressed = bool(pt_cp.vl["Motor_2"]['Bremstestschalter'])
ret.brakeLights = bool(pt_cp.vl["Motor_2"]['Bremslichtschalter'])
# Additional safety checks performed in CarInterface.
self.parkingBrakeSet = bool(pt_cp.vl["Kombi_01"]['KBI_Handbremse']) # FIXME: need to include an EPB check as well
ret.espDisabled = pt_cp.vl["ESP_21"]['ESP_Tastung_passiv'] != 0
self.parkingBrakeSet = bool(pt_cp.vl["Kombi_1"]['Bremsinfo']) # FIXME: need to include an EPB check as well
ret.espDisabled = bool(pt_cp.vl["Bremse_1"]['ESP_Passiv_getastet'])
# Update gear and/or clutch position data.
if trans_type == TRANS.automatic:
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["Getriebe_1"]['Waehlhebelposition__Getriebe_1_'], None))
elif trans_type == TRANS.manual:
ret.clutchPressed = not pt_cp.vl["Motor_1"]['Kupplungsschalter']
reverse_light = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Rueckfahr'])
# TODO: verify this synthesis has the desired behavior.
# In particular, should we neutral disengage during normal gear changes?
# Also, what happens if we're rolling backwards with the clutch pressed
# in a gear other than reverse?
if reverse_light:
ret.gearShifter = GEAR.reverse
elif ret.standstill and self.parkingBrakeSet:
ret.gearShifter = GEAR.park
elif ret.clutchPressed:
ret.gearShifter = GEAR.neutral
else:
ret.gearShifter = GEAR.drive
# Update door and trunk/hatch lid open status.
# TODO: need to locate signals for other three doors if possible
ret.doorOpen = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Fa_Tuerkont'])
# Update seatbelt fastened status.
ret.seatbeltUnlatched = not bool(pt_cp.vl["Airbag_1"]["Gurtschalter_Fahrer"])
# Update driver preference for metric. VW stores many different unit
# preferences, including separate units for for distance vs. speed.
# We use the speed preference for OP.
self.displayMetricUnits = not pt_cp.vl["Einheiten_1"]["MFA_v_Einheit_02"]
# Update ACC radar status.
# FIXME: This is unfinished and not fully correct, need to improve further
ret.cruiseState.available = bool(pt_cp.vl["GRA_neu"]['Hauptschalter'])
ret.cruiseState.enabled = True if pt_cp.vl["Motor_2"]['GRA_Status'] in [1, 2] else False
# Update ACC setpoint. When the setpoint reads as 255, the driver has not
# yet established an ACC setpoint, so treat it as zero.
ret.cruiseState.speed = acc_cp.vl["ACC_GRA_Anziege"]['ACA_V_Wunsch'] * CV.KPH_TO_MS
if ret.cruiseState.speed > 70: # 255 kph in m/s == no current setpoint
ret.cruiseState.speed = 0
# Update control button states for turn signals and ACC controls.
self.buttonStates["accelCruise"] = bool(pt_cp.vl["GRA_neu"]['Kurz_Tip_up']) or bool(pt_cp.vl["GRA_neu"]['Lang_Tip_up'])
self.buttonStates["decelCruise"] = bool(pt_cp.vl["GRA_neu"]['Kurz_Tip_down']) or bool(pt_cp.vl["GRA_neu"]['Lang_Tip_down'])
self.buttonStates["cancel"] = bool(pt_cp.vl["GRA_neu"]['Abbrechen'])
self.buttonStates["setCruise"] = bool(pt_cp.vl["GRA_neu"]['Setzen'])
self.buttonStates["resumeCruise"] = bool(pt_cp.vl["GRA_neu"]['Wiederaufnahme'])
self.buttonStates["gapAdjustCruise"] = bool(pt_cp.vl["GRA_neu"]['Zeitlueckenverstellung'])
ret.leftBlinker = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Blinker_li'])
ret.rightBlinker = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Blinker_re'])
# Read ACC hardware button type configuration info that has to pass thru
# to the radar. Ends up being different for steering wheel buttons vs
# third stalk type controls.
# TODO: Check to see what info we need to passthru and spoof on PQ
self.graHauptschalter = pt_cp.vl["GRA_neu"]['Hauptschalter']
self.graTypHauptschalter = False
self.graButtonTypeInfo = False
self.graTipStufe2 = False
# Pick up the GRA_ACC_01 CAN message counter so we can sync to it for
# later cruise-control button spamming.
# FIXME: will need msg counter and checksum algo to spoof GRA_neu
self.graMsgBusCounter = 0
# Check to make sure the electric power steering rack is configured to
# accept and respond to HCA_01 messages and has not encountered a fault.
self.steeringFault = pt_cp.vl["Lenkhilfe_2"]['LH2_Sta_HCA'] not in [3, 5]
return ret
@staticmethod
def get_can_parser(CP):
def get_mqb_can_parser(CP):
# this function generates lists for signal, messages and initial values
signals = [
# sig_name, sig_address, default
("LWI_Lenkradwinkel", "LWI_01", 0), # Absolute steering angle
("LWI_VZ_Lenkradwinkel", "LWI_01", 0), # Steering angle sign
("EPS_Berechneter_LW", "LH_EPS_03", 0), # Absolute steering angle
("EPS_VZ_BLW", "LH_EPS_03", 0), # Steering angle sign
("LWI_Lenkradw_Geschw", "LWI_01", 0), # Absolute steering rate
("LWI_VZ_Lenkradw_Geschw", "LWI_01", 0), # Steering rate sign
("ESP_VL_Radgeschw_02", "ESP_19", 0), # ABS wheel speed, front left
@@ -134,25 +288,19 @@ class CarState(CarStateBase):
("ZV_HD_offen", "Gateway_72", 0), # Trunk or hatch open
("BH_Blinker_li", "Gateway_72", 0), # Left turn signal on
("BH_Blinker_re", "Gateway_72", 0), # Right turn signal on
("GE_Fahrstufe", "Getriebe_11", 0), # Auto trans gear selector position
("AB_Gurtschloss_FA", "Airbag_02", 0), # Seatbelt status, driver
("AB_Gurtschloss_BF", "Airbag_02", 0), # Seatbelt status, passenger
("ESP_Fahrer_bremst", "ESP_05", 0), # Brake pedal pressed
("ESP_Status_Bremsdruck", "ESP_05", 0), # Brakes applied
("ESP_Bremsdruck", "ESP_05", 0), # Brake pressure applied
("MO_Fahrpedalrohwert_01", "Motor_20", 0), # Accelerator pedal value
("MO_Kuppl_schalter", "Motor_14", 0), # Clutch switch
("Driver_Strain", "EPS_01", 0), # Absolute driver torque input
("Driver_Strain_VZ", "EPS_01", 0), # Driver torque input sign
("HCA_Ready", "EPS_01", 0), # Steering rack HCA support configured
("EPS_Lenkmoment", "LH_EPS_03", 0), # Absolute driver torque input
("EPS_VZ_Lenkmoment", "LH_EPS_03", 0), # Driver torque input sign
("EPS_HCA_Status", "LH_EPS_03", 0), # Steering rack ready to process HCA commands
("ESP_Tastung_passiv", "ESP_21", 0), # Stability control disabled
("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
("TSK_Fahrzeugmasse_02", "Motor_16", 0), # Estimated vehicle mass from drivetrain coordinator
("ACC_Status_ACC", "ACC_06", 0), # ACC engagement status
("ACC_Typ", "ACC_06", 0), # ACC type (follow to stop, stop&go)
("SetSpeed", "ACC_02", 0), # ACC set speed
("GRA_Hauptschalter", "GRA_ACC_01", 0), # ACC button, on/off
("GRA_Abbrechen", "GRA_ACC_01", 0), # ACC button, cancel
("GRA_Tip_Setzen", "GRA_ACC_01", 0), # ACC button, set
@@ -162,47 +310,185 @@ class CarState(CarStateBase):
("GRA_Verstellung_Zeitluecke", "GRA_ACC_01", 0), # ACC button, time gap adj
("GRA_Typ_Hauptschalter", "GRA_ACC_01", 0), # ACC main button type
("GRA_Tip_Stufe_2", "GRA_ACC_01", 0), # unknown related to stalk type
("GRA_Typ468", "GRA_ACC_01", 0), # Set/Resume button behavior as overloaded coast/accel??
("GRA_ButtonTypeInfo", "GRA_ACC_01", 0), # unknown related to stalk type
("COUNTER", "GRA_ACC_01", 0), # GRA_ACC_01 CAN message counter
]
checks = [
# sig_address, frequency
("LWI_01", 100), # From J500 Steering Assist with integrated sensors
("EPS_01", 100), # From J500 Steering Assist with integrated sensors
("ESP_19", 100), # From J104 ABS/ESP controller
("ESP_05", 50), # From J104 ABS/ESP controller
("ESP_21", 50), # From J104 ABS/ESP controller
("ACC_06", 50), # From J428 ACC radar control module
("Motor_20", 50), # From J623 Engine control module
("TSK_06", 50), # From J623 Engine control module
("GRA_ACC_01", 33), # From J??? steering wheel control buttons
("ACC_02", 17), # From J428 ACC radar control module
("Getriebe_11", 20), # From J743 Auto transmission control module
("Gateway_72", 10), # From J533 CAN gateway (aggregated data)
("Motor_14", 10), # From J623 Engine control module
("Airbag_02", 5), # From J234 Airbag control module
("Kombi_01", 2), # From J285 Instrument cluster
("Motor_16", 2), # From J623 Engine control module
("Einheiten_01", 1), # From J??? not known if gateway, cluster, or BCM
("LWI_01", 100), # From J500 Steering Assist with integrated sensors
("LH_EPS_03", 100), # From J500 Steering Assist with integrated sensors
("ESP_19", 100), # From J104 ABS/ESP controller
("ESP_05", 50), # From J104 ABS/ESP controller
("ESP_21", 50), # From J104 ABS/ESP controller
("Motor_20", 50), # From J623 Engine control module
("TSK_06", 50), # From J623 Engine control module
("GRA_ACC_01", 33), # From J??? steering wheel control buttons
("Gateway_72", 10), # From J533 CAN gateway (aggregated data)
("Airbag_02", 5), # From J234 Airbag control module
("Kombi_01", 2), # From J285 Instrument cluster
("Einheiten_01", 1), # From J??? not known if gateway, cluster, or BCM
]
if CP.transmissionType == TRANS.automatic:
signals += [("GE_Fahrstufe", "Getriebe_11", 0)] # Auto trans gear selector position
checks += [("Getriebe_11", 20)] # From J743 Auto transmission control module
elif CP.transmissionType == TRANS.direct:
signals += [("GearPosition", "EV_Gearshift", 0)] # EV gear selector position
checks += [("EV_Gearshift", 10)] # From J??? unknown EV control module
elif CP.transmissionType == TRANS.manual:
signals += [("MO_Kuppl_schalter", "Motor_14", 0), # Clutch switch
("BCM1_Rueckfahrlicht_Schalter", "Gateway_72", 0)] # Reverse light from BCM
checks += [("Motor_14", 10)] # From J623 Engine control module
if CP.networkLocation == NWL.fwdCamera:
# Extended CAN devices other than the camera are here on CANBUS.pt
# FIXME: gate SWA_01 checks on module being detected, and reduce duplicate network location code
signals += [("AWV2_Priowarnung", "ACC_10", 0), # FCW related
("AWV2_Freigabe", "ACC_10", 0), # FCW related
("ANB_Teilbremsung_Freigabe", "ACC_10", 0), # AEB related
("ANB_Zielbremsung_Freigabe", "ACC_10", 0), # AEB related
("SWA_Infostufe_SWA_li", "SWA_01", 0), # Blindspot object info, left
("SWA_Warnung_SWA_li", "SWA_01", 0), # Blindspot object warning, left
("SWA_Infostufe_SWA_re", "SWA_01", 0), # Blindspot object info, right
("SWA_Warnung_SWA_re", "SWA_01", 0), # Blindspot object warning, right
("ACC_Wunschgeschw", "ACC_02", 0)] # ACC set speed
checks += [("ACC_10", 50), # From J428 ACC radar control module
# FIXME: SWA_01 should be checked when we have better detection of installed hardware
#("SWA_01", 20), # From J1086 Lane Change Assist module
("ACC_02", 17)] # From J428 ACC radar control module
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.pt)
# A single signal is monitored from the camera CAN bus, and then ignored,
# so the presence of CAN traffic can be verified with cam_cp.valid.
@staticmethod
def get_cam_can_parser(CP):
def get_pq_can_parser(CP):
signals = [
# sig_name, sig_address, default
("Kombi_Lamp_Green", "LDW_02", 0), # Lane Assist status LED
("LH3_BLW", "Lenkhilfe_3", 0), # Absolute steering angle
("LH3_BLWSign", "Lenkhilfe_3", 0), # Steering angle sign
("LH3_LM", "Lenkhilfe_3", 0), # Absolute driver torque input
("LH3_LMSign", "Lenkhilfe_3", 0), # Driver torque input sign
("LH2_Sta_HCA", "Lenkhilfe_2", 0), # Steering rack HCA status
("Lenkradwinkel_Geschwindigkeit", "Lenkwinkel_1", 0), # Absolute steering rate
("Lenkradwinkel_Geschwindigkeit_S", "Lenkwinkel_1", 0), # Steering rate sign
("Radgeschw__VL_4_1", "Bremse_3", 0), # ABS wheel speed, front left
("Radgeschw__VR_4_1", "Bremse_3", 0), # ABS wheel speed, front right
("Radgeschw__HL_4_1", "Bremse_3", 0), # ABS wheel speed, rear left
("Radgeschw__HR_4_1", "Bremse_3", 0), # ABS wheel speed, rear right
("Giergeschwindigkeit", "Bremse_5", 0), # Absolute yaw rate
("Vorzeichen_der_Giergeschwindigk", "Bremse_5", 0), # Yaw rate sign
("GK1_Fa_Tuerkont", "Gate_Komf_1", 0), # Door open, driver
# TODO: locate passenger and rear door states
("GK1_Blinker_li", "Gate_Komf_1", 0), # Left turn signal on
("GK1_Blinker_re", "Gate_Komf_1", 0), # Right turn signal on
("Gurtschalter_Fahrer", "Airbag_1", 0), # Seatbelt status, driver
("Gurtschalter_Beifahrer", "Airbag_1", 0), # Seatbelt status, passenger
("Bremstestschalter", "Motor_2", 0), # Brake pedal pressed (brake light test switch)
("Bremslichtschalter", "Motor_2", 0), # Brakes applied (brake light switch)
("Bremsdruck", "Bremse_5", 0), # Brake pressure applied
("Vorzeichen_Bremsdruck", "Bremse_5", 0), # Brake pressure applied sign (???)
("Fahrpedal_Rohsignal", "Motor_3", 0), # Accelerator pedal value
("ESP_Passiv_getastet", "Bremse_1", 0), # Stability control disabled
("MFA_v_Einheit_02", "Einheiten_1", 0), # MPH vs KMH speed display
("Bremsinfo", "Kombi_1", 0), # Manual handbrake applied
("GRA_Status", "Motor_2", 0), # ACC engagement status
("Hauptschalter", "GRA_neu", 0), # ACC button, on/off
("Abbrechen", "GRA_neu", 0), # ACC button, cancel
("Setzen", "GRA_neu", 0), # ACC button, set
("Lang_Tip_up", "GRA_neu", 0), # ACC button, increase or accel, long press
("Lang_Tip_down", "GRA_neu", 0), # ACC button, decrease or decel, long press
("Kurz_Tip_up", "GRA_neu", 0), # ACC button, increase or accel, short press
("Kurz_Tip_down", "GRA_neu", 0), # ACC button, decrease or decel, short press
("Wiederaufnahme", "GRA_neu", 0), # ACC button, resume
("Zeitlueckenverstellung", "GRA_neu", 0), # ACC button, time gap adj
]
checks = [
# sig_address, frequency
("LDW_02", 10) # From R242 Driver assistance camera
("Bremse_3", 100), # From J104 ABS/ESP controller
("Lenkhilfe_3", 100), # From J500 Steering Assist with integrated sensors
("Lenkwinkel_1", 100), # From J500 Steering Assist with integrated sensors
("Motor_3", 100), # From J623 Engine control module
("Airbag_1", 50), # From J234 Airbag control module
("Bremse_5", 50), # From J104 ABS/ESP controller
("GRA_neu", 50), # From J??? steering wheel control buttons
("Kombi_1", 50), # From J285 Instrument cluster
("Motor_2", 50), # From J623 Engine control module
("Lenkhilfe_2", 20), # From J500 Steering Assist with integrated sensors
("Gate_Komf_1", 10), # From J533 CAN gateway
("Einheiten_1", 1), # From J??? cluster or gateway
]
if CP.transmissionType == TRANS.automatic:
signals += [("Waehlhebelposition__Getriebe_1_", "Getriebe_1", 0)] # Auto trans gear selector position
checks += [("Getriebe_1", 100)] # From J743 Auto transmission control module
elif CP.transmissionType == TRANS.manual:
signals += [("Kupplungsschalter", "Motor_1", 0), # Clutch switch
("GK1_Rueckfahr", "Gate_Komf_1", 0)] # Reverse light from BCM
checks += [("Motor_1", 100)] # From J623 Engine control module
if CP.networkLocation == NWL.fwdCamera:
# The ACC radar is here on CANBUS.pt
signals += [("ACA_V_Wunsch", "ACC_GRA_Anziege", 0)] # ACC set speed
checks += [("ACC_GRA_Anziege", 25)] # From J428 ACC radar control module
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.pt)
@staticmethod
def get_mqb_cam_can_parser(CP):
# FIXME: gate LDW_02 checks on module being detected
signals = [
# sig_name, sig_address, default
("LDW_SW_Warnung_links", "LDW_02", 0), # Blind spot in warning mode on left side due to lane departure
("LDW_SW_Warnung_rechts", "LDW_02", 0), # Blind spot in warning mode on right side due to lane departure
("LDW_Seite_DLCTLC", "LDW_02", 0), # Direction of most likely lane departure (left or right)
("LDW_DLC", "LDW_02", 0), # Lane departure, distance to line crossing
("LDW_TLC", "LDW_02", 0), # Lane departure, time to line crossing
]
checks = [
# sig_address, frequency
# FIXME: LDW_02 should be checked when we have better detection of installed hardware
#("LDW_02", 10), # From R242 Driver assistance camera
]
if CP.networkLocation == NWL.gateway:
# All Extended CAN devices are here on CANBUS.cam
# FIXME: gate SWA_01 checks on module being detected, and reduce duplicate network location code
signals += [("AWV2_Priowarnung", "ACC_10", 0), # FCW related
("AWV2_Freigabe", "ACC_10", 0), # FCW related
("ANB_Teilbremsung_Freigabe", "ACC_10", 0), # AEB related
("ANB_Zielbremsung_Freigabe", "ACC_10", 0), # AEB related
("SWA_Infostufe_SWA_li", "SWA_01", 0), # Blindspot object info, left
("SWA_Warnung_SWA_li", "SWA_01", 0), # Blindspot object warning, left
("SWA_Infostufe_SWA_re", "SWA_01", 0), # Blindspot object info, right
("SWA_Warnung_SWA_re", "SWA_01", 0), # Blindspot object warning, right
("ACC_Wunschgeschw", "ACC_02", 0)] # ACC set speed
checks += [("ACC_10", 50), # From J428 ACC radar control module
# FIXME: SWA_01 should be checked when we have better detection of installed hardware
#("SWA_01", 20), # From J1086 Lane Change Assist module
("ACC_02", 17)] # From J428 ACC radar control module
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.cam)
@staticmethod
def get_pq_cam_can_parser(CP):
# TODO: Need to monitor LKAS camera, if present, for TLC/DLC/warning signals for passthru to SWA
signals = []
checks = []
if CP.networkLocation == NWL.gateway:
# The ACC radar is here on CANBUS.cam
signals += [("ACA_V_Wunsch", "ACC_GRA_Anziege", 0)] # ACC set speed
checks += [("ACC_GRA_Anziege", 25)] # From J428 ACC radar control module
checks = []
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.cam)

View File

@@ -1,9 +1,9 @@
from cereal import car
from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES
from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES, NWL, TRANS, GEAR, MQB_CARS, PQ_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
GEAR = car.CarState.GearShifter
EventName = car.CarEvent.EventName
class CarInterface(CarInterfaceBase):
@@ -11,8 +11,20 @@ class CarInterface(CarInterfaceBase):
super().__init__(CP, CarController, CarState)
self.displayMetricUnitsPrev = None
self.gas_pressed_prev = False
self.brake_pressed_prev = False
self.cruise_enabled_prev = False
self.low_speed_alert = False
self.buttonStatesPrev = BUTTON_STATES.copy()
# Set up an alias to PT/CAM parser for ACC depending on its detected network location
self.cp_acc = self.cp if CP.networkLocation == NWL.fwdCamera else self.cp_cam
# timebomb_counter mod
self.timebomb_counter = 0
self.wheel_grabbed = False
self.timebomb_bypass_counter = 0
@staticmethod
def compute_gb(accel, speed):
return float(accel) / 4.0
@@ -21,34 +33,66 @@ class CarInterface(CarInterfaceBase):
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
# VW port is a community feature, since we don't own one to test
ret.communityFeature = True
# Set global default parameters
ret.radarOffCan = True
ret.enableCamera = True # Stock camera detection doesn't apply to VW
ret.steerRateCost = 1.0
ret.steerActuatorDelay = 0.05 # Hopefully all racks are similar here
ret.steerLimitTimer = 0.4
if candidate == CAR.GOLF:
# Set common MQB parameters that will apply globally
ret.carName = "volkswagen"
ret.radarOffCan = True
# Override these per-car as necessary
ret.lateralTuning.pid.kpBP = [0.]
ret.lateralTuning.pid.kiBP = [0.]
ret.lateralTuning.pid.kpV = [0.6]
ret.lateralTuning.pid.kiV = [0.2]
ret.lateralTuning.pid.kf = 0.00006
# PER-PLATFORM PARAMETERS - DO NOT EDIT HERE TO TUNE INDIVIDUAL VEHICLES
ret.carName = "volkswagen"
if candidate in MQB_CARS:
# Configurations shared between all MQB vehicles
ret.safetyModel = car.CarParams.SafetyModel.volkswagen
# Additional common MQB parameters that may be overridden per-vehicle
ret.steerRateCost = 1.0
ret.steerActuatorDelay = 0.05 # Hopefully all MQB racks are similar here
ret.steerLimitTimer = 0.4
# Determine installed network location and trans type from fingerprint
ret.networkLocation = NWL.fwdCamera if 0x122 in fingerprint[0] else NWL.gateway
if 0xAD in fingerprint[0]: # Getriebe_11
ret.transmissionType = TRANS.automatic
elif 0x187 in fingerprint[0]: # EV_Gearshift
ret.transmissionType = TRANS.direct
else: # No trans at all
ret.transmissionType = TRANS.manual
ret.lateralTuning.pid.kpBP = [0.]
ret.lateralTuning.pid.kiBP = [0.]
elif candidate in PQ_CARS:
# Configurations shared between all PQ35/PQ46/NMS vehicles
ret.safetyModel = car.CarParams.SafetyModel.volkswagenPq
ret.mass = 1500 + STD_CARGO_KG
# Determine installed network location and trans type from fingerprint
ret.networkLocation = NWL.fwdCamera if 0x368 in fingerprint[0] else NWL.gateway
if 0x440 in fingerprint[0]: # Getriebe_1
ret.transmissionType = TRANS.automatic
else: # No trans at all
ret.transmissionType = TRANS.manual
# PER-VEHICLE PARAMETERS - EDIT HERE TO TUNE INDIVIDUAL VEHICLES
if candidate == CAR.GENERICMQB:
# FIXME: Defaulting to VW Golf Mk7 as a baseline.
ret.mass = 1500 + STD_CARGO_KG # Average, varies on trim/package
ret.wheelbase = 2.64
ret.centerToFront = ret.wheelbase * 0.45
ret.centerToFront = ret.wheelbase * 0.45 # Estimated
ret.steerRatio = 15.6
ret.lateralTuning.pid.kf = 0.00006
ret.lateralTuning.pid.kpV = [0.6]
ret.lateralTuning.pid.kiV = [0.2]
tire_stiffness_factor = 1.0
ret.enableCamera = True # Stock camera detection doesn't apply to VW
ret.transmissionType = car.CarParams.TransmissionType.automatic
elif candidate == CAR.GENERICPQ:
ret.mass = 1375 + STD_CARGO_KG # Average, varies on trim/package
ret.wheelbase = 2.58
ret.centerToFront = ret.wheelbase * 0.45 # Estimated
ret.steerRatio = 15.6
tire_stiffness_factor = 1.0
# dp
ret = common_interface_get_params_lqr(ret)
# TODO: get actual value, for now starting with reasonable value for
# civic and scaling by mass and wheelbase
@@ -62,7 +106,7 @@ class CarInterface(CarInterfaceBase):
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
@@ -71,7 +115,14 @@ class CarInterface(CarInterfaceBase):
self.cp.update_strings(can_strings)
self.cp_cam.update_strings(can_strings)
ret = self.CS.update(self.cp)
ret = self.CS.update(self.cp, self.cp_cam, self.cp_acc, self.CP.transmissionType)
ret.canValid = self.cp.can_valid # FIXME: Restore cp_cam valid check after proper LKAS camera detect
ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False
# 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
@@ -98,10 +149,44 @@ class CarInterface(CarInterfaceBase):
if self.CS.steeringFault:
events.add(EventName.steerTempUnavailable)
# 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.dpTimebombAssist:
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.gas_pressed_prev = ret.gasPressed
self.brake_pressed_prev = ret.brakePressed
self.cruise_enabled_prev = ret.cruiseState.enabled
self.displayMetricUnitsPrev = self.CS.displayMetricUnits
self.buttonStatesPrev = self.CS.buttonStates.copy()
@@ -113,6 +198,6 @@ class CarInterface(CarInterfaceBase):
c.hudControl.visualAlert,
c.hudControl.audibleAlert,
c.hudControl.leftLaneVisible,
c.hudControl.rightLaneVisible)
c.hudControl.rightLaneVisible, self.dragonconf)
self.frame += 1
return can_sends

View File

@@ -1,6 +1,7 @@
# flake8: noqa
from selfdrive.car import dbc_dict
from cereal import car
class CarControllerParams:
HCA_STEP = 2 # HCA_01 message frequency 50Hz
@@ -24,6 +25,10 @@ class CANBUS:
pt = 0
cam = 2
NWL = car.CarParams.NetworkLocation
TRANS = car.CarParams.TransmissionType
GEAR = car.CarState.GearShifter
BUTTON_STATES = {
"accelCruise": False,
"decelCruise": False,
@@ -46,15 +51,35 @@ MQB_LDW_MESSAGES = {
}
class CAR:
GOLF = "VOLKSWAGEN GOLF"
GENERICMQB = "Generic Volkswagen MQB Platform Vehicle"
GENERICPQ = "Generic Volkswagen PQ35/PQ46/NMS Platform Vehicle"
# Mega-fingerprint used to identify any and all MQB platform vehicles. Specific
# make and model characteristics are looked up from the VIN later.
# Note: 1471:8 observed as 1471:4 on a 2019 Jetta, and we can't carry both in one FP, effect TBD
FINGERPRINTS = {
CAR.GOLF: [
# 76b83eb0245de90e|2019-10-21--17-40-42 - jyoung8607 car
{64: 8, 134: 8, 159: 8, 173: 8, 178: 8, 253: 8, 257: 8, 260: 8, 262: 8, 264: 8, 278: 8, 279: 8, 283: 8, 286: 8, 288: 8, 289: 8, 290: 8, 294: 8, 299: 8, 302: 8, 346: 8, 385: 8, 418: 8, 427: 8, 668: 8, 679: 8, 681: 8, 695: 8, 779: 8, 780: 8, 783: 8, 792: 8, 795: 8, 804: 8, 806: 8, 807: 8, 808: 8, 809: 8, 870: 8, 896: 8, 897: 8, 898: 8, 901: 8, 917: 8, 919: 8, 949: 8, 958: 8, 960: 4, 981: 8, 987: 8, 988: 8, 991: 8, 997: 8, 1000: 8, 1019: 8, 1120: 8, 1122: 8, 1123: 8, 1124: 8, 1153: 8, 1162: 8, 1175: 8, 1312: 8, 1385: 8, 1413: 8, 1440: 5, 1514: 8, 1515: 8, 1520: 8, 1600: 8, 1601: 8, 1603: 8, 1605: 8, 1624: 8, 1626: 8, 1629: 8, 1631: 8, 1646: 8, 1648: 8, 1712: 6, 1714: 8, 1716: 8, 1717: 8, 1719: 8, 1720: 8, 1721: 8
}],
CAR.GENERICMQB: [
{178: 8, 1600: 8, 1601: 8, 1603: 8, 1605: 8, 695: 8, 1624: 8, 1626: 8, 1629: 8, 1631: 8, 1122: 8, 1123: 8, 1124: 8, 1646: 8, 1648: 8, 1153: 8, 134: 8, 1162: 8, 1175: 8, 159: 8, 795: 8, 679: 8, 681: 8, 173: 8, 1712: 6, 1714: 8, 1716: 8, 1717: 8, 1719: 8, 1720: 8, 1721: 8, 1312: 8, 806: 8, 253: 8, 1792: 8, 257: 8, 260: 8, 262: 8, 897: 8, 264: 8, 779: 8, 780: 8, 783: 8, 278: 8, 279: 8, 792: 8, 283: 8, 285: 8, 286: 8, 901: 8, 288: 8, 289: 8, 290: 8, 804: 8, 294: 8, 807: 8, 808: 8, 809: 8, 299: 8, 302: 8, 1351: 8, 346: 8, 870: 8, 1385: 8, 896: 8, 64: 8, 898: 8, 1413: 8, 917: 8, 919: 8, 927: 8, 1440: 5, 929: 8, 930: 8, 427: 8, 949: 8, 958: 8, 960: 4, 418: 8, 981: 8, 987: 8, 988: 8, 991: 8, 997: 8, 1000: 8, 1514: 8, 1515: 8, 1520: 8, 1019: 8, 385: 8, 668: 8, 1120: 8, 1438: 8, 1461: 8, 391: 8, 1511: 8, 1516: 8, 568: 8, 569: 8, 826: 8, 827: 8, 1156: 8, 1157: 8, 1158: 8, 1471: 8, 1635: 8, 376: 8, 295: 8, 791: 8, 799: 8, 838: 8, 389: 8, 840: 8, 841: 8, 842: 8, 843: 8, 844: 8, 845: 8, 314: 8, 787: 8, 788: 8, 789: 8, 802: 8, 839: 8, 1332: 8, 1872: 8, 1976: 8, 1977: 8, 1985: 8, 2015: 8, 592: 8, 593: 8, 594: 8, 595: 8, 596: 8, 684: 8, 572:8, 573: 8, 828: 8, 913: 8},
# 2018 skoda kodiaq from @Gold
{64: 8, 134: 8, 159: 8, 173: 8, 178: 8, 253: 8, 257: 8, 260: 8, 262: 8, 278: 8, 279: 8, 283: 8, 286: 8, 288: 8, 289: 8, 290: 8, 294: 8, 299: 8, 302: 8, 346: 8, 385: 8, 418: 8, 427: 8, 573: 8, 668: 8, 679: 8, 681: 8, 684: 8, 695: 8, 779: 8, 780: 8, 783: 8, 792: 8, 795: 8, 804: 8, 806: 8, 807: 8, 808: 8, 809: 8, 828: 8, 870: 8, 896: 8, 897: 8, 898: 8, 901: 8, 917: 8, 919: 8, 949: 8, 958: 8, 960: 4, 981: 8, 987: 8, 988: 8, 991: 8, 997: 8, 1000: 8, 1019: 8, 1120: 8, 1153: 8, 1162: 8, 1175: 8, 1312: 8, 1385: 8, 1413: 8, 1440: 5, 1514: 8, 1515: 8, 1520: 8, 1529: 8, 1600: 8, 1601: 8, 1603: 8, 1605: 8, 1624: 8, 1626: 8, 1629: 8, 1631: 8, 1646: 8, 1648: 8, 1712: 6, 1714: 8, 1716: 8, 1717: 8, 1719: 8, 1720: 8, 1721: 8 }
],
CAR.GENERICPQ: [
# kamold, Edgy, austinc3030, Roy_001
{80: 4, 194: 8, 208: 6, 210: 5, 294: 8, 416: 8, 428: 8, 640: 8, 648: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 919: 8, 928: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1651: 3, 1652: 8, 1654: 2, 1658: 4, 1691: 3, 1736: 2, 1757: 8, 1824: 7, 1845: 7, 2000: 8, 1420: 8},
# cd (powertrain CAN direct)
{16: 7, 17: 7, 80: 4, 174: 8, 194: 8, 208: 6, 416: 8, 428: 8, 640: 8, 648: 8, 672: 8, 800: 8, 896: 8, 906: 4, 912: 8, 914: 8, 915: 8, 919: 8, 928: 8, 946: 8, 976: 6, 978: 7, 1056: 8, 1152: 8, 1160: 8, 1162: 8, 1164: 8, 1175: 8, 1184: 8, 1192: 8, 1306: 8, 1312: 8, 1344: 8, 1360: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1416: 8, 1420: 8, 1423: 8, 1440: 8, 1463: 8, 1488: 8, 1490: 8, 1494: 2, 1500: 8, 1504: 8, 1523: 8, 1527: 4, 1654: 2, 1658: 2, 1754: 8, 1824: 7, 1827: 7, 2000: 8},
{80: 4, 194: 8, 208: 6, 210: 5, 416: 8, 428: 8, 640: 8, 648: 8, 695: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 928: 8, 954: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1650: 8, 1651: 4, 1652: 8, 1691: 4, 1757: 3, 1824: 7, 1845: 7, 2000: 8},
{80: 4, 194: 8, 208: 6, 210: 5, 416: 8, 428: 8, 640: 8, 648: 8, 695: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 928: 8, 954: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1650: 5, 1651: 3, 1652: 8, 1691: 3, 1736: 2, 1757: 8, 1824: 7, 1845: 7, 2000: 8},
{80: 4, 194: 8, 208: 6, 210: 5, 416: 8, 428: 8, 640: 8, 648: 8, 695: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 928: 8, 954: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1650: 4, 1651: 3, 1652: 8, 1691: 2, 1736: 2, 1757: 3, 1824: 7, 1845: 7, 2000: 8},
],
}
MQB_CARS = [CAR.GENERICMQB]
PQ_CARS = [CAR.GENERICPQ]
DBC = {
CAR.GOLF: dbc_dict('vw_mqb_2010', None),
CAR.GENERICMQB: dbc_dict('vw_mqb_2010', None),
CAR.GENERICPQ: dbc_dict('vw_golf_mk4', None),
}

View File

@@ -1,36 +1,39 @@
# CAN controls for MQB platform Volkswagen, Audi, Skoda and SEAT.
# PQ35/PQ46/NMS, and any future MLB, to come later.
# ----------------------------------------------------------------------- #
# #
# CAN message packing for MQB vehicles #
# #
# ----------------------------------------------------------------------- #
def create_mqb_steering_control(packer, bus, apply_steer, idx, lkas_enabled):
values = {
"SET_ME_0X3": 0x3,
"Assist_Torque": abs(apply_steer),
"Assist_Requested": lkas_enabled,
"Assist_VZ": 1 if apply_steer < 0 else 0,
"HCA_Available": 1,
"HCA_Standby": not lkas_enabled,
"HCA_Active": lkas_enabled,
"SET_ME_0XFE": 0xFE,
"SET_ME_0X07": 0x07,
"HCA_System_Status": 0x3,
"LM_Offset": abs(apply_steer),
"LM_Offset_Valid": lkas_enabled,
"LM_Offsign": 1 if apply_steer < 0 else 0,
"HCA_Control_Status": 0x5 if lkas_enabled else 0x3,
}
return packer.make_can_msg("HCA_01", bus, values, idx)
def create_mqb_hud_control(packer, bus, hca_enabled, steering_pressed, hud_alert, leftLaneVisible, rightLaneVisible):
def create_mqb_hud_control(packer, bus, hca_enabled, steering_pressed, hud_alert, left_lane_visible, right_lane_visible,
ldw_lane_warning_left, ldw_lane_warning_right, ldw_side_dlc_tlc, ldw_dlc, ldw_tlc):
if hca_enabled:
leftlanehud = 3 if leftLaneVisible else 1
rightlanehud = 3 if rightLaneVisible else 1
left_lane_hud = 3 if left_lane_visible else 1
right_lane_hud = 3 if right_lane_visible else 1
else:
leftlanehud = 2 if leftLaneVisible else 1
rightlanehud = 2 if rightLaneVisible else 1
left_lane_hud = 2 if left_lane_visible else 1
right_lane_hud = 2 if right_lane_visible else 1
values = {
"LDW_Unknown": 2, # FIXME: possible speed or attention relationship
"Kombi_Lamp_Orange": 1 if hca_enabled and steering_pressed else 0,
"Kombi_Lamp_Green": 1 if hca_enabled and not steering_pressed else 0,
"Left_Lane_Status": leftlanehud,
"Right_Lane_Status": rightlanehud,
"Alert_Message": hud_alert,
"LDW_Status_LED_gelb": 1 if hca_enabled and steering_pressed else 0,
"LDW_Status_LED_gruen": 1 if hca_enabled and not steering_pressed else 0,
"LDW_SW_Info_links": left_lane_hud,
"LDW_SW_Info_rechts": right_lane_hud,
"LDW_Texte": hud_alert,
"LDW_SW_Warnung_links": ldw_lane_warning_left,
"LDW_SW_Warnung_rechts": ldw_lane_warning_right,
"LDW_Seite_DLCTLC": ldw_side_dlc_tlc,
"LDW_DLC": ldw_dlc,
"LDW_TLC": ldw_tlc
}
return packer.make_can_msg("LDW_02", bus, values)
@@ -46,6 +49,49 @@ def create_mqb_acc_buttons_control(packer, bus, buttonStatesToSend, CS, idx):
"GRA_Typ_Hauptschalter": CS.graTypHauptschalter,
"GRA_Codierung": 2,
"GRA_Tip_Stufe_2": CS.graTipStufe2,
"GRA_Typ468": CS.graTyp468,
"GRA_ButtonTypeInfo": CS.graButtonTypeInfo
}
return packer.make_can_msg("GRA_ACC_01", bus, values, idx)
# ----------------------------------------------------------------------- #
# #
# CAN message packing for PQ35/PQ46/NMS vehicles #
# #
# ----------------------------------------------------------------------- #
def create_pq_steering_control(packer, bus, apply_steer, idx, lkas_enabled):
values = {
"HCA_Zaehler": idx,
"LM_Offset": abs(apply_steer),
"LM_OffSign": 1 if apply_steer < 0 else 0,
"HCA_Status": 5 if (lkas_enabled and apply_steer != 0) else 3,
"Vib_Freq": 16,
}
dat = packer.make_can_msg("HCA_1", bus, values)[2]
values["HCA_Checksumme"] = dat[1] ^ dat[2] ^ dat[3] ^ dat[4]
return packer.make_can_msg("HCA_1", bus, values)
def create_pq_hud_control(packer, bus, hca_enabled, steering_pressed, hud_alert, left_lane_visible, right_lane_visible,
ldw_lane_warning_left, ldw_lane_warning_right, ldw_side_dlc_tlc, ldw_dlc, ldw_tlc):
if hca_enabled:
left_lane_hud = 3 if left_lane_visible else 1
right_lane_hud = 3 if right_lane_visible else 1
else:
left_lane_hud = 2 if left_lane_visible else 1
right_lane_hud = 2 if right_lane_visible else 1
values = {
"Right_Lane_Status": right_lane_hud,
"Left_Lane_Status": left_lane_hud,
"SET_ME_X1": 1,
"Kombi_Lamp_Orange": 1 if hca_enabled and steering_pressed else 0,
"Kombi_Lamp_Green": 1 if hca_enabled and not steering_pressed else 0,
}
return packer.make_can_msg("LDW_1", bus, values)
pass
def create_pq_acc_buttons_control(packer, bus, buttonStatesToSend, CS, idx):
pass

View File

@@ -37,6 +37,17 @@ extern "C" void framebuffer_swap(FramebufferState *s) {
assert(glGetError() == GL_NO_ERROR);
}
extern "C" void framebuffer_swap_layer(FramebufferState *s, int32_t layer) {
status_t status;
SurfaceComposerClient::openGlobalTransaction();
status = s->control->setLayer(layer);
SurfaceComposerClient::closeGlobalTransaction();
assert(status == 0);
s->s = s->control->getSurface();
assert(s->s != NULL);
}
extern "C" bool set_brightness(int brightness) {
char bright[64];
snprintf(bright, sizeof(bright), "%d", brightness);

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