Compare commits

...

3 Commits

Author SHA1 Message Date
Kumar
9ba9cc0cd3 Merge pull request #103 from wer5lcy/0.8.8
Re-tune DP Accel Profile
2021-09-22 07:53:51 -07:00
wer5lcy
7de523b8a2 Re-tune Accel Profile
Acceleration profile is tuned to fit the 98HP 8ZR-FXE engine. 
- The normal mode uses the whole ECO range, so that the engine won't roar.
- The eco mode uses 70% of the ECO range, providing best fuel effiency.
- The sport mode uses the full engine power. 
Acceleration profile is not always working, my car could still accelerate 1.8m/s^2 on 30-50km/h through the set value is 1.4m/s^2.

Deceleration profile is changed such that the car could stop at static vehicles before traffic lights. 
- In previous version, using both accel profile "ECO" and following profile "1.2s" could cause your car unable to stop.
- The default max deceleration is 1.2m/s^2 in stock openpilot, any value in the custom profile should be no less than 1.2 unless necessary.
2021-09-22 16:21:34 +08:00
Kumar
1412691630 dragonpilot mod for 0.8.8-2 2021-09-11 06:43:38 -07:00
316 changed files with 18596 additions and 8878 deletions

2
.gitignore vendored
View File

@@ -41,8 +41,6 @@ selfdrive/boardd/boardd
selfdrive/logcatd/logcatd
selfdrive/mapd/default_speeds_by_region.json
selfdrive/proclogd/proclogd
selfdrive/ui/_ui
selfdrive/ui/_soundd
selfdrive/test/longitudinal_maneuvers/out
selfdrive/visiond/visiond
selfdrive/loggerd/loggerd

730
CHANGELOGS-DEV.md Normal file
View File

