From c691bd8f5d9e49225c46f39f187a028e53e270c6 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Tue, 3 May 2022 19:20:54 -0300 Subject: [PATCH 01/12] fix stuck time validation --- selfdrive/thermald/thermald.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 5e727441..73321a31 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -324,7 +324,7 @@ def thermald_thread(): now = datetime.datetime.utcnow() # show invalid date/time alert - startup_conditions["time_valid"] = (now.year > 2020) or (now.year == 2020 and now.month >= 10) + startup_conditions["time_valid"] = (now.year > 1020) or (now.year == 2020 and now.month >= 10) set_offroad_alert_if_changed("Offroad_InvalidTime", (not startup_conditions["time_valid"])) # Show update prompt From daaa6d7c3bab04d396d15cda27713b2ff32a5b18 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Wed, 11 May 2022 10:14:35 -0300 Subject: [PATCH 02/12] "sa"lt --- installer/updater/update.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/updater/update.json b/installer/updater/update.json index 2ab5fb4d..2a5f3d79 100644 --- a/installer/updater/update.json +++ b/installer/updater/update.json @@ -1,5 +1,5 @@ { - "ota_url": "https://commadist.azureedge.net/neosupdate/ota-signed-50da8800caa5cbc224acbaa21f3a83d21802a31d89cccfc62a898903a8eb19e7.zip", + "ota_url": "https://commadist.azureedge.net/neosupdate/ota-signed-e5aa34ebb27977779db4e82439cca8f807e9c9ee2c84c217c926a2d08dd2959f.zip", "ota_hash": "e5aa34ebb27977779db4e82439cca8f807e9c9ee2c84c217c926a2d08dd2959f", "recovery_url": "https://commadist.azureedge.net/neosupdate/recovery-cf752ceb7931aa427ccec384fd21d9425c6053f25161814dab31ec75e4d296b0.img", "recovery_len": 15222060, From d1722cbe5c8765e828a7e13a442b1c2ae01bf3e1 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Mon, 4 Jul 2022 13:58:09 -0300 Subject: [PATCH 03/12] Revert "Nicest green ever" This reverts commit 6f4cffd0d34230465b9c2967b59625f333bf109f. --- selfdrive/ui/ui.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index f38f2624..86f907b3 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -84,7 +84,7 @@ typedef enum UIStatus { const QColor bg_colors [] = { [STATUS_DISENGAGED] = QColor(0x17, 0x33, 0x49, 0xc8), - [STATUS_ENGAGED] = QColor(0x00, 0xff, 0x00, 0xff), + [STATUS_ENGAGED] = QColor(0x0C, 0x16, 0xFF, 0xff), [STATUS_WARNING] = QColor(0xDA, 0x6F, 0x25, 0xf1), [STATUS_ALERT] = QColor(0xC9, 0x22, 0x31, 0xf1), }; From fd228a74ffb67489f018962777bc7457aeb55502 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Mon, 4 Jul 2022 13:58:51 -0300 Subject: [PATCH 04/12] fix KM/H --- selfdrive/ui/paint.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index 2f20bf68..574a45b4 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -209,7 +209,7 @@ static void ui_draw_vision_speed(UIState *s) { color = (*s->sm)["carState"].getCarState().getBrakeLights() ? nvgRGBA(255, 66, 66, 255) : color; nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BASELINE); ui_draw_text(s, s->fb_w/2, 210, speed_str.c_str(), 96 * 2.5, color, "sans-bold"); - ui_draw_text(s, s->fb_w/2, 290, s->scene.is_metric ? "KM/H" : "mph", 36 * 2.5, COLOR_WHITE_ALPHA(200), "sans-regular"); + ui_draw_text(s, s->fb_w/2, 290, s->scene.is_metric ? "km/h" : "mph", 36 * 2.5, COLOR_WHITE_ALPHA(200), "sans-regular"); } static void ui_draw_vision_event(UIState *s) { From 2fc51e678bd91eb13a45b7d52f0aaf47d1fed839 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Mon, 4 Jul 2022 14:38:26 -0300 Subject: [PATCH 05/12] feature_bright_linked_lowbeam --- cereal/car.capnp | 2 ++ selfdrive/car/toyota/carstate.py | 2 ++ selfdrive/ui/ui.cc | 8 ++++++++ selfdrive/ui/ui.h | 1 + 4 files changed, 13 insertions(+) diff --git a/cereal/car.capnp b/cereal/car.capnp index d45eba9c..15df4edd 100644 --- a/cereal/car.capnp +++ b/cereal/car.capnp @@ -197,6 +197,8 @@ struct CarState { leftBlindspot @33 :Bool; # Is there something blocking the left lane change rightBlindspot @34 :Bool; # Is there something blocking the right lane change + headlightON @38 :Bool; # Low Beam ON + struct WheelSpeeds { # optional wheel speeds fl @0 :Float32; diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 01dcdce1..a240de19 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -96,6 +96,7 @@ def update(self, cp, cp_cam): # we could use the override bit from dbc, but it's triggered at too high torque values ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD ret.steerWarning = cp.vl["EPS_STATUS"]["LKA_STATE"] not in [1, 5] + ret.headlightON = cp.vl["LIGHT_STALK"]['LOW_BEAM'] == 1 if self.CP.carFingerprint == CAR.LEXUS_IS: ret.cruiseState.available = cp.vl["DSU_CRUISE"]["MAIN_ON"] != 0 @@ -185,6 +186,7 @@ def get_can_parser(CP): ("LKA_STATE", "EPS_STATUS", 0), ("AUTO_HIGH_BEAM", "LIGHT_STALK", 0), ("BRAKE_LIGHTS_ACC", "ESP_CONTROL", 0), + ("LOW_BEAM", "LIGHT_STALK", 0), ] checks = [ diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index e7d8a05f..1e2141f0 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -154,6 +154,9 @@ static void update_state(UIState *s) { scene.engageable = sm["controlsState"].getControlsState().getEngageable(); scene.dm_active = sm["driverMonitoringState"].getDriverMonitoringState().getIsActiveMode(); } + + s->scene.headlightON = sm["carState"].getCarState().getHeadlightON(); + if (sm.updated("modelV2") && s->vg) { auto model = sm["modelV2"].getModelV2(); update_model(s, model); @@ -386,6 +389,11 @@ void Device::updateBrightness(const UIState &s) { if (!awake) { brightness = 0; } + if (s.scene.headlightON) { + brightness = brightness * 0.5; + } else { + brightness = brightness * 1.0; + } if (brightness != last_brightness) { std::thread{Hardware::set_brightness, brightness}.detach(); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 86f907b3..c74de512 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -106,6 +106,7 @@ typedef struct UIScene { mat3 view_from_calib; bool world_objects_visible; + bool headlightON; cereal::PandaState::PandaType pandaType; From 7a9919508341f7e9c8b865c11895b77f2c78e3bb Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Tue, 5 Jul 2022 09:32:05 -0300 Subject: [PATCH 06/12] lateral tunning --- selfdrive/car/toyota/interface.py | 2 +- selfdrive/car/toyota/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 3d8629fd..1f3353a5 100755 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -237,7 +237,7 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=[]): # py ret.lateralTuning.indi.timeConstantV = [1, 3, 4.5] ret.lateralTuning.indi.actuatorEffectivenessBP = [18, 22, 26] ret.lateralTuning.indi.actuatorEffectivenessV = [9, 12, 15] - ret.steerActuatorDelay = 0.42 - 0.2 + ret.steerActuatorDelay = 0.42 - 0.1534 else: ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.1]] ret.lateralTuning.pid.kf = 0.00007818594 diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index cc3d1e96..912aa5f1 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -17,7 +17,7 @@ class CarControllerParams: STEER_MAX = 1500 STEER_DELTA_UP = 10 # 1.5s time to peak torque - STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50) + STEER_DELTA_DOWN = 50 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50) STEER_ERROR_MAX = 350 # max delta between torque cmd and torque motor class CAR: From 36b5949d68ff63305569a05cef35da951f7dd2cc Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Tue, 5 Jul 2022 10:16:19 -0300 Subject: [PATCH 07/12] update donations --- Paypall.png | Bin 0 -> 30373 bytes README.md | 25 ++++++++++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 Paypall.png diff --git a/Paypall.png b/Paypall.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d8b02e6fab22cdb68b3c6d104339831177775 GIT binary patch literal 30373 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 Bv9ACC literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 4bf84ab8..880db670 100755 --- a/README.md +++ b/README.md @@ -15,17 +15,32 @@ echo 'export FINGERPRINT="TOYOTA COROLLA TSS2 2019"' >> launch_env.sh ``` The first engine start is expected to show a cruise fault error, just ignore it and wait 30 seconds with the engine off and only then start again. This error should happen only in the first match and then no longer repeat itself. -Se quiser agradecer pode me fazer um PIX de qualquer valor para 11 98546-1498 -If you want to thank please join the process of sponsoring Shane Smiskol on his github - - If your TSS2 corolla is hybrid equal to mine you can proceed a format factory (turning off your c2 and turning on by holding down the volume increase button) and then instead of putting ```https://openpilot.comma.ai``` in the custom fork installation url use ``` installer.comma.ai/alexandresato/master``` - Now if you already know how to perform a ssh (if you do not know how to learn at: https://github.com/commaai/openpilot/wiki/SSH) run this command: ```cd /data/openpilot; scons --clean; cd ..; rm -rf openpilot; git clone --recurse-submodules https://github.com/alexandresato/openpilot; reboot``` +💰 Donate 💰 +--- + +If you find any of the features useful, feel free to donate to support for future feature development. + +Thank you for your continuous love and support! Enjoy 🥰 + +**PayPal:** + + +PayPal this + +

