diff --git a/CHANGELOGS-DEV.md b/CHANGELOGS-DEV.md index a1700bb7a..732dcc823 100644 --- a/CHANGELOGS-DEV.md +++ b/CHANGELOGS-DEV.md @@ -1,3 +1,24 @@ +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、@鄧育林 的測試以及回報。) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 94068ce1e..012fda8da 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,3 +1,30 @@ +2020-05-25 (0.7.5) +======================== +* 加入對 VW MQB/PQ 的支援。(感謝 @dingliangxue 移植) +* Added support to VW MQB/PQ platform. (Thanks to @dingliangxue) + +2020-05-21 (0.7.5) +======================== +* 修改成 3 小時後停止供電。(感謝 @Wei 建議) +* Updated to stop charging after 3 hrs. (Thanks to @Wei) +* 移除行車記錄下的「碰撞偵測」功能。 +* Removed Impact Detection in Dashcam. +* 修正開啟「Noctua 風扇」模式導致的錯誤。(感謝 @阿濤 回報) +* Fixed a bug caused by enabling "Noctua Mod". (Thanks to @阿濤) +* 修正「位智模式」無法顯示警示的問題。(感謝 @axandres 回報) +* Fixed alert issue in waze mode. (Thanks to @axandres) +* 修正無法顯示更新中圖示的問題。 +* Fixed unable to display "UPDATING" icon issue. + +2020-05-20 (0.7.5) +======================== +* 加入「允許多次自動換道」功能。(感謝 @阿濤 建議) +* Added "Allow Continuous Auto Lane Change" Toggle. (Thanks to @阿濤) +* 修正開機後設定頁面有時會錯誤的問題。(感謝 @salmankhan、@Wei 回報) +* Fixed setting page crash issue. (Thanks to @salmankhan, @Wei) +* 修正熄火後一直出現更新訊息的錯誤。(感謝 @Sky Chang 回報) +* Fixed issue that keep showing update prompt. (Thanks to @Sky Chang) + 2020-05-19 (0.7.5) ======================== * 加入 DragonEnableAutoUpdate 預設值。 diff --git a/apk/ai.comma.plus.offroad.apk b/apk/ai.comma.plus.offroad.apk index a9156958f..1028b9402 100644 Binary files a/apk/ai.comma.plus.offroad.apk and b/apk/ai.comma.plus.offroad.apk differ diff --git a/common/params.py b/common/params.py index b69fc98b6..3b70f159c 100755 --- a/common/params.py +++ b/common/params.py @@ -193,11 +193,11 @@ keys = { "DragonUIScreenOffDriving": [TxType.PERSISTENT], "DragonEnableAutoUpdate": [TxType.PERSISTENT], "DragonUIBrightness": [TxType.PERSISTENT], - "DragonDashcamImpactDetect": [TxType.PERSISTENT], - "DragonDashcamImpactDetectStarted": [TxType.CLEAR_ON_MANAGER_START], "DragonEnableUploadOnMobile": [TxType.PERSISTENT], "DragonEnableUploadOnHotspot": [TxType.PERSISTENT], "DragonMaxSpeedLimit": [TxType.PERSISTENT], + "DragonEnableRating": [TxType.PERSISTENT], + "DragonEnableContALC": [TxType.PERSISTENT], } diff --git a/opendbc/vw_golf_mk4.dbc b/opendbc/vw_golf_mk4.dbc index bdfe6390f..e2b576b81 100644 --- a/opendbc/vw_golf_mk4.dbc +++ b/opendbc/vw_golf_mk4.dbc @@ -702,36 +702,58 @@ BO_ 1088 Getriebe_1: 8 XXX SG_ Status_Getriebe_und_Wandlerschu : 1|1@1+ (1,0) [0|0] "" XXX SG_ Schaltung_aktiv__Getriebe_1_ : 0|1@1+ (1,0) [0|0] "" XXX -BO_ 912 Gateway_Komfort_1: 6 XXX - SG_ Bremslicht_Anhaenger : 47|1@1+ (1,0) [0|0] "" XXX - SG_ Anhaenger_erkannt_Gateway : 46|1@1+ (1,0) [0|0] "" XXX - SG_ ECD_AAG_unplausibel : 45|1@1+ (1,0) [0|0] "" XXX - SG_ BLS_AAG_unplausibel : 44|1@1+ (1,0) [0|0] "" XXX - SG_ Zaehler_Anhaenger : 40|4@1+ (1,0) [0|15] "" XXX - SG_ Frei_Gateway_Komfort_1_4 : 34|6@1+ (1,0) [0|0] "" XXX - SG_ ECD_ILM_unplausibel : 33|1@1+ (1,0) [0|0] "" XXX - SG_ BLS_ILM_unplausibel : 32|1@1+ (1,0) [0|0] "" XXX - SG_ Bremslicht_mitte_defekt : 31|1@1+ (1,0) [0|0] "" XXX - SG_ Bremslicht_rechts_defekt : 30|1@1+ (1,0) [0|0] "" XXX - SG_ Bremslicht_links_defekt : 29|1@1+ (1,0) [0|0] "" XXX - SG_ Rueckfahrlicht_Gateway : 28|1@1+ (1,0) [0|0] "" XXX - SG_ Zaehler_Bremslicht : 24|4@1+ (1,0) [0|15] "" XXX - SG_ Frei_Gateway_Komfort_1_3 : 17|7@1+ (1,0) [0|0] "" XXX - SG_ Fahrertuerkontakt : 16|1@1+ (1,0) [0|0] "" XXX - SG_ RDK_Systemfehler : 15|1@1+ (1,0) [0|0] "" XXX - SG_ RDK_Warnstufe_1 : 14|1@1+ (1,0) [0|0] "" XXX - SG_ RDK_Warnstufe_2 : 13|1@1+ (1,0) [0|0] "" XXX - SG_ Reifendruckwarnung_Reserverad : 12|1@1+ (1,0) [0|0] "" XXX - SG_ Reifendruckwarnung_hinten_recht : 11|1@1+ (1,0) [0|0] "" XXX - SG_ Reifendruckwarnung_hinten_links : 10|1@1+ (1,0) [0|0] "" XXX - SG_ Reifendruckwarnung_vorn_rechts : 9|1@1+ (1,0) [0|0] "" XXX - SG_ Reifendruckwarnung_vorn_links : 8|1@1+ (1,0) [0|0] "" XXX - SG_ Frei_Gateway_Komfort_1_2 : 5|3@1+ (1,0) [0|0] "" XXX - SG_ Fahrertuerkontakt_veraltet : 4|1@1+ (1,0) [0|0] "" XXX - SG_ Frei_Gateway_Komfort_1_1 : 3|1@1+ (1,0) [0|0] "" XXX - SG_ Licht_1_Botschaft_veraltet : 2|1@1+ (1,0) [0|0] "" XXX - SG_ Anhaenger_Botschaft_veraltet : 1|1@1+ (1,0) [0|0] "" XXX - SG_ Reifendruckwarnung_veraltet : 0|1@1+ (1,0) [0|0] "" XXX +BO_ 912 Gate_Komf_1: 8 XXX + SG_ GK1_Sta_RDK_Warn : 0|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Anhaen : 1|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Licht1 : 2|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Licht3 : 3|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Tuerkont : 4|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Li_vorn : 5|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SleepAckn : 7|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_CharismaModus m1 : 8|4@1+ (1,0) [0|15] "" XXX + SG_ GK1_SamFktNr M : 12|4@1+ (1,0) [0|15] "" XXX + SG_ GK1_Fa_Tuerkont : 16|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_RueckfahrSch : 17|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_ELV_verrieg : 18|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Kessy_2 : 19|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Stdhzg : 20|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SH_Verbau : 21|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_ParkFrontWi : 22|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_KW_Warm : 23|1@1+ (1,0) [0|1] "" XXX + SG_ BCM_Remotestart_Betrieb : 24|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Rueckfahr : 28|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_links : 29|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_rechts : 30|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_mitte : 31|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BLS_ILM : 32|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_EDC_ILM : 33|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Blinker_li : 34|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Blinker_re : 35|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_def_P_verr : 36|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_LS1_Fernlicht : 37|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_Licht2 : 38|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_LSM : 39|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Count_Anhaen : 40|4@1+ (1,0) [0|15] "" XXX + SG_ GK1_BLS_AAG : 44|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_EDC_AAG : 45|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Anhaenger : 46|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_BrLi_Anhaen : 47|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Abblendlicht : 48|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Fernlicht : 49|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Wischer_vorn : 50|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Sta_ILM_F_1 : 51|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Abbl_VL_def : 52|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Abbl_VR_def : 53|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Blink_Autob : 54|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Warnblk_Status : 55|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SH_laeuft : 56|1@1+ (1,0) [0|1] "" XXX + SG_ SH1_ein_Wasserpumpe : 57|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Nebel_ein : 58|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Bremslicht : 59|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_Anh_abgesteckt : 60|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_AnhKonLamp : 61|1@1+ (1,0) [0|1] "" XXX + SG_ LDS_Stellung_AFL : 62|1@1+ (1,0) [0|1] "" XXX + SG_ GK1_SH_Zusatzfkt : 63|1@1+ (1,0) [0|1] "" XXX BO_ 1340 Fahrwerk_1: 1 XXX SG_ Frei_Fahrwerk_1_2 : 7|1@1+ (1,0) [0|0] "" XXX @@ -1040,11 +1062,338 @@ BO_ 1324 ADR_1: 8 XXX SG_ Zaehler_ADR_1 : 8|4@1+ (1,0) [0|15] "" XXX SG_ Momentenanforderung_ADR : 0|8@1+ (0.39,0) [0|99] "MDI" XXX -BO_ 210 PQ_HCA: 8 XXX - SG_ HCA_Torque : 16|15@1+ (1,0) [0|32767] "" XXX - SG_ UNK_Bit : 34|1@0+ (1,0) [0|1] "" XXX - SG_ HCA_Torque_VZ : 31|1@0+ (1,0) [0|1] "" XXX - SG_ PQ_HCA_BZ : 8|4@1+ (1,0) [0|15] "" XXX - SG_ PQ_HCA_Checksum : 0|4@1+ (1,0) [0|15] "" XXX +BO_ 1550 Einheiten_1: 2 XXX + SG_ MFA_v_Einheit_02 : 0|1@1+ (1,0) [0|1] "" XXX -BO_ 1490 VIN_1: 8 XXX +BO_ 872 ACC_System: 8 XXX + SG_ ACS_Checksum : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ACS_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX + SG_ ACS_Sta_ADR : 12|2@1+ (1,0) [0|3] "" XXX + SG_ ACS_ADR_Schub : 14|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Schubabsch : 15|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_StSt_Info : 16|2@1+ (1,0) [0|3] "" XXX + SG_ ACS_MomEingriff : 18|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Typ_ACC : 19|2@1+ (1,0) [0|3] "" XXX + SG_ ACS_FreigSollB : 23|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Sollbeschl : 24|11@1+ (0.005,-7.22) [-7.22|3.005] "Unit_MeterPerSeconSquar" XXX + SG_ ACS_Anhaltewunsch : 38|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_Fehler : 39|1@1+ (1,0) [0|1] "" XXX + SG_ ACS_zul_Regelabw : 40|8@1+ (1,0.005) [0|1.265] "Unit_MeterPerSeconSquar" XXX + SG_ ACS_max_AendGrad : 48|8@1+ (1,0.02) [0.02|5.06] "Unit_MeterPerSeconSquar" XXX + +BO_ 1386 ACC_GRA_Anziege: 8 XXX + SG_ ACA_Checksum : 0|8@1+ (1,0) [0|255] "" XXX + SG_ ACA_StaACC : 8|3@1+ (1,0) [0|7] "" XXX + SG_ ACA_ID_StaACC : 11|5@1+ (1,0) [0|31] "" XXX + SG_ ACA_Fahrerhinw : 16|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_AnzDisplay : 17|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Zeitluecke : 18|4@1+ (1,0) [0|15] "" XXX + SG_ ACA_V_Wunsch : 24|8@1+ (1,0) [0|255] "Unit_KiloMeterPerHour" XXX + SG_ ACA_kmh_mph : 32|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Akustik1 : 33|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Akustik2 : 34|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_PrioDisp : 35|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_gemZeitl : 40|4@1+ (1,0) [0|15] "" XXX + SG_ ACA_ACC_Verz : 44|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_StaGRA : 48|3@1+ (1,0) [0|7] "" XXX + SG_ ACA_ID_StaGRA : 51|5@1+ (1,0) [0|31] "" XXX + SG_ ACA_Codierung : 56|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Tachokranz : 57|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Aend_Zeitluecke : 58|1@1+ (1,0) [0|1] "" XXX + SG_ ACA_Zaehler : 60|4@1+ (1,0) [0|15] "" XXX + +BO_ 208 Lenkhilfe_3: 8 XXX + SG_ LH3_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX + SG_ LH3_BS_Spiegel : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LH3_Zaehler : 12|4@4+ (1,0) [0|15] "" XXX + SG_ LH3_LM : 16|10@1+ (1,0) [0|1023] "" XXX + SG_ LH3_LMSign : 26|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_LMValid : 27|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_Sta_DSR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ LH3_BLW : 32|12@1+ (0.15,0) [0|615] "" XXX + SG_ LH3_BLWSign : 44|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_BLWValid : 45|1@1+ (1,0) [0|1] "" XXX + SG_ LH3_Lenkungstyp : 46|2@1+ (1,0) [0|3] "" XXX + +BO_ 978 Lenkhilfe_2: 8 XXX + SG_ LH2_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX + SG_ LH2_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX + SG_ LH2_Geradeaus : 12|1@1+ (1,0) [0|1] "" XXX + SG_ LH2_Sta_Charisma : 13|3@1+ (1,0) [0|7] "" XXX + SG_ LH2_Sta_HCA : 16|4@1+ (1,0) [0|15] "" XXX + SG_ LH2_Ausg_LW1 : 20|1@1+ (1,0) [0|1] "" XXX + SG_ LH2_Ausg_LW1_gue : 21|1@1+ (1,0) [0|1] "" XXX + SG_ LH2_StatEPS_PLA : 24|4@1+ (1,0) [0|15] "" XXX + SG_ LH2_aktLenkeingriff : 32|8@1+ (1,0) [0|255] "" XXX + SG_ LH2_PLA_Err : 48|4@1+ (1,0) [0|15] "" XXX + SG_ LH2_PLA_Abbr : 52|4@1+ (1,0) [0|15] "" XXX + +BO_ 210 HCA_1: 5 XXX + SG_ HCA_Checksumme : 0|8@1+ (1,0) [0|15] "" XXX + SG_ HCA_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX + SG_ HCA_Status : 12|4@1+ (1,0) [0|15] "" XXX + SG_ LM_Offset : 16|15@1+ (0.03125,0) [0|300] "cNm" XXX + SG_ LM_OffSign : 31|1@1+ (1,0) [0|1] "" XXX + SG_ Vib_Freq : 32|4@1+ (4,0) [0|60] "Hz" XXX + SG_ Vib_Amp : 36|4@1+ (0.5,0) [0|7.5] "Nm" XXX + +BO_ 1470 LDW_1: 8 XXX + SG_ Right_Lane_Status : 0|2@1+ (1,0) [0|3] "" XXX + SG_ Left_Lane_Status : 2|2@1+ (1,0) [0|3] "" XXX + SG_ LDW_Direction : 14|1@0+ (1,0) [0|1] "" XXX + SG_ SET_ME_X1 : 18|1@0+ (1,0) [0|1] "" XXX + SG_ Kombi_Lamp_Orange : 19|1@0+ (1,0) [0|1] "" XXX + SG_ Kombi_Lamp_Green : 20|1@0+ (1,0) [0|1] "" XXX + SG_ XX_LDW_Maybe_Warning : 16|1@0+ (1,0) [0|1] "" XXX + SG_ XX_DLCORTLC1 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ XX_DLCORTLC2 : 32|8@1+ (1,0) [0|255] "" XXX + +BO_ 428 Bremse_8: 8 XXX + SG_ BR8_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX + SG_ BR8_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX + SG_ BR8_Sta_ACC_Anf : 12|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Verz_EPB_akt : 13|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_Br_temp : 14|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_Br_Druck : 15|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_TolAbgl_HL : 16|8@1+ (0.048828125,-6.201171875) [-6.201171875|6.15234375] "Unit_PerCent" XXX + SG_ BR8_TolAbgl_HR : 24|8@1+ (0.048828125,-6.201171875) [-6.201171875|6.15234375] "Unit_PerCent" XXX + SG_ BR8_Istbeschl : 32|9@1+ (0.02,-7.22) [-7.22|2.98] "Unit_MeterPerSeconSquar" XXX + SG_ BR8_Sta_HW_BLS : 41|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_QB_LBeschl : 42|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_ESC_Mode : 43|2@1+ (1,0) [0|3] "" XXX + SG_ BR8_aktBrSyst : 45|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Fa_bremst : 46|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_StaBrSyst : 47|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Laengsbeschl : 48|10@1+ (0.03125,-16) [-15.96875|15.9375] "Unit_MeterPerSeconSquar" XXX + SG_ BR8_Sta_ADR_BR : 58|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Quattro : 59|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_VerzReg : 60|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Sta_BLS : 61|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Verz_EPB : 62|1@1+ (1,0) [0|1] "" XXX + SG_ BR8_Check_EPB : 63|1@1+ (1,0) [0|1] "" XXX + + BO_ 928 Bremse_10: 8 XXX + SG_ B10_Checksumme : 0|8@1+ (1,0) [0|255] "" XXX + SG_ B10_Zaehler : 8|4@1+ (1,0) [0|15] "" XXX + SG_ B10_QB_Wegimp_VL : 12|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Wegimp_VR : 13|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Wegimp_HL : 14|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Wegimp_HR : 15|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Wegimp_VL : 16|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_Wegimp_VR : 26|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_Wegimp_HL : 36|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_Wegimp_HR : 46|10@1+ (1,0) [0|1000] "" XXX + SG_ B10_QB_Fahrtr_VL : 56|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Fahrtr_VR : 57|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Fahrtr_HL : 58|1@1+ (1,0) [0|1] "" XXX + SG_ B10_QB_Fahrtr_HR : 59|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_VL : 60|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_VR : 61|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_HL : 62|1@1+ (1,0) [0|1] "" XXX + SG_ B10_Fahrtr_HR : 63|1@1+ (1,0) [0|1] "" XXX + + BO_ 835 RDK_Status: 3 XXX + SG_ RKS_Reifen_VL : 0|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_VR : 1|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_HL : 2|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_HR : 3|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Reifen_RR : 4|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Warnung_2 : 5|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Warnung_1 : 6|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Systemfehler : 7|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Kalibrier_abgew : 8|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Druckdiff_Vorn : 9|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Druckdiff_Hinten : 10|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Befuellung_RR_low : 11|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Funkstoerung : 12|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_System_Aus : 13|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_KD_Fehler : 15|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Lampe : 16|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Ton : 17|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Gong : 18|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_RDK_Blinkbit : 19|1@1+ (1,0) [0|1] "" XXX + SG_ RKS_Teillast : 20|1@1+ (1,0) [0|1] "" XXX + + BO_ 914 Gate_Komf_2: 8 XXX + SG_ GK2_Sta_LSM : 0|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Lichtsensor : 1|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Licht1 : 2|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_VSG : 3|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Schluessel : 4|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Profil : 5|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Clima2 : 6|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_BSG4 : 7|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Sta_Kessy_4 : 8|1@1+ (1,0) [0|1] "" XXX + SG_ BS4_Gleitende_Leuchtw_Anf : 9|1@1+ (1,0) [0|1] "" XXX + SG_ BS4_GLW_Fernlicht_Anf : 10|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Blk_L_Kontrolle : 11|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Blk_R_Kontrolle : 12|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_LS_KomFehler : 14|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_LS_def : 15|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Helligkeit : 16|3@1+ (714.286,0) [0|5000.002] "Unit_Lux" XXX + SG_ GK2_VD_zu_ver : 19|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_VD_entriegelt : 20|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_VD_offen_ver : 21|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Verdeck_Anf : 22|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_VDKD_auf : 23|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Schluessel : 24|4@1+ (1,0) [0|15] "" XXX + SG_ GK2_Hardtop : 28|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_AFL_Schalter : 29|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Nebelschluss : 30|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_EM_LIN_ungueltig : 31|1@1+ (1,0) [0|1] "" XXX + SG_ GK2_Profil : 32|4@1+ (1,0) [0|15] "" XXX + SG_ GK2_Kl_StSt_Info : 36|2@1+ (1,0) [0|3] "" XXX + SG_ GK2_BSG_StSt_Info : 38|2@1+ (1,0) [0|3] "" XXX + SG_ GK2_BEM_P_Generator : 40|8@1+ (50,0) [0|12700] "Unit_Watt" XXX + SG_ GK2_BEM_Abschaltstufen : 48|3@1+ (1,0) [0|7] "" XXX + SG_ GK2_BEM_DFM : 51|5@1+ (3.225,0.025) [0.025|100] "Unit_PerCent" XXX + SG_ GK2_Kessy_StSt_Info : 56|2@1+ (1,0) [0|3] "" XXX + SG_ GK2_BEM_StSt_Info : 58|2@1+ (1,0) [0|3] "" XXX + + BO_ 1175 Parkhilfe_01: 8 XXX + SG_ PH_Abschaltursache : 13|3@1+ (1,0) [0|7] "" XXX + SG_ PH_Opt_Anzeige_V_ein : 16|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Opt_Anzeige_H_ein : 17|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Opt_Anz_V_Hindernis : 18|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Opt_Anz_H_Hindernis : 19|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Tongeber_V_aktiv : 20|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Tongeber_H_aktiv : 21|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Tongeber_mute : 22|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Anf_Audioabsenkung : 23|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Frequenz_hinten : 32|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Lautstaerke_hinten : 36|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Frequenz_vorn : 40|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Lautstaerke_vorn : 44|4@1+ (1,0) [0|15] "" XXX + SG_ PH_Trigger_Bildaufschaltung : 48|1@1+ (1,0) [0|1] "" XXX + SG_ PH_StartStopp_Info : 49|2@1+ (1,0) [0|3] "" XXX + SG_ PH_Aufbauten_erk : 51|1@1+ (1,0) [0|1] "" XXX + SG_ PH_BerErk_vorn : 52|2@1+ (1,0) [0|3] "" XXX + SG_ PH_BerErk_hinten : 54|2@1+ (1,0) [0|3] "" XXX + SG_ PH_defekt : 56|1@1+ (1,0) [0|1] "" XXX + SG_ PH_gestoert : 57|1@1+ (1,0) [0|1] "" XXX + SG_ PH_Systemzustand : 58|3@1+ (1,0) [0|7] "" XXX + SG_ PH_Display_Kundenwunsch : 61|2@1+ (1,0) [0|3] "" XXX + SG_ PH_KD_Fehler : 63|1@1+ (1,0) [0|1] "" XXX + + BO_ 1463 Bremse_11: 8 XXX + SG_ B11_HydHalten : 13|1@1+ (1,0) [0|1] "" XXX + SG_ B11_Br_StSt_Info : 14|2@1+ (1,0) [0|3] "" XXX + SG_ B11_OBD_Nib_VL : 16|4@1+ (1,0) [0|15] "" XXX + SG_ B11_OBD_Nib_VR : 20|4@1+ (1,0) [0|15] "" XXX + SG_ B11_OBD_Nib_HL : 24|4@1+ (1,0) [0|15] "" XXX + SG_ B11_OBD_Nib_HR : 28|4@1+ (1,0) [0|15] "" XXX + SG_ B11_EPB_Steller_akt : 32|1@1+ (1,0) [0|1] "" XXX + SG_ B11_EPB_Steller_gue : 33|1@1+ (1,0) [0|1] "" XXX + + BO_ 1500 Soll_Verbauliste_neu: 8 XXX + SG_ VL1_Motor_SG : 0|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Getr_SG : 1|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ABS : 2|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Kombi : 3|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_LSM : 4|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Airbag : 5|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Lenkhilfe : 6|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_dyn_LWR : 7|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_res_08 : 8|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Allrad : 9|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ADR : 10|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ADR_getrennt : 11|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_EPB : 12|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_res_13 : 13|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Daempfer : 14|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Quersperre : 15|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_MotorSlave : 16|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_SWA : 17|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_HCA : 18|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_RKA_Plus : 19|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_PLA : 20|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_WFS_KBI : 21|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Kombi_KBI : 22|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Soll_eq_Ist : 23|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_BSG_Komf : 24|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_ZKE : 25|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_FT : 26|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_BT : 27|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_HL : 28|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TSG_HR : 29|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Memory : 30|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Dachmodul_K : 31|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Zentralelektrik_II : 32|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_RDK : 33|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Lenksaeule : 34|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Gateway : 35|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Clima_Komf : 36|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Einparkhilfe : 37|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_PTC_Heizung : 38|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Standheiz : 39|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Verdeck : 40|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_RSE_I : 41|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_res_42 : 42|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_MDI_I : 43|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Anhaenger : 44|1@1+ (1,0) [0|1] "" SWA + SG_ VL1_Memory_BF : 45|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Easy_Entry_VF : 46|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Easy_Entry_VB : 47|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Heckdeckel : 48|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Rearview : 49|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Sonderfzg_SG : 50|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Tastenmodul : 51|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Kompass : 52|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_WFS_K : 53|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_GSM_Pager : 54|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_InfoElektronik : 55|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_DSP : 56|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_DAB : 57|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Telematik : 58|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Navigation : 59|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_TV_Tuner : 60|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Neigungsmodul_I : 61|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Radio : 62|1@1+ (1,0) [0|1] "" XXX + SG_ VL1_Telefon : 63|1@1+ (1,0) [0|1] "" XXX + + BO_ 1490 Ident: 8 XXX + SG_ IDT_Mux M : 0|2@1+ (1,0) [0|2] "" XXX + SG_ IDT_Geheimnis_1 m0 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_4 m1 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_11 m2 : 8|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_Geheimnis_2 m0 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_5 m1 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_12 m2 : 16|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_Geheimnis_3 m0 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_6 m1 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_13 m2 : 24|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_Geheimnis_4 m0 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_7 m1 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_14 m2 : 32|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_1 m0 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_8 m1 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_15 m2 : 40|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_2 m0 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_9 m1 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_16 m2 : 48|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_3 m0 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_10 m1 : 56|8@1+ (1,0) [0|255] "" XXX + SG_ IDT_VIN_17 m2 : 56|8@1+ (1,0) [0|255] "" XXX + +BO_ 2000 Diagnose_1: 8 XXX + SG_ DI1_VerlernZaehl : 0|8@1+ (1,0) [0|254] "" XXX + SG_ DI1_km_Stand : 8|20@1+ (1,0) [0|1048575] "Unit_KiloMeter" XXX + SG_ DI1_Jahr : 28|7@1+ (1,2000) [2000|2127] "Unit_Year" XXX + SG_ DI1_Monat : 35|4@1+ (1,0) [1|12] "Unit_Month" XXX + SG_ DI1_Tag : 39|5@1+ (1,0) [0|31] "Unit_Day" XXX + SG_ DI1_Stunde : 44|5@1+ (1,0) [0|23] "Unit_Hours" XXX + SG_ DI1_Minute : 49|6@1+ (1,0) [0|59] "Unit_Minut" XXX + SG_ DI1_Sekunde : 55|6@1+ (1,0) [0|59] "Unit_Secon" XXX + SG_ DI1_KM_Stand_alt : 62|1@1+ (1,0) [0|1] "" XXX + SG_ DI1_Zeit_alt : 63|1@1+ (1,0) [0|1] "" XXX + +CM_ SG_ 210 LM_Offset "centiNewton-meters for ease of calculation without FP math in Panda"; +CM_ SG_ 210 Vib_Amp "Steering wheel haptic, amplitude"; +CM_ SG_ 210 Vib_Freq "Steering wheel haptic, frequency"; +CM_ SG_ 1386 ACA_V_Wunsch "255=unset"; +CM_ SG_ 1470 LDW_Direction "0=right,1=left"; +CM_ SG_ 1470 XX_DLCORTLC1 "Might be DLC or TLC"; +CM_ SG_ 1470 XX_DLCORTLC2 "Might be DLC or TLC, might have wrong size"; +CM_ SG_ 1550 MFA_v_Signal_02 "0=km/h, 1=mph"; + +VAL_ 1088 Waehlhebelposition__Getriebe_1_ 8 "P" 7 "R" 6 "N" 5 "D" 9 "U"; diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index ba4519809..1393ba323 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -64,7 +64,7 @@ bool fake_send = false; bool loopback_can = false; cereal::HealthData::HwType hw_type = cereal::HealthData::HwType::UNKNOWN; bool is_pigeon = false; -const uint32_t NO_IGNITION_CNT_MAX = 2 * 60 * 60 * 30; // turn off charge after 30 hrs +const uint32_t NO_IGNITION_CNT_MAX = 2 * 60 * 60 * 3; // turn off charge after 3 hrs const float VBATT_START_CHARGING = 11.5; const float VBATT_PAUSE_CHARGING = 11.0; float voltage_f = 12.5; // filtered voltage diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 6c90d69e7..3c11d1bfe 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -1,7 +1,7 @@ from cereal import car from selfdrive.car import apply_std_steer_torque_limits from selfdrive.car.volkswagen import volkswagencan -from selfdrive.car.volkswagen.values import DBC, CANBUS, MQB_LDW_MESSAGES, BUTTON_STATES, CarControllerParams +from selfdrive.car.volkswagen.values import DBC, CANBUS, NWL, MQB_LDW_MESSAGES, BUTTON_STATES, CarControllerParams from opendbc.can.packer import CANPacker VisualAlert = car.CarControl.HUDControl.VisualAlert @@ -12,6 +12,16 @@ class CarController(): self.apply_steer_last = 0 self.packer_pt = CANPacker(DBC[CP.carFingerprint]['pt']) + self.acc_bus = CANBUS.pt if CP.networkLocation == NWL.fwdCamera else CANBUS.cam + + if CP.safetyModel == car.CarParams.SafetyModel.volkswagen: + self.create_steering_control = volkswagencan.create_mqb_steering_control + self.create_acc_buttons_control = volkswagencan.create_mqb_acc_buttons_control + self.create_hud_control = volkswagencan.create_mqb_hud_control + elif CP.safetyModel == car.CarParams.SafetyModel.volkswagenPq: + self.create_steering_control = volkswagencan.create_pq_steering_control + self.create_acc_buttons_control = volkswagencan.create_pq_acc_buttons_control + self.create_hud_control = volkswagencan.create_pq_hud_control self.hcaSameTorqueCount = 0 self.hcaEnabledFrameCount = 0 @@ -98,7 +108,7 @@ class CarController(): self.apply_steer_last = apply_steer idx = (frame / P.HCA_STEP) % 16 - can_sends.append(volkswagencan.create_mqb_steering_control(self.packer_pt, CANBUS.pt, apply_steer, + can_sends.append(self.create_steering_control(self.packer_pt, CANBUS.pt, apply_steer, idx, hcaEnabled)) #-------------------------------------------------------------------------- @@ -119,7 +129,7 @@ class CarController(): else: hud_alert = MQB_LDW_MESSAGES["none"] - can_sends.append(volkswagencan.create_mqb_hud_control(self.packer_pt, CANBUS.pt, hcaEnabled, + can_sends.append(self.create_hud_control(self.packer_pt, CANBUS.pt, hcaEnabled, CS.out.steeringPressed, hud_alert, leftLaneVisible, rightLaneVisible)) @@ -178,7 +188,7 @@ class CarController(): if self.graMsgSentCount == 0: self.graMsgStartFramePrev = frame idx = (CS.graMsgBusCounter + 1) % 16 - can_sends.append(volkswagencan.create_mqb_acc_buttons_control(self.packer_pt, CANBUS.pt, self.graButtonStatesToSend, CS, idx)) + can_sends.append(self.create_acc_buttons_control(self.packer_pt, self.acc_bus, self.graButtonStatesToSend, CS, idx)) self.graMsgSentCount += 1 if self.graMsgSentCount >= P.GRA_VBP_COUNT: self.graButtonStatesToSend = None diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 91b24dc4f..5f90ffe43 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -4,16 +4,34 @@ from selfdrive.config import Conversions as CV from selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser from opendbc.can.can_define import CANDefine -from selfdrive.car.volkswagen.values import DBC, CANBUS, BUTTON_STATES, CarControllerParams +from selfdrive.car.volkswagen.values import DBC, CANBUS, NWL, TRANS, GEAR, BUTTON_STATES, CarControllerParams + class CarState(CarStateBase): def __init__(self, CP): super().__init__(CP) can_define = CANDefine(DBC[CP.carFingerprint]['pt']) - self.shifter_values = can_define.dv["Getriebe_11"]['GE_Fahrstufe'] + + if CP.safetyModel == car.CarParams.SafetyModel.volkswagenPq: + # Configure for PQ35/PQ46/NMS network messaging + self.get_can_parser = self.get_pq_can_parser + self.get_cam_can_parser = self.get_pq_cam_can_parser + self.update = self.update_pq + if CP.transmissionType == TRANS.automatic: + self.shifter_values = can_define.dv["Getriebe_1"]['Waehlhebelposition__Getriebe_1_'] + else: + # Configure for MQB network messaging (default) + self.get_can_parser = self.get_mqb_can_parser + self.get_cam_can_parser = self.get_mqb_cam_can_parser + self.update = self.update_mqb + if CP.transmissionType == TRANS.automatic: + self.shifter_values = can_define.dv["Getriebe_11"]['GE_Fahrstufe'] + elif CP.transmissionType == TRANS.direct: + self.shifter_values = can_define.dv["EV_Gearshift"]['GearPosition'] + self.buttonStates = BUTTON_STATES.copy() - def update(self, pt_cp): + def update_mqb(self, pt_cp, cam_cp, acc_cp, trans_type): ret = car.CarState.new_message() # Update vehicle speed and acceleration from ABS wheel speeds. ret.wheelSpeeds.fl = pt_cp.vl["ESP_19"]['ESP_VL_Radgeschw_02'] * CV.KPH_TO_MS @@ -28,22 +46,43 @@ class CarState(CarStateBase): # Update steering angle, rate, yaw rate, and driver input torque. VW send # the sign/direction in a separate signal so they must be recombined. - ret.steeringAngle = pt_cp.vl["LWI_01"]['LWI_Lenkradwinkel'] * (1,-1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradwinkel'])] - ret.steeringRate = pt_cp.vl["LWI_01"]['LWI_Lenkradw_Geschw'] * (1,-1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradwinkel'])] - ret.steeringTorque = pt_cp.vl["EPS_01"]['Driver_Strain'] * (1,-1)[int(pt_cp.vl["EPS_01"]['Driver_Strain_VZ'])] + ret.steeringAngle = pt_cp.vl["LWI_01"]['LWI_Lenkradwinkel'] * (1, -1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradwinkel'])] + ret.steeringRate = pt_cp.vl["LWI_01"]['LWI_Lenkradw_Geschw'] * (1, -1)[int(pt_cp.vl["LWI_01"]['LWI_VZ_Lenkradwinkel'])] + ret.steeringTorque = pt_cp.vl["EPS_01"]['Driver_Strain'] * (1, -1)[int(pt_cp.vl["EPS_01"]['Driver_Strain_VZ'])] ret.steeringPressed = abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE - ret.yawRate = pt_cp.vl["ESP_02"]['ESP_Gierrate'] * (1,-1)[int(pt_cp.vl["ESP_02"]['ESP_VZ_Gierrate'])] * CV.DEG_TO_RAD + ret.yawRate = pt_cp.vl["ESP_02"]['ESP_Gierrate'] * (1, -1)[int(pt_cp.vl["ESP_02"]['ESP_VZ_Gierrate'])] * CV.DEG_TO_RAD # Update gas, brakes, and gearshift. ret.gas = pt_cp.vl["Motor_20"]['MO_Fahrpedalrohwert_01'] / 100.0 ret.gasPressed = ret.gas > 0 - ret.brake = pt_cp.vl["ESP_05"]['ESP_Bremsdruck'] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects + ret.brake = pt_cp.vl["ESP_05"]['ESP_Bremsdruck'] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects ret.brakePressed = bool(pt_cp.vl["ESP_05"]['ESP_Fahrer_bremst']) ret.brakeLights = bool(pt_cp.vl["ESP_05"]['ESP_Status_Bremsdruck']) + # Additional safety checks performed in CarInterface. + self.parkingBrakeSet = bool(pt_cp.vl["Kombi_01"]['KBI_Handbremse']) # FIXME: need to include an EPB check as well + ret.espDisabled = pt_cp.vl["ESP_21"]['ESP_Tastung_passiv'] != 0 + # Update gear and/or clutch position data. - can_gear_shifter = int(pt_cp.vl["Getriebe_11"]['GE_Fahrstufe']) - ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear_shifter, None)) + if trans_type == TRANS.automatic: + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["Getriebe_11"]['GE_Fahrstufe'], None)) + elif trans_type == TRANS.direct: + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["EV_Gearshift"]['GearPosition'], None)) + elif trans_type == TRANS.manual: + ret.clutchPressed = not pt_cp.vl["Motor_14"]['MO_Kuppl_schalter'] + reverse_light = bool(pt_cp.vl["Gateway_72"]['BCM1_Rueckfahrlicht_Schalter']) + # TODO: verify this synthesis has the desired behavior. + # In particular, should we neutral disengage during normal gear changes? + # Also, what happens if we're rolling backwards with the clutch pressed + # in a gear other than reverse? + if reverse_light: + ret.gearShifter = GEAR.reverse + elif ret.standstill and self.parkingBrakeSet: + ret.gearShifter = GEAR.park + elif ret.clutchPressed: + ret.gearShifter = GEAR.neutral + else: + ret.gearShifter = GEAR.drive # Update door and trunk/hatch lid open status. ret.doorOpen = any([pt_cp.vl["Gateway_72"]['ZV_FT_offen'], @@ -77,7 +116,7 @@ class CarState(CarStateBase): # Update ACC setpoint. When the setpoint is zero or there's an error, the # radar sends a set-speed of ~90.69 m/s / 203mph. - ret.cruiseState.speed = pt_cp.vl["ACC_02"]['SetSpeed'] + ret.cruiseState.speed = acc_cp.vl["ACC_02"]['SetSpeed'] if ret.cruiseState.speed > 90: ret.cruiseState.speed = 0 @@ -98,6 +137,7 @@ class CarState(CarStateBase): self.graTypHauptschalter = pt_cp.vl["GRA_ACC_01"]['GRA_Typ_Hauptschalter'] self.graButtonTypeInfo = pt_cp.vl["GRA_ACC_01"]['GRA_ButtonTypeInfo'] self.graTipStufe2 = pt_cp.vl["GRA_ACC_01"]['GRA_Tip_Stufe_2'] + self.graTyp468 = pt_cp.vl["GRA_ACC_01"]['GRA_Typ468'] # Pick up the GRA_ACC_01 CAN message counter so we can sync to it for # later cruise-control button spamming. self.graMsgBusCounter = pt_cp.vl["GRA_ACC_01"]['COUNTER'] @@ -106,15 +146,113 @@ class CarState(CarStateBase): # accept and respond to HCA_01 messages and has not encountered a fault. self.steeringFault = not pt_cp.vl["EPS_01"]["HCA_Ready"] + return ret + + def update_pq(self, pt_cp, cam_cp, acc_cp, trans_type): + ret = car.CarState.new_message() + # Update vehicle speed and acceleration from ABS wheel speeds. + ret.wheelSpeeds.fl = pt_cp.vl["Bremse_3"]['Radgeschw__VL_4_1'] * CV.KPH_TO_MS + ret.wheelSpeeds.fr = pt_cp.vl["Bremse_3"]['Radgeschw__VR_4_1'] * CV.KPH_TO_MS + ret.wheelSpeeds.rl = pt_cp.vl["Bremse_3"]['Radgeschw__HL_4_1'] * CV.KPH_TO_MS + ret.wheelSpeeds.rr = pt_cp.vl["Bremse_3"]['Radgeschw__HR_4_1'] * CV.KPH_TO_MS + + ret.vEgoRaw = float(np.mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])) + ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) + + ret.standstill = ret.vEgoRaw < 0.1 + + # Update steering angle, rate, yaw rate, and driver input torque. VW send + # the sign/direction in a separate signal so they must be recombined. + ret.steeringAngle = pt_cp.vl["Lenkhilfe_3"]['LH3_BLW'] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]['LH3_BLWSign'])] + ret.steeringRate = pt_cp.vl["Lenkwinkel_1"]['Lenkradwinkel_Geschwindigkeit'] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]['Lenkradwinkel_Geschwindigkeit_S'])] + ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]['LH3_LM'] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]['LH3_LMSign'])] + ret.steeringPressed = abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE + ret.yawRate = pt_cp.vl["Bremse_5"]['Giergeschwindigkeit'] * (1, -1)[int(pt_cp.vl["Bremse_5"]['Vorzeichen_der_Giergeschwindigk'])] * CV.DEG_TO_RAD + + # Update gas, brakes, and gearshift. + ret.gas = pt_cp.vl["Motor_3"]['Fahrpedal_Rohsignal'] / 100.0 + ret.gasPressed = ret.gas > 0 + ret.brake = pt_cp.vl["Bremse_5"]['Bremsdruck'] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects + ret.brakePressed = bool(pt_cp.vl["Motor_2"]['Bremstestschalter']) + ret.brakeLights = bool(pt_cp.vl["Motor_2"]['Bremslichtschalter']) + # Additional safety checks performed in CarInterface. - self.parkingBrakeSet = bool(pt_cp.vl["Kombi_01"]['KBI_Handbremse']) # FIXME: need to include an EPB check as well - ret.espDisabled = pt_cp.vl["ESP_21"]['ESP_Tastung_passiv'] != 0 + self.parkingBrakeSet = bool(pt_cp.vl["Kombi_1"]['Bremsinfo']) # FIXME: need to include an EPB check as well + ret.espDisabled = bool(pt_cp.vl["Bremse_1"]['ESP_Passiv_getastet']) + + # Update gear and/or clutch position data. + if trans_type == TRANS.automatic: + ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["Getriebe_1"]['Waehlhebelposition__Getriebe_1_'], None)) + elif trans_type == TRANS.manual: + ret.clutchPressed = not pt_cp.vl["Motor_1"]['Kupplungsschalter'] + reverse_light = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Rueckfahr']) + # TODO: verify this synthesis has the desired behavior. + # In particular, should we neutral disengage during normal gear changes? + # Also, what happens if we're rolling backwards with the clutch pressed + # in a gear other than reverse? + if reverse_light: + ret.gearShifter = GEAR.reverse + elif ret.standstill and self.parkingBrakeSet: + ret.gearShifter = GEAR.park + elif ret.clutchPressed: + ret.gearShifter = GEAR.neutral + else: + ret.gearShifter = GEAR.drive + + # Update door and trunk/hatch lid open status. + # TODO: need to locate signals for other three doors if possible + ret.doorOpen = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Fa_Tuerkont']) + + # Update seatbelt fastened status. + ret.seatbeltUnlatched = not bool(pt_cp.vl["Airbag_1"]["Gurtschalter_Fahrer"]) + + # Update driver preference for metric. VW stores many different unit + # preferences, including separate units for for distance vs. speed. + # We use the speed preference for OP. + self.displayMetricUnits = not pt_cp.vl["Einheiten_1"]["MFA_v_Einheit_02"] + + # Update ACC radar status. + # FIXME: This is unfinished and not fully correct, need to improve further + ret.cruiseState.available = bool(pt_cp.vl["GRA_neu"]['Hauptschalter']) + ret.cruiseState.enabled = True if pt_cp.vl["Motor_2"]['GRA_Status'] in [1, 2] else False + + # Update ACC setpoint. When the setpoint reads as 255, the driver has not + # yet established an ACC setpoint, so treat it as zero. + ret.cruiseState.speed = acc_cp.vl["ACC_GRA_Anziege"]['ACA_V_Wunsch'] * CV.KPH_TO_MS + if ret.cruiseState.speed > 70: # 255 kph in m/s == no current setpoint + ret.cruiseState.speed = 0 + + # Update control button states for turn signals and ACC controls. + self.buttonStates["accelCruise"] = bool(pt_cp.vl["GRA_neu"]['Kurz_Tip_up']) or bool(pt_cp.vl["GRA_neu"]['Lang_Tip_up']) + self.buttonStates["decelCruise"] = bool(pt_cp.vl["GRA_neu"]['Kurz_Tip_down']) or bool(pt_cp.vl["GRA_neu"]['Lang_Tip_down']) + self.buttonStates["cancel"] = bool(pt_cp.vl["GRA_neu"]['Abbrechen']) + self.buttonStates["setCruise"] = bool(pt_cp.vl["GRA_neu"]['Setzen']) + self.buttonStates["resumeCruise"] = bool(pt_cp.vl["GRA_neu"]['Wiederaufnahme']) + self.buttonStates["gapAdjustCruise"] = bool(pt_cp.vl["GRA_neu"]['Zeitlueckenverstellung']) + ret.leftBlinker = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Blinker_li']) + ret.rightBlinker = bool(pt_cp.vl["Gate_Komf_1"]['GK1_Blinker_re']) + + # Read ACC hardware button type configuration info that has to pass thru + # to the radar. Ends up being different for steering wheel buttons vs + # third stalk type controls. + # TODO: Check to see what info we need to passthru and spoof on PQ + self.graHauptschalter = pt_cp.vl["GRA_neu"]['Hauptschalter'] + self.graTypHauptschalter = False + self.graButtonTypeInfo = False + self.graTipStufe2 = False + # Pick up the GRA_ACC_01 CAN message counter so we can sync to it for + # later cruise-control button spamming. + # FIXME: will need msg counter and checksum algo to spoof GRA_neu + self.graMsgBusCounter = 0 + + # Check to make sure the electric power steering rack is configured to + # accept and respond to HCA_01 messages and has not encountered a fault. + self.steeringFault = pt_cp.vl["Lenkhilfe_2"]['LH2_Sta_HCA'] not in [3, 5] return ret @staticmethod - def get_can_parser(CP): - # this function generates lists for signal, messages and initial values + def get_mqb_can_parser(CP): signals = [ # sig_name, sig_address, default ("LWI_Lenkradwinkel", "LWI_01", 0), # Absolute steering angle @@ -134,14 +272,12 @@ class CarState(CarStateBase): ("ZV_HD_offen", "Gateway_72", 0), # Trunk or hatch open ("BH_Blinker_li", "Gateway_72", 0), # Left turn signal on ("BH_Blinker_re", "Gateway_72", 0), # Right turn signal on - ("GE_Fahrstufe", "Getriebe_11", 0), # Auto trans gear selector position ("AB_Gurtschloss_FA", "Airbag_02", 0), # Seatbelt status, driver ("AB_Gurtschloss_BF", "Airbag_02", 0), # Seatbelt status, passenger ("ESP_Fahrer_bremst", "ESP_05", 0), # Brake pedal pressed ("ESP_Status_Bremsdruck", "ESP_05", 0), # Brakes applied ("ESP_Bremsdruck", "ESP_05", 0), # Brake pressure applied ("MO_Fahrpedalrohwert_01", "Motor_20", 0), # Accelerator pedal value - ("MO_Kuppl_schalter", "Motor_14", 0), # Clutch switch ("Driver_Strain", "EPS_01", 0), # Absolute driver torque input ("Driver_Strain_VZ", "EPS_01", 0), # Driver torque input sign ("HCA_Ready", "EPS_01", 0), # Steering rack HCA support configured @@ -149,60 +285,150 @@ class CarState(CarStateBase): ("KBI_MFA_v_Einheit_02", "Einheiten_01", 0), # MPH vs KMH speed display ("KBI_Handbremse", "Kombi_01", 0), # Manual handbrake applied ("TSK_Status", "TSK_06", 0), # ACC engagement status from drivetrain coordinator - ("TSK_Fahrzeugmasse_02", "Motor_16", 0), # Estimated vehicle mass from drivetrain coordinator - ("ACC_Status_ACC", "ACC_06", 0), # ACC engagement status - ("ACC_Typ", "ACC_06", 0), # ACC type (follow to stop, stop&go) - ("SetSpeed", "ACC_02", 0), # ACC set speed ("GRA_Hauptschalter", "GRA_ACC_01", 0), # ACC button, on/off ("GRA_Abbrechen", "GRA_ACC_01", 0), # ACC button, cancel ("GRA_Tip_Setzen", "GRA_ACC_01", 0), # ACC button, set ("GRA_Tip_Hoch", "GRA_ACC_01", 0), # ACC button, increase or accel ("GRA_Tip_Runter", "GRA_ACC_01", 0), # ACC button, decrease or decel ("GRA_Tip_Wiederaufnahme", "GRA_ACC_01", 0), # ACC button, resume - ("GRA_Verstellung_Zeitluecke", "GRA_ACC_01", 0), # ACC button, time gap adj + ("GRA_Verstellung_Zeitluecke", "GRA_ACC_01", 0), # ACC button, time gap adj ("GRA_Typ_Hauptschalter", "GRA_ACC_01", 0), # ACC main button type ("GRA_Tip_Stufe_2", "GRA_ACC_01", 0), # unknown related to stalk type + ("GRA_Typ468", "GRA_ACC_01", 0), # Set/Resume button behavior as overloaded coast/accel?? ("GRA_ButtonTypeInfo", "GRA_ACC_01", 0), # unknown related to stalk type ("COUNTER", "GRA_ACC_01", 0), # GRA_ACC_01 CAN message counter ] checks = [ # sig_address, frequency - ("LWI_01", 100), # From J500 Steering Assist with integrated sensors - ("EPS_01", 100), # From J500 Steering Assist with integrated sensors - ("ESP_19", 100), # From J104 ABS/ESP controller - ("ESP_05", 50), # From J104 ABS/ESP controller - ("ESP_21", 50), # From J104 ABS/ESP controller - ("ACC_06", 50), # From J428 ACC radar control module - ("Motor_20", 50), # From J623 Engine control module - ("TSK_06", 50), # From J623 Engine control module - ("GRA_ACC_01", 33), # From J??? steering wheel control buttons - ("ACC_02", 17), # From J428 ACC radar control module - ("Getriebe_11", 20), # From J743 Auto transmission control module - ("Gateway_72", 10), # From J533 CAN gateway (aggregated data) - ("Motor_14", 10), # From J623 Engine control module - ("Airbag_02", 5), # From J234 Airbag control module - ("Kombi_01", 2), # From J285 Instrument cluster - ("Motor_16", 2), # From J623 Engine control module - ("Einheiten_01", 1), # From J??? not known if gateway, cluster, or BCM + ("LWI_01", 100), # From J500 Steering Assist with integrated sensors + ("EPS_01", 100), # From J500 Steering Assist with integrated sensors + ("ESP_19", 100), # From J104 ABS/ESP controller + ("ESP_05", 50), # From J104 ABS/ESP controller + ("ESP_21", 50), # From J104 ABS/ESP controller + ("Motor_20", 50), # From J623 Engine control module + ("TSK_06", 50), # From J623 Engine control module + ("GRA_ACC_01", 33), # From J??? steering wheel control buttons + ("Gateway_72", 10), # From J533 CAN gateway (aggregated data) + ("Airbag_02", 5), # From J234 Airbag control module + ("Kombi_01", 2), # From J285 Instrument cluster + ("Einheiten_01", 1), # From J??? not known if gateway, cluster, or BCM ] + if CP.transmissionType == TRANS.automatic: + signals += [("GE_Fahrstufe", "Getriebe_11", 0)] # Auto trans gear selector position + checks += [("Getriebe_11", 20)] # From J743 Auto transmission control module + elif CP.transmissionType == TRANS.direct: + signals += [("GearPosition", "EV_Gearshift", 0)] # EV gear selector position + checks += [("EV_Gearshift", 10)] # From J??? unknown EV control module + elif CP.transmissionType == TRANS.manual: + signals += [("MO_Kuppl_schalter", "Motor_14", 0), # Clutch switch + ("BCM1_Rueckfahrlicht_Schalter", "Gateway_72", 0)] # Reverse light from BCM + checks += [("Motor_14", 10)] # From J623 Engine control module + + if CP.networkLocation == NWL.fwdCamera: + # The ACC radar is here on CANBUS.pt + signals += [("SetSpeed", "ACC_02", 0)] # ACC set speed + checks += [("ACC_02", 17)] # From J428 ACC radar control module + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.pt) - # A single signal is monitored from the camera CAN bus, and then ignored, - # so the presence of CAN traffic can be verified with cam_cp.valid. - @staticmethod - def get_cam_can_parser(CP): - + def get_pq_can_parser(CP): signals = [ # sig_name, sig_address, default - ("Kombi_Lamp_Green", "LDW_02", 0), # Lane Assist status LED + ("LH3_BLW", "Lenkhilfe_3", 0), # Absolute steering angle + ("LH3_BLWSign", "Lenkhilfe_3", 0), # Steering angle sign + ("LH3_LM", "Lenkhilfe_3", 0), # Absolute driver torque input + ("LH3_LMSign", "Lenkhilfe_3", 0), # Driver torque input sign + ("LH2_Sta_HCA", "Lenkhilfe_2", 0), # Steering rack HCA status + ("Lenkradwinkel_Geschwindigkeit", "Lenkwinkel_1", 0), # Absolute steering rate + ("Lenkradwinkel_Geschwindigkeit_S", "Lenkwinkel_1", 0), # Steering rate sign + ("Radgeschw__VL_4_1", "Bremse_3", 0), # ABS wheel speed, front left + ("Radgeschw__VR_4_1", "Bremse_3", 0), # ABS wheel speed, front right + ("Radgeschw__HL_4_1", "Bremse_3", 0), # ABS wheel speed, rear left + ("Radgeschw__HR_4_1", "Bremse_3", 0), # ABS wheel speed, rear right + ("Giergeschwindigkeit", "Bremse_5", 0), # Absolute yaw rate + ("Vorzeichen_der_Giergeschwindigk", "Bremse_5", 0), # Yaw rate sign + ("GK1_Fa_Tuerkont", "Gate_Komf_1", 0), # Door open, driver + # TODO: locate passenger and rear door states + ("GK1_Blinker_li", "Gate_Komf_1", 0), # Left turn signal on + ("GK1_Blinker_re", "Gate_Komf_1", 0), # Right turn signal on + ("Gurtschalter_Fahrer", "Airbag_1", 0), # Seatbelt status, driver + ("Gurtschalter_Beifahrer", "Airbag_1", 0), # Seatbelt status, passenger + ("Bremstestschalter", "Motor_2", 0), # Brake pedal pressed (brake light test switch) + ("Bremslichtschalter", "Motor_2", 0), # Brakes applied (brake light switch) + ("Bremsdruck", "Bremse_5", 0), # Brake pressure applied + ("Vorzeichen_Bremsdruck", "Bremse_5", 0), # Brake pressure applied sign (???) + ("Fahrpedal_Rohsignal", "Motor_3", 0), # Accelerator pedal value + ("ESP_Passiv_getastet", "Bremse_1", 0), # Stability control disabled + ("MFA_v_Einheit_02", "Einheiten_1", 0), # MPH vs KMH speed display + ("Bremsinfo", "Kombi_1", 0), # Manual handbrake applied + ("GRA_Status", "Motor_2", 0), # ACC engagement status + ("Hauptschalter", "GRA_neu", 0), # ACC button, on/off + ("Abbrechen", "GRA_neu", 0), # ACC button, cancel + ("Setzen", "GRA_neu", 0), # ACC button, set + ("Lang_Tip_up", "GRA_neu", 0), # ACC button, increase or accel, long press + ("Lang_Tip_down", "GRA_neu", 0), # ACC button, decrease or decel, long press + ("Kurz_Tip_up", "GRA_neu", 0), # ACC button, increase or accel, short press + ("Kurz_Tip_down", "GRA_neu", 0), # ACC button, decrease or decel, short press + ("Wiederaufnahme", "GRA_neu", 0), # ACC button, resume + ("Zeitlueckenverstellung", "GRA_neu", 0), # ACC button, time gap adj ] checks = [ # sig_address, frequency - ("LDW_02", 10) # From R242 Driver assistance camera + ("Bremse_3", 100), # From J104 ABS/ESP controller + ("Lenkhilfe_3", 100), # From J500 Steering Assist with integrated sensors + ("Lenkwinkel_1", 100), # From J500 Steering Assist with integrated sensors + ("Motor_3", 100), # From J623 Engine control module + ("Airbag_1", 50), # From J234 Airbag control module + ("Bremse_5", 50), # From J104 ABS/ESP controller + ("GRA_neu", 50), # From J??? steering wheel control buttons + ("Kombi_1", 50), # From J285 Instrument cluster + ("Motor_2", 50), # From J623 Engine control module + ("Lenkhilfe_2", 20), # From J500 Steering Assist with integrated sensors + ("Gate_Komf_1", 10), # From J533 CAN gateway + ("Einheiten_1", 1), # From J??? cluster or gateway ] + if CP.transmissionType == TRANS.automatic: + signals += [("Waehlhebelposition__Getriebe_1_", "Getriebe_1", 0)] # Auto trans gear selector position + checks += [("Getriebe_1", 100)] # From J743 Auto transmission control module + elif CP.transmissionType == TRANS.manual: + signals += [("Kupplungsschalter", "Motor_1", 0), # Clutch switch + ("GK1_Rueckfahr", "Gate_Komf_1", 0)] # Reverse light from BCM + checks += [("Motor_1", 100)] # From J623 Engine control module + + if CP.networkLocation == NWL.fwdCamera: + # The ACC radar is here on CANBUS.pt + signals += [("ACA_V_Wunsch", "ACC_GRA_Anziege", 0)] # ACC set speed + checks += [("ACC_GRA_Anziege", 25)] # From J428 ACC radar control module + + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.pt) + + @staticmethod + def get_mqb_cam_can_parser(CP): + # TODO: Need to monitor LKAS camera, if present, for TLC/DLC/warning signals for passthru to SWA + signals = [] + checks = [] + + if CP.networkLocation == NWL.gateway: + # The ACC radar is here on CANBUS.cam + signals += [("SetSpeed", "ACC_02", 0)] # ACC set speed + checks += [("ACC_02", 17)] # From J428 ACC radar control module + + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.cam) + + @staticmethod + def get_pq_cam_can_parser(CP): + # TODO: Need to monitor LKAS camera, if present, for TLC/DLC/warning signals for passthru to SWA + signals = [] + checks = [] + + if CP.networkLocation == NWL.gateway: + # The ACC radar is here on CANBUS.cam + signals += [("ACA_V_Wunsch", "ACC_GRA_Anziege", 0)] # ACC set speed + checks += [("ACC_GRA_Anziege", 25)] # From J428 ACC radar control module + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, CANBUS.cam) diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 857f25f8a..d5690bd2e 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -1,20 +1,25 @@ from cereal import car -from selfdrive.config import Conversions as CV +from selfdrive.swaglog import cloudlog from selfdrive.controls.lib.drive_helpers import create_event, EventTypes as ET -from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES -from common.params import put_nonblocking +from selfdrive.car.volkswagen.values import CAR, BUTTON_STATES, NWL, TRANS, GEAR, MQB_CARS, PQ_CARS +from common.params import Params from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint from selfdrive.car.interfaces import CarInterfaceBase -GEAR = car.CarState.GearShifter - class CarInterface(CarInterfaceBase): def __init__(self, CP, CarController, CarState): super().__init__(CP, CarController, CarState) self.displayMetricUnitsPrev = None + self.gas_pressed_prev = False + self.brake_pressed_prev = False + self.cruise_enabled_prev = False + self.low_speed_alert = False self.buttonStatesPrev = BUTTON_STATES.copy() + # Set up an alias to PT/CAM parser for ACC depending on its detected network location + self.cp_acc = self.cp if CP.networkLocation == NWL.fwdCamera else self.cp_cam + @staticmethod def compute_gb(accel, speed): return float(accel) / 4.0 @@ -23,46 +28,67 @@ class CarInterface(CarInterfaceBase): def get_params(candidate, fingerprint=gen_empty_fingerprint(), has_relay=False, car_fw=[]): ret = CarInterfaceBase.get_std_params(candidate, fingerprint, has_relay) - # VW port is a community feature, since we don't own one to test - ret.communityFeature = True + # Set global default parameters + ret.radarOffCan = True + ret.enableCamera = True # Stock camera detection doesn't apply to VW + ret.steerRateCost = 1.0 + ret.steerActuatorDelay = 0.05 # Hopefully all racks are similar here + ret.steerLimitTimer = 0.4 - if candidate == CAR.GOLF: - # Set common MQB parameters that will apply globally + # Override these per-car as necessary + ret.lateralTuning.pid.kpBP = [0.] + ret.lateralTuning.pid.kiBP = [0.] + ret.lateralTuning.pid.kpV = [0.6] + ret.lateralTuning.pid.kiV = [0.2] + ret.lateralTuning.pid.kf = 0.00006 + + # PER-PLATFORM PARAMETERS - DO NOT EDIT HERE TO TUNE INDIVIDUAL VEHICLES + + if candidate in MQB_CARS: + # Configurations shared between all MQB vehicles ret.carName = "volkswagen" - ret.radarOffCan = True ret.safetyModel = car.CarParams.SafetyModel.volkswagen - # Additional common MQB parameters that may be overridden per-vehicle - ret.steerRateCost = 0.5 - ret.steerActuatorDelay = 0.05 # Hopefully all MQB racks are similar here - ret.steerLimitTimer = 0.4 + # Determine installed network location and trans type from fingerprint + ret.networkLocation = NWL.fwdCamera if 0x122 in fingerprint[0] else NWL.gateway + if 0xAD in fingerprint[0]: # Getriebe_11 + ret.transmissionType = TRANS.automatic + elif 0x187 in fingerprint[0]: # EV_Gearshift + ret.transmissionType = TRANS.direct + else: # No trans at all + ret.transmissionType = TRANS.manual - # As a starting point for speed-adjusted lateral tuning, use the example - # map speed breakpoints from a VW Tiguan (SSP 399 page 9). It's unclear - # whether the driver assist map breakpoints have any direct bearing on - # HCA assist torque, but if they're good breakpoints for the driver, - # they're probably good breakpoints for HCA as well. OP won't be driving - # 250kph/155mph but it provides interpolation scaling above 100kmh/62mph. - ret.lateralTuning.pid.kpBP = [0., 15 * CV.KPH_TO_MS, 50 * CV.KPH_TO_MS] - ret.lateralTuning.pid.kiBP = [0., 15 * CV.KPH_TO_MS, 50 * CV.KPH_TO_MS] + elif candidate in PQ_CARS: + # Configurations shared between all PQ35/PQ46/NMS vehicles + ret.carName = "volkswagen" + ret.safetyModel = car.CarParams.SafetyModel.volkswagenPq - # FIXME: Per-vehicle parameters need to be reintegrated. - # For the time being, per-vehicle stuff is being archived since we - # can't auto-detect very well yet. Now that tuning is figured out, - # averaged params should work reasonably on a range of cars. Owners - # can tweak here, as needed, until we have car type auto-detection. + # Determine installed network location and trans type from fingerprint + ret.networkLocation = NWL.fwdCamera if 0x368 in fingerprint[0] else NWL.gateway + if 0x440 in fingerprint[0]: # Getriebe_1 + ret.transmissionType = TRANS.automatic + else: # No trans at all + ret.transmissionType = TRANS.manual - ret.mass = 1700 + STD_CARGO_KG - ret.wheelbase = 2.75 - ret.centerToFront = ret.wheelbase * 0.45 + cloudlog.warning("Detected network location: %s", ret.networkLocation) + cloudlog.warning("Detected transmission type: %s", ret.transmissionType) + + # PER-VEHICLE PARAMETERS - EDIT HERE TO TUNE INDIVIDUAL VEHICLES + + if candidate == CAR.GENERICMQB: + # FIXME: Defaulting to VW Golf Mk7 as a baseline. + ret.mass = 1500 + STD_CARGO_KG # Average, varies on trim/package + ret.wheelbase = 2.64 + ret.centerToFront = ret.wheelbase * 0.45 # Estimated ret.steerRatio = 15.6 - ret.lateralTuning.pid.kf = 0.00006 - ret.lateralTuning.pid.kpV = [0.15, 0.25, 0.60] - ret.lateralTuning.pid.kiV = [0.05, 0.05, 0.05] - tire_stiffness_factor = 0.6 + tire_stiffness_factor = 1.0 - ret.enableCamera = True # Stock camera detection doesn't apply to VW - ret.transmissionType = car.CarParams.TransmissionType.automatic + elif candidate == CAR.GENERICPQ: + ret.mass = 1375 + STD_CARGO_KG # Average, varies on trim/package + ret.wheelbase = 2.58 + ret.centerToFront = ret.wheelbase * 0.45 # Estimated + ret.steerRatio = 15.6 + tire_stiffness_factor = 1.0 # TODO: get actual value, for now starting with reasonable value for # civic and scaling by mass and wheelbase @@ -77,9 +103,9 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def update(self, c, can_strings): - self.dp_load_params('volkswagen') canMonoTimes = [] buttonEvents = [] + params = Params() # Process the most recent CAN message traffic, and check for validity # The camera CAN has no signals we use at this time, but we process it @@ -87,14 +113,14 @@ class CarInterface(CarInterfaceBase): self.cp.update_strings(can_strings) self.cp_cam.update_strings(can_strings) - ret = self.CS.update(self.cp) - ret.canValid = self.cp.can_valid and self.cp_cam.can_valid + ret = self.CS.update(self.cp, self.cp_cam, self.cp_acc, self.CP.transmissionType) + ret.canValid = self.cp.can_valid # FIXME: Restore cp_cam valid check after proper LKAS camera detect ret.steeringRateLimited = self.CC.steer_rate_limited if self.CC is not None else False # Update the EON metric configuration to match the car at first startup, # or if there's been a change. if self.CS.displayMetricUnits != self.displayMetricUnitsPrev: - put_nonblocking("IsMetric", "1" if self.CS.displayMetricUnits else "0") + params.put("IsMetric", "1" if self.CS.displayMetricUnits else "0") # Check for and process state-change events (button press or release) from # the turn stalk switch or ACC steering wheel/control stalk buttons. @@ -113,11 +139,22 @@ class CarInterface(CarInterfaceBase): if self.CS.steeringFault: events.append(create_event('steerTempUnavailable', [ET.NO_ENTRY, ET.WARNING])) + # Engagement and longitudinal control using stock ACC. Make sure OP is + # disengaged if stock ACC is disengaged. + if not ret.cruiseState.enabled: + events.append(create_event('pcmDisable', [ET.USER_DISABLE])) + # Attempt OP engagement only on rising edge of stock ACC engagement. + elif not self.cruise_enabled_prev: + events.append(create_event('pcmEnable', [ET.ENABLE])) + ret.events = events ret.buttonEvents = buttonEvents ret.canMonoTimes = canMonoTimes # update previous car states + self.gas_pressed_prev = ret.gasPressed + self.brake_pressed_prev = ret.brakePressed + self.cruise_enabled_prev = ret.cruiseState.enabled self.displayMetricUnitsPrev = self.CS.displayMetricUnits self.buttonStatesPrev = self.CS.buttonStates.copy() diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 4c19fdc0a..cd0a927bd 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,8 +1,22 @@ +# --------------------------------------------------------------------------- # +# # +# from: https://github.com/jyoung8607/openpilot/tree/vw-community-private-pq # +# verify: dinglx@uincore.net(https://shop442817640.taobao.com) # +# Date: 2020-05-22 # +# # +# --------------------------------------------------------------------------- # + + +from cereal import car from selfdrive.car import dbc_dict class CarControllerParams: - HCA_STEP = 2 # HCA_01 message frequency 50Hz - LDW_STEP = 10 # LDW_02 message frequency 10Hz + # FIXME: testing HCA at 100Hz on PQ to verify timebomb behavior + # HCA_STEP = 2 # HCA_01 message frequency 50Hz + HCA_STEP = 1 # HCA_01 message frequency 100Hz + # FIXME: LDW is sent at 20Hz on PQ, need to make this conditional + # LDW_STEP = 10 # LDW_02 message frequency 10Hz + LDW_STEP = 5 # LDW_02 message frequency 20Hz GRA_ACC_STEP = 3 # GRA_ACC_01 message frequency 33Hz GRA_VBP_STEP = 100 # Send ACC virtual button presses once a second @@ -12,8 +26,11 @@ class CarControllerParams: # Limiting rate-of-change based on real-world testing and Comma's safety # requirements for minimum time to lane departure. STEER_MAX = 300 # Max heading control assist torque 3.00 Nm - STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50)) - STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + # FIXME: testing steering rate hax for PQ + # STEER_DELTA_UP = 4 # Max HCA reached in 1.50s (STEER_MAX / (50Hz * 1.50)) + # STEER_DELTA_DOWN = 10 # Min HCA reached in 0.60s (STEER_MAX / (50Hz * 0.60)) + STEER_DELTA_UP = 2 # Max HCA reached in 1.50s (STEER_MAX / (100Hz * 1.50)) + STEER_DELTA_DOWN = 5 # Min HCA reached in 0.60s (STEER_MAX / (100Hz * 0.60)) STEER_DRIVER_ALLOWANCE = 80 STEER_DRIVER_MULTIPLIER = 3 # weight driver torque heavily STEER_DRIVER_FACTOR = 1 # from dbc @@ -22,6 +39,10 @@ class CANBUS: pt = 0 cam = 2 +NWL = car.CarParams.NetworkLocation +TRANS = car.CarParams.TransmissionType +GEAR = car.CarState.GearShifter + BUTTON_STATES = { "accelCruise": False, "decelCruise": False, @@ -44,20 +65,49 @@ MQB_LDW_MESSAGES = { } class CAR: - GOLF = "Volkswagen Golf" + GENERICMQB = "Generic Volkswagen MQB Platform Vehicle" + GENERICPQ = "Generic Volkswagen PQ35/PQ46/NMS Platform Vehicle" +# Mega-fingerprint used to identify any and all MQB platform vehicles. Specific +# make and model characteristics are looked up from the VIN later. +# Note: 1471:8 observed as 1471:4 on a 2019 Jetta, and we can't carry both in one FP, effect TBD FINGERPRINTS = { - CAR.GOLF: [ - # 76b83eb0245de90e|2019-10-21--17-40-42 - jyoung8607 car - {64: 8, 134: 8, 159: 8, 173: 8, 178: 8, 253: 8, 257: 8, 260: 8, 262: 8, 264: 8, 278: 8, 279: 8, 283: 8, 286: 8, 288: 8, 289: 8, 290: 8, 294: 8, 299: 8, 302: 8, 346: 8, 385: 8, 418: 8, 427: 8, 668: 8, 679: 8, 681: 8, 695: 8, 779: 8, 780: 8, 783: 8, 792: 8, 795: 8, 804: 8, 806: 8, 807: 8, 808: 8, 809: 8, 870: 8, 896: 8, 897: 8, 898: 8, 901: 8, 917: 8, 919: 8, 949: 8, 958: 8, 960: 4, 981: 8, 987: 8, 988: 8, 991: 8, 997: 8, 1000: 8, 1019: 8, 1120: 8, 1122: 8, 1123: 8, 1124: 8, 1153: 8, 1162: 8, 1175: 8, 1312: 8, 1385: 8, 1413: 8, 1440: 5, 1514: 8, 1515: 8, 1520: 8, 1600: 8, 1601: 8, 1603: 8, 1605: 8, 1624: 8, 1626: 8, 1629: 8, 1631: 8, 1646: 8, 1648: 8, 1712: 6, 1714: 8, 1716: 8, 1717: 8, 1719: 8, 1720: 8, 1721: 8 - }, - { - # China Golf GTI @easyeiji - 64: 8, 134: 8, 159: 8, 173: 8, 178: 8, 253: 8, 257: 8, 260: 8, 262: 8, 264: 8, 278: 8, 279: 8, 283: 8, 286: 8, 288: 8, 289: 8, 290: 8, 294: 8, 299: 8, 302: 8, 346: 8, 385: 8, 418: 8, 427: 8, 668: 8, 679: 8, 681: 8, 695: 8, 779: 8, 780: 8, 783: 8, 792: 8, 804: 8, 806: 8, 807: 8, 808: 8, 809: 8, 870: 8, 896: 8, 897: 8, 898: 8, 901: 8, 917: 8, 919: 8, 927: 8, 949: 8, 958: 8, 960: 4, 981: 8, 987: 8, 988: 8, 991: 8, 997: 8, 1000: 8, 1019: 8, 1120: 8, 1122: 8, 1123: 8, 1124: 8, 1153: 8, 1162: 8, 1175: 8, 1312: 8, 1385: 8, 1413: 8, 1440: 5, 1514: 8, 1515: 8, 1520: 8, 1529: 8, 1600: 8, 1601: 8, 1603: 8, 1605: 8, 1624: 8, 1629: 8, 1631: 8, 1646: 8, 1648: 8, 1712: 6, 1714: 8, 1716: 8, 1717: 8, 1719: 8, 1720: 8, 1721: 8 - }, + + CAR.GENERICMQB: [ + {178: 8, 1600: 8, 1601: 8, 1603: 8, 1605: 8, 695: 8, 1624: 8, 1626: 8, 1629: 8, 1631: 8, 1122: 8, 1123: 8, + 1124: 8, 1646: 8, 1648: 8, 1153: 8, 134: 8, 1162: 8, 1175: 8, 159: 8, 795: 8, 679: 8, 681: 8, 173: 8, 1712: 6, + 1714: 8, 1716: 8, 1717: 8, 1719: 8, 1720: 8, 1721: 8, 1312: 8, 806: 8, 253: 8, 1792: 8, 257: 8, 260: 8, 262: 8, + 897: 8, 264: 8, 779: 8, 780: 8, 783: 8, 278: 8, 279: 8, 792: 8, 283: 8, 285: 8, 286: 8, 901: 8, 288: 8, 289: 8, + 290: 8, 804: 8, 294: 8, 807: 8, 808: 8, 809: 8, 299: 8, 302: 8, 1351: 8, 346: 8, 870: 8, 1385: 8, 896: 8, 64: 8, + 898: 8, 1413: 8, 917: 8, 919: 8, 927: 8, 1440: 5, 929: 8, 930: 8, 427: 8, 949: 8, 958: 8, 960: 4, 418: 8, 981: 8, + 987: 8, 988: 8, 991: 8, 997: 8, 1000: 8, 1514: 8, 1515: 8, 1520: 8, 1019: 8, 385: 8, 668: 8, 1120: 8, + 1438: 8, 1461: 8, 391: 8, 1511: 8, 1516: 8, 568: 8, 569: 8, 826: 8, 827: 8, 1156: 8, 1157: 8, 1158: 8, 1471: 8, + 1635: 8, 376: 8}], + + CAR.GENERICPQ: [ + # kamold, Edgy, austinc3030, Roy_001 + {80: 4, 194: 8, 208: 6, 210: 5, 294: 8, 416: 8, 428: 8, 640: 8, 648: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, + 896: 8, 906: 4, 912: 8, 914: 8, 919: 8, 928: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, + 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, + 1550: 2, 1651: 3, 1652: 8, 1654: 2, 1658: 4, 1691: 3, 1736: 2, 1757: 8, 1824: 7, 1845: 7, 2000: 8, 1420: 8}, + # cd (powertrain CAN direct) + {16: 7, 17: 7, 80: 4, 174: 8, 194: 8, 208: 6, 416: 8, 428: 8, 640: 8, 648: 8, 672: 8, 800: 8, 896: 8, 906: 4, + 912: 8, 914: 8, 915: 8, 919: 8, 928: 8, 946: 8, 976: 6, 978: 7, 1056: 8, 1152: 8, 1160: 8, 1162: 8, 1164: 8, + 1175: 8, 1184: 8, 1192: 8, 1306: 8, 1312: 8, 1344: 8, 1360: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1416: 8, + 1420: 8, 1423: 8, 1440: 8, 1463: 8, 1488: 8, 1490: 8, 1494: 2, 1500: 8, 1504: 8, 1523: 8, 1527: 4, 1654: 2, + 1658: 2, 1754: 8, 1824: 7, 1827: 7, 2000: 8}, + {80: 4, 194: 8, 208: 6, 210: 5, 416: 8, 428: 8, 640: 8, 648: 8, 695: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 928: 8, 954: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1650: 8, 1651: 4, 1652: 8, 1691: 4, 1757: 3, 1824: 7, 1845: 7, 2000: 8}, + {80: 4, 194: 8, 208: 6, 210: 5, 416: 8, 428: 8, 640: 8, 648: 8, 695: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 928: 8, 954: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1650: 5, 1651: 3, 1652: 8, 1691: 3, 1736: 2, 1757: 8, 1824: 7, 1845: 7, 2000: 8 + }, + {80: 4, 194: 8, 208: 6, 210: 5, 416: 8, 428: 8, 640: 8, 648: 8, 695: 8, 800: 8, 835: 3, 870: 8, 872: 8, 878: 8, 896: 8, 906: 4, 912: 8, 914: 8, 928: 8, 954: 8, 978: 7, 1056: 8, 1088: 8, 1152: 8, 1175: 8, 1184: 8, 1192: 8, 1312: 8, 1386: 8, 1392: 5, 1394: 1, 1408: 8, 1440: 8, 1463: 8, 1470: 5, 1472: 8, 1488: 8, 1490: 8, 1500: 8, 1550: 2, 1650: 4, 1651: 3, 1652: 8, 1691: 2, 1736: 2, 1757: 3, 1824: 7, 1845: 7, 2000: 8 + } ], } +MQB_CARS = [CAR.GENERICMQB] +PQ_CARS = [CAR.GENERICPQ] + DBC = { - CAR.GOLF: dbc_dict('vw_mqb_2010', None), + CAR.GENERICMQB: dbc_dict('vw_mqb_2010', None), + CAR.GENERICPQ: dbc_dict('vw_golf_mk4', None), } diff --git a/selfdrive/car/volkswagen/volkswagencan.py b/selfdrive/car/volkswagen/volkswagencan.py index 34f19003d..da4c04ea6 100644 --- a/selfdrive/car/volkswagen/volkswagencan.py +++ b/selfdrive/car/volkswagen/volkswagencan.py @@ -1,5 +1,8 @@ -# CAN controls for MQB platform Volkswagen, Audi, Skoda and SEAT. -# PQ35/PQ46/NMS, and any future MLB, to come later. +# ----------------------------------------------------------------------- # +# # +# CAN message packing for MQB vehicles # +# # +# ----------------------------------------------------------------------- # def create_mqb_steering_control(packer, bus, apply_steer, idx, lkas_enabled): values = { @@ -46,7 +49,49 @@ def create_mqb_acc_buttons_control(packer, bus, buttonStatesToSend, CS, idx): "GRA_Typ_Hauptschalter": CS.graTypHauptschalter, "GRA_Codierung": 2, "GRA_Tip_Stufe_2": CS.graTipStufe2, + "GRA_Typ468": CS.graTyp468, "GRA_ButtonTypeInfo": CS.graButtonTypeInfo } return packer.make_can_msg("GRA_ACC_01", bus, values, idx) + +# ----------------------------------------------------------------------- # +# # +# CAN message packing for PQ35/PQ46/NMS vehicles # +# # +# ----------------------------------------------------------------------- # + +def create_pq_steering_control(packer, bus, apply_steer, idx, lkas_enabled): + values = { + "HCA_Zaehler": idx, + "LM_Offset": abs(apply_steer), + "LM_OffSign": 1 if apply_steer < 0 else 0, + "HCA_Status": 5 if (lkas_enabled and apply_steer != 0) else 3, + "Vib_Freq": 16, + } + + dat = packer.make_can_msg("HCA_1", bus, values)[2] + values["HCA_Checksumme"] = dat[1] ^ dat[2] ^ dat[3] ^ dat[4] + return packer.make_can_msg("HCA_1", bus, values) + +def create_pq_hud_control(packer, bus, hca_enabled, steering_pressed, hud_alert, leftLaneVisible, rightLaneVisible): + if hca_enabled: + leftlanehud = 3 if leftLaneVisible else 1 + rightlanehud = 3 if rightLaneVisible else 1 + else: + leftlanehud = 2 if leftLaneVisible else 1 + rightlanehud = 2 if rightLaneVisible else 1 + + values = { + "Right_Lane_Status": rightlanehud, + "Left_Lane_Status": leftlanehud, + "SET_ME_X1": 1, + "Kombi_Lamp_Orange": 1 if hca_enabled and steering_pressed else 0, + "Kombi_Lamp_Green": 1 if hca_enabled and not steering_pressed else 0, + } + return packer.make_can_msg("LDW_1", bus, values) + +pass + +def create_pq_acc_buttons_control(packer, bus, buttonStatesToSend, CS, idx): + pass diff --git a/selfdrive/common/framebuffer.cc b/selfdrive/common/framebuffer.cc index 7bea565d5..dbcab7314 100644 --- a/selfdrive/common/framebuffer.cc +++ b/selfdrive/common/framebuffer.cc @@ -143,3 +143,13 @@ extern "C" void framebuffer_swap(FramebufferState *s) { assert(glGetError() == GL_NO_ERROR); } +extern "C" void framebuffer_swap_layer(FramebufferState *s, int32_t layer) { + status_t status; + SurfaceComposerClient::openGlobalTransaction(); + status = s->control->setLayer(layer); + SurfaceComposerClient::closeGlobalTransaction(); + assert(status == 0); + + s->s = s->control->getSurface(); + assert(s->s != NULL); +} \ No newline at end of file diff --git a/selfdrive/common/framebuffer.h b/selfdrive/common/framebuffer.h index 45920b8e4..83b5b1bde 100644 --- a/selfdrive/common/framebuffer.h +++ b/selfdrive/common/framebuffer.h @@ -13,6 +13,7 @@ FramebufferState* framebuffer_init( void framebuffer_set_power(FramebufferState *s, int mode); void framebuffer_swap(FramebufferState *s); +void framebuffer_swap_layer(FramebufferState *s, int32_t layer); /* Display power modes */ enum { diff --git a/selfdrive/controls/lib/pathplanner.py b/selfdrive/controls/lib/pathplanner.py index bae87207c..b4eb6c57f 100644 --- a/selfdrive/controls/lib/pathplanner.py +++ b/selfdrive/controls/lib/pathplanner.py @@ -76,6 +76,8 @@ class PathPlanner(): self.last_ts = 0. self.dp_last_modified = None self.dp_enable_sr_boost = False + self.dp_continuous_auto_lc = False + self.dp_did_auto_lc = False self.dp_steer_ratio = 0. self.dp_sr_boost_bp = None @@ -115,6 +117,7 @@ class PathPlanner(): if self.dragon_assisted_lc_min_mph < 0: self.dragon_assisted_lc_min_mph = 0 if self.dragon_auto_lc_enabled: + self.dp_continuous_auto_lc = True if self.params.get("DragonEnableContALC", encoding='utf8') == "1" else False # adjustable auto lc min speed try: self.dragon_auto_lc_min_mph = float(self.params.get("DragonAutoLCMinMPH", encoding='utf8')) @@ -194,7 +197,16 @@ class PathPlanner(): if not below_lane_change_speed and self.dragon_auto_lc_enabled and v_ego >= self.dragon_auto_lc_min_mph: # we allow auto lc when speed reached dragon_auto_lc_min_mph self.dragon_auto_lc_allowed = True + else: + # if too slow, we reset all the variables + self.dragon_auto_lc_allowed = False + self.dragon_auto_lc_timer = None + # disable auto lc when continuous is off and already did auto lc once + if self.dragon_auto_lc_allowed and not self.dp_continuous_auto_lc and self.dp_did_auto_lc: + self.dragon_auto_lc_allowed = False + + if self.dragon_auto_lc_allowed: if self.dragon_auto_lc_timer is None: # we only set timer when in preLaneChange state, dragon_auto_lc_delay delay if self.lane_change_state == LaneChangeState.preLaneChange: @@ -202,10 +214,7 @@ class PathPlanner(): elif cur_time >= self.dragon_auto_lc_timer: # if timer is up, we set torque_applied to True to fake user input torque_applied = True - else: - # if too slow, we reset all the variables - self.dragon_auto_lc_allowed = False - self.dragon_auto_lc_timer = None + self.dp_did_auto_lc = True # we reset the timers when torque is applied regardless if torque_applied: @@ -249,6 +258,9 @@ class PathPlanner(): else: self.lane_change_timer += DT_MDL + if self.prev_one_blinker and not one_blinker: + self.dp_did_auto_lc = False + self.prev_one_blinker = one_blinker desire = DESIRES[self.lane_change_direction][self.lane_change_state] diff --git a/selfdrive/dragonpilot/dashcamd/dashcamd.py b/selfdrive/dragonpilot/dashcamd/dashcamd.py index d1a1ecf55..d6b0ba55a 100644 --- a/selfdrive/dragonpilot/dashcamd/dashcamd.py +++ b/selfdrive/dragonpilot/dashcamd/dashcamd.py @@ -18,7 +18,6 @@ params = Params() from common.realtime import sec_since_boot, DT_TRML from common.dp import get_last_modified import collections -import math dashcam_videos_path = '/sdcard/dashcam/' dashcam_duration = 60 # max is 180 @@ -51,36 +50,23 @@ def main(gctx=None): retry += 1 time.sleep(5) - idlecam_enabled = False health_timeout = int(1000 * 2.5 * DT_TRML) # 2.5x the expected health frequency health_sock = messaging.sub_sock('health', timeout=health_timeout) - sensor_sock = messaging.sub_sock('sensorEvents') - samples = collections.deque([]) - start_ts = None - last_started = False - dragon_dashcam_hours = 24. * 60 * 60 max_storage = (max_size_per_file/dashcam_duration) * dragon_dashcam_hours dashcam_enabled = False last_ts = 0. last_modified = None - sleep = 5 thermal_sock = messaging.sub_sock('thermal') - params.put("DragonDashcamImpactDetectStarted", "0") while dashcam_allowed: - type = TYPE_DRIVING duration = dashcam_duration ts = sec_since_boot() if ts - last_ts >= 5.: modified = get_last_modified() if last_modified != modified: dashcam_enabled = True if params.get("DragonEnableDashcam", encoding='utf8') == "1" else False - if dashcam_enabled: - idlecam_enabled = True if params.get("DragonDashcamImpactDetect", encoding='utf8') == "1" else False - else: - idlecam_enabled = False try: dragon_dashcam_hours = float(params.get("DragonDashcamHours", encoding='utf8')) * 60 * 60 except (TypeError, ValueError): @@ -92,51 +78,11 @@ def main(gctx=None): health = messaging.recv_sock(health_sock, wait=False) started = True if health is not None and (health.health.ignitionLine or health.health.ignitionCan) else False - record_started = False - if last_started != started: - params.put("DragonDashcamImpactDetectStarted", "0") - samples.clear() - - if started: - sleep = 5 - if dashcam_enabled: - record_started = True - else: - if idlecam_enabled: - sleep = 0.02 - sensor = messaging.recv_sock(sensor_sock, wait=False) - if sensor is not None: - for event in sensor.sensorEvents: - # accelerometer - if event.type == 1: - acc_x = event.acceleration.v[0] - acc_y = event.acceleration.v[1] - acc_z = event.acceleration.v[2] - g = math.sqrt(acc_x*acc_x+acc_y*acc_y+acc_z*acc_z) - val = round(9.8-g,2) - if len(samples) >= 250: - avg_sample = round(sum(samples)/len(samples),2) - if start_ts is None and abs(val - avg_sample) >= 0.3: - duration = shock_duration - type = TYPE_SHOCK - start_ts = ts - record_started = True - params.put("DragonDashcamImpactDetectStarted", "1") - samples.pop() - samples.appendleft(val) - if start_ts is not None and ts - start_ts >= shock_duration-1: - start_ts = None - record_started = False - params.put("DragonDashcamImpactDetectStarted", "0") - - last_started = started - - if record_started: + if started and dashcam_enabled: now = datetime.datetime.now() file_name = now.strftime("%Y-%m-%d_%H-%M-%S") - postfix = '_impact' if type == TYPE_SHOCK else '' - os.system("screenrecord --bit-rate %s --time-limit %s %s%s%s.mp4 &" % (bit_rates, duration, dashcam_videos_path, file_name, postfix)) + os.system("screenrecord --bit-rate %s --time-limit %s %s%s.mp4 &" % (bit_rates, duration, dashcam_videos_path, file_name)) start_time = time.time() try: used_spaces = get_used_spaces() @@ -167,7 +113,7 @@ def main(gctx=None): if sleep_time >= 0.: time.sleep(sleep_time) else: - time.sleep(sleep) + time.sleep(5) def get_used_spaces(): return sum(os.path.getsize(dashcam_videos_path + f) for f in os.listdir(dashcam_videos_path) if os.path.isfile(dashcam_videos_path + f)) diff --git a/selfdrive/dragonpilot/dragonconf/__init__.py b/selfdrive/dragonpilot/dragonconf/__init__.py index 71c290b7e..a776d2f59 100644 --- a/selfdrive/dragonpilot/dragonconf/__init__.py +++ b/selfdrive/dragonpilot/dragonconf/__init__.py @@ -84,11 +84,11 @@ default_conf = { 'DragonUIScreenOffDriving': '0', 'DragonEnableAutoUpdate': '1', 'DragonUIBrightness': '0', - 'DragonDashcamImpactDetect': '0', - 'DragonDashcamImpactDetectStarted': '0', 'DragonEnableUploadOnMobile': '0', 'DragonEnableUploadOnHotspot': '0', 'DragonMaxSpeedLimit': '92', + 'DragonEnableRating': '1', + 'DragonEnableContALC' : '0', } deprecated_conf = { diff --git a/selfdrive/manager.py b/selfdrive/manager.py index 5423c1116..a9c23e44c 100755 --- a/selfdrive/manager.py +++ b/selfdrive/manager.py @@ -442,9 +442,6 @@ def manager_thread(): if params.get("DragonEnableDashcam", encoding='utf8') == "1": persistent_processes.append('dashcamd') - if params.get("DragonDashcamImpactDetect", encoding='utf8') == "1": - car_started_processes.remove('sensord') - persistent_processes.append('sensord') # start daemon processes for p in daemon_processes: diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 9f3280770..a6fd67ffa 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -237,7 +237,7 @@ def thermald_thread(): location = location.gpsLocation if location else None msg = read_thermal() - if params.get('DragonNoctuaMode', encoding='utf8') == "1": + if handle_fan is None and params.get('DragonNoctuaMode', encoding='utf8') == "1": setup_eon_fan() handle_fan = handle_fan_eon @@ -274,9 +274,6 @@ def thermald_thread(): params.panda_disconnect() health_prev = health - if not ignition and params.get("DragonDashcamImpactDetectStarted", encoding='utf8') == "1": - ignition = True - # get_network_type is an expensive call. update every 10s if (count % int(10. / DT_TRML)) == 0: try: @@ -350,7 +347,7 @@ def thermald_thread(): thermal_status = ThermalStatus.green if not dp_temp_monitor: - thermal_status = ThermalStatus.green + thermal_status = ThermalStatus.yellow # **** starting logic **** time_valid = True diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index e8a2d43ca..d6c12f98b 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -840,7 +840,7 @@ static void ui_draw_infobar(UIState *s) { nvgBeginPath(s->vg); nvgRect(s->vg, rect_x, rect_y, rect_w, rect_h); - nvgFillColor(s->vg, COLOR_BLACK_ALPHA(100)); + nvgFillColor(s->vg, COLOR_BLACK_ALPHA(s->dragon_waze_mode? 150 : 100)); nvgFill(s->vg); nvgFontSize(s->vg, hasSidebar? 35:42); @@ -1175,8 +1175,11 @@ static void ui_draw_background(UIState *s) { int bg_status = s->status; assert(bg_status < ARRAYSIZE(bg_colors)); const uint8_t *color = bg_colors[bg_status]; - - glClearColor(color[0]/256.0, color[1]/256.0, color[2]/256.0, 1.0); + if (s->vision_seen && s->dragon_waze_mode) { + glClearColor(0, 0, 0, 0); + } else { + glClearColor(color[0]/256.0, color[1]/256.0, color[2]/256.0, 1.0); + } glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); } @@ -1187,7 +1190,9 @@ void ui_draw(UIState *s) { glViewport(0, 0, s->fb_w, s->fb_h); nvgBeginFrame(s->vg, s->fb_w, s->fb_h, 1.0f); ui_draw_sidebar(s); - if (s->started && s->active_app == cereal::UiLayoutState::App::NONE && s->status != STATUS_STOPPED && s->vision_seen) { + if (s->vision_seen && s->dragon_waze_mode) { + ui_draw_vision(s); + } else if (s->started && s->active_app == cereal::UiLayoutState::App::NONE && s->status != STATUS_STOPPED && s->vision_seen) { ui_draw_vision(s); } nvgEndFrame(s->vg); diff --git a/selfdrive/ui/sidebar.cc b/selfdrive/ui/sidebar.cc index 3af0dc82c..c952d96f6 100644 --- a/selfdrive/ui/sidebar.cc +++ b/selfdrive/ui/sidebar.cc @@ -20,8 +20,6 @@ static void ui_draw_sidebar_home_button(UIState *s) { bool homeActive = s->active_app == cereal::UiLayoutState::App::HOME; const int home_btn_xr = !s->scene.uilayout_sidebarcollapsed ? home_btn_x : -(sbr_w); - ui_draw_image(s->vg, home_btn_xr, home_btn_y, home_btn_w, home_btn_h, s->img_button_home, homeActive ? 1.0f : 0.65f); - if (s->dragon_updating) { nvgBeginPath(s->vg); nvgCircle(s->vg, home_btn_xr + home_btn_w/2, home_btn_y + home_btn_h/2, 90); @@ -38,9 +36,11 @@ static void ui_draw_sidebar_home_button(UIState *s) { s->scene.alert_rate += 5*s->scene.alert_type; - if (s->scene.alert_rate == 0 || s->scene.alert_rate == 255) { + if (s->scene.alert_rate <= 0 || s->scene.alert_rate >= 255) { s->scene.alert_type *= -1; } + } else { + ui_draw_image(s->vg, home_btn_xr, home_btn_y, home_btn_w, home_btn_h, s->img_button_home, homeActive ? 1.0f : 0.65f); } } diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index a5556934a..c13e46369 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -43,7 +43,7 @@ static void set_awake(UIState *s, bool awake) { #ifdef QCOM if (awake) { // 30 second timeout at 30 fps - s->awake_timeout = s->dragon_dashcam_impact_detect_started? 60*30 : (s->dragon_ui_screen_off_driving && s->started)? 10*30 : 30*30; + s->awake_timeout = (s->dragon_ui_screen_off_driving && s->started)? 10*30 : 30*30; } if (s->awake != awake) { s->awake = awake; @@ -398,7 +398,6 @@ static void ui_init_vision(UIState *s, const VisionStreamBufs back_bufs, read_param_bool(&s->dragon_ui_screen_off_reversing, "DragonUIScreenOffReversing"); read_param_bool(&s->dragon_ui_screen_off_driving, "DragonUIScreenOffDriving"); read_param_uint64(&s->dragon_ui_brightness, "DragonUIBrightness"); - read_param_bool(&s->dragon_dashcam_impact_detect_started, "DragonDashcamImpactDetectStarted"); if (s->dragon_waze_mode) { s->dragon_ui_speed = false; @@ -443,7 +442,6 @@ static void ui_init_vision(UIState *s, const VisionStreamBufs back_bufs, // dp s->dragon_last_modified_timeout = UI_FREQ / 4; s->dragon_updating_timeout = UI_FREQ / 5; - s->dragon_dashcam_impact_detect_started_timeout = UI_FREQ / 6; } static PathData read_path(cereal::ModelData::PathData::Reader pathp) { @@ -653,6 +651,7 @@ void handle_message(UIState *s, Message* msg) { // Handle onroad/offroad transition if (!s->started) { if (s->status != STATUS_STOPPED) { + framebuffer_swap_layer(s->fb, 0); update_status(s, STATUS_STOPPED); s->alert_sound_timeout = 0; s->vision_seen = false; @@ -764,6 +763,10 @@ static void ui_update(UIState *s) { s->alert_blinking_alpha = 1.0; s->alert_blinked = false; + + if (s->dragon_waze_mode) { + framebuffer_swap_layer(s->fb, 0x00010000); + } } zmq_pollitem_t polls[1] = {{0}}; @@ -1083,7 +1086,7 @@ int main(int argc, char* argv[]) { s->scene.ui_viz_rw = hasSidebar ? box_w : (box_w + sbr_w - (bdr_s * 2)); s->scene.ui_viz_ro = hasSidebar ? -(sbr_w - 6 * bdr_s) : 0; - if (s->vision_connected && s->dragon_waze_mode) { + if (s->started && s->dragon_waze_mode) { // always collapsed sidebar when vision is connect and in waze mode s->scene.uilayout_sidebarcollapsed = true; } else { @@ -1211,7 +1214,6 @@ int main(int argc, char* argv[]) { // dp read_param_bool_timeout(&s->dragon_updating, "DragonUpdating", &s->dragon_updating_timeout); read_param_string_timeout(s->dragon_last_modified, "DragonLastModified", &s->dragon_last_modified_timeout); - read_param_bool_timeout(&s->dragon_dashcam_impact_detect_started, "DragonDashcamImpactDetectStarted", &s->dragon_dashcam_impact_detect_started_timeout); if (strcmp(last_modified, s->dragon_last_modified) != 0) { strncpy(last_modified, s->dragon_last_modified, sizeof(last_modified)); diff --git a/selfdrive/ui/ui.hpp b/selfdrive/ui/ui.hpp index 0a8df9c3c..3e2682cef 100644 --- a/selfdrive/ui/ui.hpp +++ b/selfdrive/ui/ui.hpp @@ -330,7 +330,6 @@ typedef struct UIState { SubSocket *carstate_sock; int dragon_updating_timeout; int dragon_last_modified_timeout; - int dragon_dashcam_impact_detect_started_timeout; bool dragon_ui_speed; bool dragon_ui_event; @@ -356,7 +355,6 @@ typedef struct UIState { char dragon_last_modified[20]; bool dragon_ui_screen_off_driving; uint64_t dragon_ui_brightness; - bool dragon_dashcam_impact_detect_started; } UIState; // API