From bdfaa1d1eee77d1f9fb5b9b2632c9988caba02e3 Mon Sep 17 00:00:00 2001 From: HaraldSchafer Date: Mon, 11 Jul 2022 15:19:55 -0700 Subject: [PATCH 01/47] Ram 1500 torque tune (#25117) * torque control again * 3mss per s * no bad sensors * tweaks * Need more checks before we can do this * update refs * only ram for now Co-authored-by: Adeeb Shihadeh --- panda | 2 +- selfdrive/car/chrysler/carcontroller.py | 7 ++++--- selfdrive/car/chrysler/interface.py | 6 +++--- selfdrive/car/chrysler/values.py | 14 ++++++++++---- selfdrive/car/interfaces.py | 4 ++-- selfdrive/car/torque_data/override.yaml | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- 7 files changed, 22 insertions(+), 15 deletions(-) diff --git a/panda b/panda index ca927fe931..baecd2ecc6 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit ca927fe9312651a16f13aaddca8b46af5315ede6 +Subproject commit baecd2ecc6a2a608e1305601f6f697feca69fe88 diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index e0eb979e6a..a7f2d007f1 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -16,6 +16,7 @@ class CarController: self.lkas_active_prev = False self.packer = CANPacker(dbc_name) + self.params = CarControllerParams(CP) def update(self, CC, CS, low_speed_alert): can_sends = [] @@ -40,8 +41,8 @@ class CarController: # steering if self.frame % 2 == 0: # steer torque - new_steer = int(round(CC.actuators.steer * CarControllerParams.STEER_MAX)) - apply_steer = apply_toyota_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorqueEps, CarControllerParams) + new_steer = int(round(CC.actuators.steer * self.params.STEER_MAX)) + apply_steer = apply_toyota_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorqueEps, self.params) if not lkas_active: apply_steer = 0 self.steer_rate_limited = new_steer != apply_steer @@ -56,6 +57,6 @@ class CarController: self.lkas_active_prev = lkas_active new_actuators = CC.actuators.copy() - new_actuators.steer = self.apply_steer_last / CarControllerParams.STEER_MAX + new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX return new_actuators, can_sends diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 697fb9b83a..8826a92523 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -46,15 +46,15 @@ class CarInterface(CarInterfaceBase): # Ram elif candidate == CAR.RAM_1500: + ret.steerActuatorDelay = 0.2 + ret.wheelbase = 3.88 ret.steerRatio = 16.3 ret.mass = 2493. + STD_CARGO_KG ret.maxLateralAccel = 2.4 ret.minSteerSpeed = 14.5 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - ret.lateralTuning.pid.kpBP, ret.lateralTuning.pid.kiBP = [[0.], [0.]] - ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.1], [0.02]] - ret.lateralTuning.pid.kf = 0.00003 else: raise ValueError(f"Unsupported car: {candidate}") diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index ada4f486fc..f7531792fb 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -26,10 +26,16 @@ class CAR: class CarControllerParams: - STEER_MAX = 261 # higher than this faults the EPS on Chrysler/Jeep. Ram DT allows more - STEER_DELTA_UP = 3 - STEER_DELTA_DOWN = 3 - STEER_ERROR_MAX = 80 + def __init__(self, CP): + self.STEER_MAX = 261 # higher than this faults the EPS on Chrysler/Jeep. Ram DT allows more + self.STEER_ERROR_MAX = 80 + + if CP.carFingerprint in RAM_CARS: + self.STEER_DELTA_UP = 5 + self.STEER_DELTA_DOWN = 5 + else: + self.STEER_DELTA_UP = 3 + self.STEER_DELTA_DOWN = 3 STEER_THRESHOLD = 120 diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 136337c5a4..4c7ea97dff 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -135,11 +135,11 @@ class CarInterfaceBase(ABC): return ret @staticmethod - def configure_torque_tune(candidate, tune, steering_angle_deadzone_deg=0.0): + def configure_torque_tune(candidate, tune, steering_angle_deadzone_deg=0.0, use_steering_angle=True): params = get_torque_params(candidate) tune.init('torque') - tune.torque.useSteeringAngle = True + tune.torque.useSteeringAngle = use_steering_angle tune.torque.kp = 1.0 / params['LAT_ACCEL_FACTOR'] tune.torque.kf = 1.0 / params['LAT_ACCEL_FACTOR'] tune.torque.ki = 0.1 / params['LAT_ACCEL_FACTOR'] diff --git a/selfdrive/car/torque_data/override.yaml b/selfdrive/car/torque_data/override.yaml index 476313df2b..8e6f62c4e7 100644 --- a/selfdrive/car/torque_data/override.yaml +++ b/selfdrive/car/torque_data/override.yaml @@ -21,7 +21,7 @@ COMMA BODY: [.nan, 1000, .nan] # Totally new cars KIA EV6 2022: [3.5, 2.5, 0.0] -RAM 1500 5TH GEN: [2.0, 2.0, 0.05] +RAM 1500 5TH GEN: [2.0, 2.0, 0.0] # Dashcam or fallback configured as ideal car mock: [10.0, 10, 0.0] diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 65ecbb4be3..fc5f83c32a 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -825acfae98543c915c18d3b19a9c5d2503e431a6 \ No newline at end of file +d583bbd9643000e7f817171c583d31ae3141a652 \ No newline at end of file From 903bb405286295b48d5192cb2a7b2c01029193e3 Mon Sep 17 00:00:00 2001 From: Lee Jong Mun <43285072+crwusiz@users.noreply.github.com> Date: Tue, 12 Jul 2022 08:51:03 +0900 Subject: [PATCH 02/47] Improve Korean translations (#25105) * kor translations fix update_translations --release qm * space * qm * map setting tr space remove * ts update fix ko_update ch_update * qm release * Update QM * Fix this translation Co-authored-by: Shane Smiskol --- selfdrive/ui/qt/maps/map_settings.cc | 2 +- selfdrive/ui/translations/main_ko.qm | Bin 19997 -> 20040 bytes selfdrive/ui/translations/main_ko.ts | 96 +++++++++++------------ selfdrive/ui/translations/main_zh-CHS.qm | Bin 18509 -> 18508 bytes selfdrive/ui/translations/main_zh-CHS.ts | 2 +- selfdrive/ui/translations/main_zh-CHT.qm | Bin 18569 -> 18568 bytes selfdrive/ui/translations/main_zh-CHT.ts | 7 +- 7 files changed, 51 insertions(+), 56 deletions(-) diff --git a/selfdrive/ui/qt/maps/map_settings.cc b/selfdrive/ui/qt/maps/map_settings.cc index eaa8b1f703..d143b44e70 100644 --- a/selfdrive/ui/qt/maps/map_settings.cc +++ b/selfdrive/ui/qt/maps/map_settings.cc @@ -104,7 +104,7 @@ MapPanel::MapPanel(QWidget* parent) : QWidget(parent) { screenshot->setPixmap(pm.scaledToWidth(1080, Qt::SmoothTransformation)); no_prime_layout->addWidget(screenshot, 0, Qt::AlignHCenter); - QLabel *signup = new QLabel(tr("Get turn-by-turn directions displayed and more with a comma \nprime subscription. Sign up now: https://connect.comma.ai")); + QLabel *signup = new QLabel(tr("Get turn-by-turn directions displayed and more with a comma\nprime subscription. Sign up now: https://connect.comma.ai")); signup->setStyleSheet(R"(font-size: 45px; color: white; font-weight:300;)"); signup->setAlignment(Qt::AlignCenter); diff --git a/selfdrive/ui/translations/main_ko.qm b/selfdrive/ui/translations/main_ko.qm index 60966cdde587ebf4a43deb8ad255f374d32ca7c8..c5c66d1e73491c2ff09d91b6fdd5200002b2a6da 100644 GIT binary patch delta 2731 zcmYLJX;c(v7Jb!S)l2opt_J}NnpG4;!61vQf`Y~+XgCT<#?c^(xCEn~s3hYCijGT zc6t;x5h(_UMlB^$<^XpAR{CuOAd1YQN!oct&K{IDZZC)+uT_bN??uz{L@1g`)BoOE zh>Xf;=DL64Km}zeu4AE`GUk1Ti+9oN6J9*q12i856Oi z5Va03XJ%M}u+YOC=)^+oVdiEA6c`f5+*KSW8lJ#B9=nmqQ={N>;FsW5h2O&-qKI5Y z3SR&vK2~HoAmi|vibEZ!`|x7Lr4kT}XjfdDyo1Q$f#UWI#1(uLUCr=J*fmA>5m&@p zu4D^Ch7h^-DLsEg&4za=eYV9RvpLF@GY~lX56aUtWny%3Ds)iI^SA7c0vla4A~VeyZq0|QaiEs_B;1Inv!2`bIf(ETcJv-?N1r@9 zPF%;827{Q}cCPe~@QQvhSGIW*l(@y6wRS_fHC)4hFO;j~u6yGpITR*x_qxEy?;GyB z4bAYtMmr`y;a(1a;h1QZ!aD<|D_0r&Lm=U9Rm|fQNSLomt-4AS7p9uapd#YD3Tyv<|A5(>h_o*=nC4C>9*6E_dGmPeiKE=6?qQE7binkKz5NtWZCH0%?>_ z)vu!a-~m>X6x4{u^IVgr1Y<{6&4Pctg2cBq+gBbS@+#8&=`;elI%qCDG-I5uRU6)i zx!%*7OEq{!f!c&$a*!FLot54Tq7B;F8=zdub?w|NC>^BJ&bK6jkV(6PhT#2^r0ux( zHq6$d?Q%pHRGImNV01dwZhn4SD>6>yiyxy?d1nG+i2|4K+xkox*YSJapvHlv{QlbG zAasl`y*mr$)$oT~QFAteuPoXF$a}%G?R=wK4DJuI@{fLB z0O_K2%*FLMkghY=HGxo!F6BWn%(PyY-GheVuhuQU&4T#`-De-WKthAg@*_$#Vz$mU z6^glC)w|SzK$u?dU4{9;+xk(lYv7f;`jjNpIx%0L7MV>np+%pb2qof{>SymQL_qIi z{gSt3X07^tFW*H5_w`k~@C=2|_02~h-PqIm8~1=?IQ=~f2(o`OsLFkD;ZsAX=Uxh$RlwL+hDM(+Vd5@BVbY!k=^K2W7CZ3C6Lgi)wn!yBHSEkEIx=nFj6oc>WfE>PZ>{@ z;iB;&#;ecZ39lC8&GG@ z<8nO-*OF_gw&+ge<+UVOH`VxcX4Xeq_J|*9Eq=b%ozl1UzBX5DG6|iTHNIC0NT~Q% zZJ0HtCX0mX>4Q5{`P3W^i2>)(~Z!!U1m zP_TH?kRp$MHmp_iO*Ku`IK0Bx!7!y_s>39ee9oFFiVh(zO+Qtfv&JK0fz6|OXj8Sd zsHs|NclbBMj1ya&%u1owB=$SyI6KKvWEtv(wyyum@V@g_wW=xk(*Bw(@u{;}tFe{b z^p?{X-CWGfO)<*F%SoOh;i5y;9uh3)upBQgatTyeDotF(EDN$%OqTJfm6i^|g0nb~k({K|c#*zX?4tQ13sMN5l^4QCXW z*NP<`2?nRutjgCUTsdiDn(L&y9!5sTS9G7zB4t!r`oXi=#LCr{YDWD|spjQLsOlbO zR{S;)6UT7vsnJt zRQAp+>uTxQTXPugW|@gxaB+IPo49&_PUYKP}Y`LGv8iO>1o`T%%~7r0!J=H z4%E;M*Dl65loraauHP;-$|mT@YPfGNf%KPzvkLb7nmZX{esa3EKaHVqq{otQ$F-r$ d{ubn-STr_Qd0y&BmNbkY7ESfUf7#SE{{dW0I-~#q delta 2737 zcmZuzX;c(v7Jb!S)l2n;$R=yCi3qZUhGCH?JMLo8Aqt~|7}Thv8BmNU$*2Rk=ad=~ z(YS!i*r=gE!Jq>jpuxCcfT#yh#wBW^CdSEVRAg?;oH_Gje$=^D-}1iu?z`{nZY^W> zlrh^}iw+XW`iVv*6UlRd^MNaX8-SkzO++l_4cSCoFj3GIU<^^PJ8%}(6c3`$b0Wnr zL_=DLly1O#z$hYH6|jLwe}+hFAsX(CrxWAji2Sgw$aXnitP3v^C9NYeYKX>{;2UD6byG z;czK3_$meHaKJUUr>?-C`IuvkpV6MsF50Bx@gRpf(u8(AVZZlDUN#=X^7EySr zESb-P60>BPHpti*D%;bk#`-0))0;pnyk2&0+!i96dRa#r;tEPxZyP)lxmd1=Dr^ipEpPH$ z1LHoHU$%Wl#B7m2&#!>M0c_HPFA*<_opV?Mv0`??I1CS2$gaHgHj&p&wlEt+l^k2l zJ|&87VvBZ-tA~qcuy4>NV-Ouu2hmH#mX*WVq2BC)J2}8C)^vFXk*_CP{eC%7vcT49 zttB(C-+bSV@%8LCKRhNHI-I>VrW&SIa(o0zk&wgbHZFs*E?k1%7o{D`Wz0dTqGuFw zx%@ep=q0z%2N@WTa|^9zU(+aRz|`O~xm=>Oz#%3rSygJjvt zXFot9d5`jC3@#7%2dV`BCbY{X)p$9W+dNgxd-M`g*Qhq}mdxvllA!uW_~jJ7Y%? z0(vgdE}m>5;`az3X{$a#8w#tmZTlcu*aq!|ZeVDSwz~zy*iN0I!UqR-=z`s@ zB7rHosQyy)^A2655%WGNy3;FwvES;Nybi&{UAm@t;7FD3{AhSV6RYdYKzllHdi$cI z6_{w$I~OB!yOnyc=LwLgS0CAjn<~s-KVcK3vpb_-7M}z+JLyYz;~oeY(C@i77M}Qv z{%_?tC~AoQ?7!dz_mlcdW82~OTL#t7xItC%2D>=4cQj*g`2ICfgwc?C2l0$o4NG$G zLLrSIaND)@sQm|q&*m+GRL>26U;2tD?!2M*{$5Bv+0d7K9N#Vr;GEl1v~q~d#krxC zgew!J^twh8&L!4UeaUx`Bv{th`ie``EiTTMZPIlTDi<||S`snNcI8>uwOpv4BfiUb z46!jSZB-3u8!B5}Ng!Ve6~}0d-czf7Gxu4>l2Gqd-DB<{p?P&BHMf%>UAJU(d)9^$dzd5aIVM(uzH8UYT* zBZ!RNMNHAfTIb#T{lycyWb5lQT_LAxu5GTCKGb(I%uaENP3mB*JvKo$|I4T9$L2)o zrp<2*V-&C3dNYCIfNie&&E7_#y;od0bOXmWC!XFV@^;=F+fsP`tQcYE&0G*?+PT|W zKk-XsQ?;Fh7N5ETOm46nAywPOFiORL2AV#O4P;Yvm8 ztFBVBlk|auo>8kv_$tz}ZGaI)$LSjF#mvS{By=UVY?mH6Ix%c>dwYYV9+t*vcuJs& zltghfO`PqV<+0APtueAIlLXV*+RWzElht*FBz!mBQqYxQ?y2<=uQ~_vZKdX(>L;~X z1J2@OA%y?0g3HAOml#Hn*0^{uGE1WPg=?I~=3-{$tHEf}BUe4cv8KM`YDwYVW?(O6 z)D=n{qy8voSScpdTgIsxeJ*8)^TL7|g|s_ND`QP(O?~3A@NV&NxK0uy6pXFa6ILpw zedd~~*5ec3)N(0n`l!Jqc|^`+xGk2vR#sdS<$xp`UB#VI9%^J`Rmrkmtc|+DS|f;? zqXXW&NcGV_GL9iuzgV`xD|vP6;5a|4=g3bKV!g$#(b1zK{{K8yrqBY)qg2YLY^xL7 z%S|MO#GaAqwC3{mMYTB)y|v}2q#1jN@f$&lX(`RezcQgYvFZYLzmJh%nqLcojhm$= z5;`-@J<^T16EYaAHcR{@ae|9LZ;{bTA7!vN_gY3 Enter new tethering password - 새 테더링 비밀번호 입력 + 새 테더링 비밀번호를 입력하세요 @@ -70,7 +70,7 @@ leave blank for automatic configuration - 자동 구성을 위해 비워둠 + 자동설정을 하려면 공백으로 두세요 @@ -92,7 +92,7 @@ You must accept the Terms and Conditions in order to use openpilot. - 당신은 반드시 약관에 동의해야만 openpilot을 사용할 수 있습니다. + openpilot을 사용하려면 이용 약관에 동의해야 합니다. @@ -102,7 +102,7 @@ Decline, uninstall %1 - 거절,삭제 %1 + 거절, %1 제거 @@ -135,7 +135,7 @@ Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off) - 운전자 카메라를 미리 보면서 최적의 운전자 모니터링 경험을 위해 기기 장착 위치를 최적화할수 있습니다. (차량은 반드시 닫아야 합니다) + 운전자 카메라를 미리 보면서 최적의 운전자 모니터링 경험을 위해 장치의 장착 위치를 최적화할수 있습니다. (차량연결은 해제되어있어야 합니다) @@ -150,7 +150,7 @@ Are you sure you want to reset calibration? - 캘리브레이션을 재설정하시겠습니까? + 캘리브레이션을 재설정하시겠습니까? @@ -165,12 +165,12 @@ Review the rules, features, and limitations of openpilot - openpilot의 규칙, 기능, 제한 다시보기 + openpilot의 규칙, 기능 및 제한 다시보기 Are you sure you want to review the training guide? - 트레이닝 가이드를 다시보시겠습니까? + 트레이닝 가이드를 다시보시겠습니까? @@ -185,7 +185,7 @@ Change Language - 언어변경 + 언어 변경 @@ -195,7 +195,7 @@ Select a language - 언어선택 + 언어를 선택하세요 @@ -210,37 +210,37 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot은 장치를 왼쪽 또는 오른쪽 4° 이내, 위쪽 5° 또는 아래쪽 8° 이내로 설치해야 합니다. openpilot은 지속적으로 보정되므로 리셋이 거의 필요하지 않습니다. + openpilot은 장치를 좌측 또는 우측은 4° 이내, 위쪽 5° 또는 아래쪽은 8° 이내로 설치해야 합니다. openpilot은 지속적으로 보정되므로 리셋이 거의 필요하지 않습니다. Your device is pointed %1° %2 and %3° %4. - 사용자의 기기가 %1° %2 및 %3° %4를 가리키고 있습니다. + 사용자의 장치가 %1° %2 및 %3° %4를 가리키고 있습니다. down - 아래 + 아래로 up - + 위로 left - 왼쪽 + 좌측으로 right - 오른쪽 + 우측으로 Are you sure you want to reboot? - 재부팅 하시겠습니까? + 재부팅 하시겠습니까? @@ -250,7 +250,7 @@ Are you sure you want to power off? - 전원을 종료하시겠습니까? + 전원을 종료하시겠습니까? @@ -263,7 +263,7 @@ Drives - 주행수 + 주행 @@ -273,7 +273,7 @@ ALL TIME - 전체 시간 + 전체 @@ -309,12 +309,12 @@ Need at least - 최소 필요 + 최소 characters! - 문자! + 자가 필요합니다! @@ -345,7 +345,7 @@ eta - 에타 + 도착 @@ -401,7 +401,7 @@ CLEAR - CLEAR + 삭제 @@ -411,14 +411,14 @@ Try the Navigation Beta - 네비게이션(베타)을 사용해보세요 + 네비게이션(베타)를 사용해보세요 - Get turn-by-turn directions displayed and more with a comma + Get turn-by-turn directions displayed and more with a comma prime subscription. Sign up now: https://connect.comma.ai - 자세한 경로안내를 확인하시려면 comma prime을 구독하세요. -즉시등록:https://connect.comma.ai + 자세한 경로안내를 원하시면 comma prime을 구독하세요. +등록:https://connect.comma.ai @@ -437,7 +437,7 @@ location set no recent destinations - 최근 경로 없음 + 최근 목적지 없음 @@ -471,7 +471,7 @@ location set Advanced - 고급 + 고급 설정 @@ -775,12 +775,12 @@ location set Getting Started - 시작 + 설정 시작 Before we get on the road, let’s finish installation and cover some details. - 출발하기 전에 설치를 완료하고 몇 가지 세부 사항을 살펴보겠습니다. + 출발하기 전에 설정을 완료하고 몇 가지 세부 사항을 살펴보겠습니다. @@ -859,7 +859,7 @@ location set Finish Setup - 설치완료 + 설정 완료 @@ -869,7 +869,7 @@ location set Pair device - 페어링 + 장치 페어링 @@ -911,12 +911,12 @@ location set GOOD - 경고 + 좋음 OK - 좋음 + 경고 @@ -1009,7 +1009,7 @@ location set The last time openpilot successfully checked for an update. The updater only runs while the car is off. - 이전에 openpilot에서 업데이트를 성공적으로 확인한 시간입니다. 업데이트 프로그램은 차량 연결이 해제되었을때만 작동합니다. + 최근에 openpilot이 업데이트를 성공적으로 확인했습니다. 업데이트 프로그램은 차량 연결이 해제되었을때만 작동합니다. @@ -1019,22 +1019,22 @@ location set CHECKING - 검사중 + 확인중 Uninstall - 삭제 + 제거 UNINSTALL - 삭제 + 제거 Are you sure you want to uninstall? - 삭제하시겠습니까? + 제거하시겠습니까? @@ -1084,7 +1084,7 @@ location set Username '%1' has no keys on GitHub - 사용자 이름 '%1' GitHub에 키가 없습니다 + '%1'의 키가 GitHub에 없습니다 @@ -1094,7 +1094,7 @@ location set Username '%1' doesn't exist on GitHub - 사용자 이름 '%1' GitHub에 없습니다 + '%1'은 GitHub에 없습니다 @@ -1120,7 +1120,7 @@ location set Scroll to accept - 스크롤 허용 + 허용하려면 아래로 스크롤하세요 @@ -1168,12 +1168,12 @@ location set Display speed in km/h instead of mph. - mph가 아닌 km/h로 속도 표시. + mph 대신 km/h로 속도를 표시합니다. Record and Upload Driver Camera - 운전자 카메라 기록 및 업로드 + 운전자 카메라 녹화 및 업로드 @@ -1193,7 +1193,7 @@ location set Show ETA in 24h format - 24시간 형식으로 ETA 표시 + 24시간 형식으로 도착예정시간 표시 @@ -1275,7 +1275,7 @@ location set Forget Wi-Fi Network " - wifi 네트워크 저장안함" + wifi 네트워크 저장안함 " diff --git a/selfdrive/ui/translations/main_zh-CHS.qm b/selfdrive/ui/translations/main_zh-CHS.qm index 63c17d76b7f0f99e5180d400a8143d17cbbdde55..45fae52b4286bb3e57938bf6c7c4ad53d3bd3ba1 100644 GIT binary patch delta 1686 zcmX9;2~1R16g@NZ|15uI{(uZ%Q3M8%MP#XfvdNZ$pal^W<5G=6QL8q#S|l!`ts9~U z!Ch1ka4EGWxYm6^EGW2PG$j~R5H(t;HI-<<9>XM)lmGsI_nmvrxv#NEajQsC2XL?@uH||?FuxqI`2qN`kN6%~{P}%x@f(+*dl1&|0Y<-tu(KUd zNDyj+xoH}N#xuk!2)6~mWgx_juB3CPBue3E&4FfEGoXKhKoe0aLt_0hV0Z-*Uz`Mj zS7MBA7GT?eKD6^Gn#I7UQ4rH2Zc;Sn-bEHz7lLjq4MUF>5tXS%FE1 zDgj+CCMRtr)o@HXyc~!gkLg#~j&-;@7Gzmi-~^WTvVd_m${U)1m=UO1{0-ofgIc>( zU`Pu(HZI}&8ihlcAKs#;-~~lUA=M9xR;1PW0G_^z-4D1P=AmfH5Lnl$c%-ZV zoD&rwxz)rDw-eSP}F|nIJ7Dvop$RHtaa?wQ_H>jvGppr#F$M1FpH;P9D@*Pw2U+h4GY=gngLYwV5(Tyi7V@5s23%hV%V&|1 zI!{ zOFctys~@8s#1FkB7!agZx@9n3x7Bi&KNT!eN4`v;f`6$KYc2rctJPB#)ZSB2SM>A& zZkg)y{=2MXzDoTe^#Ristg-k|GVfGPmD4Zmut{@l;WHALr0JS)fD&%fynjVyRA)6G zBRXmJ0ByWaEoZ(}o2(*X(>ZPSn~x;ALc4j%ZeVbsc7HYN*zMGw>~QCEx=v%9!4S>S zxtD4=F5`5uZ%eubv-P%a>NH9_G+vig$NBR1(iMWK!hT(IOA1p|u4}dZo)<^86gw<{ z9m!JGokn(;DCNI&=2XujMzOPUsi4!u=Q?R?A1(EKEbTmB!E~CX(nk|%O^>v%kru0Z zrK20RvLU5(Hc(^+f~%yfIov1;Qmr(E*T)s9)*+IF9!M`{FQ!zUdc~=glr~rIe)&2H zIp`A}=K}+L_0ym7B5+@!Uvys}@qGR2pUm98Wc$BvpEN0{B zTw++BvDR{s)~6e5;|?+dUO~o&NO~{LHa1V@IGWeV_D8C?-XlA$rvi4avZW^;2vN(U z+IRy6bjxEmQ9`?^@}jt}7+ya)e-8)T2lC#|7-nId{A(o-3W<>~{KpIoZjqZ}?l9aD zCT%ybMopc`9LsSIwJ|w7x9{Uk(`Xvg&VoVPO$&26=-t8+qsGzUw5j#QKJxA|wI%!x bL|Wzou>+2WYf1+wmXtjFBI3B6Q@H>CHZ-~4 delta 1659 zcmX9;dsK{R9Dcr;@0)3E-_UK=CDnAN`=(W-(rzRqk}T~yNU_*sH`2Nc8yj+|ovd3( zigjt7le^>6u0)|YSe=bsBIK}ImlaO!KF-WP&zblA-rxKDp6B_!mkWg}g+ifcY$~A4 z1o|!@<`B0KHxf?)VkaO615yys?>TWG;2%z$$Zs-iXx>tk;UgR-E5_oj|v5fN#5qZ-DF%`#%;va}Bu;F@GyC_$9c?jC}TL~SXC)-41A$}#lu5g^Qh zVVWsG_j(Ku-+⋘WIj-X^$kEw7^t%hQvarE6yaW z1B}ZR*OOVePk`c19c>IetGHY0#DYteVxS3dOi{W#m3Z#4(p(Tt1(THXl3DkYiOT&l ziTfLsRYym&PKWYj70(6dDQkR|Sg$F1S+0wd_Z%XFR&hoG1@0Cm=C%w5+}gxNQ^-h_ zE9Q$Yf$)psrUZsd8D>MH*@lkQHgxk8OUgUQELtpkFpX#t4>WE7%;&_zUzJnREb)Y% z-WcwPmmW3)9`53$Cx6p}?(Jer^kL@BB5A{^dDIKZP%sx5&?v>pUZkETrA?+M;gh9I z?HNF?k!E^UQ1dy`%*s79x0J{%+WAVk(>V?Pd!>b8GB0>775qdZntB_$M%mD9whg2A zNhSTt>49UrRI;9_&}B&FKdb;u_R_%%cd3z^^jjx2SFD%LxnERr-Jrmer)>_^FbN2@D(=CQ*@^}#v!Ng!4Id`uZ7T&sTF)B~{ZtA6u@ z3Mo&j-w%95(;e*M{AxJ+e_AU=(}eYQJNEOm!)Ci9tsX${6ph;OC8IM#<56PAAsMNO zeZiMQuGEZ6d_dj(HK}>jE9R>AG%B(JuDPfp) zRhtV3c`7lA&6H^i9vS)ng0{GeE_(f?-E?Xf1L>qKX&Og2-fFjBp{vSHZRN^h-lEi= z43@}Zw{@{(viz=nJT;qAca_RXieS91(i|Vc)J|Laad+QU2u(!x+ zed-3*b1l@*9!1s`X}o^pyYZZtMtxNg=cdn2eO)QV2p*%q+)NDY(l^(Vn7GcMs_^86 ziH0DTTO<-;i0E9!`8#W<4CB7p$#5)(81bE<#=M)Bjy2Q_A^LIczM?Nq~!G)|dg zzU;KOg6nVPp844fpM$$>?uY~WtK|WA`LYE4BPXt*P7aggxkElzt1p?>yel7TS$><9`7LdCUM}9S%jROYDXD)>}OW M3T}t&dqxKS50wtHa{vGU diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 9ac35994e6..04bd2415f0 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -415,7 +415,7 @@ - Get turn-by-turn directions displayed and more with a comma + Get turn-by-turn directions displayed and more with a comma prime subscription. Sign up now: https://connect.comma.ai 订阅comma prime以获取导航。 立即注册:https://connect.comma.ai diff --git a/selfdrive/ui/translations/main_zh-CHT.qm b/selfdrive/ui/translations/main_zh-CHT.qm index 208f29c0ec9dd45424301c70cdaf64c2e9a901bc..130bcfc92670cff84c6c6fcf359be599e4941e3e 100644 GIT binary patch delta 1686 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 Ij_WM{0lCk!tN;K2 diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 2920916ece..806dd54ad3 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -415,16 +415,11 @@ - Get turn-by-turn directions displayed and more with a comma + Get turn-by-turn directions displayed and more with a comma prime subscription. Sign up now: https://connect.comma.ai 成為 comma 高級會員來使用導航功能 立即註冊:https://connect.comma.ai - - Get turn-by-turn directions displayed and more with a comma -prime subscription. Sign up now: https://connect.comma.ai - 成為 comma 高級會員來使用導航功能,立即註冊:https://connect.comma.ai - No home From 2ae52e9b2218c23d4c80b36fb0b50387b6ecdd8f Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Jul 2022 17:20:56 -0700 Subject: [PATCH 03/47] process replay: ensure enabled for significant amount of time (#25121) * process replay: ensure enabled for significant amount of time * update refs * 10s is reasonable --- selfdrive/controls/controlsd.py | 3 ++- selfdrive/test/process_replay/process_replay.py | 11 +++++++++-- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/test/process_replay/test_processes.py | 16 ++++++++-------- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 117509f1e6..b344705f9d 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -406,7 +406,8 @@ class Controls: if not self.initialized: all_valid = CS.canValid and self.sm.all_checks() - if all_valid or self.sm.frame * DT_CTRL > 3.5 or SIMULATION: + timed_out = self.sm.frame * DT_CTRL > (6. if REPLAY else 3.5) + if all_valid or timed_out or SIMULATION: if not self.read_only: self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) self.initialized = True diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index c667aa3887..bea7dc46ee 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -14,6 +14,7 @@ from cereal import car, log from cereal.services import service_list from common.params import Params from common.timeout import Timeout +from common.realtime import DT_CTRL from panda.python import ALTERNATIVE_EXPERIENCE from selfdrive.car.car_helpers import get_car, interfaces from selfdrive.test.process_replay.helpers import OpenpilotPrefix @@ -548,11 +549,17 @@ def cpp_replay_process(cfg, lr, fingerprint=None): def check_enabled(msgs): + cur_enabled_count = 0 + max_enabled_count = 0 for msg in msgs: if msg.which() == "carParams": if msg.carParams.notCar: return True elif msg.which() == "controlsState": if msg.controlsState.active: - return True - return False + cur_enabled_count += 1 + else: + cur_enabled_count = 0 + max_enabled_count = max(max_enabled_count, cur_enabled_count) + + return max_enabled_count > int(10. / DT_CTRL) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index fc5f83c32a..bef6956ec3 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -d583bbd9643000e7f817171c583d31ae3141a652 \ No newline at end of file +998b457e0d38e3639814ed81cb2d32e92d9bed8c \ No newline at end of file diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 652c49db3d..91cc40f5ce 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -18,14 +18,14 @@ from tools.lib.logreader import LogReader original_segments = [ ("BODY", "937ccb7243511b65|2022-05-24--16-03-09--1"), # COMMA.BODY ("HYUNDAI", "02c45f73a2e5c6e9|2021-01-01--19-08-22--1"), # HYUNDAI.SONATA - ("HYUNDAI", "d824e27e8c60172c|2022-07-08--21-21-15--1"), # HYUNDAI.KIA_EV6 + ("HYUNDAI", "d824e27e8c60172c|2022-07-08--21-21-15--0"), # HYUNDAI.KIA_EV6 ("TOYOTA", "0982d79ebb0de295|2021-01-04--17-13-21--13"), # TOYOTA.PRIUS (INDI) ("TOYOTA2", "0982d79ebb0de295|2021-01-03--20-03-36--6"), # TOYOTA.RAV4 (LQR) ("TOYOTA3", "f7d7e3538cda1a2a|2021-08-16--08-55-34--6"), # TOYOTA.COROLLA_TSS2 ("HONDA", "eb140f119469d9ab|2021-06-12--10-46-24--27"), # HONDA.CIVIC (NIDEC) ("HONDA2", "7d2244f34d1bbcda|2021-06-25--12-25-37--26"), # HONDA.ACCORD (BOSCH) ("CHRYSLER", "4deb27de11bee626|2021-02-20--11-28-55--8"), # CHRYSLER.PACIFICA - ("RAM", "2f4452b03ccb98f0|2022-07-07--08-01-56--2"), # CHRYSLER.RAM_1500 + ("RAM", "2f4452b03ccb98f0|2022-07-07--08-01-56--3"), # CHRYSLER.RAM_1500 ("SUBARU", "4d70bc5e608678be|2021-01-15--17-02-04--5"), # SUBARU.IMPREZA ("GM", "0c58b6a25109da2b|2021-02-23--16-35-50--11"), # GM.VOLT ("NISSAN", "35336926920f3571|2021-02-12--18-38-48--46"), # NISSAN.XTRAIL @@ -39,13 +39,14 @@ original_segments = [ segments = [ ("BODY", "regen660D86654BA|2022-07-06--14-27-15--0"), ("HYUNDAI", "regen657E25856BB|2022-07-06--14-26-51--0"), + ("HYUNDAI", "d824e27e8c60172c|2022-07-08--21-21-15--0"), ("TOYOTA", "regenBA97410FBEC|2022-07-06--14-26-49--0"), ("TOYOTA2", "regenDEDB1D9C991|2022-07-06--14-54-08--0"), ("TOYOTA3", "regenDDC1FE60734|2022-07-06--14-32-06--0"), ("HONDA", "regen17B09D158B8|2022-07-06--14-31-46--0"), ("HONDA2", "regen041739C3E9A|2022-07-06--15-08-02--0"), ("CHRYSLER", "regenBB2F9C1425C|2022-07-06--14-31-41--0"), - ("RAM", "2f4452b03ccb98f0|2022-07-07--08-01-56--2"), + ("RAM", "2f4452b03ccb98f0|2022-07-07--08-01-56--3"), ("SUBARU", "regen732B69F33B1|2022-07-06--14-36-18--0"), ("GM", "regen01D09D915B5|2022-07-06--14-36-20--0"), ("NISSAN", "regenEA6FB2773F5|2022-07-06--14-58-23--0"), @@ -65,7 +66,7 @@ def run_test_process(data): res = None if not args.upload_only: lr = LogReader.from_bytes(lr_dat) - res, log_msgs = test_process(cfg, lr, ref_log_path, args.ignore_fields, args.ignore_msgs) + res, log_msgs = test_process(cfg, lr, ref_log_path, cur_log_fn, args.ignore_fields, args.ignore_msgs) # save logs so we can upload when updating refs save_log(cur_log_fn, log_msgs) @@ -83,7 +84,7 @@ def get_log_data(segment): return (segment, f.read()) -def test_process(cfg, lr, ref_log_path, ignore_fields=None, ignore_msgs=None): +def test_process(cfg, lr, ref_log_path, new_log_path, ignore_fields=None, ignore_msgs=None): if ignore_fields is None: ignore_fields = [] if ignore_msgs is None: @@ -96,7 +97,7 @@ def test_process(cfg, lr, ref_log_path, ignore_fields=None, ignore_msgs=None): # check to make sure openpilot is engaged in the route if cfg.proc_name == "controlsd": if not check_enabled(log_msgs): - raise Exception(f"Route never enabled: {ref_log_path}") + return f"Route did not enable at all or for long enough: {new_log_path}", log_msgs try: return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance), log_msgs @@ -216,8 +217,7 @@ if __name__ == "__main__": results: Any = defaultdict(dict) p2 = pool.map(run_test_process, pool_args) for (segment, proc, subtest_name, result) in tqdm(p2, desc="Running Tests", total=len(pool_args)): - if isinstance(result, list): - results[segment][proc + subtest_name] = result + results[segment][proc + subtest_name] = result diff1, diff2, failed = format_diff(results, ref_commit) if not upload: From 29c8e5d227eacae36dbc4357bf5328f22668d5ef Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Jul 2022 17:26:59 -0700 Subject: [PATCH 04/47] Chrysler: increase Ram torque rate limit --- selfdrive/car/chrysler/values.py | 4 ++-- selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index f7531792fb..69dade4b64 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -31,8 +31,8 @@ class CarControllerParams: self.STEER_ERROR_MAX = 80 if CP.carFingerprint in RAM_CARS: - self.STEER_DELTA_UP = 5 - self.STEER_DELTA_DOWN = 5 + self.STEER_DELTA_UP = 6 + self.STEER_DELTA_DOWN = 6 else: self.STEER_DELTA_UP = 3 self.STEER_DELTA_DOWN = 3 diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index bef6956ec3..d98ae96516 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -998b457e0d38e3639814ed81cb2d32e92d9bed8c \ No newline at end of file +2ae52e9b2218c23d4c80b36fb0b50387b6ecdd8f \ No newline at end of file From 045c881e1ffeb5e7bcb8e1ee78d4a42caee1be4d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Jul 2022 21:11:12 -0700 Subject: [PATCH 05/47] couple more stinger MYs supported --- docs/CARS.md | 2 +- selfdrive/car/hyundai/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index eb570faa7e..5e185ed278 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -105,7 +105,7 @@ How We Rate The Cars |Kia|Seltos 2021|SCC + LKAS|||||| |Kia|Sorento 2018|SCC + LKAS|||||| |Kia|Sorento 2019|SCC + LKAS|||||| -|Kia|Stinger 2018|SCC + LKAS|||||| +|Kia|Stinger 2018-20|SCC + LKAS|||||| |Lexus|CT Hybrid 2017-18|LSS|[3](#footnotes)||||| |Lexus|ES Hybrid 2017-18|LSS|[3](#footnotes)||||| |Lexus|NX 2018-19|All|[3](#footnotes)||||| diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 4b3acf3f27..2e6a2017ea 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -151,7 +151,7 @@ CAR_INFO: Dict[str, Optional[Union[HyundaiCarInfo, List[HyundaiCarInfo]]]] = { HyundaiCarInfo("Kia Sorento 2018", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", harness=Harness.hyundai_c), HyundaiCarInfo("Kia Sorento 2019", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", harness=Harness.hyundai_e), ], - CAR.KIA_STINGER: HyundaiCarInfo("Kia Stinger 2018", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", harness=Harness.hyundai_c), + CAR.KIA_STINGER: HyundaiCarInfo("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", harness=Harness.hyundai_c), CAR.KIA_CEED: HyundaiCarInfo("Kia Ceed 2019", harness=Harness.hyundai_e), CAR.KIA_EV6: HyundaiCarInfo("Kia EV6 2022", "All", harness=Harness.hyundai_p), From 614b3a01f89eabfa9ea26ed2a367592939f78e11 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Jul 2022 22:10:06 -0700 Subject: [PATCH 06/47] Chrysler: limit buttons to 20Hz (#25125) * Chrysler: limit buttons to 10Hz * cleanup * 20hz --- selfdrive/car/chrysler/carcontroller.py | 20 +++++++++++++++----- selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index a7f2d007f1..8156e7841e 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -1,4 +1,5 @@ from opendbc.can.packer import CANPacker +from common.realtime import DT_CTRL from selfdrive.car import apply_toyota_steer_torque_limits from selfdrive.car.chrysler.chryslercan import create_lkas_hud, create_lkas_command, create_cruise_buttons from selfdrive.car.chrysler.values import RAM_CARS, CarControllerParams @@ -14,6 +15,7 @@ class CarController: self.hud_count = 0 self.last_lkas_falling_edge = 0 self.lkas_active_prev = False + self.last_button_frame = 0 self.packer = CANPacker(dbc_name) self.params = CarControllerParams(CP) @@ -26,11 +28,19 @@ class CarController: # *** control msgs *** - das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0 - if CC.cruiseControl.cancel: - can_sends.append(create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, cancel=True)) - elif CC.enabled and CS.out.cruiseState.standstill: - can_sends.append(create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, resume=True)) + # cruise buttons + if (self.frame - self.last_button_frame)*DT_CTRL > 0.05: + das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0 + + # ACC cancellation + if CC.cruiseControl.cancel: + self.last_button_frame = self.frame + can_sends.append(create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, cancel=True)) + + # ACC resume from standstill + elif CC.cruiseControl.resume: + self.last_button_frame = self.frame + can_sends.append(create_cruise_buttons(self.packer, CS.button_counter + 1, das_bus, resume=True)) # HUD alerts if self.frame % 25 == 0: diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index d98ae96516..b165b163ba 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -2ae52e9b2218c23d4c80b36fb0b50387b6ecdd8f \ No newline at end of file +11e721366f1c177a84e6cb8b48171113ac3b54f9 \ No newline at end of file From 4d7b7483d70a61cf0fb938107df55c24f27da1b0 Mon Sep 17 00:00:00 2001 From: Gijs Koning Date: Tue, 12 Jul 2022 12:36:57 +0200 Subject: [PATCH 07/47] Replay: tolerances per field (#25116) * tolerances per field in replay * refactor * Remove laikad parameters * Small comment change --- selfdrive/test/process_replay/compare_logs.py | 22 ++++++++++++++++--- .../test/process_replay/process_replay.py | 2 +- .../test/process_replay/test_processes.py | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/selfdrive/test/process_replay/compare_logs.py b/selfdrive/test/process_replay/compare_logs.py index 057e46cd9c..bf6daf5fed 100755 --- a/selfdrive/test/process_replay/compare_logs.py +++ b/selfdrive/test/process_replay/compare_logs.py @@ -46,11 +46,25 @@ def remove_ignored_fields(msg, ignore): return msg.as_reader() -def compare_logs(log1, log2, ignore_fields=None, ignore_msgs=None, tolerance=None): +def get_field_tolerance(diff_field, field_tolerances): + diff_field_str = diff_field[0] + for s in diff_field[1:]: + # loop until number in field + if not isinstance(s, str): + break + diff_field_str += '.'+s + if diff_field_str in field_tolerances: + return field_tolerances[diff_field_str] + + +def compare_logs(log1, log2, ignore_fields=None, ignore_msgs=None, tolerance=None, field_tolerances=None): if ignore_fields is None: ignore_fields = [] if ignore_msgs is None: ignore_msgs = [] + if field_tolerances is None: + field_tolerances = {} + default_tolerance = EPSILON if tolerance is None else tolerance log1, log2 = (list(filter(lambda m: m.which() not in ignore_msgs, log)) for log in (log1, log2)) @@ -72,7 +86,6 @@ def compare_logs(log1, log2, ignore_fields=None, ignore_msgs=None, tolerance=Non msg1_dict = msg1.to_dict(verbose=True) msg2_dict = msg2.to_dict(verbose=True) - tolerance = EPSILON if tolerance is None else tolerance dd = dictdiffer.diff(msg1_dict, msg2_dict, ignore=ignore_fields) # Dictdiffer only supports relative tolerance, we also want to check for absolute @@ -80,10 +93,13 @@ def compare_logs(log1, log2, ignore_fields=None, ignore_msgs=None, tolerance=Non def outside_tolerance(diff): try: if diff[0] == "change": + field_tolerance = default_tolerance + if (tol := get_field_tolerance(diff[1], field_tolerances)) is not None: + field_tolerance = tol a, b = diff[2] finite = math.isfinite(a) and math.isfinite(b) if finite and isinstance(a, numbers.Number) and isinstance(b, numbers.Number): - return abs(a - b) > max(tolerance, tolerance * max(abs(a), abs(b))) + return abs(a - b) > max(field_tolerance, field_tolerance * max(abs(a), abs(b))) except TypeError: pass return True diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index bea7dc46ee..0c642cde17 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -28,7 +28,7 @@ TIMEOUT = 15 PROC_REPLAY_DIR = os.path.dirname(os.path.abspath(__file__)) FAKEDATA = os.path.join(PROC_REPLAY_DIR, "fakedata/") -ProcessConfig = namedtuple('ProcessConfig', ['proc_name', 'pub_sub', 'ignore', 'init_callback', 'should_recv_callback', 'tolerance', 'fake_pubsubmaster', 'submaster_config', 'environ', 'subtest_name'], defaults=({}, {}, "")) +ProcessConfig = namedtuple('ProcessConfig', ['proc_name', 'pub_sub', 'ignore', 'init_callback', 'should_recv_callback', 'tolerance', 'fake_pubsubmaster', 'submaster_config', 'environ', 'subtest_name', "field_tolerances"], defaults=({}, {}, "", {})) def wait_for_event(evt): diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 91cc40f5ce..d8cd1fd57a 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -100,7 +100,7 @@ def test_process(cfg, lr, ref_log_path, new_log_path, ignore_fields=None, ignore return f"Route did not enable at all or for long enough: {new_log_path}", log_msgs try: - return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance), log_msgs + return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance, cfg.field_tolerances), log_msgs except Exception as e: return str(e), log_msgs From f0b5ff5c1addff7932fe86a2874a23d87b5eb5f3 Mon Sep 17 00:00:00 2001 From: Gijs Koning Date: Tue, 12 Jul 2022 14:03:35 +0200 Subject: [PATCH 08/47] Replay: Fix --upload-only (#25127) Add checking for list back --- selfdrive/test/process_replay/test_processes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index d8cd1fd57a..77d73a4ff4 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -217,7 +217,8 @@ if __name__ == "__main__": results: Any = defaultdict(dict) p2 = pool.map(run_test_process, pool_args) for (segment, proc, subtest_name, result) in tqdm(p2, desc="Running Tests", total=len(pool_args)): - results[segment][proc + subtest_name] = result + if isinstance(result, list): + results[segment][proc + subtest_name] = result diff1, diff2, failed = format_diff(results, ref_commit) if not upload: From 205f6f7414f502248082949addac25a215c73d59 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Tue, 12 Jul 2022 16:09:21 +0200 Subject: [PATCH 09/47] casync: manifest compare script (#25129) * casync compare script * typo * cleanup output --- .../tici/tests/compare_casync_manifest.py | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100755 system/hardware/tici/tests/compare_casync_manifest.py diff --git a/system/hardware/tici/tests/compare_casync_manifest.py b/system/hardware/tici/tests/compare_casync_manifest.py new file mode 100755 index 0000000000..5e5fa24556 --- /dev/null +++ b/system/hardware/tici/tests/compare_casync_manifest.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import argparse +import collections +import multiprocessing +import os +from typing import Dict, List + +import requests +from tqdm import tqdm + +import system.hardware.tici.casync as casync + + +def get_chunk_download_size(chunk): + sha = chunk.sha.hex() + path = os.path.join(remote_url, sha[:4], sha + ".cacnk") + if os.path.isfile(path): + return os.path.getsize(path) + else: + r = requests.head(path) + r.raise_for_status() + return int(r.headers['content-length']) + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description='Compute overlap between two casync manifests') + parser.add_argument('frm') + parser.add_argument('to') + args = parser.parse_args() + + frm = casync.parse_caibx(args.frm) + to = casync.parse_caibx(args.to) + remote_url = args.to.replace('.caibx', '') + + most_common = collections.Counter(t.sha for t in to).most_common(1)[0][0] + + frm_dict = casync.build_chunk_dict(frm) + + # Get content-length for each chunk + with multiprocessing.Pool() as pool: + szs = list(tqdm(pool.imap(get_chunk_download_size, to), total=len(to))) + chunk_sizes = {t.sha: sz for (t, sz) in zip(to, szs)} + + sources: Dict[str, List[int]] = { + 'seed': [], + 'remote_uncompressed': [], + 'remote_compressed': [], + } + + for chunk in to: + # Assume most common chunk is the zero chunk + if chunk.sha == most_common: + continue + + if chunk.sha in frm_dict: + sources['seed'].append(chunk.length) + else: + sources['remote_uncompressed'].append(chunk.length) + sources['remote_compressed'].append(chunk_sizes[chunk.sha]) + + print() + print("Update statistics (excluding zeros)") + print() + print("Download only with no seed:") + print(f" Remote (uncompressed)\t\t{sum(sources['seed'] + sources['remote_uncompressed']) / 1000 / 1000:.2f} MB\tn = {len(to)}") + print(f" Remote (compressed download)\t{sum(chunk_sizes.values()) / 1000 / 1000:.2f} MB\tn = {len(to)}") + print() + print("Upgrade with seed partition:") + print(f" Seed (uncompressed)\t\t{sum(sources['seed']) / 1000 / 1000:.2f} MB\t\t\t\tn = {len(sources['seed'])}") + sz, n = sum(sources['remote_uncompressed']), len(sources['remote_uncompressed']) + print(f" Remote (uncompressed)\t\t{sz / 1000 / 1000:.2f} MB\t(avg {sz / 1000 / 1000 / n:4f} MB)\tn = {n}") + sz, n = sum(sources['remote_compressed']), len(sources['remote_compressed']) + print(f" Remote (compressed download)\t{sz / 1000 / 1000:.2f} MB\t(avg {sz / 1000 / 1000 / n:4f} MB)\tn = {n}") From 105afee4a21ad008fa741f19c5a62a6d52fdd773 Mon Sep 17 00:00:00 2001 From: Gijs Koning Date: Tue, 12 Jul 2022 18:11:47 +0200 Subject: [PATCH 10/47] Laikad: set cache dir to comma_download_cache (#25131) * Cache downloads for process replay * set cache dir permanent * Create constant --- selfdrive/locationd/laikad.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/selfdrive/locationd/laikad.py b/selfdrive/locationd/laikad.py index 0954cb4c9f..4868e8ae52 100755 --- a/selfdrive/locationd/laikad.py +++ b/selfdrive/locationd/laikad.py @@ -27,6 +27,7 @@ from system.swaglog import cloudlog MAX_TIME_GAP = 10 EPHEMERIS_CACHE = 'LaikadEphemeris' +DOWNLOADS_CACHE_FOLDER = "/tmp/comma_download_cache" CACHE_VERSION = 0.1 POS_FIX_RESIDUAL_THRESHOLD = 100.0 @@ -42,7 +43,7 @@ class Laikad: valid_ephem_types: Valid ephemeris types to be used by AstroDog save_ephemeris: If true saves and loads nav and orbit ephemeris to cache. """ - self.astro_dog = AstroDog(valid_const=valid_const, auto_update=auto_update, valid_ephem_types=valid_ephem_types, clear_old_ephemeris=True) + self.astro_dog = AstroDog(valid_const=valid_const, auto_update=auto_update, valid_ephem_types=valid_ephem_types, clear_old_ephemeris=True, cache_dir=DOWNLOADS_CACHE_FOLDER) self.gnss_kf = GNSSKalman(GENERATED_DIR, cython=True) self.auto_fetch_orbits = auto_fetch_orbits @@ -183,7 +184,7 @@ class Laikad: def fetch_orbits(self, t: GPSTime, block): # Download new orbits if 1 hour of orbits data left if t + SECS_IN_HR not in self.astro_dog.orbit_fetched_times and (self.last_fetch_orbits_t is None or abs(t - self.last_fetch_orbits_t) > SECS_IN_MIN): - astro_dog_vars = self.astro_dog.valid_const, self.astro_dog.auto_update, self.astro_dog.valid_ephem_types + astro_dog_vars = self.astro_dog.valid_const, self.astro_dog.auto_update, self.astro_dog.valid_ephem_types, self.astro_dog.cache_dir ret = None if block: # Used for testing purposes @@ -203,8 +204,8 @@ class Laikad: self.cache_ephemeris(t=t) -def get_orbit_data(t: GPSTime, valid_const, auto_update, valid_ephem_types): - astro_dog = AstroDog(valid_const=valid_const, auto_update=auto_update, valid_ephem_types=valid_ephem_types) +def get_orbit_data(t: GPSTime, valid_const, auto_update, valid_ephem_types, cache_dir): + astro_dog = AstroDog(valid_const=valid_const, auto_update=auto_update, valid_ephem_types=valid_ephem_types, cache_dir=cache_dir) cloudlog.info(f"Start to download/parse orbits for time {t.as_datetime()}") start_time = time.monotonic() try: @@ -301,6 +302,7 @@ def main(sm=None, pm=None): replay = "REPLAY" in os.environ use_internet = "LAIKAD_NO_INTERNET" not in os.environ laikad = Laikad(save_ephemeris=not replay, auto_fetch_orbits=use_internet) + while True: sm.update() From 780c60324bf19762e9b72da38be0a9f09d624efd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Jul 2022 11:12:35 -0700 Subject: [PATCH 11/47] process replay: fix string failures after #25127 --- selfdrive/test/process_replay/test_processes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 77d73a4ff4..4ebb0701dd 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -217,7 +217,7 @@ if __name__ == "__main__": results: Any = defaultdict(dict) p2 = pool.map(run_test_process, pool_args) for (segment, proc, subtest_name, result) in tqdm(p2, desc="Running Tests", total=len(pool_args)): - if isinstance(result, list): + if not args.upload_only: results[segment][proc + subtest_name] = result diff1, diff2, failed = format_diff(results, ref_commit) From 1f17f812cfa74c1db2ceba05dae4946b5e472e2a Mon Sep 17 00:00:00 2001 From: Erich Moraga <33645296+ErichMoraga@users.noreply.github.com> Date: Tue, 12 Jul 2022 15:45:43 -0500 Subject: [PATCH 12/47] Add missing RAV4H_TSS2_2022 engine f/w (#25111) `@Rocks#8913` 2021 RAV4 Hybrid (Italy) DongleID/route 081a1d5f242294c0|2022-07-10--17-39-33 Continental camera p/n 8646C-0R090... https://discord.com/channels/469524606043160576/524327905937850394/995781101903679558 --- selfdrive/car/toyota/values.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 2a03999342..723fa85820 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -1381,11 +1381,12 @@ FW_VERSIONS = { b'8965B42172\x00\x00\x00\x00\x00\x00', ], (Ecu.engine, 0x700, None): [ - b'\x01896634A62000\x00\x00\x00\x00', - b'\x01896634A08000\x00\x00\x00\x00', - b'\x01896634A61000\x00\x00\x00\x00', b'\x01896634A02001\x00\x00\x00\x00', b'\x01896634A03000\x00\x00\x00\x00', + b'\x01896634A08000\x00\x00\x00\x00', + b'\x01896634A61000\x00\x00\x00\x00', + b'\x01896634A62000\x00\x00\x00\x00', + b'\x01896634A63000\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ b'\x018821F0R01100\x00\x00\x00\x00', From ecac734160f719f59364a637b7cd781460456845 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Jul 2022 13:51:25 -0700 Subject: [PATCH 13/47] update compatibility docs with VIN data (#25134) * start with genesis * chrysler * honda * toyota * subaru --- docs/CARS.md | 46 ++++++++++++++++---------------- selfdrive/car/chrysler/values.py | 4 +-- selfdrive/car/honda/values.py | 20 +++++++------- selfdrive/car/hyundai/values.py | 6 ++--- selfdrive/car/subaru/values.py | 6 ++--- selfdrive/car/toyota/values.py | 10 +++---- 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 5e185ed278..c3efe87515 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -49,12 +49,12 @@ How We Rate The Cars |Kia|Niro Electric 2021|All|||||| |Kia|Niro Electric 2022|All|||||| |Kia|Telluride 2020|SCC + LKAS|||||| -|Lexus|ES 2019-21|All|||||| +|Lexus|ES 2019-22|All|||||| |Lexus|ES Hybrid 2019-22|All|||||| -|Lexus|NX 2020|All|||||| -|Lexus|NX Hybrid 2020|All|||||| +|Lexus|NX 2020-21|All|||||| +|Lexus|NX Hybrid 2020-21|All|||||| |Lexus|RX 2020-22|All|||||| -|Lexus|UX Hybrid 2019-21|All|||||| +|Lexus|UX Hybrid 2019-22|All|||||| |Toyota|Avalon 2022|All|||||| |Toyota|Avalon Hybrid 2022|All|||||| |Toyota|Camry 2021-22|All||[4](#footnotes)|||| @@ -80,8 +80,8 @@ How We Rate The Cars |Audi|RS3 2018|ACC + Lane Assist|||||| |Audi|S3 2015-17|ACC + Lane Assist|||||| |Chevrolet|Volt 2017-18[1](#footnotes)|Adaptive Cruise|||||| -|Genesis|G70 2018|All|||||| -|Genesis|G80 2018|All|||||| +|Genesis|G70 2018-19|All|||||| +|Genesis|G80 2017-19|All|||||| |Hyundai|Elantra 2021-22|SCC + LKAS|||||| |Hyundai|Elantra Hybrid 2021-22|SCC + LKAS|||||| |Hyundai|Ioniq Electric 2020|SCC + LKAS|||||| @@ -117,10 +117,10 @@ How We Rate The Cars |Nissan|X-Trail 2017|ProPILOT|||||| |SEAT|Ateca 2018|Driver Assistance|||||| |SEAT|Leon 2014-20|Driver Assistance|||||| -|Subaru|Ascent 2019-20|All|||||| +|Subaru|Ascent 2019-21|All|||||| |Subaru|Crosstrek 2020-21|EyeSight|||||| -|Subaru|Forester 2019-21|All|||||| -|Subaru|Impreza 2020-21|EyeSight|||||| +|Subaru|Forester 2019-22|All|||||| +|Subaru|Impreza 2020-22|EyeSight|||||| |Subaru|XV 2020-21|EyeSight|||||| |Toyota|Alphard 2019-20|All|||||| |Toyota|Alphard Hybrid 2021|All|||||| @@ -151,7 +151,7 @@ How We Rate The Cars |---|---|---|:---:|:---:|:---:|:---:|:---:| |Acura|ILX 2016-19|AcuraWatch Plus|||||| |Acura|RDX 2016-18|AcuraWatch Plus|||||| -|Acura|RDX 2019-21|All|||||| +|Acura|RDX 2019-22|All|||||| |Audi|Q2 2018|ACC + Lane Assist|||||| |Audi|Q3 2020-21|ACC + Lane Assist|||||| |Cadillac|Escalade ESV 2016[1](#footnotes)|ACC + LKAS|||||| @@ -159,27 +159,27 @@ How We Rate The Cars |Chrysler|Pacifica 2019-20|Adaptive Cruise|||||| |Chrysler|Pacifica Hybrid 2017-18|Adaptive Cruise|||||| |Chrysler|Pacifica Hybrid 2019-22|Adaptive Cruise|||||| -|Genesis|G90 2018|All|||||| +|Genesis|G90 2017-18|All|||||| |GMC|Acadia 2018[1](#footnotes)|Adaptive Cruise|||||| -|Honda|Accord 2018-21|All|||||| -|Honda|Accord Hybrid 2018-21|All|||||| +|Honda|Accord 2016-22|All|||||| +|Honda|Accord Hybrid 2018-22|All|||||| |Honda|Civic 2016-18|Honda Sensing|||||| -|Honda|Civic 2019-20|All|||[2](#footnotes)||| +|Honda|Civic 2019-21|All|||[2](#footnotes)||| |Honda|Civic 2022|All|||||| |Honda|Civic Hatchback 2017-21|Honda Sensing|||||| |Honda|Civic Hatchback 2022|All|||||| |Honda|CR-V 2015-16|Touring|||||| -|Honda|CR-V 2017-21|Honda Sensing|||||| +|Honda|CR-V 2017-22|Honda Sensing|||||| |Honda|CR-V Hybrid 2017-19|Honda Sensing|||||| |Honda|e 2020|All|||||| -|Honda|Fit 2018-19|Honda Sensing|||||| +|Honda|Fit 2018-20|Honda Sensing|||||| |Honda|Freed 2020|Honda Sensing|||||| -|Honda|HR-V 2019-20|Honda Sensing|||||| -|Honda|Insight 2019-21|All|||||| +|Honda|HR-V 2019-22|Honda Sensing|||||| +|Honda|Insight 2019-22|All|||||| |Honda|Inspire 2018|All|||||| -|Honda|Odyssey 2018-20|Honda Sensing|||||| +|Honda|Odyssey 2018-22|Honda Sensing|||||| |Honda|Passport 2019-21|All|||||| -|Honda|Pilot 2016-21|Honda Sensing|||||| +|Honda|Pilot 2016-22|Honda Sensing|||||| |Honda|Ridgeline 2017-22|Honda Sensing|||||| |Hyundai|Elantra 2017-19|SCC + LKAS|||||| |Hyundai|Genesis 2015-16|SCC + LKAS|||||| @@ -190,16 +190,16 @@ How We Rate The Cars |Hyundai|Tucson 2021|SCC + LKAS|||||| |Hyundai|Veloster 2019-20|SCC + LKAS|||||| |Jeep|Grand Cherokee 2016-18|Adaptive Cruise|||||| -|Jeep|Grand Cherokee 2019-20|Adaptive Cruise|||||| +|Jeep|Grand Cherokee 2019-21|Adaptive Cruise|||||| |Kia|Niro Plug-in Hybrid 2019|SCC + LKAS|||||| |Kia|Optima 2017|SCC + LKAS|||||| |Lexus|IS 2017-19|All|||||| -|Lexus|RC 2020|All|||||| +|Lexus|RC 2017-2020|All|||||| |Lexus|RX 2016-18|All|[3](#footnotes)||||| |Lexus|RX Hybrid 2016-19|All|[3](#footnotes)||||| |Mazda|CX-5 2022|All|||||| |Mazda|CX-9 2021|All|||||| -|Ram|1500 2019-21|Adaptive Cruise|||||| +|Ram|1500 2019-22|Adaptive Cruise|||||| |Subaru|Crosstrek 2018-19|EyeSight|||||| |Subaru|Impreza 2017-19|EyeSight|||||| |Subaru|XV 2018-19|EyeSight|||||| diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 69dade4b64..80baba9bd6 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -53,8 +53,8 @@ CAR_INFO: Dict[str, Optional[Union[ChryslerCarInfo, List[ChryslerCarInfo]]]] = { CAR.PACIFICA_2018: ChryslerCarInfo("Chrysler Pacifica 2017-18"), CAR.PACIFICA_2020: ChryslerCarInfo("Chrysler Pacifica 2019-20"), CAR.JEEP_CHEROKEE: ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk"), - CAR.JEEP_CHEROKEE_2019: ChryslerCarInfo("Jeep Grand Cherokee 2019-20", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4"), - CAR.RAM_1500: ChryslerCarInfo("Ram 1500 2019-21"), + CAR.JEEP_CHEROKEE_2019: ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4"), + CAR.RAM_1500: ChryslerCarInfo("Ram 1500 2019-22"), } # Unique CAN messages: diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index c6e20f2d83..bfa42bd509 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -109,13 +109,13 @@ class HondaCarInfo(CarInfo): CAR_INFO: Dict[str, Optional[Union[HondaCarInfo, List[HondaCarInfo]]]] = { CAR.ACCORD: [ - HondaCarInfo("Honda Accord 2018-21", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), + HondaCarInfo("Honda Accord 2016-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), HondaCarInfo("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), ], - CAR.ACCORDH: HondaCarInfo("Honda Accord Hybrid 2018-21", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), + CAR.ACCORDH: HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), CAR.CIVIC: HondaCarInfo("Honda Civic 2016-18", harness=Harness.nidec), CAR.CIVIC_BOSCH: [ - HondaCarInfo("Honda Civic 2019-20", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS, harness=Harness.bosch_a), + HondaCarInfo("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS, harness=Harness.bosch_a), HondaCarInfo("Honda Civic Hatchback 2017-21", harness=Harness.bosch_a), ], CAR.CIVIC_BOSCH_DIESEL: None, # same platform @@ -125,20 +125,20 @@ CAR_INFO: Dict[str, Optional[Union[HondaCarInfo, List[HondaCarInfo]]]] = { ], CAR.ACURA_ILX: HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS, harness=Harness.nidec), CAR.CRV: HondaCarInfo("Honda CR-V 2015-16", "Touring", harness=Harness.nidec), - CAR.CRV_5G: HondaCarInfo("Honda CR-V 2017-21", harness=Harness.bosch_a), + CAR.CRV_5G: HondaCarInfo("Honda CR-V 2017-22", harness=Harness.bosch_a), CAR.CRV_EU: None, # HondaCarInfo("Honda CR-V EU", "Touring"), # Euro version of CRV Touring CAR.CRV_HYBRID: HondaCarInfo("Honda CR-V Hybrid 2017-19", harness=Harness.bosch_a), - CAR.FIT: HondaCarInfo("Honda Fit 2018-19", harness=Harness.nidec), + CAR.FIT: HondaCarInfo("Honda Fit 2018-20", harness=Harness.nidec), CAR.FREED: HondaCarInfo("Honda Freed 2020", harness=Harness.nidec), - CAR.HRV: HondaCarInfo("Honda HR-V 2019-20", harness=Harness.nidec), - CAR.ODYSSEY: HondaCarInfo("Honda Odyssey 2018-20", min_steer_speed=0., harness=Harness.nidec), + CAR.HRV: HondaCarInfo("Honda HR-V 2019-22", harness=Harness.nidec), + CAR.ODYSSEY: HondaCarInfo("Honda Odyssey 2018-22", min_steer_speed=0., harness=Harness.nidec), CAR.ODYSSEY_CHN: None, # Chinese version of Odyssey CAR.ACURA_RDX: HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", harness=Harness.nidec), - CAR.ACURA_RDX_3G: HondaCarInfo("Acura RDX 2019-21", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), - CAR.PILOT: HondaCarInfo("Honda Pilot 2016-21", harness=Harness.nidec), + CAR.ACURA_RDX_3G: HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), + CAR.PILOT: HondaCarInfo("Honda Pilot 2016-22", harness=Harness.nidec), CAR.PASSPORT: HondaCarInfo("Honda Passport 2019-21", "All", harness=Harness.nidec), CAR.RIDGELINE: HondaCarInfo("Honda Ridgeline 2017-22", harness=Harness.nidec), - CAR.INSIGHT: HondaCarInfo("Honda Insight 2019-21", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), + CAR.INSIGHT: HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), CAR.HONDA_E: HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), } diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 2e6a2017ea..6e184ce9ef 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -156,10 +156,10 @@ CAR_INFO: Dict[str, Optional[Union[HyundaiCarInfo, List[HyundaiCarInfo]]]] = { CAR.KIA_EV6: HyundaiCarInfo("Kia EV6 2022", "All", harness=Harness.hyundai_p), # Genesis - CAR.GENESIS_G70: HyundaiCarInfo("Genesis G70 2018", "All", harness=Harness.hyundai_f), + CAR.GENESIS_G70: HyundaiCarInfo("Genesis G70 2018-19", "All", harness=Harness.hyundai_f), CAR.GENESIS_G70_2020: HyundaiCarInfo("Genesis G70 2020", "All", harness=Harness.hyundai_f), - CAR.GENESIS_G80: HyundaiCarInfo("Genesis G80 2018", "All", harness=Harness.hyundai_h), - CAR.GENESIS_G90: HyundaiCarInfo("Genesis G90 2018", "All", harness=Harness.hyundai_c), + CAR.GENESIS_G80: HyundaiCarInfo("Genesis G80 2017-19", "All", harness=Harness.hyundai_h), + CAR.GENESIS_G90: HyundaiCarInfo("Genesis G90 2017-18", "All", harness=Harness.hyundai_c), } class Buttons: diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index ea923b1b50..8fac934285 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -41,18 +41,18 @@ class SubaruCarInfo(CarInfo): CAR_INFO: Dict[str, Union[SubaruCarInfo, List[SubaruCarInfo]]] = { - CAR.ASCENT: SubaruCarInfo("Subaru Ascent 2019-20", "All"), + CAR.ASCENT: SubaruCarInfo("Subaru Ascent 2019-21", "All"), CAR.IMPREZA: [ SubaruCarInfo("Subaru Impreza 2017-19"), SubaruCarInfo("Subaru Crosstrek 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), SubaruCarInfo("Subaru XV 2018-19", video_link="https://youtu.be/Agww7oE1k-s?t=26"), ], CAR.IMPREZA_2020: [ - SubaruCarInfo("Subaru Impreza 2020-21"), + SubaruCarInfo("Subaru Impreza 2020-22"), SubaruCarInfo("Subaru Crosstrek 2020-21"), SubaruCarInfo("Subaru XV 2020-21"), ], - CAR.FORESTER: SubaruCarInfo("Subaru Forester 2019-21", "All"), + CAR.FORESTER: SubaruCarInfo("Subaru Forester 2019-22", "All"), CAR.FORESTER_PREGLOBAL: SubaruCarInfo("Subaru Forester 2017-18"), CAR.LEGACY_PREGLOBAL: SubaruCarInfo("Subaru Legacy 2015-18"), CAR.OUTBACK_PREGLOBAL: SubaruCarInfo("Subaru Outback 2015-17"), diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 723fa85820..f47ab87040 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -124,7 +124,7 @@ CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { ], CAR.COROLLAH_TSS2: [ ToyotaCarInfo("Toyota Corolla Hybrid 2020-22"), - ToyotaCarInfo("Lexus UX Hybrid 2019-21"), + ToyotaCarInfo("Lexus UX Hybrid 2019-22"), ], CAR.HIGHLANDER: ToyotaCarInfo("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo", footnotes=[Footnote.DSU]), CAR.HIGHLANDER_TSS2: ToyotaCarInfo("Toyota Highlander 2020-22"), @@ -151,14 +151,14 @@ CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { # Lexus CAR.LEXUS_CTH: ToyotaCarInfo("Lexus CT Hybrid 2017-18", "LSS", footnotes=[Footnote.DSU]), CAR.LEXUS_ESH: ToyotaCarInfo("Lexus ES Hybrid 2017-18", "LSS", footnotes=[Footnote.DSU]), - CAR.LEXUS_ES_TSS2: ToyotaCarInfo("Lexus ES 2019-21"), + CAR.LEXUS_ES_TSS2: ToyotaCarInfo("Lexus ES 2019-22"), CAR.LEXUS_ESH_TSS2: ToyotaCarInfo("Lexus ES Hybrid 2019-22", video_link="https://youtu.be/BZ29osRVJeg?t=12"), CAR.LEXUS_IS: ToyotaCarInfo("Lexus IS 2017-19"), CAR.LEXUS_NX: ToyotaCarInfo("Lexus NX 2018-19", footnotes=[Footnote.DSU]), CAR.LEXUS_NXH: ToyotaCarInfo("Lexus NX Hybrid 2018-19", footnotes=[Footnote.DSU]), - CAR.LEXUS_NX_TSS2: ToyotaCarInfo("Lexus NX 2020"), - CAR.LEXUS_NXH_TSS2: ToyotaCarInfo("Lexus NX Hybrid 2020"), - CAR.LEXUS_RC: ToyotaCarInfo("Lexus RC 2020"), + CAR.LEXUS_NX_TSS2: ToyotaCarInfo("Lexus NX 2020-21"), + CAR.LEXUS_NXH_TSS2: ToyotaCarInfo("Lexus NX Hybrid 2020-21"), + CAR.LEXUS_RC: ToyotaCarInfo("Lexus RC 2017-2020"), CAR.LEXUS_RX: ToyotaCarInfo("Lexus RX 2016-18", footnotes=[Footnote.DSU]), CAR.LEXUS_RXH: ToyotaCarInfo("Lexus RX Hybrid 2016-19", footnotes=[Footnote.DSU]), CAR.LEXUS_RX_TSS2: ToyotaCarInfo("Lexus RX 2020-22"), From ea449f1fe0bbff0eff5b12d64f0b5e75b7983998 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Jul 2022 14:08:17 -0700 Subject: [PATCH 14/47] Use upstream wait-on-check-action action (#25126) Use upstream lewagon action --- .github/workflows/prebuilt.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prebuilt.yaml b/.github/workflows/prebuilt.yaml index 7acc8a2254..99d9694f24 100644 --- a/.github/workflows/prebuilt.yaml +++ b/.github/workflows/prebuilt.yaml @@ -25,7 +25,7 @@ jobs: IMAGE_NAME: openpilot-prebuilt steps: - name: Wait for green check mark - uses: commaai/wait-on-check-action@f16fc3bb6cd4886520b4e9328db1d42104d5cadc + uses: lewagon/wait-on-check-action@e2558238c09778af25867eb5de5a3ce4bbae3dcd with: ref: master wait-interval: 30 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index fb5a37eeef..8df89dcc38 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,7 +12,7 @@ jobs: if: github.repository == 'commaai/openpilot' steps: - name: Wait for green check mark - uses: commaai/wait-on-check-action@f16fc3bb6cd4886520b4e9328db1d42104d5cadc + uses: lewagon/wait-on-check-action@e2558238c09778af25867eb5de5a3ce4bbae3dcd with: ref: master wait-interval: 30 From b632d56244c5fd6821477a642d6f151ea4b13b20 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Tue, 12 Jul 2022 16:39:13 -0700 Subject: [PATCH 15/47] UI: change wording for dcam preview description (#25142) --- selfdrive/ui/qt/offroad/settings.cc | 2 +- selfdrive/ui/translations/main_ja.ts | 4 ++-- selfdrive/ui/translations/main_ko.qm | Bin 20040 -> 19981 bytes selfdrive/ui/translations/main_ko.ts | 4 ++-- selfdrive/ui/translations/main_zh-CHS.qm | Bin 18508 -> 18469 bytes selfdrive/ui/translations/main_zh-CHS.ts | 4 ++-- selfdrive/ui/translations/main_zh-CHT.qm | Bin 18568 -> 18509 bytes selfdrive/ui/translations/main_zh-CHT.ts | 6 +++--- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index d5b8d4bbd1..9aeb966ccf 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -102,7 +102,7 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { // offroad-only buttons auto dcamBtn = new ButtonControl(tr("Driver Camera"), tr("PREVIEW"), - tr("Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off)")); + tr("Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)")); connect(dcamBtn, &ButtonControl::clicked, [=]() { emit showDriverView(); }); addItem(dcamBtn); diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 5c0f54a314..f3b8733128 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -134,8 +134,8 @@ - Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off) - ドライバーカメラのプレビューにより、デバイスの取り付け位置を最適化し、最高のドライバーモニタリング体験を提供します。(車両の電源を切る必要があります) + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) + ドライバー向けカメラをプレビューする、ドライバーモニタリングの視認性を確保します。(車両の電源を切る必要があります) diff --git a/selfdrive/ui/translations/main_ko.qm b/selfdrive/ui/translations/main_ko.qm index c5c66d1e73491c2ff09d91b6fdd5200002b2a6da..40b0bb65a38d65ee901ac7a85257e88868b4513c 100644 GIT binary patch delta 1903 zcmX9;Yfx2H7+v?=bMEupb1%xnv5>m`N23+hBMX66Gk z3REhz6o^d786aOtzL1B83 z7}gP&0zTV_{I|2PWxJT56j%%-hyzN)w4{`mcz^qb;mDd1`3bBpIE`T7QFmrF$=$mg~vO&eh5!!L78*TA!^bT;N{|&LK<{_){5O-h8BF+`-f7nVpYQ*N(Yk&kr zJS0;W<(_!v*Iv$Ni)U`#p^!uM;??QRw4YTnO(5ZMsgk8MpZsa1I3<_@*`@i5DafQ~ z$zl4APU(|!f@;ZAg_QHeQKmTJKivPdwEDGGj9(+Y8KtlX;-u1TEX0)WM)kfM10viQ zA1hUb)=)_ARH^C%IzkSYYTjE%CMu+T?S15Dnsj0?h|Sv|o%BCP0rXPuB^DICUFu)k zNud+nIBTEuXpjYtgHG^IqjPd}%3V7dd`UOuW&#<^)y-~f0j53BWoXFz$Thm^hmV24 zak@vzJtef*Q~H1qQWYxbYlpAp%?9=Ra{HOMKz}!NH>sPb|K}DN(caPjJNY^=qSFu; z(#n_Ph#^VKLTwif*|-0t}eJv?V*kH_9K#E8GXv}Jh1x9xpw}8$D>mE(1$ipLak)DlzWk!t$UVXC_DA_eI(?d+nk;&@ZTh6?gi zZ8{t-u~X-iza{yUY&P9^)kQX7*6e?qt2T4su~W>YF(+K!2n>xgFTBb=5B}bqe_kX> zbIfasJV}nl-1a+JAN`cM<2jPy{f_K;jM>7^$^MO;A5|%bOc8_PRRkCM~3^1KrNdGhjkEMMx9w?BG`2kep?KVex&5b#&hFs zW#gyp-_QYN$MqSMJx}?nhKZv8R$3lV?h$3m*%?35zbCAQKlt()lB}LH*|9PGR_|XQ z0}}-6oNGKUs>Pb@qJNDxYp!D;f`T{_~&j z{9m2@f7hRVh_i~*uYh>1WEv2%~R&*08W0Nkh}Y*$*w{O+dc-;TOjNo z1XK!y=6EKpfYA9j;zsN;4^VTD54}v6}kL z71PY&q-_%mma!po)`%t2MZok2@r|%r>U3Rv!|Nz%Gx0I=zY;gTzJc+L;+yei-hs{H zjt@yhsvE=L*f9)QHHP!w65UZXY-B*S=zgD$kXMQ|?{1|M*Tt_}Z&RO*V$*0CFK@kg zC75@@Cspk0C!z3vigzm7+2}1}nEpT<870Bz61D2!JUXjZYkm|>1wYUx-Or$cc5SBT z0x&O5yF^9Zr#5Pj4L=1!OSO&B2V8)`M>~?+L#yTMLLwKph>aHXX_3vGAdmIg8WQ&P*IR#jLWytatJfX`g0|~FIl(&q zKKe6vL;0R#(3$>32fbzpb?bRmA`B_NxJr03mEo0~K{9PJE3cDrAsub&TeLWjxqGoRT4@vX56ael-O)sI>4bYMQ2=nLm=@A<2&p8 zsG!N%@*`U`E#KJoA{7g`Ap2b+fjC)q1$+1*;)eWe@ zl}gMjlk@knU~r{e`jVGer~J{#A9;d*%bwl5Ys!am`w=QPxQ5R?ZQZfw zFGH!j(9_$R4y9G-aq@p{SAjRKwf0)1cde_yTg#jMue_dRO%u4bz3Ggn%`=E-D2TWg zajyO9&wJ{9rs}sXbXeEftn2rb&Yzg;EK^okSCuPeG4b? - Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off) - 운전자 카메라를 미리 보면서 최적의 운전자 모니터링 경험을 위해 장치의 장착 위치를 최적화할수 있습니다. (차량연결은 해제되어있어야 합니다) + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) + 운전자 모니터링이 좋은 가시성을 갖도록 운전자를 향한 카메라를 미리 봅니다. (차량연결은 해제되어있어야 합니다) diff --git a/selfdrive/ui/translations/main_zh-CHS.qm b/selfdrive/ui/translations/main_zh-CHS.qm index 45fae52b4286bb3e57938bf6c7c4ad53d3bd3ba1..2c7963cf17a496e356fb5b0372b565ac82514661 100644 GIT binary patch delta 1858 zcmX9;c~n$o9KAF1-Yjos-a{S41!UL+6j=%v1Q9VYutb!QLNf^(#t;$)lw8Qv6e+{N zB*hgF%gl4ousB+pNTOkJva&doq6lb2+bI&ku7~;O&ij_%cfWh@@B6AmRb8SgaV>lb zP!9kT0s)PUxPZ8tm_yu6ECU42%LYIU0w#V*3-2adpVN7n%}{jv0X6XzdbWtu1VzlAje+;5J+q03i+C=+TO&jbEZXc!UC zi=0Bo_B_rPt44+epb*~6RipNMQ|lj9lXuY1kWs3HMt{IZquTQw$EOXbt|kgBoUFR8 zt_0kys_w@(17rSDOSX%EUxnJIqn-P%t79YwiS1M`apH}GFRJ%lV;0;p)u-PivBx6S zpT*K^WvTkx1lAoVs@s}Uo&W-Ot8W~12F509gg_U-5}oy9Y>C6; zg0=VKzbj=T|$hyUYlXSfc4^z5y-M@FKh^AiGAKnSL-qX+a zZ{W*Or;pQ+s8Xg+@98JOB>h`?dpK{?A2`N3BUb4@?(pJwfI(+o#^lU0cva}xB0h#$ zf7-bI4Z}0@Cf%m=0fwYalq~9~A!P|A9`9;MYm6o#7gL1Z9!{LWz`rULcPjioAe9Z$NT1VE`I$-{-y>CAe};y%Nc)>xtf0%3!u zdC|P%^m0?uF4ik_&oHf=Px|6w)9(9=S)j&LyOZrRuE5lEkfH=nFn!fZ4E)~I+DL-J z4zsq}n|QNz z|N8wX@9T`B?LP7cRXk|&X!-0vwA=NRd^L)1w2MX2|IU|B*Qi)#v12E9D32lK0cP06x#gixxvO3C#tv^hh0FFlKrJybq_4W6w{|v98R{vOBVK>{&Kz#`0XNEjv5Sns3jwr`j{^ Mj)Id#P8X*B4>phSf&c&j delta 1954 zcmX9;4Nz3)6+Qd*z5RK+`yS{@tWjAPP!PnWK@>$nXdt2m5kw|v%m6RzCbA$dAWd{* z#3+#>4jPr9!3Z&_wV6Sqi7{#vu^2&R#e*;unC(?}`hMrUQ}xCe8t(W)SnaM;k#W z_ZuDp0XqTX1mdT}c;Y{ZX8~I+V7&;090n#|0|I{sOyRyIfvJ4p#=w2R^VNW>14!S> zLNkFy*~B-2tQaQwjkpR33M6jkdMB{@01K1>Yo8K-1$@KbckK8%*#9lWE$;#I9zxvH z2k2yo?Xe764zcSqVk^WeA`m%g>wNW04pV>jRha{F^RgYjtC%Zs;==m z*W*KV-8mu?`*k;jgTRC|-M#0kfoI1FvikxMeqIRczspN=*zR1c;<`x!wQ*4Df+hKisBS>4Sao|I z;J7QkQ9wF|DshYWUm)(HxM#sB+A($nRp$uW&y1iWL~LpqB&&Ji2Yp4v4dP#~>;jzU z#AC0uP*1n`xs`LV^@?Br*h8B-#IJv%)%}4F#M_C-Xg|Ls$5HUP|B-Cl)&R4*r4%KM zw3kVFFLNMqDB((kB;hQJ-Mx+)yYF?{?|@q;Ke` z`%+IY358@xKWyp*LNAYCVvzKBhykSF_c=incGNiSA3C!MT z$k$Q#Fwt;u@F_59nc-CQUO$)eqqvnenO(_O@A(L1jg5y-apJdqxYCT z?GNF5w%KS~Ne8VmhcuaZR2G@%KlHm9aKyZHVIM~jWzOA1>5{IP^OsZV$tmWdj${&= zVy*)nhWE|adNSy!1Loeq5?)J(<@u4**`XpAUF~AWX>!dyUOB-9#JTMBfV}OF%J&X= z=TnY2?54cu)ImDcE;rp+%25r<`~6*qL}sn>IX43(QErzf@^<-3 zZVyTzq3iP9LLa3Iv*?a*pwyL?kh2#^D9Dm}vj!M7)w1F?FNKixmNnmrBwl0LSYc=U z6HCW^j%Z4r_Om1qEn5AP+W29zYMnN>ie`CaO-_H>Y-SZ6b| zhO%I~ZTf_Nl1RKQeuzY$J#9O}s|`-O-*%#s5AjvDcISumLbk0vnK&iJb}4~gkPB_s z@_0P$Z!2RyZsq!*GHweM80}D;gDJoagEH$@6wUWQSy)R2N9QYRlAouUqm-KWc-SML z?7NdhZ!A*&(!x43l9Vrhp(n=oDBVd{Y4+SXs_6mmNn?j|X9m-<2< z6UMx&dfok;omZ{Dv6&uNrS8?dBsN(+Q~Ez3;e^_IcRxEBP;aIFjqgqmFn`q1*~V&< zZgImIb!>8Zct%~VUi0PGY`swP?MokK^lv(`aa6w=~!SLKm&lR+lvoiu wto8UjC0@rXC1s8RZLQByROYGB%DBVp@s*Sf@6pzkYGoeHTc{l^2sl6U|7&9g_5c6? diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 04bd2415f0..d9377054a5 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -134,8 +134,8 @@ - Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off) - 打开并预览驾驶员摄像头,用于调整安装角度以获得最优驾驶员监控体验。仅熄火时可用。 + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) + 打开并预览驾驶员摄像头,以确保驾驶员监控具有良好视野。仅熄火时可用。 diff --git a/selfdrive/ui/translations/main_zh-CHT.qm b/selfdrive/ui/translations/main_zh-CHT.qm index 130bcfc92670cff84c6c6fcf359be599e4941e3e..0d448f2080322661cb712bd3c06b4049fabbf935 100644 GIT binary patch delta 1928 zcmX9;3s93+8a+w=KhHmZP=oDKfd~N+1cJo}2!c?s;I4q6wMF}&U`Ry}2%v+STA!3^ zrT73vtqQd-*BP|fwZ(NSVxbMTQ*7;I=_-n-W0$SnSzKN0o=!58Imx}>{l0V0cfPy5 zLE+w|*fq&z1(ajJ)cb(S4uqSDHN@$}eZ*`);J$GL5Tk(z2XPLugP6~lm%JDh1gM$A zCk@c}6IT%9h}($gc|Hq}E&;)@KxjYLdx0s8TjVp!9}FC~5J=k$*n)w~?JRr__+u^$ zDS(_9CLw{GV!-zc;ufxF0wqV7i1C$=iSGkW?oXWE@N=LmAHuc+z}z7SO*a9B455pa z!v`R^Kjq<22$uyQ;26X=Ex@!~h$oH%h9yvU{6yRUjb$m5$ z@(MPxFtFr!E1*lj(v01V8^#OouLF|Ou>5a5+&_v{g_PE}9BamS-WY}>y?sD(7}}jL zvTZ=u1WFrFf}uC7xL>K57&i?rSbY^w9AvF5)0+W5k5X^H2!s_VLxu){m;z{~qN)PyRDNRG{+OyS~6v&!~i`Cjj$!mH$1F0b5l;^+~+h z1yxlJ6VDt~eI%24#12(^2hC$?c~SOw(Y(%!f$c&|>jO6Kq;T|RA#qsv`0^egXn}Bg zWh?buCj3QWUyO%@uWos`{(F=@nnIwo#`(@wML_r7I%R;#xm(?TR(L_EfPpR^}YI#QMD?qI=tm z0hhcO_{fV%`^A=sRyNZ7vDor99buRzwr<@*B|a5TUb;qoUKhU@vvPRr#S4?arK8$J z&j1Mp{UF}h)Wb$U@5Lm8_;8E_qux;~C+E>wU21tGiV6m+6Yiu_!CUJ2?VUh;iaK9G z-K`DkV-Fs4e^C7}>xzp`aBG65QmQHUG;MyH*zsu1$9VS-QiOc@Cz}K=i~MD!zQjT*6)7I)`k@6n?65A zLT-J_)x~U4jsB3EtyVqKpOCljreve~vo?{#8{W8He8RO_fBRJ@1v+g|bZp>mi6Qv> zMOyHbA^oR1z6Bn`@&M>e1raL=)T8BgpL@#{1f#t|6MYlXSv8K zX>vQ)L-tCMiEHVIPANT=4Ndq_%ACC%i0hXYr10ADuS-kzFrOjUr|5R+YY#E%Mak1mg2FpSb(@u=t}#aY|3D&%#<(#OeX7oQB9{A; z4;s(Z5aU9PT|w{Bs%gfq6k_O?#@+-rULS7kU&z`w9%4N8f3q1RABtKa?pcR z>e49BzQ&gEn6)IJnLsWhftSGTb9 z#ir(>QcCuV>94E*N69vr25ukX46HF-OaC)4=Y|8AH{n#g=B&mjHD77=-kyR`A75pYG99nZWYapjOr^c>(qwM+hb$c87Y|8A5 z&xMt5UcGWfO72Kim`zEq(q#OWH2%TI8dFqSSyfSFaTdSgv=ml2s*5TttIA3p&aw(e fsohfiN~OhKR#s@Kc2qhF93>9t+EaBtzs>qT^2rE( delta 2026 zcmX|B3sjV48h+-V|DVf0|I80^v10?s1I0^;v8|aMEKJ0_gd`?rCv4qiaY@13X6{;NBVBMG4!b+&%z0+M?|a|x`JVTA z-}cR#jaxLEM|xfcgnnRb6rjx|+K45@JmOAbB_ML&G8T}=1LNw5Q;Gj1X7LQ;2Qg$3 zpnCv#tp)S}#CM4C#IwZHfVl!tz5qh=fl(cRw*-vlxw+o4{K13X<-jv#K+H=(+D2ad z3-IgT@S!CM>3h~xz6tjUgE{`s|JWS05|vjS8cf$ppcEGk`D`gXq@f`{HeT%uT{ltJO z%o9H6x()NP-{8elv7o*VFqU9p>NZ{&f*1bqDv7VfqBCvW??PTq2;)CMX+Pu5cD!@p z5|C&|gPSiOGZig9ELmVZdMk>!|Dnb|J`x^;WoVw*8%C|a)l8~lJ!85wnXO}hum_r5 zSGXQ;&|I1)GI5FKs&D`Zh|=77stkD2UyyUp0TFwI@ZRgdggruv>?W~Y!i!#faZH)8 zr^CqedBU+xBo-?PpQTm-YN_x|Ci4c0LRVYXuYl+mgzo)*Oz6>y(Zd1XIog2lS@eK2 z+K|cwzHC5Sl*z zSKDdZH^q;a*HO=%;&Fv_G5=Zo@@6O3d&DpA{=hDR3cjS9b|-}j-qg)% zI0;O7O_!yi?qL^o2l@tp-~e57bd871UAl+1E3}$HA2NoLMU2)T9I=isT&6$bx5!@fhz z<5Ok$q&JlRXBqWoPLseyV`!~`ts)we9(ZyYaKJc!b`MJsV_dL~(k1DQSuaxRQ5s`T zYci+DBV!flFzhpSbf(i$Ym8mq95d1hIcXe6mTrWcbGe-__Lj@H< z(;LOUjQ_>d`aMfDdaUXE94h8FT=6|k0#P3+p5O*O6!{?Y_t+s~+>Q68?x^Y;Fm8k6uVJwHE6H@BM>Zzi1h;feQF2mXN-gRO*sta(5&z-ej4*i3B+)AW35-oqM<2{oMmXrUYCq|yJTuQtQ3||nS8vemKsc%$$li1&r{-XNd z9N^d~QlIT%!U?geE4P;lC99jSuBQix$~_{9V-f~`2}ugp7Xcd<1xF# znwMYXaywnQ)`I+1PPa4PWnGeAXw7!4a{o7)CtOZ9zXpb D32iIQ diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 806dd54ad3..efd893ec4c 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -125,7 +125,7 @@ Driver Camera - 駕駛監控 + 駕駛員攝像頭 @@ -134,8 +134,8 @@ - Preview the driver facing camera to help optimize device mounting position for best driver monitoring experience. (vehicle must be off) - 預覽駕駛監控鏡頭畫面,方便調整設備安裝的位置,以提供更準確的駕駛監控。(車子必須保持在熄火的狀態) + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) + 預覽駕駛員監控鏡頭畫面,以確保其具有良好視野。僅在熄火時可用。 From ee6dc0311818fd97cb78c58fb9a47267385312a0 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Jul 2022 17:25:54 -0700 Subject: [PATCH 16/47] fix accord years --- docs/CARS.md | 2 +- selfdrive/car/honda/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index c3efe87515..ec7da7a845 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -161,7 +161,7 @@ How We Rate The Cars |Chrysler|Pacifica Hybrid 2019-22|Adaptive Cruise|||||| |Genesis|G90 2017-18|All|||||| |GMC|Acadia 2018[1](#footnotes)|Adaptive Cruise|||||| -|Honda|Accord 2016-22|All|||||| +|Honda|Accord 2018-22|All|||||| |Honda|Accord Hybrid 2018-22|All|||||| |Honda|Civic 2016-18|Honda Sensing|||||| |Honda|Civic 2019-21|All|||[2](#footnotes)||| diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index bfa42bd509..b8417ee19b 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -109,7 +109,7 @@ class HondaCarInfo(CarInfo): CAR_INFO: Dict[str, Optional[Union[HondaCarInfo, List[HondaCarInfo]]]] = { CAR.ACCORD: [ - HondaCarInfo("Honda Accord 2016-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), + HondaCarInfo("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), HondaCarInfo("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), ], CAR.ACCORDH: HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS, harness=Harness.bosch_a), From 00bb07f6248010afb197854257c2958433159990 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Jul 2022 17:45:00 -0700 Subject: [PATCH 17/47] fw_versions.py: fix debug scanning (#25144) * Fix scanning all requests * fix replace --- selfdrive/car/fw_versions.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index c4b158aebb..a8f5357f0e 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -394,7 +394,7 @@ def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, timeout=0.1, debug=Fa brand_matches = get_brand_ecu_matches(ecu_rx_addrs) for brand in sorted(brand_matches, key=lambda b: len(brand_matches[b]), reverse=True): - car_fw = get_fw_versions(logcan, sendcan, brand=brand, timeout=timeout, debug=debug, progress=progress) + car_fw = get_fw_versions(logcan, sendcan, query_brand=brand, timeout=timeout, debug=debug, progress=progress) all_car_fw.extend(car_fw) matches = match_fw_to_car_exact(build_fw_dict(car_fw)) if len(matches) == 1: @@ -403,10 +403,10 @@ def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, timeout=0.1, debug=Fa return all_car_fw -def get_fw_versions(logcan, sendcan, brand=None, extra=None, timeout=0.1, debug=False, progress=False): +def get_fw_versions(logcan, sendcan, query_brand=None, extra=None, timeout=0.1, debug=False, progress=False): versions = get_interface_attr('FW_VERSIONS', ignore_none=True) - if brand is not None: - versions = {brand: versions[brand]} + if query_brand is not None: + versions = {query_brand: versions[query_brand]} if extra is not None: versions.update(extra) @@ -434,7 +434,7 @@ def get_fw_versions(logcan, sendcan, brand=None, extra=None, timeout=0.1, debug= addrs.insert(0, parallel_addrs) fw_versions = {} - requests = [r for r in REQUESTS if brand is None or r.brand == brand] + requests = [r for r in REQUESTS if query_brand is None or r.brand == query_brand] for addr in tqdm(addrs, disable=not progress): for addr_chunk in chunks(addr): for r in requests: @@ -503,7 +503,7 @@ if __name__ == "__main__": print() t = time.time() - fw_vers = get_fw_versions(logcan, sendcan, brand=args.brand, extra=extra, debug=args.debug, progress=True) + fw_vers = get_fw_versions(logcan, sendcan, query_brand=args.brand, extra=extra, debug=args.debug, progress=True) _, candidates = match_fw_to_car(fw_vers) print() From 44c6ca7eb4c9ea83aca18d4f648764cabdad8861 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Jul 2022 18:23:48 -0700 Subject: [PATCH 18/47] EV6: reject fake cruise engagements (#25143) * EV6: reject fake cruise engagements * bump panda * raise to 8 * update refs * bump panda Co-authored-by: Comma Device --- opendbc | 2 +- panda | 2 +- selfdrive/car/hyundai/carcontroller.py | 4 ++-- selfdrive/car/hyundai/carstate.py | 11 ++++++++--- selfdrive/car/hyundai/hda2can.py | 8 +++----- selfdrive/car/hyundai/interface.py | 5 ++--- selfdrive/car/hyundai/values.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- 8 files changed, 19 insertions(+), 17 deletions(-) diff --git a/opendbc b/opendbc index 81148db67f..3fb3f5e821 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 81148db67fd00d4e2a107b5b8269c532436edf2b +Subproject commit 3fb3f5e82129ad76232bcdca10632ed0566b20f8 diff --git a/panda b/panda index baecd2ecc6..2abeab913f 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit baecd2ecc6a2a608e1305601f6f697feca69fe88 +Subproject commit 2abeab913f6432e4327b07e247b8a46994ac77a1 diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index a878ad3274..d0d9c40839 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -82,12 +82,12 @@ class CarController: if (self.frame - self.last_button_frame) * DT_CTRL > 0.25: if CC.cruiseControl.cancel: for _ in range(20): - can_sends.append(hda2can.create_buttons(self.packer, CS.buttons_counter+1, True, False)) + can_sends.append(hda2can.create_buttons(self.packer, CS.buttons_counter+1, Buttons.CANCEL)) self.last_button_frame = self.frame # cruise standstill resume elif CC.cruiseControl.resume: - can_sends.append(hda2can.create_buttons(self.packer, CS.buttons_counter+1, False, True)) + can_sends.append(hda2can.create_buttons(self.packer, CS.buttons_counter+1, Buttons.RES_ACCEL)) self.last_button_frame = self.frame else: diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index a10cdadbca..8afd851f00 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -8,7 +8,7 @@ from opendbc.can.can_define import CANDefine from selfdrive.car.hyundai.values import DBC, FEATURES, HDA2_CAR, EV_CAR, HYBRID_CAR, Buttons, CarControllerParams from selfdrive.car.interfaces import CarStateBase -PREV_BUTTON_SAMPLES = 4 +PREV_BUTTON_SAMPLES = 8 class CarState(CarStateBase): @@ -171,7 +171,10 @@ class CarState(CarStateBase): speed_factor = CV.MPH_TO_MS if cp.vl["CLUSTER_INFO"]["DISTANCE_UNIT"] == 1 else CV.KPH_TO_MS ret.cruiseState.speed = cp.vl["CRUISE_INFO"]["SET_SPEED"] * speed_factor - self.buttons_counter = cp.vl["CRUISE_BUTTONS"]["_COUNTER"] + self.cruise_buttons.extend(cp.vl_all["CRUISE_BUTTONS"]["CRUISE_BUTTONS"]) + self.main_buttons.extend(cp.vl_all["CRUISE_BUTTONS"]["ADAPTIVE_CRUISE_MAIN_BTN"]) + self.buttons_counter = cp.vl["CRUISE_BUTTONS"]["COUNTER"] + self.cam_0x2a4 = copy.copy(cp_cam.vl["CAM_0x2a4"]) return ret @@ -362,7 +365,9 @@ class CarState(CarStateBase): ("CRUISE_ACTIVE", "SCC1"), ("SET_SPEED", "CRUISE_INFO"), ("CRUISE_STANDSTILL", "CRUISE_INFO"), - ("_COUNTER", "CRUISE_BUTTONS"), + ("COUNTER", "CRUISE_BUTTONS"), + ("CRUISE_BUTTONS", "CRUISE_BUTTONS"), + ("ADAPTIVE_CRUISE_MAIN_BTN", "CRUISE_BUTTONS"), ("DISTANCE_UNIT", "CLUSTER_INFO"), diff --git a/selfdrive/car/hyundai/hda2can.py b/selfdrive/car/hyundai/hda2can.py index 437f5cf538..9a9e477cf5 100644 --- a/selfdrive/car/hyundai/hda2can.py +++ b/selfdrive/car/hyundai/hda2can.py @@ -18,11 +18,9 @@ def create_cam_0x2a4(packer, frame, camera_values): }) return packer.make_can_msg("CAM_0x2a4", 4, camera_values, frame % 255) -def create_buttons(packer, cnt, cancel, resume): +def create_buttons(packer, cnt, btn): values = { - "_COUNTER": cnt % 0xf, "SET_ME_1": 1, - "DISTANCE_BTN": 1 if resume else 0, - "PAUSE_RESUME_BTN": 1 if cancel else 0, + "CRUISE_BUTTONS": btn, } - return packer.make_can_msg("CRUISE_BUTTONS", 5, values) + return packer.make_can_msg("CRUISE_BUTTONS", 5, values, cnt % 0xf) diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 069b0e74e5..a32ee2c0ab 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -2,7 +2,7 @@ from cereal import car from panda import Panda from common.conversions import Conversions as CV -from selfdrive.car.hyundai.values import CAR, DBC, HDA2_CAR, EV_CAR, HYBRID_CAR, LEGACY_SAFETY_MODE_CAR, Buttons, CarControllerParams +from selfdrive.car.hyundai.values import CAR, DBC, EV_CAR, HYBRID_CAR, LEGACY_SAFETY_MODE_CAR, Buttons, CarControllerParams from selfdrive.car.hyundai.radar_interface import RADAR_START_ADDR from selfdrive.car import STD_CARGO_KG, create_button_enable_events, create_button_event, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config from selfdrive.car.interfaces import CarInterfaceBase @@ -321,8 +321,7 @@ class CarInterface(CarInterfaceBase): # To avoid re-engaging when openpilot cancels, check user engagement intention via buttons # Main button also can trigger an engagement on these cars allow_enable = any(btn in ENABLE_BUTTONS for btn in self.CS.cruise_buttons) or any(self.CS.main_buttons) - allow_enable = allow_enable or self.CP.carFingerprint in HDA2_CAR - events = self.create_common_events(ret, pcm_enable=self.CS.CP.pcmCruise, allow_enable=allow_enable or True) + events = self.create_common_events(ret, pcm_enable=self.CS.CP.pcmCruise, allow_enable=allow_enable) if self.CS.brake_error: events.add(EventName.brakeUnavailable) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 6e184ce9ef..ffa29c60d4 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -167,7 +167,7 @@ class Buttons: RES_ACCEL = 1 SET_DECEL = 2 GAP_DIST = 3 - CANCEL = 4 + CANCEL = 4 # on newer models, this is a pause/resume button FINGERPRINTS = { CAR.ELANTRA: [{ diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index b165b163ba..e77a38de5f 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -11e721366f1c177a84e6cb8b48171113ac3b54f9 \ No newline at end of file +5efbbdf69e16db3d989bfaf62d10e958e80b9ca2 \ No newline at end of file From aadaaabd54988a286704ef2bea0bacf4bd62fa8b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Jul 2022 18:58:46 -0700 Subject: [PATCH 19/47] compatibility docs: print diff from PR (#24941) * print docs diff * revert car changes * cause a diff * temp so it works * text diff * tier inline is a bit too much * comments * fix * use paths * fix * temp * temp * diff * fix * remove something * more text diff * Delete comment if outdated * Smaller diff * remove * no diff * Don't try to run on fork PRs * cause some errors * Fix * Fix * Doesn't support env in job if, only step if * in case file was moved, don't throw error * See if this does what I think it does * See if this does what I think it does * should work * change something * revert * uncomment * no comment * this shouldn't fail * rename to base * Remove true * Remove other true --- .github/workflows/selfdrive_tests.yaml | 71 +++++++++++++++++++- selfdrive/debug/dump_car_info.py | 18 ++++++ selfdrive/debug/print_docs_diff.py | 90 ++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 3 deletions(-) create mode 100755 selfdrive/debug/dump_car_info.py create mode 100755 selfdrive/debug/print_docs_diff.py diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 99a21b58f3..298ea5fb49 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -10,6 +10,7 @@ env: CL_BASE_IMAGE: openpilot-base-cl DOCKER_REGISTRY: ghcr.io/commaai AZURE_TOKEN: ${{ secrets.AZURE_COMMADATACI_OPENPILOTCI_TOKEN }} + HAS_AZURE_TOKEN: $AZURE_TOKEN != '' DOCKER_LOGIN: docker login ghcr.io -u adeebshihadeh -p ${{ secrets.CONTAINER_TOKEN }} BUILD: | @@ -17,12 +18,12 @@ env: docker pull $DOCKER_REGISTRY/$BASE_IMAGE:latest || true docker build --cache-from $DOCKER_REGISTRY/$BASE_IMAGE:latest -t $DOCKER_REGISTRY/$BASE_IMAGE:latest -t $BASE_IMAGE:latest -f Dockerfile.openpilot_base . - RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v /tmp/scons_cache:/tmp/scons_cache -v /tmp/comma_download_cache:/tmp/comma_download_cache $BASE_IMAGE /bin/sh -c + RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v /tmp/scons_cache:/tmp/scons_cache -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/sh -c BUILD_CL: | docker pull $DOCKER_REGISTRY/$CL_BASE_IMAGE:latest || true docker build --cache-from $DOCKER_REGISTRY/$CL_BASE_IMAGE:latest -t $DOCKER_REGISTRY/$CL_BASE_IMAGE:latest -t $CL_BASE_IMAGE:latest -f Dockerfile.openpilot_base_cl . - RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v /tmp/scons_cache:/tmp/scons_cache -v /tmp/comma_download_cache:/tmp/comma_download_cache $CL_BASE_IMAGE /bin/sh -c + RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v /tmp/scons_cache:/tmp/scons_cache -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/sh -c UNIT_TEST: coverage run --append -m unittest discover @@ -365,7 +366,7 @@ jobs: name: process_replay_diff.txt path: selfdrive/test/process_replay/diff.txt - name: Upload reference logs - if: ${{ failure() && github.event_name == 'pull_request' && github.repository == 'commaai/openpilot' && env.AZURE_TOKEN != '' }} + if: ${{ failure() && github.event_name == 'pull_request' && github.repository == 'commaai/openpilot' && env.HAS_AZURE_TOKEN }} run: | ${{ env.RUN }} "scons -j$(nproc) && \ CI=1 AZURE_TOKEN='$AZURE_TOKEN' python selfdrive/test/process_replay/test_processes.py -j$(nproc) --upload-only" @@ -510,3 +511,67 @@ jobs: run: | $DOCKER_LOGIN docker push $DOCKER_REGISTRY/openpilot-docs:latest + + car_docs_diff: + name: comment on PR with car docs diff + runs-on: ubuntu-20.04 + timeout-minutes: 50 + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v3 + with: + submodules: true + ref: ${{ github.event.pull_request.base.ref }} + - name: Cache scons + id: scons-cache + # TODO: Change the version to the released version when https://github.com/actions/cache/pull/489 (or 571) is merged. + uses: actions/cache@03e00da99d75a2204924908e1cca7902cafce66b + env: + CACHE_SKIP_SAVE: true + with: + path: /tmp/scons_cache + key: scons-${{ hashFiles('.github/workflows/selfdrive_tests.yaml') }}- + restore-keys: | + scons-${{ hashFiles('.github/workflows/selfdrive_tests.yaml') }}- + scons- + - name: Build Docker image + run: eval "$BUILD" + - name: Get base car info + run: | + ${{ env.RUN }} "scons -j$(nproc) && python selfdrive/debug/dump_car_info.py --path /tmp/openpilot_cache/base_car_info" + sudo chown -R $USER:$USER ${{ github.workspace }} + - uses: actions/checkout@v3 + with: + submodules: true + - name: Save car docs diff + id: save_diff + run: | + ${{ env.RUN }} "scons -j$(nproc)" + output=$(${{ env.RUN }} "python selfdrive/debug/print_docs_diff.py --path /tmp/openpilot_cache/base_car_info") + output="${output//$'\n'/'%0A'}" + echo "::set-output name=diff::$output" + - name: Find comment + if: env.HAS_AZURE_TOKEN + uses: peter-evans/find-comment@v1 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + body-includes: This PR makes changes to + - name: Update comment + if: steps.save_diff.outputs.diff != '' && env.HAS_AZURE_TOKEN + uses: peter-evans/create-or-update-comment@v1 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: "${{ steps.save_diff.outputs.diff }}" + edit-mode: replace + - name: Delete comment + if: steps.fc.outputs.comment-id != '' && steps.save_diff.outputs.diff == '' && env.HAS_AZURE_TOKEN + uses: actions/github-script@v6 + with: + script: | + github.rest.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: ${{ steps.fc.outputs.comment-id }} + }) diff --git a/selfdrive/debug/dump_car_info.py b/selfdrive/debug/dump_car_info.py new file mode 100755 index 0000000000..c9a21c2848 --- /dev/null +++ b/selfdrive/debug/dump_car_info.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +import argparse +import pickle + +from selfdrive.car.docs import get_all_car_info + + +def dump_car_info(path): + with open(path, 'wb') as f: + pickle.dump(get_all_car_info(), f) + print(f'Dumping car info to {path}') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--path", required=True) + args = parser.parse_args() + dump_car_info(args.path) diff --git a/selfdrive/debug/print_docs_diff.py b/selfdrive/debug/print_docs_diff.py new file mode 100755 index 0000000000..5cf3867b2d --- /dev/null +++ b/selfdrive/debug/print_docs_diff.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +import argparse +import pickle + +from selfdrive.car.docs import get_all_car_info +from selfdrive.car.docs_definitions import Column + +STAR_ICON = '' +COLUMNS = "|" + "|".join([column.value for column in Column]) + "|" +COLUMN_HEADER = "|---|---|---|:---:|:---:|:---:|:---:|:---:|" +ARROW_SYMBOL = "➡️" + + +def load_base_car_info(path): + with open(path, "rb") as f: + return pickle.load(f) + + +def get_star_diff(base_car, new_car): + return [column for column, value in base_car.row.items() if value != new_car.row[column]] + + +def format_row(builder): + return "|" + "|".join(builder) + "|" + + +def print_car_info_diff(path): + base_car_info = {f"{i.make} {i.model}": i for i in load_base_car_info(path)} + new_car_info = {f"{i.make} {i.model}": i for i in get_all_car_info()} + + tier_changes = [] + star_changes = [] + removals = [] + additions = [] + + # Changes (tier + stars) + for base_car_model, base_car in base_car_info.items(): + if base_car_model not in new_car_info: + continue + + new_car = new_car_info[base_car_model] + + # Tier changes + if base_car.tier != new_car.tier: + tier_changes.append(f"- Tier for {base_car.make} {base_car.model} changed! ({base_car.tier.name.title()} {ARROW_SYMBOL} {new_car.tier.name.title()})") + + # Star changes + diff = get_star_diff(base_car, new_car) + if not len(diff): + continue + + row_builder = [] + for column in list(Column): + if column not in diff: + row_builder.append(new_car.get_column(column, STAR_ICON, "{}")) + else: + row_builder.append(base_car.get_column(column, STAR_ICON, "{}") + ARROW_SYMBOL + new_car.get_column(column, STAR_ICON, "{}")) + + star_changes.append(format_row(row_builder)) + + # Removals + for model in set(base_car_info) - set(new_car_info): + car_info = base_car_info[model] + removals.append(format_row([car_info.get_column(column, STAR_ICON, "{}") for column in Column])) + + # Additions + for model in set(new_car_info) - set(base_car_info): + car_info = new_car_info[model] + additions.append(format_row([car_info.get_column(column, STAR_ICON, "{}") for column in Column])) + + # Print diff + if len(star_changes) or len(tier_changes) or len(removals) or len(additions): + markdown_builder = ["### ⚠️ This PR makes changes to [CARS.md](../blob/master/docs/CARS.md) ⚠️"] + + for title, category in (("## 🏅 Tier Changes", tier_changes), ("## 🔀 Star Changes", star_changes), ("## ❌ Removed", removals), ("## ➕ Added", additions)): + if len(category): + markdown_builder.append(title) + if "Tier" not in title: + markdown_builder.append(COLUMNS) + markdown_builder.append(COLUMN_HEADER) + markdown_builder.extend(category) + + print("\n".join(markdown_builder)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--path", required=True) + args = parser.parse_args() + print_car_info_diff(args.path) From 01de46ad82358efa12797a50f501d902ca711547 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Jul 2022 19:25:03 -0700 Subject: [PATCH 20/47] Corolla Cross: Update minimum enable speed (#25132) * Update min steer speed for intl. Corolla Cross 27 km/h, thanks to Ale Sato * update docs --- docs/CARS.md | 6 +++--- selfdrive/car/toyota/values.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index ec7da7a845..e24672e9bc 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -35,7 +35,7 @@ How We Rate The Cars **All supported cars can move between the tiers as support changes.** -# Gold - 31 cars +# Gold - 30 cars |Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained| |---|---|---|:---:|:---:|:---:|:---:|:---:| @@ -60,7 +60,6 @@ How We Rate The Cars |Toyota|Camry 2021-22|All||[4](#footnotes)|||| |Toyota|Camry Hybrid 2021-22|All|||||| |Toyota|Corolla 2020-22|All|||||| -|Toyota|Corolla Cross 2020-21 (Non-US only)|All|||||| |Toyota|Corolla Hatchback 2019-22|All|||||| |Toyota|Corolla Hybrid 2020-22|All|||||| |Toyota|Highlander 2020-22|All|||||| @@ -71,7 +70,7 @@ How We Rate The Cars |Toyota|RAV4 2019-21|All|||||| |Toyota|RAV4 Hybrid 2019-21|All|||||| -# Silver - 69 cars +# Silver - 70 cars |Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained| |---|---|---|:---:|:---:|:---:|:---:|:---:| @@ -126,6 +125,7 @@ How We Rate The Cars |Toyota|Alphard Hybrid 2021|All|||||| |Toyota|Camry 2018-20|All||[4](#footnotes)|||| |Toyota|Camry Hybrid 2018-20|All||[4](#footnotes)|||| +|Toyota|Corolla Cross 2020-21 (Non-US only)|All|||||| |Toyota|Highlander 2017-19|All|[3](#footnotes)||||| |Toyota|Highlander Hybrid 2017-19|All|[3](#footnotes)||||| |Toyota|Prius 2016-20|TSS-P|[3](#footnotes)||||| diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index f47ab87040..f40a58b5a7 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -119,7 +119,7 @@ CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { CAR.COROLLA: ToyotaCarInfo("Toyota Corolla 2017-19", footnotes=[Footnote.DSU]), CAR.COROLLA_TSS2: [ ToyotaCarInfo("Toyota Corolla 2020-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), - ToyotaCarInfo("Toyota Corolla Cross 2020-21 (Non-US only)"), + ToyotaCarInfo("Toyota Corolla Cross 2020-21 (Non-US only)", min_enable_speed=7.5), ToyotaCarInfo("Toyota Corolla Hatchback 2019-22", video_link="https://www.youtube.com/watch?v=_66pXk0CBYA"), ], CAR.COROLLAH_TSS2: [ From 906a8a912cbd39863f43582677f2435f11ecb904 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Wed, 13 Jul 2022 04:28:48 +0200 Subject: [PATCH 21/47] casync: only when run from updater (#25130) * casync: only when run from updater * also here --- system/hardware/tici/agnos.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/hardware/tici/agnos.py b/system/hardware/tici/agnos.py index 750aa630ae..ca2498a00c 100755 --- a/system/hardware/tici/agnos.py +++ b/system/hardware/tici/agnos.py @@ -222,7 +222,7 @@ def extract_casync_image(target_slot_number: int, partition: dict, cloudlog): raise Exception(f"Raw hash mismatch '{partition['hash_raw'].lower()}'") -def flash_partition(target_slot_number: int, partition: dict, cloudlog): +def flash_partition(target_slot_number: int, partition: dict, cloudlog, standalone=False): cloudlog.info(f"Downloading and writing {partition['name']}") if verify_partition(target_slot_number, partition): @@ -236,7 +236,7 @@ def flash_partition(target_slot_number: int, partition: dict, cloudlog): path = get_partition_path(target_slot_number, partition) - if 'casync_caibx' in partition: + if ('casync_caibx' in partition) and not standalone: extract_casync_image(target_slot_number, partition, cloudlog) else: extract_compressed_image(target_slot_number, partition, cloudlog) @@ -263,7 +263,7 @@ def swap(manifest_path: str, target_slot_number: int, cloudlog) -> None: cloudlog.error(f"Swap failed {out}") -def flash_agnos_update(manifest_path: str, target_slot_number: int, cloudlog) -> None: +def flash_agnos_update(manifest_path: str, target_slot_number: int, cloudlog, standalone=False) -> None: update = json.load(open(manifest_path)) cloudlog.info(f"Target slot {target_slot_number}") @@ -276,7 +276,7 @@ def flash_agnos_update(manifest_path: str, target_slot_number: int, cloudlog) -> for retries in range(10): try: - flash_partition(target_slot_number, partition, cloudlog) + flash_partition(target_slot_number, partition, cloudlog, standalone) success = True break @@ -320,9 +320,9 @@ if __name__ == "__main__": elif args.swap: while not verify_agnos_update(args.manifest, target_slot_number): logging.error("Verification failed. Flashing AGNOS") - flash_agnos_update(args.manifest, target_slot_number, logging) + flash_agnos_update(args.manifest, target_slot_number, logging, standalone=True) logging.warning(f"Verification succeeded. Swapping to slot {target_slot_number}") swap(args.manifest, target_slot_number, logging) else: - flash_agnos_update(args.manifest, target_slot_number, logging) + flash_agnos_update(args.manifest, target_slot_number, logging, standalone=True) From 0eab1ed817ece20b25de7438d32238c482613df3 Mon Sep 17 00:00:00 2001 From: Jafar Al-Gharaibeh Date: Tue, 12 Jul 2022 20:38:18 -0600 Subject: [PATCH 22/47] Mazda: CX-5 22 FW FP (#24778) Mazda CX-5 2022 FW FP dongle-id: 661621a8442f0688 Signed-off-by: Jafar Al-Gharaibeh --- selfdrive/car/mazda/values.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 09b9b7732b..12e9eafc4f 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -65,6 +65,7 @@ FW_VERSIONS = { ], (Ecu.engine, 0x7e0, None): [ b'PX2G-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PX2H-188K2-H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'SH54-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ From 3b4e939b9f88b70727e687613a912aef36178755 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Jul 2022 19:58:39 -0700 Subject: [PATCH 23/47] UI: translations cleanup (#25120) * Make this one translation * Remote html from translations * getBrand as argument * some stuff * Forget Wi-Fi network * Update translations * Remove obsolete * compilation fixes * remove * Fix missing translation --- selfdrive/ui/qt/offroad/networking.cc | 8 +-- selfdrive/ui/qt/offroad/settings.cc | 2 +- selfdrive/ui/qt/widgets/input.cc | 2 +- selfdrive/ui/qt/widgets/prime.cc | 13 ++-- selfdrive/ui/translations/main_ko.qm | Bin 19981 -> 19439 bytes selfdrive/ui/translations/main_ko.ts | 79 +++++++++++------------ selfdrive/ui/translations/main_zh-CHS.qm | Bin 18469 -> 17931 bytes selfdrive/ui/translations/main_zh-CHS.ts | 79 +++++++++++------------ selfdrive/ui/translations/main_zh-CHT.qm | Bin 18509 -> 17969 bytes selfdrive/ui/translations/main_zh-CHT.ts | 79 +++++++++++------------ selfdrive/ui/update_translations.py | 10 ++- 11 files changed, 129 insertions(+), 143 deletions(-) diff --git a/selfdrive/ui/qt/offroad/networking.cc b/selfdrive/ui/qt/offroad/networking.cc index 536ca495ca..c7341d1987 100644 --- a/selfdrive/ui/qt/offroad/networking.cc +++ b/selfdrive/ui/qt/offroad/networking.cc @@ -84,7 +84,7 @@ void Networking::connectToNetwork(const Network &n) { } else if (n.security_type == SecurityType::OPEN) { wifi->connect(n); } else if (n.security_type == SecurityType::WPA) { - QString pass = InputDialog::getText(tr("Enter password"), this, tr("for \"") + n.ssid + "\"", true, 8); + QString pass = InputDialog::getText(tr("Enter password"), this, tr("for \"%1\"").arg(QString::fromUtf8(n.ssid)), true, 8); if (!pass.isEmpty()) { wifi->connect(n, pass); } @@ -94,7 +94,7 @@ void Networking::connectToNetwork(const Network &n) { void Networking::wrongPassword(const QString &ssid) { if (wifi->seenNetworks.contains(ssid)) { const Network &n = wifi->seenNetworks.value(ssid); - QString pass = InputDialog::getText(tr("Wrong password"), this, tr("for \"") + n.ssid +"\"", true, 8); + QString pass = InputDialog::getText(tr("Wrong password"), this, tr("for \"%1\"").arg(QString::fromUtf8(n.ssid)), true, 8); if (!pass.isEmpty()) { wifi->connect(n, pass); } @@ -174,7 +174,7 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid list->addItem(editApnButton); // Set initial config - wifi->updateGsmSettings(roamingEnabled, QString::fromStdString(params.get("GsmApn"))); + wifi->updateGsmSettings(roamingEnabled, QString::fromStdString(params.get("GsmApn"))); main_layout->addWidget(new ScrollView(list, this)); main_layout->addStretch(1); @@ -296,7 +296,7 @@ void WifiUI::refresh() { QPushButton *forgetBtn = new QPushButton(tr("FORGET")); forgetBtn->setObjectName("forgetBtn"); QObject::connect(forgetBtn, &QPushButton::clicked, [=]() { - if (ConfirmationDialog::confirm(tr("Forget Wi-Fi Network \"") + QString::fromUtf8(network.ssid) + "\"?", this)) { + if (ConfirmationDialog::confirm(tr("Forget Wi-Fi Network \"%1\"?").arg(QString::fromUtf8(network.ssid)), this)) { wifi->forgetConnection(network.ssid); } }); diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 9aeb966ccf..9a6e203966 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -249,7 +249,7 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { }); - auto uninstallBtn = new ButtonControl(tr("Uninstall ") + getBrand(), tr("UNINSTALL")); + auto uninstallBtn = new ButtonControl(tr("Uninstall %1").arg(getBrand()), tr("UNINSTALL")); connect(uninstallBtn, &ButtonControl::clicked, [&]() { if (ConfirmationDialog::confirm(tr("Are you sure you want to uninstall?"), this)) { params.putBool("DoUninstall", true); diff --git a/selfdrive/ui/qt/widgets/input.cc b/selfdrive/ui/qt/widgets/input.cc index b0facfce83..dc54a3621c 100644 --- a/selfdrive/ui/qt/widgets/input.cc +++ b/selfdrive/ui/qt/widgets/input.cc @@ -165,7 +165,7 @@ void InputDialog::handleEnter() { done(QDialog::Accepted); emitText(line->text()); } else { - setMessage(tr("Need at least ") + QString::number(minLength) + tr(" characters!"), false); + setMessage(tr("Need at least %1 characters!").arg(minLength), false); } } diff --git a/selfdrive/ui/qt/widgets/prime.cc b/selfdrive/ui/qt/widgets/prime.cc index d2529821f4..5419475262 100644 --- a/selfdrive/ui/qt/widgets/prime.cc +++ b/selfdrive/ui/qt/widgets/prime.cc @@ -88,13 +88,16 @@ PairingPopup::PairingPopup(QWidget *parent) : QDialogBase(parent) { title->setWordWrap(true); vlayout->addWidget(title); - QLabel *instructions = new QLabel(tr(R"( + QLabel *instructions = new QLabel(QString(R"(
    -
  1. Go to https://connect.comma.ai on your phone
  2. -
  3. Click "add new device" and scan the QR code on the right
  4. -
  5. Bookmark connect.comma.ai to your home screen to use it like an app
  6. +
  7. %1
  8. +
  9. %2
  10. +
  11. %3
- )"), this); + )").arg(tr("Go to https://connect.comma.ai on your phone")) + .arg(tr("Click \"add new device\" and scan the QR code on the right")) + .arg(tr("Bookmark connect.comma.ai to your home screen to use it like an app")), this); + instructions->setStyleSheet("font-size: 47px; font-weight: bold; color: black;"); instructions->setWordWrap(true); vlayout->addWidget(instructions); diff --git a/selfdrive/ui/translations/main_ko.qm b/selfdrive/ui/translations/main_ko.qm index 40b0bb65a38d65ee901ac7a85257e88868b4513c..d59698e07432f37ed105ada86a1c83bc815e0e0f 100644 GIT binary patch delta 2085 zcmYLJ3s98T89lrE|NHp&1qcfgS@r=c1%WkcK?M{P0~C=K4Mjyk2tp9$p~gJAlTkwq zYBdWLX;|7-Q0vsO$ zsjsu}HQ;BzV4uIE&S_uS7$S8GDtRSrT2dnz$;ODP=3(QME zmi(_=FF{uRtE^_ms*??X6oBlMTAph{&Z(CHXW}`mz1YJ8=kdY>0}b2o&ZR3r(kV1o z<#I}a=$Mj0+PN5gV=MQ2WTw~%Af!zea5RKM?v%~l&*{yMk!5y<0il~^Z}oG1fkSpB zO8`u_WH;rU#I!52dr$8o;X1ig^a&7_BM%)Nh7+?N$&;ljsu&?(<7GR2j|31?|PqbSYe z1QuIFeN8zq|GJoD2qp0cV)lAYC`Kt3NgvTVLt;tD2~HqiENMK+5hoG9V|EM&B2u{r&21hG{@#O0UZOj^!O4-$7u~<6H+0cr!)v>##BQ;Df{M!< z#eqQ*u&)zu@1$iyy*-%tia0(&LQ&mHxiyQO#V8G9kyI>Lx$s^x6)RIFE+3}ntjcB0 zZNS0~ll=Wtddf(Q!xbLU_?P~1wL)n7Crn=UfWp;`P*5#u^FE7L|uv|Y2xxsy^Y$=9r2LuseiYYIAf+h)2o z`$2D^MbkI1oLji@Qq&@fe!k9;iaqMths<}fC2d7K5 zlN{;vFsc6hae6dEa^GCZ(bP#tdpTlZuGIK?EtM;moF7JuyuK!>y@-M07O6ur^D((D zb(j|Nwq;3oH&juwZmq2KSA1-4Y3&z2p%<=dlW*+-ri5$P4)Zy%*J{f@6DX;d_SJ2^ zR8X(&{E8!*aa-G+PUTD`I^PQ<5P4W%bzJE;VK?XO*i< zOQaHUa^0#rCJZ*|HZ6ZltXFqv{8=U_)-@mGEi>D7J;$h=BVPCE05R%K-9RS^3ZLth zCqh{8h(0Rl1{=xH$4-#wQ*rvnIo!97>CbH^F4(W{u)RyuItTR~iTs$+s=u_5UeJ2! z`?7f*{kjZ(@15W%HX8z~seo^+!S*nTO6@bm4DmgRzF|n)O9_2nG?XVUW!!zko+B%$ zK%?RJ4JAOZ zfcP85G*V;Be3jPA^{zD4<@WbpYVKWgaW5v&yM+EVOlSLlLfeyY z^>dpmEVfXG&1EtBwwyF)%jC#$jahS~Cr6T8ZhMj|H^d}c$+2U#BNlM+yvf{GJs=U%t5_bJN#=oU$ewUAIrfXZe Y#mB=C2~SQ3x{jrr1aeGpwWdG&KXjTDOaK4? delta 2644 zcmcIk2~bq`9sYLry=6zG(a>Wyk%k_Jfz*{i zM9jOR=-<7EHcHV|An8nG55pE_LUcsc+ z*MacGm~`_4AjXEt`gzQC6&YhUq3_99l1!4WBg^h0Nj`Y#DzkYPVd_us)4m+j)Sq&F z0jAAc&MY~|*;@}tgOQtFL%U;m`Im37%3GLyvK4TK-AD0!KW@ZgX)gnq7GvibGMRcA z4URd$=&5KLl*O_)qi5YB?zgI}v7^c8x2nP01AtM#RYh-L_o5c4vYSVd*uAQEJGh?s zs_NV{0kA$$T~f0X!?mhgkt=~=ZEC6TGaz`QIE$lW-P_0#3WcI{ zGVGo$R9;I0{EiE6%wtJ9gRolo28i1))TSS$0$&?IOX>hx{RYr>Q>d$d$kN<}UETAE znZo`rHc^2p;qXuDfi#ow8=1{9-51V&*~#^M;q2|Za169++cc_Yf!1^{lnl<$CfrIRgC*KY z4ab0_2iln`k{`5OyZhl|z<-SPQI@lVG8?M%8%3&u)w(@HR`6uKx_=isPYhK7Y&F1zL5`JTG3b$e?O=hXK_x1aB09M2B7 z4|@FhZPDwDuTaMRdjC4k`SW-56Tar38!c+R36{IX}jeh1VQatj!ett6t z?YVaS22fsT)VFs|p`5DqSKLc^^Y}{>f_Xb>H%jx*xACO1wDuM+7n=_;k^W<(svBm0 zuaasWv$Z4hq}rpqDbqr!?$UI&s7>15##Rf_lJmft8dA1f`Z!$V1W%Su71B{GlbR%7 z-Xj;JCTju*ZM}5!RR<}9LG|G>+FK0%Cq83ADnr`u*8+o5470ECMhN`eP<~M$lame0 z7kiRHqoMgLw&uB^hSM*SG3(D{&l4;l{DN$2;QGi~ryP=4Ns(-m(^A;uJHbpL;(pOlUyyejh2G}V#yu(3LX3DKQ$XsNZ{COua;*8wc%mRhW zM(v&eCTui@`TULt$uh?FvQVEz#sg8@4+t`Tw1k-GJYj6|`vui|#n_Zg9Cg=tCV^To zSd8tt980f1n7rQK!xQW^4OvYFJhM%H4^zn0aZ^keucAn^DRVs;^xSAFPfn%Z9n;$P zIO)MXrfoOIQyZnGU)3{F%r~ZE52y*>YSX##=PB}2X171_j-26^VfLKBxsJVVwto2- z7^^lO;+4 zX$SeOFQSkxHYV!~79Wq6>is0CV`6hnM^VG+hHluXKMIGh?E1C0&Glf!k6Z=b?!&ch zvrevu^24raN`C%)CC{PQ^Ya!ul*Xgp`?SO4j@*OcEkegEDDeBiR4gd1Q2bmLU(d!J zzPT!=dNCv#{Oy;3QrP+JKqbnMk3<9^g0F&w{cH9oYsJVz1qxAw5`@qr9|hcxqg@1| z>A4i~^h)}N=zVz-XkGLqUSwszYhRMT4>*ryIQT2&dSB3Jgg*`H%Ce20!zf|>asE?= z{~-aATt}4ga}oM~PLgL+Ttk#N=f6qRcgntgJafvYtyDQArTBXAwT%u- z2(uUcOQ(P0qqfET*FJNU6zj8j62eOD136tg6>DRst=u|PdwSUZvS-vTO)n`bS?I{K i+ZETzvEGd - Need at least - 최소 - - - - characters! - 자가 필요합니다! + Need at least %1 characters! + 최소 %1 자가 필요합니다! @@ -481,8 +476,8 @@ location set - for " - 하기위한 " + for "%1" + 하기위한 "%1" @@ -547,52 +542,50 @@ location set 장치를 콤마 계정과 페어링합니다 - - - <ol type='1' style='margin-left: 15px;'> - <li style='margin-bottom: 50px;'>Go to https://connect.comma.ai on your phone</li> - <li style='margin-bottom: 50px;'>Click "add new device" and scan the QR code on the right</li> - <li style='margin-bottom: 50px;'>Bookmark connect.comma.ai to your home screen to use it like an app</li> - </ol> - - - <ol type='1' style='margin-left: 15px;'> - <li style='margin-bottom: 50px;'>https://connect.comma.ai에 접속하세요</li> - <li style='margin-bottom: 50px;'>"새 장치 추가"를 클릭하고 오른쪽 QR 코드를 검색합니다.</li> - <li style='margin-bottom: 50px;'>connect.comma.ai을 앱처럼 사용하려면 홈 화면에 바로가기를 만드십시오.</li> - </ol> - + + Go to https://connect.comma.ai on your phone + https://connect.comma.ai에 접속하세요 + + + + Click "add new device" and scan the QR code on the right + "새 장치 추가"를 클릭하고 오른쪽 QR 코드를 검색합니다 + + + + Bookmark connect.comma.ai to your home screen to use it like an app + connect.comma.ai을 앱처럼 사용하려면 홈 화면에 바로가기를 만드십시오 PrimeAdWidget - + Upgrade Now 지금 업그레이드 - + Become a comma prime member at connect.comma.ai connect.comma.ai에서 comma prime에 가입합니다 - + PRIME FEATURES: PRIME 기능: - + Remote access 원격 접속 - + 1 year of storage 1년간 저장 - + Developer perks 개발자 혜택 @@ -600,22 +593,22 @@ location set PrimeUserWidget - + ✓ SUBSCRIBED ✓ 구독함 - + comma prime comma prime - + CONNECT.COMMA.AI CONNECT.COMMA.AI - + COMMA POINTS COMMA POINTS @@ -857,17 +850,17 @@ location set SetupWidget - + Finish Setup 설정 완료 - + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. 장치를 (connect.comma.ai)에서 페어링하고 comma prime 오퍼를 청구합니다. - + Pair device 장치 페어링 @@ -1023,13 +1016,13 @@ location set
- Uninstall - 제거 + UNINSTALL + 제거 - UNINSTALL - 제거 + Uninstall %1 + 제거 %1 @@ -1274,8 +1267,8 @@ location set - Forget Wi-Fi Network " - wifi 네트워크 저장안함 " + Forget Wi-Fi Network "%1"? + wifi 네트워크 저장안함 "%1"? diff --git a/selfdrive/ui/translations/main_zh-CHS.qm b/selfdrive/ui/translations/main_zh-CHS.qm index 2c7963cf17a496e356fb5b0372b565ac82514661..eed52b27788c46e02689a14fb9f11e17c776755a 100644 GIT binary patch delta 2088 zcmYLJ4OCQR8h+-^z4LQt<_;(zBIwKjA%Y-?3OT?L6a5v5t5eF!7x6L%^C2JkbL@>&65@Jm@YFdC+|kFy|E@Y!#6D zDlh&Vc#6q_{ei3qCK)EK06ae)D^25;|zy3gyak-FvU!iE0Nr_76?f~ z^6jHQWDw@+my&A@Qm6A_{H2yBFzee$JFo!ojzmVWi;umA%xk>W^AP5}{4d6pBU|`@ zB8DM*X*F-NAg84X&}U*{%1&|?@a%z?0H^&wSbV072RczP#6XiB`_EqlV!uGEgOv!9 z(J?xMw5xDqa~bz*RbDZnfGtGjy*B^|XjDzx%IbyPR%LYtbG=)&=VPux4yad~sNv@W&pOe%y4SvDgg6 zO%vL;*nlaD@P5ixz?>*t&f*2*E(uqBVvF2J9M8@lBcr(GxtcQ z+BFokTuM{|$$L;*xP%3Y(n*E#`*cpf^n5@w5bh;Cf4GGet|a~h=q5^)%PaW)G-+*= z!Zz3?)&8DD^o=9v`_%}JH;-WKJgFh1i3Ra^OKR9gYZ&6Bri~k@#AnjkAqp;RllrcZ zfaM42>-BVuZPf_cPf3GABox}C5v49 zq{&lJZ(EC|@%}@e8`KPDd`w4tsY`qF8oRQ(lq4h`v`JS!xeFI41ZfA0qT?#ML*958+oF_!VO<=R`cuwRk9^C3&> zUoG!`uaU$q%MHB?SeklyZ#PS<9+D5gx|7NslutOPNbKHp`D`HrB~k8>$8(mPkvqKX zY_?4EfSQP^-2LIFN=!H{;q%UhYB?b(O`#BA)7Q>p$A|(wqRKMuK_y>m0 zZ&;#$2ZoQHrg9!%8a+;vKuC+x+RAnRR^#N@N_wN)=uArd2k_)^V`}tbV8%sbS^|}b zUSZ6sV?w`3J^_&RAAIsitT{8OUP{PqZ%9?~ZG_R!8)MrwGM&-{< zydZKwIr$?!;ZtSSeb0HQ?KFGLV*5@#ZuYwQkkjQwvv*E5r$c(XdG2*43XeBuIOuZS zI&(?k4NBy0-rl=`9#~=iLqQ3p8aAI={a-4z#QfncD+!!6U%9=P-SL|FYSLRk%!MKv zsjKZtZI|NuWZc-kuD-X(eHUt~VL>1wU`d~pm%H|fVHGV( zPx0@YUQn>ilJBq-7vz^ZEP)X&Z!c?Gz1I{?z$j-{)fd^O%I}ALVEZ}T_Bc$peARC( zw!nzCo4zlo1Z29bmQ4BaZldd~HPN-s=B2W^_D`_=vJvgdvqnGKaETM*e_0NF%^Lb> zwJpLXd0OT97294OA^bR_aY0E@NvR{hxR?~%vS!S43-W!gxArf{MG=xv^oS}${!bI} Vj{|*Nr<1+JzzAEs>yzY+{{iv64I%&l delta 2662 zcmcIk3sjTm8Ge)ee=a}CAJ7n5x%~t%Ah%G#aS4cU#EKmkMPQ<}Fe1hVf)ER-mXuj* zDb~vg4pymJfnvw3J79J5Xs0bw(P8VU-RKybQY~W3Y;|X)BDe>zJ#;(U&UVg{!+FT} zy_e^E-sk)3c8FSci*{=q0+G0c$n6Q>IMKXtB1thY6Icl>2Q~ofi5Tqj3L-XwDCB)$ zJW(hQ%twrA8g+=5-XU^DO_?`vComRx6nKV6g*YX0{a+xOdxdC~D}wb1bn^uw(Crzb z#n?0)AWC})ja-SISONSIQC1|1JOHjIa=!)KhV?^4me8BxUq@IxXS_O%=KjQBj} z-%iZ-eME^DiD|q}B;ttaib7U2F}=S6Rul69L*(-nu`ff4&^Mh4A`eFr$wENRb+pI&4o81t(G0>Jv8;c?+W9`7aR7xhv+1&k+SRi34v8l7k}q#HpMO%=U;^ zyW+%#bK=*oVD#P=@rfNE_E@6$ouwG9dX4y_EEM)(#REOCL3o4s>OprR&pZhe?m?sp zm3V)_BJYeuSGN!f>Lr`9Q1=J(CG9+jhYU$Nj>Br|%aW5F$TQ?iy7bk~Yhq7FJM&aq zCm5V&%u6A#tBSD?CK3r}nJtB2B(*c!nY%;_4l<2PPr-mu)5woaqo#2heeW|(Eu&!O z!5q3?1k7cA@xfjq-9F~n(=CuRiTSk>vr!#qE`HXJ^>3JqxBh||xb-lD3y;BY4whR0 z%@Z!Ls=AHPu#HXO12IGcoA(rEvLJ>n=H7u>2H6b(tGnnPuQlA7R*3%o^9F%SGXjyEiZ0^61Ui+?_VW~ z7-iobhvwp4?0bHf;i_|N{{RU2>)B7Y_P_+K)0lXhy*Cbm5u8-)mkoCvmh!j5p`cl6 z98QITe~>QeI879{N}4Z%_5lOZ=FtfvKZEpM#>Wo0OeNC=L#m)4S?ipwI9Z$QXz8bD zoFluv{1Buw$-ce?MIWAQ^oUZ2ZTg1c}Hj?2>|AgZpHn?}Y!Fh~B%rdP3FEI-hW zIUZhBTR;AX`G)Xpsm!Q&+5xuOqyaZ-V+9md<@8xKstHF%b* z8&c!<0j_=mqYXU4HJ)k)p%JdBZzV=_ncLrsQA@_TBaWBqAz43n(!hdQHTP~Y5?O}p z;(YLooaMT-Mi6?7yZK`q8cn!}j#nc-)5ZVHIe6l>OX{C$iDpS$)(ql7@XvAC_z?r* zg)TMEXpleV()|TSqmOhs|3fII8C7b|fI!%Q(ys&Sfj5e!e8RjW}+Yb!?owC0h z1eu*GX=?x;0Do14_wPX@RuwxAqMi+^BT?A*8&RF81ja6RsJe7-z`ZL}UCBT_r@CN- z7dWHpN*=DIW-agjW-Hb&^K-UCfmz@1y3rIU^=CfjDqf<99)8&lC^$Qc-zjm`#=QW!7%t!I@fFcoL!!eIs>$B{#?!7)ou+` zTSLNk5q!GIR3sGG1dFMl!X`Kct$Sy!)*$s#I7= zdB-b9R57(?dAL?W1yoMOWTsLILxzdgVLuLW zkra*0DvC!|;y+ZM>|{i=`C+~J_Nmm#Cf_eu2pTqgtyrHd8cl|8i#jWPlb%GCh^adN zsl)%!fD)Y(KDz&Ri!`51$G<$q=yi2 zQczxOE)BDo*4g5O$mp`Fczxo-a6vFy%-@f54J)+TY}S%EA=)q%>OAWk8expEnEy@E zKjqBxjrp&0T6|KpGy51Ltd{AXog==U?w-;WRlA;>;c{+eskyYmR$#FR&aa|8I+LQ~ wUFXkQ+gJBX%7vLy$vo-y89vvhTFZ+~HX+v>mTDH#O}0vF`O`4|sl^$82ZSevfB*mh diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index d9377054a5..0870ff7028 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -308,13 +308,8 @@
- Need at least - 至少需要 - - - - characters! - 个字符! + Need at least %1 characters! + 至少需要 %1 个字符! @@ -479,8 +474,8 @@ location set - for " - 网络名称:" + for "%1" + 网络名称:"%1" @@ -545,52 +540,50 @@ location set 将您的设备与comma账号配对 - - - <ol type='1' style='margin-left: 15px;'> - <li style='margin-bottom: 50px;'>Go to https://connect.comma.ai on your phone</li> - <li style='margin-bottom: 50px;'>Click "add new device" and scan the QR code on the right</li> - <li style='margin-bottom: 50px;'>Bookmark connect.comma.ai to your home screen to use it like an app</li> - </ol> - - - <ol type='1' style='margin-left: 15px;'> - <li style='margin-bottom: 50px;'>在手机上访问 https://connect.comma.ai</li> - <li style='margin-bottom: 50px;'>点击“添加新设备”,扫描右侧二维码</li> - <li style='margin-bottom: 50px;'>将 connect.comma.ai 收藏到您的主屏幕,以便像应用程序一样使用它</li> - </ol> - + + Go to https://connect.comma.ai on your phone + 在手机上访问 https://connect.comma.ai + + + + Click "add new device" and scan the QR code on the right + 点击“添加新设备”,扫描右侧二维码 + + + + Bookmark connect.comma.ai to your home screen to use it like an app + 将 connect.comma.ai 收藏到您的主屏幕,以便像应用程序一样使用它 PrimeAdWidget - + Upgrade Now 现在升级 - + Become a comma prime member at connect.comma.ai 打开connect.comma.ai以注册comma prime会员 - + PRIME FEATURES: comma prime特权: - + Remote access 远程访问 - + 1 year of storage 1年数据存储 - + Developer perks 开发者福利 @@ -598,22 +591,22 @@ location set PrimeUserWidget - + ✓ SUBSCRIBED ✓ 已订阅 - + comma prime comma prime - + CONNECT.COMMA.AI CONNECT.COMMA.AI - + COMMA POINTS COMMA POINTS点数 @@ -855,17 +848,17 @@ location set SetupWidget - + Finish Setup 完成设置 - + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. 将您的设备与comma connect (connect.comma.ai)配对并领取您的comma prime优惠。 - + Pair device 配对设备 @@ -1021,13 +1014,13 @@ location set
- Uninstall - 卸载 + UNINSTALL + 卸载 - UNINSTALL - 卸载 + Uninstall %1 + 卸载 %1 @@ -1272,8 +1265,8 @@ location set - Forget Wi-Fi Network " - 忘记WiFi网络" + Forget Wi-Fi Network "%1"? + 忘记WiFi网络 "%1"? diff --git a/selfdrive/ui/translations/main_zh-CHT.qm b/selfdrive/ui/translations/main_zh-CHT.qm index 0d448f2080322661cb712bd3c06b4049fabbf935..029332de238d74b5cf8c40073a31d27ea6f0bf4f 100644 GIT binary patch delta 2149 zcmZ`(eNa^Q6}@lwz1@9p-|hol5Y`3u0}RLlqJ#o2GC+iYDK3={Ctxe;x}tn2ELE#< zON}LnQFNsmgG3_)O=1%vV&X@l2Bl(=IGWTBLuw5wX0#gZBoxK;;Lg~;%FNDT-tXSu zJ@?%6yM2w!ku6N4&K*u9D<|?5fMY~2oFtMvf!_jG1D^nQ5rylCSe$F_6LB#_5i@`@ zfxib9A?7z;47p3Bcu3?ENu&${z5+}HqK5J`^5+tXJw(Q*L{qL3z3THZii`&i0uksN zM>P9&qNqni*>9jQey_{}UL?wm#U&t+yNt;12yhb!=!nYpBcCU##-%=6iCj4Me_{K* zV7DoZ*t)lgY)6URJw(K4iS0&(@OEPRJ_SA?wx1<3loPkvNHjHwxWny4>H<=9K?3y# zQX1!@+88M#L08>M(yrszp1!RM6f^#M@|o)=tEIL$4lO zPn7IO3(j0X!7^GihCEF;?eD#W?<3UV`ZcudrS6H))(}rOH`n02n(2GIwUY4#I6R!FdiBTV-K4 zZxF>ymt_bp=$a!d_Cd$dfwH|_C}BG%HtjY>OFjdt{$yVFr>#b|p6-1txoB zgBReC$UCy@`}~LkwQ@Fk64AsFdC*-B=XSZdAqAbiDX+;zfw&%d^O;5zx-9=di%ud6 z??8UkN1i@eh`X9y*xre#-?61xP+RI}*WQ>#6g-<CWSzN=PK!o4sMZ@vK7wK z?ckcX!5L~R*ZRjzP@{6N|n&7Ok zE@hj3BRcw7`BBApC~Q~$^gR@icPSswybWj6snR35@x~HV+4AccQGv>F?=h@yQ@vTU z2j{-3cRoP=#6;E6n-&=38(yiw8kyYBTbfmPQ*ZI1&;vJGmcYXcH&YRlO&$1dStv#&uZ1^G ziSCT_%S1_s#O#CxM89Yi=cGZ21iM(!gbNMBVtLLuF{ij|v=A3aV#jv8F#{uB*azjJ z{viH!0B8*t2hM{ayF;UB3q`?unwX%!fk?6@aSTKQ=V=bd;XK5tIkp-Y|D&ec{2oj@ z+pXzN!#|-rG`+Sa?8B*=tMl<3brD*>Lv84&NUN`d0uzpD%_HepbBnbJ*R3c#SvzM7 zB%Cm!U6nQ)d5^U9Z{u-KS*(4(6$Pg6)t>qhp3vJR)dQ?UWtXH&#q*s}Df!=eN;FN7 z0t)hoCgs#iFAw3O=pJdV3ochxNfpkUaO-8M@!BSMV43umqXJU>Abqj&36#o_dTyIQ zAX^$7Zh`b^()El#6D4+*!btZ!laz15=%C}0=W*VaBN z_9Y{QQ7jql>Y~Ej^q(166rRG*kmGPHF_yTDWsZ_+moY5XGva6JT<0IB2oYafiZt`H zMDz0m)zZo;qd6?r?1?q#I{$9SU=);BtR$o7ez3_i)fgi@4^8*HZ%Ut}L>19qQd(77 z;j~w-tXcVtS(2wbBtZclG)VP4oAL1|hFlNu`Oug0H2BkcY)@M{!IUO!zVQExGsWHdlT3uPS N;#p@Yp3%&C{{>l+97q5F delta 2681 zcmcIl3s98T89lrE|GVtJyZ?$V+ZJ{Cc_{dR1p@|QL4|^XElTj!phgJ`Zd@M18emX2 zj8S9oy&B&d6>4l^oq)kKiPkF7V1h9dlGveGix1SA+GwX*t+od+iD{?pv@?a-IqbdP zLS2DjQ9W;atqKD0z)mt3gQUjCgLPO;J)c5AliXpE@C3F ziI~fnXL>Ot1kkcZpEN)>kXS$*MO;oi#{7wZ@e~jm3k+@pp6+uR2=5NOLu8J-tI5y} zBV9usqRm8U9>%p)1CfCkcl9kGR)g{SJhHDw=E#lc{>iLJffqx!V4~Z{bDzSb-;qGT zHaxZHPfW_)x!NfD9Wd{0rOG$ zfcd5f>^^-47!!d8&n(UjXzoXCZEjqCc>(v!Rn}3%y+Bxi>iavxDE2m0+-eRqdXFmm zB%{L)tG0f|_4roRnaKhRJ5=Y?dw~JBRM(z(5eRHoONH+P5qauCmpg%&JaxL{p%Txi zXY}ETqchYy+VsG{5$eM$Ni62H`e?>#z?`K1G@Eq?wx~N=(&&t+AoYb;1AzWN)Cf`E z11x=iEc9=(7e;YJo|5b9qJ(ODq;4% zMz*gNTp3i?d`+n8Oa_!{VPPKWXqO7hh1;x>FKo_ukA95mMY+8fEem@ws6p6Xcb9`Z zDD1hEPwW!j_;@1_GC?>rua0`o5Po6gTueKK53jUyeZTPG^*;b!|J_38=tJ~hwJ43G z;7Om0rrP<`uR=_f2a)zUar$fyB<{LcC>^C!PK(cl)l;W4;&a`O(mRRtxL=@HRZz)e z4-ugXiP8{+mgbcA8JShs8`m3Uh`cfP$-Q#S_7w&{6ebdj|=Hd?8+3(!xRiq!&jU#Cs1&FlxP49Xy%NYSzj(qo`o0 z)^RPJ3SQBUYd8WVq-b+h)IDsScJJMX-0#%hoA?=>6w#^+8A7STZ|Ld+mvG{C-NE9E zY&=PK^Qk?Qu10s~Iu+40>Fy_X(Md=AQinA2t`+-bYDm;v>gW9OJ_$PfRxQ}d{c(P~ zUT2+tIeu?l4&`^FUT5MnViWbD+x>tiTJ&RY6*7LVe#!*zB}yNypSpySjrmBQJA)Dr zI;qb;nLD7UuuOaPkI6Gx((G|3TTdMan^ z__Z-JekL%g%{U>2N+i5soVt+(gKWm4tZrh3#!dI8u|S%!VIA+7?MY+Ht5nY3VEm|^ z7&Xh-ev$-*^(Jk77%#uhWFPnii6oguJs{EkD@+GsxgWg4bhv^zYOvST9P(4TH_g9m7hkcOJtrt?}_QssdC^&G`IIdC}@==+HrayOMq`Q-QueB12V@`ROCuwP$! zeo7kiZp$mS@sdYuk#}^Bp*KYNXLW28+bSRVGd(e2nS5r$qKJ>y?MVhy?TaODq_D$2`$Pm;05OiwiGPDxG=lxux{NT=N!ZF%|pD{L9k6QnAJ6 zj;lL)D=N(w(ti#lUUUIt`!%NM_R9ehlu3r%Y1yfNQ_*)c3_nKScx$lFBmKZ9Sp7q# zO;}M=b9;tAly4&BET=PHnd4F1&N<~CWxX|^(PfR*251)*KtaeiabiJ9nbP>~fLxVV zoe%bU?AL)3xcS|KDwM*BB!nY|9|h$-YwkyDMVNy!6vBmKL^8vP0`4a;E(USTtVANS zlK-K4cP9sAB`#9_+?%tlhWX0O}`=EMDe{D|X8vSD~m!=fEipxE7+-{}u&Dbk_ z5(A4x{=ZT%jkbzJdbhb2HLSYHm2WL?O)n`cbb6F&uE=zklI8SNl$6a=LVV}ba{dnW C?SW|k diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index efd893ec4c..0620382a63 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -308,13 +308,8 @@ - Need at least - 需要至少 - - - - characters! - 個字元! + Need at least %1 characters! + 需要至少 %1 個字元! @@ -481,8 +476,8 @@ location set - for " - 給 " + for "%1" + 給 "%1" @@ -547,52 +542,50 @@ location set 將設備與您的 comma 帳號配對 - - - <ol type='1' style='margin-left: 15px;'> - <li style='margin-bottom: 50px;'>Go to https://connect.comma.ai on your phone</li> - <li style='margin-bottom: 50px;'>Click "add new device" and scan the QR code on the right</li> - <li style='margin-bottom: 50px;'>Bookmark connect.comma.ai to your home screen to use it like an app</li> - </ol> - - - <ol type='1' style='margin-left: 15px;'> - <li style='margin-bottom: 50px;'>用手機連至 https://connect.comma.ai</li> - <li style='margin-bottom: 50px;'>點選 "add new device" 後掃描右邊的二維碼</li> - <li style='margin-bottom: 50px;'>將 connect.comma.ai 加入您的主屏幕,以便像手機 App 一樣使用它</li> - </ol> - + + Go to https://connect.comma.ai on your phone + 用手機連至 https://connect.comma.ai + + + + Click "add new device" and scan the QR code on the right + 點選 "add new device" 後掃描右邊的二維碼 + + + + Bookmark connect.comma.ai to your home screen to use it like an app + 將 connect.comma.ai 加入您的主屏幕,以便像手機 App 一樣使用它 PrimeAdWidget - + Upgrade Now 馬上升級 - + Become a comma prime member at connect.comma.ai 成為 connect.comma.ai 的高級會員 - + PRIME FEATURES: 高級會員特點: - + Remote access 遠程訪問 - + 1 year of storage 一年的雲端行車記錄 - + Developer perks 開發者福利 @@ -600,22 +593,22 @@ location set PrimeUserWidget - + ✓ SUBSCRIBED ✓ 已訂閱 - + comma prime comma 高級會員 - + CONNECT.COMMA.AI CONNECT.COMMA.AI - + COMMA POINTS COMMA 積分 @@ -860,17 +853,17 @@ location set SetupWidget - + Finish Setup 完成設置 - + Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer. 將您的設備與 comma connect (connect.comma.ai) 配對並領取您的 comma 高級會員優惠。 - + Pair device 配對設備 @@ -1026,13 +1019,13 @@ location set - Uninstall - 卸載 + UNINSTALL + 卸載 - UNINSTALL - 卸載 + Uninstall %1 + 卸載 %1 @@ -1277,8 +1270,8 @@ location set - Forget Wi-Fi Network " - 清除 Wi-Fi 網路 " + Forget Wi-Fi Network "%1"? + 清除 Wi-Fi 網路 "%1"? diff --git a/selfdrive/ui/update_translations.py b/selfdrive/ui/update_translations.py index d872be0d86..f06d54b2d5 100755 --- a/selfdrive/ui/update_translations.py +++ b/selfdrive/ui/update_translations.py @@ -10,7 +10,7 @@ TRANSLATIONS_DIR = os.path.join(UI_DIR, "translations") LANGUAGES_FILE = os.path.join(TRANSLATIONS_DIR, "languages.json") -def update_translations(release=False, translations_dir=TRANSLATIONS_DIR): +def update_translations(release=False, vanish=False, translations_dir=TRANSLATIONS_DIR): with open(LANGUAGES_FILE, "r") as f: translation_files = json.load(f) @@ -20,7 +20,10 @@ def update_translations(release=False, translations_dir=TRANSLATIONS_DIR): continue tr_file = os.path.join(translations_dir, f"{file}.ts") - ret = os.system(f"lupdate -recursive {UI_DIR} -ts {tr_file}") + args = f"lupdate -recursive {UI_DIR} -ts {tr_file}" + if vanish: + args += " -no-obsolete" + ret = os.system(args) assert ret == 0 if release: @@ -32,6 +35,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser(description="Update translation files for UI", formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("--release", action="store_true", help="Create compiled QM translation files used by UI") + parser.add_argument("--vanish", action="store_true", help="Remove translations with source text no longer found") args = parser.parse_args() - update_translations(args.release) + update_translations(args.release, args.vanish) From 97d7ee369b9b8193fe1580fbaa00e65a26235432 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 12 Jul 2022 23:11:55 -0700 Subject: [PATCH 24/47] Chrysler: send LKAS control bit while above minSteerSpeed (#25150) * Chrysler: send LKAS control bit while above minSteerSpeed * update refs * rework that a bit * little more * update refs --- selfdrive/car/chrysler/carcontroller.py | 11 ++++++----- selfdrive/car/chrysler/chryslercan.py | 4 ++-- selfdrive/test/process_replay/ref_commit | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index 8156e7841e..00893b6bc4 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -14,7 +14,7 @@ class CarController: self.hud_count = 0 self.last_lkas_falling_edge = 0 - self.lkas_active_prev = False + self.lkas_control_bit_prev = False self.last_button_frame = 0 self.packer = CANPacker(dbc_name) @@ -24,7 +24,8 @@ class CarController: can_sends = [] # EPS faults if LKAS re-enables too quickly - lkas_active = CC.latActive and not low_speed_alert and (self.frame - self.last_lkas_falling_edge > 200) + lkas_control_bit = not low_speed_alert and (self.frame - self.last_lkas_falling_edge > 200) + lkas_active = CC.latActive and self.lkas_control_bit_prev # *** control msgs *** @@ -59,12 +60,12 @@ class CarController: self.apply_steer_last = apply_steer idx = self.frame // 2 - can_sends.append(create_lkas_command(self.packer, self.CP, int(apply_steer), lkas_active, idx)) + can_sends.append(create_lkas_command(self.packer, self.CP, int(apply_steer), lkas_control_bit, idx)) self.frame += 1 - if not lkas_active and self.lkas_active_prev: + if not lkas_control_bit and self.lkas_control_bit_prev: self.last_lkas_falling_edge = self.frame - self.lkas_active_prev = lkas_active + self.lkas_control_bit_prev = lkas_control_bit new_actuators = CC.actuators.copy() new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX diff --git a/selfdrive/car/chrysler/chryslercan.py b/selfdrive/car/chrysler/chryslercan.py index 632c0d2bcf..1e26a6d275 100644 --- a/selfdrive/car/chrysler/chryslercan.py +++ b/selfdrive/car/chrysler/chryslercan.py @@ -52,12 +52,12 @@ def create_lkas_hud(packer, CP, lkas_active, hud_alert, hud_count, car_model, au return packer.make_can_msg("DAS_6", 0, values) -def create_lkas_command(packer, CP, apply_steer, lat_active, frame): +def create_lkas_command(packer, CP, apply_steer, lkas_control_bit, frame): # LKAS_COMMAND Lane-keeping signal to turn the wheel enabled_val = 2 if CP.carFingerprint in RAM_CARS else 1 values = { "STEERING_TORQUE": apply_steer, - "LKAS_CONTROL_BIT": enabled_val if lat_active else 0, + "LKAS_CONTROL_BIT": enabled_val if lkas_control_bit else 0, } return packer.make_can_msg("LKAS_COMMAND", 0, values, frame % 0x10) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index e77a38de5f..c99a1653f4 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -5efbbdf69e16db3d989bfaf62d10e958e80b9ca2 \ No newline at end of file +7fbe776f271ed2d45abe989736133a5cfa0ec826 \ No newline at end of file From e710ba549a3e0b1aba50ba8d4ed47e695a02c538 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Jul 2022 00:20:35 -0700 Subject: [PATCH 25/47] Car docs diff bot: skip PRs from forks (#25151) * check permissions explicitly * fix syntax * Fix * Diff * fix * revert --- .github/workflows/selfdrive_tests.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 298ea5fb49..fc151cc2e2 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -10,7 +10,6 @@ env: CL_BASE_IMAGE: openpilot-base-cl DOCKER_REGISTRY: ghcr.io/commaai AZURE_TOKEN: ${{ secrets.AZURE_COMMADATACI_OPENPILOTCI_TOKEN }} - HAS_AZURE_TOKEN: $AZURE_TOKEN != '' DOCKER_LOGIN: docker login ghcr.io -u adeebshihadeh -p ${{ secrets.CONTAINER_TOKEN }} BUILD: | @@ -366,7 +365,7 @@ jobs: name: process_replay_diff.txt path: selfdrive/test/process_replay/diff.txt - name: Upload reference logs - if: ${{ failure() && github.event_name == 'pull_request' && github.repository == 'commaai/openpilot' && env.HAS_AZURE_TOKEN }} + if: ${{ failure() && github.event_name == 'pull_request' && github.repository == 'commaai/openpilot' && env.AZURE_TOKEN != '' }} run: | ${{ env.RUN }} "scons -j$(nproc) && \ CI=1 AZURE_TOKEN='$AZURE_TOKEN' python selfdrive/test/process_replay/test_processes.py -j$(nproc) --upload-only" @@ -551,22 +550,22 @@ jobs: output="${output//$'\n'/'%0A'}" echo "::set-output name=diff::$output" - name: Find comment - if: env.HAS_AZURE_TOKEN - uses: peter-evans/find-comment@v1 + if: ${{ env.AZURE_TOKEN != '' }} + uses: peter-evans/find-comment@1769778a0c5bd330272d749d12c036d65e70d39d id: fc with: issue-number: ${{ github.event.pull_request.number }} body-includes: This PR makes changes to - name: Update comment - if: steps.save_diff.outputs.diff != '' && env.HAS_AZURE_TOKEN - uses: peter-evans/create-or-update-comment@v1 + if: ${{ steps.save_diff.outputs.diff != '' && env.AZURE_TOKEN != '' }} + uses: peter-evans/create-or-update-comment@b95e16d2859ad843a14218d1028da5b2c4cbc4b4 with: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: "${{ steps.save_diff.outputs.diff }}" edit-mode: replace - name: Delete comment - if: steps.fc.outputs.comment-id != '' && steps.save_diff.outputs.diff == '' && env.HAS_AZURE_TOKEN + if: ${{ steps.fc.outputs.comment-id != '' && steps.save_diff.outputs.diff == '' && env.AZURE_TOKEN != '' }} uses: actions/github-script@v6 with: script: | From a7b778c324bf4eaba7f5db32ec60f88212e2c6fe Mon Sep 17 00:00:00 2001 From: Jafar Al-Gharaibeh Date: Wed, 13 Jul 2022 01:31:52 -0600 Subject: [PATCH 26/47] Mazda: Support CX-9 2022 (#25147) * Mazda: Support CX-9 2022 dongle-id: 8c6e0e30decb68f7 Signed-off-by: Jafar Al-Gharaibeh * update years Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/mazda/values.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index e24672e9bc..754052085d 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -198,7 +198,7 @@ How We Rate The Cars |Lexus|RX 2016-18|All|[3](#footnotes)||||| |Lexus|RX Hybrid 2016-19|All|[3](#footnotes)||||| |Mazda|CX-5 2022|All|||||| -|Mazda|CX-9 2021|All|||||| +|Mazda|CX-9 2021-22|All|||||| |Ram|1500 2019-22|Adaptive Cruise|||||| |Subaru|Crosstrek 2018-19|EyeSight|||||| |Subaru|Impreza 2017-19|EyeSight|||||| diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 12e9eafc4f..e1d6907991 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -40,7 +40,7 @@ CAR_INFO: Dict[str, Union[MazdaCarInfo, List[MazdaCarInfo]]] = { CAR.CX9: MazdaCarInfo("Mazda CX-9 2016-17"), CAR.MAZDA3: MazdaCarInfo("Mazda 3 2017"), CAR.MAZDA6: MazdaCarInfo("Mazda 6 2017"), - CAR.CX9_2021: MazdaCarInfo("Mazda CX-9 2021"), + CAR.CX9_2021: MazdaCarInfo("Mazda CX-9 2021-22"), CAR.CX5_2022: MazdaCarInfo("Mazda CX-5 2022"), } @@ -267,6 +267,7 @@ FW_VERSIONS = { (Ecu.engine, 0x7e0, None): [ b'PXM4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'PXM4-188K2-D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM6-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'K131-67XK2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', @@ -279,9 +280,11 @@ FW_VERSIONS = { b'GSH7-67XK2-M\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'GSH7-67XK2-P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'GSH7-67XK2-S\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.transmission, 0x7e1, None): [ b'PXM4-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PXM6-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], } } From 3a8f17111c3439cb22eb627aec805898d9d9a41a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Jul 2022 01:10:56 -0700 Subject: [PATCH 27/47] Log VIN response address (#25148) * log vin rx addr * clean up --- selfdrive/car/car_helpers.py | 8 ++++---- selfdrive/car/fw_versions.py | 6 +++--- selfdrive/car/isotp_parallel_query.py | 2 +- selfdrive/car/vin.py | 10 +++++----- selfdrive/debug/disable_ecu.py | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index b6bdece676..1a9a5f50f3 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -93,17 +93,17 @@ def fingerprint(logcan, sendcan): if cached_params is not None and len(cached_params.carFw) > 0 and cached_params.carVin is not VIN_UNKNOWN: cloudlog.warning("Using cached CarParams") - vin = cached_params.carVin + vin, vin_rx_addr = cached_params.carVin, 0 car_fw = list(cached_params.carFw) else: cloudlog.warning("Getting VIN & FW versions") - _, vin = get_vin(logcan, sendcan, bus) + _, vin_rx_addr, vin = get_vin(logcan, sendcan, bus) ecu_rx_addrs = get_present_ecus(logcan, sendcan) car_fw = get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs) exact_fw_match, fw_candidates = match_fw_to_car(car_fw) else: - vin = VIN_UNKNOWN + vin, vin_rx_addr = VIN_UNKNOWN, 0 exact_fw_match, fw_candidates, car_fw = True, set(), [] if len(vin) != 17: @@ -166,7 +166,7 @@ def fingerprint(logcan, sendcan): source = car.CarParams.FingerprintSource.fixed cloudlog.event("fingerprinted", car_fingerprint=car_fingerprint, source=source, fuzzy=not exact_match, - fw_count=len(car_fw), ecu_responses=list(ecu_rx_addrs), error=True) + fw_count=len(car_fw), ecu_responses=list(ecu_rx_addrs), vin_rx_addr=vin_rx_addr, error=True) return car_fingerprint, finger, vin, car_fw, source, exact_match diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index a8f5357f0e..5a33cdf6b7 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -444,7 +444,7 @@ def get_fw_versions(logcan, sendcan, query_brand=None, extra=None, timeout=0.1, if addrs: query = IsoTpParallelQuery(sendcan, logcan, r.bus, addrs, r.request, r.response, r.rx_offset, debug=debug) - fw_versions.update({(r.brand, addr): (version, r) for addr, version in query.get_data(timeout).items()}) + fw_versions.update({(r.brand, addr): (version, r) for (addr, _), version in query.get_data(timeout).items()}) except Exception: cloudlog.warning(f"FW query exception: {traceback.format_exc()}") @@ -497,8 +497,8 @@ if __name__ == "__main__": t = time.time() print("Getting vin...") - addr, vin = get_vin(logcan, sendcan, 1, retry=10, debug=args.debug) - print(f"VIN: {vin}") + addr, vin_rx_addr, vin = get_vin(logcan, sendcan, 1, retry=10, debug=args.debug) + print(f'TX: {hex(addr)}, RX: {hex(vin_rx_addr)}, VIN: {vin}') print(f"Getting VIN took {time.time() - t:.3f} s") print() diff --git a/selfdrive/car/isotp_parallel_query.py b/selfdrive/car/isotp_parallel_query.py index 0e807512cf..bb96572c33 100644 --- a/selfdrive/car/isotp_parallel_query.py +++ b/selfdrive/car/isotp_parallel_query.py @@ -126,7 +126,7 @@ class IsoTpParallelQuery: msg.send(self.request[counter + 1]) request_counter[tx_addr] += 1 else: - results[tx_addr] = dat[len(expected_response):] + results[(tx_addr, msg._can_client.rx_addr)] = dat[len(expected_response):] request_done[tx_addr] = True else: error_code = dat[2] if len(dat) > 2 else -1 diff --git a/selfdrive/car/vin.py b/selfdrive/car/vin.py index fd1ca61e66..007c10e772 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -22,18 +22,18 @@ def get_vin(logcan, sendcan, bus, timeout=0.1, retry=5, debug=False): for request, response in ((UDS_VIN_REQUEST, UDS_VIN_RESPONSE), (OBD_VIN_REQUEST, OBD_VIN_RESPONSE)): try: query = IsoTpParallelQuery(sendcan, logcan, bus, FUNCTIONAL_ADDRS, [request, ], [response, ], functional_addr=True, debug=debug) - for addr, vin in query.get_data(timeout).items(): + for (addr, rx_addr), vin in query.get_data(timeout).items(): # Honda Bosch response starts with a length, trim to correct length if vin.startswith(b'\x11'): vin = vin[1:18] - return addr[0], vin.decode() + return addr[0], rx_addr, vin.decode() print(f"vin query retry ({i+1}) ...") except Exception: cloudlog.warning(f"VIN query exception: {traceback.format_exc()}") - return 0, VIN_UNKNOWN + return 0, 0, VIN_UNKNOWN if __name__ == "__main__": @@ -41,5 +41,5 @@ if __name__ == "__main__": sendcan = messaging.pub_sock('sendcan') logcan = messaging.sub_sock('can') time.sleep(1) - addr, vin = get_vin(logcan, sendcan, 1, debug=False) - print(hex(addr), vin) + addr, vin_rx_addr, vin = get_vin(logcan, sendcan, 1, debug=False) + print(f'TX: {hex(addr)}, RX: {hex(vin_rx_addr)}, VIN: {vin}') diff --git a/selfdrive/debug/disable_ecu.py b/selfdrive/debug/disable_ecu.py index af007207eb..c01c22fdd0 100644 --- a/selfdrive/debug/disable_ecu.py +++ b/selfdrive/debug/disable_ecu.py @@ -16,7 +16,7 @@ def disable_ecu(ecu_addr, logcan, sendcan, bus, timeout=0.5, retry=5, debug=Fals try: # enter extended diagnostic session query = IsoTpParallelQuery(sendcan, logcan, bus, [ecu_addr], [EXT_DIAG_REQUEST], [EXT_DIAG_RESPONSE], debug=debug) - for addr, dat in query.get_data(timeout).items(): # pylint: disable=unused-variable + for _, _ in query.get_data(timeout).items(): # pylint: disable=unused-variable print("ecu communication control disable tx/rx ...") # communication control disable tx and rx query = IsoTpParallelQuery(sendcan, logcan, bus, [ecu_addr], [COM_CONT_REQUEST], [COM_CONT_RESPONSE], debug=debug) From 0edd8201cb8d8f21f361d0be581b02bc43c1b80e Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Wed, 13 Jul 2022 15:12:49 +0200 Subject: [PATCH 28/47] README.md: update directory structure --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 34b17625f9..3dce9d4475 100755 --- a/README.md +++ b/README.md @@ -105,23 +105,25 @@ Directory Structure ├── third_party # External libraries ├── pyextra # Extra python packages └── system # Generic services + ├── camerad # Driver to capture images from the camera sensors + ├── clocksd # Broadcasts current time + ├── hardware # Hardware abstraction classes ├── logcatd # systemd journal as a service └── proclogd # Logs information from /proc └── selfdrive # Code needed to drive the car ├── assets # Fonts, images, and sounds for UI ├── athena # Allows communication with the app ├── boardd # Daemon to talk to the board - ├── camerad # Driver to capture images from the camera sensors ├── car # Car specific code to read states and control actuators - ├── common # Shared C/C++ code for the daemons ├── controls # Planning and controls ├── debug # Tools to help you debug and do car ports ├── locationd # Precise localization and vehicle parameter estimation ├── loggerd # Logger and uploader of car data + ├── manager # Deamon that starts/stops all other daemons as needed ├── modeld # Driving and monitoring model runners - ├── proclogd # Logs information from proc - ├── sensord # IMU interface code + ├── monitoring # Daemon to determine driver attention ├── navd # Turn-by-turn navigation + ├── sensord # IMU interface code ├── test # Unit tests, system tests, and a car simulator └── ui # The UI From a006cd168ea5a2fec2f03b29460a3a685538b9cf Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Wed, 13 Jul 2022 17:55:05 +0200 Subject: [PATCH 29/47] run pre-commit in release CI (#25158) * run pre-commit in release * add pylintrc and init files * build first * add mypy ini * limit amount of debug scripts shipped in release * add python version? * add more missing __init__.py * excluded rednose for cppcheck * remove files before dirty check --- .github/workflows/selfdrive_tests.yaml | 7 +++++++ .pre-commit-config.yaml | 2 +- release/files_common | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index fc151cc2e2..fbc0d94194 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -58,6 +58,9 @@ jobs: run: | TARGET_DIR=$STRIPPED_DIR release/build_devel.sh cp Dockerfile.openpilot_base $STRIPPED_DIR + cp .pre-commit-config.yaml $STRIPPED_DIR + cp .pylintrc $STRIPPED_DIR + cp mypy.ini $STRIPPED_DIR - name: Build Docker image run: | eval "$BUILD" @@ -66,6 +69,10 @@ jobs: run: | cd $STRIPPED_DIR ${{ env.RUN }} "CI=1 python selfdrive/manager/build.py && \ + pre-commit run --all && \ + rm .pre-commit-config.yaml && \ + rm .pylintrc && \ + rm mypy.ini && \ release/check-dirty.sh && \ python -m unittest discover selfdrive/car" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b901e07721..8b8bc1f1b9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,7 +54,7 @@ repos: entry: cppcheck language: system types: [c++] - exclude: '^(third_party/)|(pyextra/)|(cereal/)|(opendbc/)|(panda/)|(tools/)|(selfdrive/modeld/thneed/debug/)|(selfdrive/modeld/test/)|(selfdrive/camerad/test/)/|(installer/)' + exclude: '^(third_party/)|(pyextra/)|(cereal/)|(rednose/)|(rednose_repo/)|(opendbc/)|(panda/)|(tools/)|(selfdrive/modeld/thneed/debug/)|(selfdrive/modeld/test/)|(selfdrive/camerad/test/)/|(installer/)' args: - --error-exitcode=1 - --language=c++ diff --git a/release/files_common b/release/files_common index fb91170561..954726d967 100644 --- a/release/files_common +++ b/release/files_common @@ -57,6 +57,7 @@ common/api/__init__.py release/* +tools/__init__.py tools/lib/* tools/joystick/* tools/replay/*.cc @@ -128,7 +129,15 @@ system/clocksd/.gitignore system/clocksd/SConscript system/clocksd/clocksd.cc -selfdrive/debug/*.py +selfdrive/debug/can_printer.py +selfdrive/debug/check_freq.py +selfdrive/debug/dump.py +selfdrive/debug/filter_log_message.py +selfdrive/debug/get_fingerprint.py +selfdrive/debug/uiview.py + +selfdrive/debug/hyundai_enable_radar_points.py +selfdrive/debug/vw_mqb_config.py common/SConscript common/version.h @@ -187,6 +196,9 @@ selfdrive/controls/lib/lateral_mpc_lib/* selfdrive/controls/lib/longitudinal_mpc_lib/* selfdrive/hardware + +system/__init__.py + system/hardware/__init__.py system/hardware/base.h system/hardware/base.py @@ -220,6 +232,7 @@ selfdrive/locationd/laikad_helpers.py selfdrive/locationd/locationd.h selfdrive/locationd/locationd.cc selfdrive/locationd/paramsd.py +selfdrive/locationd/models/__init__.py selfdrive/locationd/models/.gitignore selfdrive/locationd/models/car_kf.py selfdrive/locationd/models/gnss_kf.py @@ -330,6 +343,7 @@ selfdrive/manager/process.py selfdrive/manager/test/__init__.py selfdrive/manager/test/test_manager.py +selfdrive/modeld/__init__.py selfdrive/modeld/SConscript selfdrive/modeld/modeld.cc selfdrive/modeld/dmonitoringmodeld.cc From 49dd56fc241d5ea3e0ab37e10175ad545ef4d528 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Wed, 13 Jul 2022 17:58:45 +0200 Subject: [PATCH 30/47] nav: draw inactive lanes with 50% opacity (#25157) * nav: draw inactive lanes with 50% opacity * update ts --- .../navigation/direction_turn_left_inactive.png | Bin 0 -> 7221 bytes .../navigation/direction_turn_right_inactive.png | Bin 0 -> 7239 bytes .../direction_turn_straight_inactive.png | Bin 0 -> 5452 bytes selfdrive/ui/qt/maps/map.cc | 4 ++++ selfdrive/ui/translations/main_ko.ts | 10 +++++----- selfdrive/ui/translations/main_zh-CHS.ts | 10 +++++----- selfdrive/ui/translations/main_zh-CHT.ts | 10 +++++----- 7 files changed, 19 insertions(+), 15 deletions(-) create mode 100644 selfdrive/assets/navigation/direction_turn_left_inactive.png create mode 100644 selfdrive/assets/navigation/direction_turn_right_inactive.png create mode 100644 selfdrive/assets/navigation/direction_turn_straight_inactive.png diff --git a/selfdrive/assets/navigation/direction_turn_left_inactive.png b/selfdrive/assets/navigation/direction_turn_left_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..2946984acd3252f257898cec9f6cda866811adc3 GIT binary patch literal 7221 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 Zo~{oAPRia=wfrNXs-&q{q3|yFKLGp@*MI;3 literal 0 HcmV?d00001 diff --git a/selfdrive/assets/navigation/direction_turn_right_inactive.png b/selfdrive/assets/navigation/direction_turn_right_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..7d327766af13be26a23159e354cce5df6453f920 GIT binary patch literal 7239 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

52)T=qZliR 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 literal 0 HcmV?d00001 diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index a486110a73..3967416f73 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -526,6 +526,10 @@ void MapInstructions::updateInstructions(cereal::NavInstruction::Reader instruct fn += "turn_straight"; } + if (!active) { + fn += "_inactive"; + } + auto icon = new QLabel; int wh = active ? 125 : 75; icon->setPixmap(loadPixmap(fn + ICON_SUFFIX, {wh, wh}, Qt::IgnoreAspectRatio)); diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 2fefa69a80..07d6877463 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -338,27 +338,27 @@ MapETA - + eta 도착 - + min - + hr 시간 - + km km - + mi mi diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 0870ff7028..424488fc56 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -338,27 +338,27 @@ MapETA - + eta 埃塔 - + min 分钟 - + hr 小时 - + km km - + mi mi diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 0620382a63..1eab75a6b4 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -338,27 +338,27 @@ MapETA - + eta 埃塔 - + min 分鐘 - + hr 小時 - + km km - + mi mi From 18f2a50501d67345e2fa2e44b6046d412c3452de Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Jul 2022 12:43:36 -0700 Subject: [PATCH 31/47] disable_ecu.py: remove duplicate file (#25154) * remove duplicate function * make executable --- selfdrive/car/disable_ecu.py | 14 ++++++++++++ selfdrive/debug/disable_ecu.py | 40 ---------------------------------- 2 files changed, 14 insertions(+), 40 deletions(-) mode change 100644 => 100755 selfdrive/car/disable_ecu.py delete mode 100644 selfdrive/debug/disable_ecu.py diff --git a/selfdrive/car/disable_ecu.py b/selfdrive/car/disable_ecu.py old mode 100644 new mode 100755 index ac5c6c9f8f..cd3e93fa80 --- a/selfdrive/car/disable_ecu.py +++ b/selfdrive/car/disable_ecu.py @@ -6,6 +6,7 @@ EXT_DIAG_RESPONSE = b'\x50\x03' COM_CONT_RESPONSE = b'' + def disable_ecu(logcan, sendcan, bus=0, addr=0x7d0, com_cont_req=b'\x28\x83\x01', timeout=0.1, retry=10, debug=False): """Silence an ECU by disabling sending and receiving messages using UDS 0x28. The ECU will stay silent as long as openpilot keeps sending Tester Present. @@ -26,9 +27,22 @@ def disable_ecu(logcan, sendcan, bus=0, addr=0x7d0, com_cont_req=b'\x28\x83\x01' cloudlog.warning("ecu disabled") return True + except Exception: cloudlog.exception("ecu disable exception") print(f"ecu disable retry ({i+1}) ...") cloudlog.warning("ecu disable failed") return False + + +if __name__ == "__main__": + import time + import cereal.messaging as messaging + sendcan = messaging.pub_sock('sendcan') + logcan = messaging.sub_sock('can') + time.sleep(1) + + # honda bosch radar disable + disabled = disable_ecu(logcan, sendcan, bus=1, addr=0x18DAB0F1, com_cont_req=b'\x28\x83\x03', timeout=0.5, debug=False) + print(f"disabled: {disabled}") diff --git a/selfdrive/debug/disable_ecu.py b/selfdrive/debug/disable_ecu.py deleted file mode 100644 index c01c22fdd0..0000000000 --- a/selfdrive/debug/disable_ecu.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -import traceback - -import cereal.messaging as messaging -from selfdrive.car.isotp_parallel_query import IsoTpParallelQuery -from system.swaglog import cloudlog - -EXT_DIAG_REQUEST = b'\x10\x03' -EXT_DIAG_RESPONSE = b'\x50\x03' -COM_CONT_REQUEST = b'\x28\x83\x03' -COM_CONT_RESPONSE = b'' - -def disable_ecu(ecu_addr, logcan, sendcan, bus, timeout=0.5, retry=5, debug=False): - print(f"ecu disable {hex(ecu_addr)} ...") - for i in range(retry): - try: - # enter extended diagnostic session - query = IsoTpParallelQuery(sendcan, logcan, bus, [ecu_addr], [EXT_DIAG_REQUEST], [EXT_DIAG_RESPONSE], debug=debug) - for _, _ in query.get_data(timeout).items(): # pylint: disable=unused-variable - print("ecu communication control disable tx/rx ...") - # communication control disable tx and rx - query = IsoTpParallelQuery(sendcan, logcan, bus, [ecu_addr], [COM_CONT_REQUEST], [COM_CONT_RESPONSE], debug=debug) - query.get_data(0) - return True - print(f"ecu disable retry ({i+1}) ...") - except Exception: - cloudlog.warning(f"ecu disable exception: {traceback.format_exc()}") - - return False - - -if __name__ == "__main__": - import time - sendcan = messaging.pub_sock('sendcan') - logcan = messaging.sub_sock('can') - time.sleep(1) - - # honda bosch radar disable - disabled = disable_ecu(0x18DAB0F1, logcan, sendcan, 1, debug=False) - print(f"disabled: {disabled}") From d5719913a97f7cf3c3fc171d0aa562c7d9cafb15 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 13 Jul 2022 13:22:30 -0700 Subject: [PATCH 32/47] Chrysler: never drop control bit on older models (#25159) * Chrysler: never drop control bit on older models * update refs --- selfdrive/car/chrysler/carcontroller.py | 17 ++++++++++++++--- selfdrive/car/chrysler/interface.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index 00893b6bc4..6d158e7cd0 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -2,7 +2,7 @@ from opendbc.can.packer import CANPacker from common.realtime import DT_CTRL from selfdrive.car import apply_toyota_steer_torque_limits from selfdrive.car.chrysler.chryslercan import create_lkas_hud, create_lkas_command, create_cruise_buttons -from selfdrive.car.chrysler.values import RAM_CARS, CarControllerParams +from selfdrive.car.chrysler.values import CAR, RAM_CARS, CarControllerParams class CarController: @@ -20,11 +20,22 @@ class CarController: self.packer = CANPacker(dbc_name) self.params = CarControllerParams(CP) - def update(self, CC, CS, low_speed_alert): + def update(self, CC, CS): can_sends = [] + # TODO: can we make this more sane? why is it different for all the cars? + lkas_control_bit = self.lkas_control_bit_prev + if CS.out.vEgo > self.CP.minSteerSpeed: + lkas_control_bit = True + elif self.CP.carFingerprint in (CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.JEEP_CHEROKEE_2019): + if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0): + lkas_control_bit = False + elif self.CP.carFingerprint in RAM_CARS: + if CS.out.vEgo < (self.CP.minSteerSpeed - 0.5): + lkas_control_bit = False + # EPS faults if LKAS re-enables too quickly - lkas_control_bit = not low_speed_alert and (self.frame - self.last_lkas_falling_edge > 200) + lkas_control_bit = lkas_control_bit and (self.frame - self.last_lkas_falling_edge > 200) lkas_active = CC.latActive and self.lkas_control_bit_prev # *** control msgs *** diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 8826a92523..acc08954a8 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -93,4 +93,4 @@ class CarInterface(CarInterfaceBase): return ret def apply(self, c): - return self.CC.update(c, self.CS, self.low_speed_alert) + return self.CC.update(c, self.CS) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index c99a1653f4..dff232911e 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -7fbe776f271ed2d45abe989736133a5cfa0ec826 \ No newline at end of file +fa52fa6c6703269e23610b1c6aba8a56b911fbbb \ No newline at end of file From 18c1700f72e9c03750365a302dcb15b5e3d46366 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Jul 2022 14:28:55 -0700 Subject: [PATCH 33/47] RAV4 2022: Add missing engine fw (#25136) Add engine fw from 909a5635aa370818 --- selfdrive/car/toyota/values.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index f40a58b5a7..63b7240e2f 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -1302,6 +1302,7 @@ FW_VERSIONS = { b'\x01896634AA0000\x00\x00\x00\x00', b'\x01896634AA1000\x00\x00\x00\x00', b'\x01896634A88000\x00\x00\x00\x00', + b'\x01896634A89000\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ b'\x018821F0R01100\x00\x00\x00\x00', From 5a7c2f90361e72e9c35e88abd2e11acdc4aba354 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 13 Jul 2022 14:44:34 -0700 Subject: [PATCH 34/47] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 2abeab913f..e51aa5ebce 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 2abeab913f6432e4327b07e247b8a46994ac77a1 +Subproject commit e51aa5ebce031c96e802b07d13120a039fa7b82f From c8051154d2a03f94d54f085d491469800c4e915a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Jul 2022 20:03:55 -0700 Subject: [PATCH 35/47] Civic 2022: Add missing fw versions (#25164) Add fingerprints from a918d2895b3210a1 --- selfdrive/car/honda/values.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index b8417ee19b..c665b1cd03 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -1406,6 +1406,7 @@ FW_VERSIONS = { b'38897-T20-A020\x00\x00', b'38897-T20-A510\x00\x00', b'38897-T21-A010\x00\x00', + b'38897-T20-A210\x00\x00', ], (Ecu.srs, 0x18DA53F1, None): [ b'77959-T20-A970\x00\x00', @@ -1415,6 +1416,7 @@ FW_VERSIONS = { b'78108-T21-A220\x00\x00', b'78108-T21-A620\x00\x00', b'78108-T23-A110\x00\x00', + b'78108-T21-A230\x00\x00', ], (Ecu.vsa, 0x18DA28F1, None): [ b'57114-T20-AB40\x00\x00', @@ -1429,6 +1431,7 @@ FW_VERSIONS = { b'37805-64L-A540\x00\x00', b'37805-64S-A540\x00\x00', b'37805-64S-A720\x00\x00', + b'37805-64A-A540\x00\x00', ], }, } From 93a1ca8351d93adfc18d5a9c99ce2bb908cb43b6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 13 Jul 2022 23:51:32 -0700 Subject: [PATCH 36/47] Multilanguage Contributing README (#25170) * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * typo --- selfdrive/ui/translations/README.md | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 selfdrive/ui/translations/README.md diff --git a/selfdrive/ui/translations/README.md b/selfdrive/ui/translations/README.md new file mode 100644 index 0000000000..0ddb03a24c --- /dev/null +++ b/selfdrive/ui/translations/README.md @@ -0,0 +1,39 @@ +# Multilanguage + +![multilanguage_onroad](https://user-images.githubusercontent.com/25857203/178912800-2c798af8-78e3-498e-9e19-35906e0bafff.png) + +## Contributing + +Before getting started, make sure you have set up the openpilot Ubuntu development environment by reading the [tools README.md](/tools/README.md). + +### Adding a New Language + +openpilot provides a few tools to help contributors manage their translations and to ensure quality. To get started: + +1. Add your new language to [languages.json](/selfdrive/ui/translations/languages.json) with the appropriate [language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) and the localized language name (Simplified Chinese is `中文(繁體)`). +2. Generate the translation file (`*.ts`): + ```shell + selfdrive/ui/update_translations.py + ``` +3. Edit the translation file, marking each translation as completed: + ```shell + linguist selfdrive/ui/translations/your_language_file.ts + ``` +4. Save your file and generate the compiled QM file used by the Qt UI: + ```shell + selfdrive/ui/update_translations.py --release + ``` + +### Improving an Existing Language + +Follow the steps above, omitting steps 1. and 2. Any time you edit translations you'll want to make sure to compile them. + +### Testing + +openpilot has a unit test to make sure all translations are up to date with the text in openpilot and that all translations are completed. + +Run and fix any issues: + +```python +selfdrive/ui/tests/test_translations.py +``` From c7771d1783ef7d7e1efb29e81aae44ad26747c5c Mon Sep 17 00:00:00 2001 From: Gijs Koning Date: Thu, 14 Jul 2022 11:49:27 +0200 Subject: [PATCH 37/47] Bump laika and catch Downloadfiles exception. --- laika_repo | 2 +- selfdrive/locationd/laikad.py | 3 ++- selfdrive/locationd/test/test_laikad.py | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/laika_repo b/laika_repo index 828612e1b8..3ce2628dfc 160000 --- a/laika_repo +++ b/laika_repo @@ -1 +1 @@ -Subproject commit 828612e1b8848ccf70072d5513c0b7977f1707da +Subproject commit 3ce2628dfc8ddba1769c518f90275e3caca9e8c6 diff --git a/selfdrive/locationd/laikad.py b/selfdrive/locationd/laikad.py index 4868e8ae52..13829b22a9 100755 --- a/selfdrive/locationd/laikad.py +++ b/selfdrive/locationd/laikad.py @@ -15,6 +15,7 @@ from cereal import log, messaging from common.params import Params, put_nonblocking from laika import AstroDog from laika.constants import SECS_IN_HR, SECS_IN_MIN +from laika.downloader import DownloadFailed from laika.ephemeris import Ephemeris, EphemerisType, convert_ublox_ephem from laika.gps_time import GPSTime from laika.helpers import ConstellationId @@ -212,7 +213,7 @@ def get_orbit_data(t: GPSTime, valid_const, auto_update, valid_ephem_types, cach astro_dog.get_orbit_data(t, only_predictions=True) cloudlog.info(f"Done parsing orbits. Took {time.monotonic() - start_time:.1f}s") return astro_dog.orbits, astro_dog.orbit_fetched_times, t - except (RuntimeError, ValueError, IOError) as e: + except (DownloadFailed, RuntimeError, ValueError, IOError) as e: cloudlog.warning(f"No orbit data found or parsing failure: {e}") return None, None, t diff --git a/selfdrive/locationd/test/test_laikad.py b/selfdrive/locationd/test/test_laikad.py index c10a470d1a..bc7a0d7fa4 100755 --- a/selfdrive/locationd/test/test_laikad.py +++ b/selfdrive/locationd/test/test_laikad.py @@ -8,6 +8,7 @@ from unittest.mock import Mock, patch from common.params import Params from laika.constants import SECS_IN_DAY +from laika.downloader import DownloadFailed from laika.ephemeris import EphemerisType, GPSEphemeris from laika.gps_time import GPSTime from laika.helpers import ConstellationId, TimeRangeHolder @@ -51,6 +52,9 @@ def get_measurement_mock(gpstime, sat_ephemeris): return meas +GPS_TIME_PREDICTION_ORBITS_RUSSIAN_SRC = GPSTime.from_datetime(datetime(2022, month=1, day=29, hour=12)) + + class TestLaikad(unittest.TestCase): @classmethod @@ -109,7 +113,7 @@ class TestLaikad(unittest.TestCase): data_mock = defaultdict(str) data_mock['sv_id'] = 1 - gpstime = GPSTime.from_datetime(datetime(2022, month=3, day=1)) + gpstime = GPS_TIME_PREDICTION_ORBITS_RUSSIAN_SRC laikad = Laikad() laikad.fetch_orbits(gpstime, block=True) meas = get_measurement_mock(gpstime, laikad.astro_dog.orbits['R01'][0]) @@ -165,7 +169,13 @@ class TestLaikad(unittest.TestCase): @mock.patch('laika.downloader.download_and_cache_file') def test_laika_offline(self, downloader_mock): - downloader_mock.side_effect = IOError + downloader_mock.side_effect = DownloadFailed("Mock download failed") + laikad = Laikad(auto_update=False) + laikad.fetch_orbits(GPS_TIME_PREDICTION_ORBITS_RUSSIAN_SRC, block=True) + + @mock.patch('laika.downloader.download_and_cache_file') + def test_download_failed_russian_source(self, downloader_mock): + downloader_mock.side_effect = DownloadFailed laikad = Laikad(auto_update=False) correct_msgs = verify_messages(self.logs, laikad) self.assertEqual(16, len(correct_msgs)) From 3160f86aa085c300204a5d3e1c37d72ea5fd3051 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 14 Jul 2022 10:18:16 -0700 Subject: [PATCH 38/47] bump version to 0.8.16 --- RELEASES.md | 3 +++ common/version.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index b87bd2ee7d..b47a18a3de 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,6 @@ +Version 0.8.16 (2022-XX-XX) +======================== + Version 0.8.15 (2022-07-20) ======================== * New driving model diff --git a/common/version.h b/common/version.h index de550d6be5..bf1c58df1e 100644 --- a/common/version.h +++ b/common/version.h @@ -1 +1 @@ -#define COMMA_VERSION "0.8.15" +#define COMMA_VERSION "0.8.16" From f38204ad260f2af6a01b71191850178d0af03e8e Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Thu, 14 Jul 2022 19:21:40 +0200 Subject: [PATCH 39/47] camerad: cleanup unused RGB code (#25172) * camerad: cleanup unused RGB code * hdr is unused * more cleanup * remove envs * remove from sconsfile * fix docs --- cereal | 2 +- common/modeldata.h | 5 +- docs/c_docs.rst | 2 - release/files_common | 5 - system/camerad/SConscript | 2 - system/camerad/cameras/camera_common.cc | 54 +----- system/camerad/cameras/camera_common.h | 16 +- system/camerad/cameras/camera_qcom2.cc | 26 +-- system/camerad/cameras/camera_qcom2.h | 2 +- system/camerad/transforms/rgb_to_yuv.cc | 36 ---- system/camerad/transforms/rgb_to_yuv.h | 14 -- system/camerad/transforms/rgb_to_yuv_test.cc | 191 ------------------- 12 files changed, 20 insertions(+), 335 deletions(-) delete mode 100644 system/camerad/transforms/rgb_to_yuv.cc delete mode 100644 system/camerad/transforms/rgb_to_yuv.h delete mode 100644 system/camerad/transforms/rgb_to_yuv_test.cc diff --git a/cereal b/cereal index cda60ec965..3ed1b8c51a 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit cda60ec9652c05de4ccfcad1fae7936e708434a3 +Subproject commit 3ed1b8c51afb616880565e5868806cef82bbc835 diff --git a/common/modeldata.h b/common/modeldata.h index b193841416..e13840d53e 100644 --- a/common/modeldata.h +++ b/common/modeldata.h @@ -34,12 +34,13 @@ const mat3 ecam_intrinsic_matrix = (mat3){{567.0, 0.0, 1928.0 / 2, 0.0, 567.0, 1208.0 / 2, 0.0, 0.0, 1.0}}; -static inline mat3 get_model_yuv_transform(bool bayer = true) { +static inline mat3 get_model_yuv_transform() { float db_s = 1.0; const mat3 transform = (mat3){{ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 }}; - return bayer ? transform_scale_buffer(transform, db_s) : transform; + // Can this be removed since scale is 1? + return transform_scale_buffer(transform, db_s); } diff --git a/docs/c_docs.rst b/docs/c_docs.rst index 5638b40bf0..94d0adb560 100644 --- a/docs/c_docs.rst +++ b/docs/c_docs.rst @@ -29,8 +29,6 @@ camerad ^^^^^^^ .. autodoxygenindex:: :project: system_camerad_cameras -.. autodoxygenindex:: - :project: system_camerad_transforms .. autodoxygenindex:: :project: system_camerad_imgproc diff --git a/release/files_common b/release/files_common index 954726d967..38f86d247a 100644 --- a/release/files_common +++ b/release/files_common @@ -324,11 +324,6 @@ system/camerad/cameras/camera_common.h system/camerad/cameras/camera_common.cc system/camerad/cameras/sensor2_i2c.h -system/camerad/transforms/rgb_to_yuv.cc -system/camerad/transforms/rgb_to_yuv.h -system/camerad/transforms/rgb_to_yuv.cl -system/camerad/transforms/rgb_to_yuv_test.cc - system/camerad/imgproc/conv.cl system/camerad/imgproc/pool.cl system/camerad/imgproc/utils.cc diff --git a/system/camerad/SConscript b/system/camerad/SConscript index b181fbab75..25e366210f 100644 --- a/system/camerad/SConscript +++ b/system/camerad/SConscript @@ -10,7 +10,6 @@ if arch == "larch64": env.Program('camerad', [ 'main.cc', 'cameras/camera_common.cc', - 'transforms/rgb_to_yuv.cc', 'imgproc/utils.cc', cameras, ], LIBS=libs) @@ -19,5 +18,4 @@ if GetOption("test"): env.Program('test/ae_gray_test', [ 'test/ae_gray_test.cc', 'cameras/camera_common.cc', - 'transforms/rgb_to_yuv.cc', ], LIBS=libs) diff --git a/system/camerad/cameras/camera_common.cc b/system/camerad/cameras/camera_common.cc index 04f3136485..1d4ecd526a 100644 --- a/system/camerad/cameras/camera_common.cc +++ b/system/camerad/cameras/camera_common.cc @@ -32,15 +32,14 @@ public: Debayer(cl_device_id device_id, cl_context context, const CameraBuf *b, const CameraState *s, int buf_width, int uv_offset) { char args[4096]; const CameraInfo *ci = &s->ci; - hdr_ = ci->hdr; snprintf(args, sizeof(args), "-cl-fast-relaxed-math -cl-denorms-are-zero " "-DFRAME_WIDTH=%d -DFRAME_HEIGHT=%d -DFRAME_STRIDE=%d -DFRAME_OFFSET=%d " "-DRGB_WIDTH=%d -DRGB_HEIGHT=%d -DRGB_STRIDE=%d -DYUV_STRIDE=%d -DUV_OFFSET=%d " - "-DBAYER_FLIP=%d -DHDR=%d -DCAM_NUM=%d%s", + "-DCAM_NUM=%d%s", ci->frame_width, ci->frame_height, ci->frame_stride, ci->frame_offset, b->rgb_width, b->rgb_height, b->rgb_stride, buf_width, uv_offset, - ci->bayer_flip, ci->hdr, s->camera_num, s->camera_num==1 ? " -DVIGNETTING" : ""); + s->camera_num, s->camera_num==1 ? " -DVIGNETTING" : ""); const char *cl_file = "cameras/real_debayer.cl"; cl_program prg_debayer = cl_program_from_file(context, device_id, cl_file, args); krnl_ = CL_CHECK_ERR(clCreateKernel(prg_debayer, "debayer10", &err)); @@ -63,12 +62,10 @@ public: private: cl_kernel krnl_; - bool hdr_; }; -void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, VisionIpcServer * v, int frame_cnt, VisionStreamType init_rgb_type, VisionStreamType init_yuv_type) { +void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, VisionIpcServer * v, int frame_cnt, VisionStreamType init_yuv_type) { vipc_server = v; - this->rgb_type = init_rgb_type; this->yuv_type = init_yuv_type; const CameraInfo *ci = &s->ci; @@ -89,11 +86,7 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, rgb_width = ci->frame_width; rgb_height = ci->frame_height; - yuv_transform = get_model_yuv_transform(ci->bayer); - - vipc_server->create_buffers(rgb_type, UI_BUF_COUNT, true, rgb_width, rgb_height); - rgb_stride = vipc_server->get_buffer(rgb_type)->stride; - LOGD("created %d UI vipc buffers with size %dx%d", UI_BUF_COUNT, rgb_width, rgb_height); + yuv_transform = get_model_yuv_transform(); int nv12_width = VENUS_Y_STRIDE(COLOR_FMT_NV12, rgb_width); int nv12_height = VENUS_Y_SCANLINES(COLOR_FMT_NV12, rgb_height); @@ -104,10 +97,7 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, vipc_server->create_buffers_with_sizes(yuv_type, YUV_BUFFER_COUNT, false, rgb_width, rgb_height, nv12_size, nv12_width, nv12_uv_offset); LOGD("created %d YUV vipc buffers with size %dx%d", YUV_BUFFER_COUNT, nv12_width, nv12_height); - if (ci->bayer) { - debayer = new Debayer(device_id, context, this, s, nv12_width, nv12_uv_offset); - } - rgb2yuv = std::make_unique(context, device_id, rgb_width, rgb_height, rgb_stride); + debayer = new Debayer(device_id, context, this, s, nv12_width, nv12_uv_offset); #ifdef __APPLE__ q = CL_CHECK_ERR(clCreateCommandQueue(context, device_id, 0, &err)); @@ -135,7 +125,6 @@ bool CameraBuf::acquire() { } cur_frame_data = camera_bufs_metadata[cur_buf_idx]; - cur_rgb_buf = vipc_server->get_buffer(rgb_type); cur_yuv_buf = vipc_server->get_buffer(yuv_type); cl_mem camrabuf_cl = camera_bufs[cur_buf_idx].buf_cl; cl_event event; @@ -144,12 +133,7 @@ bool CameraBuf::acquire() { cur_camera_buf = &camera_bufs[cur_buf_idx]; - if (debayer) { - debayer->queue(q, camrabuf_cl, cur_yuv_buf->buf_cl, rgb_width, rgb_height, &event); - } else { - assert(rgb_stride == camera_state->ci.frame_stride); - rgb2yuv->queue(q, camrabuf_cl, cur_rgb_buf->buf_cl); - } + debayer->queue(q, camrabuf_cl, cur_yuv_buf->buf_cl, rgb_width, rgb_height, &event); clWaitForEvents(1, &event); CL_CHECK(clReleaseEvent(event)); @@ -193,32 +177,6 @@ void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &fr framed.setProcessingTime(frame_data.processing_time); } -kj::Array get_frame_image(const CameraBuf *b) { - static const int x_min = util::getenv("XMIN", 0); - static const int y_min = util::getenv("YMIN", 0); - static const int env_xmax = util::getenv("XMAX", -1); - static const int env_ymax = util::getenv("YMAX", -1); - static const int scale = util::getenv("SCALE", 1); - - assert(b->cur_rgb_buf); - - const int x_max = env_xmax != -1 ? env_xmax : b->rgb_width - 1; - const int y_max = env_ymax != -1 ? env_ymax : b->rgb_height - 1; - const int new_width = (x_max - x_min + 1) / scale; - const int new_height = (y_max - y_min + 1) / scale; - const uint8_t *dat = (const uint8_t *)b->cur_rgb_buf->addr; - - kj::Array frame_image = kj::heapArray(new_width*new_height*3); - uint8_t *resized_dat = frame_image.begin(); - int goff = x_min*3 + y_min*b->rgb_stride; - for (int r=0;rrgb_stride*scale+c*3*scale], 3*sizeof(uint8_t)); - } - } - return kj::mv(frame_image); -} - kj::Array get_raw_frame_image(const CameraBuf *b) { const uint8_t *dat = (const uint8_t *)b->cur_camera_buf->addr; diff --git a/system/camerad/cameras/camera_common.h b/system/camerad/cameras/camera_common.h index 4695d4e2c9..2a56052559 100644 --- a/system/camerad/cameras/camera_common.h +++ b/system/camerad/cameras/camera_common.h @@ -9,7 +9,6 @@ #include "cereal/visionipc/visionbuf.h" #include "cereal/visionipc/visionipc.h" #include "cereal/visionipc/visionipc_server.h" -#include "system/camerad/transforms/rgb_to_yuv.h" #include "common/mat.h" #include "common/queue.h" #include "common/swaglog.h" @@ -27,7 +26,6 @@ #define CAMERA_ID_IMX390 9 #define CAMERA_ID_MAX 10 -const int UI_BUF_COUNT = 4; const int YUV_BUFFER_COUNT = 40; enum CameraType { @@ -36,11 +34,6 @@ enum CameraType { WideRoadCam }; -// TODO: remove these once all the internal tools are moved to vipc -const bool env_send_driver = getenv("SEND_DRIVER") != NULL; -const bool env_send_road = getenv("SEND_ROAD") != NULL; -const bool env_send_wide_road = getenv("SEND_WIDE_ROAD") != NULL; - // for debugging const bool env_disable_road = getenv("DISABLE_ROAD") != NULL; const bool env_disable_wide_road = getenv("DISABLE_WIDE_ROAD") != NULL; @@ -51,9 +44,6 @@ const bool env_log_raw_frames = getenv("LOG_RAW_FRAMES") != NULL; typedef struct CameraInfo { uint32_t frame_width, frame_height; uint32_t frame_stride; - bool bayer; - int bayer_flip; - bool hdr; uint32_t frame_offset = 0; uint32_t extra_height = 0; int registers_offset = -1; @@ -92,9 +82,8 @@ private: VisionIpcServer *vipc_server; CameraState *camera_state; Debayer *debayer = nullptr; - std::unique_ptr rgb2yuv; - VisionStreamType rgb_type, yuv_type; + VisionStreamType yuv_type; int cur_buf_idx; @@ -116,7 +105,7 @@ public: CameraBuf() = default; ~CameraBuf(); - void init(cl_device_id device_id, cl_context context, CameraState *s, VisionIpcServer * v, int frame_cnt, VisionStreamType rgb_type, VisionStreamType yuv_type); + void init(cl_device_id device_id, cl_context context, CameraState *s, VisionIpcServer * v, int frame_cnt, VisionStreamType yuv_type); bool acquire(); void release(); void queue(size_t buf_idx); @@ -125,7 +114,6 @@ public: typedef void (*process_thread_cb)(MultiCameraState *s, CameraState *c, int cnt); void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &frame_data); -kj::Array get_frame_image(const CameraBuf *b); kj::Array get_raw_frame_image(const CameraBuf *b); float set_exposure_target(const CameraBuf *b, int x_start, int x_end, int x_skip, int y_start, int y_end, int y_skip); std::thread start_process_thread(MultiCameraState *cameras, CameraState *cs, process_thread_cb callback); diff --git a/system/camerad/cameras/camera_qcom2.cc b/system/camerad/cameras/camera_qcom2.cc index f001009b9a..31af284d52 100644 --- a/system/camerad/cameras/camera_qcom2.cc +++ b/system/camerad/cameras/camera_qcom2.cc @@ -46,19 +46,11 @@ CameraInfo cameras_supported[CAMERA_ID_MAX] = { .registers_offset = 0, .frame_offset = AR0231_REGISTERS_HEIGHT, .stats_offset = AR0231_REGISTERS_HEIGHT + FRAME_HEIGHT, - - .bayer = true, - .bayer_flip = 1, - .hdr = false, }, [CAMERA_ID_IMX390] = { .frame_width = FRAME_WIDTH, .frame_height = FRAME_HEIGHT, .frame_stride = FRAME_STRIDE, - - .bayer = true, - .bayer_flip = 1, - .hdr = false, }, }; @@ -614,7 +606,7 @@ void CameraState::enqueue_req_multi(int start, int n, bool dp) { // ******************* camera ******************* -void CameraState::camera_init(MultiCameraState *multi_cam_state_, VisionIpcServer * v, int camera_id_, int camera_num_, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type, bool enabled_) { +void CameraState::camera_init(MultiCameraState *multi_cam_state_, VisionIpcServer * v, int camera_id_, int camera_num_, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType yuv_type, bool enabled_) { multi_cam_state = multi_cam_state_; camera_id = camera_id_; camera_num = camera_num_; @@ -638,7 +630,7 @@ void CameraState::camera_init(MultiCameraState *multi_cam_state_, VisionIpcServe exposure_time = 5; cur_ev[0] = cur_ev[1] = cur_ev[2] = (dc_gain_enabled ? DC_GAIN : 1) * sensor_analog_gains[gain_idx] * exposure_time; - buf.init(device_id, ctx, this, v, FRAME_BUF_COUNT, rgb_type, yuv_type); + buf.init(device_id, ctx, this, v, FRAME_BUF_COUNT, yuv_type); } void CameraState::camera_open() { @@ -833,9 +825,9 @@ void CameraState::camera_open() { } void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) { - s->driver_cam.camera_init(s, v, CAMERA_ID_AR0231, 2, 20, device_id, ctx, VISION_STREAM_RGB_DRIVER, VISION_STREAM_DRIVER, !env_disable_driver); - s->road_cam.camera_init(s, v, CAMERA_ID_AR0231, 1, 20, device_id, ctx, VISION_STREAM_RGB_ROAD, VISION_STREAM_ROAD, !env_disable_road); - s->wide_road_cam.camera_init(s, v, CAMERA_ID_AR0231, 0, 20, device_id, ctx, VISION_STREAM_RGB_WIDE_ROAD, VISION_STREAM_WIDE_ROAD, !env_disable_wide_road); + s->driver_cam.camera_init(s, v, CAMERA_ID_AR0231, 2, 20, device_id, ctx, VISION_STREAM_DRIVER, !env_disable_driver); + s->road_cam.camera_init(s, v, CAMERA_ID_AR0231, 1, 20, device_id, ctx, VISION_STREAM_ROAD, !env_disable_road); + s->wide_road_cam.camera_init(s, v, CAMERA_ID_AR0231, 0, 20, device_id, ctx, VISION_STREAM_WIDE_ROAD, !env_disable_wide_road); s->pm = new PubMaster({"roadCameraState", "driverCameraState", "wideRoadCameraState", "thumbnail"}); } @@ -1233,9 +1225,7 @@ static void process_driver_camera(MultiCameraState *s, CameraState *c, int cnt) auto framed = msg.initEvent().initDriverCameraState(); framed.setFrameType(cereal::FrameData::FrameType::FRONT); fill_frame_data(framed, c->buf.cur_frame_data); - if (env_send_driver) { - framed.setImage(get_frame_image(&c->buf)); - } + if (c->camera_id == CAMERA_ID_AR0231) { ar0231_process_registers(s, c, framed); } @@ -1248,9 +1238,7 @@ void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) { MessageBuilder msg; auto framed = c == &s->road_cam ? msg.initEvent().initRoadCameraState() : msg.initEvent().initWideRoadCameraState(); fill_frame_data(framed, b->cur_frame_data); - if ((c == &s->road_cam && env_send_road) || (c == &s->wide_road_cam && env_send_wide_road)) { - framed.setImage(get_frame_image(b)); - } else if (env_log_raw_frames && c == &s->road_cam && cnt % 100 == 5) { // no overlap with qlog decimation + if (env_log_raw_frames && c == &s->road_cam && cnt % 100 == 5) { // no overlap with qlog decimation framed.setImage(get_raw_frame_image(b)); } LOGT(c->buf.cur_frame_data.frame_id, "%s: Image set", c == &s->road_cam ? "RoadCamera" : "WideRoadCamera"); diff --git a/system/camerad/cameras/camera_qcom2.h b/system/camerad/cameras/camera_qcom2.h index 57fef8d49a..03d3d1a823 100644 --- a/system/camerad/cameras/camera_qcom2.h +++ b/system/camerad/cameras/camera_qcom2.h @@ -55,7 +55,7 @@ public: void sensors_start(); void camera_open(); - void camera_init(MultiCameraState *multi_cam_state, VisionIpcServer * v, int camera_id, int camera_num, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type, bool enabled); + void camera_init(MultiCameraState *multi_cam_state, VisionIpcServer * v, int camera_id, int camera_num, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType yuv_type, bool enabled); void camera_close(); std::map ar0231_parse_registers(uint8_t *data, std::initializer_list addrs); diff --git a/system/camerad/transforms/rgb_to_yuv.cc b/system/camerad/transforms/rgb_to_yuv.cc deleted file mode 100644 index 5e51579cf9..0000000000 --- a/system/camerad/transforms/rgb_to_yuv.cc +++ /dev/null @@ -1,36 +0,0 @@ -#include "system/camerad/transforms/rgb_to_yuv.h" - -#include -#include - -Rgb2Yuv::Rgb2Yuv(cl_context ctx, cl_device_id device_id, int width, int height, int rgb_stride) { - assert(width % 2 == 0 && height % 2 == 0); - char args[1024]; - snprintf(args, sizeof(args), - "-cl-fast-relaxed-math -cl-denorms-are-zero " -#ifdef CL_DEBUG - "-DCL_DEBUG " -#endif - "-DWIDTH=%d -DHEIGHT=%d -DUV_WIDTH=%d -DUV_HEIGHT=%d -DRGB_STRIDE=%d -DRGB_SIZE=%d", - width, height, width / 2, height / 2, rgb_stride, width * height); - - cl_program prg = cl_program_from_file(ctx, device_id, "transforms/rgb_to_yuv.cl", args); - krnl = CL_CHECK_ERR(clCreateKernel(prg, "rgb_to_yuv", &err)); - CL_CHECK(clReleaseProgram(prg)); - - work_size[0] = (width + (width % 4 == 0 ? 0 : (4 - width % 4))) / 4; - work_size[1] = (height + (height % 4 == 0 ? 0 : (4 - height % 4))) / 4; -} - -Rgb2Yuv::~Rgb2Yuv() { - CL_CHECK(clReleaseKernel(krnl)); -} - -void Rgb2Yuv::queue(cl_command_queue q, cl_mem rgb_cl, cl_mem yuv_cl) { - CL_CHECK(clSetKernelArg(krnl, 0, sizeof(cl_mem), &rgb_cl)); - CL_CHECK(clSetKernelArg(krnl, 1, sizeof(cl_mem), &yuv_cl)); - cl_event event; - CL_CHECK(clEnqueueNDRangeKernel(q, krnl, 2, NULL, &work_size[0], NULL, 0, 0, &event)); - CL_CHECK(clWaitForEvents(1, &event)); - CL_CHECK(clReleaseEvent(event)); -} diff --git a/system/camerad/transforms/rgb_to_yuv.h b/system/camerad/transforms/rgb_to_yuv.h deleted file mode 100644 index e1de180d40..0000000000 --- a/system/camerad/transforms/rgb_to_yuv.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "common/clutil.h" - -class Rgb2Yuv { -public: - Rgb2Yuv(cl_context ctx, cl_device_id device_id, int width, int height, int rgb_stride); - ~Rgb2Yuv(); - void queue(cl_command_queue q, cl_mem rgb_cl, cl_mem yuv_cl); -private: - size_t work_size[2]; - cl_kernel krnl; -}; - diff --git a/system/camerad/transforms/rgb_to_yuv_test.cc b/system/camerad/transforms/rgb_to_yuv_test.cc deleted file mode 100644 index 2f909e3b73..0000000000 --- a/system/camerad/transforms/rgb_to_yuv_test.cc +++ /dev/null @@ -1,191 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef ANDROID - -#define MAXE 0 -#include - -#else -// The libyuv implementation on ARM is slightly different than on x86 -// Our implementation matches the ARM version, so accept errors of 1 -#define MAXE 1 - -#endif - -#include - -#include "libyuv.h" -#include "system/camerad/transforms/rgb_to_yuv.h" -#include "common/clutil.h" - -static inline double millis_since_boot() { - struct timespec t; - clock_gettime(CLOCK_BOOTTIME, &t); - return t.tv_sec * 1000.0 + t.tv_nsec * 1e-6; -} - -void cl_init(cl_device_id &device_id, cl_context &context) { - device_id = cl_get_device_id(CL_DEVICE_TYPE_DEFAULT); - context = CL_CHECK_ERR(clCreateContext(NULL, 1, &device_id, NULL, NULL, &err)); -} - - -bool compare_results(uint8_t *a, uint8_t *b, int len, int stride, int width, int height, uint8_t *rgb) { - int min_diff = 0., max_diff = 0., max_e = 0.; - int e1 = 0, e0 = 0; - int e0y = 0, e0u = 0, e0v = 0, e1y = 0, e1u = 0, e1v = 0; - int max_e_i = 0; - for (int i = 0;i < len;i++) { - int e = ((int)a[i]) - ((int)b[i]); - if(e < min_diff) { - min_diff = e; - } - if(e > max_diff) { - max_diff = e; - } - int e_abs = std::abs(e); - if(e_abs > max_e) { - max_e = e_abs; - max_e_i = i; - } - if(e_abs < 1) { - e0++; - if(i < stride * height) - e0y++; - else if(i < stride * height + stride * height / 4) - e0u++; - else - e0v++; - } else { - e1++; - if(i < stride * height) - e1y++; - else if(i < stride * height + stride * height / 4) - e1u++; - else - e1v++; - } - } - //printf("max diff : %d, min diff : %d, e < 1: %d, e >= 1: %d\n", max_diff, min_diff, e0, e1); - //printf("Y: e < 1: %d, e >= 1: %d, U: e < 1: %d, e >= 1: %d, V: e < 1: %d, e >= 1: %d\n", e0y, e1y, e0u, e1u, e0v, e1v); - if(max_e <= MAXE) { - return true; - } - int row = max_e_i / stride; - if(row < height) { - printf("max error is Y: %d = (libyuv: %u - cl: %u), row: %d, col: %d\n", max_e, a[max_e_i], b[max_e_i], row, max_e_i % stride); - } else if(row >= height && row < (height + height / 4)) { - printf("max error is U: %d = %u - %u, row: %d, col: %d\n", max_e, a[max_e_i], b[max_e_i], (row - height) / 2, max_e_i % stride / 2); - } else { - printf("max error is V: %d = %u - %u, row: %d, col: %d\n", max_e, a[max_e_i], b[max_e_i], (row - height - height / 4) / 2, max_e_i % stride / 2); - } - return false; -} - -int main(int argc, char** argv) { - srand(1337); - - cl_device_id device_id; - cl_context context; - cl_init(device_id, context) ; - - int err; - const cl_queue_properties props[] = {0}; //CL_QUEUE_PRIORITY_KHR, CL_QUEUE_PRIORITY_HIGH_KHR, 0}; - cl_command_queue q = clCreateCommandQueueWithProperties(context, device_id, props, &err); - if(err != 0) { - std::cout << "clCreateCommandQueueWithProperties error: " << err << std::endl; - } - - int width = 1164; - int height = 874; - - int opt = 0; - while ((opt = getopt(argc, argv, "f")) != -1) - { - switch (opt) - { - case 'f': - std::cout << "Using front camera dimensions" << std::endl; - int width = 1152; - int height = 846; - } - } - - std::cout << "Width: " << width << " Height: " << height << std::endl; - uint8_t *rgb_frame = new uint8_t[width * height * 3]; - - - RGBToYUVState rgb_to_yuv_state; - rgb_to_yuv_init(&rgb_to_yuv_state, context, device_id, width, height, width * 3); - - int frame_yuv_buf_size = width * height * 3 / 2; - cl_mem yuv_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, frame_yuv_buf_size, (void*)NULL, &err)); - uint8_t *frame_yuv_buf = new uint8_t[frame_yuv_buf_size]; - uint8_t *frame_yuv_ptr_y = frame_yuv_buf; - uint8_t *frame_yuv_ptr_u = frame_yuv_buf + (width * height); - uint8_t *frame_yuv_ptr_v = frame_yuv_ptr_u + ((width/2) * (height/2)); - - cl_mem rgb_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, width * height * 3, (void*)NULL, &err)); - int mismatched = 0; - int counter = 0; - srand (time(NULL)); - - for (int i = 0; i < 100; i++) { - for (int i = 0; i < width * height * 3; i++) { - rgb_frame[i] = (uint8_t)rand(); - } - - double t1 = millis_since_boot(); - libyuv::RGB24ToI420((uint8_t*)rgb_frame, width * 3, - frame_yuv_ptr_y, width, - frame_yuv_ptr_u, width/2, - frame_yuv_ptr_v, width/2, - width, height); - double t2 = millis_since_boot(); - //printf("Libyuv: rgb to yuv: %.2fms\n", t2-t1); - - clEnqueueWriteBuffer(q, rgb_cl, CL_TRUE, 0, width * height * 3, (void *)rgb_frame, 0, NULL, NULL); - t1 = millis_since_boot(); - rgb_to_yuv_queue(&rgb_to_yuv_state, q, rgb_cl, yuv_cl); - t2 = millis_since_boot(); - - //printf("OpenCL: rgb to yuv: %.2fms\n", t2-t1); - uint8_t *yyy = (uint8_t *)clEnqueueMapBuffer(q, yuv_cl, CL_TRUE, - CL_MAP_READ, 0, frame_yuv_buf_size, - 0, NULL, NULL, &err); - if(!compare_results(frame_yuv_ptr_y, yyy, frame_yuv_buf_size, width, width, height, (uint8_t*)rgb_frame)) - mismatched++; - clEnqueueUnmapMemObject(q, yuv_cl, yyy, 0, NULL, NULL); - - // std::this_thread::sleep_for(std::chrono::milliseconds(20)); - if(counter++ % 100 == 0) - printf("Matched: %d, Mismatched: %d\n", counter - mismatched, mismatched); - - } - printf("Matched: %d, Mismatched: %d\n", counter - mismatched, mismatched); - - delete[] frame_yuv_buf; - rgb_to_yuv_destroy(&rgb_to_yuv_state); - clReleaseContext(context); - delete[] rgb_frame; - - if (mismatched == 0) - return 0; - else - return -1; -} From 811bb1b762cb6a58c9bd28387c44de21a02a86f9 Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Thu, 14 Jul 2022 19:24:30 +0200 Subject: [PATCH 40/47] bump cereal --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 3ed1b8c51a..a4c1afa3bf 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 3ed1b8c51afb616880565e5868806cef82bbc835 +Subproject commit a4c1afa3bfcbba989c128ec9b5092f6c91f4da22 From 98676fb3b05630bf6e62b0a1fbfc8804948a578c Mon Sep 17 00:00:00 2001 From: cydia2020 <12470297+cydia2020@users.noreply.github.com> Date: Fri, 15 Jul 2022 04:34:27 +1000 Subject: [PATCH 41/47] Toyota: don't send UI on Prius V (#25036) * Toyota: don't send UI on Prius V * Update selfdrive/car/toyota/carcontroller.py Co-authored-by: Adeeb Shihadeh --- selfdrive/car/toyota/carcontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 33e3fe118e..61a41b9c51 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -126,7 +126,7 @@ class CarController: # forcing the pcm to disengage causes a bad fault sound so play a good sound instead send_ui = True - if self.frame % 100 == 0 or send_ui: + if (self.frame % 100 == 0 or send_ui) and (self.CP.carFingerprint != CAR.PRIUS_V): can_sends.append(create_ui_command(self.packer, steer_alert, pcm_cancel_cmd, hud_control.leftLaneVisible, hud_control.rightLaneVisible, hud_control.leftLaneDepart, hud_control.rightLaneDepart, CC.enabled)) From e203794b2d2341d5b3c0e39b6ae2b08da30ea203 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:41:20 -0400 Subject: [PATCH 42/47] VW MQB: Update supported models and model-years (#25123) * updates for Atlas * updates for Arteon * regen CARS.md * consolidate wagons, update Golfs * update Jetta and Passat * harness footnotes for Jetta and Passat * update Polo * regen CARS.md --- docs/CARS.md | 45 ++++++++++++++++----------- selfdrive/car/volkswagen/values.py | 49 +++++++++++++++++++++--------- 2 files changed, 63 insertions(+), 31 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 754052085d..3e35782b2a 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -70,7 +70,7 @@ How We Rate The Cars |Toyota|RAV4 2019-21|All|||||| |Toyota|RAV4 Hybrid 2019-21|All|||||| -# Silver - 70 cars +# Silver - 77 cars |Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained| |---|---|---|:---:|:---:|:---:|:---:|:---:| @@ -133,19 +133,26 @@ How We Rate The Cars |Toyota|RAV4 2022|All|||||| |Toyota|RAV4 Hybrid 2016-18|TSS-P|[3](#footnotes)||||| |Toyota|RAV4 Hybrid 2022|All|||||| -|Volkswagen|Atlas 2018-19, 2022[7](#footnotes)|Driver Assistance|||||| -|Volkswagen|e-Golf 2014, 2018-20|Driver Assistance|||||| -|Volkswagen|Golf 2015-20|Driver Assistance|||||| -|Volkswagen|Golf Alltrack 2017-18|Driver Assistance|||||| -|Volkswagen|Golf GTE 2016|Driver Assistance|||||| -|Volkswagen|Golf GTI 2018-21|Driver Assistance|||||| -|Volkswagen|Golf R 2016-19|Driver Assistance|||||| -|Volkswagen|Golf SportsVan 2016|Driver Assistance|||||| -|Volkswagen|Golf SportWagen 2015|Driver Assistance|||||| -|Volkswagen|Passat 2015-19[6](#footnotes)|Driver Assistance|||||| -|Volkswagen|Polo 2020|Driver Assistance|||||| - -# Bronze - 80 cars +|Volkswagen|Atlas 2018-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Atlas Cross Sport 2021-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|e-Golf 2014-20|Driver Assistance|||||| +|Volkswagen|Golf 2015-20[8](#footnotes)|Driver Assistance|||||| +|Volkswagen|Golf Alltrack 2015-19|Driver Assistance|||||| +|Volkswagen|Golf GTD 2015-20|Driver Assistance|||||| +|Volkswagen|Golf GTE 2015-20|Driver Assistance|||||| +|Volkswagen|Golf GTI 2015-21|Driver Assistance|||||| +|Volkswagen|Golf R 2015-19[8](#footnotes)|Driver Assistance|||||| +|Volkswagen|Golf SportsVan 2015-20|Driver Assistance|||||| +|Volkswagen|Passat 2015-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Passat Alltrack 2015-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Passat GTE 2015-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Polo 2020-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Polo GTI 2020-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Teramont 2018-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Teramont Cross Sport 2021-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Teramont X 2021-22[7](#footnotes)|Driver Assistance|||||| + +# Bronze - 83 cars |Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained| |---|---|---|:---:|:---:|:---:|:---:|:---:| @@ -219,11 +226,14 @@ How We Rate The Cars |Toyota|Prius v 2017|TSS-P|[3](#footnotes)||||| |Toyota|RAV4 2016-18|TSS-P|[3](#footnotes)||||| |Toyota|Sienna 2018-20|All|[3](#footnotes)||||| -|Volkswagen|Arteon 2018, 2021[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Arteon 2018-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Arteon eHybrid 2020-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Arteon R 2020-22[7](#footnotes)|Driver Assistance|||||| |Volkswagen|California 2021[7](#footnotes)|Driver Assistance|||||| |Volkswagen|Caravelle 2020[7](#footnotes)|Driver Assistance|||||| -|Volkswagen|Jetta 2018-21|Driver Assistance|||||| -|Volkswagen|Jetta GLI 2021|Driver Assistance|||||| +|Volkswagen|CC 2018-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Jetta 2018-22[7](#footnotes)|Driver Assistance|||||| +|Volkswagen|Jetta GLI 2021-22[7](#footnotes)|Driver Assistance|||||| |Volkswagen|T-Cross 2021[7](#footnotes)|Driver Assistance|||||| |Volkswagen|T-Roc 2021[7](#footnotes)|Driver Assistance|||||| |Volkswagen|Taos 2022[7](#footnotes)|Driver Assistance|||||| @@ -239,6 +249,7 @@ How We Rate The Cars 5Not including the China market Kamiq, which is based on the (currently) unsupported PQ34 platform.
6Not including the USA/China market Passat, which is based on the (currently) unsupported PQ35/NMS platform.
7Model-years 2021 and beyond may have a new camera harness design, which isn't yet available from the comma store. Before ordering, remove the Lane Assist camera cover and check to see if the connector is black (older design) or light brown (newer design). For the newer design, in the interim, choose "VW J533 Development" from the vehicle drop-down for a harness that integrates at the CAN gateway inside the dashboard.
+8Includes versions with extra rear cargo space (may be called Variant, Estate, SportWagen, Shooting Brake, etc.)
## Community Maintained Cars Although they're not upstream, the community has openpilot running on other makes and models. See the 'Community Supported Models' section of each make [on our wiki](https://wiki.comma.ai/). \ No newline at end of file diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 6e64f705b0..8f38a00d4d 100755 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -109,6 +109,9 @@ class Footnote(Enum): "(older design) or light brown (newer design). For the newer design, in the interim, choose \"VW J533 Development\" " + "from the vehicle drop-down for a harness that integrates at the CAN gateway inside the dashboard.", Column.MODEL) + VW_VARIANT = CarFootnote( + "Includes versions with extra rear cargo space (may be called Variant, Estate, SportWagen, Shooting Brake, etc.)", + Column.MODEL) @dataclass @@ -118,24 +121,42 @@ class VWCarInfo(CarInfo): CAR_INFO: Dict[str, Union[VWCarInfo, List[VWCarInfo]]] = { - CAR.ARTEON_MK1: VWCarInfo("Volkswagen Arteon 2018, 2021", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), - CAR.ATLAS_MK1: VWCarInfo("Volkswagen Atlas 2018-19, 2022", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + CAR.ARTEON_MK1: [ + VWCarInfo("Volkswagen Arteon 2018-22", footnotes=[Footnote.VW_HARNESS, Footnote.VW_VARIANT], harness=Harness.j533), + VWCarInfo("Volkswagen Arteon R 2020-22", footnotes=[Footnote.VW_HARNESS, Footnote.VW_VARIANT], harness=Harness.j533), + VWCarInfo("Volkswagen Arteon eHybrid 2020-22", footnotes=[Footnote.VW_HARNESS, Footnote.VW_VARIANT], harness=Harness.j533), + VWCarInfo("Volkswagen CC 2018-22", footnotes=[Footnote.VW_HARNESS, Footnote.VW_VARIANT], harness=Harness.j533), + ], + CAR.ATLAS_MK1: [ + VWCarInfo("Volkswagen Atlas 2018-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Atlas Cross Sport 2021-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Teramont 2018-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Teramont Cross Sport 2021-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Teramont X 2021-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + ], CAR.GOLF_MK7: [ - VWCarInfo("Volkswagen e-Golf 2014, 2018-20"), - VWCarInfo("Volkswagen Golf 2015-20"), - VWCarInfo("Volkswagen Golf Alltrack 2017-18"), - VWCarInfo("Volkswagen Golf GTE 2016"), - VWCarInfo("Volkswagen Golf GTI 2018-21"), - VWCarInfo("Volkswagen Golf R 2016-19"), - VWCarInfo("Volkswagen Golf SportsVan 2016"), - VWCarInfo("Volkswagen Golf SportWagen 2015"), + VWCarInfo("Volkswagen e-Golf 2014-20"), + VWCarInfo("Volkswagen Golf 2015-20", footnotes=[Footnote.VW_VARIANT]), + VWCarInfo("Volkswagen Golf Alltrack 2015-19"), + VWCarInfo("Volkswagen Golf GTD 2015-20"), + VWCarInfo("Volkswagen Golf GTE 2015-20"), + VWCarInfo("Volkswagen Golf GTI 2015-21"), + VWCarInfo("Volkswagen Golf R 2015-19", footnotes=[Footnote.VW_VARIANT]), + VWCarInfo("Volkswagen Golf SportsVan 2015-20"), ], CAR.JETTA_MK7: [ - VWCarInfo("Volkswagen Jetta 2018-21"), - VWCarInfo("Volkswagen Jetta GLI 2021"), + VWCarInfo("Volkswagen Jetta 2018-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Jetta GLI 2021-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + ], + CAR.PASSAT_MK8: [ + VWCarInfo("Volkswagen Passat 2015-22", footnotes=[Footnote.VW_HARNESS, Footnote.PASSAT, Footnote.VW_VARIANT], harness=Harness.j533), + VWCarInfo("Volkswagen Passat Alltrack 2015-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Passat GTE 2015-22", footnotes=[Footnote.VW_HARNESS, Footnote.VW_VARIANT], harness=Harness.j533), + ], + CAR.POLO_MK6: [ + VWCarInfo("Volkswagen Polo 2020-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), + VWCarInfo("Volkswagen Polo GTI 2020-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), ], - CAR.PASSAT_MK8: VWCarInfo("Volkswagen Passat 2015-19", footnotes=[Footnote.PASSAT]), - CAR.POLO_MK6: VWCarInfo("Volkswagen Polo 2020"), CAR.TAOS_MK1: VWCarInfo("Volkswagen Taos 2022", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), CAR.TCROSS_MK1: VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), CAR.TIGUAN_MK2: VWCarInfo("Volkswagen Tiguan 2019-22", footnotes=[Footnote.VW_HARNESS], harness=Harness.j533), From 70678bb772ecec78c174b3a71632045f2f6a8806 Mon Sep 17 00:00:00 2001 From: Erich Moraga <33645296+ErichMoraga@users.noreply.github.com> Date: Thu, 14 Jul 2022 15:55:08 -0500 Subject: [PATCH 43/47] Update Corolla Cross Hybrid f/w & doc (#25178) --- docs/CARS.md | 3 ++- selfdrive/car/toyota/values.py | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 3e35782b2a..cf5853ff4c 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -70,7 +70,7 @@ How We Rate The Cars |Toyota|RAV4 2019-21|All|||||| |Toyota|RAV4 Hybrid 2019-21|All|||||| -# Silver - 77 cars +# Silver - 78 cars |Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|Actively Maintained| |---|---|---|:---:|:---:|:---:|:---:|:---:| @@ -126,6 +126,7 @@ How We Rate The Cars |Toyota|Camry 2018-20|All||[4](#footnotes)|||| |Toyota|Camry Hybrid 2018-20|All||[4](#footnotes)|||| |Toyota|Corolla Cross 2020-21 (Non-US only)|All|||||| +|Toyota|Corolla Cross Hybrid 2020-22 (Non-US only)|All|||||| |Toyota|Highlander 2017-19|All|[3](#footnotes)||||| |Toyota|Highlander Hybrid 2017-19|All|[3](#footnotes)||||| |Toyota|Prius 2016-20|TSS-P|[3](#footnotes)||||| diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 63b7240e2f..49aa3c9a94 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -124,6 +124,7 @@ CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { ], CAR.COROLLAH_TSS2: [ ToyotaCarInfo("Toyota Corolla Hybrid 2020-22"), + ToyotaCarInfo("Toyota Corolla Cross Hybrid 2020-22 (Non-US only)", min_enable_speed=7.5), ToyotaCarInfo("Lexus UX Hybrid 2019-22"), ], CAR.HIGHLANDER: ToyotaCarInfo("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo", footnotes=[Footnote.DSU]), @@ -788,6 +789,7 @@ FW_VERSIONS = { (Ecu.eps, 0x7a1, None): [ b'8965B12361\x00\x00\x00\x00\x00\x00', b'8965B12451\x00\x00\x00\x00\x00\x00', + b'8965B16011\x00\x00\x00\x00\x00\x00', b'8965B76012\x00\x00\x00\x00\x00\x00', b'8965B76050\x00\x00\x00\x00\x00\x00', b'\x018965B12350\x00\x00\x00\x00\x00\x00', @@ -808,15 +810,16 @@ FW_VERSIONS = { b'F152612800\x00\x00\x00\x00\x00\x00', b'F152612820\x00\x00\x00\x00\x00\x00', b'F152612840\x00\x00\x00\x00\x00\x00', + b'F152612842\x00\x00\x00\x00\x00\x00', b'F152612890\x00\x00\x00\x00\x00\x00', b'F152612A00\x00\x00\x00\x00\x00\x00', b'F152612A10\x00\x00\x00\x00\x00\x00', + b'F152612D00\x00\x00\x00\x00\x00\x00', + b'F152616011\x00\x00\x00\x00\x00\x00', b'F152642540\x00\x00\x00\x00\x00\x00', b'F152676293\x00\x00\x00\x00\x00\x00', b'F152676303\x00\x00\x00\x00\x00\x00', b'F152676304\x00\x00\x00\x00\x00\x00', - b'F152612D00\x00\x00\x00\x00\x00\x00', - b'F152612842\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ b'\x018821F3301100\x00\x00\x00\x00', @@ -832,6 +835,7 @@ FW_VERSIONS = { b'\x028646F1202000\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', b'\x028646F1202100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b'\x028646F1202200\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F1601100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b"\x028646F1601300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00", b'\x028646F4203400\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', b'\x028646F76020C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', From 505bbce29d45c246be177d81e618f9289e78aa16 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 14 Jul 2022 19:55:18 -0700 Subject: [PATCH 44/47] controlsd: handle radar missing + cleanup system error handling (#25179) * controlsd: handle radar missing + cleanup system erorr handling * fix carla * update refs --- selfdrive/controls/controlsd.py | 25 +++++++++++-------- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/test/process_replay/regen.py | 2 +- .../test/process_replay/test_processes.py | 12 ++++----- tools/sim/start_carla.sh | 1 + 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index b344705f9d..a20a3a9f37 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -96,7 +96,11 @@ class Controls: self.sm = sm if self.sm is None: - ignore = ['driverCameraState', 'managerState'] if SIMULATION else None + ignore = [] + if SIMULATION: + ignore += ['driverCameraState', 'managerState'] + if params.get_bool('WideCameraOnly'): + ignore += ['roadCameraState'] self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration', 'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman', 'managerState', 'liveParameters', 'radarState'] + self.camera_packets + joystick_packet, @@ -224,12 +228,8 @@ class Controls: if not self.CP.notCar: self.events.add_from_msg(self.sm['driverMonitoringState'].events) - # Handle car events. Ignore when CAN is invalid - if CS.canTimeout: - self.events.add(EventName.canBusMissing) - elif not CS.canValid: - self.events.add(EventName.canError) - else: + # Add car events, ignore if CAN isn't valid + if CS.canValid: self.events.add_from_msg(CS.events) # Create events for temperature, disk space, and memory @@ -309,14 +309,19 @@ class Controls: self.events.add(EventName.cameraFrameRate) if self.rk.lagging: self.events.add(EventName.controlsdLagging) - if len(self.sm['radarState'].radarErrors): + if len(self.sm['radarState'].radarErrors) or not self.sm.all_checks(['radarState']): self.events.add(EventName.radarFault) if not self.sm.valid['pandaStates']: self.events.add(EventName.usbError) + if CS.canTimeout: + self.events.add(EventName.canBusMissing) + elif not CS.canValid: + self.events.add(EventName.canError) # generic catch-all. ideally, a more specific event should be added above instead - no_system_errors = len(self.events) != num_events - if (not self.sm.all_checks() or self.can_rcv_error) and no_system_errors and CS.canValid and not CS.canTimeout: + has_disable_events = self.events.any(ET.NO_ENTRY) and (self.events.any(ET.SOFT_DISABLE) or self.events.any(ET.IMMEDIATE_DISABLE)) + no_system_errors = (not has_disable_events) or (len(self.events) == num_events) + if (not self.sm.all_checks() or self.can_rcv_error) and no_system_errors: if not self.sm.all_alive(): self.events.add(EventName.commIssue) elif not self.sm.all_freq_ok(): diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index dff232911e..00bf28ed83 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -fa52fa6c6703269e23610b1c6aba8a56b911fbbb \ No newline at end of file +7c1168af0311d2fef67b82812cd863a0e97c030e \ No newline at end of file diff --git a/selfdrive/test/process_replay/regen.py b/selfdrive/test/process_replay/regen.py index 1a2d436f1a..39f75ce428 100755 --- a/selfdrive/test/process_replay/regen.py +++ b/selfdrive/test/process_replay/regen.py @@ -263,7 +263,7 @@ def regen_segment(lr, frs=None, outdir=FAKEDATA, disable_tqdm=False): seg_path = os.path.join(outdir, segment) # check to make sure openpilot is engaged in the route if not check_enabled(LogReader(os.path.join(seg_path, "rlog"))): - raise Exception(f"Route never enabled: {segment}") + raise Exception(f"Route did not engage for long enough: {segment}") return seg_path diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 4ebb0701dd..08933d143f 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -38,18 +38,18 @@ original_segments = [ segments = [ ("BODY", "regen660D86654BA|2022-07-06--14-27-15--0"), - ("HYUNDAI", "regen657E25856BB|2022-07-06--14-26-51--0"), + ("HYUNDAI", "regen114E5FF24D8|2022-07-14--17-08-47--0"), ("HYUNDAI", "d824e27e8c60172c|2022-07-08--21-21-15--0"), ("TOYOTA", "regenBA97410FBEC|2022-07-06--14-26-49--0"), ("TOYOTA2", "regenDEDB1D9C991|2022-07-06--14-54-08--0"), ("TOYOTA3", "regenDDC1FE60734|2022-07-06--14-32-06--0"), - ("HONDA", "regen17B09D158B8|2022-07-06--14-31-46--0"), - ("HONDA2", "regen041739C3E9A|2022-07-06--15-08-02--0"), - ("CHRYSLER", "regenBB2F9C1425C|2022-07-06--14-31-41--0"), + ("HONDA", "regenE62960EEC38|2022-07-14--19-33-24--0"), + ("HONDA2", "regenC3EBD92F029|2022-07-14--19-29-47--0"), + ("CHRYSLER", "regen38346FB33D0|2022-07-14--18-05-26--0"), ("RAM", "2f4452b03ccb98f0|2022-07-07--08-01-56--3"), - ("SUBARU", "regen732B69F33B1|2022-07-06--14-36-18--0"), + ("SUBARU", "regen54A1E2BE5AA|2022-07-14--18-07-50--0"), ("GM", "regen01D09D915B5|2022-07-06--14-36-20--0"), - ("NISSAN", "regenEA6FB2773F5|2022-07-06--14-58-23--0"), + ("NISSAN", "regenCA0B0DC946E|2022-07-14--18-10-17--0"), ("VOLKSWAGEN", "regen007098CA0EF|2022-07-06--15-01-26--0"), ("MAZDA", "regen61BA413D53B|2022-07-06--14-39-42--0"), ] diff --git a/tools/sim/start_carla.sh b/tools/sim/start_carla.sh index 67ced7eb21..7ead6699f0 100755 --- a/tools/sim/start_carla.sh +++ b/tools/sim/start_carla.sh @@ -22,6 +22,7 @@ if [[ "$DETACH" ]]; then EXTRA_ARGS="-d" fi +docker kill carla_sim || true docker run \ --name carla_sim \ --rm \ From 5ccc2b89213f37649440984b8b660504a2c7fc29 Mon Sep 17 00:00:00 2001 From: Gijs Koning Date: Fri, 15 Jul 2022 13:18:52 +0200 Subject: [PATCH 45/47] Laikad: improve logging + posfix every 2 sec (#25184) * Improve logging for pos fix and caching * Set to debug --- selfdrive/locationd/laikad.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/selfdrive/locationd/laikad.py b/selfdrive/locationd/laikad.py index 13829b22a9..b67c483497 100755 --- a/selfdrive/locationd/laikad.py +++ b/selfdrive/locationd/laikad.py @@ -79,8 +79,8 @@ class Laikad: cloudlog.exception("Error parsing cache") timestamp = self.last_fetch_orbits_t.as_datetime() if self.last_fetch_orbits_t is not None else 'Nan' cloudlog.debug( - f"Loaded nav and orbits cache with timestamp: {timestamp}. Unique orbit and nav sats: {list(cache['orbits'].keys())} {list(cache['nav'].keys())} " + - f"Total: {sum([len(v) for v in cache['orbits']])} and {sum([len(v) for v in cache['nav']])}") + f"Loaded nav ({sum([len(v) for v in cache['nav']])}) and orbits ({sum([len(v) for v in cache['orbits']])}) cache with timestamp: {timestamp}. Unique orbit and nav sats: {list(cache['orbits'].keys())} {list(cache['nav'].keys())} " + + f"With time range: {[f'{start.as_datetime()}, {end.as_datetime()}' for (start,end) in self.astro_dog.orbit_fetched_times._ranges]}") def cache_ephemeris(self, t: GPSTime): if self.save_ephemeris and (self.last_cached_t is None or t - self.last_cached_t > SECS_IN_MIN): @@ -94,10 +94,15 @@ class Laikad: if self.last_pos_fix_t is None or abs(self.last_pos_fix_t - t) >= 2: min_measurements = 6 if any(p.constellation_id == ConstellationId.GLONASS for p in processed_measurements) else 5 pos_fix, pos_fix_residual = calc_pos_fix_gauss_newton(processed_measurements, self.posfix_functions, min_measurements=min_measurements) - if len(pos_fix) > 0 and np.median(np.abs(pos_fix_residual)) < POS_FIX_RESIDUAL_THRESHOLD: - self.last_pos_fix = pos_fix[:3] - self.last_pos_residual = pos_fix_residual + if len(pos_fix) > 0: self.last_pos_fix_t = t + residual_median = np.median(np.abs(pos_fix_residual)) + if np.median(np.abs(pos_fix_residual)) < POS_FIX_RESIDUAL_THRESHOLD: + cloudlog.debug(f"Pos fix is within threshold with median: {residual_median.round()}") + self.last_pos_fix = pos_fix[:3] + self.last_pos_residual = pos_fix_residual + else: + cloudlog.debug(f"Pos fix failed with median: {residual_median.round()}. All residuals: {np.round(pos_fix_residual)}") return self.last_pos_fix def process_ublox_msg(self, ublox_msg, ublox_mono_time: int, block=False): @@ -115,10 +120,11 @@ class Laikad: new_meas = [m for m in new_meas if 1e7 < m.observables['C1C'] < 3e7] processed_measurements = process_measurements(new_meas, self.astro_dog) - est_pos = self.get_est_pos(t, processed_measurements) corrected_measurements = correct_measurements(processed_measurements, est_pos, self.astro_dog) if len(est_pos) > 0 else [] + if ublox_mono_time % 10 == 0: + cloudlog.debug(f"Measurements Incoming/Processed/Corrected: {len(new_meas), len(processed_measurements), len(corrected_measurements)}") self.update_localizer(est_pos, t, corrected_measurements) kf_valid = all(self.kf_valid(t)) @@ -212,6 +218,8 @@ def get_orbit_data(t: GPSTime, valid_const, auto_update, valid_ephem_types, cach try: astro_dog.get_orbit_data(t, only_predictions=True) cloudlog.info(f"Done parsing orbits. Took {time.monotonic() - start_time:.1f}s") + cloudlog.debug(f"Downloaded orbits ({sum([len(v) for v in astro_dog.orbits])}): {list(astro_dog.orbits.keys())}" + + f"With time range: {[f'{start.as_datetime()}, {end.as_datetime()}' for (start,end) in astro_dog.orbit_fetched_times._ranges]}") return astro_dog.orbits, astro_dog.orbit_fetched_times, t except (DownloadFailed, RuntimeError, ValueError, IOError) as e: cloudlog.warning(f"No orbit data found or parsing failure: {e}") From 91eb096ac98b46605c283c637ed1e6b15598dc52 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 16 Jul 2022 01:53:10 +0800 Subject: [PATCH 46/47] replay: add support for reading from plain logs (#25053) * read from plain log * reduce memory copies * cleanup * fix test_replay --- tools/replay/logreader.cc | 22 +++++++++++----------- tools/replay/logreader.h | 2 +- tools/replay/route.cc | 4 ++-- tools/replay/tests/test_replay.cc | 1 + 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/tools/replay/logreader.cc b/tools/replay/logreader.cc index f27224ac53..9b7a07a83f 100644 --- a/tools/replay/logreader.cc +++ b/tools/replay/logreader.cc @@ -47,22 +47,22 @@ LogReader::~LogReader() { } bool LogReader::load(const std::string &url, std::atomic *abort, bool local_cache, int chunk_size, int retries) { - FileReader f(local_cache, chunk_size, retries); - std::string data = f.read(url, abort); - if (data.empty()) return false; + raw_ = FileReader(local_cache, chunk_size, retries).read(url, abort); + if (raw_.empty()) return false; - return load((std::byte*)data.data(), data.size(), abort); + if (url.find(".bz2") != std::string::npos) { + raw_ = decompressBZ2(raw_, abort); + if (raw_.empty()) return false; + } + return parse(abort); } bool LogReader::load(const std::byte *data, size_t size, std::atomic *abort) { - raw_ = decompressBZ2(data, size, abort); - if (raw_.empty()) { - if (!(abort && *abort)) { - rWarning("failed to decompress log"); - } - return false; - } + raw_.assign((const char *)data, size); + return parse(abort); +} +bool LogReader::parse(std::atomic *abort) { try { kj::ArrayPtr words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word)); while (words.size() > 0 && !(abort && *abort)) { diff --git a/tools/replay/logreader.h b/tools/replay/logreader.h index fb63bf3913..bd666d0a74 100644 --- a/tools/replay/logreader.h +++ b/tools/replay/logreader.h @@ -52,10 +52,10 @@ public: ~LogReader(); bool load(const std::string &url, std::atomic *abort = nullptr, bool local_cache = false, int chunk_size = -1, int retries = 0); bool load(const std::byte *data, size_t size, std::atomic *abort = nullptr); - std::vector events; private: + bool parse(std::atomic *abort); std::string raw_; #ifdef HAS_MEMORY_RESOURCE std::pmr::monotonic_buffer_resource *mbr_ = nullptr; diff --git a/tools/replay/route.cc b/tools/replay/route.cc index 5b47090229..c91b27ae81 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -82,9 +82,9 @@ void Route::addFileToSegment(int n, const QString &file) { const int pos = name.lastIndexOf("--"); name = pos != -1 ? name.mid(pos + 2) : name; - if (name == "rlog.bz2") { + if (name == "rlog.bz2" || name == "rlog") { segments_[n].rlog = file; - } else if (name == "qlog.bz2") { + } else if (name == "qlog.bz2" || name == "qlog") { segments_[n].qlog = file; } else if (name == "fcamera.hevc") { segments_[n].road_cam = file; diff --git a/tools/replay/tests/test_replay.cc b/tools/replay/tests/test_replay.cc index bd5dee013c..d6482c3ca2 100644 --- a/tools/replay/tests/test_replay.cc +++ b/tools/replay/tests/test_replay.cc @@ -71,6 +71,7 @@ TEST_CASE("LogReader") { FileReader reader(true); std::string corrupt_content = reader.read(TEST_RLOG_URL); corrupt_content.resize(corrupt_content.length() / 2); + corrupt_content = decompressBZ2(corrupt_content); LogReader log; REQUIRE(log.load((std::byte *)corrupt_content.data(), corrupt_content.size())); REQUIRE(log.events.size() > 0); From 98a0cd9455ad4ae02145d0653c0dabdfab0b3f0f Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Fri, 15 Jul 2022 19:42:13 +0100 Subject: [PATCH 47/47] Ford: FPv2 firmware request (#24211) --- selfdrive/car/fw_versions.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 5a33cdf6b7..c7256e7438 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -99,6 +99,11 @@ CHRYSLER_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x CHRYSLER_RX_OFFSET = -0x280 +FORD_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER) +FORD_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER) + @dataclass class Request: @@ -207,6 +212,13 @@ REQUESTS: List[Request] = [ [CHRYSLER_VERSION_REQUEST], [CHRYSLER_VERSION_RESPONSE], ), + # Ford + Request( + "ford", + [TESTER_PRESENT_REQUEST, FORD_VERSION_REQUEST], + [TESTER_PRESENT_RESPONSE, FORD_VERSION_RESPONSE], + bus=0, + ), ]