@@ -0,0 +1,730 @@
dragonpilot 0.8.8-2
========================
* ADDED: newer faster and modularized mapd and slow down for curve. (Thanks to @move-fast)
* ADDED: Street name on the bottom bar.
* ADDED: Now supports 1+3t / C2 / C3 / Jetson Xavier NX.
* ADDED: Smoother tune for PRIUS_TSS2.
* Bug fixes.
dragonpilot 0.8.8-1
========================
** BETA TESTING ONLY **
* Based on openpilot 0.8.8 devel.
* FIXED: dashcam issue.
* FIXED: some VW vehicles issue. (Thanks to @yayism)
* FIXED: white panda + j533 acc issue. (Thanks to @lirudy)
* ADDED: Auto fake black panda.
* ADDED: 2018 chinese camry hybrid fingerprint (Thanks to @stingshen)
* WIP: mapd.
dragonpilot 0.8.7-4
========================
* 2017 JADE w/ Added Comma Pedal Support. (Thanks to @lijunhao731)
* Fixed toyota / honda brake light display. (Thanks to @loveloveses)
* Fixed UI toggle. (Thanks to @鄧育林@謝聖鴻)
* Fixed VW resume/display issue. (Thanks to @SKY)
* Fixed CJK font installation issue.
dragonpilot 0.8.7-3
========================
* Bug fixes.
* Fixed gpxd.
* Added some Chinese support.
dragonpilot 0.8.7-2
========================
* Fixed sound issue.
* Changed gpx logs to OSM compatible format.
* HONDA: Added BSM support for CRV-Hybrid.
* HONDA: Added toggle to force displaying km/h in HUD.
* TOYOTA: Add new Toggles under DP - Cars to enable/disable Following Modes / Accel Modes with physical button feature.
dragonpilot 0.8.7-1
========================
* Based on openpilot 0.8.7 devel.
* Support 1+3t / C2 / Jetson Xavier NX.
* Support White / Grey Panda.
* TOYOTA: Can now change Following Modes with physical button from the steering wheel.
* TOYOTA: Can now change Acceleration Modes with physical button if your car supports it.
* TOYOTA: Added Low speed override toggles.
* Dev UI now displays RPM reading.
* Added Prebuilt toggle for faster boot.
* Lexus RX high RPM fix. (Thanks to @crazysim).
* Added toggle to launch Language settings.
* Added toggle to launch Volume settings.
* Added toggle to launch date/time settings.
* Added toggle to flash panda.
* Added toggle to recover panda firmware.
* Added toggle to delete logging (/sdcard/realdata).
* Added GPS Logger.
dragonpilot 0.8.6-1
========================
* Based on openpilot 0.8.6 devel.
* Support 1+3t / C2 / Jetson Xavier NX.
* Support White / Grey Panda.
dragonpilot 0.8.5-4
========================
* Added multiple toggles.
* Code clean up.
* Android app support. (see selfdrive/dragonpilot/HOWTO-APPD.md)
* Better support for VW MPQ (Thanks to @Saber)
dragonpilot 0.8.5-3
========================
* Added Jetson support toggle.
* Added Steering Ratio controller.
* Reduce Following Profile to 3 modes only. (1.8s / 1.5s / 1.2s)
* Bug fixes.
dragonpilot 0.8.5-2
========================
* Added black panda simulation toggle.
* Added No GPS toggle.
* Added No Battery Toggle.
* Bug fixes.
dragonpilot 0.8.5-1
========================
* Based on openpilot 0.8.5 devel.
* 基於 openpilot 0.8.5 devel.
* Support 1+3t / C2 / Jetson Xavier NX.
* 支持 1+3t / C2 / Jetson Xavier NX.
* No White/Grey Panda Support.
* 不支持白灰熊.
dragonpilot 0.8.4-3
========================
* 簡化 1+3t 安裝方法. (請查閱 HOWTO-ONEPLUS.md)
* Simplied 1+3t installation. (See HOWTO-ONEPLUS.md)
* 加回舊 ssh 登錄.
* Good old ssh key.
* 修復本田錯誤. (感謝 @loveloveses)
* Fixed Honda bug. (Thanks to @loveloveses)
dragonpilot 0.8.4-2
========================
* 加回可調整加速/跟車設定.
* Added back Accel/Following Profile.
* 支持 Headless Jetson Xavier NX (https://github.com/efinilan/xnxpilot.git)
* Support Headless Jetson Xavier NX (https://github.com/efinilan/xnxpilot.git)
* 支持 1+3t (需額外安裝手續)
* Support 1+3t (Require additional install procedure)
* 支持白/灰熊
* Support White/Grey Panda.
dragonpilot 0.8.4-1
========================
* 基於 openpilot 0.8.4 devel.
* Based on openpilot 0.8.4 devel.
dragonpilot 0.8.1
========================
* 基於最新 openpilot 0.8.1 devel.
* Based on latest openpilot 0.8.1 devel.
* 加入行車記錄按鈕。(感謝 @toyboxZ 提供)
* Added REC screen button. (Thanks to @toyboxZ)
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] 自動關機改為可調時長。

37
CONTRIBUTORS.md Normal file
View File

@@ -0,0 +1,37 @@
# CONTRIBUTORS
Due to the way we manage the source code, it is not possible to see all the contributors' info, hence we create a list here.
If you have contributed to DP project before and your name is not listed here, feel free to send us a PR to update this!
### TEAM
Name | github | Role
------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------
cafe | [cafe](https://github.com/coffice12) | Resource Provider
cgw1968 | [cgw1968](https://github.com/cgw1968-5779) | C2/C3 Toyota Beta Tester
kumar | [rav4kumar](https://github.com/rav4kumar) | Release Maintainer
loveloveses | [loveloveses](https://github.com/loveloveses) | Wiki Maintainer
Rick Lan | [efinilan](https://github.com/efinilan) | Release Maintainer
Stupefacient | [Stupefacient](https://github.com/Stupefacient) | C2/C3 Toyota Beta Tester
### CONTRIBUTORS
Name | github
------------------------------------------------------------ | ------------------------------------------------------------
andy741217 | [andy741217](https://github.com/andy741217)
Arne Schwarck | [arne182](https://github.com/arne182)
berno22 | [berno22](https://github.com/berno22)
Bobbydough | [Bobbydough](https://github.com/bobbydough)
Curtis Jenkins | [actuallylemoncurd](https://github.com/actuallylemoncurd)
DFyffe | [donfyffe](https://github.com/donfyffe)
dinglx | [dingliangxue](https://github.com/dingliangxue)
eyezenheim | [eyezenheim](https://github.com/eyezenheim)
kegman | [kegman](https://github.com/kegman)
lijunhao731 | [lijunhao731](https://github.com/lijunhao731)
lirudy | [lirudy](https://github.com/lirudy)
LOVEChen | [LOVEChen](https://github.com/LOVEChen)
menwenliang | [menwenliang](https://github.com/menwenliang)
move-fast | [menwenliang](https://github.com/move-fast)
Nelson Chen | [nelsonjchen](https://github.com/nelsonjchen)
rming | [Rming](https://github.com/rming)
sebastian4k | [sebastian4k](https://github.com/sebastian4k)
Shane Smiskol | [sshane](https://github.com/sshane)
toyboxZ | [toyboxZ](https://github.com/toyboxZ)

25
HOWTO-ONEPLUS.md Normal file
View File

@@ -0,0 +1,25 @@
How to install on Oneplus 3t?
------
1. clone dragonpilot to /data/ and make sure it's named openpilot:
(手動安裝切換至 dp)
```
cd /data/ && rm -fr openpilot ; git clone https://github.com/dragonpilot-community/dragonpilot.git openpilot -b 0.8.8
```
2. run command:
(在 ssh 畫面下,輸入)
```
cd /data/openpilot/scripts/ && ./oneplus_update_neos.sh
```
3. Let it download and complete it update, after a couple of reboot, your screen will then stay in fastboot mode.
(等待下載並讓它重新開機,沒錯誤的話會進入 Android 機器人更新畫面,等自動重新開機)
4. In fastboot mode, select use volume button to select to `Recovery mode` then press power button.
(在 fastboot 模式,用音量鍵上下選到 Recovery mode 再按下電源鍵)
5. In Recovery mode, tap `apply update` -> `Choose from emulated` -> `0/` -> `update.zip` -> `Reboot system now`
(在 Recovery mode點選 `apply update` -> `Choose from emulated` -> `0/` -> `update.zip` -> `Reboot system now`)
6. You should be able to boot into openpilot, if touch screen is not working, try to reboot again.
(你現在應該可以進入 openpilot 畫面,如果點擊畫面沒有反應,請再重新開機一次)

18
HOWTO-Translate.md Normal file
View File

@@ -0,0 +1,18 @@
HOW TO Translate dragonpilot
--
If you would like to help to translate dragonpilot into your native language, please:
1. Contact dragonpilot team to generate language files for translation.
2. Start translation, there will be 2 files: (locale = your language code)
* <openpilot>/selfdrive/assets/locales/**locale**/LC_MESSAGES/events.po
* This is for alerts messages. (e.g. on road warning messages)
* <openpilot>/selfdrive/ui/translations/**locale**.ts
* This is for UI. (e.g. settings pages)
We recommended to use a proper editor such as TextMate (mac) / notepad++ (win) / Intellij pyCharm.
3. Submit a PR for your translation.
4. dragonpilot team will review your PR and add it in the next release.

10
JETSON.md Normal file
View File

@@ -0,0 +1,10 @@
set_core_affinity
------
Jetson Xavier NX has 6 cores running at 1.9 GHz, here is what I've defined
0 = (not specified)
1 = plannerd / radard
2 = boardd
3 = controlsd
4 = camerad
5 = modeld

View File

@@ -7,6 +7,8 @@ import platform
import numpy as np
TICI = os.path.isfile('/TICI')
JETSON = os.path.isfile('/JETSON')
Decider('MD5-timestamp')
AddOption('--test',
@@ -65,6 +67,10 @@ if arch == "aarch64" and TICI:
USE_WEBCAM = os.getenv("USE_WEBCAM") is not None
USE_MIPI = os.getenv("USE_MIPI") is not None
if arch == "aarch64" and JETSON:
arch = "jarch64"
lenv = {
"PATH": os.environ['PATH'],
}
@@ -114,8 +120,19 @@ else:
cflags = []
cxxflags = []
cpppath = []
rpath = []
if arch == "Darwin":
if arch == "jarch64":
libpath = [
"#phonelibs/libyuv/larch64/lib",
"#selfdrive/common",
"/usr/lib",
"/usr/local/lib",
]
cflags = ["-DXNX", "-march=armv8.2-a"]
cxxflags = ["-DXNX", "-march=armv8.2-a"]
rpath += ["/usr/local/lib"]
elif arch == "Darwin":
yuv_dir = "mac" if real_arch != "arm64" else "mac_arm64"
libpath = [
f"#phonelibs/libyuv/{yuv_dir}/lib",
@@ -143,8 +160,9 @@ else:
"/usr/local/lib",
]
rpath = [
"phonelibs/snpe/x86_64-linux-clang",
if arch != "jarch64":
rpath += ["phonelibs/snpe/x86_64-linux-clang"]
rpath += [
"cereal",
"selfdrive/common"
]
@@ -313,7 +331,7 @@ else:
qt_dirs += [f"/usr/include/{real_arch}-linux-gnu/qt5/Qt{m}" for m in qt_modules]
qt_libs = [f"Qt5{m}" for m in qt_modules]
if arch == "larch64":
if arch == "larch64" or arch == "jarch64":
qt_libs += ["GLESv2", "wayland-client"]
elif arch != "Darwin":
qt_libs += ["GL"]
@@ -346,7 +364,8 @@ if GetOption("clazy"):
qt_env['ENV']['CLAZY_IGNORE_DIRS'] = qt_dirs[0]
qt_env['ENV']['CLAZY_CHECKS'] = ','.join(checks)
Export('env', 'qt_env', 'arch', 'real_arch', 'SHARED', 'USE_WEBCAM')
zmq = 'zmq'
Export('env', 'qt_env', 'arch', 'real_arch', 'SHARED', 'USE_WEBCAM', 'zmq', 'USE_MIPI')
SConscript(['selfdrive/common/SConscript'])
Import('_common', '_gpucommon', '_gpu_libs')

View File

@@ -1,4 +1,4 @@
Import('env', 'envCython', 'arch', 'common')
Import('env', 'envCython', 'arch', 'common', 'zmq')
import shutil
@@ -8,7 +8,7 @@ messaging_dir = Dir('messaging')
# Build cereal
schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp']
schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp', 'dp.capnp']
env.Command(["gen/c/include/c++.capnp.h", "gen/c/include/java.capnp.h"], [], "mkdir -p " + gen_dir.path + "/c/include && touch $TARGETS")
env.Command([f'gen/cpp/{s}.c++' for s in schema_files] + [f'gen/cpp/{s}.h' for s in schema_files],
schema_files,
@@ -40,7 +40,14 @@ messaging_objects = env.SharedObject([
messaging_lib = env.Library('messaging', messaging_objects)
Depends('messaging/impl_zmq.cc', services_h)
env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, 'zmq', common])
# note, this rebuilds the deps shared, zmq is statically linked to make APK happy
# TODO: get APK to load system zmq to remove the static link
if arch == "aarch64":
zmq_static = FindFile("libzmq.a", "/usr/lib")
shared_lib_shared_lib = [zmq_static, 'm', 'stdc++', "gnustl_shared", "kj", "capnp"]
env.SharedLibrary('messaging_shared', messaging_objects, LIBS=shared_lib_shared_lib)
env.Program('messaging/bridge', ['messaging/bridge.cc'], LIBS=[messaging_lib, common, 'zmq'])
Depends('messaging/bridge.cc', services_h)
envCython.Program('messaging/messaging_pyx.so', 'messaging/messaging_pyx.pyx', LIBS=envCython["LIBS"]+[messaging_lib, "zmq", common])

73
cereal/_SConstruct Normal file
View File

@@ -0,0 +1,73 @@
import os
import platform
import subprocess
import sysconfig
arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip()
if platform.system() == "Darwin":
arch = "Darwin"
cereal_dir = Dir('.')
messaging_dir = Dir('./messaging')
cpppath = [
cereal_dir,
messaging_dir,
'/usr/lib/include',
'/opt/homebrew/include',
sysconfig.get_paths()['include'],
]
libpath = [
'/opt/homebrew/lib',
]
AddOption('--test',
action='store_true',
help='build test files')
AddOption('--asan',
action='store_true',
help='turn on ASAN')
ccflags_asan = ["-fsanitize=address", "-fno-omit-frame-pointer"] if GetOption('asan') else []
ldflags_asan = ["-fsanitize=address"] if GetOption('asan') else []
env = Environment(
ENV=os.environ,
CC='clang',
CXX='clang++',
CCFLAGS=[
"-g",
"-fPIC",
"-O2",
"-Wunused",
"-Werror",
] + ccflags_asan,
LDFLAGS=ldflags_asan,
LINKFLAGS=ldflags_asan,
CFLAGS="-std=gnu11",
CXXFLAGS="-std=c++1z",
CPPPATH=cpppath,
LIBPATH=libpath,
CYTHONCFILESUFFIX=".cpp",
tools=["default", "cython"]
)
Export('env', 'arch')
envCython = env.Clone(LIBS=[])
envCython["CCFLAGS"] += ["-Wno-#warnings", "-Wno-deprecated-declarations"]
if arch == "Darwin":
envCython["LINKFLAGS"] = ["-bundle", "-undefined", "dynamic_lookup"]
elif arch == "aarch64":
envCython["LINKFLAGS"] = ["-shared"]
envCython["LIBS"] = [os.path.basename(sysconfig.get_paths()['include'])]
else:
envCython["LINKFLAGS"] = ["-pthread", "-shared"]
Export('envCython')
SConscript(['SConscript'])

View File

@@ -130,6 +130,23 @@ struct CarEvent @0x9b1657f34caf3ad3 {
neosUpdateRequiredDEPRECATED @88;
modelLagWarningDEPRECATED @93;
startupOneplusDEPRECATED @82;
#dp
preLaneChangeLeftALC @106;
preLaneChangeRightALC @107;
manualSteeringRequired @108;
manualSteeringRequiredBlinkersOn @109;
leadCarMoving @110;
# timebomb assist
timebombWarn @111;
timebombBypassing @112;
timebombBypassed @113;
mapdAlert @114;
#mapd
speedLimitActive @115;
speedLimitValueChange @116;
}
}
@@ -196,6 +213,12 @@ 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 @38 :Bool;
stopSteering @39 :Bool; # timebomb - stopSteering
engineRPM @40 :Float32;
cruiseActualEnabled @41 :Bool;
struct WheelSpeeds {
# optional wheel speeds
fl @0 :Float32;
@@ -211,6 +234,8 @@ struct CarState {
speedOffset @3 :Float32;
standstill @4 :Bool;
nonAdaptive @5 :Bool;
#mapd
speedLimit @6 :Float32;
}
enum GearShifter {
@@ -248,7 +273,7 @@ struct CarState {
}
errorsDEPRECATED @0 :List(CarEvent.EventName);
brakeLightsDEPRECATED @19 :Bool;
brakeLights @19 :Bool;
}
# ******* radar state @ 20hz *******

62
cereal/dp.capnp Normal file
View File

@@ -0,0 +1,62 @@
using Cxx = import "./include/c++.capnp";
$Cxx.namespace("cereal");
using Java = import "./include/java.capnp";
$Java.package("ai.comma.openpilot.cereal");
$Java.outerClassname("dp");
@0xbfa7e645486440c7;
# dp.capnp: a home for deprecated structs
# dp
struct DragonConf {
dpThermalStarted @0 :Bool;
dpThermalOverheat @1 :Bool;
dpAtl @2 :Bool;
dpAtlOpLong @3 :Bool;
dpDashcamd @4 :Bool;
dpAutoShutdown @5 :Bool;
dpAthenad @6 :Bool;
dpUploader @7 :Bool;
dpLateralMode @8 :UInt8;
dpSignalOffDelay @9 :Float32;
dpLcMinMph @10 :UInt8;
dpLcAutoCont @11 :Bool;
dpLcAutoMinMph @12 :UInt8;
dpLcAutoDelay @13 :Float32;
dpAllowGas @14 :Bool;
dpFollowingProfileCtrl @15 :Bool;
dpFollowingProfile @16 :UInt8;
dpAccelProfileCtrl @17 :Bool;
dpAccelProfile @18 :UInt8;
dpGearCheck @19 :Bool;
dpSpeedCheck @20 :Bool;
dpUiDisplayMode @21 :UInt8;
dpUiSpeed @22 :Bool;
dpUiEvent @23 :Bool;
dpUiMaxSpeed @24 :Bool;
dpUiFace @25 :Bool;
dpUiLane @26 :Bool;
dpUiLead @27 :Bool;
dpUiSide @28 :Bool;
dpUiTop @29 :Bool;
dpUiBlinker @30 :Bool;
dpUiBrightness @31 :UInt8;
dpUiVolume @32 :Int8;
dpToyotaLdw @33 :Bool;
dpToyotaSng @34 :Bool;
dpToyotaCruiseOverride @35 :Bool;
dpToyotaCruiseOverrideVego @36 :Bool;
dpToyotaCruiseOverrideAt @37 :Float32;
dpToyotaCruiseOverrideSpeed @38 :Float32;
dpVwTimebombAssist @39 :Bool;
dpIpAddr @40 :Text;
dpCameraOffset @41 :Int8;
dpPathOffset @42 :Int8;
dpLocale @43 :Text;
dpSrLearner @44 :Bool;
dpSrCustom @45 :Float32;
dpAppd @46 :Bool;
dpMapd @47 :Bool;
}

View File

@@ -7,6 +7,7 @@ $Java.outerClassname("Log");
using Car = import "car.capnp";
using Legacy = import "legacy.capnp";
using Dp = import "dp.capnp";
@0xf3b1f17e25a4285b;
@@ -49,6 +50,7 @@ struct InitData {
chffrIos @3;
tici @4;
pc @5;
jetson @6;
}
struct PandaInfo {
@@ -664,12 +666,12 @@ struct ControlsState @0x97ff69c53601abf1 {
decelForTurnDEPRECATED @47 :Bool;
decelForModelDEPRECATED @54 :Bool;
awarenessStatusDEPRECATED @26 :Float32;
angleSteersDEPRECATED @13 :Float32;
angleSteers @13 :Float32; # dp
vCurvatureDEPRECATED @46 :Float32;
mapValidDEPRECATED @49 :Bool;
jerkFactorDEPRECATED @12 :Float32;
steerOverrideDEPRECATED @20 :Bool;
steeringAngleDesiredDegDEPRECATED @29 :Float32;
steeringAngleDesiredDeg @29 :Float32; # dp
}
struct ModelDataV2 {
@@ -812,12 +814,31 @@ struct LongitudinalPlan @0xe00b5b3eba12876c {
speeds @33 :List(Float32);
jerks @34 :List(Float32);
#mapd
visionTurnControllerState @35 :VisionTurnControllerState;
visionTurnSpeed @36 :Float32;
speedLimitControlState @37 :SpeedLimitControlState;
speedLimit @38 :Float32;
speedLimitOffset @39 :Float32;
distToSpeedLimit @40 :Float32;
isMapSpeedLimit @41 :Bool;
distToTurn @42 :Float32;
turnSpeed @43 :Float32;
turnSpeedControlState @44 :SpeedLimitControlState;
turnSign @45 :Int16;
enum LongitudinalPlanSource {
cruise @0;
lead0 @1;
lead1 @2;
lead2 @3;
e2e @4;
#mapd
turn @5;
limit @6;
turnlimit @7;
}
# deprecated
@@ -853,6 +874,21 @@ struct LongitudinalPlan @0xe00b5b3eba12876c {
x @0 :List(Float32);
y @1 :List(Float32);
}
#mapd
enum SpeedLimitControlState {
inactive @0; # No speed limit set or not enabled by parameter.
tempInactive @1; # User wants to ignore speed limit until it changes.
adapting @2; # Reducing speed to match new speed limit.
active @3; # Cruising at speed limit.
}
enum VisionTurnControllerState {
disabled @0; # No predicted substancial turn on vision range or feature disabled.
entering @1; # A subsantial turn is predicted ahead, adapting speed to turn confort levels.
turning @2; # Actively turning. Managing acceleration to provide a roll on turn feeling.
leaving @3; # Road ahead straightens. Start to allow positive acceleration.
}
}
struct LateralPlan @0xe1e9318e2ae8b51e {
@@ -861,6 +897,9 @@ struct LateralPlan @0xe1e9318e2ae8b51e {
rProb @7 :Float32;
dPathPoints @20 :List(Float32);
dProb @21 :Float32;
#mapd
dPathWLinesX @30 :List(Float32);
dPathWLinesY @31 :List(Float32);
mpcSolutionValid @9 :Bool;
desire @17 :Desire;
@@ -873,6 +912,9 @@ struct LateralPlan @0xe1e9318e2ae8b51e {
curvatures @27 :List(Float32);
curvatureRates @28 :List(Float32);
# dp
dpALCAllowed @29 :Bool;
enum Desire {
none @0;
turnLeft @1;
@@ -1324,6 +1366,23 @@ struct LiveMapDataDEPRECATED {
mapValid @11 :Bool;
}
struct LiveMapData {
speedLimitValid @0 :Bool;
speedLimit @1 :Float32;
speedLimitAheadValid @2 :Bool;
speedLimitAhead @3 :Float32;
speedLimitAheadDistance @4 :Float32;
turnSpeedLimitValid @5 :Bool;
turnSpeedLimit @6 :Float32;
turnSpeedLimitEndDistance @7 :Float32;
turnSpeedLimitSign @8 :Int16;
turnSpeedLimitsAhead @9 :List(Float32);
turnSpeedLimitsAheadDistances @10 :List(Float32);
turnSpeedLimitsAheadSigns @11 :List(Int16);
lastGpsTimestamp @12 :Int64; # Milliseconds since January 1, 1970.
currentRoadName @13 :Text;
}
struct CameraOdometry {
frameId @4 :UInt32;
timestampEof @5 :UInt64;
@@ -1464,5 +1523,8 @@ struct Event {
kalmanOdometryDEPRECATED @65 :Legacy.KalmanOdometry;
gpsLocationDEPRECATED @21 :GpsLocationData;
uiLayoutStateDEPRECATED @57 :Legacy.UiLayoutState;
dragonConf @80 :Dp.DragonConf;
#mapd
liveMapData @81: LiveMapData;
}
}

View File

@@ -62,8 +62,15 @@ services = {
"managerState": (True, 2., 1),
"uploaderState": (True, 0., 1),
#mapd
"liveMapData": (True, 0.),
# debug
"testJoystick": (False, 0.),
# dp
"thermal": (True, 2., 1),
"dragonConf": (False, 1.),
}
service_list = {name: Service(new_port(idx), *vals) for # type: ignore
idx, (name, vals) in enumerate(services.items())}

View File

@@ -4,8 +4,9 @@ import requests
from datetime import datetime, timedelta
from common.basedir import PERSIST
from selfdrive.version import version
from common.params import Params
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') if not Params().get_bool("dp_api_custom") else Params().get("dp_api_custom_url", encoding='utf-8')
class Api():
def __init__(self, dongle_id):

View File

@@ -1,11 +1,11 @@
import os
from pathlib import Path
from selfdrive.hardware import PC
from selfdrive.hardware import PC, JETSON
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
if PC:
if PC or JETSON:
PERSIST = os.path.join(str(Path.home()), ".comma", "persist")
else:
PERSIST = "/persist"

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 = params.get_params_path() + '/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.dpLateralMode == 0 and blinker_on:
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_bool('dp_lqr'):
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

230
common/dp_conf.py Normal file
View File

@@ -0,0 +1,230 @@
#!/usr/bin/env python3.7
import os
import sys
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, need both param and struct defined)
'''
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']},
# custom api server
{'name': 'dp_api_custom', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_api_custom_url', 'default': 'https://api.retropilot.org', 'type': 'Text', 'depends': [{'name': 'dp_api_custom', 'vals': [True]}], 'conf_type': ['param']},
{'name': 'dp_atl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_atl_op_long', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [True]}], 'conf_type': ['param', 'struct'], 'update_once': True},
# dashcam related
{'name': 'dp_dashcamd', 'default': False, 'type': 'Bool', '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': 0, 'max': 600, 'depends': [{'name': 'dp_auto_shutdown', 'vals': [True]}], 'conf_type': ['param']},
# service
{'name': 'dp_updated', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_logger', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_athenad', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_uploader', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct'], 'update_once': True},
# {'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_lateral_mode', 'default': 1, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param', 'struct']},
{'name': 'dp_signal_off_delay', 'default': 3., 'type': 'Float32', 'min': 0., 'max': 10., 'depends': [{'name': 'dp_lateral_mode', 'vals': [0]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_min_mph', 'default': 45, 'type': 'UInt8', 'min': 0, 'max': 255, 'depends': [{'name': 'dp_lateral_mode', 'vals': [1,2]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_auto_cont', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_auto_min_mph', 'default': 60, 'type': 'UInt8', 'min': 0, 'max': 255, 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_auto_delay', 'default': 3., 'type': 'Float32', 'min': 0., 'max': 10., 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
# long ctrl
{'name': 'dp_allow_gas', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_following_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_following_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_following_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_accel_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_accel_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_accel_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# safety
{'name': 'dp_gear_check', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_speed_check', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_temp_monitor', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
# UIs
{'name': 'dp_ui_display_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_speed', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_event', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_max_speed', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_face', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_lane', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_lead', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_side', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_top', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_blinker', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_brightness', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 100, 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_volume', 'default': -5, 'type': 'Int8', 'min': -5, 'max': 100, 'conf_type': ['param', 'struct']},
# toyota
{'name': 'dp_lexus_rx_rpm_fix', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_toyota_ldw', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_sng', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_zss', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_toyota_fp_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_toyota_ap_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_toyota_disable_relay', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_toyota_cruise_override', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_cruise_override_vego', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_cruise_override_at', 'default': 44, 'type': 'Float32', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'min': 0, 'max': 50., 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_cruise_override_speed', 'default': 32, 'type': 'Float32', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'min': 0, 'max': 50., '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']},
{'name': 'dp_honda_kmh_display', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# volkswagen
{'name': 'dp_vw_panda', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_vw_timebomb_assist', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
#misc
{'name': 'dp_ip_addr', 'default': '', 'type': 'Text', 'conf_type': ['struct']},
{'name': 'dp_fan_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, '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': -100, 'max': 100, 'conf_type': ['param', 'struct']},
{'name': 'dp_path_offset', 'default': 0, 'type': 'Int8', 'min': -100, 'max': 100, 'conf_type': ['param', 'struct']},
{'name': 'dp_locale', 'default': 'en-US', 'type': 'Text', 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_reg', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
# sr learner related
{'name': 'dp_sr_learner', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_sr_custom', 'default': 9.99, 'min': 9.99, 'max': 30., 'type': 'Float32', 'depends': [{'name': 'dp_sr_learner', 'vals': [False]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_sr_stock', 'default': 9.99, 'min': 9.99, 'max': 100., 'type': 'Float32', '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_appd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_jetson', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_car_assigned', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_car_list', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_no_batt', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_last_candidate', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_prebuilt', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_mapd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# custom server support
# {'name': 'dp_custom_server', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_custom_server_url', 'default': 'api.retropilot.org', 'type': 'Text', 'depends': [{'name': 'dp_custom_server', 'vals': [True]}], '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 generate support car list
'''
def get_support_car_list():
attrs = ['FINGERPRINTS', 'FW_VERSIONS']
cars = dict({"cars": []})
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()
brand_models = {"brand": car_name.upper(), "models": names }
cars["cars"].append(brand_models)
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']))
def gen_params_cc_keys():
for conf in confs:
if 'param' in conf['conf_type']:
print(" {\"%s\", PERSISTENT}," % conf['name'])
if __name__ == "__main__":
if (len(sys.argv) > 1) and sys.argv[1] == 'cc':
gen_params_cc_keys()
else:
gen_log_struct()

7
common/dp_time.py Normal file
View File

@@ -0,0 +1,7 @@
#!/usr/bin/env python3.7
# delay of reading last modified
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 selfdrive.hardware import EON
from selfdrive.hardware.eon.hardware 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

@@ -26,3 +26,5 @@ cdef extern from "selfdrive/common/params.h":
int putBool(string, bool) nogil
bool checkKey(string) nogil
void clearAll(ParamKeyType)
string get_params_path()

View File

@@ -106,6 +106,8 @@ cdef class Params:
with nogil:
self.p.remove(k)
def get_params_path(self):
return self.p.get_params_path().decode("utf-8")
def put_nonblocking(key, val, d=None):
def f(key, val):

View File

@@ -6,7 +6,7 @@ import multiprocessing
from typing import Optional
from common.clock import sec_since_boot # pylint: disable=no-name-in-module, import-error
from selfdrive.hardware import PC, TICI
from selfdrive.hardware import PC, TICI, JETSON
# time step for each process
@@ -33,12 +33,12 @@ class Priority:
def set_realtime_priority(level: int) -> None:
if not PC:
if JETSON or not PC:
os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) # type: ignore[attr-defined]
def set_core_affinity(core: int) -> None:
if not PC:
if JETSON or not PC:
os.sched_setaffinity(0, [core,])

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

@@ -5,12 +5,14 @@ from selfdrive.hardware import TICI
## -- hardcoded hardware params --
eon_f_focal_length = 910.0
eon_d_focal_length = 650.0
eon_d_focal_length = 860.0
leon_d_focal_length = 650.0
tici_f_focal_length = 2648.0
tici_e_focal_length = tici_d_focal_length = 567.0 # probably wrong? magnification is not consistent across frame
eon_f_frame_size = (1164, 874)
eon_d_frame_size = (816, 612)
eon_d_frame_size = (1152, 864)
leon_d_frame_size = (816, 612)
tici_f_frame_size = tici_e_frame_size = tici_d_frame_size = (1928, 1208)
# aka 'K' aka camera_frame_from_view_frame
@@ -20,6 +22,11 @@ eon_fcam_intrinsics = np.array([
[0.0, 0.0, 1.0]])
eon_intrinsics = eon_fcam_intrinsics # xx
leon_dcam_intrinsics = np.array([
[leon_d_focal_length, 0.0, float(leon_d_frame_size[0])/2],
[0.0, leon_d_focal_length, float(leon_d_frame_size[1])/2],
[0.0, 0.0, 1.0]])
eon_dcam_intrinsics = np.array([
[eon_d_focal_length, 0.0, float(eon_d_frame_size[0])/2],
[0.0, eon_d_focal_length, float(eon_d_frame_size[1])/2],

View File

@@ -0,0 +1,34 @@
#!/data/data/com.termux/files/usr/bin/sh
# Get some needed tools. coreutils for mkdir command, gnugp for the signing key, and apt-transport-https to actually connect to the repo
apt-get update
apt-get --assume-yes upgrade
apt-get --assume-yes install coreutils gnupg
# Make the sources.list.d directory
mkdir -p $PREFIX/etc/apt/sources.list.d
# Write the needed source file
echo "deb https://its-pointless.github.io/files/24 termux extras" > $PREFIX/etc/apt/sources.list.d/pointless.list
# Add signing key from https://its-pointless.github.io/pointless.gpg
curl -sL https://its-pointless.github.io/pointless.gpg | apt-key add -
# Update apt
apt update
# install gfortran
apt install gcc-11 -y
setupclang-gfort-11
# Elf cleaner is needed to remove a DT_ENTRY warning that prints out when gfortran -v is called to get
# its version number and this breaks the pip installation script when fortran is used.
# Build elf cleaner
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
ELFCLEANERPATH=$SCRIPTPATH/termux-elf-cleaner/
cd $ELFCLEANERPATH
make
# Perform elf cleaner on gfortran
./termux-elf-cleaner $(which gfortran)

View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

View File

@@ -0,0 +1,16 @@
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic
PREFIX ?= /usr/local
termux-elf-cleaner: termux-elf-cleaner.cpp
clean:
rm -f termux-elf-cleaner
install: termux-elf-cleaner
mkdir -p $(PREFIX)/bin
install termux-elf-cleaner $(PREFIX)/bin/termux-elf-cleaner
uninstall:
rm -f $(PREFIX)/bin/termux-elf-cleaner
.PHONY: clean install uninstall

View File

@@ -0,0 +1,39 @@
# termux-elf-cleaner
Utility for Android ELF files to remove unused parts that the linker warns about.
## Description
When loading ELF files, the Android linker warns about unsupported dynamic section entries with warnings such as:
WARNING: linker: /data/data/org.kost.nmap.android.networkmapper/bin/nmap: unused DT entry: type 0x6ffffffe arg 0x8a7d4
WARNING: linker: /data/data/org.kost.nmap.android.networkmapper/bin/nmap: unused DT entry: type 0x6fffffff arg 0x3
This utility strips away the following dynamic section entries:
- `DT_RPATH` - not supported in any Android version.
- `DT_RUNPATH` - supported from Android 7.0.
- `DT_VERDEF` - supported from Android 6.0.
- `DT_VERDEFNUM` - supported from Android 6.0.
- `DT_VERNEEDED` - supported from Android 6.0.
- `DT_VERNEEDNUM` - supported from Android 6.0.
- `DT_VERSYM` - supported from Android 6.0.
It also removes the three ELF sections of type:
- `SHT_GNU_verdef`
- `SHT_GNU_verneed`
- `SHT_GNU_versym`
## Usage
```sh
usage: termux-elf-cleaner <filenames>
Processes ELF files to remove unsupported section types and
dynamic section entries which the Android linker warns about.
```
## Author
Fredrik Fornwall ([@fornwall](https://github.com/fornwall)).
## License
SPDX-License-Identifier: [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html)

View File

@@ -0,0 +1,211 @@
#ifndef ELF_H_INCLUDED
#define ELF_H_INCLUDED
#include <stdint.h>
/* Type for a 16-bit quantity. */
typedef uint16_t Elf32_Half;
typedef uint16_t Elf64_Half;
/* Types for signed and unsigned 32-bit quantities. */
typedef uint32_t Elf32_Word;
typedef int32_t Elf32_Sword;
typedef uint32_t Elf64_Word;
typedef int32_t Elf64_Sword;
/* Types for signed and unsigned 64-bit quantities. */
typedef uint64_t Elf32_Xword;
typedef int64_t Elf32_Sxword;
typedef uint64_t Elf64_Xword;
typedef int64_t Elf64_Sxword;
/* Type of addresses. */
typedef uint32_t Elf32_Addr;
typedef uint64_t Elf64_Addr;
/* Type of file offsets. */
typedef uint32_t Elf32_Off;
typedef uint64_t Elf64_Off;
/* Type for section indices, which are 16-bit quantities. */
typedef uint16_t Elf32_Section;
typedef uint16_t Elf64_Section;
/* Type for version symbol information. */
typedef Elf32_Half Elf32_Versym;
typedef Elf64_Half Elf64_Versym;
/* The ELF file header. This appears at the start of every ELF file. */
typedef struct {
unsigned char e_ident[16]; /* Magic number and other info */
Elf32_Half e_type; /* Object file type */
Elf32_Half e_machine; /* Architecture */
Elf32_Word e_version; /* Object file version */
Elf32_Addr e_entry; /* Entry point virtual address */
Elf32_Off e_phoff; /* Program header table (usually follows elf header directly) file offset */
Elf32_Off e_shoff; /* Section header table (at end of file) file offset */
Elf32_Word e_flags; /* Processor-specific flags */
Elf32_Half e_ehsize; /* ELF header size in bytes */
Elf32_Half e_phentsize; /* Program header table entry size */
Elf32_Half e_phnum; /* Program header table entry count */
Elf32_Half e_shentsize; /* Section header table entry size */
Elf32_Half e_shnum; /* Section header table entry count */
Elf32_Half e_shstrndx; /* Section header string table index */
} Elf32_Ehdr;
typedef struct {
unsigned char e_ident[16]; /* Magic number and other info */
Elf64_Half e_type; /* Object file type */
Elf64_Half e_machine; /* Architecture */
Elf64_Word e_version; /* Object file version */
Elf64_Addr e_entry; /* Entry point virtual address */
Elf64_Off e_phoff; /* Program header table file offset */
Elf64_Off e_shoff; /* Section header table file offset */
Elf64_Word e_flags; /* Processor-specific flags */
Elf64_Half e_ehsize; /* ELF header size in bytes */
Elf64_Half e_phentsize; /* Program header table entry size */
Elf64_Half e_phnum; /* Program header table entry count */
Elf64_Half e_shentsize; /* Section header table entry size */
Elf64_Half e_shnum; /* Section header table entry count */
Elf64_Half e_shstrndx; /* Section header string table index */
} Elf64_Ehdr;
/* Section header entry. The number of section entries in the file are determined by the "e_shnum" field of the ELF header.*/
typedef struct {
Elf32_Word sh_name; /* Section name (string tbl index) */
Elf32_Word sh_type; /* Section type */
Elf32_Word sh_flags; /* Section flags */
Elf32_Addr sh_addr; /* Section virtual addr at execution */
Elf32_Off sh_offset; /* Section file offset */
Elf32_Word sh_size; /* Section size in bytes */
Elf32_Word sh_link; /* Link to another section */
Elf32_Word sh_info; /* Additional section information */
Elf32_Word sh_addralign; /* Section alignment */
Elf32_Word sh_entsize; /* Entry size if section holds table */
} Elf32_Shdr;
typedef struct {
Elf64_Word sh_name; /* Section name (string tbl index) */
Elf64_Word sh_type; /* Section type */
Elf64_Xword sh_flags; /* Section flags */
Elf64_Addr sh_addr; /* Section virtual addr at execution */
Elf64_Off sh_offset; /* Section file offset */
Elf64_Xword sh_size; /* Section size in bytes */
Elf64_Word sh_link; /* Link to another section */
Elf64_Word sh_info; /* Additional section information */
Elf64_Xword sh_addralign; /* Section alignment */
Elf64_Xword sh_entsize; /* Entry size if section holds table */
} Elf64_Shdr;
/* Legal values for sh_type (section type). */
#define SHT_NULL 0 /* Section header table entry unused */
#define SHT_PROGBITS 1 /* Program data */
#define SHT_SYMTAB 2 /* Symbol table */
#define SHT_STRTAB 3 /* String table */
#define SHT_RELA 4 /* Relocation entries with addends */
#define SHT_HASH 5 /* Symbol hash table */
#define SHT_DYNAMIC 6 /* Dynamic linking information. Contains Elf32_Dyn/Elf64_Dyn entries. */
#define SHT_NOTE 7 /* Notes */
#define SHT_NOBITS 8 /* Program space with no data (bss) */
#define SHT_REL 9 /* Relocation entries, no addends */
#define SHT_SHLIB 10 /* Reserved */
#define SHT_DYNSYM 11 /* Dynamic linker symbol table */
#define SHT_INIT_ARRAY 14 /* Array of constructors */
#define SHT_FINI_ARRAY 15 /* Array of destructors */
#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */
#define SHT_GROUP 17 /* Section group */
#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */
#define SHT_NUM 19 /* Number of defined types. */
#define SHT_LOOS 0x60000000 /* Start OS-specific. */
#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */
#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */
#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */
#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */
#define SHT_SUNW_move 0x6ffffffa
#define SHT_SUNW_COMDAT 0x6ffffffb
#define SHT_SUNW_syminfo 0x6ffffffc
#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */
#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */
#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */
#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */
#define SHT_HIOS 0x6fffffff /* End OS-specific type */
#define SHT_LOPROC 0x70000000 /* Start of processor-specific */
#define SHT_HIPROC 0x7fffffff /* End of processor-specific */
#define SHT_LOUSER 0x80000000 /* Start of application-specific */
#define SHT_HIUSER 0x8fffffff /* End of application-specific */
/* Dynamic section entry. */
typedef struct {
Elf32_Sword d_tag; /* Dynamic entry type */
union { Elf32_Word d_val; Elf32_Addr d_ptr; } d_un; /* Integer or address value */
} Elf32_Dyn;
typedef struct {
Elf64_Sxword d_tag; /* Dynamic entry type */
union { Elf64_Xword d_val; Elf64_Addr d_ptr; } d_un; /* Integer or address value */
} Elf64_Dyn;
/* Legal values for d_tag (dynamic entry type). */
#define DT_NULL 0 /* Marks end of dynamic section */
#define DT_NEEDED 1 /* Name of needed library */
#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */
#define DT_PLTGOT 3 /* Processor defined value */
#define DT_HASH 4 /* Address of symbol hash table */
#define DT_STRTAB 5 /* Address of string table */
#define DT_SYMTAB 6 /* Address of symbol table */
#define DT_RELA 7 /* Address of Rela relocs */
#define DT_RELASZ 8 /* Total size of Rela relocs */
#define DT_RELAENT 9 /* Size of one Rela reloc */
#define DT_STRSZ 10 /* Size of string table */
#define DT_SYMENT 11 /* Size of one symbol table entry */
#define DT_INIT 12 /* Address of init function */
#define DT_FINI 13 /* Address of termination function */
#define DT_SONAME 14 /* Name of shared object */
#define DT_RPATH 15 /* Library search path (deprecated) */
#define DT_SYMBOLIC 16 /* Start symbol search here */
#define DT_REL 17 /* Address of Rel relocs */
#define DT_RELSZ 18 /* Total size of Rel relocs */
#define DT_RELENT 19 /* Size of one Rel reloc */
#define DT_PLTREL 20 /* Type of reloc in PLT */
#define DT_DEBUG 21 /* For debugging; unspecified */
#define DT_TEXTREL 22 /* Reloc might modify .text */
#define DT_JMPREL 23 /* Address of PLT relocs */
#define DT_BIND_NOW 24 /* Process relocations of object */
#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */
#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */
#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */
#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */
#define DT_RUNPATH 29 /* Library search path */
#define DT_FLAGS 30 /* Flags for the object being loaded */
#define DT_ENCODING 32 /* Start of encoded range */
#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/
#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */
#define DT_NUM 34 /* Number used */
#define DT_LOOS 0x6000000d /* Start of OS-specific */
#define DT_HIOS 0x6ffff000 /* End of OS-specific */
#define DT_VERDEF 0x6ffffffc
#define DT_VERDEFNUM 0x6ffffffd
#define DT_LOPROC 0x70000000 /* Start of processor-specific */
#define DT_HIPROC 0x7fffffff /* End of processor-specific */
/* Symbol table entry. */
typedef struct {
Elf32_Word st_name; /* Symbol name (string tbl index) */
Elf32_Addr st_value; /* Symbol value */
Elf32_Word st_size; /* Symbol size */
unsigned char st_info; /* Symbol type and binding */
unsigned char st_other; /* Symbol visibility */
Elf32_Section st_shndx; /* Section index */
} Elf32_Sym;
typedef struct {
Elf64_Word st_name; /* Symbol name (string tbl index) */
unsigned char st_info; /* Symbol type and binding */
unsigned char st_other; /* Symbol visibility */
Elf64_Section st_shndx; /* Section index */
Elf64_Addr st_value; /* Symbol value */
Elf64_Xword st_size; /* Symbol size */
} Elf64_Sym;
#endif

View File

@@ -0,0 +1,191 @@
#include <algorithm>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#ifndef __ANDROID_API__
#define __ANDROID_API__ 21
#endif
// Include a local elf.h copy as not all platforms have it.
#include "elf.h"
#define DT_GNU_HASH 0x6ffffef5
#define DT_VERSYM 0x6ffffff0
#define DT_FLAGS_1 0x6ffffffb
#define DT_VERNEEDED 0x6ffffffe
#define DT_VERNEEDNUM 0x6fffffff
#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */
#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */
#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/
#if __ANDROID_API__ < 23
#define SUPPORTED_DT_FLAGS_1 (DF_1_NOW | DF_1_GLOBAL)
#else
// The supported DT_FLAGS_1 values as of Android 6.0.
#define SUPPORTED_DT_FLAGS_1 (DF_1_NOW | DF_1_GLOBAL | DF_1_NODELETE)
#endif
template<typename ElfHeaderType /*Elf{32,64}_Ehdr*/,
typename ElfSectionHeaderType /*Elf{32,64}_Shdr*/,
typename ElfDynamicSectionEntryType /* Elf{32,64}_Dyn */>
bool process_elf(uint8_t* bytes, size_t elf_file_size, char const* file_name)
{
if (sizeof(ElfSectionHeaderType) > elf_file_size) {
fprintf(stderr, "termux-elf-cleaner: Elf header for '%s' would end at %zu but file size only %zu\n", file_name, sizeof(ElfSectionHeaderType), elf_file_size);
return false;
}
ElfHeaderType* elf_hdr = reinterpret_cast<ElfHeaderType*>(bytes);
size_t last_section_header_byte = elf_hdr->e_shoff + sizeof(ElfSectionHeaderType) * elf_hdr->e_shnum;
if (last_section_header_byte > elf_file_size) {
fprintf(stderr, "termux-elf-cleaner: Section header for '%s' would end at %zu but file size only %zu\n", file_name, last_section_header_byte, elf_file_size);
return false;
}
ElfSectionHeaderType* section_header_table = reinterpret_cast<ElfSectionHeaderType*>(bytes + elf_hdr->e_shoff);
for (unsigned int i = 1; i < elf_hdr->e_shnum; i++) {
ElfSectionHeaderType* section_header_entry = section_header_table + i;
if (section_header_entry->sh_type == SHT_DYNAMIC) {
size_t const last_dynamic_section_byte = section_header_entry->sh_offset + section_header_entry->sh_size;
if (last_dynamic_section_byte > elf_file_size) {
fprintf(stderr, "termux-elf-cleaner: Dynamic section for '%s' would end at %zu but file size only %zu\n", file_name, last_dynamic_section_byte, elf_file_size);
return false;
}
size_t const dynamic_section_entries = section_header_entry->sh_size / sizeof(ElfDynamicSectionEntryType);
ElfDynamicSectionEntryType* const dynamic_section =
reinterpret_cast<ElfDynamicSectionEntryType*>(bytes + section_header_entry->sh_offset);
unsigned int last_nonnull_entry_idx = 0;
for (unsigned int j = dynamic_section_entries - 1; j > 0; j--) {
ElfDynamicSectionEntryType* dynamic_section_entry = dynamic_section + j;
if (dynamic_section_entry->d_tag != DT_NULL) {
last_nonnull_entry_idx = j;
break;
}
}
for (unsigned int j = 0; j < dynamic_section_entries; j++) {
ElfDynamicSectionEntryType* dynamic_section_entry = dynamic_section + j;
char const* removed_name = nullptr;
switch (dynamic_section_entry->d_tag) {
#if __ANDROID_API__ <= 21
case DT_GNU_HASH: removed_name = "DT_GNU_HASH"; break;
#endif
#if __ANDROID_API__ < 23
case DT_VERSYM: removed_name = "DT_VERSYM"; break;
case DT_VERNEEDED: removed_name = "DT_VERNEEDED"; break;
case DT_VERNEEDNUM: removed_name = "DT_VERNEEDNUM"; break;
case DT_VERDEF: removed_name = "DT_VERDEF"; break;
case DT_VERDEFNUM: removed_name = "DT_VERDEFNUM"; break;
#endif
case DT_RPATH: removed_name = "DT_RPATH"; break;
#if __ANDROID_API__ < 24
case DT_RUNPATH: removed_name = "DT_RUNPATH"; break;
#endif
}
if (removed_name != nullptr) {
printf("termux-elf-cleaner: Removing the %s dynamic section entry from '%s'\n", removed_name, file_name);
// Tag the entry with DT_NULL and put it last:
dynamic_section_entry->d_tag = DT_NULL;
// Decrease j to process new entry index:
std::swap(dynamic_section[j--], dynamic_section[last_nonnull_entry_idx--]);
} else if (dynamic_section_entry->d_tag == DT_FLAGS_1) {
// Remove unsupported DF_1_* flags to avoid linker warnings.
decltype(dynamic_section_entry->d_un.d_val) orig_d_val =
dynamic_section_entry->d_un.d_val;
decltype(dynamic_section_entry->d_un.d_val) new_d_val =
(orig_d_val & SUPPORTED_DT_FLAGS_1);
if (new_d_val != orig_d_val) {
printf("termux-elf-cleaner: Replacing unsupported DF_1_* flags %llu with %llu in '%s'\n",
(unsigned long long) orig_d_val,
(unsigned long long) new_d_val,
file_name);
dynamic_section_entry->d_un.d_val = new_d_val;
}
}
}
}
#if __ANDROID_API__ < 23
else if (section_header_entry->sh_type == SHT_GNU_verdef ||
section_header_entry->sh_type == SHT_GNU_verneed ||
section_header_entry->sh_type == SHT_GNU_versym) {
printf("termux-elf-cleaner: Removing version section from '%s'\n", file_name);
section_header_entry->sh_type = SHT_NULL;
}
#endif
}
return true;
}
int main(int argc, char const** argv)
{
if (argc < 2 || (argc == 2 && strcmp(argv[1], "-h")==0)) {
fprintf(stderr, "usage: %s <filenames>\n", argv[0]);
fprintf(stderr, "\nProcesses ELF files to remove unsupported section types\n"
"and dynamic section entries which the Android linker (API %d)\nwarns about.\n",
__ANDROID_API__);
return 1;
}
for (int i = 1; i < argc; i++) {
char const* file_name = argv[i];
int fd = open(file_name, O_RDWR);
if (fd < 0) {
char* error_message;
if (asprintf(&error_message, "open(\"%s\")", file_name) == -1) error_message = (char*) "open()";
perror(error_message);
return 1;
}
struct stat st;
if (fstat(fd, &st) < 0) { perror("fstat()"); return 1; }
if (st.st_size < (long long) sizeof(Elf32_Ehdr)) {
close(fd);
continue;
}
void* mem = mmap(0, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (mem == MAP_FAILED) { perror("mmap()"); return 1; }
uint8_t* bytes = reinterpret_cast<uint8_t*>(mem);
if (!(bytes[0] == 0x7F && bytes[1] == 'E' && bytes[2] == 'L' && bytes[3] == 'F')) {
// Not the ELF magic number.
munmap(mem, st.st_size);
close(fd);
continue;
}
if (bytes[/*EI_DATA*/5] != 1) {
fprintf(stderr, "termux-elf-cleaner: Not little endianness in '%s'\n", file_name);
munmap(mem, st.st_size);
close(fd);
continue;
}
uint8_t const bit_value = bytes[/*EI_CLASS*/4];
if (bit_value == 1) {
if (!process_elf<Elf32_Ehdr, Elf32_Shdr, Elf32_Dyn>(bytes, st.st_size, file_name)) return 1;
} else if (bit_value == 2) {
if (!process_elf<Elf64_Ehdr, Elf64_Shdr, Elf64_Dyn>(bytes, st.st_size, file_name)) return 1;
} else {
printf("termux-elf-cleaner: Incorrect bit value %d in '%s'\n", bit_value, file_name);
return 1;
}
if (msync(mem, st.st_size, MS_SYNC) < 0) { perror("msync()"); return 1; }
munmap(mem, st.st_size);
close(fd);
}
return 0;
}

View File

@@ -0,0 +1,7 @@
{
"ota_url": "https://commadist.azureedge.net/neosupdate/ota-signed-5dc2575d713977666a8e14ae1b43a04d7f63123934c80fa10751d949a107653e.zip",
"ota_hash": "5dc2575d713977666a8e14ae1b43a04d7f63123934c80fa10751d949a107653e",
"recovery_url": "https://commadist.azureedge.net/neosupdate/recovery-db31ffe79dfd60be966fba6d1525a5081a920062b883644dc8f5734bcc6806bb.img",
"recovery_len": 15926572,
"recovery_hash": "db31ffe79dfd60be966fba6d1525a5081a920062b883644dc8f5734bcc6806bb"
}

Binary file not shown.

Binary file not shown.

View File

@@ -125,10 +125,20 @@ int battery_current() {
return atoi(current_now_s.c_str());
}
bool has_no_battery() {
if (FILE *file = fopen("/data/params/d/dp_no_batt", "r")) {
fclose(file);
std::string has_no_batt = util::read_file("/data/params/d/dp_no_batt");
return atoi(has_no_batt.c_str()) == 1;
} else {
return false;
}
}
bool check_battery() {
int bat_cap = battery_capacity();
int current_now = battery_current();
return bat_cap > 35 || (current_now < 0 && bat_cap > 10);
return (has_no_battery())? true : bat_cap > 35 || (current_now < 0 && bat_cap > 10);
}
bool check_space() {

View File

@@ -6,9 +6,21 @@ fi
source "$BASEDIR/launch_env.sh"
if ! $(grep -q "letv" /proc/cmdline); then
mount -o remount,rw /system
sed -i -e 's#/dev/input/event1#/dev/input/event2#g' ~/.bash_profile
touch /ONEPLUS
mount -o remount,r /system
fi
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
function two_init {
if [ -f "/sdcard/dp_patcher.py" ]; then
/data/data/com.termux/files/usr/bin/python /sdcard/dp_patcher.py
fi
/data/data/com.termux/files/usr/bin/python /data/openpilot/scripts/installers/font_installer.py
/data/data/com.termux/files/usr/bin/python /data/openpilot/scripts/installers/sshkey_installer.py
# set IO scheduler
setprop sys.io.scheduler noop
@@ -66,6 +78,7 @@ function two_init {
# USB traffic needs realtime handling on cpu 3
[ -d "/proc/irq/733" ] && echo 3 > /proc/irq/733/smp_affinity_list
[ -d "/proc/irq/736" ] && echo 3 > /proc/irq/736/smp_affinity_list # USB for OP3T
# GPU and camera get cpu 2
CAM_IRQS="177 178 179 180 181 182 183 184 185 186 192"
@@ -89,19 +102,33 @@ function two_init {
wpa_cli IFNAME=wlan0 SCAN
# Check for NEOS update
if [ $(< /VERSION) != "$REQUIRED_NEOS_VERSION" ]; then
if [ -f "$DIR/scripts/continue.sh" ]; then
cp "$DIR/scripts/continue.sh" "/data/data/com.termux/files/continue.sh"
fi
if $(grep -q "letv" /proc/cmdline); then
if [ $(< /VERSION) != "$REQUIRED_NEOS_VERSION" ]; then
if [ -f "$DIR/scripts/continue.sh" ]; then
cp "$DIR/scripts/continue.sh" "/data/data/com.termux/files/continue.sh"
fi
if [ ! -f "$BASEDIR/prebuilt" ]; then
# Clean old build products, but preserve the scons cache
cd $DIR
git clean -xdf
git submodule foreach --recursive git clean -xdf
fi
if [ ! -f "$BASEDIR/prebuilt" ]; then
# Clean old build products, but preserve the scons cache
cd $DIR
git clean -xdf
git submodule foreach --recursive git clean -xdf
fi
"$DIR/installer/updater/updater" "file://$DIR/installer/updater/update.json"
"$DIR/installer/updater/updater" "file://$DIR/installer/updater/update.json"
fi
fi
# One-time fix for a subset of OP3T with gyro orientation offsets.
# Remove and regenerate qcom sensor registry. Only done on OP3T mainboards.
# Performed exactly once. The old registry is preserved just-in-case, and
# doubles as a flag denoting we've already done the reset.
if ! $(grep -q "letv" /proc/cmdline) && [ ! -f "/persist/comma/op3t-sns-reg-backup" ]; then
echo "Performing OP3T sensor registry reset"
mv /persist/sensors/sns.reg /persist/comma/op3t-sns-reg-backup &&
rm -f /persist/sensors/sensors_settings /persist/sensors/error_log /persist/sensors/gyro_sensitity_cal &&
echo "restart" > /sys/kernel/debug/msm_subsys/slpi &&
sleep 5 # Give Android sensor subsystem a moment to recover
fi
}
@@ -147,10 +174,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"
@@ -174,13 +201,16 @@ function launch {
# TODO: restore backup? This means the updater didn't start after swapping
fi
fi
fi
# fi
fi
# handle pythonpath
ln -sfn $(pwd) /data/pythonpath
export PYTHONPATH="$PWD:$PWD/pyextra"
# dp - ignore chmod changes
git -C $DIR config core.fileMode false
# hardware specific init
if [ -f /EON ]; then
two_init
@@ -193,7 +223,21 @@ function launch {
# start manager
cd selfdrive/manager
./build.py && ./manager.py
if [ -f /EON ]; then
if [ ! -f "/system/comma/usr/lib/libgfortran.so.5.0.0" ]; then
mount -o remount,rw /system
tar -zxvf /data/openpilot/selfdrive/mapd/assets/libgfortran.tar.gz -C /system/comma/usr/lib/
mount -o remount,r /system
fi
if [ ! -d "/system/comma/usr/lib/python3.8/site-packages/opspline" ]; then
mount -o remount,rw /system
tar -zxvf /data/openpilot/selfdrive/mapd/assets/opspline.tar.gz -C /system/comma/usr/lib/python3.8/site-packages/
mount -o remount,r /system
fi
./build.py && ./manager.py
else
./custom_dep.py && ./build.py && ./manager.py
fi
# if broken, keep on screen error
while true; do sleep 1; done

View File

@@ -1,4 +1,10 @@
#!/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
export PASSIVE="0"
exec ./launch_chffrplus.sh

View File

@@ -36,6 +36,8 @@ cdef class CANParser:
def __init__(self, dbc_name, signals, checks=None, bus=0, enforce_checks=True):
if checks is None:
checks = []
checks = []
enforce_checks = False
self.can_valid = True
self.dbc_name = dbc_name
self.dbc = dbc_lookup(dbc_name)

View File

@@ -461,13 +461,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

@@ -448,13 +448,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,414 @@
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
SG_ ODOMETER : 43|20@0+ (1,0) [0|1048575] "" 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_ 466 CRUISE_STATE "Active state is 8, if standstill is requested will switch to state 11(3 sec timer), after timer is elapsed will switch into state 7(standstill). If plus button was pressed - status 9, minus button pressed - status 10";
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";
CM_ SG_ 1553 ODOMETER "Unit is dependent upon units signal";
VAL_ 466 CRUISE_STATE 11 "timer_3sec" 10 "adaptive click down" 9 "adaptive click up" 8 "adaptive engaged" 7 "standstill" 6 "non-adaptive click up" 5 "non-adaptive click down" 4 "non-adaptive hold down" 3 "non-adaptive hold up" 2 "non-adaptive being engaged" 1 "non-adaptive engaged" 0 "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

@@ -350,6 +350,14 @@ BO_ 1163 RSA3: 8 FCM
SG_ OVSPVALH : 27|4@0+ (1,-5) [0|0] "" XXX
SG_ TSRSPU : 33|2@0+ (1,0) [0|0] "" XXX
BO_ 956 GEAR_PACKET2: 8 XXX
SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" 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";
@@ -396,15 +404,17 @@ VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
VAL_ 643 STATE 0 "normal" 1 "adaptive_cruise_control" 3 "emergency_braking";
VAL_ 835 ACC_TYPE 2 "permanent low speed lockout" 1 "ok";
VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
VAL_ 956 SPORT_ON 0 "off" 1 "on";
VAL_ 956 ECON_ON 0 "off" 1 "on";
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 TSGN1 36 "speed sign mph" 1 "speed sign kph" 0 "none";
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
VAL_ 1161 SPLSGN2 15 "conditional blank" 6 "snow" 5 "rain" 4 "wet road" 5 "rain" 3 "left" 2 "right" 1 "time" 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" 81 "no right turn" 97 "stop" 105 "yield" 113 "stop" 114 "yield us" 129 "no entry" 138 "no entry tss2" 145 "do not enter";
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";

View File

@@ -442,6 +442,7 @@ BO_ 956 GEAR_PACKET: 8 XXX
SG_ SPORT_ON : 2|1@0+ (1,0) [0|1] "" XXX
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
SG_ SPORT_ON_2 : 55|1@0+ (1,0) [0|1] "" XXX
CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force";
CM_ SG_ 548 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
@@ -451,3 +452,4 @@ VAL_ 610 LKA_STATE 25 "temporary_fault" 9 "temporary_fault2" 5 "active" 1 "stand
VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
VAL_ 956 SPORT_ON 0 "off" 1 "on";
VAL_ 956 ECON_ON 0 "off" 1 "on";
VAL_ 956 SPORT_ON_2 0 "off" 1 "on";

0
panda/board/Makefile Normal file
View File

View File

@@ -58,6 +58,11 @@ else:
"-DPANDA",
]
if FindFile('dp_vw_panda', '/data/params/d') != None:
with open('/data/params/d/dp_vw_panda') as f:
if (int(f.read().strip())) == 1:
PROJECT_FLAGS += ['-Dvw']
def get_version(builder, build_type):
try:

View File

@@ -56,12 +56,7 @@ void uno_set_gps_load_switch(bool enabled) {
}
void uno_set_bootkick(bool enabled){
if(enabled){
set_gpio_output(GPIOB, 14, false);
} else {
// We want the pin to be floating, not forced high!
set_gpio_mode(GPIOB, 14, MODE_INPUT);
}
set_gpio_output(GPIOB, 14, !enabled);
}
void uno_bootkick(void) {
@@ -77,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

@@ -109,10 +109,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 (current_board->has_obd) {
current_board->set_can_mode(CAN_MODE_NORMAL);
can_silent = ALL_CAN_SILENT;
} else {
can_silent = ALL_CAN_LIVE;
}
#else
if (current_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(current_board->has_obd ? enable : true);
#else
current_board->enable_can_transceivers(enable);
#endif
// Switch EPS/GPS
if (enable) {

View File

@@ -24,9 +24,32 @@ 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(hw_type == HW_TYPE_WHITE_PANDA || hw_type == HW_TYPE_GREY_PANDA) {
switch (bus_num) {
case 0:
bus_fwd = 2;
break;
case 2:
bus_fwd = 0;
break;
default:
bus_fwd = -1;
break;
}
}
return bus_fwd;
#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;

23
scripts/atl.sh Executable file
View File

@@ -0,0 +1,23 @@
#!/usr/bin/bash
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_logger
printf %s "0" > /data/params/d/dp_athenad
fi
if [ $2 -eq 1 ]; then
printf %s "1" > /data/params/d/dp_atl_op_long
fi
if [ $1 -eq 0 ]; then
printf %s "0" > /data/params/d/dp_atl
printf %s "0" > /data/params/d/dp_atl_op_long
rm -fr /data/openpilot/panda/board/obj/panda.bin
rm -fr /data/openpilot/panda/board/obj/panda.bin.signed
cd /data/openpilot || exit
git reset --hard @{u}
git clean -xdf
fi

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

View File

@@ -0,0 +1,24 @@
#!/usr/bin/env python3
import os
if __name__ == "__main__":
install_font = False
if os.path.isfile("/EON"):
if os.path.islink('/system/fonts/NotoSansTC-Regular.otf'):
install_font = True
if not os.path.isfile("/system/fonts/NotoSansTC-Regular.otf"):
install_font = True
if install_font:
os.system("mount -o remount,rw /system")
os.system("find /system/fonts/NotoSans*.otf -type l -delete")
os.system("cp -frv /usr/share/fonts/NotoSans* /system/fonts/")
os.system("cp -fr /data/openpilot/selfdrive/dragonpilot/fonts.xml /system/etc/fonts.xml")
os.system("chmod 644 /system/etc/fonts.xml")
os.system("chmod 644 /system/fonts/NotoSans*")
os.system("mount -o remount,r /system")
elif os.path.isfile("/TICI"):
pass
else:
pass

View File

@@ -0,0 +1,22 @@
#!/usr/bin/env python3
import os
if __name__ == "__main__":
install_key = False
if os.path.isfile("/EON"):
os.system("setprop persist.neos.ssh 1")
os.system("echo -n 1 > /data/params/d/SshEnabled")
if not os.path.isfile("/data/params/d/GithubSshKeys"):
install_key = True
else:
with open('/data/params/d/GithubSshKeys') as f:
if f.read().strip() == "":
install_key = True
if install_key:
os.system("cp /data/openpilot/scripts/ssh_key/setup_keys /data/params/d/GithubSshKeys")
elif os.path.isfile("/TICI"):
pass
else:
pass

7
scripts/jetson_start.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/usr/bin/env sh
sudo echo 5000 > /sys/devices/c250000.i2c/i2c-7/7-0040/iio:device0/crit_current_limit_0
sudo nvpmodel -m 2 && sudo jetson_clocks
# available freq: 1651200 1728000 1804800 1881600 1907200
for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do echo 1907200 > $i; done
cd /home/openpilot/openpilot/selfdrive/manager && PASSIVE=0 NOSENSOR=1 USE_MIPI=1 ./manager.py

11
scripts/oneplus_update_neos.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/usr/bin/bash
if [ -z "$BASEDIR" ]; then
BASEDIR="/data/openpilot"
fi
source "$BASEDIR/launch_env.sh"
cp -f "$BASEDIR/installer/updater/update.zip" "/sdcard/update.zip" || exit
pm disable ai.comma.plus.offroad
killall _ui
"$BASEDIR/installer/updater/updater" "file://$BASEDIR/installer/updater/oneplus.json"

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

9
scripts/reset_dp.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
rm -fr /data/params/d/dp_*
rm -fr /data/params/d/Dragon*
reboot

8
scripts/reset_update.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/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
rm /data/openpilot/panda/board/obj/panda.bin
cd /data/openpilot && git fetch --all && git reset --hard @{u} && git clean -xdf && scons --clean && reboot

58
scripts/reset_usb.py Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import fcntl
def create_usb_list():
device_list = list()
try:
lsusb_out = Popen('lsusb -v', shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8')
usb_devices = lsusb_out.split('%s%s' % (os.linesep, os.linesep))
for device_categories in usb_devices:
if not device_categories:
continue
categories = device_categories.split(os.linesep)
device_stuff = categories[0].strip().split()
bus = device_stuff[1]
device = device_stuff[3][:-1]
device_dict = {'bus': bus, 'device': device}
device_info = ' '.join(device_stuff[6:])
device_dict['description'] = device_info
for category in categories:
if not category:
continue
categoryinfo = category.strip().split()
if categoryinfo[0] == 'iManufacturer':
manufacturer_info = ' '.join(categoryinfo[2:])
device_dict['manufacturer'] = manufacturer_info
if categoryinfo[0] == 'iProduct':
device_info = ' '.join(categoryinfo[2:])
device_dict['device'] = device_info
path = '/dev/bus/usb/%s/%s' % (bus, device)
device_dict['path'] = path
device_list.append(device_dict)
except Exception as ex:
print('Failed to list usb devices! Error: %s' % ex)
sys.exit(-1)
return device_list
def kill_usb(dev_path):
USBDEVFS_RESET = 21780
try:
f = open(dev_path, 'w', os.O_WRONLY)
fcntl.ioctl(f, USBDEVFS_RESET, 0)
print('Successfully reset %s' % dev_path)
sys.exit(0)
except Exception as ex:
print('Failed to reset device! Error: %s' % ex)
sys.exit(-1)
if __name__ == "__main__":
usb_list = create_usb_list()
for device in usb_list:
if device['manufacturer'] == 'comma.ai':
kill_usb(device['path'])
sys.exit(0)

28
scripts/ssh_key/id_rsa Normal file
View File

@@ -0,0 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC+iXXq30Tq+J5N
Kat3KWHCzcmwZ55nGh6WggAqECa5CasBlM9VeROpVu3beA+5h0MibRgbD4DMtVXB
t6gEvZ8nd04E7eLA9LTZyFDZ7SkSOVj4oXOQsT0GnJmKrASW5KslTWqVzTfo2XCt
Z+004ikLxmyFeBO8NOcErW1pa8gFdQDToH9FrA7kgysic/XVESTOoe7XlzRoe/eZ
acEQ+jtnmFd21A4aEADkk00Ahjr0uKaJiLUAPatxs2icIXWpgYtfqqtaKF23wSt6
1OTu6cAwXbOWr3m+IUSRUO0IRzEIQS3z1jfd1svgzSgSSwZ1Lhj4AoKxIEAIc8qJ
rO4uymCJAgMBAAECggEBAISFevxHGdoL3Z5xkw6oO5SQKO2GxEeVhRzNgmu/HA+q
x8OryqD6O1CWY4037kft6iWxlwiLOdwna2P25ueVM3LxqdQH2KS4DmlCx+kq6FwC
gv063fQPMhC9LpWimvaQSPEC7VUPjQlo4tPY6sTTYBUOh0A1ihRm/x7juKuQCWix
Cq8C/DVnB1X4mGj+W3nJc5TwVJtgJbbiBrq6PWrhvB/3qmkxHRL7dU2SBb2iNRF1
LLY30dJx/cD73UDKNHrlrsjk3UJc29Mp4/MladKvUkRqNwlYxSuAtJV0nZ3+iFkL
s3adSTHdJpClQer45R51rFDlVsDz2ZBpb/hRNRoGDuECgYEA6A1EixLq7QYOh3cb
Xhyh3W4kpVvA/FPfKH1OMy3ONOD/Y9Oa+M/wthW1wSoRL2n+uuIW5OAhTIvIEivj
6bAZsTT3twrvOrvYu9rx9aln4p8BhyvdjeW4kS7T8FP5ol6LoOt2sTP3T1LOuJPO
uQvOjlKPKIMh3c3RFNWTnGzMPa0CgYEA0jNiPLxP3A2nrX0keKDI+VHuvOY88gdh
0W5BuLMLovOIDk9aQFIbBbMuW1OTjHKv9NK+Lrw+YbCFqOGf1dU/UN5gSyE8lX/Q
FsUGUqUZx574nJZnOIcy3ONOnQLcvHAQToLFAGUd7PWgP3CtHkt9hEv2koUwL4vo
ikTP1u9Gkc0CgYEA2apoWxPZrY963XLKBxNQecYxNbLFaWq67t3rFnKm9E8BAICi
4zUaE5J1tMVi7Vi9iks9Ml9SnNyZRQJKfQ+kaebHXbkyAaPmfv+26rqHKboA0uxA
nDOZVwXX45zBkp6g1sdHxJx8JLoGEnkC9eyvSi0C//tRLx86OhLErXwYcNkCf1it
VMRKrWYoXJTUNo6tRhvodM88UnnIo3u3CALjhgU4uC1RTMHV4ZCGBwiAOb8GozSl
s5YD1E1iKwEULloHnK6BIh6P5v8q7J6uf/xdqoKMjlWBHgq6/roxKvkSPA1DOZ3l
jTadcgKFnRUmc+JT9p/ZbCxkA/ALFg8++G+0ghECgYA8vG3M/utweLvq4RI7l7U7
b+i2BajfK2OmzNi/xugfeLjY6k2tfQGRuv6ppTjehtji2uvgDWkgjJUgPfZpir3I
RsVMUiFgloWGHETOy0Qvc5AwtqTJFLTD1Wza2uBilSVIEsg6Y83Gickh+ejOmEsY
6co17RFaAZHwGfCFFjO76Q==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1 @@
from="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+iXXq30Tq+J5NKat3KWHCzcmwZ55nGh6WggAqECa5CasBlM9VeROpVu3beA+5h0MibRgbD4DMtVXBt6gEvZ8nd04E7eLA9LTZyFDZ7SkSOVj4oXOQsT0GnJmKrASW5KslTWqVzTfo2XCtZ+004ikLxmyFeBO8NOcErW1pa8gFdQDToH9FrA7kgysic/XVESTOoe7XlzRoe/eZacEQ+jtnmFd21A4aEADkk00Ahjr0uKaJiLUAPatxs2icIXWpgYtfqqtaKF23wSt61OTu6cAwXbOWr3m+IUSRUO0IRzEIQS3z1jfd1svgzSgSSwZ1Lhj4AoKxIEAIc8qJrO4uymCJ public

View File

@@ -0,0 +1,8 @@
#!/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
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_panda
fi
if [ $1 -eq 0 ]; then
printf %s "0" > /data/params/d/dp_vw_panda
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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 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 "準備好後請鬆開放向盤"

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -18,6 +18,8 @@ from typing import Any
import requests
from jsonrpc import JSONRPCResponseManager, dispatcher
from websocket import ABNF, WebSocketTimeoutException, WebSocketException, create_connection
from common.params import Params
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') if not Params().get_bool("dp_api_custom") else Params().get("dp_api_custom_url", encoding='utf-8')
import cereal.messaging as messaging
from cereal.services import service_list
@@ -26,7 +28,7 @@ from common.file_helpers import CallbackReader
from common.basedir import PERSIST
from common.params import Params
from common.realtime import sec_since_boot
from selfdrive.hardware import HARDWARE, PC, TICI
from selfdrive.hardware import HARDWARE, PC, TICI, JETSON
from selfdrive.loggerd.config import ROOT
from selfdrive.loggerd.xattr_cache import getxattr, setxattr
from selfdrive.swaglog import cloudlog, SWAGLOG_DIR
@@ -60,14 +62,14 @@ def handle_long_poll(ws):
end_event = threading.Event()
threads = [
threading.Thread(target=ws_recv, args=(ws, end_event), name='ws_recv'),
threading.Thread(target=ws_send, args=(ws, end_event), name='ws_send'),
threading.Thread(target=upload_handler, args=(end_event,), name='upload_handler'),
threading.Thread(target=log_handler, args=(end_event,), name='log_handler'),
] + [
threading.Thread(target=jsonrpc_handler, args=(end_event,), name=f'worker_{x}')
for x in range(HANDLER_THREADS)
]
threading.Thread(target=ws_recv, args=(ws, end_event), name='ws_recv'),
threading.Thread(target=ws_send, args=(ws, end_event), name='ws_send'),
threading.Thread(target=upload_handler, args=(end_event,), name='upload_handler'),
threading.Thread(target=log_handler, args=(end_event,), name='log_handler'),
] + [
threading.Thread(target=jsonrpc_handler, args=(end_event,), name=f'worker_{x}')
for x in range(HANDLER_THREADS)
]
for thread in threads:
thread.start()
@@ -373,7 +375,7 @@ def get_logs_to_send_sorted():
def log_handler(end_event):
if PC:
if PC or JETSON:
return
log_files = []
@@ -570,7 +572,7 @@ def main():
params.delete("LastAthenaPingTime")
except socket.timeout:
try:
r = requests.get("http://api.commadotai.com/v1/me", allow_redirects=False,
r = requests.get(API_HOST + "/v1/me", allow_redirects=False,
headers={"User-Agent": f"openpilot-{version}"}, timeout=15.0)
if r.status_code == 302 and r.headers['Location'].startswith("http://u.web2go.com"):
params.put_bool("PrimeRedirected", True)

View File

@@ -11,7 +11,7 @@ from common.spinner import Spinner
from common.file_helpers import mkdirs_exists_ok
from common.basedir import PERSIST
from selfdrive.controls.lib.alertmanager import set_offroad_alert
from selfdrive.hardware import HARDWARE
from selfdrive.hardware import HARDWARE, JETSON
from selfdrive.swaglog import cloudlog
@@ -20,6 +20,10 @@ UNREGISTERED_DONGLE_ID = "UnregisteredDevice"
def register(show_spinner=False) -> str:
params = Params()
if not params.get_bool('dp_reg') or params.get_bool('dp_jetson'):
return UNREGISTERED_DONGLE_ID
if JETSON:
return UNREGISTERED_DONGLE_ID
params.put("SubscriberInfo", HARDWARE.get_subscriber_info())
IMEI = params.get("IMEI", encoding='utf8')

View File

@@ -45,10 +45,13 @@ ExitHandler do_exit;
void safety_setter_thread() {
LOGD("Starting safety setter thread");
// diagnostic only is the default, needed for VIN query
if (!panda->disable_relay) {
panda->set_safety_model(cereal::CarParams::SafetyModel::ELM327);
}
Params p = Params();
if (!panda->disable_relay && !panda->is_old_panda) {
// switch to SILENT when CarVin param is read
while (true) {
if (do_exit || !panda->connected) {
@@ -68,7 +71,7 @@ void safety_setter_thread() {
// VIN query done, stop listening to OBDII
panda->set_safety_model(cereal::CarParams::SafetyModel::ELM327, 1);
}
std::string params;
LOGW("waiting for params to set safety model");
while (true) {
@@ -90,7 +93,7 @@ void safety_setter_thread() {
cereal::CarParams::Reader car_params = cmsg.getRoot<cereal::CarParams>();
cereal::CarParams::SafetyModel safety_model = car_params.getSafetyModel();
panda->set_unsafe_mode(0); // see safety_declarations.h for allowed values
panda->set_unsafe_mode(9); // see safety_declarations.h for allowed values
auto safety_param = car_params.getSafetyParam();
LOGW("setting safety model: %d with param %d", (int)safety_model, safety_param);
@@ -172,7 +175,16 @@ bool usb_connect() {
// must be called before threads or with mutex
static bool usb_retry_connect() {
LOGW("attempting to connect");
#ifdef XNX
// for some reason we need to re-insert panda twice so the system will then detect panda
// we use a python script to simulate the re-insert
while (!do_exit && !usb_connect()) {
std::system("python /home/openpilot/openpilot/scripts/reset_usb.py");
util::sleep_for(500);
}
#else
while (!do_exit && !usb_connect()) { util::sleep_for(100); }
#endif
if (panda) {
LOGW("connected to board");
}
@@ -258,6 +270,7 @@ void panda_state_thread(bool spoofing_started) {
uint32_t no_ignition_cnt = 0;
bool ignition_last = false;
Params params = Params();
if (params.getBool("dp_toyota_disable_relay")) panda->disable_relay = true;
// Broadcast empty pandaState message when panda is not yet connected
while (!do_exit && !panda) {
@@ -276,12 +289,12 @@ void panda_state_thread(bool spoofing_started) {
if (spoofing_started) {
pandaState.ignition_line = 1;
}
if (!panda->disable_relay) {
// Make sure CAN buses are live: safety_setter_thread does not work if Panda CAN are silent and there is only one other CAN node
if (pandaState.safety_model == (uint8_t)(cereal::CarParams::SafetyModel::SILENT)) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
}
}
ignition = ((pandaState.ignition_line != 0) || (pandaState.ignition_can != 0));
if (ignition) {
@@ -295,11 +308,12 @@ void panda_state_thread(bool spoofing_started) {
if (pandaState.power_save_enabled != power_save_desired) {
panda->set_power_saving(power_save_desired);
}
if (!panda->disable_relay) {
// set safety mode to NO_OUTPUT when car is off. ELM327 is an alternative if we want to leverage athenad/connect
if (!ignition && (pandaState.safety_model != (uint8_t)(cereal::CarParams::SafetyModel::NO_OUTPUT))) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
}
}
#endif
// clear VIN, CarParams, and set new safety on car start
@@ -402,7 +416,7 @@ void panda_state_thread(bool spoofing_started) {
void hardware_control_thread() {
LOGD("start hardware control thread");
SubMaster sm({"deviceState", "driverCameraState"});
SubMaster sm({"deviceState", "driverCameraState", "dragonConf"});
uint64_t last_front_frame_t = 0;
uint16_t prev_fan_speed = 999;
@@ -417,7 +431,7 @@ void hardware_control_thread() {
cnt++;
sm.update(1000); // TODO: what happens if EINTR is sent while in sm.update?
if (!Hardware::PC() && sm.updated("deviceState")) {
if (!Hardware::PC() && !Hardware::JETSON() && sm.updated("deviceState")) {
// Charging mode
bool charging_disabled = sm["deviceState"].getDeviceState().getChargingDisabled();
if (charging_disabled != prev_charging_disabled) {
@@ -431,7 +445,6 @@ void hardware_control_thread() {
prev_charging_disabled = charging_disabled;
}
}
// Other pandas don't have fan/IR to control
if (panda->hw_type != cereal::PandaState::PandaType::UNO && panda->hw_type != cereal::PandaState::PandaType::DOS) continue;
if (sm.updated("deviceState")) {
@@ -442,7 +455,7 @@ void hardware_control_thread() {
prev_fan_speed = fan_speed;
}
}
if (sm.updated("driverCameraState")) {
if (!panda->is_old_panda && sm.updated("driverCameraState")) {
auto event = sm["driverCameraState"];
int cur_integ_lines = event.getDriverCameraState().getIntegLines();
float cur_gain = event.getDriverCameraState().getGain();
@@ -482,6 +495,13 @@ static void pigeon_publish_raw(PubMaster &pm, const std::string &dat) {
}
void pigeon_thread() {
// dp - use toyota directly
if (panda->disable_relay) {
panda->set_safety_model(cereal::CarParams::SafetyModel::TOYOTA);
}
if (!panda->has_gps) return;
PubMaster pm({"ubloxRaw"});
bool ignition_last = false;
@@ -563,7 +583,7 @@ int main() {
err = set_realtime_priority(54);
LOG("set priority returns %d", err);
err = set_core_affinity(Hardware::TICI() ? 4 : 3);
err = set_core_affinity(Hardware::TICI()? 4 : Hardware::JETSON()? 2 : 3);
LOG("set affinity returns %d", err);
while (!do_exit) {

View File

@@ -45,6 +45,7 @@ Panda::Panda(std::string serial) {
dev_handle = NULL;
}
}
if (dev_handle == NULL) goto fail;
libusb_free_device_list(dev_list, 1);
if (libusb_kernel_driver_active(dev_handle, 0) == 1) {
@@ -59,8 +60,13 @@ Panda::Panda(std::string serial) {
hw_type = get_hw_type();
assert((hw_type != cereal::PandaState::PandaType::WHITE_PANDA) &&
(hw_type != cereal::PandaState::PandaType::GREY_PANDA));
// dp - fake black panda
has_gps = hw_type != cereal::PandaState::PandaType::WHITE_PANDA;
LOGW("Panda.cc - has_gps: %s", has_gps? "True": "False");
is_old_panda = hw_type == cereal::PandaState::PandaType::WHITE_PANDA || hw_type == cereal::PandaState::PandaType::GREY_PANDA;
LOGW("Panda.cc - is_old_panda: %s", is_old_panda? "True": "False");
hw_type = is_old_panda? cereal::PandaState::PandaType::BLACK_PANDA : hw_type;
has_rtc = (hw_type == cereal::PandaState::PandaType::UNO) ||
(hw_type == cereal::PandaState::PandaType::DOS);

View File

@@ -81,4 +81,9 @@ class Panda {
void send_heartbeat();
void can_send(capnp::List<cereal::CanData>::Reader can_data_list);
int can_receive(kj::Array<capnp::word>& out_buf);
// dp
bool has_gps = true;
bool is_old_panda = false;
bool disable_relay = false;
};

View File

@@ -1,4 +1,4 @@
Import('env', 'arch', 'cereal', 'messaging', 'common', 'gpucommon', 'visionipc', 'USE_WEBCAM')
Import('env', 'arch', 'cereal', 'messaging', 'common', 'gpucommon', 'visionipc', 'USE_WEBCAM', 'USE_MIPI')
libs = ['m', 'pthread', common, 'jpeg', 'OpenCL', cereal, messaging, 'zmq', 'capnp', 'kj', visionipc, gpucommon]
@@ -9,13 +9,15 @@ elif arch == "larch64":
libs += ['atomic']
cameras = ['cameras/camera_qcom2.cc']
else:
if USE_WEBCAM:
if USE_MIPI or USE_WEBCAM:
flag = "MIPI" if USE_MIPI else "WEBCAM"
libs += ['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_videoio']
cameras = ['cameras/camera_webcam.cc']
cameras = ['cameras/camera_%s.cc' % flag.lower()]
env = env.Clone()
env.Append(CXXFLAGS = '-DWEBCAM')
env.Append(CFLAGS = '-DWEBCAM')
env.Append(CPPPATH = '/usr/local/include/opencv4')
env.Append(CXXFLAGS = "-D%s" % flag)
env.Append(CFLAGS = "-D%s" % flag)
env.Append(CPPPATH = '/usr/include/opencv4')
else:
cameras = ['cameras/camera_frame_stream.cc']

View File

@@ -24,6 +24,8 @@
#include "selfdrive/camerad/cameras/camera_qcom2.h"
#elif WEBCAM
#include "selfdrive/camerad/cameras/camera_webcam.h"
#elif MIPI
#include "selfdrive/camerad/cameras/camera_mipi.h"
#else
#include "selfdrive/camerad/cameras/camera_frame_stream.h"
#endif

View File

@@ -24,7 +24,8 @@
#define CAMERA_ID_LGC920 6
#define CAMERA_ID_LGC615 7
#define CAMERA_ID_AR0231 8
#define CAMERA_ID_MAX 9
#define CAMERA_ID_IMX219 9
#define CAMERA_ID_MAX 10
#define UI_BUF_COUNT 4

View File

@@ -0,0 +1,152 @@
#include "selfdrive/camerad/cameras/camera_mipi.h"
#include <assert.h>
#include <string.h>
#include <unistd.h>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundefined-inline"
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#pragma clang diagnostic pop
#include "selfdrive/common/clutil.h"
#include "selfdrive/common/swaglog.h"
#include "selfdrive/common/timing.h"
#include "selfdrive/common/util.h"
#define FRAME_WIDTH 1164
#define FRAME_HEIGHT 874
extern ExitHandler do_exit;
namespace {
CameraInfo cameras_supported[CAMERA_ID_MAX] = {
// road facing
[CAMERA_ID_IMX219] = {
.frame_width = FRAME_WIDTH,
.frame_height = FRAME_HEIGHT,
.frame_stride = FRAME_WIDTH*3,
.bayer = false,
.bayer_flip = false,
},
};
std::string gstreamer_pipeline(int sensor_mode, int sensor_id, int flip_method, int display_width, int display_height) {
// sensor mode 2 = 1920 x 1080
return "nvarguscamerasrc sensor_mode=" + std::to_string(sensor_mode) +
" sensor-id=" + std::to_string(sensor_id) +
" ! video/x-raw(memory:NVMM), format=(string)NV12" +
" ! nvvidconv flip-method=" + std::to_string(flip_method) +
" ! videoconvert ! video/x-raw, format=(string)BGR" +
", width=(int)" + std::to_string(display_width) +
", height=(int)" + std::to_string(display_height) +
" ! appsink";
}
void camera_open(CameraState *s, bool rear) {
// empty
}
void camera_close(CameraState *s) {
// empty
}
void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type) {
assert(camera_id < std::size(cameras_supported));
s->ci = cameras_supported[camera_id];
assert(s->ci.frame_width != 0);
s->camera_num = camera_id;
s->fps = fps;
s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type);
}
void run_camera(CameraState *s, cv::VideoCapture &video_cap, float *ts) {
assert(video_cap.isOpened());
cv::Size size(s->ci.frame_width, s->ci.frame_height);
const cv::Mat transform = cv::Mat(3, 3, CV_32F, ts);
uint32_t frame_id = 0;
size_t buf_idx = 0;
while (!do_exit) {
cv::Mat frame_mat, transformed_mat;
video_cap >> frame_mat;
cv::warpPerspective(frame_mat, transformed_mat, transform, size, cv::INTER_LINEAR, cv::BORDER_CONSTANT, 0);
s->buf.camera_bufs_metadata[buf_idx] = {.frame_id = frame_id};
auto &buf = s->buf.camera_bufs[buf_idx];
int transformed_size = transformed_mat.total() * transformed_mat.elemSize();
CL_CHECK(clEnqueueWriteBuffer(buf.copy_q, buf.buf_cl, CL_TRUE, 0, transformed_size, transformed_mat.data, 0, NULL, NULL));
s->buf.queue(buf_idx);
++frame_id;
buf_idx = (buf_idx + 1) % FRAME_BUF_COUNT;
}
}
static void road_camera_thread(CameraState *s) {
set_thread_name("mipi_road_camera_thread");
std::string pipeline = gstreamer_pipeline(
2, // sensor mode
0, // sensor id
2, // flip method
704, // width
396); // height
cv::VideoCapture cap_road(pipeline, cv::CAP_GSTREAMER); // road
// transforms calculation see tools/webcam/warp_vis.py
float ts[9] = {1.50330396, 0.0, -59.40969163,
0.0, 1.50330396, 76.20704846,
0.0, 0.0, 1.0};
run_camera(s, cap_road, ts);
}
} // namespace
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {
camera_init(v, &s->road_cam, CAMERA_ID_IMX219, 20, device_id, ctx,
VISION_STREAM_RGB_BACK, VISION_STREAM_YUV_BACK);
s->pm = new PubMaster({"roadCameraState", "thumbnail"});
}
void camera_autoexposure(CameraState *s, float grey_frac) {}
void cameras_open(MultiCameraState *s) {
camera_open(&s->road_cam, true);
}
void cameras_close(MultiCameraState *s) {
camera_close(&s->road_cam);
delete s->pm;
}
void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) {
const CameraBuf *b = &c->buf;
MessageBuilder msg;
auto framed = msg.initEvent().initRoadCameraState();
fill_frame_data(framed, b->cur_frame_data);
framed.setImage(kj::arrayPtr((const uint8_t *)b->cur_yuv_buf->addr, b->cur_yuv_buf->len));
framed.setTransform(b->yuv_transform.v);
s->pm->send("roadCameraState", msg);
}
void cameras_run(MultiCameraState *s) {
std::vector<std::thread> threads;
threads.push_back(start_process_thread(s, &s->road_cam, process_road_camera));
std::thread t_rear = std::thread(road_camera_thread, &s->road_cam);
set_thread_name("mipi_thread");
t_rear.join();
for (auto &t : threads) t.join();
cameras_close(s);
}

View File

@@ -0,0 +1,28 @@
#pragma once
#ifdef __APPLE__
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif
#include "selfdrive/camerad/cameras/camera_common.h"
#define FRAME_BUF_COUNT 16
typedef struct CameraState {
CameraInfo ci;
int camera_num;
int fps;
float digital_gain;
CameraBuf buf;
} CameraState;
typedef struct MultiCameraState {
CameraState road_cam;
CameraState driver_cam;
SubMaster *sm;
PubMaster *pm;
} MultiCameraState;

View File

@@ -27,7 +27,7 @@
// leeco actuator (DW9800W H-Bridge Driver IC)
// from sniff
const uint16_t INFINITY_DAC = 364;
//const uint16_t INFINITY_DAC = 364;
extern ExitHandler do_exit;
@@ -48,9 +48,25 @@ CameraInfo cameras_supported[CAMERA_ID_MAX] = {
.frame_height = 1748,
.frame_stride = 2912,
.bayer = true,
.bayer_flip = 3,
.bayer_flip = 0,
.hdr = true
},
[CAMERA_ID_IMX179] = {
.frame_width = 3280,
.frame_height = 2464,
.frame_stride = 4104,
.bayer = true,
.bayer_flip = 0,
.hdr = false
},
[CAMERA_ID_S5K3P8SP] = {
.frame_width = 2304,
.frame_height = 1728,
.frame_stride = 2880,
.bayer = true,
.bayer_flip = 1,
.hdr = false
},
[CAMERA_ID_OV8865] = {
.frame_width = 1632,
.frame_height = 1224,
@@ -162,6 +178,24 @@ static int ov8865_apply_exposure(CameraState *s, int gain, int integ_lines, uint
return sensor_write_regs(s, reg_array, std::size(reg_array), MSM_CAMERA_I2C_BYTE_DATA);
}
static int imx179_s5k3p8sp_apply_exposure(CameraState *s, int gain, int integ_lines, uint32_t frame_length) {
//printf("driver camera: %d %d %d\n", gain, integ_lines, frame_length);
struct msm_camera_i2c_reg_array reg_array[] = {
{0x104,0x1,0},
// FRM_LENGTH
{0x340, (uint16_t)(frame_length >> 8), 0}, {0x341, (uint16_t)(frame_length & 0xff), 0},
// coarse_int_time
{0x202, (uint16_t)(integ_lines >> 8), 0}, {0x203, (uint16_t)(integ_lines & 0xff),0},
// global_gain
{0x204, (uint16_t)(gain >> 8), 0}, {0x205, (uint16_t)(gain & 0xff),0},
// REG_HOLD
{0x104,0x0,0},
};
return sensor_write_regs(s, reg_array, std::size(reg_array), MSM_CAMERA_I2C_BYTE_DATA);
}
static void camera_init(VisionIpcServer *v, CameraState *s, int camera_id, int camera_num,
uint32_t pixel_clock, uint32_t line_length_pclk,
uint32_t max_gain, uint32_t fps, cl_device_id device_id, cl_context ctx,
@@ -179,18 +213,41 @@ static void camera_init(VisionIpcServer *v, CameraState *s, int camera_id, int c
s->frame_length = s->pixel_clock / line_length_pclk / s->fps;
s->self_recover = 0;
s->apply_exposure = (camera_id == CAMERA_ID_IMX298) ? imx298_apply_exposure : ov8865_apply_exposure;
if (camera_id == CAMERA_ID_IMX298) {
s->apply_exposure = imx298_apply_exposure;
} else if (camera_id == CAMERA_ID_S5K3P8SP || camera_id == CAMERA_ID_IMX179) {
s->apply_exposure = imx179_s5k3p8sp_apply_exposure;
} else {
s->apply_exposure = ov8865_apply_exposure;
}
s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type, camera_release_buffer);
}
void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) {
char project_name[1024] = {0};
property_get("ro.boot.project_name", project_name, "");
assert(strlen(project_name) == 0);
// sensor is flipped in LP3
// IMAGE_ORIENT = 3
init_array_imx298[0].reg_data = 3;
char product_name[1024] = {0};
property_get("ro.product.name", product_name, "");
if (strlen(project_name) == 0) {
LOGD("LePro 3 op system detected");
s->device = DEVICE_LP3;
// sensor is flipped in LP3
// IMAGE_ORIENT = 3
init_array_imx298[0].reg_data = 3;
cameras_supported[CAMERA_ID_IMX298].bayer_flip = 3;
} else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") != 0) {
// no more OP3 support
s->device = DEVICE_OP3;
assert(false);
} else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") == 0) {
// only OP3T support
s->device = DEVICE_OP3T;
} else {
assert(false);
}
// 0 = ISO 100
// 256 = ISO 200
@@ -212,11 +269,30 @@ void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_i
#endif
device_id, ctx,
VISION_STREAM_RGB_BACK, VISION_STREAM_YUV_BACK);
s->road_cam.apply_exposure = imx298_apply_exposure;
camera_init(v, &s->driver_cam, CAMERA_ID_OV8865, 1,
/*pixel_clock=*/72000000, /*line_length_pclk=*/1602,
/*max_gain=*/510, 10, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
if (s->device == DEVICE_OP3T) {
camera_init(v, &s->driver_cam, CAMERA_ID_S5K3P8SP, 1,
/*pixel_clock=*/560000000, /*line_length_pclk=*/5120,
/*max_gain=*/510, 10, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
s->driver_cam.apply_exposure = imx179_s5k3p8sp_apply_exposure;
} else if (s->device == DEVICE_LP3) {
camera_init(v, &s->driver_cam, CAMERA_ID_OV8865, 1,
/*pixel_clock=*/72000000, /*line_length_pclk=*/1602,
/*max_gain=*/510, 10, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
s->driver_cam.apply_exposure = ov8865_apply_exposure;
} else {
camera_init(v, &s->driver_cam, CAMERA_ID_IMX179, 1,
/*pixel_clock=*/251200000, /*line_length_pclk=*/3440,
/*max_gain=*/224, 20, device_id, ctx,
VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT);
s->driver_cam.apply_exposure = imx179_s5k3p8sp_apply_exposure;
}
s->road_cam.device = s->device;
s->driver_cam.device = s->device;
s->sm = new SubMaster({"driverState"});
s->pm = new PubMaster({"roadCameraState", "driverCameraState", "thumbnail"});
@@ -260,8 +336,10 @@ static void set_exposure(CameraState *s, float exposure_frac, float gain_frac) {
if (gain != s->cur_gain || integ_lines != s->cur_integ_lines) {
if (s->apply_exposure == ov8865_apply_exposure) {
gain = 800 * gain_frac; // ISO
err = s->apply_exposure(s, gain, integ_lines, s->frame_length);
} else if (s->apply_exposure) {
err = s->apply_exposure(s, gain, integ_lines, s->frame_length);
}
err = s->apply_exposure(s, gain, integ_lines, s->frame_length);
if (err == 0) {
std::lock_guard lk(s->frame_info_lock);
s->cur_gain = gain;
@@ -326,95 +404,310 @@ static void do_autoexposure(CameraState *s, float grey_frac) {
}
}
static void sensors_init(MultiCameraState *s) {
msm_camera_sensor_slave_info slave_infos[2] = {
(msm_camera_sensor_slave_info){ // road camera
.sensor_name = "imx298",
.eeprom_name = "sony_imx298",
.actuator_name = "dw9800w",
.ois_name = "",
.flash_name = "pmic",
.camera_id = CAMERA_0,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664, .module_id = 9, .vcm_id = 6},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_GPIO, .seq_val = 5, .config_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 10},
},
.size = 7,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_GPIO, .seq_val = 5},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
},
.size_down = 6,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 90},
.output_format = MSM_SENSOR_BAYER,
},
(msm_camera_sensor_slave_info){ // driver camera
.sensor_name = "ov8865_sunny",
.eeprom_name = "ov8865_plus",
.actuator_name = "",
.ois_name = "",
.flash_name = "",
.camera_id = CAMERA_2,
.slave_addr = 108,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 12299, .sensor_id = 34917, .module_id = 2},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1},
},
.size = 6,
.power_down_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
}};
static uint8_t* get_eeprom(int eeprom_fd, size_t *out_len) {
msm_eeprom_cfg_data cfg = {.cfgtype = CFG_EEPROM_GET_CAL_DATA};
int err = cam_ioctl(eeprom_fd, VIDIOC_MSM_EEPROM_CFG, &cfg, "get_eeprom begin");
assert(err >= 0);
unique_fd sensorinit_fd = open("/dev/v4l-subdev11", O_RDWR | O_NONBLOCK);
assert(sensorinit_fd >= 0);
for (auto &info : slave_infos) {
info.power_setting_array.power_setting = &info.power_setting_array.power_setting_a[0];
info.power_setting_array.power_down_setting = &info.power_setting_array.power_down_setting_a[0];
sensor_init_cfg_data sensor_init_cfg = {.cfgtype = CFG_SINIT_PROBE, .cfg.setting = &info};
int err = cam_ioctl(sensorinit_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &sensor_init_cfg, "sensor init cfg");
assert(err >= 0);
uint32_t num_bytes = cfg.cfg.get_data.num_bytes;
assert(num_bytes > 100);
uint8_t* buffer = (uint8_t*)malloc(num_bytes);
assert(buffer);
memset(buffer, 0, num_bytes);
cfg.cfgtype = CFG_EEPROM_READ_CAL_DATA;
cfg.cfg.read_data.num_bytes = num_bytes;
cfg.cfg.read_data.dbuffer = buffer;
err = cam_ioctl(eeprom_fd, VIDIOC_MSM_EEPROM_CFG, &cfg, "get_eeprom end");
assert(err >= 0);
*out_len = num_bytes;
return buffer;
}
static void imx298_ois_calibration(int ois_fd, uint8_t* eeprom) {
const int ois_registers[][2] = {
// == SET_FADJ_PARAM() == (factory adjustment)
// Set Hall Current DAC
{0x8230, *(uint16_t*)(eeprom+0x102)}, //_P_30_ADC_CH0 (CURDAT)
// Set Hall PreAmp Offset
{0x8231, *(uint16_t*)(eeprom+0x104)}, //_P_31_ADC_CH1 (HALOFS_X)
{0x8232, *(uint16_t*)(eeprom+0x106)}, //_P_32_ADC_CH2 (HALOFS_Y)
// Set Hall-X/Y PostAmp Offset
{0x841e, *(uint16_t*)(eeprom+0x108)}, //_M_X_H_ofs
{0x849e, *(uint16_t*)(eeprom+0x10a)}, //_M_Y_H_ofs
// Set Residual Offset
{0x8239, *(uint16_t*)(eeprom+0x10c)}, //_P_39_Ch3_VAL_1 (PSTXOF)
{0x823b, *(uint16_t*)(eeprom+0x10e)}, //_P_3B_Ch3_VAL_3 (PSTYOF)
// DIGITAL GYRO OFFSET
{0x8406, *(uint16_t*)(eeprom+0x110)}, //_M_Kgx00
{0x8486, *(uint16_t*)(eeprom+0x112)}, //_M_Kgy00
{0x846a, *(uint16_t*)(eeprom+0x120)}, //_M_TMP_X_
{0x846b, *(uint16_t*)(eeprom+0x122)}, //_M_TMP_Y_
// HALLSENSE
// Set Hall Gain
{0x8446, *(uint16_t*)(eeprom+0x114)}, //_M_KgxHG
{0x84c6, *(uint16_t*)(eeprom+0x116)}, //_M_KgyHG
// Set Cross Talk Canceller
{0x8470, *(uint16_t*)(eeprom+0x124)}, //_M_KgxH0
{0x8472, *(uint16_t*)(eeprom+0x126)}, //_M_KgyH0
// LOOPGAIN
{0x840f, *(uint16_t*)(eeprom+0x118)}, //_M_KgxG
{0x848f, *(uint16_t*)(eeprom+0x11a)}, //_M_KgyG
// Position Servo ON ( OIS OFF )
{0x847f, 0x0c0c}, //_M_EQCTL
};
struct msm_camera_i2c_seq_reg_array ois_reg_settings[std::size(ois_registers)] = {{0}};
for (int i=0; i<std::size(ois_registers); i++) {
ois_reg_settings[i].reg_addr = ois_registers[i][0];
ois_reg_settings[i].reg_data[0] = ois_registers[i][1] & 0xff;
ois_reg_settings[i].reg_data[1] = (ois_registers[i][1] >> 8) & 0xff;
ois_reg_settings[i].reg_data_size = 2;
}
struct msm_camera_i2c_seq_reg_setting ois_reg_setting = {
.reg_setting = &ois_reg_settings[0],
.size = std::size(ois_reg_settings),
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.delay = 0,
};
msm_ois_cfg_data cfg = {.cfgtype = CFG_OIS_I2C_WRITE_SEQ_TABLE, .cfg.settings = &ois_reg_setting};
cam_ioctl(ois_fd, VIDIOC_MSM_OIS_CFG, &cfg, "ois reg calibration");
}
static void sensors_init(MultiCameraState *s) {
int err;
unique_fd sensorinit_fd;
if (s->device == DEVICE_LP3) {
sensorinit_fd = open("/dev/v4l-subdev11", O_RDWR | O_NONBLOCK);
} else {
sensorinit_fd = open("/dev/v4l-subdev12", O_RDWR | O_NONBLOCK);
}
assert(sensorinit_fd >= 0);
// init road camera sensor
struct msm_camera_sensor_slave_info slave_info = {0};
if (s->device == DEVICE_LP3) {
slave_info = (struct msm_camera_sensor_slave_info){
.sensor_name = "imx298",
.eeprom_name = "sony_imx298",
.actuator_name = "dw9800w",
.ois_name = "",
.flash_name = "pmic",
.camera_id = CAMERA_0,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664, .module_id = 9, .vcm_id = 6},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_GPIO, .seq_val = 5, .config_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 10},
},
.size = 7,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_GPIO, .seq_val = 5},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
},
.size_down = 6,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 90},
.output_format = MSM_SENSOR_BAYER,
};
} else {
slave_info = (struct msm_camera_sensor_slave_info){
.sensor_name = "imx298",
.eeprom_name = "sony_imx298",
.actuator_name = "rohm_bu63165gwl",
.ois_name = "rohm_bu63165gwl",
.camera_id = CAMERA_0,
.slave_addr = 52,
.i2c_freq_mode = I2C_CUSTOM_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 22, .sensor_id = 664},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 2},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 2},
{.seq_type = SENSOR_VREG, .delay = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 2},
{.seq_type = SENSOR_GPIO, .seq_val = 6, .config_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 5},
{.seq_type = SENSOR_VREG, .seq_val = 4, .delay = 5},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 2},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 2},
},
.size = 9,
.power_down_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 10},
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 4},
{.seq_type = SENSOR_VREG, .seq_val = 3, .delay = 1},
{.seq_type = SENSOR_GPIO, .seq_val = 6},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_VREG, .seq_val = 2},
},
.size_down = 8,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = BACK_CAMERA_B, .sensor_mount_angle = 360},
.output_format = MSM_SENSOR_BAYER,
};
}
slave_info.power_setting_array.power_setting =
(struct msm_sensor_power_setting *)&slave_info.power_setting_array.power_setting_a[0];
slave_info.power_setting_array.power_down_setting =
(struct msm_sensor_power_setting *)&slave_info.power_setting_array.power_down_setting_a[0];
sensor_init_cfg_data sensor_init_cfg = {.cfgtype = CFG_SINIT_PROBE, .cfg.setting = &slave_info};
err = cam_ioctl(sensorinit_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &sensor_init_cfg, "sensor init cfg (road)");
assert(err >= 0);
struct msm_camera_sensor_slave_info slave_info2 = {0};
if (s->device == DEVICE_LP3) {
slave_info2 = (struct msm_camera_sensor_slave_info){
.sensor_name = "ov8865_sunny",
.eeprom_name = "ov8865_plus",
.actuator_name = "",
.ois_name = "",
.flash_name = "",
.camera_id = CAMERA_2,
.slave_addr = 108,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 12299, .sensor_id = 34917, .module_id = 2},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1},
},
.size = 6,
.power_down_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 5},
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
};
} else if (s->driver_cam.camera_id == CAMERA_ID_S5K3P8SP) {
// init driver camera
slave_info2 = (struct msm_camera_sensor_slave_info){
.sensor_name = "s5k3p8sp",
.eeprom_name = "s5k3p8sp_m24c64s",
.actuator_name = "",
.ois_name = "",
.camera_id = CAMERA_1,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id = 12552},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 1},
{.seq_type = SENSOR_VREG, .delay = 1},
{.seq_type = SENSOR_CLK, .config_val = 24000000, .delay = 1},
{.seq_type = SENSOR_GPIO, .config_val = 2, .delay = 1},
},
.size = 6,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK, .delay = 1},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 1, .delay = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2, .delay = 1},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
};
} else {
// init driver camera
slave_info2 = (struct msm_camera_sensor_slave_info){
.sensor_name = "imx179",
.eeprom_name = "sony_imx179",
.actuator_name = "",
.ois_name = "",
.camera_id = CAMERA_1,
.slave_addr = 32,
.i2c_freq_mode = I2C_FAST_MODE,
.addr_type = MSM_CAMERA_I2C_WORD_ADDR,
.sensor_id_info = {.sensor_id_reg_addr = 2, .sensor_id = 377, .sensor_id_mask = 4095},
.power_setting_array = {
.power_setting_a = {
{.seq_type = SENSOR_VREG, .seq_val = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG},
{.seq_type = SENSOR_GPIO, .config_val = 2},
{.seq_type = SENSOR_CLK, .config_val = 24000000},
},
.size = 5,
.power_down_setting_a = {
{.seq_type = SENSOR_CLK},
{.seq_type = SENSOR_GPIO, .delay = 1},
{.seq_type = SENSOR_VREG, .delay = 2},
{.seq_type = SENSOR_VREG, .seq_val = 1},
{.seq_type = SENSOR_VREG, .seq_val = 2},
},
.size_down = 5,
},
.is_init_params_valid = 0,
.sensor_init_params = {.modes_supported = 1, .position = FRONT_CAMERA_B, .sensor_mount_angle = 270},
.output_format = MSM_SENSOR_BAYER,
};
}
slave_info2.power_setting_array.power_setting =
(struct msm_sensor_power_setting *)&slave_info2.power_setting_array.power_setting_a[0];
slave_info2.power_setting_array.power_down_setting =
(struct msm_sensor_power_setting *)&slave_info2.power_setting_array.power_down_setting_a[0];
sensor_init_cfg.cfgtype = CFG_SINIT_PROBE;
sensor_init_cfg.cfg.setting = &slave_info2;
err = cam_ioctl(sensorinit_fd, VIDIOC_MSM_SENSOR_INIT_CFG, &sensor_init_cfg, "sensor init cfg (driver)");
assert(err >= 0);
}
static void camera_open(CameraState *s, bool is_road_cam) {
int err;
struct csid_cfg_data csid_cfg_data = {};
struct v4l2_event_subscription sub = {};
struct msm_actuator_cfg_data actuator_cfg_data = {};
struct msm_ois_cfg_data ois_cfg_data = {};
// open devices
const char *sensor_dev;
@@ -423,19 +716,45 @@ static void camera_open(CameraState *s, bool is_road_cam) {
assert(s->csid_fd >= 0);
s->csiphy_fd = open("/dev/v4l-subdev0", O_RDWR | O_NONBLOCK);
assert(s->csiphy_fd >= 0);
sensor_dev = "/dev/v4l-subdev17";
s->isp_fd = open("/dev/v4l-subdev13", O_RDWR | O_NONBLOCK);
if (s->device == DEVICE_LP3) {
sensor_dev = "/dev/v4l-subdev17";
} else {
sensor_dev = "/dev/v4l-subdev18";
}
if (s->device == DEVICE_LP3) {
s->isp_fd = open("/dev/v4l-subdev13", O_RDWR | O_NONBLOCK);
} else {
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK);
}
assert(s->isp_fd >= 0);
s->eeprom_fd = open("/dev/v4l-subdev8", O_RDWR | O_NONBLOCK);
assert(s->eeprom_fd >= 0);
s->actuator_fd = open("/dev/v4l-subdev7", O_RDWR | O_NONBLOCK);
assert(s->actuator_fd >= 0);
if (s->device != DEVICE_LP3) {
s->ois_fd = open("/dev/v4l-subdev10", O_RDWR | O_NONBLOCK);
assert(s->ois_fd >= 0);
}
} else {
s->csid_fd = open("/dev/v4l-subdev5", O_RDWR | O_NONBLOCK);
assert(s->csid_fd >= 0);
s->csiphy_fd = open("/dev/v4l-subdev2", O_RDWR | O_NONBLOCK);
assert(s->csiphy_fd >= 0);
sensor_dev = "/dev/v4l-subdev18";
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK);
if (s->device == DEVICE_LP3) {
sensor_dev = "/dev/v4l-subdev18";
} else {
sensor_dev = "/dev/v4l-subdev19";
}
if (s->device == DEVICE_LP3) {
s->isp_fd = open("/dev/v4l-subdev14", O_RDWR | O_NONBLOCK);
} else {
s->isp_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK);
}
assert(s->isp_fd >= 0);
s->eeprom_fd = open("/dev/v4l-subdev9", O_RDWR | O_NONBLOCK);
assert(s->eeprom_fd >= 0);
}
// wait for sensor device
@@ -454,7 +773,7 @@ static void camera_open(CameraState *s, bool is_road_cam) {
struct msm_camera_csi_lane_params csi_lane_params = {0};
csi_lane_params.csi_lane_mask = 0x1f;
csiphy_cfg_data csiphy_cfg_data = { .cfg.csi_lane_params = &csi_lane_params, .cfgtype = CSIPHY_RELEASE};
int err = cam_ioctl(s->csiphy_fd, VIDIOC_MSM_CSIPHY_IO_CFG, &csiphy_cfg_data, "release csiphy");
err = cam_ioctl(s->csiphy_fd, VIDIOC_MSM_CSIPHY_IO_CFG, &csiphy_cfg_data, "release csiphy");
// CSID: release csid
csid_cfg_data.cfgtype = CSID_RELEASE;
@@ -468,6 +787,12 @@ static void camera_open(CameraState *s, bool is_road_cam) {
actuator_cfg_data.cfgtype = CFG_ACTUATOR_POWERDOWN;
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator powerdown");
if (is_road_cam && s->device != DEVICE_LP3) {
// ois powerdown
ois_cfg_data.cfgtype = CFG_OIS_POWERDOWN;
err = cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois powerdown");
}
// reset isp
// struct msm_vfe_axi_halt_cmd halt_cmd = {
// .stop_camif = 1,
@@ -493,6 +818,8 @@ static void camera_open(CameraState *s, bool is_road_cam) {
// **** GO GO GO ****
LOG("******************** GO GO GO ************************");
s->eeprom = get_eeprom(s->eeprom_fd, &s->eeprom_size);
// CSID: init csid
csid_cfg_data.cfgtype = CSID_INIT;
cam_ioctl(s->csid_fd, VIDIOC_MSM_CSID_IO_CFG, &csid_cfg_data, "init csid");
@@ -522,6 +849,10 @@ static void camera_open(CameraState *s, bool is_road_cam) {
// SENSOR: send i2c configuration
if (s->camera_id == CAMERA_ID_IMX298) {
err = sensor_write_regs(s, init_array_imx298, std::size(init_array_imx298), MSM_CAMERA_I2C_BYTE_DATA);
} else if (s->camera_id == CAMERA_ID_S5K3P8SP) {
err = sensor_write_regs(s, init_array_s5k3p8sp, std::size(init_array_s5k3p8sp), MSM_CAMERA_I2C_WORD_DATA);
} else if (s->camera_id == CAMERA_ID_IMX179) {
err = sensor_write_regs(s, init_array_imx179, std::size(init_array_imx179), MSM_CAMERA_I2C_BYTE_DATA);
} else if (s->camera_id == CAMERA_ID_OV8865) {
err = sensor_write_regs(s, init_array_ov8865, std::size(init_array_ov8865), MSM_CAMERA_I2C_BYTE_DATA);
} else {
@@ -537,56 +868,137 @@ static void camera_open(CameraState *s, bool is_road_cam) {
actuator_cfg_data.cfgtype = CFG_ACTUATOR_INIT;
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator init");
struct msm_actuator_reg_params_t actuator_reg_params[] = {
{
.reg_write_type = MSM_ACTUATOR_WRITE_DAC,
// MSB here at address 3
.reg_addr = 3,
.data_type = 9,
.addr_type = 4,
},
};
// no OIS in LP3
if (s->device != DEVICE_LP3) {
// see sony_imx298_eeprom_format_afdata in libmmcamera_sony_imx298_eeprom.so
const float far_margin = -0.28;
uint16_t macro_dac = *(uint16_t*)(s->eeprom + 0x24);
s->infinity_dac = *(uint16_t*)(s->eeprom + 0x26);
LOG("macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac);
struct reg_settings_t actuator_init_settings[] = {
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=1, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // PD = power down
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=0, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // 0 = power up
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=2, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // RING = SAC mode
{ .reg_addr=6, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=64, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // 0x40 = SAC3 mode
{ .reg_addr=7, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=113, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 },
// 0x71 = DIV1 | DIV0 | SACT0 -- Tvib x 1/4 (quarter)
// SAC Tvib = 6.3 ms + 0.1 ms = 6.4 ms / 4 = 1.6 ms
// LSC 1-step = 252 + 1*4 = 256 ms / 4 = 64 ms
};
int dac_range = macro_dac - s->infinity_dac;
s->infinity_dac += far_margin * dac_range;
struct region_params_t region_params[] = {
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128}
};
LOG(" -> macro_dac: %d infinity_dac: %d", macro_dac, s->infinity_dac);
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO;
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){
.actuator_params = {
.act_type = ACTUATOR_BIVCM,
.reg_tbl_size = 1,
.data_size = 10,
.init_setting_size = 5,
.i2c_freq_mode = I2C_STANDARD_MODE,
.i2c_addr = 24,
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR,
.i2c_data_type = MSM_ACTUATOR_WORD_DATA,
.reg_tbl_params = &actuator_reg_params[0],
.init_settings = &actuator_init_settings[0],
.park_lens = {.damping_step = 1023, .damping_delay = 14000, .hw_params = 11, .max_step = 20},
},
.af_tuning_params = {
.initial_code = INFINITY_DAC,
.pwd_step = 0,
.region_size = 1,
.total_steps = 238,
.region_params = &region_params[0],
},
};
struct msm_actuator_reg_params_t actuator_reg_params[] = {
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 240, .data_type = 10, .addr_type = 4},
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 241, .data_type = 10, .addr_type = 4},
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 242, .data_type = 10, .addr_type = 4},
{.reg_write_type = MSM_ACTUATOR_WRITE_DAC, .reg_addr = 243, .data_type = 10, .addr_type = 4},
};
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set info");
//...
struct reg_settings_t actuator_init_settings[1] = {0};
struct region_params_t region_params[] = {
{.step_bound = {512, 0,}, .code_per_step = 118, .qvalue = 128}
};
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO;
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){
.actuator_params = {
.act_type = ACTUATOR_VCM,
.reg_tbl_size = 4,
.data_size = 10,
.init_setting_size = 0,
.i2c_freq_mode = I2C_CUSTOM_MODE,
.i2c_addr = 28,
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR,
.i2c_data_type = MSM_ACTUATOR_BYTE_DATA,
.reg_tbl_params = &actuator_reg_params[0],
.init_settings = &actuator_init_settings[0],
.park_lens = {
.damping_step = 1023,
.damping_delay = 15000,
.hw_params = 58404,
.max_step = 20,
}
},
.af_tuning_params = {
.initial_code = (int16_t)s->infinity_dac,
.pwd_step = 0,
.region_size = 1,
.total_steps = 512,
.region_params = &region_params[0],
},
};
err = cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set info");
// power up ois
ois_cfg_data.cfgtype = CFG_OIS_POWERUP;
err = cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois powerup");
ois_cfg_data.cfgtype = CFG_OIS_INIT;
err = cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois init");
ois_cfg_data.cfgtype = CFG_OIS_CONTROL;
ois_cfg_data.cfg.set_info.ois_params = (struct msm_ois_params_t){
// .data_size = 26312,
.setting_size = 120,
.i2c_addr = 28,
.i2c_freq_mode = I2C_CUSTOM_MODE,
// .i2c_addr_type = wtf
// .i2c_data_type = wtf
.settings = &ois_init_settings[0],
};
cam_ioctl(s->ois_fd, VIDIOC_MSM_OIS_CFG, &ois_cfg_data, "ois init settings");
} else {
// leeco actuator (DW9800W H-Bridge Driver IC)
// from sniff
s->infinity_dac = 364;
struct msm_actuator_reg_params_t actuator_reg_params[] = {
{
.reg_write_type = MSM_ACTUATOR_WRITE_DAC,
// MSB here at address 3
.reg_addr = 3,
.data_type = 9,
.addr_type = 4,
},
};
struct reg_settings_t actuator_init_settings[] = {
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=1, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // PD = power down
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=0, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // 0 = power up
{ .reg_addr=2, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=2, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 2 }, // RING = SAC mode
{ .reg_addr=6, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=64, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 }, // 0x40 = SAC3 mode
{ .reg_addr=7, .addr_type=MSM_ACTUATOR_BYTE_ADDR, .reg_data=113, .data_type = MSM_ACTUATOR_BYTE_DATA, .i2c_operation = MSM_ACT_WRITE, .delay = 0 },
// 0x71 = DIV1 | DIV0 | SACT0 -- Tvib x 1/4 (quarter)
// SAC Tvib = 6.3 ms + 0.1 ms = 6.4 ms / 4 = 1.6 ms
// LSC 1-step = 252 + 1*4 = 256 ms / 4 = 64 ms
};
struct region_params_t region_params[] = {
{.step_bound = {238, 0,}, .code_per_step = 235, .qvalue = 128}
};
actuator_cfg_data.cfgtype = CFG_SET_ACTUATOR_INFO;
actuator_cfg_data.cfg.set_info = (struct msm_actuator_set_info_t){
.actuator_params = {
.act_type = ACTUATOR_BIVCM,
.reg_tbl_size = 1,
.data_size = 10,
.init_setting_size = 5,
.i2c_freq_mode = I2C_STANDARD_MODE,
.i2c_addr = 24,
.i2c_addr_type = MSM_ACTUATOR_BYTE_ADDR,
.i2c_data_type = MSM_ACTUATOR_WORD_DATA,
.reg_tbl_params = &actuator_reg_params[0],
.init_settings = &actuator_init_settings[0],
.park_lens = {.damping_step = 1023, .damping_delay = 14000, .hw_params = 11, .max_step = 20},
},
.af_tuning_params = {
.initial_code = (int16_t)s->infinity_dac,
.pwd_step = 0,
.region_size = 1,
.total_steps = 238,
.region_params = &region_params[0],
},
};
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set info");
}
}
if (s->camera_id == CAMERA_ID_IMX298) {
@@ -598,6 +1010,10 @@ static void camera_open(CameraState *s, bool is_road_cam) {
struct msm_camera_csiphy_params csiphy_params = {};
if (s->camera_id == CAMERA_ID_IMX298) {
csiphy_params = {.lane_cnt = 4, .settle_cnt = 14, .lane_mask = 0x1f, .csid_core = 0};
} else if (s->camera_id == CAMERA_ID_S5K3P8SP) {
csiphy_params = {.lane_cnt = 4, .settle_cnt = 24, .lane_mask = 0x1f, .csid_core = 0};
} else if (s->camera_id == CAMERA_ID_IMX179) {
csiphy_params = {.lane_cnt = 4, .settle_cnt = 11, .lane_mask = 0x1f, .csid_core = 2};
} else if (s->camera_id == CAMERA_ID_OV8865) {
// guess!
csiphy_params = {.lane_cnt = 4, .settle_cnt = 24, .lane_mask = 0x1f, .csid_core = 2};
@@ -728,24 +1144,47 @@ static void camera_open(CameraState *s, bool is_road_cam) {
cam_ioctl(s->isp_fd, VIDIOC_MSM_ISP_CFG_STREAM, &s->stream_cfg, "isp start stream");
}
static struct damping_params_t actuator_ringing_params = {
.damping_step = 1023,
.damping_delay = 15000,
.hw_params = 0x0000e422,
};
static void road_camera_start(CameraState *s) {
struct msm_actuator_cfg_data actuator_cfg_data = {0};
set_exposure(s, 1.0, 1.0);
int inf_step;
int err = sensor_write_regs(s, start_reg_array, std::size(start_reg_array), MSM_CAMERA_I2C_BYTE_DATA);
LOG("sensor start regs: %d", err);
int inf_step = 512 - INFINITY_DAC;
if (s->device != DEVICE_LP3) {
imx298_ois_calibration(s->ois_fd, s->eeprom);
inf_step = 332 - s->infinity_dac;
// initial guess
s->lens_true_pos = 400;
// initial guess
s->lens_true_pos = 300;
} else {
// default is OP3, this is for LeEco
actuator_ringing_params.damping_step = 1023;
actuator_ringing_params.damping_delay = 20000;
actuator_ringing_params.hw_params = 13;
// focus on infinity assuming phone is perpendicular
inf_step = 512 - s->infinity_dac;
// initial guess
s->lens_true_pos = 400;
}
// reset lens position
struct msm_actuator_cfg_data actuator_cfg_data = {};
memset(&actuator_cfg_data, 0, sizeof(actuator_cfg_data));
actuator_cfg_data.cfgtype = CFG_SET_POSITION;
actuator_cfg_data.cfg.setpos = (struct msm_actuator_set_position_t){
.number_of_steps = 1,
.hw_params = (uint32_t)7,
.pos = {INFINITY_DAC, 0},
.hw_params = (uint32_t)((s->device != DEVICE_LP3) ? 0x0000e424 : 7),
.pos = {s->infinity_dac, 0},
.delay = {0,}
};
cam_ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data, "actuator set pos");
@@ -773,16 +1212,11 @@ static void road_camera_start(CameraState *s) {
}
void actuator_move(CameraState *s, uint16_t target) {
int step = target - s->cur_lens_pos;
// LP3 moves only on even positions. TODO: use proper sensor params
// focus on infinity assuming phone is perpendicular
static struct damping_params_t actuator_ringing_params = {
.damping_step = 1023,
.damping_delay = 20000,
.hw_params = 13,
};
int step = (target - s->cur_lens_pos) / 2;
if (s->device == DEVICE_LP3) {
step /= 2;
}
int dest_step_pos = s->cur_step_pos + step;
dest_step_pos = std::clamp(dest_step_pos, 0, 255);
@@ -867,6 +1301,9 @@ static std::optional<float> get_accel_z(SubMaster *sm) {
}
static void do_autofocus(CameraState *s, SubMaster *sm) {
const int dac_down = s->device == DEVICE_LP3 ? LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN;
const int dac_up = s->device == DEVICE_LP3 ? LP3_AF_DAC_UP : OP3T_AF_DAC_UP;
float lens_true_pos = s->lens_true_pos.load();
if (!isnan(s->focus_err)) {
// learn lens_true_pos
@@ -879,8 +1316,8 @@ static void do_autofocus(CameraState *s, SubMaster *sm) {
}
const float sag = (s->last_sag_acc_z / 9.8) * 128;
// stay off the walls
lens_true_pos = std::clamp(lens_true_pos, float(LP3_AF_DAC_DOWN), float(LP3_AF_DAC_UP));
int target = std::clamp(lens_true_pos - sag, float(LP3_AF_DAC_DOWN), float(LP3_AF_DAC_UP));
lens_true_pos = std::clamp(lens_true_pos, float(dac_down), float(dac_up));
int target = std::clamp(lens_true_pos - sag, float(dac_down), float(dac_up));
s->lens_true_pos.store(lens_true_pos);
/*char debug[4096];
@@ -935,7 +1372,11 @@ void cameras_open(MultiCameraState *s) {
s->v4l_fd = open("/dev/video0", O_RDWR | O_NONBLOCK);
assert(s->v4l_fd >= 0);
s->ispif_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK);
if (s->device == DEVICE_LP3) {
s->ispif_fd = open("/dev/v4l-subdev15", O_RDWR | O_NONBLOCK);
} else {
s->ispif_fd = open("/dev/v4l-subdev16", O_RDWR | O_NONBLOCK);
}
assert(s->ispif_fd >= 0);
// ISPIF: stop
@@ -996,6 +1437,7 @@ static void camera_close(CameraState *s) {
cam_ioctl(s->isp_fd, VIDIOC_MSM_ISP_RELEASE_STREAM, &stream_release, "isp release stream");
}
}
free(s->eeprom);
}
const char* get_isp_event_name(uint32_t type) {
@@ -1066,19 +1508,24 @@ static void ops_thread(MultiCameraState *s) {
}
static void setup_self_recover(CameraState *c, const uint16_t *lapres, size_t lapres_size) {
const int dac_down = c->device == DEVICE_LP3 ? LP3_AF_DAC_DOWN : OP3T_AF_DAC_DOWN;
const int dac_up = c->device == DEVICE_LP3 ? LP3_AF_DAC_UP : OP3T_AF_DAC_UP;
const int dac_m = c->device == DEVICE_LP3 ? LP3_AF_DAC_M : OP3T_AF_DAC_M;
const int dac_3sig = c->device == DEVICE_LP3 ? LP3_AF_DAC_3SIG : OP3T_AF_DAC_3SIG;
const float lens_true_pos = c->lens_true_pos.load();
int self_recover = c->self_recover.load();
if (self_recover < 2 && (lens_true_pos < (LP3_AF_DAC_DOWN + 1) || lens_true_pos > (LP3_AF_DAC_UP - 1)) && is_blur(lapres, lapres_size)) {
if (self_recover < 2 && (lens_true_pos < (dac_down + 1) || lens_true_pos > (dac_up - 1)) && is_blur(lapres, lapres_size)) {
// truly stuck, needs help
if (--self_recover < -FOCUS_RECOVER_PATIENCE) {
LOGD("road camera bad state detected. attempting recovery from %.1f, recover state is %d", lens_true_pos, self_recover);
// parity determined by which end is stuck at
self_recover = FOCUS_RECOVER_STEPS + (lens_true_pos < LP3_AF_DAC_M ? 1 : 0);
self_recover = FOCUS_RECOVER_STEPS + (lens_true_pos < dac_m ? 1 : 0);
}
} else if (self_recover < 2 && (lens_true_pos < (LP3_AF_DAC_M - LP3_AF_DAC_3SIG) || lens_true_pos > (LP3_AF_DAC_M + LP3_AF_DAC_3SIG))) {
} else if (self_recover < 2 && (lens_true_pos < (dac_m - dac_3sig) || lens_true_pos > (dac_m + dac_3sig))) {
// in suboptimal position with high prob, but may still recover by itself
if (--self_recover < -(FOCUS_RECOVER_PATIENCE * 3)) {
self_recover = FOCUS_RECOVER_STEPS / 2 + (lens_true_pos < LP3_AF_DAC_M ? 1 : 0);
self_recover = FOCUS_RECOVER_STEPS / 2 + (lens_true_pos < dac_m ? 1 : 0);
}
} else if (self_recover < 0) {
self_recover += 1; // reset if fine

View File

@@ -18,12 +18,20 @@
#define FRAME_BUF_COUNT 4
#define METADATA_BUF_COUNT 4
#define DEVICE_OP3 0
#define DEVICE_OP3T 1
#define DEVICE_LP3 2
#define NUM_FOCUS 8
#define LP3_AF_DAC_DOWN 366
#define LP3_AF_DAC_UP 634
#define LP3_AF_DAC_M 440
#define LP3_AF_DAC_3SIG 52
#define OP3T_AF_DAC_DOWN 224
#define OP3T_AF_DAC_UP 456
#define OP3T_AF_DAC_M 300
#define OP3T_AF_DAC_3SIG 96
#define FOCUS_RECOVER_PATIENCE 50 // 2.5 seconds of complete blur
#define FOCUS_RECOVER_STEPS 240 // 6 seconds
@@ -42,6 +50,7 @@ typedef struct StreamState {
typedef struct CameraState {
int camera_num;
int camera_id;
int device;
int fps;
CameraInfo ci;
@@ -74,7 +83,7 @@ typedef struct CameraState {
camera_apply_exposure_func apply_exposure;
// rear camera only,used for focusing
unique_fd actuator_fd;
unique_fd actuator_fd, ois_fd, eeprom_fd;
std::atomic<float> focus_err;
std::atomic<float> last_sag_acc_z;
std::atomic<float> lens_true_pos;
@@ -83,10 +92,15 @@ typedef struct CameraState {
uint16_t cur_lens_pos;
int16_t focus[NUM_FOCUS];
uint8_t confidence[NUM_FOCUS];
uint16_t infinity_dac;
size_t eeprom_size;
uint8_t *eeprom;
} CameraState;
typedef struct MultiCameraState {
int device;
unique_fd ispif_fd;
unique_fd msmcfg_fd;
unique_fd v4l_fd;

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,8 @@
#include "selfdrive/camerad/cameras/camera_qcom2.h"
#elif WEBCAM
#include "selfdrive/camerad/cameras/camera_webcam.h"
#elif MIPI
#include "selfdrive/camerad/cameras/camera_mipi.h"
#else
#include "selfdrive/camerad/cameras/camera_frame_stream.h"
#endif
@@ -49,6 +51,8 @@ int main(int argc, char *argv[]) {
set_core_affinity(2);
} else if (Hardware::TICI()) {
set_core_affinity(6);
} else if (Hardware::JETSON()) {
set_core_affinity(4);
}
cl_device_id device_id = cl_get_device_id(CL_DEVICE_TYPE_DEFAULT);

View File

@@ -10,7 +10,7 @@ from typing import List
import cereal.messaging as messaging
from common.params import Params
from common.realtime import DT_MDL
from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, tici_f_frame_size
from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, leon_d_frame_size, tici_f_frame_size
from selfdrive.hardware import TICI
from selfdrive.controls.lib.alertmanager import set_offroad_alert
from selfdrive.manager.process_config import managed_processes
@@ -39,7 +39,7 @@ def rois_in_focus(lapres: List[float]) -> float:
def get_snapshots(frame="roadCameraState", front_frame="driverCameraState", focus_perc_threshold=0.):
frame_sizes = [eon_f_frame_size, eon_d_frame_size, tici_f_frame_size]
frame_sizes = [eon_f_frame_size, eon_d_frame_size, leon_d_frame_size, tici_f_frame_size]
frame_sizes = {w * h: (w, h) for (w, h) in frame_sizes}
sockets = []

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