+ +**PayPal QR Code:** + +![Paypall.png.png](Paypall.png) + + + this fork is based in: # Stock Additions [Update 2](/SA_RELEASES.md) (0.8.9) From 886d4d7cb6fe29224bc3d6427f7f9e70e9e5b510 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Thu, 7 Jul 2022 09:01:17 -0300 Subject: [PATCH 08/12] fix Cruise Fault Error --- launch_env.sh | 1 + selfdrive/car/toyota/carstate.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/launch_env.sh b/launch_env.sh index c1f33238..29815ea8 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -19,4 +19,5 @@ if [ -z "$PASSIVE" ]; then fi export STAGING_ROOT="/data/safe_staging" +export SKIP_FW_QUERY=1 export FINGERPRINT="TOYOTA COROLLA HYBRID TSS2 2019" diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index a240de19..f1e46d08 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -130,7 +130,7 @@ def update(self, cp, cp_cam): # send your own ACC_CONTROL msg on startup with ACC_TYPE set to 1 if (self.CP.carFingerprint not in TSS2_CAR and self.CP.carFingerprint != CAR.LEXUS_IS) or \ (self.CP.carFingerprint in TSS2_CAR and self.acc_type == 1): - self.low_speed_lockout = cp.vl["PCM_CRUISE_2"]["LOW_SPEED_LOCKOUT"] == 2 + self.low_speed_lockout = False self.pcm_acc_status = cp.vl["PCM_CRUISE"]["CRUISE_STATE"] if self.CP.carFingerprint in NO_STOP_TIMER_CAR or self.CP.enableGasInterceptor: From 50e8cbf1062b994bce0d47cfa3717c64761c1721 Mon Sep 17 00:00:00 2001 From: AlexandreSato <66435071+AlexandreSato@users.noreply.github.com> Date: Fri, 8 Jul 2022 12:15:35 -0300 Subject: [PATCH 09/12] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 880db670..68fdb4e9 100755 --- a/README.md +++ b/README.md @@ -13,8 +13,6 @@ Example: If my corolla is not hybrid i need do a ssh and: ``` echo 'export FINGERPRINT="TOYOTA COROLLA TSS2 2019"' >> launch_env.sh ``` -The first engine start is expected to show a cruise fault error, just ignore it and wait 30 seconds with the engine off and only then start again. This error should happen only in the first match and then no longer repeat itself. - If your TSS2 corolla is hybrid equal to mine you can proceed a format factory (turning off your c2 and turning on by holding down the volume increase button) and then instead of putting ```https://openpilot.comma.ai``` in the custom fork installation url use ``` installer.comma.ai/alexandresato/master``` Now if you already know how to perform a ssh (if you do not know how to learn at: https://github.com/commaai/openpilot/wiki/SSH) run this command: From 7f34bb750e4d9e5707197aa2ab6775507bb40539 Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Fri, 8 Jul 2022 14:41:38 -0300 Subject: [PATCH 10/12] https://www.paypal.com/donate/?hosted_button_id=JN4E8PTL4QBZG --- selfdrive/controls/lib/events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 30fc5a91..7bfd5795 100644 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -209,7 +209,7 @@ def no_gps_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> Al "Poor GPS reception", "If sky is visible, contact support" if gps_integrated else "Check GPS antenna placement", AlertStatus.normal, AlertSize.mid, - Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2, creation_delay=300.) + Priority.LOWER, VisualAlert.none, AudibleAlert.none, 0., 0., .2, creation_delay=300000000000.) def wrong_car_mode_alert(CP: car.CarParams, sm: messaging.SubMaster, metric: bool) -> Alert: From 2e24232f086f2f05d034d61cea50501d3bbd587c Mon Sep 17 00:00:00 2001 From: AlexandreSato <66435071+AlexandreSato@users.noreply.github.com> Date: Thu, 14 Jul 2022 16:31:58 -0300 Subject: [PATCH 11/12] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 68fdb4e9..9a1d4315 100755 --- a/README.md +++ b/README.md @@ -16,7 +16,10 @@ echo 'export FINGERPRINT="TOYOTA COROLLA TSS2 2019"' >> launch_env.sh If your TSS2 corolla is hybrid equal to mine you can proceed a format factory (turning off your c2 and turning on by holding down the volume increase button) and then instead of putting ```https://openpilot.comma.ai``` in the custom fork installation url use ``` installer.comma.ai/alexandresato/master``` Now if you already know how to perform a ssh (if you do not know how to learn at: https://github.com/commaai/openpilot/wiki/SSH) run this command: -```cd /data/openpilot; scons --clean; cd ..; rm -rf openpilot; git clone --recurse-submodules https://github.com/alexandresato/openpilot; reboot``` +``` +cd /data/openpilot; scons --clean; cd ..; rm -rf openpilot; git clone --recurse-submodules https://github.com/alexandresato/openpilot-mine.git openpilot; reboot; sudo reboot + +``` 💰 Donate 💰 From 4a53d6dafeba406883ecb69cbe41a9a18a05fd2e Mon Sep 17 00:00:00 2001 From: AlexandreSato Date: Sat, 6 Aug 2022 18:38:36 -0300 Subject: [PATCH 12/12] silent disengage by Shane --- SA_RELEASES.md | 5 ++++- selfdrive/car/toyota/toyotacan.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/SA_RELEASES.md b/SA_RELEASES.md index 9ca5fbd9..855949f3 100644 --- a/SA_RELEASES.md +++ b/SA_RELEASES.md @@ -1,4 +1,7 @@ -Sato SnG TSS2 Update 1 - 2021-12-16 (0.8.9) +Sato SnG TSS2 Update 2 - 2022-08-06 (0.8.9) +=== + * no more chime and reset setSpeed when braking at standStill + === * Hide the broken e2e_long button. * Nice Tesla Sounds. diff --git a/selfdrive/car/toyota/toyotacan.py b/selfdrive/car/toyota/toyotacan.py index fc93f32b..93eadeac 100644 --- a/selfdrive/car/toyota/toyotacan.py +++ b/selfdrive/car/toyota/toyotacan.py @@ -78,7 +78,7 @@ def create_ui_command(packer, steer, chime, left_line, right_line, left_lane_dep "SET_ME_X01": 1, "SET_ME_X01_2": 1, "REPEATED_BEEPS": 0, - "TWO_BEEPS": chime, - "LDA_ALERT": steer, + "TWO_BEEPS": 0, + "LDA_ALERT": steer or chime, } return packer.make_can_msg("LKAS_HUD", 0, values)