diff --git a/cereal/custom.capnp b/cereal/custom.capnp index a85dd31039a568..0fa098743f01b7 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -62,8 +62,8 @@ struct FrogPilotPlan @0x80ae746ee2596b11 { maxAcceleration @12 :Float32; minAcceleration @13 :Float32; redLight @14 :Bool; - safeObstacleDistance @15 :Int32; - safeObstacleDistanceStock @16 :Int32; + safeObstacleDistance @15 :Int64; + safeObstacleDistanceStock @16 :Int64; slcOverridden @17 :Bool; slcOverriddenSpeed @18 :Float32; slcSpeedLimit @19 :Float32; @@ -71,7 +71,7 @@ struct FrogPilotPlan @0x80ae746ee2596b11 { speedJerk @21 :Float32; speedJerkStock @22 :Float32; speedLimitChanged @23 :Bool; - stoppedEquivalenceFactor @24 :Int32; + stoppedEquivalenceFactor @24 :Int64; tFollow @25 :Float32; togglesUpdated @26 :Bool; unconfirmedSlcSpeedLimit @27 :Float32; diff --git a/cereal/services.py b/cereal/services.py index 6d2950223a1775..6a15c9672c27ad 100755 --- a/cereal/services.py +++ b/cereal/services.py @@ -74,13 +74,6 @@ def __init__(self, should_log: bool, frequency: float, decimation: Optional[int] "userFlag": (True, 0., 1), "microphone": (True, 10., 10), - # FrogPilot - "frogpilotCarControl": (True, 100., 10), - "frogpilotCarState": (True, 100., 10), - "frogpilotDeviceState": (True, 2., 1), - "frogpilotNavigation": (True, 1., 10), - "frogpilotPlan": (True, 20., 5), - # debug "uiDebug": (True, 0., 1), "testJoystick": (True, 0.), diff --git a/common/params.cc b/common/params.cc index a30286ee96ad14..08eee2fe468295 100644 --- a/common/params.cc +++ b/common/params.cc @@ -287,6 +287,7 @@ std::unordered_map keys = { {"CustomSounds", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_VISUALS}, {"CustomUI", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_VISUALS}, {"DecelerationProfile", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, + {"DefaultModelName", CLEAR_ON_MANAGER_START}, {"DeveloperUI", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_VISUALS}, {"DeviceManagement", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, {"DeviceShutdown", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, @@ -434,6 +435,7 @@ std::unordered_map keys = { {"OneLaneChange", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, {"OnroadDistanceButton", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, {"OnroadDistanceButtonPressed", PERSISTENT}, + {"openpilotMinutes", PERSISTENT}, {"OSMDownloadBounds", PERSISTENT}, {"OSMDownloadLocations", PERSISTENT}, {"OSMDownloadProgress", CLEAR_ON_MANAGER_START}, @@ -502,6 +504,7 @@ std::unordered_map keys = { {"SidebarMetrics", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_VISUALS}, {"SignalMetrics", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_VISUALS}, {"SignalToDownload", PERSISTENT}, + {"SLCConfirmation", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, {"SLCConfirmationHigher", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, {"SLCConfirmationLower", PERSISTENT | FROGPILOT_STORAGE | FROGPILOT_CONTROLS}, {"SLCConfirmed", PERSISTENT}, diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index e2172546d4ef65..6d162c84450e09 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -272,7 +272,6 @@ def get_can_parser(CP): ("BODY_CONTROL_STATE", 3), ("BODY_CONTROL_STATE_2", 2), ("ESP_CONTROL", 3), - ("VSC1S07", 20), ("EPS_STATUS", 25), ("BRAKE_MODULE", 40), ("WHEEL_SPEEDS", 80), diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index cf72cb26354efb..552bc90a4c0f98 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -814,7 +814,7 @@ def publish_logs(self, CS, start_time, CC, lac_log, FPCC): if self.enabled: clear_event_types.add(ET.NO_ENTRY) - alerts = self.events.create_alerts(self.current_alert_types, [self.CP, CS, self.sm, self.is_metric, self.soft_disable_timer]) + alerts = self.events.create_alerts(self.current_alert_types, [self.CP, CS, self.sm, self.is_metric, self.soft_disable_timer, self.frogpilot_toggles]) self.AM.add_many(self.sm.frame, alerts) current_alert = self.AM.process_alerts(self.sm.frame, clear_event_types) if current_alert: diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 6c40daf8acf0cf..714619052294a2 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -4,6 +4,7 @@ import os from enum import IntEnum from collections.abc import Callable +from types import SimpleNamespace from cereal import log, car import cereal.messaging as messaging @@ -212,31 +213,31 @@ def get_display_speed(speed_ms: float, metric: bool) -> str: def soft_disable_alert(alert_text_2: str) -> AlertCallbackType: - def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: if soft_disable_time < int(0.5 / DT_CTRL): return ImmediateDisableAlert(alert_text_2) return SoftDisableAlert(alert_text_2) return func def user_soft_disable_alert(alert_text_2: str) -> AlertCallbackType: - def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: if soft_disable_time < int(0.5 / DT_CTRL): return ImmediateDisableAlert(alert_text_2) return UserSoftDisableAlert(alert_text_2) return func -def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: branch = get_short_branch() # Ensure get_short_branch is cached to avoid lags on startup if "REPLAY" in os.environ: branch = "replay" return StartupAlert("WARNING: This branch is not tested", branch, alert_status=AlertStatus.userPrompt) -def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage") -def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: return Alert( f"Steer Unavailable Below {get_display_speed(CP.minSteerSpeed, metric)}", "", @@ -244,7 +245,7 @@ def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.S Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 0.4) -def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: first_word = 'Recalibration' if sm['liveCalibration'].calStatus == log.LiveCalibrationData.Status.recalibrating else 'Calibration' return Alert( f"{first_word} in Progress: {sm['liveCalibration'].calPerc:.0f}%", @@ -253,54 +254,39 @@ def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messag Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) -def torque_nn_load_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: - model_name = Params().get("NNFFModelName", encoding='utf-8') - if model_name == "": - return Alert( - "NNFF Torque Controller not available", - "Donate logs to Twilsonco to get your car supported!", - AlertStatus.userPrompt, AlertSize.mid, - Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 10.0) - else: - return Alert( - "NNFF Torque Controller loaded", - model_name, - AlertStatus.frogpilot, AlertSize.mid, - Priority.LOW, VisualAlert.none, AudibleAlert.engage, 5.0) - # *** debug alerts *** -def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: full_perc = round(100. - sm['deviceState'].freeSpacePercent) return NormalPermanentAlert("Out of Storage", f"{full_perc}% full") -def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan err = CS.vEgo - mdl msg = f"Speed Error: {err:.1f} m/s" return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid") -def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning] msg = ', '.join(not_running) return NoEntryAlert(msg, alert_text_1="Process Not Running") -def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: bs = [s for s in sm.data.keys() if not sm.all_checks([s, ])] msg = ', '.join(bs[:4]) # can't fit too many on one line return NoEntryAlert(msg, alert_text_1="Communication Issue Between Processes") -def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])] return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams)) -def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: rpy = sm['liveCalibration'].rpyCalib yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan) pitch = math.degrees(rpy[1] if len(rpy) == 3 else math.nan) @@ -308,34 +294,34 @@ def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging return NormalPermanentAlert("Calibration Invalid", angles) -def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: cpu = max(sm['deviceState'].cpuTempC, default=0.) gpu = max(sm['deviceState'].gpuTempC, default=0.) temp = max((cpu, gpu, sm['deviceState'].memoryTempC)) return NormalPermanentAlert("System Overheated", f"{temp:.0f} Β°C") -def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: return NormalPermanentAlert("Low Memory", f"{sm['deviceState'].memoryUsagePercent}% used") -def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: x = max(sm['deviceState'].cpuUsagePercent, default=0.) return NormalPermanentAlert("High CPU Usage", f"{x}% used") -def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: return NormalPermanentAlert("Driving Model Lagging", f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped") -def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: text = "Enable Adaptive Cruise to Engage" if CP.carName == "honda": text = "Enable Main Switch to Engage" return NoEntryAlert(text) -def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: axes = sm['testJoystick'].axes gb, steer = list(axes)[:2] if len(axes) else (0., 0.) vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%" @@ -343,11 +329,11 @@ def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, # FrogPilot Alerts -def custom_startup_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: - params = Params() - return StartupAlert(params.get("StartupMessageTop", encoding='utf-8') or "", params.get("StartupMessageBottom", encoding='utf-8') or "", alert_status=AlertStatus.frogpilot) +def custom_startup_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: + return StartupAlert(frogpilot_toggles.startup_alert_top, frogpilot_toggles.startup_alert_bottom, alert_status=AlertStatus.frogpilot) + -def forcing_stop_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: +def forcing_stop_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: model_length = sm['frogpilotPlan'].forcingStopLength model_length_msg = f"{model_length:.1f} meters" if metric else f"{model_length * CV.METER_TO_FOOT:.1f} feet" @@ -357,7 +343,8 @@ def forcing_stop_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMas AlertStatus.frogpilot, AlertSize.mid, Priority.MID, VisualAlert.none, AudibleAlert.prompt, 1.) -def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: + +def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: holiday_messages = { "new_years": ("Happy New Year! πŸŽ‰", "newYearsDayAlert"), "valentines": ("Happy Valentine's Day! ❀️", "valentinesDayAlert"), @@ -372,7 +359,7 @@ def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, "christmas_week": ("Merry Christmas! πŸŽ„", "christmasAlert") } - holiday_name = Params().get("CurrentHolidayTheme", encoding='utf-8') + holiday_name = frogpilot_toggles.current_holiday_theme message, alert_type = holiday_messages.get(holiday_name, ("", "")) return Alert( @@ -381,7 +368,8 @@ def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, AlertStatus.normal, AlertSize.small, Priority.LOWEST, VisualAlert.none, AudibleAlert.engage, 5.) -def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: + +def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: lane_width = sm['frogpilotPlan'].laneWidthLeft if CS.leftBlinker else sm['frogpilotPlan'].laneWidthRight lane_width_msg = f"{lane_width:.1f} meters" if metric else f"{lane_width * CV.METER_TO_FOOT:.1f} feet" @@ -391,6 +379,23 @@ def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.S AlertStatus.normal, AlertSize.mid, Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) + +def torque_nn_load_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, frogpilot_toggles: SimpleNamespace) -> Alert: + model_name = Params().get("NNFFModelName", encoding='utf-8') + if model_name == "": + return Alert( + "NNFF Torque Controller not available", + "Donate logs to Twilsonco to get your car supported!", + AlertStatus.userPrompt, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 10.0) + else: + return Alert( + "NNFF Torque Controller loaded", + model_name, + AlertStatus.frogpilot, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.none, 5.0) + + EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # ********** events with no alerts ********** @@ -1078,7 +1083,7 @@ def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.S "openpilot crashed", "Please post the 'Error Log' in the FrogPilot Discord!", AlertStatus.normal, AlertSize.mid, - Priority.HIGH, VisualAlert.none, AudibleAlert.none, 10.), + Priority.HIGHEST, VisualAlert.none, AudibleAlert.prompt, 10.), }, EventName.pedalInterceptorNoBrake: { diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py index 4259ddf03f2181..a144574304a7e2 100644 --- a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py +++ b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py @@ -326,10 +326,10 @@ def extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau): lead_xv = np.column_stack((x_lead_traj, v_lead_traj)) return lead_xv - def process_lead(self, lead, increased_distance=0): + def process_lead(self, lead): v_ego = self.x0[1] if lead is not None and lead.status: - x_lead = lead.dRel - increased_distance + x_lead = lead.dRel v_lead = lead.vLead a_lead = lead.aLeadK a_lead_tau = lead.aLeadTau diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index 5ac09e1b4cbbab..9249d6231ef1af 100644 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -221,17 +221,6 @@ def get_lead_adjacent(tracks: dict[int, Track], model_data: capnp._DynamicStruct return lead_dict -def get_lead_adjacent(tracks: dict[int, Track], model_data: capnp._DynamicStructReader, lane_width: float, left: bool = True, far: bool = False) -> dict[str, Any]: - lead_dict = {'status': False} - - adjacent_tracks = [c for c in tracks.values() if c.vLead > 1 and c.potential_adjacent_lead(far, lane_width, left, model_data)] - if len(adjacent_tracks) > 0: - closest_track = min(adjacent_tracks, key=lambda c: c.dRel) - lead_dict = closest_track.get_RadarState() - - return lead_dict - - class RadarD: def __init__(self, frogpilot_toggles, radar_ts: float, delay: int = 0): self.points: dict[int, tuple[float, float, float]] = {} diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif deleted file mode 100644 index 05cd8d01c4e7ec..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif deleted file mode 100644 index 7882afbbbe2352..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif deleted file mode 100644 index c97c85cd94d85b..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif deleted file mode 100644 index 3e3f898c349a92..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/traditional_100 b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/traditional_100 deleted file mode 100644 index e69de29bb2d1d6..00000000000000 diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png deleted file mode 100644 index 8c2f7a54ed26a3..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png deleted file mode 100644 index 3c7d2d9eb8a0ad..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png deleted file mode 100644 index b495eeae190cbc..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png deleted file mode 100644 index 024a0b03ea6c08..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png deleted file mode 100644 index 91eb05f12f4579..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png deleted file mode 100644 index 3c7d2d9eb8a0ad..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png b/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png deleted file mode 100644 index b721266fb2f1b1..00000000000000 Binary files a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/model_manager.py b/selfdrive/frogpilot/assets/model_manager.py index 92de018d3e3bf4..2085539ca3e939 100644 --- a/selfdrive/frogpilot/assets/model_manager.py +++ b/selfdrive/frogpilot/assets/model_manager.py @@ -74,7 +74,7 @@ def fetch_all_model_sizes(repo_url): return {file['name'].replace('.thneed', ''): file['size'] for file in thneed_files if 'size' in file} except requests.RequestException as e: - raise ConnectionError(f"Failed to fetch model sizes from {'GitHub' if 'github.com' in repo_url else 'GitLab'}: {e}") + raise ConnectionError(f"Failed to fetch model sizes from {'GitHub' if 'github' in repo_url else 'GitLab'}: {e}") @staticmethod def copy_default_model(): diff --git a/selfdrive/frogpilot/assets/other_images/original_bg.jpg b/selfdrive/frogpilot/assets/other_images/original_bg.jpg deleted file mode 100644 index 13c36a7e240359..00000000000000 Binary files a/selfdrive/frogpilot/assets/other_images/original_bg.jpg and /dev/null differ diff --git a/selfdrive/frogpilot/assets/theme_manager.py b/selfdrive/frogpilot/assets/theme_manager.py index 88868c3b4060fc..1977a6ecdec5ab 100644 --- a/selfdrive/frogpilot/assets/theme_manager.py +++ b/selfdrive/frogpilot/assets/theme_manager.py @@ -95,8 +95,7 @@ def calculate_thanksgiving(year): @staticmethod def is_within_week_of(target_date, now): start_of_week = target_date - timedelta(days=target_date.weekday()) - end_of_week = start_of_week + timedelta(days=6) - return start_of_week <= now <= end_of_week + return start_of_week <= now < target_date @staticmethod def fetch_files(url): diff --git a/selfdrive/frogpilot/assets/toggle_icons/advanced_quality_of_life.png b/selfdrive/frogpilot/assets/toggle_icons/advanced_quality_of_life.png deleted file mode 100644 index e84f90ac0e939c..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/advanced_quality_of_life.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced.png b/selfdrive/frogpilot/assets/toggle_icons/icon_advanced.png deleted file mode 100644 index 1b3c52390d8c6a..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_calibration.png b/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_calibration.png deleted file mode 100644 index 25e9f247c6e5e0..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_calibration.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png b/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png deleted file mode 100644 index 72a7e4057ac14e..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_model.png b/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_model.png deleted file mode 100644 index c299a1e793e24f..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_model.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_personality.png b/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_personality.png deleted file mode 100644 index 2ce09a567a1c7b..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_personality.png and /dev/null differ diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_road.png b/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_road.png deleted file mode 100644 index 76513344845127..00000000000000 Binary files a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_road.png and /dev/null differ diff --git a/selfdrive/frogpilot/controls/frogpilot_planner.py b/selfdrive/frogpilot/controls/frogpilot_planner.py index 86ff5bc4605625..ad586694599dfb 100644 --- a/selfdrive/frogpilot/controls/frogpilot_planner.py +++ b/selfdrive/frogpilot/controls/frogpilot_planner.py @@ -82,12 +82,14 @@ def update(self, carState, controlsState, frogpilotCarControl, frogpilotCarState self.road_curvature = calculate_road_curvature(modelData, v_ego) if not carState.standstill else 1 - self.tracking_lead = self.set_lead_status(v_ego) + self.tracking_lead = self.set_lead_status(frogpilotCarState, v_ego, frogpilot_toggles) self.v_cruise = self.frogpilot_vcruise.update(carState, controlsState, frogpilotCarControl, frogpilotCarState, frogpilotNavigation, modelData, v_cruise, v_ego, frogpilot_toggles) - def set_lead_status(self, v_ego): + def set_lead_status(self, frogpilotCarState, v_ego, frogpilot_toggles): + distance_offset = max(frogpilot_toggles.increased_stopped_distance + min(10 - v_ego, 0), 0) if not frogpilotCarState.trafficModeActive else 0 + following_lead = self.lead_one.status - following_lead &= 1 < self.lead_one.dRel < self.model_length + STOP_DISTANCE + following_lead &= 1 < self.lead_one.dRel - distance_offset < self.model_length + STOP_DISTANCE following_lead &= v_ego > CRUISING_SPEED or self.tracking_lead self.tracking_lead_mac.add_data(following_lead) diff --git a/selfdrive/frogpilot/frogpilot_process.py b/selfdrive/frogpilot/frogpilot_process.py index 8325b266f109a9..c1f8f0804a49fc 100644 --- a/selfdrive/frogpilot/frogpilot_process.py +++ b/selfdrive/frogpilot/frogpilot_process.py @@ -205,19 +205,21 @@ def frogpilot_thread(): run_thread_with_lock("update_themes", theme_manager.update_themes()) elif now.second == 0: run_update_checks = not screen_off and not started or now.minute % 15 == 0 or frogs_go_moo - elif run_update_checks or not time_validated: + elif run_update_checks: run_thread_with_lock("update_checks", update_checks, (frogpilot_toggles.automatic_updates, model_manager, now, screen_off, started, theme_manager, time_validated, params, params_memory)) + + if time_validated: + theme_manager.update_holiday() + run_update_checks = False + elif not time_validated: + time_validated = system_time_valid() if not time_validated: - time_validated = system_time_valid() - if not time_validated: - continue - run_thread_with_lock("update_models", model_manager.update_models, (True,)) - run_thread_with_lock("update_themes", theme_manager.update_themes, (True,)) - + continue theme_manager.update_holiday() - + run_thread_with_lock("update_models", model_manager.update_models, (True,)) + run_thread_with_lock("update_themes", theme_manager.update_themes, (True,)) def main(): frogpilot_thread() diff --git a/selfdrive/frogpilot/frogpilot_variables.py b/selfdrive/frogpilot/frogpilot_variables.py index da483c8ab1b756..4cc0f47b318530 100644 --- a/selfdrive/frogpilot/frogpilot_variables.py +++ b/selfdrive/frogpilot/frogpilot_variables.py @@ -74,6 +74,7 @@ def has_prime(): ("CECurves", "1"), ("CECurvesLead", "0"), ("CELead", "0"), + ("CEModelStopTime", "8"), ("CENavigation", "1"), ("CENavigationIntersections", "0"), ("CENavigationLead", "0"), @@ -82,7 +83,6 @@ def has_prime(): ("CertifiedHerbalistDrives", "0"), ("CertifiedHerbalistLiveTorqueParameters", ""), ("CertifiedHerbalistScore", "0"), - ("CEModelStopTime", "8"), ("CESignalSpeed", "55"), ("CESignalLaneDetection", "1"), ("CESlowerLead", "0"), @@ -109,6 +109,7 @@ def has_prime(): ("CustomSounds", "frog"), ("CustomUI", "1"), ("DecelerationProfile", "1"), + ("DefaultModelName", DEFAULT_MODEL_NAME), ("DeveloperUI", "0"), ("DeviceManagement", "1"), ("DeviceShutdown", "9"), @@ -142,7 +143,7 @@ def has_prime(): ("ForceStandstill", "0"), ("ForceStops", "0"), ("FPSCounter", "1"), - ("FrogPilotToggles", ""), + ("FrogPilotToggles", "{}"), ("FrogsGoMoosTweak", "1"), ("FullMap", "0"), ("GasRegenCmd", "1"), @@ -222,6 +223,7 @@ def has_prime(): ("Offset4", "10"), ("OneLaneChange", "1"), ("OnroadDistanceButton", "0"), + ("openpilotMinutes", "0"), ("PathEdgeWidth", "20"), ("PathWidth", "6.1"), ("PauseAOLOnBrake", "0"), @@ -284,6 +286,7 @@ def has_prime(): ("Sidebar", "0"), ("SidebarMetrics", "1"), ("SignalMetrics", "0"), + ("SLCConfirmation", "1"), ("SLCConfirmationHigher", "1"), ("SLCConfirmationLower", "1"), ("SLCFallback", "2"), @@ -347,7 +350,7 @@ def has_prime(): class FrogPilotVariables: def __init__(self): - self.default_frogpilot_toggles = SimpleNamespace(**{k: (lambda x: float(x) if '.' in x else int(x) if x.isdigit() else x)(v.decode() if isinstance(v, bytes) else v) for k, v in frogpilot_default_params}) + self.default_frogpilot_toggles = SimpleNamespace(**dict(frogpilot_default_params)) self.frogpilot_toggles = SimpleNamespace() self.params = Params() @@ -414,13 +417,13 @@ def update(self, started): toggle.force_auto_tune_off = toggle.advanced_lateral_tuning and has_auto_tune and not is_pid_car and self.params.get_bool("ForceAutoTuneOff") toggle.alert_volume_control = self.params.get_bool("AlertVolumeControl") - toggle.disengage_volume = self.params.get_int("DisengageVolume") if toggle.alert_volume_control else 100 - toggle.engage_volume = self.params.get_int("EngageVolume") if toggle.alert_volume_control else 100 - toggle.prompt_volume = self.params.get_int("PromptVolume") if toggle.alert_volume_control else 100 - toggle.promptDistracted_volume = self.params.get_int("PromptDistractedVolume") if toggle.alert_volume_control else 100 - toggle.refuse_volume = self.params.get_int("RefuseVolume") if toggle.alert_volume_control else 100 - toggle.warningSoft_volume = self.params.get_int("WarningSoftVolume") if toggle.alert_volume_control else 100 - toggle.warningImmediate_volume = max(self.params.get_int("WarningImmediateVolume"), 25) if toggle.alert_volume_control else 100 + toggle.disengage_volume = self.params.get_int("DisengageVolume") if toggle.alert_volume_control else 101 + toggle.engage_volume = self.params.get_int("EngageVolume") if toggle.alert_volume_control else 101 + toggle.prompt_volume = self.params.get_int("PromptVolume") if toggle.alert_volume_control else 101 + toggle.promptDistracted_volume = self.params.get_int("PromptDistractedVolume") if toggle.alert_volume_control else 101 + toggle.refuse_volume = self.params.get_int("RefuseVolume") if toggle.alert_volume_control else 101 + toggle.warningSoft_volume = self.params.get_int("WarningSoftVolume") if toggle.alert_volume_control else 101 + toggle.warningImmediate_volume = max(self.params.get_int("WarningImmediateVolume"), 25) if toggle.alert_volume_control else 101 toggle.always_on_lateral = always_on_lateral_set and self.params.get_bool("AlwaysOnLateral") toggle.always_on_lateral_lkas = toggle.always_on_lateral and car_make != "subaru" and self.params.get_bool("AlwaysOnLateralLKAS") @@ -447,11 +450,11 @@ def update(self, started): toggle.conditional_model_stop_time = self.params.get_int("CEModelStopTime") if toggle.conditional_experimental_mode else 0 toggle.conditional_signal = self.params.get_int("CESignalSpeed") if toggle.conditional_experimental_mode else 0 toggle.conditional_signal_lane_detection = toggle.conditional_signal != 0 and self.params.get_bool("CESignalLaneDetection") + toggle.conditional_status_bar = toggle.conditional_experimental_mode and not self.params.get_bool("HideCEMStatusBar") if toggle.conditional_experimental_mode: self.params.put_bool("ExperimentalMode", True) - toggle.conditional_status_bar = toggle.conditional_experimental_mode and not self.params.get_bool("HideCEMStatusBar") - toggle.crosstrek_torque = car_make == "subaru" and self.params.get_bool("CrosstrekTorque") + toggle.crosstrek_torque = car_model == "SUBARU_IMPREZA" and self.params.get_bool("CrosstrekTorque") toggle.current_holiday_theme = self.params.get("CurrentHolidayTheme", encoding='utf-8') if self.params.get_bool("HolidayThemes") else None @@ -578,15 +581,15 @@ def update(self, started): toggle.lead_detection_probability = clip(self.params.get_int("LeadDetectionThreshold") / 100, 0.01, 0.99) if toggle.longitudinal_tuning else 0.5 toggle.max_desired_acceleration = clip(self.params.get_float("MaxDesiredAcceleration"), 0.1, 4.0) if toggle.longitudinal_tuning else 4.0 - available_models = self.params.get("AvailableModels", block=True, encoding='utf-8') or "" - available_model_names = self.params.get("AvailableModelsNames", block=True, encoding='utf-8') or "" + available_models = self.params.get("AvailableModels", block=openpilot_installed and started, encoding='utf-8') or "" + available_model_names = self.params.get("AvailableModelsNames", block=openpilot_installed and started, encoding='utf-8') or "" if available_models: if self.params.get_bool("ModelRandomizer"): blacklisted_models = (self.params.get("BlacklistedModels", encoding='utf-8') or "").split(',') existing_models = [model for model in available_models.split(',') if model not in blacklisted_models and os.path.exists(os.path.join(MODELS_PATH, f"{model}.thneed"))] toggle.model = random.choice(existing_models) if existing_models else DEFAULT_MODEL else: - toggle.model = self.params.get("Model", block=True, encoding='utf-8') + toggle.model = self.params.get("Model", block=openpilot_installed and started, encoding='utf-8') else: toggle.model = DEFAULT_MODEL if toggle.model in available_models.split(',') and os.path.exists(os.path.join(MODELS_PATH, f"{toggle.model}.thneed")): @@ -640,6 +643,7 @@ def update(self, started): toggle.quality_of_life_lateral = self.params.get_bool("QOLLateral") toggle.pause_lateral_below_speed = self.params.get_int("PauseLateralSpeed") * speed_conversion if toggle.quality_of_life_lateral else 0 + toggle.pause_lateral_below_signal = toggle.pause_lateral_below_speed != 0 and self.params.get_bool("PauseLateralOnSignal") toggle.quality_of_life_longitudinal = self.params.get_bool("QOLLongitudinal") toggle.custom_cruise_increase = self.params.get_int("CustomCruise") if toggle.quality_of_life_longitudinal and not pcm_cruise else 1 @@ -649,7 +653,6 @@ def update(self, started): toggle.map_gears = toggle.quality_of_life_longitudinal and self.params.get_bool("MapGears") toggle.map_acceleration = toggle.map_gears and self.params.get_bool("MapAcceleration") toggle.map_deceleration = toggle.map_gears and self.params.get_bool("MapDeceleration") - toggle.pause_lateral_below_signal = toggle.pause_lateral_below_speed != 0 and self.params.get_bool("PauseLateralOnSignal") toggle.reverse_cruise_increase = toggle.quality_of_life_longitudinal and pcm_cruise and self.params.get_bool("ReverseCruise") toggle.set_speed_offset = self.params.get_int("SetSpeedOffset") * (1 if toggle.is_metric else CV.MPH_TO_KPH) if toggle.quality_of_life_longitudinal and not pcm_cruise else 0 @@ -676,12 +679,13 @@ def update(self, started): toggle.map_speed_lookahead_higher = self.params.get_int("SLCLookaheadHigher") if toggle.speed_limit_controller else 0 toggle.map_speed_lookahead_lower = self.params.get_int("SLCLookaheadLower") if toggle.speed_limit_controller else 0 toggle.set_speed_limit = toggle.speed_limit_controller and self.params.get_bool("SetSpeedLimit") - slc_fallback_method = self.params.get_int("SLCFallback") + slc_fallback_method = self.params.get_int("SLCFallback") if toggle.speed_limit_controller else 0 toggle.slc_fallback_experimental_mode = toggle.speed_limit_controller and slc_fallback_method == 1 toggle.slc_fallback_previous_speed_limit = toggle.speed_limit_controller and slc_fallback_method == 2 toggle.slc_fallback_set_speed = toggle.speed_limit_controller and slc_fallback_method == 0 - toggle.speed_limit_confirmation_higher = toggle.speed_limit_controller and self.params.get_bool("SLCConfirmationHigher") - toggle.speed_limit_confirmation_lower = toggle.speed_limit_controller and self.params.get_bool("SLCConfirmationLower") + toggle.speed_limit_confirmation = toggle.speed_limit_controller and self.params.get_bool("SLCConfirmation") + toggle.speed_limit_confirmation_higher = toggle.speed_limit_confirmation and self.params.get_bool("SLCConfirmationHigher") + toggle.speed_limit_confirmation_lower = toggle.speed_limit_confirmation and self.params.get_bool("SLCConfirmationLower") toggle.speed_limit_controller_override = self.params.get_int("SLCOverride") if toggle.speed_limit_controller else 0 toggle.speed_limit_controller_override_manual = toggle.speed_limit_controller_override == 1 toggle.speed_limit_controller_override_set_speed = toggle.speed_limit_controller_override == 2 @@ -695,6 +699,9 @@ def update(self, started): toggle.speed_limit_priority_highest = toggle.speed_limit_priority1 == "Highest" toggle.speed_limit_priority_lowest = toggle.speed_limit_priority1 == "Lowest" + toggle.startup_alert_top = self.params.get("StartupMessageTop", encoding='utf-8') or "" + toggle.startup_alert_bottom = self.params.get("StartupMessageBottom", encoding='utf-8') or "" + toggle.tethering_config = self.params.get_int("TetheringEnabled") toggle.toyota_doors = car_make == "toyota" and self.params.get_bool("ToyotaDoors") @@ -719,17 +726,17 @@ def update(self, started): toggle.use_custom_kp = False toggle.use_custom_lat_accel_factor = False toggle.use_custom_steer_ratio = False - toggle.force_auto_tune = toggle.advanced_lateral_tuning and self.default_frogpilot_toggles.ForceAutoTune - toggle.force_auto_tune_off = toggle.advanced_lateral_tuning and self.default_frogpilot_toggles.ForceAutoTuneOff + toggle.force_auto_tune = toggle.advanced_lateral_tuning and not has_auto_tune and not is_pid_car and self.default_frogpilot_toggles.ForceAutoTune + toggle.force_auto_tune_off = toggle.advanced_lateral_tuning and has_auto_tune and not is_pid_car and self.default_frogpilot_toggles.ForceAutoTuneOff toggle.alert_volume_control = self.default_frogpilot_toggles.AlertVolumeControl - toggle.disengage_volume = self.default_frogpilot_toggles.DisengageVolume if toggle.alert_volume_control else 100 - toggle.engage_volume = self.default_frogpilot_toggles.EngageVolume if toggle.alert_volume_control else 100 - toggle.prompt_volume = self.default_frogpilot_toggles.PromptVolume if toggle.alert_volume_control else 100 - toggle.promptDistracted_volume = self.default_frogpilot_toggles.PromptDistractedVolume if toggle.alert_volume_control else 100 - toggle.refuse_volume = self.default_frogpilot_toggles.RefuseVolume if toggle.alert_volume_control else 100 - toggle.warningSoft_volume = self.default_frogpilot_toggles.WarningSoftVolume if toggle.alert_volume_control else 100 - toggle.warningImmediate_volume = self.default_frogpilot_toggles.WarningImmediateVolume if toggle.alert_volume_control else 100 + toggle.disengage_volume = self.default_frogpilot_toggles.DisengageVolume if toggle.alert_volume_control else 101 + toggle.engage_volume = self.default_frogpilot_toggles.EngageVolume if toggle.alert_volume_control else 101 + toggle.prompt_volume = self.default_frogpilot_toggles.PromptVolume if toggle.alert_volume_control else 101 + toggle.promptDistracted_volume = self.default_frogpilot_toggles.PromptDistractedVolume if toggle.alert_volume_control else 101 + toggle.refuse_volume = self.default_frogpilot_toggles.RefuseVolume if toggle.alert_volume_control else 101 + toggle.warningSoft_volume = self.default_frogpilot_toggles.WarningSoftVolume if toggle.alert_volume_control else 101 + toggle.warningImmediate_volume = self.default_frogpilot_toggles.WarningImmediateVolume if toggle.alert_volume_control else 101 toggle.always_on_lateral = always_on_lateral_set and self.default_frogpilot_toggles.AlwaysOnLateral toggle.always_on_lateral_lkas = toggle.always_on_lateral and car_make != "subaru" and self.default_frogpilot_toggles.AlwaysOnLateralLKAS @@ -754,15 +761,15 @@ def update(self, started): toggle.conditional_model_stop_time = self.default_frogpilot_toggles.CEModelStopTime if toggle.conditional_experimental_mode else 0 toggle.conditional_signal = self.default_frogpilot_toggles.CESignalSpeed if toggle.conditional_experimental_mode else 0 toggle.conditional_signal_lane_detection = toggle.conditional_signal != 0 and self.default_frogpilot_toggles.CESignalLaneDetection + toggle.conditional_status_bar = toggle.conditional_experimental_mode and not self.default_frogpilot_toggles.HideCEMStatusBar if toggle.conditional_experimental_mode: self.params.put_bool("ExperimentalMode", True) - toggle.conditional_status_bar = toggle.conditional_experimental_mode and not self.default_frogpilot_toggles.HideCEMStatusBar toggle.crosstrek_torque = car_model == "SUBARU_IMPREZA" and self.default_frogpilot_toggles.CrosstrekTorque toggle.curve_speed_controller = openpilot_longitudinal and self.default_frogpilot_toggles.CurveSpeedControl - toggle.curve_sensitivity = self.default_frogpilot_toggles.CurveSensitivity / 100 - toggle.turn_aggressiveness = self.default_frogpilot_toggles.TurnAggressiveness / 100 + toggle.curve_sensitivity = self.default_frogpilot_toggles.CurveSensitivity / 100 if toggle.curve_speed_controller else 1 + toggle.turn_aggressiveness = self.default_frogpilot_toggles.TurnAggressiveness / 100 if toggle.curve_speed_controller else 1 toggle.disable_curve_speed_smoothing = toggle.curve_speed_controller and self.default_frogpilot_toggles.DisableCurveSpeedSmoothing toggle.map_turn_speed_controller = toggle.curve_speed_controller and self.default_frogpilot_toggles.MTSCEnabled toggle.mtsc_curvature_check = toggle.map_turn_speed_controller and self.default_frogpilot_toggles.MTSCCurvatureCheck @@ -832,9 +839,10 @@ def update(self, started): toggle.use_si_metrics = toggle.developer_ui and self.default_frogpilot_toggles.UseSI toggle.device_management = self.default_frogpilot_toggles.DeviceManagement - toggle.device_shutdown_time = (self.default_frogpilot_toggles.DeviceShutdown - 3) * 3600 if toggle.device_management else 30 * 3600 + device_shutdown_setting = self.default_frogpilot_toggles.DeviceShutdown if toggle.device_management else 33 + toggle.device_shutdown_time = (device_shutdown_setting - 3) * 3600 if device_shutdown_setting >= 4 else device_shutdown_setting * (60 * 15) toggle.increase_thermal_limits = toggle.device_management and self.default_frogpilot_toggles.IncreaseThermalLimits - toggle.low_voltage_shutdown = VBATT_PAUSE_CHARGING + toggle.low_voltage_shutdown = clip(self.default_frogpilot_toggles.LowVoltageShutdown, VBATT_PAUSE_CHARGING, 12.5) if toggle.device_management else VBATT_PAUSE_CHARGING toggle.no_logging = toggle.device_management and self.default_frogpilot_toggles.NoLogging toggle.no_uploads = toggle.device_management and self.default_frogpilot_toggles.NoUploads toggle.offline_mode = toggle.device_management and self.default_frogpilot_toggles.OfflineMode @@ -852,7 +860,7 @@ def update(self, started): toggle.lane_change_delay = self.default_frogpilot_toggles.LaneChangeTime if toggle.lane_change_customizations else 0 toggle.lane_detection_width = self.default_frogpilot_toggles.LaneDetectionWidth * distance_conversion if toggle.lane_change_customizations else 0 toggle.lane_detection = toggle.lane_detection_width != 0 - toggle.minimum_lane_change_speed = LANE_CHANGE_SPEED_MIN + toggle.minimum_lane_change_speed = self.default_frogpilot_toggles.MinimumLaneChangeSpeed * speed_conversion if toggle.lane_change_customizations else LANE_CHANGE_SPEED_MIN toggle.nudgeless = toggle.lane_change_customizations and self.default_frogpilot_toggles.NudgelessLaneChange toggle.one_lane_change = toggle.lane_change_customizations and self.default_frogpilot_toggles.OneLaneChange @@ -864,15 +872,11 @@ def update(self, started): toggle.long_pitch = openpilot_longitudinal and car_make == "gm" and self.default_frogpilot_toggles.LongPitch - toggle.longitudinal_tuning = openpilot_longitudinal and self.default_frogpilot_toggles.LongitudinalTune - toggle.acceleration_profile = self.default_frogpilot_toggles.AccelerationProfile if toggle.longitudinal_tuning else 0 - toggle.sport_plus = max_acceleration_enabled and toggle.acceleration_profile == 3 - toggle.deceleration_profile = self.default_frogpilot_toggles.DecelerationProfile if toggle.longitudinal_tuning else 0 toggle.human_acceleration = toggle.longitudinal_tuning and self.default_frogpilot_toggles.HumanAcceleration toggle.human_following = toggle.longitudinal_tuning and self.default_frogpilot_toggles.HumanFollowing toggle.increased_stopped_distance = self.default_frogpilot_toggles.IncreasedStoppedDistance * distance_conversion if toggle.longitudinal_tuning else 0 - toggle.lead_detection_probability = self.default_frogpilot_toggles.LeadDetectionThreshold / 100 if toggle.longitudinal_tuning else 0.5 - toggle.max_desired_acceleration = self.default_frogpilot_toggles.MaxDesiredAcceleration if toggle.longitudinal_tuning else 4.0 + toggle.lead_detection_probability = clip(self.default_frogpilot_toggles.LeadDetectionThreshold / 100, 0.01, 0.99) if toggle.longitudinal_tuning else 0.5 + toggle.max_desired_acceleration = clip(self.default_frogpilot_toggles.MaxDesiredAcceleration, 0.1, 4.0) if toggle.longitudinal_tuning else 4.0 toggle.model = DEFAULT_MODEL toggle.part_model_param = "" @@ -881,6 +885,7 @@ def update(self, started): toggle.radarless_model = radarless_models and toggle.model in radarless_models.split(',') toggle.model_ui = self.default_frogpilot_toggles.ModelUI + toggle.dynamic_path_width = toggle.model_ui and self.default_frogpilot_toggles.DynamicPathWidth toggle.lane_line_width = self.default_frogpilot_toggles.LaneLinesWidth * small_distance_conversion / 200 if toggle.model_ui else 0.025 toggle.path_edge_width = self.default_frogpilot_toggles.PathEdgeWidth if toggle.model_ui else 20 toggle.path_width = self.default_frogpilot_toggles.PathWidth * distance_conversion / 2 if toggle.model_ui else 0.9 @@ -902,14 +907,6 @@ def update(self, started): toggle.new_toyota_tune = openpilot_longitudinal and car_make == "toyota" and self.default_frogpilot_toggles.NewToyotaTune - toggle.personalize_openpilot = self.default_frogpilot_toggles.PersonalizeOpenpilot - toggle.color_scheme = self.default_frogpilot_toggles.CustomColors if toggle.personalize_openpilot else "stock" - toggle.distance_icons = self.default_frogpilot_toggles.CustomDistanceIcons if toggle.personalize_openpilot else "stock" - toggle.icon_pack = self.default_frogpilot_toggles.CustomIcons if toggle.personalize_openpilot else "stock" - toggle.signal_icons = self.default_frogpilot_toggles.CustomSignals if toggle.personalize_openpilot else "stock" - toggle.sound_pack = self.default_frogpilot_toggles.CustomSounds if toggle.personalize_openpilot else "stock" - toggle.wheel_image = self.default_frogpilot_toggles.WheelIcon if toggle.personalize_openpilot else "stock" - toggle.quality_of_life_lateral = self.default_frogpilot_toggles.QOLLateral toggle.pause_lateral_below_speed = self.default_frogpilot_toggles.PauseLateralSpeed * speed_conversion if toggle.quality_of_life_lateral else 0 @@ -923,12 +920,10 @@ def update(self, started): toggle.map_deceleration = toggle.map_gears and self.default_frogpilot_toggles.MapDeceleration toggle.pause_lateral_below_signal = toggle.pause_lateral_below_speed != 0 and self.default_frogpilot_toggles.PauseLateralOnSignal toggle.reverse_cruise_increase = toggle.quality_of_life_longitudinal and pcm_cruise and self.default_frogpilot_toggles.ReverseCruise - toggle.set_speed_offset = self.default_frogpilot_toggles.SetSpeedOffset if toggle.quality_of_life_longitudinal and not pcm_cruise else 0 + toggle.set_speed_offset = self.default_frogpilot_toggles.SetSpeedOffset * (1 if toggle.is_metric else CV.MPH_TO_KPH) if toggle.quality_of_life_longitudinal and not pcm_cruise else 0 - toggle.quality_of_life_visuals = self.default_frogpilot_toggles.QOLVisuals toggle.camera_view = self.default_frogpilot_toggles.CameraView if toggle.quality_of_life_visuals else 0 toggle.driver_camera_in_reverse = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.DriverCamera - toggle.onroad_distance_button = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.OnroadDistanceButton toggle.standby_mode = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.StandbyMode toggle.stopped_timer = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.StoppedTimer @@ -943,25 +938,17 @@ def update(self, started): toggle.sng_hack = openpilot_longitudinal and car_make == "toyota" and self.default_frogpilot_toggles.SNGHack - toggle.speed_limit_controller = openpilot_longitudinal and self.default_frogpilot_toggles.SpeedLimitController toggle.force_mph_dashboard = toggle.speed_limit_controller and self.default_frogpilot_toggles.ForceMPHDashboard toggle.map_speed_lookahead_higher = self.default_frogpilot_toggles.SLCLookaheadHigher if toggle.speed_limit_controller else 0 toggle.map_speed_lookahead_lower = self.default_frogpilot_toggles.SLCLookaheadLower if toggle.speed_limit_controller else 0 toggle.set_speed_limit = toggle.speed_limit_controller and self.default_frogpilot_toggles.SetSpeedLimit - toggle.show_speed_limit_offset = toggle.speed_limit_controller and self.default_frogpilot_toggles.ShowSLCOffset - slc_fallback_method = self.default_frogpilot_toggles.SLCFallback + slc_fallback_method = self.default_frogpilot_toggles.SLCFallback if toggle.speed_limit_controller else 0 toggle.slc_fallback_experimental_mode = toggle.speed_limit_controller and slc_fallback_method == 1 toggle.slc_fallback_previous_speed_limit = toggle.speed_limit_controller and slc_fallback_method == 2 toggle.slc_fallback_set_speed = toggle.speed_limit_controller and slc_fallback_method == 0 - toggle.speed_limit_confirmation_higher = toggle.speed_limit_controller and self.default_frogpilot_toggles.SLCConfirmationHigher - toggle.speed_limit_confirmation_lower = toggle.speed_limit_controller and self.default_frogpilot_toggles.SLCConfirmationLower toggle.speed_limit_controller_override = self.default_frogpilot_toggles.SLCOverride if toggle.speed_limit_controller else 0 toggle.speed_limit_controller_override_manual = toggle.speed_limit_controller_override == 1 toggle.speed_limit_controller_override_set_speed = toggle.speed_limit_controller_override == 2 - toggle.speed_limit_offset1 = self.default_frogpilot_toggles.Offset1 * speed_conversion if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset2 = self.default_frogpilot_toggles.Offset2 * speed_conversion if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset3 = self.default_frogpilot_toggles.Offset3 * speed_conversion if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset4 = self.default_frogpilot_toggles.Offset4 * speed_conversion if toggle.speed_limit_controller else 0 toggle.speed_limit_priority1 = self.default_frogpilot_toggles.SLCPriority1 if toggle.speed_limit_controller else None toggle.speed_limit_priority2 = self.default_frogpilot_toggles.SLCPriority2 if toggle.speed_limit_controller else None toggle.speed_limit_priority3 = self.default_frogpilot_toggles.SLCPriority3 if toggle.speed_limit_controller else None @@ -969,7 +956,12 @@ def update(self, started): toggle.speed_limit_priority_lowest = toggle.speed_limit_priority1 == "Lowest" toggle.speed_limit_vienna = toggle.speed_limit_controller and self.default_frogpilot_toggles.UseVienna - if customization_level != 2: + toggle.startup_alert_top = self.default_frogpilot_toggles.StartupMessageTop + toggle.startup_alert_bottom = self.default_frogpilot_toggles.StartupMessageBottom + + toggle.volt_sng = car_model == "CHEVROLET_VOLT" and self.default_frogpilot_toggles.VoltSNG + + elif customization_level != 2: toggle.advanced_custom_onroad_ui = self.default_frogpilot_toggles.AdvancedCustomUI toggle.hide_lead_marker = toggle.advanced_custom_onroad_ui and self.default_frogpilot_toggles.HideLeadMarker toggle.hide_speed = toggle.advanced_custom_onroad_ui and self.default_frogpilot_toggles.HideSpeed @@ -983,54 +975,37 @@ def update(self, started): toggle.use_custom_kp = False toggle.use_custom_lat_accel_factor = False toggle.use_custom_steer_ratio = False - toggle.force_auto_tune = toggle.advanced_lateral_tuning and self.default_frogpilot_toggles.ForceAutoTune - toggle.force_auto_tune_off = toggle.advanced_lateral_tuning and self.default_frogpilot_toggles.ForceAutoTuneOff + toggle.force_auto_tune = toggle.advanced_lateral_tuning and not has_auto_tune and not is_pid_car and self.default_frogpilot_toggles.ForceAutoTune + toggle.force_auto_tune_off = toggle.advanced_lateral_tuning and has_auto_tune and not is_pid_car and self.default_frogpilot_toggles.ForceAutoTuneOff toggle.alert_volume_control = self.default_frogpilot_toggles.AlertVolumeControl - toggle.disengage_volume = self.default_frogpilot_toggles.DisengageVolume if toggle.alert_volume_control else 100 - toggle.engage_volume = self.default_frogpilot_toggles.EngageVolume if toggle.alert_volume_control else 100 - toggle.prompt_volume = self.default_frogpilot_toggles.PromptVolume if toggle.alert_volume_control else 100 - toggle.promptDistracted_volume = self.default_frogpilot_toggles.PromptDistractedVolume if toggle.alert_volume_control else 100 - toggle.refuse_volume = self.default_frogpilot_toggles.RefuseVolume if toggle.alert_volume_control else 100 - toggle.warningSoft_volume = self.default_frogpilot_toggles.WarningSoftVolume if toggle.alert_volume_control else 100 - toggle.warningImmediate_volume = self.default_frogpilot_toggles.WarningImmediateVolume if toggle.alert_volume_control else 100 + toggle.disengage_volume = self.default_frogpilot_toggles.DisengageVolume if toggle.alert_volume_control else 101 + toggle.engage_volume = self.default_frogpilot_toggles.EngageVolume if toggle.alert_volume_control else 101 + toggle.prompt_volume = self.default_frogpilot_toggles.PromptVolume if toggle.alert_volume_control else 101 + toggle.promptDistracted_volume = self.default_frogpilot_toggles.PromptDistractedVolume if toggle.alert_volume_control else 101 + toggle.refuse_volume = self.default_frogpilot_toggles.RefuseVolume if toggle.alert_volume_control else 101 + toggle.warningSoft_volume = self.default_frogpilot_toggles.WarningSoftVolume if toggle.alert_volume_control else 101 + toggle.warningImmediate_volume = self.default_frogpilot_toggles.WarningImmediateVolume if toggle.alert_volume_control else 101 - toggle.always_on_lateral = always_on_lateral_set and self.default_frogpilot_toggles.AlwaysOnLateral - toggle.always_on_lateral_lkas = toggle.always_on_lateral and car_make != "subaru" and self.default_frogpilot_toggles.AlwaysOnLateralLKAS - toggle.always_on_lateral_main = toggle.always_on_lateral and self.default_frogpilot_toggles.AlwaysOnLateralMain - toggle.always_on_lateral_pause_speed = self.default_frogpilot_toggles.PauseAOLOnBrake if toggle.always_on_lateral else 0 toggle.always_on_lateral_status_bar = toggle.always_on_lateral and not self.default_frogpilot_toggles.HideAOLStatusBar toggle.cluster_offset = self.default_frogpilot_toggles.ClusterOffset if car_make == "toyota" else 1 - toggle.conditional_experimental_mode = openpilot_longitudinal and self.default_frogpilot_toggles.ConditionalExperimental - toggle.conditional_curves = toggle.conditional_experimental_mode and self.default_frogpilot_toggles.CECurves - toggle.conditional_curves_lead = toggle.conditional_curves and self.default_frogpilot_toggles.CECurvesLead - toggle.conditional_lead = toggle.conditional_experimental_mode and self.default_frogpilot_toggles.CELead - toggle.conditional_slower_lead = toggle.conditional_lead and self.default_frogpilot_toggles.CESlowerLead - toggle.conditional_stopped_lead = toggle.conditional_lead and self.default_frogpilot_toggles.CEStoppedLead - toggle.conditional_limit = self.default_frogpilot_toggles.CESpeed * speed_conversion if toggle.conditional_experimental_mode else 0 - toggle.conditional_limit_lead = self.default_frogpilot_toggles.CESpeedLead * speed_conversion if toggle.conditional_experimental_mode else 0 toggle.conditional_navigation = toggle.conditional_experimental_mode and self.default_frogpilot_toggles.CENavigation toggle.conditional_navigation_intersections = toggle.conditional_navigation and self.default_frogpilot_toggles.CENavigationIntersections toggle.conditional_navigation_lead = toggle.conditional_navigation and self.default_frogpilot_toggles.CENavigationLead toggle.conditional_navigation_turns = toggle.conditional_navigation and self.default_frogpilot_toggles.CENavigationTurns - toggle.conditional_model_stop_time = self.default_frogpilot_toggles.CEModelStopTime if toggle.conditional_experimental_mode else 0 toggle.conditional_signal = self.default_frogpilot_toggles.CESignalSpeed if toggle.conditional_experimental_mode else 0 toggle.conditional_signal_lane_detection = toggle.conditional_signal != 0 and self.default_frogpilot_toggles.CESignalLaneDetection + toggle.conditional_status_bar = toggle.conditional_experimental_mode and not self.default_frogpilot_toggles.HideCEMStatusBar if toggle.conditional_experimental_mode: self.params.put_bool("ExperimentalMode", True) - toggle.conditional_status_bar = toggle.conditional_experimental_mode and not self.default_frogpilot_toggles.HideCEMStatusBar toggle.crosstrek_torque = car_model == "SUBARU_IMPREZA" and self.default_frogpilot_toggles.CrosstrekTorque - toggle.curve_speed_controller = openpilot_longitudinal and self.default_frogpilot_toggles.CurveSpeedControl - toggle.curve_sensitivity = self.default_frogpilot_toggles.CurveSensitivity / 100 - toggle.turn_aggressiveness = self.default_frogpilot_toggles.TurnAggressiveness / 100 - toggle.disable_curve_speed_smoothing = toggle.curve_speed_controller and self.default_frogpilot_toggles.DisableCurveSpeedSmoothing - toggle.map_turn_speed_controller = toggle.curve_speed_controller and self.default_frogpilot_toggles.MTSCEnabled + toggle.curve_sensitivity = self.default_frogpilot_toggles.CurveSensitivity / 100 if toggle.curve_speed_controller else 1 + toggle.turn_aggressiveness = self.default_frogpilot_toggles.TurnAggressiveness / 100 if toggle.curve_speed_controller else 1 toggle.mtsc_curvature_check = toggle.map_turn_speed_controller and self.default_frogpilot_toggles.MTSCCurvatureCheck - toggle.vision_turn_controller = toggle.curve_speed_controller and self.default_frogpilot_toggles.VisionTurnControl toggle.custom_personalities = openpilot_longitudinal and self.default_frogpilot_toggles.CustomPersonalities toggle.aggressive_profile = toggle.custom_personalities and self.default_frogpilot_toggles.AggressivePersonalityProfile @@ -1061,15 +1036,7 @@ def update(self, started): toggle.traffic_mode_jerk_speed_decrease = [self.default_frogpilot_toggles.TrafficJerkSpeedDecrease / 100, toggle.aggressive_jerk_speed_decrease] if toggle.traffic_profile else [0.5, 0.5] toggle.traffic_mode_t_follow = [self.default_frogpilot_toggles.TrafficFollow, toggle.aggressive_follow] if toggle.traffic_profile else [0.5, 1.0] - toggle.custom_ui = self.default_frogpilot_toggles.CustomUI - toggle.acceleration_path = toggle.custom_ui and self.default_frogpilot_toggles.AccelerationPath toggle.adjacent_paths = toggle.custom_ui and self.default_frogpilot_toggles.AdjacentPath - toggle.blind_spot_path = has_bsm and toggle.custom_ui and self.default_frogpilot_toggles.BlindSpotPath - toggle.compass = toggle.custom_ui and self.default_frogpilot_toggles.Compass - toggle.pedals_on_ui = toggle.custom_ui and self.default_frogpilot_toggles.PedalsOnUI - toggle.dynamic_pedals_on_ui = toggle.pedals_on_ui and self.default_frogpilot_toggles.DynamicPedalsOnUI - toggle.static_pedals_on_ui = toggle.pedals_on_ui and self.default_frogpilot_toggles.StaticPedalsOnUI - toggle.rotating_wheel = toggle.custom_ui and self.default_frogpilot_toggles.RotatingWheel toggle.developer_ui = self.default_frogpilot_toggles.DeveloperUI toggle.border_metrics = toggle.developer_ui and self.default_frogpilot_toggles.BorderMetrics @@ -1096,47 +1063,29 @@ def update(self, started): toggle.use_si_metrics = toggle.developer_ui and self.default_frogpilot_toggles.UseSI toggle.device_management = self.default_frogpilot_toggles.DeviceManagement - toggle.device_shutdown_time = (self.default_frogpilot_toggles.DeviceShutdown - 3) * 3600 if toggle.device_management else 30 * 3600 toggle.increase_thermal_limits = toggle.device_management and self.default_frogpilot_toggles.IncreaseThermalLimits - toggle.low_voltage_shutdown = VBATT_PAUSE_CHARGING + toggle.low_voltage_shutdown = clip(self.default_frogpilot_toggles.LowVoltageShutdown, VBATT_PAUSE_CHARGING, 12.5) if toggle.device_management else VBATT_PAUSE_CHARGING toggle.no_logging = toggle.device_management and self.default_frogpilot_toggles.NoLogging toggle.no_uploads = toggle.device_management and self.default_frogpilot_toggles.NoUploads toggle.offline_mode = toggle.device_management and self.default_frogpilot_toggles.OfflineMode toggle.experimental_gm_tune = openpilot_longitudinal and car_make == "gm" and self.default_frogpilot_toggles.ExperimentalGMTune - toggle.experimental_mode_via_press = openpilot_longitudinal and self.default_frogpilot_toggles.ExperimentalModeActivation - toggle.experimental_mode_via_distance = toggle.experimental_mode_via_press and self.default_frogpilot_toggles.ExperimentalModeViaDistance - toggle.experimental_mode_via_lkas = not toggle.always_on_lateral_lkas and toggle.experimental_mode_via_press and car_make != "subaru" and self.default_frogpilot_toggles.ExperimentalModeViaLKAS - toggle.experimental_mode_via_tap = toggle.experimental_mode_via_press and self.default_frogpilot_toggles.ExperimentalModeViaTap - toggle.frogsgomoo_tweak = openpilot_longitudinal and car_make == "toyota" and self.default_frogpilot_toggles.FrogsGoMoosTweak - toggle.lane_change_customizations = self.default_frogpilot_toggles.LaneChangeCustomizations - toggle.lane_change_delay = self.default_frogpilot_toggles.LaneChangeTime if toggle.lane_change_customizations else 0 toggle.lane_detection_width = self.default_frogpilot_toggles.LaneDetectionWidth * distance_conversion if toggle.lane_change_customizations else 0 toggle.lane_detection = toggle.lane_detection_width != 0 - toggle.minimum_lane_change_speed = LANE_CHANGE_SPEED_MIN - toggle.nudgeless = toggle.lane_change_customizations and self.default_frogpilot_toggles.NudgelessLaneChange - toggle.one_lane_change = toggle.lane_change_customizations and self.default_frogpilot_toggles.OneLaneChange + toggle.minimum_lane_change_speed = self.default_frogpilot_toggles.MinimumLaneChangeSpeed * speed_conversion if toggle.lane_change_customizations else LANE_CHANGE_SPEED_MIN toggle.lateral_tuning = self.default_frogpilot_toggles.LateralTune - toggle.nnff = toggle.lateral_tuning and self.default_frogpilot_toggles.NNFF toggle.smooth_curve_handling = toggle.lateral_tuning and self.default_frogpilot_toggles.NNFFLite toggle.taco_tune = toggle.lateral_tuning and self.default_frogpilot_toggles.TacoTune toggle.use_turn_desires = toggle.lateral_tuning and self.default_frogpilot_toggles.TurnDesires toggle.long_pitch = openpilot_longitudinal and car_make == "gm" and self.default_frogpilot_toggles.LongPitch - toggle.longitudinal_tuning = openpilot_longitudinal and self.default_frogpilot_toggles.LongitudinalTune - toggle.acceleration_profile = self.default_frogpilot_toggles.AccelerationProfile if toggle.longitudinal_tuning else 0 - toggle.sport_plus = max_acceleration_enabled and toggle.acceleration_profile == 3 - toggle.deceleration_profile = self.default_frogpilot_toggles.DecelerationProfile if toggle.longitudinal_tuning else 0 - toggle.human_acceleration = toggle.longitudinal_tuning and self.default_frogpilot_toggles.HumanAcceleration - toggle.human_following = toggle.longitudinal_tuning and self.default_frogpilot_toggles.HumanFollowing - toggle.increased_stopped_distance = self.default_frogpilot_toggles.IncreasedStoppedDistance * distance_conversion if toggle.longitudinal_tuning else 0 - toggle.lead_detection_probability = self.default_frogpilot_toggles.LeadDetectionThreshold / 100 if toggle.longitudinal_tuning else 0.5 - toggle.max_desired_acceleration = self.default_frogpilot_toggles.MaxDesiredAcceleration if toggle.longitudinal_tuning else 4.0 + toggle.lead_detection_probability = clip(self.default_frogpilot_toggles.LeadDetectionThreshold / 100, 0.01, 0.99) if toggle.longitudinal_tuning else 0.5 + toggle.max_desired_acceleration = clip(self.default_frogpilot_toggles.MaxDesiredAcceleration, 0.1, 4.0) if toggle.longitudinal_tuning else 4.0 toggle.model = DEFAULT_MODEL toggle.part_model_param = "" @@ -1145,6 +1094,7 @@ def update(self, started): toggle.radarless_model = radarless_models and toggle.model in radarless_models.split(',') toggle.model_ui = self.default_frogpilot_toggles.ModelUI + toggle.dynamic_path_width = toggle.model_ui and self.default_frogpilot_toggles.DynamicPathWidth toggle.lane_line_width = self.default_frogpilot_toggles.LaneLinesWidth * small_distance_conversion / 200 if toggle.model_ui else 0.025 toggle.path_edge_width = self.default_frogpilot_toggles.PathEdgeWidth if toggle.model_ui else 20 toggle.path_width = self.default_frogpilot_toggles.PathWidth * distance_conversion / 2 if toggle.model_ui else 0.9 @@ -1153,9 +1103,6 @@ def update(self, started): toggle.show_stopping_point_metrics = toggle.show_stopping_point and self.default_frogpilot_toggles.ShowStoppingPointMetrics toggle.unlimited_road_ui_length = toggle.model_ui and self.default_frogpilot_toggles.UnlimitedLength - toggle.navigation_ui = self.default_frogpilot_toggles.NavigationUI - toggle.big_map = toggle.navigation_ui and self.params.get_bool("BigMap") - toggle.full_map = toggle.big_map and self.default_frogpilot_toggles.FullMap toggle.map_style = self.default_frogpilot_toggles.MapStyle if toggle.navigation_ui else 0 toggle.road_name_ui = toggle.navigation_ui and self.default_frogpilot_toggles.RoadNameUI toggle.show_speed_limit_offset = toggle.navigation_ui and self.default_frogpilot_toggles.ShowSLCOffset @@ -1166,37 +1113,20 @@ def update(self, started): toggle.new_toyota_tune = openpilot_longitudinal and car_make == "toyota" and self.default_frogpilot_toggles.NewToyotaTune - toggle.personalize_openpilot = self.default_frogpilot_toggles.PersonalizeOpenpilot - toggle.color_scheme = self.default_frogpilot_toggles.CustomColors if toggle.personalize_openpilot else "stock" - toggle.distance_icons = self.default_frogpilot_toggles.CustomDistanceIcons if toggle.personalize_openpilot else "stock" - toggle.icon_pack = self.default_frogpilot_toggles.CustomIcons if toggle.personalize_openpilot else "stock" - toggle.signal_icons = self.default_frogpilot_toggles.CustomSignals if toggle.personalize_openpilot else "stock" - toggle.sound_pack = self.default_frogpilot_toggles.CustomSounds if toggle.personalize_openpilot else "stock" - toggle.wheel_image = self.default_frogpilot_toggles.WheelIcon if toggle.personalize_openpilot else "stock" - toggle.quality_of_life_lateral = self.default_frogpilot_toggles.QOLLateral toggle.pause_lateral_below_speed = self.default_frogpilot_toggles.PauseLateralSpeed * speed_conversion if toggle.quality_of_life_lateral else 0 - toggle.quality_of_life_longitudinal = self.default_frogpilot_toggles.QOLLongitudinal toggle.custom_cruise_increase = self.default_frogpilot_toggles.CustomCruise if toggle.quality_of_life_longitudinal and not pcm_cruise else 1 toggle.custom_cruise_increase_long = self.default_frogpilot_toggles.CustomCruiseLong if toggle.quality_of_life_longitudinal and not pcm_cruise else 5 toggle.force_standstill = toggle.quality_of_life_longitudinal and self.default_frogpilot_toggles.ForceStandstill toggle.force_stops = toggle.quality_of_life_longitudinal and self.default_frogpilot_toggles.ForceStops - toggle.map_gears = toggle.quality_of_life_longitudinal and self.default_frogpilot_toggles.MapGears - toggle.map_acceleration = toggle.map_gears and self.default_frogpilot_toggles.MapAcceleration - toggle.map_deceleration = toggle.map_gears and self.default_frogpilot_toggles.MapDeceleration toggle.pause_lateral_below_signal = toggle.pause_lateral_below_speed != 0 and self.default_frogpilot_toggles.PauseLateralOnSignal toggle.reverse_cruise_increase = toggle.quality_of_life_longitudinal and pcm_cruise and self.default_frogpilot_toggles.ReverseCruise - toggle.set_speed_offset = self.default_frogpilot_toggles.SetSpeedOffset if toggle.quality_of_life_longitudinal and not pcm_cruise else 0 + toggle.set_speed_offset = self.default_frogpilot_toggles.SetSpeedOffset * (1 if toggle.is_metric else CV.MPH_TO_KPH) if toggle.quality_of_life_longitudinal and not pcm_cruise else 0 toggle.quality_of_life_visuals = self.default_frogpilot_toggles.QOLVisuals toggle.camera_view = self.default_frogpilot_toggles.CameraView if toggle.quality_of_life_visuals else 0 - toggle.driver_camera_in_reverse = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.DriverCamera - toggle.onroad_distance_button = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.OnroadDistanceButton toggle.standby_mode = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.StandbyMode - toggle.stopped_timer = toggle.quality_of_life_visuals and self.default_frogpilot_toggles.StoppedTimer - - toggle.random_events = self.default_frogpilot_toggles.RandomEvents toggle.screen_management = self.default_frogpilot_toggles.ScreenManagement toggle.screen_brightness = self.default_frogpilot_toggles.ScreenBrightness if toggle.screen_management else 101 @@ -1207,25 +1137,10 @@ def update(self, started): toggle.sng_hack = openpilot_longitudinal and car_make == "toyota" and self.default_frogpilot_toggles.SNGHack - toggle.speed_limit_controller = openpilot_longitudinal and self.default_frogpilot_toggles.SpeedLimitController toggle.force_mph_dashboard = toggle.speed_limit_controller and self.default_frogpilot_toggles.ForceMPHDashboard toggle.map_speed_lookahead_higher = self.default_frogpilot_toggles.SLCLookaheadHigher if toggle.speed_limit_controller else 0 toggle.map_speed_lookahead_lower = self.default_frogpilot_toggles.SLCLookaheadLower if toggle.speed_limit_controller else 0 toggle.set_speed_limit = toggle.speed_limit_controller and self.default_frogpilot_toggles.SetSpeedLimit - toggle.show_speed_limit_offset = toggle.speed_limit_controller and self.default_frogpilot_toggles.ShowSLCOffset - slc_fallback_method = self.default_frogpilot_toggles.SLCFallback - toggle.slc_fallback_experimental_mode = toggle.speed_limit_controller and slc_fallback_method == 1 - toggle.slc_fallback_previous_speed_limit = toggle.speed_limit_controller and slc_fallback_method == 2 - toggle.slc_fallback_set_speed = toggle.speed_limit_controller and slc_fallback_method == 0 - toggle.speed_limit_confirmation_higher = toggle.speed_limit_controller and self.default_frogpilot_toggles.SLCConfirmationHigher - toggle.speed_limit_confirmation_lower = toggle.speed_limit_controller and self.default_frogpilot_toggles.SLCConfirmationLower - toggle.speed_limit_controller_override = self.default_frogpilot_toggles.SLCOverride if toggle.speed_limit_controller else 0 - toggle.speed_limit_controller_override_manual = toggle.speed_limit_controller_override == 1 - toggle.speed_limit_controller_override_set_speed = toggle.speed_limit_controller_override == 2 - toggle.speed_limit_offset1 = self.default_frogpilot_toggles.Offset1 * speed_conversion if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset2 = self.default_frogpilot_toggles.Offset2 * speed_conversion if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset3 = self.default_frogpilot_toggles.Offset3 * speed_conversion if toggle.speed_limit_controller else 0 - toggle.speed_limit_offset4 = self.default_frogpilot_toggles.Offset4 * speed_conversion if toggle.speed_limit_controller else 0 toggle.speed_limit_priority1 = self.default_frogpilot_toggles.SLCPriority1 if toggle.speed_limit_controller else None toggle.speed_limit_priority2 = self.default_frogpilot_toggles.SLCPriority2 if toggle.speed_limit_controller else None toggle.speed_limit_priority3 = self.default_frogpilot_toggles.SLCPriority3 if toggle.speed_limit_controller else None @@ -1233,5 +1148,10 @@ def update(self, started): toggle.speed_limit_priority_lowest = toggle.speed_limit_priority1 == "Lowest" toggle.speed_limit_vienna = toggle.speed_limit_controller and self.default_frogpilot_toggles.UseVienna + toggle.startup_alert_top = self.default_frogpilot_toggles.StartupMessageTop + toggle.startup_alert_bottom = self.default_frogpilot_toggles.StartupMessageBottom + + toggle.volt_sng = car_model == "CHEVROLET_VOLT" and self.default_frogpilot_toggles.VoltSNG + self.params.put("FrogPilotToggles", json.dumps(toggle.__dict__)) self.params_memory.remove("FrogPilotTogglesUpdated") diff --git a/selfdrive/frogpilot/navigation/ui/primeless_settings.cc b/selfdrive/frogpilot/navigation/ui/primeless_settings.cc index f10306319752d7..230970c8d243b4 100644 --- a/selfdrive/frogpilot/navigation/ui/primeless_settings.cc +++ b/selfdrive/frogpilot/navigation/ui/primeless_settings.cc @@ -91,6 +91,7 @@ void FrogPilotPrimelessPanel::hideEvent(QHideEvent *event) { } void FrogPilotPrimelessPanel::mousePressEvent(QMouseEvent *event) { + closeMapBoxInstructions(); displayMapboxInstructions(false); } diff --git a/selfdrive/frogpilot/navigation/ui/primeless_settings.h b/selfdrive/frogpilot/navigation/ui/primeless_settings.h index 690f0842baa6c1..a5cd413f3d1278 100644 --- a/selfdrive/frogpilot/navigation/ui/primeless_settings.h +++ b/selfdrive/frogpilot/navigation/ui/primeless_settings.h @@ -9,6 +9,7 @@ class FrogPilotPrimelessPanel : public FrogPilotListWidget { explicit FrogPilotPrimelessPanel(FrogPilotSettingsWindow *parent); signals: + void closeMapBoxInstructions(); void openMapBoxInstructions(); private: diff --git a/selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.cc deleted file mode 100644 index 9bff861e86f156..00000000000000 --- a/selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.cc +++ /dev/null @@ -1,935 +0,0 @@ -#include "selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.h" - -FrogPilotAdvancedDrivingPanel::FrogPilotAdvancedDrivingPanel(FrogPilotSettingsWindow *parent) : FrogPilotListWidget(parent), parent(parent) { - const std::vector> advancedToggles { - {"AdvancedLateralTune", tr("Advanced Lateral Tuning"), tr("Advanced settings that control how openpilot manages steering."), "../frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png"}, - {"SteerFriction", steerFrictionStock != 0 ? QString(tr("Friction (Default: %1)")).arg(QString::number(steerFrictionStock, 'f', 2)) : tr("Friction"), tr("The resistance in steering. Higher values provide more stable steering but can make it feel heavy, while lower values allow lighter steering but may feel too sensitive."), ""}, - {"SteerKP", steerKPStock != 0 ? QString(tr("Kp Factor (Default: %1)")).arg(QString::number(steerKPStock, 'f', 2)) : tr("Kp Factor"), tr("How aggressively the car corrects its steering. Higher values offer quicker corrections but may feel jerky, while lower values make steering smoother but slower to respond."), ""}, - {"SteerLatAccel", steerLatAccelStock != 0 ? QString(tr("Lateral Accel (Default: %1)")).arg(QString::number(steerLatAccelStock, 'f', 2)) : tr("Lateral Accel"), tr("Adjust how fast the car can steer from side to side. Higher values allow quicker lane changes but can feel unstable, while lower values provide smoother steering but may feel sluggish."), ""}, - {"SteerRatio", steerRatioStock != 0 ? QString(tr("Steer Ratio (Default: %1)")).arg(QString::number(steerRatioStock, 'f', 2)) : tr("Steer Ratio"), tr("Adjust how much openpilot needs to turn the wheel to steer. Higher values feel like driving a truck, more stable at high speeds, but harder to steer quickly at low speeds, while lower values feel like a go-kart, easier to steer in tight spots but more sensitive and less stable at high speeds."), ""}, - {"TacoTune", tr("comma's 2022 Taco Bell Turn Hack"), tr("Use comma's hack they used to help handle left and right turns more precisely during their 2022 'Taco Bell' drive."), ""}, - {"ForceAutoTune", tr("Force Auto Tune On"), tr("Forces comma's auto lateral tuning for unsupported vehicles."), ""}, - {"ForceAutoTuneOff", tr("Force Auto Tune Off"), tr("Forces comma's auto lateral tuning off for supported vehicles."), ""}, - {"TurnDesires", tr("Force Turn Desires Below Lane Change Speed"), tr("Force the model to use turn desires when driving below the minimum lane change speed to help make left and right turns more precisely."), ""}, - - {"AdvancedLongitudinalTune", tr("Advanced Longitudinal Tuning"), tr("Advanced settings that control how openpilot manages speed and acceleration."), "../frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png"}, - {"LeadDetectionThreshold", tr("Lead Detection Confidence"), tr("How sensitive openpilot is to detecting vehicles ahead. A lower value can help detect vehicles sooner and from farther away, but may occasionally mistake other objects for vehicles."), ""}, - {"MaxDesiredAcceleration", tr("Maximum Acceleration Rate"), tr("Set a cap on how fast openpilot can accelerate to prevent high acceleration at low speeds."), ""}, - - {"AdvancedQOLDriving", tr("Advanced Quality of Life"), tr("Miscellaneous advanced features to improve your overall openpilot experience."), "../frogpilot/assets/toggle_icons/advanced_quality_of_life.png"}, - {"ForceStandstill", tr("Force Keep openpilot in the Standstill State"), tr("Keep openpilot in the 'standstill' state until the gas pedal or 'resume' button is pressed."), ""}, - {"ForceStops", tr("Force Stop for 'Detected' Stop Lights/Signs"), tr("Whenever openpilot 'detects' a potential stop light/stop sign, force a stop where it originally detected it to prevent running the potential red light/stop sign."), ""}, - {"SetSpeedOffset", tr("Set Speed Offset"), tr("How much higher or lower the set speed should be compared to your current set speed. For example, if you prefer to drive 5 mph above the speed limit, this setting will automatically add that difference when you adjust your set speed."), ""}, - - {"CustomPersonalities", tr("Customize Driving Personalities"), tr("Customize the personality profiles to suit your preferences."), "../frogpilot/assets/toggle_icons/icon_advanced_personality.png"}, - {"TrafficPersonalityProfile", tr("Traffic Personality"), tr("Customize the 'Traffic' personality profile, tailored for navigating through traffic."), "../frogpilot/assets/stock_theme/distance_icons/traffic.png"}, - {"TrafficFollow", tr("Following Distance"), tr("The minimum following distance in 'Traffic Mode.' openpilot will adjust dynamically between this value and the 'Aggressive' profile distance based on your speed."), ""}, - {"TrafficJerkAcceleration", tr("Acceleration Sensitivity"), tr("How sensitive openpilot is to changes in acceleration in 'Traffic Mode.' Higher values result in smoother, more gradual acceleration and deceleration, while lower values allow for faster changes that may feel more abrupt."), ""}, - {"TrafficJerkDeceleration", tr("Deceleration Sensitivity"), tr("Controls how sensitive openpilot is to changes in deceleration in 'Traffic Mode.' Higher values result in smoother, more gradual braking, while lower values allow for quicker, more responsive braking that may feel abrupt."), ""}, - {"TrafficJerkDanger", tr("Safety Distance Sensitivity"), tr("Adjusts how cautious openpilot is around other vehicles or obstacles in 'Traffic Mode.' Higher values increase following distances and prioritize safety, leading to more cautious driving, while lower values allow for closer following but may reduce reaction time."), ""}, - {"TrafficJerkSpeed", tr("Speed Increase Responsiveness"), tr("Controls how quickly openpilot adjusts speed in 'Traffic Mode.' Higher values ensure smoother, more gradual speed changes, while lower values enable quicker adjustments that might feel sharper or less smooth."), ""}, - {"TrafficJerkSpeedDecrease", tr("Speed Decrease Responsiveness"), tr("Sets how quickly openpilot adjusts to decreasing speeds in 'Traffic Mode.' Higher values ensure smoother transitions when slowing down, while lower values allow for quicker, more responsive speed reductions that might feel sharper."), ""}, - {"ResetTrafficPersonality", tr("Reset Settings"), tr("Restore the 'Traffic Mode' settings to their default values."), ""}, - - {"AggressivePersonalityProfile", tr("Aggressive Personality"), tr("Customize the 'Aggressive' personality profile, designed for a more assertive driving style."), "../frogpilot/assets/stock_theme/distance_icons/aggressive.png"}, - {"AggressiveFollow", tr("Following Distance"), tr("Set the following distance for 'Aggressive' mode. This determines roughly how many seconds you'll follow behind the car ahead.\n\nDefault: 1.25 seconds."), ""}, - {"AggressiveJerkAcceleration", tr("Acceleration Sensitivity"), tr("Controls how sensitive openpilot is to acceleration changes in 'Aggressive' mode. Higher values make acceleration and deceleration smoother but slower, while lower values allow quicker changes that may feel jerky.\n\nDefault: 0.5."), ""}, - {"AggressiveJerkDeceleration", tr("Deceleration Sensitivity"), tr("Controls how sensitive openpilot is to deceleration in 'Aggressive' mode. Higher values result in smoother braking, while lower values allow for more immediate braking that may feel abrupt.\n\nDefault: 0.5."), ""}, - {"AggressiveJerkDanger", tr("Safety Distance Sensitivity"), tr("Adjusts how cautious openpilot is around vehicles or obstacles in 'Aggressive' mode. Higher values make it more cautious, while lower values allow for closer following, increasing the risk of sudden braking.\n\nDefault: 1.0."), ""}, - {"AggressiveJerkSpeed", tr("Speed Increase Responsiveness"), tr("Controls how quickly openpilot adjusts speed in 'Aggressive' mode. Higher values result in smoother but slower speed changes, while lower values make speed adjustments quicker but potentially more abrupt.\n\nDefault: 0.5."), ""}, - {"AggressiveJerkSpeedDecrease", tr("Speed Decrease Responsiveness"), tr("Sets how quickly openpilot adjusts to speed reductions in 'Aggressive' mode. Higher values ensure smoother transitions when slowing down, while lower values allow for quicker, more responsive speed decreases that may feel sharp.\n\nDefault: 0.5."), ""}, - {"ResetAggressivePersonality", tr("Reset Settings"), tr("Restore the 'Aggressive' settings to their default values."), ""}, - - {"StandardPersonalityProfile", tr("Standard Personality"), tr("Customize the 'Standard' personality profile, optimized for balanced driving."), "../frogpilot/assets/stock_theme/distance_icons/standard.png"}, - {"StandardFollow", tr("Following Distance"), tr("Set the following distance for 'Standard' mode. This determines roughly how many seconds you'll follow behind the car ahead.\n\nDefault: 1.45 seconds."), ""}, - {"StandardJerkAcceleration", tr("Acceleration Sensitivity"), tr("Controls how sensitive openpilot is to acceleration changes in 'Standard' mode. Higher values make acceleration and deceleration smoother but slower, while lower values allow quicker changes that may feel jerky.\n\nDefault: 1.0."), ""}, - {"StandardJerkDeceleration", tr("Deceleration Sensitivity"), tr("Controls how sensitive openpilot is to deceleration in 'Standard' mode. Higher values result in smoother braking, while lower values allow for quicker, more immediate braking that may feel abrupt.\n\nDefault: 1.0."), ""}, - {"StandardJerkDanger", tr("Safety Distance Sensitivity"), tr("Adjusts how cautious openpilot is around vehicles or obstacles in 'Standard' mode. Higher values make it more cautious, while lower values allow for closer following, increasing the risk of sudden braking.\n\nDefault: 1.0."), ""}, - {"StandardJerkSpeed", tr("Speed Increase Responsiveness"), tr("Controls how quickly openpilot adjusts speed in 'Standard' mode. Higher values result in smoother but slower speed changes, while lower values make speed adjustments quicker but potentially more abrupt.\n\nDefault: 1.0."), ""}, - {"StandardJerkSpeedDecrease", tr("Speed Decrease Responsiveness"), tr("Sets how quickly openpilot adjusts to speed reductions in 'Standard' mode. Higher values ensure smoother transitions when slowing down, while lower values allow for quicker, more responsive speed decreases that may feel sharp.\n\nDefault: 1.0."), ""}, - {"ResetStandardPersonality", tr("Reset Settings"), tr("Restore the 'Standard' settings to their default values."), ""}, - - {"RelaxedPersonalityProfile", tr("Relaxed Personality"), tr("Customize the 'Relaxed' personality profile, ideal for a more laid-back driving style."), "../frogpilot/assets/stock_theme/distance_icons/relaxed.png"}, - {"RelaxedFollow", tr("Following Distance"), tr("Set the following distance for 'Relaxed' mode. This determines roughly how many seconds you'll follow behind the car ahead.\n\nDefault: 1.75 seconds."), ""}, - {"RelaxedJerkAcceleration", tr("Acceleration Sensitivity"), tr("Controls how sensitive openpilot is to acceleration changes in 'Relaxed' mode. Higher values make acceleration and deceleration smoother but slower, while lower values allow quicker changes that may feel jerky.\n\nDefault: 1.0."), ""}, - {"RelaxedJerkDeceleration", tr("Deceleration Sensitivity"), tr("Controls how sensitive openpilot is to deceleration in 'Relaxed' mode. Higher values result in smoother braking, while lower values allow for quicker, more immediate braking that may feel abrupt.\n\nDefault: 1.0."), ""}, - {"RelaxedJerkDanger", tr("Safety Distance Sensitivity"), tr("Adjusts how cautious openpilot is around vehicles or obstacles in 'Relaxed' mode. Higher values make it more cautious, while lower values allow for closer following, increasing the risk of sudden braking.\n\nDefault: 1.0."), ""}, - {"RelaxedJerkSpeed", tr("Speed Increase Responsiveness"), tr("Controls how quickly openpilot adjusts speed in 'Relaxed' mode. Higher values result in smoother but slower speed changes, while lower values make speed adjustments quicker but potentially more abrupt.\n\nDefault: 1.0."), ""}, - {"RelaxedJerkSpeedDecrease", tr("Speed Decrease Responsiveness"), tr("Sets how quickly openpilot adjusts to speed reductions in 'Relaxed' mode. Higher values ensure smoother transitions when slowing down, while lower values allow for quicker, more responsive speed decreases that may feel sharp.\n\nDefault: 1.0."), ""}, - {"ResetRelaxedPersonality", tr("Reset Settings"), tr("Restore the 'Relaxed' settings to their default values."), ""}, - - {"ModelManagement", tr("Model Management"), tr("Manage the driving models used by openpilot."), "../frogpilot/assets/toggle_icons/icon_advanced_model.png"}, - {"AutomaticallyUpdateModels", tr("Automatically Update and Download Models"), tr("Automatically download new or updated driving models."), ""}, - {"ModelRandomizer", tr("Model Randomizer"), tr("A random model is selected and can be reviewed at the end of each drive if it's longer than 15 minutes to help find your preferred model."), ""}, - {"ManageBlacklistedModels", tr("Manage Model Blacklist"), tr("Control which models are blacklisted and won't be used for future drives."), ""}, - {"ResetScores", tr("Reset Model Scores"), tr("Clear the ratings you've given to the driving models."), ""}, - {"ReviewScores", tr("Review Model Scores"), tr("View the ratings you've assigned to the driving models."), ""}, - {"DeleteModel", tr("Delete Model"), tr("Remove the selected driving model from your device."), ""}, - {"DownloadModel", tr("Download Model"), tr("Download undownloaded driving models."), ""}, - {"DownloadAllModels", tr("Download All Models"), tr("Download all undownloaded driving models."), ""}, - {"SelectModel", tr("Select Model"), tr("Select which model openpilot uses to drive."), ""}, - {"ResetCalibrations", tr("Reset Model Calibrations"), tr("Reset calibration settings for the driving models."), ""}, - }; - - for (const auto &[param, title, desc, icon] : advancedToggles) { - AbstractControl *advancedDrivingToggle; - - if (param == "AdvancedLateralTune") { - FrogPilotParamManageControl *advancedLateralTuneToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(advancedLateralTuneToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - std::set modifiedLateralTuneKeys = lateralTuneKeys; - - bool usingNNFF = hasNNFFLog && params.getBool("LateralTune") && params.getBool("NNFF"); - if (usingNNFF) { - modifiedLateralTuneKeys.erase("ForceAutoTune"); - modifiedLateralTuneKeys.erase("ForceAutoTuneOff"); - } else { - if (hasAutoTune) { - modifiedLateralTuneKeys.erase("ForceAutoTune"); - } else if (isPIDCar) { - modifiedLateralTuneKeys.erase("ForceAutoTuneOff"); - modifiedLateralTuneKeys.erase("SteerFriction"); - modifiedLateralTuneKeys.erase("SteerKP"); - modifiedLateralTuneKeys.erase("SteerLatAccel"); - } else { - modifiedLateralTuneKeys.erase("ForceAutoTuneOff"); - } - } - - if (!liveValid || usingNNFF) { - modifiedLateralTuneKeys.erase("SteerFriction"); - modifiedLateralTuneKeys.erase("SteerLatAccel"); - } - - showToggles(modifiedLateralTuneKeys); - }); - advancedDrivingToggle = advancedLateralTuneToggle; - } else if (param == "SteerFriction") { - std::vector steerFrictionToggleNames{"Reset"}; - advancedDrivingToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0.01, 0.25, QString(), std::map(), 0.01, {}, steerFrictionToggleNames, false); - } else if (param == "SteerKP") { - std::vector steerKPToggleNames{"Reset"}; - advancedDrivingToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, steerKPStock * 0.50, steerKPStock * 1.50, QString(), std::map(), 0.01, {}, steerKPToggleNames, false); - } else if (param == "SteerLatAccel") { - std::vector steerLatAccelToggleNames{"Reset"}; - advancedDrivingToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, steerLatAccelStock * 0.25, steerLatAccelStock * 1.25, QString(), std::map(), 0.01, {}, steerLatAccelToggleNames, false); - } else if (param == "SteerRatio") { - std::vector steerRatioToggleNames{"Reset"}; - advancedDrivingToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, steerRatioStock * 0.75, steerRatioStock * 1.25, QString(), std::map(), 0.01, {}, steerRatioToggleNames, false); - - } else if (param == "AdvancedLongitudinalTune") { - FrogPilotParamManageControl *advancedLongitudinalTuneToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(advancedLongitudinalTuneToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - std::set modifiedLongitudinalTuneKeys = longitudinalTuneKeys; - - bool radarlessModel = QString::fromStdString(params.get("RadarlessModels")).split(",").contains(QString::fromStdString(params.get("Model"))); - if (radarlessModel) { - modifiedLongitudinalTuneKeys.erase("LeadDetectionThreshold"); - } - - showToggles(modifiedLongitudinalTuneKeys); - }); - advancedDrivingToggle = advancedLongitudinalTuneToggle; - } else if (param == "LeadDetectionThreshold") { - advancedDrivingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, "%"); - } else if (param == "MaxDesiredAcceleration") { - advancedDrivingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.1, 4.0, "m/s", std::map(), 0.1); - - } else if (param == "AdvancedQOLDriving") { - FrogPilotParamManageControl *advancedQOLToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(advancedQOLToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - std::set modifiedQolKeys = qolKeys; - - if (hasPCMCruise) { - modifiedQolKeys.erase("SetSpeedOffset"); - } - - showToggles(modifiedQolKeys); - }); - advancedDrivingToggle = advancedQOLToggle; - } else if (param == "SetSpeedOffset") { - advancedDrivingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr("mph")); - - } else if (param == "CustomPersonalities") { - FrogPilotParamManageControl *customPersonalitiesToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(customPersonalitiesToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - showToggles(customDrivingPersonalityKeys); - }); - advancedDrivingToggle = customPersonalitiesToggle; - } else if (param == "ResetTrafficPersonality" || param == "ResetAggressivePersonality" || param == "ResetStandardPersonality" || param == "ResetRelaxedPersonality") { - FrogPilotButtonsControl *profileBtn = new FrogPilotButtonsControl(title, desc, {tr("Reset")}); - advancedDrivingToggle = profileBtn; - } else if (param == "TrafficPersonalityProfile") { - FrogPilotParamManageControl *trafficPersonalityToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(trafficPersonalityToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - customPersonalityOpen = true; - openSubParentToggle(); - showToggles(trafficPersonalityKeys); - }); - advancedDrivingToggle = trafficPersonalityToggle; - } else if (param == "AggressivePersonalityProfile") { - FrogPilotParamManageControl *aggressivePersonalityToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(aggressivePersonalityToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - customPersonalityOpen = true; - openSubParentToggle(); - showToggles(aggressivePersonalityKeys); - }); - advancedDrivingToggle = aggressivePersonalityToggle; - } else if (param == "StandardPersonalityProfile") { - FrogPilotParamManageControl *standardPersonalityToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(standardPersonalityToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - customPersonalityOpen = true; - openSubParentToggle(); - showToggles(standardPersonalityKeys); - }); - advancedDrivingToggle = standardPersonalityToggle; - } else if (param == "RelaxedPersonalityProfile") { - FrogPilotParamManageControl *relaxedPersonalityToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(relaxedPersonalityToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - customPersonalityOpen = true; - openSubParentToggle(); - showToggles(relaxedPersonalityKeys); - }); - advancedDrivingToggle = relaxedPersonalityToggle; - } else if (trafficPersonalityKeys.find(param) != trafficPersonalityKeys.end() || - aggressivePersonalityKeys.find(param) != aggressivePersonalityKeys.end() || - standardPersonalityKeys.find(param) != standardPersonalityKeys.end() || - relaxedPersonalityKeys.find(param) != relaxedPersonalityKeys.end()) { - if (param == "TrafficFollow" || param == "AggressiveFollow" || param == "StandardFollow" || param == "RelaxedFollow") { - if (param == "TrafficFollow") { - advancedDrivingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.5, 5, tr(" seconds"), std::map(), 0.01); - } else { - advancedDrivingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 5, tr(" seconds"), std::map(), 0.01); - } - } else { - advancedDrivingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 500, "%"); - } - - } else if (param == "ModelManagement") { - FrogPilotParamManageControl *modelManagementToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(modelManagementToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - availableModelNames = QString::fromStdString(params.get("AvailableModelsNames")).split(","); - availableModels = QString::fromStdString(params.get("AvailableModels")).split(","); - experimentalModels = QString::fromStdString(params.get("ExperimentalModels")).split(","); - - modelManagementOpen = true; - - QString currentModel = QString::fromStdString(params.get("Model")) + ".thneed"; - QStringList modelFiles = modelDir.entryList({"*.thneed"}, QDir::Files); - modelFiles.removeAll(currentModel); - haveModelsDownloaded = modelFiles.size() > 1; - modelsDownloaded = params.getBool("ModelsDownloaded"); - - showToggles(modelManagementKeys); - }); - advancedDrivingToggle = modelManagementToggle; - } else if (param == "ModelRandomizer") { - FrogPilotParamManageControl *modelRandomizerToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(modelRandomizerToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - openSubParentToggle(); - showToggles(modelRandomizerKeys); - updateModelLabels(); - }); - advancedDrivingToggle = modelRandomizerToggle; - } else if (param == "ManageBlacklistedModels") { - FrogPilotButtonsControl *blacklistBtn = new FrogPilotButtonsControl(title, desc, {tr("ADD"), tr("REMOVE")}); - QObject::connect(blacklistBtn, &FrogPilotButtonsControl::buttonClicked, [this](int id) { - QStringList blacklistedModels = QString::fromStdString(params.get("BlacklistedModels")).split(",", QString::SkipEmptyParts); - QStringList selectableModels = availableModelNames; - - for (QString &model : blacklistedModels) { - selectableModels.removeAll(model); - if (model.contains("(Default)")) { - blacklistedModels.move(blacklistedModels.indexOf(model), 0); - } - } - - if (id == 0) { - if (selectableModels.size() == 1) { - FrogPilotConfirmationDialog::toggleAlert(tr("There's no more models to blacklist! The only available model is \"%1\"!").arg(selectableModels.first()), tr("OK"), this); - } else { - QString selectedModel = MultiOptionDialog::getSelection(tr("Select a model to add to the blacklist"), selectableModels, "", this); - if (!selectedModel.isEmpty()) { - if (ConfirmationDialog::confirm(tr("Are you sure you want to add the '%1' model to the blacklist?").arg(selectedModel), tr("Add"), this)) { - if (!blacklistedModels.contains(selectedModel)) { - blacklistedModels.append(selectedModel); - params.putNonBlocking("BlacklistedModels", blacklistedModels.join(",").toStdString()); - paramsStorage.putNonBlocking("BlacklistedModels", blacklistedModels.join(",").toStdString()); - } - } - } - } - } else if (id == 1) { - QString selectedModel = MultiOptionDialog::getSelection(tr("Select a model to remove from the blacklist"), blacklistedModels, "", this); - if (!selectedModel.isEmpty()) { - if (ConfirmationDialog::confirm(tr("Are you sure you want to remove the '%1' model from the blacklist?").arg(selectedModel), tr("Remove"), this)) { - if (blacklistedModels.contains(selectedModel)) { - blacklistedModels.removeAll(selectedModel); - params.putNonBlocking("BlacklistedModels", blacklistedModels.join(",").toStdString()); - paramsStorage.putNonBlocking("BlacklistedModels", blacklistedModels.join(",").toStdString()); - } - } - } - } - }); - advancedDrivingToggle = blacklistBtn; - } else if (param == "ResetScores") { - ButtonControl *resetCalibrationsBtn = new ButtonControl(title, tr("RESET"), desc); - QObject::connect(resetCalibrationsBtn, &ButtonControl::clicked, [this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Reset all model scores?"), this)) { - for (const QString &model : availableModelNames) { - QString cleanedModel = processModelName(model); - params.remove(QString("%1Drives").arg(cleanedModel).toStdString()); - paramsStorage.remove(QString("%1Drives").arg(cleanedModel).toStdString()); - params.remove(QString("%1Score").arg(cleanedModel).toStdString()); - paramsStorage.remove(QString("%1Score").arg(cleanedModel).toStdString()); - } - updateModelLabels(); - } - }); - advancedDrivingToggle = reinterpret_cast(resetCalibrationsBtn); - } else if (param == "ReviewScores") { - ButtonControl *reviewScoresBtn = new ButtonControl(title, tr("VIEW"), desc); - QObject::connect(reviewScoresBtn, &ButtonControl::clicked, [this]() { - openSubSubParentToggle(); - - for (LabelControl *label : labelControls) { - label->setVisible(true); - } - - for (auto &[key, toggle] : toggles) { - toggle->setVisible(false); - } - }); - advancedDrivingToggle = reinterpret_cast(reviewScoresBtn); - } else if (param == "DeleteModel") { - deleteModelBtn = new ButtonControl(title, tr("DELETE"), desc); - QObject::connect(deleteModelBtn, &ButtonControl::clicked, [this]() { - QStringList deletableModels, existingModels = modelDir.entryList({"*.thneed"}, QDir::Files); - QMap labelToFileMap; - QString currentModel = QString::fromStdString(params.get("Model")) + ".thneed"; - - for (int i = 0; i < availableModels.size(); ++i) { - QString modelFile = availableModels[i] + ".thneed"; - if (existingModels.contains(modelFile) && modelFile != currentModel && !availableModelNames[i].contains("(Default)")) { - deletableModels.append(availableModelNames[i]); - labelToFileMap[availableModelNames[i]] = modelFile; - } - } - - QString selectedModel = MultiOptionDialog::getSelection(tr("Select a model to delete"), deletableModels, "", this); - if (!selectedModel.isEmpty()) { - if (ConfirmationDialog::confirm(tr("Are you sure you want to delete the '%1' model?").arg(selectedModel), tr("Delete"), this)) { - std::thread([=]() { - modelDeleting = true; - modelsDownloaded = false; - update(); - - params.putBoolNonBlocking("ModelsDownloaded", false); - deleteModelBtn->setValue(tr("Deleting...")); - - QFile::remove(modelDir.absoluteFilePath(labelToFileMap[selectedModel])); - deleteModelBtn->setValue(tr("Deleted!")); - - util::sleep_for(1000); - deleteModelBtn->setValue(""); - modelDeleting = false; - - QStringList modelFiles = modelDir.entryList({"*.thneed"}, QDir::Files); - modelFiles.removeAll(currentModel); - - haveModelsDownloaded = modelFiles.size() > 1; - update(); - }).detach(); - } - } - }); - advancedDrivingToggle = reinterpret_cast(deleteModelBtn); - } else if (param == "DownloadModel") { - downloadModelBtn = new ButtonControl(title, tr("DOWNLOAD"), desc); - QObject::connect(downloadModelBtn, &ButtonControl::clicked, [this]() { - if (downloadModelBtn->text() == tr("CANCEL")) { - paramsMemory.remove("ModelToDownload"); - paramsMemory.putBool("CancelModelDownload", true); - cancellingDownload = true; - - device()->resetInteractiveTimeout(30); - } else { - QMap labelToModelMap; - QStringList existingModels = modelDir.entryList({"*.thneed"}, QDir::Files); - QStringList downloadableModels; - - for (int i = 0; i < availableModels.size(); ++i) { - QString modelFile = availableModels[i] + ".thneed"; - if (!existingModels.contains(modelFile) && !availableModelNames[i].contains("(Default)")) { - downloadableModels.append(availableModelNames[i]); - labelToModelMap.insert(availableModelNames[i], availableModels[i]); - } - } - - QString modelToDownload = MultiOptionDialog::getSelection(tr("Select a driving model to download"), downloadableModels, "", this); - if (!modelToDownload.isEmpty()) { - device()->resetInteractiveTimeout(300); - - modelDownloading = true; - paramsMemory.put("ModelToDownload", labelToModelMap.value(modelToDownload).toStdString()); - paramsMemory.put("ModelDownloadProgress", "0%"); - - downloadModelBtn->setValue(tr("Downloading %1...").arg(modelToDownload.remove(QRegularExpression("[πŸ—ΊοΈπŸ‘€πŸ“‘]")).trimmed())); - - QTimer *progressTimer = new QTimer(this); - progressTimer->setInterval(100); - - QObject::connect(progressTimer, &QTimer::timeout, this, [=]() { - QString progress = QString::fromStdString(paramsMemory.get("ModelDownloadProgress")); - bool downloadComplete = progress.contains(QRegularExpression("downloaded", QRegularExpression::CaseInsensitiveOption)); - bool downloadFailed = progress.contains(QRegularExpression("cancelled|exists|failed|offline", QRegularExpression::CaseInsensitiveOption)); - - if (!progress.isEmpty() && progress != "0%") { - downloadModelBtn->setValue(progress); - } - - if (downloadComplete || downloadFailed) { - bool lastModelDownloaded = downloadComplete; - - if (downloadComplete) { - haveModelsDownloaded = true; - update(); - } - - if (downloadComplete) { - for (const QString &model : availableModels) { - if (!QFile::exists(modelDir.filePath(model + ".thneed"))) { - lastModelDownloaded = false; - break; - } - } - } - - downloadModelBtn->setValue(progress); - - paramsMemory.remove("CancelModelDownload"); - paramsMemory.remove("ModelDownloadProgress"); - - progressTimer->stop(); - progressTimer->deleteLater(); - - QTimer::singleShot(2000, this, [=]() { - cancellingDownload = false; - modelDownloading = false; - - downloadModelBtn->setValue(""); - - if (lastModelDownloaded) { - modelsDownloaded = true; - update(); - - params.putBoolNonBlocking("ModelsDownloaded", modelsDownloaded); - } - - device()->resetInteractiveTimeout(30); - }); - } - }); - progressTimer->start(); - } - } - }); - advancedDrivingToggle = reinterpret_cast(downloadModelBtn); - } else if (param == "DownloadAllModels") { - downloadAllModelsBtn = new ButtonControl(title, tr("DOWNLOAD"), desc); - QObject::connect(downloadAllModelsBtn, &ButtonControl::clicked, [this]() { - if (downloadAllModelsBtn->text() == tr("CANCEL")) { - paramsMemory.remove("DownloadAllModels"); - paramsMemory.putBool("CancelModelDownload", true); - cancellingDownload = true; - - device()->resetInteractiveTimeout(30); - } else { - device()->resetInteractiveTimeout(300); - - startDownloadAllModels(); - } - }); - advancedDrivingToggle = reinterpret_cast(downloadAllModelsBtn); - } else if (param == "SelectModel") { - selectModelBtn = new ButtonControl(title, tr("SELECT"), desc); - QObject::connect(selectModelBtn, &ButtonControl::clicked, [this]() { - QSet modelFilesBaseNames = QSet::fromList(modelDir.entryList({"*.thneed"}, QDir::Files).replaceInStrings(QRegExp("\\.thneed$"), "")); - QStringList selectableModels; - - for (int i = 0; i < availableModels.size(); ++i) { - if (modelFilesBaseNames.contains(availableModels[i]) || availableModelNames[i].contains("(Default)")) { - selectableModels.append(availableModelNames[i]); - } - } - - QString modelToSelect = MultiOptionDialog::getSelection(tr("Select a model - πŸ—ΊοΈ = Navigation | πŸ“‘ = Radar | πŸ‘€ = VOACC"), selectableModels, "", this); - if (!modelToSelect.isEmpty()) { - selectModelBtn->setValue(modelToSelect); - int modelIndex = availableModelNames.indexOf(modelToSelect); - - params.putNonBlocking("Model", availableModels.at(modelIndex).toStdString()); - params.putNonBlocking("ModelName", modelToSelect.toStdString()); - - if (experimentalModels.contains(availableModels.at(modelIndex))) { - FrogPilotConfirmationDialog::toggleAlert(tr("WARNING: This is a very experimental model and may drive dangerously!"), tr("I understand the risks."), this); - } - - QString model = availableModelNames.at(modelIndex); - QString part_model_param = processModelName(model); - - if (!params.checkKey(part_model_param.toStdString() + "CalibrationParams") || !params.checkKey(part_model_param.toStdString() + "LiveTorqueParameters")) { - if (FrogPilotConfirmationDialog::yesorno(tr("Start with a fresh calibration for the newly selected model?"), this)) { - params.remove("CalibrationParams"); - params.remove("LiveTorqueParameters"); - } - } - - if (started) { - if (FrogPilotConfirmationDialog::toggle(tr("Reboot required to take effect."), tr("Reboot Now"), this)) { - Hardware::reboot(); - } - } - } - }); - selectModelBtn->setValue(QString::fromStdString(params.get("ModelName"))); - advancedDrivingToggle = reinterpret_cast(selectModelBtn); - } else if (param == "ResetCalibrations") { - FrogPilotButtonsControl *resetCalibrationsBtn = new FrogPilotButtonsControl(title, desc, {tr("RESET ALL"), tr("RESET ONE")}); - QObject::connect(resetCalibrationsBtn, &FrogPilotButtonsControl::showDescriptionEvent, this, &FrogPilotAdvancedDrivingPanel::updateCalibrationDescription); - QObject::connect(resetCalibrationsBtn, &FrogPilotButtonsControl::buttonClicked, [=](int id) { - if (id == 0) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset all of your model calibrations?"), this)) { - for (const QString &model : availableModelNames) { - QString cleanedModel = processModelName(model); - params.remove(QString("%1CalibrationParams").arg(cleanedModel).toStdString()); - paramsStorage.remove(QString("%1CalibrationParams").arg(cleanedModel).toStdString()); - params.remove(QString("%1LiveTorqueParameters").arg(cleanedModel).toStdString()); - paramsStorage.remove(QString("%1LiveTorqueParameters").arg(cleanedModel).toStdString()); - } - } - } else if (id == 1) { - QStringList selectableModelLabels; - for (int i = 0; i < availableModels.size(); ++i) { - selectableModelLabels.append(availableModelNames[i]); - } - - QString modelToReset = MultiOptionDialog::getSelection(tr("Select a model to reset"), selectableModelLabels, "", this); - if (!modelToReset.isEmpty()) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset this model's calibrations?"), this)) { - QString cleanedModel = processModelName(modelToReset); - params.remove(QString("%1CalibrationParams").arg(cleanedModel).toStdString()); - paramsStorage.remove(QString("%1CalibrationParams").arg(cleanedModel).toStdString()); - params.remove(QString("%1LiveTorqueParameters").arg(cleanedModel).toStdString()); - paramsStorage.remove(QString("%1LiveTorqueParameters").arg(cleanedModel).toStdString()); - } - } - } - }); - advancedDrivingToggle = resetCalibrationsBtn; - - } else { - advancedDrivingToggle = new ParamControl(param, title, desc, icon); - } - - addItem(advancedDrivingToggle); - toggles[param] = advancedDrivingToggle; - - makeConnections(advancedDrivingToggle); - - if (FrogPilotParamManageControl *frogPilotManageToggle = qobject_cast(advancedDrivingToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotParamManageControl::manageButtonClicked, this, &FrogPilotAdvancedDrivingPanel::openParentToggle); - } - - QObject::connect(advancedDrivingToggle, &AbstractControl::showDescriptionEvent, [this]() { - update(); - }); - } - - QObject::connect(static_cast(toggles["ModelManagement"]), &ToggleControl::toggleFlipped, [this](bool state) { - modelManagement = state; - }); - - QObject::connect(static_cast(toggles["ModelRandomizer"]), &ToggleControl::toggleFlipped, [this](bool state) { - modelRandomizer = state; - if (state && !modelsDownloaded) { - if (FrogPilotConfirmationDialog::yesorno(tr("The 'Model Randomizer' only works with downloaded models. Do you want to download all the driving models?"), this)) { - startDownloadAllModels(); - } - } - }); - - steerFrictionToggle = static_cast(toggles["SteerFriction"]); - QObject::connect(steerFrictionToggle, &FrogPilotParamValueButtonControl::buttonClicked, [this]() { - params.putFloat("SteerFriction", steerFrictionStock); - steerFrictionToggle->refresh(); - updateFrogPilotToggles(); - }); - - steerKPToggle = static_cast(toggles["SteerKP"]); - QObject::connect(steerKPToggle, &FrogPilotParamValueButtonControl::buttonClicked, [this]() { - params.putFloat("SteerKP", steerKPStock); - steerKPToggle->refresh(); - updateFrogPilotToggles(); - }); - - steerLatAccelToggle = static_cast(toggles["SteerLatAccel"]); - QObject::connect(steerLatAccelToggle, &FrogPilotParamValueButtonControl::buttonClicked, [this]() { - params.putFloat("SteerLatAccel", steerLatAccelStock); - steerLatAccelToggle->refresh(); - updateFrogPilotToggles(); - }); - - steerRatioToggle = static_cast(toggles["SteerRatio"]); - QObject::connect(steerRatioToggle, &FrogPilotParamValueButtonControl::buttonClicked, [this]() { - params.putFloat("SteerRatio", steerRatioStock); - steerRatioToggle->refresh(); - updateFrogPilotToggles(); - }); - - FrogPilotParamValueControl *trafficFollowToggle = static_cast(toggles["TrafficFollow"]); - FrogPilotParamValueControl *trafficAccelerationToggle = static_cast(toggles["TrafficJerkAcceleration"]); - FrogPilotParamValueControl *trafficDecelerationToggle = static_cast(toggles["TrafficJerkDeceleration"]); - FrogPilotParamValueControl *trafficDangerToggle = static_cast(toggles["TrafficJerkDanger"]); - FrogPilotParamValueControl *trafficSpeedToggle = static_cast(toggles["TrafficJerkSpeed"]); - FrogPilotParamValueControl *trafficSpeedDecreaseToggle = static_cast(toggles["TrafficJerkSpeedDecrease"]); - FrogPilotButtonsControl *trafficResetButton = static_cast(toggles["ResetTrafficPersonality"]); - QObject::connect(trafficResetButton, &FrogPilotButtonsControl::buttonClicked, this, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the 'Traffic Mode' personality?"), this)) { - params.putFloat("TrafficFollow", 0.5); - params.putFloat("TrafficJerkAcceleration", 50); - params.putFloat("TrafficJerkDeceleration", 50); - params.putFloat("TrafficJerkDanger", 100); - params.putFloat("TrafficJerkSpeed", 50); - params.putFloat("TrafficJerkSpeedDecrease", 50); - trafficFollowToggle->refresh(); - trafficAccelerationToggle->refresh(); - trafficDecelerationToggle->refresh(); - trafficDangerToggle->refresh(); - trafficSpeedToggle->refresh(); - trafficSpeedDecreaseToggle->refresh(); - updateFrogPilotToggles(); - } - }); - - FrogPilotParamValueControl *aggressiveFollowToggle = static_cast(toggles["AggressiveFollow"]); - FrogPilotParamValueControl *aggressiveAccelerationToggle = static_cast(toggles["AggressiveJerkAcceleration"]); - FrogPilotParamValueControl *aggressiveDecelerationToggle = static_cast(toggles["AggressiveJerkDeceleration"]); - FrogPilotParamValueControl *aggressiveDangerToggle = static_cast(toggles["AggressiveJerkDanger"]); - FrogPilotParamValueControl *aggressiveSpeedToggle = static_cast(toggles["AggressiveJerkSpeed"]); - FrogPilotParamValueControl *aggressiveSpeedDecreaseToggle = static_cast(toggles["AggressiveJerkSpeedDecrease"]); - FrogPilotButtonsControl *aggressiveResetButton = static_cast(toggles["ResetAggressivePersonality"]); - QObject::connect(aggressiveResetButton, &FrogPilotButtonsControl::buttonClicked, this, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the 'Aggressive' personality?"), this)) { - params.putFloat("AggressiveFollow", 1.25); - params.putFloat("AggressiveJerkAcceleration", 50); - params.putFloat("AggressiveJerkDeceleration", 50); - params.putFloat("AggressiveJerkDanger", 100); - params.putFloat("AggressiveJerkSpeed", 50); - params.putFloat("AggressiveJerkSpeedDecrease", 50); - aggressiveFollowToggle->refresh(); - aggressiveAccelerationToggle->refresh(); - aggressiveDecelerationToggle->refresh(); - aggressiveDangerToggle->refresh(); - aggressiveSpeedToggle->refresh(); - aggressiveSpeedDecreaseToggle->refresh(); - updateFrogPilotToggles(); - } - }); - - FrogPilotParamValueControl *standardFollowToggle = static_cast(toggles["StandardFollow"]); - FrogPilotParamValueControl *standardAccelerationToggle = static_cast(toggles["StandardJerkAcceleration"]); - FrogPilotParamValueControl *standardDecelerationToggle = static_cast(toggles["StandardJerkDeceleration"]); - FrogPilotParamValueControl *standardDangerToggle = static_cast(toggles["StandardJerkDanger"]); - FrogPilotParamValueControl *standardSpeedToggle = static_cast(toggles["StandardJerkSpeed"]); - FrogPilotParamValueControl *standardSpeedDecreaseToggle = static_cast(toggles["StandardJerkSpeedDecrease"]); - FrogPilotButtonsControl *standardResetButton = static_cast(toggles["ResetStandardPersonality"]); - QObject::connect(standardResetButton, &FrogPilotButtonsControl::buttonClicked, this, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the 'Standard' personality?"), this)) { - params.putFloat("StandardFollow", 1.45); - params.putFloat("StandardJerkAcceleration", 100); - params.putFloat("StandardJerkDeceleration", 100); - params.putFloat("StandardJerkDanger", 100); - params.putFloat("StandardJerkSpeed", 100); - params.putFloat("StandardJerkSpeedDecrease", 100); - standardFollowToggle->refresh(); - standardAccelerationToggle->refresh(); - standardDecelerationToggle->refresh(); - standardDangerToggle->refresh(); - standardSpeedToggle->refresh(); - standardSpeedDecreaseToggle->refresh(); - updateFrogPilotToggles(); - } - }); - - FrogPilotParamValueControl *relaxedFollowToggle = static_cast(toggles["RelaxedFollow"]); - FrogPilotParamValueControl *relaxedAccelerationToggle = static_cast(toggles["RelaxedJerkAcceleration"]); - FrogPilotParamValueControl *relaxedDecelerationToggle = static_cast(toggles["RelaxedJerkDeceleration"]); - FrogPilotParamValueControl *relaxedDangerToggle = static_cast(toggles["RelaxedJerkDanger"]); - FrogPilotParamValueControl *relaxedSpeedToggle = static_cast(toggles["RelaxedJerkSpeed"]); - FrogPilotParamValueControl *relaxedSpeedDecreaseToggle = static_cast(toggles["RelaxedJerkSpeedDecrease"]); - FrogPilotButtonsControl *relaxedResetButton = static_cast(toggles["ResetRelaxedPersonality"]); - QObject::connect(relaxedResetButton, &FrogPilotButtonsControl::buttonClicked, this, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the 'Relaxed' personality?"), this)) { - params.putFloat("RelaxedFollow", 1.75); - params.putFloat("RelaxedJerkAcceleration", 100); - params.putFloat("RelaxedJerkDeceleration", 100); - params.putFloat("RelaxedJerkDanger", 100); - params.putFloat("RelaxedJerkSpeed", 100); - params.putFloat("RelaxedJerkSpeedDecrease", 100); - relaxedFollowToggle->refresh(); - relaxedAccelerationToggle->refresh(); - relaxedDecelerationToggle->refresh(); - relaxedDangerToggle->refresh(); - relaxedSpeedToggle->refresh(); - relaxedSpeedDecreaseToggle->refresh(); - updateFrogPilotToggles(); - } - }); - - QObject::connect(parent, &FrogPilotSettingsWindow::closeParentToggle, this, &FrogPilotAdvancedDrivingPanel::hideToggles); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubParentToggle, this, &FrogPilotAdvancedDrivingPanel::hideSubToggles); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubSubParentToggle, this, &FrogPilotAdvancedDrivingPanel::hideSubSubToggles); - QObject::connect(parent, &FrogPilotSettingsWindow::updateCarToggles, this, &FrogPilotAdvancedDrivingPanel::updateCarToggles); - QObject::connect(parent, &FrogPilotSettingsWindow::updateMetric, this, &FrogPilotAdvancedDrivingPanel::updateMetric); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotAdvancedDrivingPanel::updateState); - - updateMetric(); -} - -void FrogPilotAdvancedDrivingPanel::updateMetric() { - bool previousIsMetric = isMetric; - isMetric = params.getBool("IsMetric"); - - if (isMetric != previousIsMetric) { - double speedConversion = isMetric ? MILE_TO_KM : KM_TO_MILE; - - params.putFloatNonBlocking("SetSpeedOffset", params.getFloat("SetSpeedOffset") * speedConversion); - } - - FrogPilotParamValueControl *setSpeedOffsetToggle = static_cast(toggles["SetSpeedOffset"]); - - if (isMetric) { - setSpeedOffsetToggle->updateControl(0, 150, tr("kph")); - } else { - setSpeedOffsetToggle->updateControl(0, 99, tr("mph")); - } -} - -void FrogPilotAdvancedDrivingPanel::showEvent(QShowEvent *event) { - modelManagement = params.getBool("ModelManagement"); - modelRandomizer = params.getBool("ModelRandomizer"); -} - -void FrogPilotAdvancedDrivingPanel::updateCarToggles() { - disableOpenpilotLongitudinal = parent->disableOpenpilotLongitudinal; - hasAutoTune = parent->hasAutoTune; - hasNNFFLog = parent->hasNNFFLog; - hasOpenpilotLongitudinal = parent->hasOpenpilotLongitudinal; - hasPCMCruise = parent->hasPCMCruise; - isPIDCar = parent->isPIDCar; - liveValid = parent->liveValid; - steerFrictionStock = parent->steerFrictionStock; - steerKPStock = parent->steerKPStock; - steerLatAccelStock = parent->steerLatAccelStock; - steerRatioStock = parent->steerRatioStock; - - steerFrictionToggle->setTitle(QString(tr("Friction (Default: %1)")).arg(QString::number(steerFrictionStock, 'f', 2))); - steerKPToggle->setTitle(QString(tr("Kp Factor (Default: %1)")).arg(QString::number(steerKPStock, 'f', 2))); - steerKPToggle->updateControl(steerKPStock * 0.50, steerKPStock * 1.50); - steerLatAccelToggle->setTitle(QString(tr("Lateral Accel (Default: %1)")).arg(QString::number(steerLatAccelStock, 'f', 2))); - steerLatAccelToggle->updateControl(steerLatAccelStock * 0.75, steerLatAccelStock * 1.25); - steerRatioToggle->setTitle(QString(tr("Steer Ratio (Default: %1)")).arg(QString::number(steerRatioStock, 'f', 2))); - steerRatioToggle->updateControl(steerRatioStock * 0.75, steerRatioStock * 1.25); - - hideToggles(); -} - -void FrogPilotAdvancedDrivingPanel::updateState(const UIState &s) { - if (!isVisible()) return; - - if (modelManagementOpen) { - downloadAllModelsBtn->setText(modelDownloading && allModelsDownloading ? tr("CANCEL") : tr("DOWNLOAD")); - downloadModelBtn->setText(modelDownloading && !allModelsDownloading ? tr("CANCEL") : tr("DOWNLOAD")); - - deleteModelBtn->setEnabled(!modelDeleting && !modelDownloading); - downloadAllModelsBtn->setEnabled(s.scene.online && !cancellingDownload && !modelDeleting && (!modelDownloading || allModelsDownloading) && !modelsDownloaded); - downloadModelBtn->setEnabled(s.scene.online && !cancellingDownload && !modelDeleting && !allModelsDownloading && !modelsDownloaded); - selectModelBtn->setEnabled(!modelDeleting && !modelDownloading && !modelRandomizer); - } - - started = s.scene.started; -} - -void FrogPilotAdvancedDrivingPanel::startDownloadAllModels() { - allModelsDownloading = true; - modelDownloading = true; - - paramsMemory.putBool("DownloadAllModels", true); - - downloadAllModelsBtn->setValue(tr("Downloading models...")); - - QTimer *progressTimer = new QTimer(this); - progressTimer->setInterval(100); - - QObject::connect(progressTimer, &QTimer::timeout, this, [=]() { - QString progress = QString::fromStdString(paramsMemory.get("ModelDownloadProgress")); - bool downloadComplete = progress.contains(QRegularExpression("All models downloaded!", QRegularExpression::CaseInsensitiveOption)); - bool downloadFailed = progress.contains(QRegularExpression("cancelled|exists|failed|offline", QRegularExpression::CaseInsensitiveOption)); - - if (!progress.isEmpty() && progress != "0%") { - downloadAllModelsBtn->setValue(progress); - } - - if (downloadComplete || downloadFailed) { - if (downloadComplete) { - haveModelsDownloaded = true; - update(); - } - - downloadAllModelsBtn->setValue(progress); - - paramsMemory.remove("CancelModelDownload"); - paramsMemory.remove("ModelDownloadProgress"); - - progressTimer->stop(); - progressTimer->deleteLater(); - - QTimer::singleShot(2000, this, [=]() { - cancellingDownload = false; - modelDownloading = false; - - paramsMemory.remove("DownloadAllModels"); - - downloadAllModelsBtn->setValue(""); - - device()->resetInteractiveTimeout(30); - }); - } - }); - progressTimer->start(); -} - -void FrogPilotAdvancedDrivingPanel::updateCalibrationDescription() { - QString model = QString::fromStdString(params.get("ModelName")); - QString part_model_param = processModelName(model); - - QString desc = - tr("openpilot requires the device to be mounted within 4Β° left or right and " - "within 5Β° up or 9Β° down. openpilot is continuously calibrating, resetting is rarely required."); - std::string calib_bytes = params.get(part_model_param.toStdString() + "CalibrationParams"); - if (!calib_bytes.empty()) { - try { - AlignedBuffer aligned_buf; - capnp::FlatArrayMessageReader cmsg(aligned_buf.align(calib_bytes.data(), calib_bytes.size())); - auto calib = cmsg.getRoot().getLiveCalibration(); - if (calib.getCalStatus() != cereal::LiveCalibrationData::Status::UNCALIBRATED) { - double pitch = calib.getRpyCalib()[1] * (180 / M_PI); - double yaw = calib.getRpyCalib()[2] * (180 / M_PI); - desc += tr(" Your device is pointed %1Β° %2 and %3Β° %4.") - .arg(QString::number(std::abs(pitch), 'g', 1), pitch > 0 ? tr("down") : tr("up"), - QString::number(std::abs(yaw), 'g', 1), yaw > 0 ? tr("left") : tr("right")); - } - } catch (kj::Exception) { - qInfo() << "invalid CalibrationParams"; - } - } - qobject_cast(sender())->setDescription(desc); -} - -void FrogPilotAdvancedDrivingPanel::updateModelLabels() { - QVector> modelScores; - for (QString &model : availableModelNames) { - QString cleanedModel = processModelName(model); - int score = params.getInt((cleanedModel + "Score").toStdString()); - - if (model.contains("(Default)")) { - modelScores.prepend(qMakePair(model, score)); - } else { - modelScores.append(qMakePair(model, score)); - } - } - - labelControls.clear(); - - for (QPair &pair : modelScores) { - QString scoreDisplay = pair.second == 0 ? "N/A" : QString::number(pair.second) + "%"; - LabelControl *labelControl = new LabelControl(pair.first, scoreDisplay, ""); - labelControls.append(labelControl); - addItem(labelControl); - } - - for (LabelControl *label : labelControls) { - label->setVisible(false); - } -} - -void FrogPilotAdvancedDrivingPanel::showToggles(const std::set &keys) { - setUpdatesEnabled(false); - - for (auto &[key, toggle] : toggles) { - toggle->setVisible(keys.find(key) != keys.end()); - } - - setUpdatesEnabled(true); - update(); -} - -void FrogPilotAdvancedDrivingPanel::hideToggles() { - setUpdatesEnabled(false); - - customPersonalityOpen = false; - modelManagementOpen = false; - - for (LabelControl *label : labelControls) { - label->setVisible(false); - } - - std::set longitudinalKeys = {"AdvancedLongitudinalTune", "CustomPersonalities"}; - for (auto &[key, toggle] : toggles) { - bool subToggles = aggressivePersonalityKeys.find(key) != aggressivePersonalityKeys.end() || - customDrivingPersonalityKeys.find(key) != customDrivingPersonalityKeys.end() || - lateralTuneKeys.find(key) != lateralTuneKeys.end() || - longitudinalTuneKeys.find(key) != longitudinalTuneKeys.end() || - modelManagementKeys.find(key) != modelManagementKeys.end() || - modelRandomizerKeys.find(key) != modelRandomizerKeys.end() || - qolKeys.find(key) != qolKeys.end() || - relaxedPersonalityKeys.find(key) != relaxedPersonalityKeys.end() || - standardPersonalityKeys.find(key) != standardPersonalityKeys.end() || - trafficPersonalityKeys.find(key) != trafficPersonalityKeys.end(); - - if (disableOpenpilotLongitudinal || !hasOpenpilotLongitudinal) { - if (longitudinalKeys.find(key) != longitudinalKeys.end()) { - toggle->setVisible(false); - continue; - } - } - - toggle->setVisible(!subToggles); - } - - setUpdatesEnabled(true); - update(); -} - -void FrogPilotAdvancedDrivingPanel::hideSubToggles() { - if (customPersonalityOpen) { - customPersonalityOpen = false; - showToggles(customDrivingPersonalityKeys); - } else if (modelManagementOpen) { - for (LabelControl *label : labelControls) { - label->setVisible(false); - } - showToggles(modelManagementKeys); - } -} - -void FrogPilotAdvancedDrivingPanel::hideSubSubToggles() { - if (modelManagementOpen) { - for (LabelControl *label : labelControls) { - label->setVisible(false); - } - showToggles(modelRandomizerKeys); - } -} diff --git a/selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.h b/selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.h deleted file mode 100644 index 2e89c0a9629a93..00000000000000 --- a/selfdrive/frogpilot/ui/qt/offroad/advanced_driving_settings.h +++ /dev/null @@ -1,137 +0,0 @@ -#pragma once - -#include - -#include "selfdrive/frogpilot/ui/qt/offroad/frogpilot_settings.h" - -class FrogPilotAdvancedDrivingPanel : public FrogPilotListWidget { - Q_OBJECT - -public: - explicit FrogPilotAdvancedDrivingPanel(FrogPilotSettingsWindow *parent); - -signals: - void openParentToggle(); - void openSubParentToggle(); - void openSubSubParentToggle(); - -protected: - void showEvent(QShowEvent *event) override; - -private: - void hideSubToggles(); - void hideSubSubToggles(); - void hideToggles(); - void showToggles(const std::set &keys); - - void startDownloadAllModels(); - void updateCalibrationDescription(); - void updateCarToggles(); - void updateMetric(); - void updateModelLabels(); - void updateState(const UIState &s); - - std::set aggressivePersonalityKeys = { - "AggressiveFollow", "AggressiveJerkAcceleration", "AggressiveJerkDeceleration", - "AggressiveJerkDanger", "AggressiveJerkSpeed", "AggressiveJerkSpeedDecrease", - "ResetAggressivePersonality" - }; - - std::set customDrivingPersonalityKeys = { - "AggressivePersonalityProfile", "RelaxedPersonalityProfile", "StandardPersonalityProfile", - "TrafficPersonalityProfile" - }; - - std::set lateralTuneKeys = { - "ForceAutoTune", "ForceAutoTuneOff", "SteerFriction", - "SteerLatAccel", "SteerKP", "SteerRatio", "TacoTune", - "TurnDesires" - }; - - std::set longitudinalTuneKeys = { - "LeadDetectionThreshold", "MaxDesiredAcceleration" - }; - - std::set modelManagementKeys = { - "AutomaticallyUpdateModels", "DeleteModel", "DownloadModel", - "DownloadAllModels", "ModelRandomizer", "ResetCalibrations", - "SelectModel" - }; - - std::set modelRandomizerKeys = { - "ManageBlacklistedModels", "ResetScores", "ReviewScores" - }; - - std::set qolKeys = { - "ForceStandstill", "ForceStops", "SetSpeedOffset" - }; - - std::set relaxedPersonalityKeys = { - "RelaxedFollow", "RelaxedJerkAcceleration", "RelaxedJerkDeceleration", - "RelaxedJerkDanger", "RelaxedJerkSpeed", "RelaxedJerkSpeedDecrease", - "ResetRelaxedPersonality" - }; - - std::set standardPersonalityKeys = { - "StandardFollow", "StandardJerkAcceleration", "StandardJerkDeceleration", - "StandardJerkDanger", "StandardJerkSpeed", "StandardJerkSpeedDecrease", - "ResetStandardPersonality" - }; - - std::set trafficPersonalityKeys = { - "TrafficFollow", "TrafficJerkAcceleration", "TrafficJerkDeceleration", - "TrafficJerkDanger", "TrafficJerkSpeed", "TrafficJerkSpeedDecrease", - "ResetTrafficPersonality" - }; - - ButtonControl *deleteModelBtn; - ButtonControl *downloadAllModelsBtn; - ButtonControl *downloadModelBtn; - ButtonControl *selectModelBtn; - - FrogPilotParamValueButtonControl *steerFrictionToggle; - FrogPilotParamValueButtonControl *steerLatAccelToggle; - FrogPilotParamValueButtonControl *steerKPToggle; - FrogPilotParamValueButtonControl *steerRatioToggle; - - FrogPilotSettingsWindow *parent; - - Params params; - Params paramsMemory{"/dev/shm/params"}; - Params paramsStorage{"/persist/params"}; - - QDir modelDir{"/data/models/"}; - - QList labelControls; - - QStringList availableModelNames; - QStringList availableModels; - QStringList experimentalModels; - - bool allModelsDownloading; - bool cancellingDownload; - bool customPersonalityOpen; - bool disableOpenpilotLongitudinal; - bool hasAutoTune; - bool hasNNFFLog; - bool hasOpenpilotLongitudinal; - bool hasPCMCruise; - bool haveModelsDownloaded; - bool isMetric = params.getBool("IsMetric"); - bool isPIDCar; - bool liveValid; - bool modelDeleting; - bool modelDownloading; - bool modelManagement; - bool modelManagementOpen; - bool modelRandomizer; - bool modelsDownloaded; - bool started; - - float steerFrictionStock; - float steerLatAccelStock; - float steerKPStock; - float steerRatioStock; - - std::map toggles; -}; diff --git a/selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.cc deleted file mode 100644 index d9e983749bffa9..00000000000000 --- a/selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.cc +++ /dev/null @@ -1,228 +0,0 @@ -#include "selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.h" - -FrogPilotAdvancedVisualsPanel::FrogPilotAdvancedVisualsPanel(FrogPilotSettingsWindow *parent) : FrogPilotListWidget(parent), parent(parent) { - const std::vector> advancedToggles { - {"AdvancedCustomUI", tr("Advanced Onroad UI Widgets"), tr("Advanced user customizations for the Onroad UI."), "../frogpilot/assets/toggle_icons/icon_advanced_road.png"}, - {"CameraView", tr("Camera View"), tr("Camera view for the onroad UI. This is purely a visual change and doesn't impact how openpilot drives."), ""}, - {"ShowStoppingPoint", tr("Display Stopping Points"), tr("Display an image on the screen where openpilot is detecting a potential red light/stop sign."), ""}, - {"HideLeadMarker", tr("Hide Lead Marker"), tr("Hide the marker for the vehicle ahead on the screen."), ""}, - {"HideSpeed", tr("Hide Speed"), tr("Hide the speed indicator in the onroad UI. Additional toggle allows it to be hidden/shown via tapping the speed itself."), ""}, - {"HideUIElements", tr("Hide UI Elements"), tr("Hide the selected UI elements from the onroad screen."), ""}, - {"WheelSpeed", tr("Use Wheel Speed"), tr("Use the wheel speed instead of the cluster speed in the onroad UI."), ""}, - - {"DeveloperUI", tr("Developer UI"), tr("Show detailed information about openpilot's internal operations."), "../frogpilot/assets/toggle_icons/icon_advanced_device.png"}, - {"BorderMetrics", tr("Border Metrics"), tr("Display performance metrics around the edge of the screen while driving."), ""}, - {"FPSCounter", tr("FPS Display"), tr("Display the 'Frames Per Second' (FPS) at the bottom of the screen while driving."), ""}, - {"LateralMetrics", tr("Lateral Metrics"), tr("Display metrics related to steering control at the top of the screen while driving."), ""}, - {"LongitudinalMetrics", tr("Longitudinal Metrics"), tr("Display metrics related to acceleration, speed, and desired following distance at the top of the screen while driving."), ""}, - {"NumericalTemp", tr("Numerical Temperature Gauge"), tr("Show exact temperature readings instead of general status labels like 'GOOD', 'OK', or 'HIGH' in the sidebar."), ""}, - {"SidebarMetrics", tr("Sidebar"), tr("Display system information like CPU, GPU, RAM usage, IP address, and storage space in the sidebar."), ""}, - {"UseSI", tr("Use International System of Units"), tr("Display measurements using the 'International System of Units' (SI)."), ""}, - - {"ModelUI", tr("Model UI"), tr("Customize the model visualizations on the screen."), "../frogpilot/assets/toggle_icons/icon_advanced_calibration.png"}, - {"LaneLinesWidth", tr("Lane Lines Width"), tr("How thick the lane lines appear on the display.\n\nDefault matches the MUTCD standard of 4 inches."), ""}, - {"PathEdgeWidth", tr("Path Edges Width"), tr("The width of the edges of the driving path to represent different modes and statuses.\n\nDefault is 20% of the total path width.\n\nColor Guide:\n- Blue: Navigation\n- Light Blue: 'Always On Lateral'\n- Green: Default\n- Orange: 'Experimental Mode'\n- Red: 'Traffic Mode'\n- Yellow: 'Conditional Experimental Mode' Overridden"), ""}, - {"PathWidth", tr("Path Width"), tr("How wide the driving path appears on your screen.\n\nDefault (6.1 feet / 1.9 meters) matches the width of a 2019 Lexus ES 350."), ""}, - {"RoadEdgesWidth", tr("Road Edges Width"), tr("How thick the road edges appear on the display.\n\nDefault matches half of the MUTCD standard lane line width of 4 inches."), ""}, - {"UnlimitedLength", tr("'Unlimited' Road UI"), tr("Extend the display of the path, lane lines, and road edges as far as the model can see."), ""}, - }; - - for (const auto &[param, title, desc, icon] : advancedToggles) { - AbstractControl *advancedVisualToggle; - - if (param == "AdvancedCustomUI") { - FrogPilotParamManageControl *advancedCustomUIToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(advancedCustomUIToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - showToggles(advancedCustomOnroadUIKeys); - }); - advancedVisualToggle = advancedCustomUIToggle; - } else if (param == "CameraView") { - std::vector cameraOptions{tr("Auto"), tr("Driver"), tr("Standard"), tr("Wide")}; - ButtonParamControl *preferredCamera = new ButtonParamControl(param, title, desc, icon, cameraOptions); - advancedVisualToggle = preferredCamera; - } else if (param == "HideSpeed") { - std::vector hideSpeedToggles{"HideSpeedUI"}; - std::vector hideSpeedToggleNames{tr("Control Via UI")}; - advancedVisualToggle = new FrogPilotButtonToggleControl(param, title, desc, hideSpeedToggles, hideSpeedToggleNames); - } else if (param == "HideUIElements") { - std::vector uiElementsToggles{"HideAlerts", "HideMapIcon", "HideMaxSpeed"}; - std::vector uiElementsToggleNames{tr("Alerts"), tr("Map Icon"), tr("Max Speed")}; - advancedVisualToggle = new FrogPilotButtonToggleControl(param, title, desc, uiElementsToggles, uiElementsToggleNames); - } else if (param == "ShowStoppingPoint") { - std::vector stoppingPointToggles{"ShowStoppingPointMetrics"}; - std::vector stoppingPointToggleNames{tr("Show Distance")}; - advancedVisualToggle = new FrogPilotButtonToggleControl(param, title, desc, stoppingPointToggles, stoppingPointToggleNames); - - } else if (param == "DeveloperUI") { - FrogPilotParamManageControl *developerUIToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(developerUIToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - borderMetricsBtn->setVisibleButton(0, hasBSM); - lateralMetricsBtn->setVisibleButton(1, hasAutoTune); - longitudinalMetricsBtn->setVisibleButton(0, hasRadar); - - std::set modifiedDeveloperUIKeys = developerUIKeys; - - if (disableOpenpilotLongitudinal || !hasOpenpilotLongitudinal) { - modifiedDeveloperUIKeys.erase("LongitudinalMetrics"); - } - - showToggles(modifiedDeveloperUIKeys); - }); - advancedVisualToggle = developerUIToggle; - } else if (param == "BorderMetrics") { - std::vector borderToggles{"BlindSpotMetrics", "ShowSteering", "SignalMetrics"}; - std::vector borderToggleNames{tr("Blind Spot"), tr("Steering Torque"), tr("Turn Signal")}; - borderMetricsBtn = new FrogPilotButtonToggleControl(param, title, desc, borderToggles, borderToggleNames); - advancedVisualToggle = borderMetricsBtn; - } else if (param == "LateralMetrics") { - std::vector lateralToggles{"AdjacentPathMetrics", "TuningInfo"}; - std::vector lateralToggleNames{tr("Adjacent Path Metrics"), tr("Auto Tune")}; - lateralMetricsBtn = new FrogPilotButtonToggleControl(param, title, desc, lateralToggles, lateralToggleNames); - advancedVisualToggle = lateralMetricsBtn; - } else if (param == "LongitudinalMetrics") { - std::vector longitudinalToggles{"AdjacentLeadsUI", "LeadInfo", "JerkInfo"}; - std::vector longitudinalToggleNames{tr("Adjacent Leads"), tr("Lead Info"), tr("Jerk Values")}; - longitudinalMetricsBtn = new FrogPilotButtonToggleControl(param, title, desc, longitudinalToggles, longitudinalToggleNames); - advancedVisualToggle = longitudinalMetricsBtn; - } else if (param == "NumericalTemp") { - std::vector temperatureToggles{"Fahrenheit"}; - std::vector temperatureToggleNames{tr("Fahrenheit")}; - advancedVisualToggle = new FrogPilotButtonToggleControl(param, title, desc, temperatureToggles, temperatureToggleNames); - } else if (param == "SidebarMetrics") { - std::vector sidebarMetricsToggles{"ShowCPU", "ShowGPU", "ShowIP", "ShowMemoryUsage", "ShowStorageLeft", "ShowStorageUsed"}; - std::vector sidebarMetricsToggleNames{tr("CPU"), tr("GPU"), tr("IP"), tr("RAM"), tr("SSD Left"), tr("SSD Used")}; - FrogPilotButtonToggleControl *sidebarMetricsToggle = new FrogPilotButtonToggleControl(param, title, desc, sidebarMetricsToggles, sidebarMetricsToggleNames, false, 150); - QObject::connect(sidebarMetricsToggle, &FrogPilotButtonToggleControl::buttonClicked, [this](int index) { - if (index == 0) { - params.putBool("ShowGPU", false); - } else if (index == 1) { - params.putBool("ShowCPU", false); - } else if (index == 3) { - params.putBool("ShowStorageLeft", false); - params.putBool("ShowStorageUsed", false); - } else if (index == 4) { - params.putBool("ShowMemoryUsage", false); - params.putBool("ShowStorageUsed", false); - } else if (index == 5) { - params.putBool("ShowMemoryUsage", false); - params.putBool("ShowStorageLeft", false); - } - }); - advancedVisualToggle = sidebarMetricsToggle; - - } else if (param == "ModelUI") { - FrogPilotParamManageControl *modelUIToggle = new FrogPilotParamManageControl(param, title, desc, icon); - QObject::connect(modelUIToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - std::set modifiedModelUIKeysKeys = modelUIKeys; - - if (disableOpenpilotLongitudinal || !hasOpenpilotLongitudinal) { - modifiedModelUIKeysKeys.erase("HideLeadMarker"); - } - - showToggles(modifiedModelUIKeysKeys); - }); - advancedVisualToggle = modelUIToggle; - } else if (param == "LaneLinesWidth" || param == "RoadEdgesWidth") { - advancedVisualToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 24, tr(" inches")); - } else if (param == "PathEdgeWidth") { - advancedVisualToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 100, tr("%")); - } else if (param == "PathWidth") { - advancedVisualToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet"), std::map(), 0.1); - - } else { - advancedVisualToggle = new ParamControl(param, title, desc, icon); - } - - addItem(advancedVisualToggle); - toggles[param] = advancedVisualToggle; - - makeConnections(advancedVisualToggle); - - if (FrogPilotParamManageControl *frogPilotManageToggle = qobject_cast(advancedVisualToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotParamManageControl::manageButtonClicked, this, &FrogPilotAdvancedVisualsPanel::openParentToggle); - } - - QObject::connect(advancedVisualToggle, &AbstractControl::showDescriptionEvent, [this]() { - update(); - }); - } - - QObject::connect(parent, &FrogPilotSettingsWindow::closeParentToggle, this, &FrogPilotAdvancedVisualsPanel::hideToggles); - QObject::connect(parent, &FrogPilotSettingsWindow::updateCarToggles, this, &FrogPilotAdvancedVisualsPanel::updateCarToggles); - QObject::connect(parent, &FrogPilotSettingsWindow::updateMetric, this, &FrogPilotAdvancedVisualsPanel::updateMetric); - - updateMetric(); -} - -void FrogPilotAdvancedVisualsPanel::updateCarToggles() { - disableOpenpilotLongitudinal = parent->disableOpenpilotLongitudinal; - hasAutoTune = parent->hasAutoTune; - hasBSM = parent->hasBSM; - hasOpenpilotLongitudinal = parent->hasOpenpilotLongitudinal; - hasRadar = parent->hasRadar; - - hideToggles(); -} - -void FrogPilotAdvancedVisualsPanel::updateMetric() { - bool previousIsMetric = isMetric; - isMetric = params.getBool("IsMetric"); - - if (isMetric != previousIsMetric) { - double smallDistanceConversion = isMetric ? INCH_TO_CM : CM_TO_INCH; - double distanceConversion = isMetric ? FOOT_TO_METER : METER_TO_FOOT; - - params.putFloatNonBlocking("LaneLinesWidth", params.getFloat("LaneLinesWidth") * smallDistanceConversion); - params.putFloatNonBlocking("RoadEdgesWidth", params.getFloat("RoadEdgesWidth") * smallDistanceConversion); - - params.putFloatNonBlocking("PathWidth", params.getFloat("PathWidth") * distanceConversion); - } - - FrogPilotParamValueControl *laneLinesWidthToggle = static_cast(toggles["LaneLinesWidth"]); - FrogPilotParamValueControl *pathWidthToggle = static_cast(toggles["PathWidth"]); - FrogPilotParamValueControl *roadEdgesWidthToggle = static_cast(toggles["RoadEdgesWidth"]); - - if (isMetric) { - laneLinesWidthToggle->setDescription(tr("Adjust how thick the lane lines appear on the display.\n\nDefault matches the Vienna standard of 10 centimeters.")); - roadEdgesWidthToggle->setDescription(tr("Adjust how thick the road edges appear on the display.\n\nDefault matches half of the Vienna standard of 10 centimeters.")); - - laneLinesWidthToggle->updateControl(0, 60, tr(" centimeters")); - roadEdgesWidthToggle->updateControl(0, 60, tr(" centimeters")); - - pathWidthToggle->updateControl(0, 3, tr(" meters")); - } else { - laneLinesWidthToggle->setDescription(tr("Adjust how thick the lane lines appear on the display.\n\nDefault matches the MUTCD standard of 4 inches.")); - roadEdgesWidthToggle->setDescription(tr("Adjust how thick the road edges appear on the display.\n\nDefault matches half of the MUTCD standard of 4 inches.")); - - laneLinesWidthToggle->updateControl(0, 24, tr(" inches")); - roadEdgesWidthToggle->updateControl(0, 24, tr(" inches")); - - pathWidthToggle->updateControl(0, 10, tr(" feet")); - } -} - -void FrogPilotAdvancedVisualsPanel::showToggles(const std::set &keys) { - setUpdatesEnabled(false); - - for (auto &[key, toggle] : toggles) { - toggle->setVisible(keys.find(key) != keys.end()); - } - - setUpdatesEnabled(true); - update(); -} - -void FrogPilotAdvancedVisualsPanel::hideToggles() { - setUpdatesEnabled(false); - - for (auto &[key, toggle] : toggles) { - bool subToggles = advancedCustomOnroadUIKeys.find(key) != advancedCustomOnroadUIKeys.end() || - developerUIKeys.find(key) != developerUIKeys.end() || - modelUIKeys.find(key) != modelUIKeys.end(); - - toggle->setVisible(!subToggles); - } - - setUpdatesEnabled(true); - update(); -} diff --git a/selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.h b/selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.h deleted file mode 100644 index 837f4aff993769..00000000000000 --- a/selfdrive/frogpilot/ui/qt/offroad/advanced_visual_settings.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include - -#include "selfdrive/frogpilot/ui/qt/offroad/frogpilot_settings.h" - -class FrogPilotAdvancedVisualsPanel : public FrogPilotListWidget { - Q_OBJECT - -public: - explicit FrogPilotAdvancedVisualsPanel(FrogPilotSettingsWindow *parent); - -signals: - void openParentToggle(); - -private: - void hideToggles(); - void showToggles(const std::set &keys); - void updateCarToggles(); - void updateMetric(); - - std::set advancedCustomOnroadUIKeys = { - "CameraView", "HideLeadMarker", "HideSpeed", - "HideUIElements", "ShowStoppingPoint", "WheelSpeed" - }; - - std::set developerUIKeys = { - "BorderMetrics", "FPSCounter", "LateralMetrics", - "LongitudinalMetrics", "NumericalTemp", - "SidebarMetrics", "UseSI" - }; - - std::set modelUIKeys = { - "LaneLinesWidth", "PathEdgeWidth", "PathWidth", - "RoadEdgesWidth", "UnlimitedLength" - }; - - FrogPilotButtonToggleControl *borderMetricsBtn; - FrogPilotButtonToggleControl *lateralMetricsBtn; - FrogPilotButtonToggleControl *longitudinalMetricsBtn; - - FrogPilotSettingsWindow *parent; - - Params params; - - bool disableOpenpilotLongitudinal; - bool hasAutoTune; - bool hasBSM; - bool hasOpenpilotLongitudinal; - bool hasRadar; - bool isMetric = params.getBool("IsMetric"); - - std::map toggles; -}; diff --git a/selfdrive/frogpilot/ui/qt/offroad/device_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/device_settings.cc index 7f007b94109507..40e0ac123503e2 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/device_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/device_settings.cc @@ -55,11 +55,6 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent) : Fr QObject::connect(screenToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { std::set modifiedScreenKeys = screenKeys; - if (customizationLevel != 2) { - modifiedScreenKeys.erase("ScreenTimeout"); - modifiedScreenKeys.erase("ScreenTimeoutOnroad"); - } - showToggles(modifiedScreenKeys); }); deviceToggle = screenToggle; @@ -137,6 +132,8 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent) : Fr void FrogPilotDevicePanel::showEvent(QShowEvent *event) { customizationLevel = parent->customizationLevel; + + toggles["ScreenManagement"]->setVisible(customizationLevel == 2); } void FrogPilotDevicePanel::updateState(const UIState &s) { @@ -163,6 +160,8 @@ void FrogPilotDevicePanel::hideToggles() { toggle->setVisible(!subToggles); } + toggles["ScreenManagement"]->setVisible(customizationLevel == 2); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/offroad/frogpilot_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/frogpilot_settings.cc index 8ce62ea143f22b..7577aff6c7d421 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/frogpilot_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/frogpilot_settings.cc @@ -72,6 +72,7 @@ FrogPilotSettingsWindow::FrogPilotSettingsWindow(SettingsWindow *parent) : QFram QObject::connect(frogpilotMapsPanel, &FrogPilotMapsPanel::openMapSelection, this, &FrogPilotSettingsWindow::openMapSelection); FrogPilotPrimelessPanel *frogpilotPrimelessPanel = new FrogPilotPrimelessPanel(this); + QObject::connect(frogpilotPrimelessPanel, &FrogPilotPrimelessPanel::closeMapBoxInstructions, this, &FrogPilotSettingsWindow::closeMapBoxInstructions); QObject::connect(frogpilotPrimelessPanel, &FrogPilotPrimelessPanel::openMapBoxInstructions, this, &FrogPilotSettingsWindow::openMapBoxInstructions); FrogPilotSoundsPanel *frogpilotSoundsPanel = new FrogPilotSoundsPanel(this); @@ -153,8 +154,13 @@ void FrogPilotSettingsWindow::updatePanelVisibility() { customizationLevel = params.getInt("CustomizationLevel"); disableOpenpilotLongitudinal = params.getBool("DisableOpenpilotLongitudinal"); - drivingButton->setVisibleButton(0, customizationLevel == 2); - drivingButton->setVisibleButton(1, hasOpenpilotLongitudinal && !disableOpenpilotLongitudinal); + if ((hasOpenpilotLongitudinal && !disableOpenpilotLongitudinal) || customizationLevel != 0) { + drivingButton->setVisibleButton(0, customizationLevel == 2); + drivingButton->setVisibleButton(1, hasOpenpilotLongitudinal && !disableOpenpilotLongitudinal); + drivingButton->setVisibleButton(2, customizationLevel != 0); + } else { + drivingButton->setVisible(false); + } navigationButton->setVisibleButton(1, !uiState()->hasPrime()); systemButton->setVisibleButton(1, customizationLevel != 0); diff --git a/selfdrive/frogpilot/ui/qt/offroad/lateral_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/lateral_settings.cc index 80decbe0816332..2042570cef0507 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/lateral_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/lateral_settings.cc @@ -21,7 +21,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent) : {"LaneChangeTime", tr("Lane Change Delay"), tr("Delays lane changes by the set time to prevent sudden changes."), ""}, {"LaneDetectionWidth", tr("Lane Width Requirement"), tr("Sets the minimum lane width for openpilot to detect a lane as a lane."), ""}, {"MinimumLaneChangeSpeed", tr("Minimum Speed for Lane Change"), tr("Sets the minimum speed required for openpilot to perform a lane change."), ""}, - {"OneLaneChange", tr("Single Lane Change Per Signal"), tr("Limits lane changes to one per turn signal activation."), ""}, + {"OneLaneChange", tr("Only One Lane Change Per Signal"), tr("Limits lane changes to one per turn signal activation."), ""}, {"LateralTune", tr("Lateral Tuning"), tr("Settings for fine tuning openpilot's lateral controls."), "../frogpilot/assets/toggle_icons/icon_lateral_tune.png"}, {"TacoTune", tr("comma's 2022 Taco Bell Turn Hack"), tr("Uses comma's hack they used to help handle left and right turns more precisely during their 2022 'Taco Bell' drive."), ""}, @@ -88,8 +88,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent) : modifiedAOLKeys.erase("AlwaysOnLateralLKAS"); } - if (customizationLevel == 0) { - modifiedAOLKeys.erase("AlwaysOnLateralLKAS"); + if (customizationLevel != 2) { modifiedAOLKeys.erase("AlwaysOnLateralMain"); modifiedAOLKeys.erase("HideAOLStatusBar"); } @@ -105,12 +104,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent) : QObject::connect(laneChangeToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { std::set modifiedLaneChangeKeys = laneChangeKeys; - if (customizationLevel == 0) { - modifiedLaneChangeKeys.erase("LaneChangeTime"); - modifiedLaneChangeKeys.erase("LaneDetectionWidth"); - modifiedLaneChangeKeys.erase("MinimumLaneChangeSpeed"); - modifiedLaneChangeKeys.erase("OneLaneChange"); - } else if (customizationLevel == 1) { + if (customizationLevel != 2) { modifiedLaneChangeKeys.erase("LaneDetectionWidth"); modifiedLaneChangeKeys.erase("MinimumLaneChangeSpeed"); } @@ -137,11 +131,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent) : modifiedLateralTuneKeys.erase("NNFFLite"); } - if (customizationLevel == 0) { - modifiedLateralTuneKeys.erase("NNFFLite"); - modifiedLateralTuneKeys.erase("TacoTune"); - modifiedLateralTuneKeys.erase("TurnDesires"); - } else if (customizationLevel == 1) { + if (customizationLevel != 2) { modifiedLateralTuneKeys.erase("TacoTune"); modifiedLateralTuneKeys.erase("TurnDesires"); } @@ -257,7 +247,6 @@ void FrogPilotLateralPanel::showEvent(QShowEvent *event) { customizationLevel = parent->customizationLevel; toggles["AdvancedLateralTune"]->setVisible(customizationLevel == 2); - toggles["QOLLateral"]->setVisible(customizationLevel != 0); } void FrogPilotLateralPanel::updateCarToggles() { @@ -346,11 +335,10 @@ void FrogPilotLateralPanel::hideToggles() { qolKeys.find(key) != qolKeys.end(); toggle->setVisible(!subToggles); - - toggles["AdvancedLateralTune"]->setVisible(customizationLevel == 2); - toggles["QOLLateral"]->setVisible(customizationLevel != 0); } + toggles["AdvancedLateralTune"]->setVisible(customizationLevel == 2); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.cc index e5c183daa54889..a3897f785f39b1 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.cc @@ -156,7 +156,15 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } else if (param == "ConditionalExperimental") { FrogPilotParamManageControl *conditionalExperimentalToggle = new FrogPilotParamManageControl(param, title, desc, icon); QObject::connect(conditionalExperimentalToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - showToggles(conditionalExperimentalKeys); + std::set modifiedConditionalExperimentalKeys = conditionalExperimentalKeys; + + if (customizationLevel != 2) { + modifiedConditionalExperimentalKeys.erase("CENavigation"); + modifiedConditionalExperimentalKeys.erase("CESignalSpeed"); + modifiedConditionalExperimentalKeys.erase("HideCEMStatusBar"); + } + + showToggles(modifiedConditionalExperimentalKeys); }); longitudinalToggle = conditionalExperimentalToggle; } else if (param == "CESpeed") { @@ -266,6 +274,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * modifiedLongitudinalTuneKeys.erase("LeadDetectionThreshold"); modifiedLongitudinalTuneKeys.erase("MaxDesiredAcceleration"); } else if (customizationLevel == 1) { + modifiedLongitudinalTuneKeys.erase("HumanAcceleration"); + modifiedLongitudinalTuneKeys.erase("HumanFollowing"); modifiedLongitudinalTuneKeys.erase("LeadDetectionThreshold"); modifiedLongitudinalTuneKeys.erase("MaxDesiredAcceleration"); } @@ -308,6 +318,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * if (customizationLevel != 2) { modifiedQolKeys.erase("ForceStandstill"); modifiedQolKeys.erase("ForceStops"); + modifiedQolKeys.erase("ReverseCruise"); modifiedQolKeys.erase("SetSpeedOffset"); } @@ -328,20 +339,16 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } else if (param == "SpeedLimitController") { FrogPilotParamManageControl *speedLimitControllerToggle = new FrogPilotParamManageControl(param, title, desc, icon); QObject::connect(speedLimitControllerToggle, &FrogPilotParamManageControl::manageButtonClicked, [this]() { - bool slcLower = params.getBool("SLCConfirmationLower"); - bool slcHigher = params.getBool("SLCConfirmationHigher"); - - slcConfirmationBtn->setCheckedButton(0, slcLower); - slcConfirmationBtn->setCheckedButton(1, slcHigher); - slcConfirmationBtn->setCheckedButton(2, !(slcLower || slcHigher)); - std::set modifiedSpeedLimitControllerKeys = speedLimitControllerKeys; - if (customizationLevel != 2) { + if (customizationLevel == 0) { modifiedSpeedLimitControllerKeys.erase("SLCFallback"); modifiedSpeedLimitControllerKeys.erase("SLCOverride"); modifiedSpeedLimitControllerKeys.erase("SLCPriority"); modifiedSpeedLimitControllerKeys.erase("SLCQOL"); + } else if (customizationLevel != 2) { + modifiedSpeedLimitControllerKeys.erase("SLCPriority"); + modifiedSpeedLimitControllerKeys.erase("SLCQOL"); } showToggles(modifiedSpeedLimitControllerKeys); @@ -350,36 +357,9 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * }); longitudinalToggle = speedLimitControllerToggle; } else if (param == "SLCConfirmation") { - slcConfirmationBtn = new FrogPilotButtonsControl(title, desc, {tr("Lower Limits"), tr("Higher Limits"), tr("None")}, true, false); - QObject::connect(slcConfirmationBtn, &FrogPilotButtonsControl::buttonClicked, [=](int id) { - bool lowerEnabled = params.getBool("SLCConfirmationLower"); - bool higherEnabled = params.getBool("SLCConfirmationHigher"); - - if (id == 0) { - params.putBool("SLCConfirmationLower", !lowerEnabled); - slcConfirmationBtn->setCheckedButton(0, !lowerEnabled); - slcConfirmationBtn->setCheckedButton(2, false); - - if (lowerEnabled & !higherEnabled) { - slcConfirmationBtn->setCheckedButton(2, true); - } - } else if (id == 1) { - params.putBool("SLCConfirmationHigher", !higherEnabled); - slcConfirmationBtn->setCheckedButton(1, !higherEnabled); - slcConfirmationBtn->setCheckedButton(2, false); - - if (higherEnabled & !lowerEnabled) { - slcConfirmationBtn->setCheckedButton(2, true); - } - } else { - params.putBool("SLCConfirmationLower", false); - params.putBool("SLCConfirmationHigher", false); - slcConfirmationBtn->setCheckedButton(0, false); - slcConfirmationBtn->setCheckedButton(1, false); - slcConfirmationBtn->setCheckedButton(2, true); - } - }); - longitudinalToggle = slcConfirmationBtn; + std::vector confirmationToggles{"SLCConfirmationLower", "SLCConfirmationHigher"}; + std::vector confirmationToggleNames{tr("Lower Limits"), tr("Higher Limits")}; + longitudinalToggle = new FrogPilotButtonToggleControl(param, title, desc, confirmationToggles, confirmationToggleNames); } else if (param == "SLCFallback") { std::vector fallbackOptions{tr("Set Speed"), tr("Experimental Mode"), tr("Previous Limit")}; ButtonParamControl *fallbackSelection = new ButtonParamControl(param, title, desc, icon, fallbackOptions); @@ -748,14 +728,14 @@ void FrogPilotLongitudinalPanel::hideToggles() { trafficPersonalityKeys.find(key) != trafficPersonalityKeys.end(); toggle->setVisible(!subToggles); - - toggles["ConditionalExperimental"]->setVisible(customizationLevel != 0); - toggles["CurveSpeedControl"]->setVisible(customizationLevel != 0); - toggles["CustomPersonalities"]->setVisible(customizationLevel == 2); - toggles["ExperimentalModeActivation"]->setVisible(customizationLevel != 0); - toggles["QOLLongitudinal"]->setVisible(customizationLevel != 0); } + toggles["ConditionalExperimental"]->setVisible(customizationLevel != 0); + toggles["CurveSpeedControl"]->setVisible(customizationLevel != 0); + toggles["CustomPersonalities"]->setVisible(customizationLevel == 2); + toggles["ExperimentalModeActivation"]->setVisible(customizationLevel != 0); + toggles["QOLLongitudinal"]->setVisible(customizationLevel != 0); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.h b/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.h index e56f5b65b0920c..e18c86a92c4479 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.h +++ b/selfdrive/frogpilot/ui/qt/offroad/longitudinal_settings.h @@ -95,7 +95,6 @@ class FrogPilotLongitudinalPanel : public FrogPilotListWidget { FrogPilotSettingsWindow *parent; FrogPilotButtonsControl *curveDetectionBtn; - FrogPilotButtonsControl *slcConfirmationBtn; Params params; diff --git a/selfdrive/frogpilot/ui/qt/offroad/sounds_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/sounds_settings.cc index 43744fc514ae4f..e161c0c780533a 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/sounds_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/sounds_settings.cc @@ -109,10 +109,10 @@ void FrogPilotSoundsPanel::hideToggles() { bool subToggles = alertVolumeControlKeys.find(key) != alertVolumeControlKeys.end() || customAlertsKeys.find(key) != customAlertsKeys.end(); toggle->setVisible(!subToggles); - - toggles["AlertVolumeControl"]->setVisible(customizationLevel == 2); } + toggles["AlertVolumeControl"]->setVisible(customizationLevel == 2); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/offroad/theme_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/theme_settings.cc index 8e0cac9894d790..cb8e8da7dfdb88 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/theme_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/theme_settings.cc @@ -859,6 +859,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent) : Fr params.remove("StartupMessageTop"); params.remove("StartupMessageBottom"); } + + updateFrogPilotToggles(); }); themeToggle = startupAlertButton; @@ -899,6 +901,11 @@ void FrogPilotThemesPanel::showEvent(QShowEvent *event) { signalsDownloaded = params.get("DownloadableSignals").empty(); soundsDownloaded = params.get("DownloadableSounds").empty(); wheelsDownloaded = params.get("DownloadableWheels").empty(); + + customizationLevel = parent->customizationLevel; + + toggles["RandomEvents"]->setVisible(customizationLevel != 0); + toggles["StartupAlert"]->setVisible(customizationLevel == 2); } void FrogPilotThemesPanel::updateState(const UIState &s) { @@ -993,6 +1000,9 @@ void FrogPilotThemesPanel::hideToggles() { toggle->setVisible(!subToggles); } + toggles["RandomEvents"]->setVisible(customizationLevel != 0); + toggles["StartupAlert"]->setVisible(customizationLevel == 2); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/offroad/theme_settings.h b/selfdrive/frogpilot/ui/qt/offroad/theme_settings.h index 7a860d3a8bf8c3..7c08fecba860b1 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/theme_settings.h +++ b/selfdrive/frogpilot/ui/qt/offroad/theme_settings.h @@ -58,5 +58,7 @@ class FrogPilotThemesPanel : public FrogPilotListWidget { bool wheelDownloading; bool wheelsDownloaded; + int customizationLevel; + std::map toggles; }; diff --git a/selfdrive/frogpilot/ui/qt/offroad/vehicle_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/vehicle_settings.cc index aa04204bd4b305..5589deee0eb25f 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/vehicle_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/vehicle_settings.cc @@ -302,17 +302,16 @@ void FrogPilotVehiclesPanel::updateToggles() { } toggle->setVisible(setVisible); - - toggles["ClusterOffset"]->setVisible(toggles["ClusterOffset"]->isVisible() && customizationLevel == 2); - toggles["CrosstrekTorque"]->setVisible(toggles["CrosstrekTorque"]->isVisible() && customizationLevel == 2); - toggles["ExperimentalGMTune"]->setVisible(toggles["ExperimentalGMTune"]->isVisible() && customizationLevel == 2); - toggles["FrogsGoMoosTweak"]->setVisible(toggles["FrogsGoMoosTweak"]->isVisible() && customizationLevel == 2); - toggles["LongPitch"]->setVisible(toggles["LongPitch"]->isVisible() && customizationLevel == 2); - toggles["NewLongAPI"]->setVisible(toggles["NewLongAPI"]->isVisible() && customizationLevel == 2); - toggles["NewLongAPIGM"]->setVisible(toggles["NewLongAPIGM"]->isVisible() && customizationLevel == 2); - toggles["NewToyotaTune"]->setVisible(toggles["NewToyotaTune"]->isVisible() && customizationLevel == 2); } + toggles["ClusterOffset"]->setVisible(toggles["ClusterOffset"]->isVisible() && customizationLevel == 2); + toggles["CrosstrekTorque"]->setVisible(toggles["CrosstrekTorque"]->isVisible() && customizationLevel == 2); + toggles["ExperimentalGMTune"]->setVisible(toggles["ExperimentalGMTune"]->isVisible() && customizationLevel == 2); + toggles["FrogsGoMoosTweak"]->setVisible(toggles["FrogsGoMoosTweak"]->isVisible() && customizationLevel == 2); + toggles["LongPitch"]->setVisible(toggles["LongPitch"]->isVisible() && customizationLevel == 2); + toggles["NewLongAPI"]->setVisible(toggles["NewLongAPI"]->isVisible() && customizationLevel == 2); + toggles["NewToyotaTune"]->setVisible(toggles["NewToyotaTune"]->isVisible() && customizationLevel == 2); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/offroad/visual_settings.cc b/selfdrive/frogpilot/ui/qt/offroad/visual_settings.cc index 982a9608a89b5d..e058e4749572dc 100644 --- a/selfdrive/frogpilot/ui/qt/offroad/visual_settings.cc +++ b/selfdrive/frogpilot/ui/qt/offroad/visual_settings.cc @@ -63,7 +63,12 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) : modifiedAccessibilityKeys.erase("OnroadDistanceButton"); } - if (customizationLevel != 2) { + if (customizationLevel == 0) { + modifiedAccessibilityKeys.erase("CameraView"); + modifiedAccessibilityKeys.erase("DriverCamera"); + modifiedAccessibilityKeys.erase("StandbyMode"); + modifiedAccessibilityKeys.erase("StoppedTimer"); + } else if (customizationLevel != 2) { modifiedAccessibilityKeys.erase("CameraView"); modifiedAccessibilityKeys.erase("StandbyMode"); } @@ -237,11 +242,7 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent) : modifiedCustomOnroadUIKeys.erase("PedalsOnUI"); } - if (customizationLevel == 0) { - modifiedCustomOnroadUIKeys.erase("AccelerationPath"); - modifiedCustomOnroadUIKeys.erase("AdjacentPath"); - modifiedCustomOnroadUIKeys.erase("BlindSpotPath"); - } else if (customizationLevel != 2) { + if (customizationLevel != 2) { modifiedCustomOnroadUIKeys.erase("AdjacentPath"); } @@ -288,8 +289,11 @@ void FrogPilotVisualsPanel::showEvent(QShowEvent *event) { customizationLevel = parent->customizationLevel; toggles["AdvancedCustomUI"]->setVisible(customizationLevel == 2); + toggles["CustomUI"]->setVisible(customizationLevel != 0); toggles["DeveloperUI"]->setVisible(customizationLevel == 2); toggles["ModelUI"]->setVisible(customizationLevel == 2); + toggles["NavigationUI"]->setVisible(customizationLevel != 0); + toggles["QOLVisuals"]->setVisible(customizationLevel != 0 || !disableOpenpilotLongitudinal && hasOpenpilotLongitudinal); } void FrogPilotVisualsPanel::updateCarToggles() { @@ -362,12 +366,15 @@ void FrogPilotVisualsPanel::hideToggles() { navigationUIKeys.find(key) != navigationUIKeys.end(); toggle->setVisible(!subToggles); - - toggles["AdvancedCustomUI"]->setVisible(customizationLevel == 2); - toggles["DeveloperUI"]->setVisible(customizationLevel == 2); - toggles["ModelUI"]->setVisible(customizationLevel == 2); } + toggles["AdvancedCustomUI"]->setVisible(customizationLevel == 2); + toggles["CustomUI"]->setVisible(customizationLevel != 0); + toggles["DeveloperUI"]->setVisible(customizationLevel == 2); + toggles["ModelUI"]->setVisible(customizationLevel == 2); + toggles["NavigationUI"]->setVisible(customizationLevel != 0); + toggles["QOLVisuals"]->setVisible(customizationLevel != 0 || !disableOpenpilotLongitudinal && hasOpenpilotLongitudinal); + setUpdatesEnabled(true); update(); } diff --git a/selfdrive/frogpilot/ui/qt/widgets/drive_stats.cc b/selfdrive/frogpilot/ui/qt/widgets/drive_stats.cc index 07586a88b8e357..bcae769226db2a 100644 --- a/selfdrive/frogpilot/ui/qt/widgets/drive_stats.cc +++ b/selfdrive/frogpilot/ui/qt/widgets/drive_stats.cc @@ -61,13 +61,6 @@ void DriveStats::addStatsLayouts(const QString &title, StatsLabels &labels, bool main_layout->addStretch(1); } -void DriveStats::updateFrogPilotStats(const QJsonObject &obj, StatsLabels &labels) { - labels.routes->setText(QString::number(paramsTracking.getInt("FrogPilotDrives"))); - labels.distance->setText(QString::number(int(paramsTracking.getFloat("FrogPilotKilometers") * (metric ? 1 : KM_TO_MILE)))); - labels.distance_unit->setText(getDistanceUnit()); - labels.hours->setText(QString::number(int(paramsTracking.getFloat("FrogPilotMinutes") / 60))); -} - void DriveStats::updateStatsForLabel(const QJsonObject &obj, StatsLabels &labels) { labels.routes->setText(QString::number((int)obj["routes"].toDouble())); labels.distance->setText(QString::number(int(obj["distance"].toDouble() * (metric ? MILE_TO_KM : 1)))); @@ -75,12 +68,22 @@ void DriveStats::updateStatsForLabel(const QJsonObject &obj, StatsLabels &labels labels.hours->setText(QString::number((int)(obj["minutes"].toDouble() / 60))); } +void DriveStats::updateFrogPilotStats(const QJsonObject &obj, StatsLabels &labels) { + labels.routes->setText(QString::number(paramsTracking.getInt("FrogPilotDrives"))); + labels.distance->setText(QString::number(int(paramsTracking.getFloat("FrogPilotKilometers") * (metric ? 1 : KM_TO_MILE)))); + labels.distance_unit->setText(getDistanceUnit()); + labels.hours->setText(QString::number(int(paramsTracking.getFloat("FrogPilotMinutes") / 60))); +} + void DriveStats::updateStats() { QJsonObject json = stats.object(); updateFrogPilotStats(json["frogpilot"].toObject(), frogPilot); updateStatsForLabel(json["all"].toObject(), all); updateStatsForLabel(json["week"].toObject(), week); + + int all_time_minutes = (int)(json["all"].toObject()["minutes"].toDouble()); + params.put("openpilotMinutes", QString::number(all_time_minutes).toStdString()); } void DriveStats::parseResponse(const QString &response, bool success) { diff --git a/selfdrive/locationd/calibrationd.py b/selfdrive/locationd/calibrationd.py index 9cd39fea865674..268634e5e046bc 100755 --- a/selfdrive/locationd/calibrationd.py +++ b/selfdrive/locationd/calibrationd.py @@ -61,12 +61,6 @@ def moving_avg_with_linear_decay(prev_mean: np.ndarray, new_val: np.ndarray, idx class Calibrator: def __init__(self, param_put: bool = False): - # FrogPilot variables - frogpilot_toggles = FrogPilotVariables.toggles - FrogPilotVariables.update_frogpilot_params() - - self.update_toggles = False - self.param_put = param_put self.not_car = False diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index 94c648584f793c..29a5eff220366e 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -157,13 +157,6 @@ def update_params(self, params): self.filtered_params[param].update(value) self.filtered_params[param].update_alpha(self.decay) - # Update FrogPilot parameters - if FrogPilotVariables.toggles_updated: - self.update_toggles = True - elif self.update_toggles: - FrogPilotVariables.update_frogpilot_params() - self.update_toggles = False - def handle_log(self, t, which, msg): if which == "carControl": self.raw_points["carControl_t"].append(t + self.lag) @@ -237,13 +230,6 @@ def main(demo=False): with car.CarParams.from_bytes(params.get("CarParams", block=True)) as CP: estimator = TorqueEstimator(CP, torque_cache) - # FrogPilot variables - frogpilot_toggles = FrogPilotVariables.toggles - FrogPilotVariables.update_frogpilot_params() - - torque_key = frogpilot_toggles.part_model_param + "LiveTorqueParameters" - torque_cache = params.get(torque_key) - while True: sm.update() if sm.all_checks(): diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 0d2eb3d7ec38d1..ea242e3f34df7f 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -134,12 +134,6 @@ def run(self, buf: VisionBuf, wbuf: VisionBuf, transform: np.ndarray, transform_ def main(demo=False): - # FrogPilot variables - frogpilot_toggles = FrogPilotVariables.toggles - FrogPilotVariables.update_frogpilot_params() - - update_toggles = False - cloudlog.warning("modeld init") sentry.set_tag("daemon", PROCESS_NAME) diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index 43a59ecde6f471..e8f39cca2c4368 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -249,7 +249,10 @@ void OffroadHome::hideEvent(QHideEvent *event) { } void OffroadHome::refresh() { - QString model = QString::fromStdString(params.get("ModelName")); + QString model = QString::fromStdString(params.get("ModelName")).remove(QRegularExpression("[πŸ—ΊοΈπŸ‘€πŸ“‘]")).trimmed(); + if (params.getBool("CustomizationLevelConfirmed") && params.getInt("CustomizationLevel") != 2) { + model = QString::fromStdString(params.get("DefaultModelName")); + } if (model.contains("(Default)")) { model = model.remove("(Default)").trimmed(); diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index a37006aa810e8f..74a0cdd8c0c3e9 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -447,6 +447,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { QObject::connect(toggles, &TogglesPanel::updateMetric, this, &SettingsWindow::updateMetric); FrogPilotSettingsWindow *frogpilotSettingsWindow = new FrogPilotSettingsWindow(this); + QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::closeMapBoxInstructions, [this]() {mapboxInstructionsOpen=false;}); QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openMapBoxInstructions, [this]() {mapboxInstructionsOpen=true;}); QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openMapSelection, [this]() {mapSelectionOpen=true;}); QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openPanel, [this]() {panelOpen=true;}); @@ -497,21 +498,29 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { if (!customizationLevelConfirmed) { int frogpilotHours = paramsTracking.getInt("FrogPilotMinutes") / 60; + int openpilotHours = params.getInt("openpilotMinutes") / 60; - if (frogpilotHours < 1) { + if (frogpilotHours < 1 && openpilotHours < 100) { if (FrogPilotConfirmationDialog::toggleAlert(tr("Welcome to FrogPilot! Since you're new to FrogPilot, the 'Basic' toggle preset has been applied, but you can change this at any time via the 'Customization Level' button!"), tr("Sounds good!"), this)) { params.putBoolNonBlocking("CustomizationLevelConfirmed", true); params.putIntNonBlocking("CustomizationLevel", 0); } - } else if (frogpilotHours < 25) { + } else if (frogpilotHours < 50 && openpilotHours < 100) { if (FrogPilotConfirmationDialog::toggleAlert(tr("Since you're fairly new to FrogPilot, the 'Basic' toggle preset has been applied, but you can change this at any time via the 'Customization Level' button!"), tr("Sounds good!"), this)) { params.putBoolNonBlocking("CustomizationLevelConfirmed", true); params.putIntNonBlocking("CustomizationLevel", 0); } } else if (frogpilotHours < 100) { - if (FrogPilotConfirmationDialog::toggleAlert(tr("Since you're experienced with FrogPilot, the 'Standard' toggle preset has been applied, but you can change this at any time via the 'Customization Level' button!"), tr("Sounds good!"), this)) { - params.putBoolNonBlocking("CustomizationLevelConfirmed", true); - params.putIntNonBlocking("CustomizationLevel", 1); + if (openpilotHours >= 100 && frogpilotHours < 100) { + if (FrogPilotConfirmationDialog::toggleAlert(tr("Since you're experienced with openpilot, the 'Standard' toggle preset has been applied, but you can change this at any time via the 'Customization Level' button!"), tr("Sounds good!"), this)) { + params.putBoolNonBlocking("CustomizationLevelConfirmed", true); + params.putIntNonBlocking("CustomizationLevel", 1); + } + } else { + if (FrogPilotConfirmationDialog::toggleAlert(tr("Since you're experienced with FrogPilot, the 'Standard' toggle preset has been applied, but you can change this at any time via the 'Customization Level' button!"), tr("Sounds good!"), this)) { + params.putBoolNonBlocking("CustomizationLevelConfirmed", true); + params.putIntNonBlocking("CustomizationLevel", 1); + } } } else if (frogpilotHours >= 100) { if (FrogPilotConfirmationDialog::toggleAlert(tr("Since you're very experienced with FrogPilot, the 'Advanced' toggle preset has been applied, but you can change this at any time via the 'Customization Level' button!"), tr("Sounds good!"), this)) { diff --git a/selfdrive/ui/qt/onroad/annotated_camera.cc b/selfdrive/ui/qt/onroad/annotated_camera.cc index c0e2c3efc9ef74..5ef225b8fe9a54 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.cc +++ b/selfdrive/ui/qt/onroad/annotated_camera.cc @@ -331,11 +331,7 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s, f // road edges for (int i = 0; i < std::size(scene.road_edge_vertices); ++i) { - if (useStockColors) { - painter.setBrush(QColor::fromRgbF(1.0, 0, 0, std::clamp(1.0 - scene.road_edge_stds[i], 0.0, 1.0))); - } else { - painter.setBrush(scene.road_edges_color); - } + painter.setBrush(QColor::fromRgbF(1.0, 0, 0, std::clamp(1.0 - scene.road_edge_stds[i], 0.0, 1.0))); painter.drawPolygon(scene.road_edge_vertices[i]); } diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 254d9e81dc5b6c..2dda847f9c7e25 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -152,7 +152,7 @@ void update_model(UIState *s, } } max_idx = get_path_length_idx(plan_position, max_distance); - update_line_data(s, plan_position, scene.model_ui ? path_width * (1 - scene.path_edge_width / 100.0f) : 0.9, 1.22, &scene.track_vertices, max_idx, false); + update_line_data(s, plan_position, scene.model_ui ? path_width * (1 - (scene.path_edge_width / 100.0f)) : 0.9, 1.22, &scene.track_vertices, max_idx, false); // Update path edges update_line_data(s, plan_position, scene.model_ui ? path_width : 0, 1.22, &scene.track_edge_vertices, max_idx, false); @@ -347,87 +347,87 @@ void ui_update_params(UIState *s) { void ui_update_frogpilot_params(UIState *s) { UIScene &scene = s->scene; - scene.acceleration_path = scene.frogpilot_toggles.value("acceleration_path").toBool(); - scene.adjacent_path = scene.frogpilot_toggles.value("adjacent_paths").toBool(); - scene.adjacent_path_metrics = scene.frogpilot_toggles.value("adjacent_path_metrics").toBool(); - scene.aol_status_bar = scene.frogpilot_toggles.value("always_on_lateral_status_bar").toBool(); - scene.big_map = scene.frogpilot_toggles.value("big_map").toBool(); - scene.blind_spot_path = scene.frogpilot_toggles.value("blind_spot_path").toBool(); + scene.acceleration_path = static_cast(scene.frogpilot_toggles.value("acceleration_path").toBool()); + scene.adjacent_path = static_cast(scene.frogpilot_toggles.value("adjacent_paths").toBool()); + scene.adjacent_path_metrics = static_cast(scene.frogpilot_toggles.value("adjacent_path_metrics").toBool()); + scene.aol_status_bar = static_cast(scene.frogpilot_toggles.value("always_on_lateral_status_bar").toBool()); + scene.big_map = static_cast(scene.frogpilot_toggles.value("big_map").toBool()); + scene.blind_spot_path = static_cast(scene.frogpilot_toggles.value("blind_spot_path").toBool()); scene.camera_view = scene.frogpilot_toggles.value("camera_view").toDouble(); - scene.cem_status_bar = scene.frogpilot_toggles.value("conditional_status_bar").toBool(); - scene.compass = scene.frogpilot_toggles.value("compass").toBool(); - scene.conditional_experimental = scene.frogpilot_toggles.value("conditional_experimental_mode").toBool(); + scene.cem_status_bar = static_cast(scene.frogpilot_toggles.value("conditional_status_bar").toBool()); + scene.compass = static_cast(scene.frogpilot_toggles.value("compass").toBool()); + scene.conditional_experimental = static_cast(scene.frogpilot_toggles.value("conditional_experimental_mode").toBool()); scene.conditional_limit = scene.frogpilot_toggles.value("conditional_limit").toDouble(); scene.conditional_limit_lead = scene.frogpilot_toggles.value("conditional_limit_lead").toDouble(); - scene.cpu_metrics = scene.frogpilot_toggles.value("cpu_metrics").toBool(); - scene.disable_curve_speed_smoothing = scene.frogpilot_toggles.value("disable_curve_speed_smoothing").toBool(); - scene.driver_camera_in_reverse = scene.frogpilot_toggles.value("driver_camera_in_reverse").toBool(); - scene.dynamic_path_width = scene.frogpilot_toggles.value("dynamic_path_width").toBool(); - scene.dynamic_pedals_on_ui = scene.frogpilot_toggles.value("dynamic_pedals_on_ui").toBool(); - scene.experimental_mode_via_tap = scene.frogpilot_toggles.value("experimental_mode_via_tap").toBool(); - scene.fahrenheit = scene.frogpilot_toggles.value("fahrenheit").toBool(); - scene.full_map = scene.frogpilot_toggles.value("full_map").toBool(); - scene.gpu_metrics = scene.frogpilot_toggles.value("gpu_metrics").toBool(); - scene.hide_alerts = scene.frogpilot_toggles.value("hide_alerts").toBool(); - scene.hide_lead_marker = scene.frogpilot_toggles.value("hide_lead_marker").toBool(); - scene.hide_map_icon = scene.frogpilot_toggles.value("hide_map_icon").toBool(); - scene.hide_max_speed = scene.frogpilot_toggles.value("hide_max_speed").toBool(); - scene.hide_speed = scene.frogpilot_toggles.value("hide_speed").toBool(); - scene.ip_metrics = scene.frogpilot_toggles.value("ip_metrics").toBool(); - scene.jerk_metrics = scene.frogpilot_toggles.value("jerk_metrics").toBool(); - scene.lateral_tuning_metrics = scene.has_auto_tune && scene.frogpilot_toggles.value("lateral_tuning_metrics").toBool(); + scene.cpu_metrics = static_cast(scene.frogpilot_toggles.value("cpu_metrics").toBool()); + scene.disable_curve_speed_smoothing = static_cast(scene.frogpilot_toggles.value("disable_curve_speed_smoothing").toBool()); + scene.driver_camera_in_reverse = static_cast(scene.frogpilot_toggles.value("driver_camera_in_reverse").toBool()); + scene.dynamic_path_width = static_cast(scene.frogpilot_toggles.value("dynamic_path_width").toBool()); + scene.dynamic_pedals_on_ui = static_cast(scene.frogpilot_toggles.value("dynamic_pedals_on_ui").toBool()); + scene.experimental_mode_via_tap = static_cast(scene.frogpilot_toggles.value("experimental_mode_via_tap").toBool()); + scene.fahrenheit = static_cast(scene.frogpilot_toggles.value("fahrenheit").toBool()); + scene.full_map = static_cast(scene.frogpilot_toggles.value("full_map").toBool()); + scene.gpu_metrics = static_cast(scene.frogpilot_toggles.value("gpu_metrics").toBool()); + scene.hide_alerts = static_cast(scene.frogpilot_toggles.value("hide_alerts").toBool()); + scene.hide_lead_marker = static_cast(scene.frogpilot_toggles.value("hide_lead_marker").toBool()); + scene.hide_map_icon = static_cast(scene.frogpilot_toggles.value("hide_map_icon").toBool()); + scene.hide_max_speed = static_cast(scene.frogpilot_toggles.value("hide_max_speed").toBool()); + scene.hide_speed = static_cast(scene.frogpilot_toggles.value("hide_speed").toBool()); + scene.ip_metrics = static_cast(scene.frogpilot_toggles.value("ip_metrics").toBool()); + scene.jerk_metrics = static_cast(scene.frogpilot_toggles.value("jerk_metrics").toBool()); + scene.lateral_tuning_metrics = static_cast(scene.has_auto_tune && scene.frogpilot_toggles.value("lateral_tuning_metrics").toBool()); scene.lane_detection_width = scene.frogpilot_toggles.value("lane_detection_width").toDouble(); scene.lane_line_width = scene.frogpilot_toggles.value("lane_line_width").toDouble(); scene.lane_lines_color = loadThemeColors("LaneLines"); scene.lead_detection_probability = scene.frogpilot_toggles.value("lead_detection_probability").toDouble(); scene.lead_marker_color = loadThemeColors("LeadMarker"); - scene.lead_metrics = scene.frogpilot_toggles.value("lead_metrics").toBool(); + scene.lead_metrics = static_cast(scene.frogpilot_toggles.value("lead_metrics").toBool()); scene.map_style = scene.frogpilot_toggles.value("map_style").toDouble(); - scene.memory_metrics = scene.frogpilot_toggles.value("memory_metrics").toBool(); + scene.memory_metrics = static_cast(scene.frogpilot_toggles.value("memory_metrics").toBool()); scene.minimum_lane_change_speed = scene.frogpilot_toggles.value("minimum_lane_change_speed").toDouble(); - scene.model_randomizer = scene.frogpilot_toggles.value("model_randomizer").toBool(); - scene.model_ui = scene.frogpilot_toggles.value("model_ui").toBool(); - scene.numerical_temp = scene.frogpilot_toggles.value("numerical_temp").toBool(); - scene.onroad_distance_button = scene.frogpilot_toggles.value("onroad_distance_button").toBool(); + scene.model_randomizer = static_cast(scene.frogpilot_toggles.value("model_randomizer").toBool()); + scene.model_ui = static_cast(scene.frogpilot_toggles.value("model_ui").toBool()); + scene.numerical_temp = static_cast(scene.frogpilot_toggles.value("numerical_temp").toBool()); + scene.onroad_distance_button = static_cast(scene.frogpilot_toggles.value("onroad_distance_button").toBool()); scene.path_color = loadThemeColors("Path"); scene.path_edge_width = scene.frogpilot_toggles.value("path_edge_width").toDouble(); scene.path_edges_color = loadThemeColors("PathEdge"); scene.path_width = scene.frogpilot_toggles.value("path_width").toDouble(); - scene.pedals_on_ui = scene.frogpilot_toggles.value("pedals_on_ui").toBool(); - scene.radarless_model = scene.frogpilot_toggles.value("radarless_model").toBool(); - scene.random_events = scene.frogpilot_toggles.value("random_events").toBool(); + scene.pedals_on_ui = static_cast(scene.frogpilot_toggles.value("pedals_on_ui").toBool()); + scene.radarless_model = static_cast(scene.frogpilot_toggles.value("radarless_model").toBool()); + scene.random_events = static_cast(scene.frogpilot_toggles.value("random_events").toBool()); scene.road_edge_width = scene.frogpilot_toggles.value("road_edge_width").toDouble(); - scene.road_name_ui = scene.frogpilot_toggles.value("road_name_ui").toBool(); - scene.rotating_wheel = scene.frogpilot_toggles.value("rotating_wheel").toBool(); + scene.road_name_ui = static_cast(scene.frogpilot_toggles.value("road_name_ui").toBool()); + scene.rotating_wheel = static_cast(scene.frogpilot_toggles.value("rotating_wheel").toBool()); scene.screen_brightness = scene.frogpilot_toggles.value("screen_brightness").toDouble(); scene.screen_brightness_onroad = scene.frogpilot_toggles.value("screen_brightness_onroad").toDouble(); - scene.screen_recorder = scene.frogpilot_toggles.value("screen_recorder").toBool(); + scene.screen_recorder = static_cast(scene.frogpilot_toggles.value("screen_recorder").toBool()); scene.screen_timeout = scene.frogpilot_toggles.value("screen_timeout").toDouble(); scene.screen_timeout_onroad = scene.frogpilot_toggles.value("screen_timeout_onroad").toDouble(); - scene.show_blind_spot = scene.frogpilot_toggles.value("blind_spot_metrics").toBool(); - scene.show_fps = scene.frogpilot_toggles.value("show_fps").toBool(); - scene.show_speed_limit_offset = scene.frogpilot_toggles.value("show_speed_limit_offset").toBool(); - scene.show_stopping_point = scene.frogpilot_toggles.value("show_stopping_point").toBool(); - scene.show_stopping_point_metrics = scene.frogpilot_toggles.value("show_stopping_point_metrics").toBool(); + scene.show_blind_spot = static_cast(scene.frogpilot_toggles.value("blind_spot_metrics").toBool()); + scene.show_fps = static_cast(scene.frogpilot_toggles.value("show_fps").toBool()); + scene.show_speed_limit_offset = static_cast(scene.frogpilot_toggles.value("show_speed_limit_offset").toBool()); + scene.show_stopping_point = static_cast(scene.frogpilot_toggles.value("show_stopping_point").toBool()); + scene.show_stopping_point_metrics = static_cast(scene.frogpilot_toggles.value("show_stopping_point_metrics").toBool()); scene.sidebar_color1 = loadThemeColors("Sidebar1"); scene.sidebar_color2 = loadThemeColors("Sidebar2"); scene.sidebar_color3 = loadThemeColors("Sidebar3"); - scene.sidebar_metrics = scene.frogpilot_toggles.value("sidebar_metrics").toBool(); - scene.signal_metrics = scene.frogpilot_toggles.value("signal_metrics").toBool(); - scene.speed_limit_controller = scene.frogpilot_toggles.value("speed_limit_controller").toBool(); - scene.speed_limit_vienna = scene.frogpilot_toggles.value("speed_limit_vienna").toBool(); - scene.standby_mode = scene.frogpilot_toggles.value("standby_mode").toBool(); - scene.static_pedals_on_ui = scene.frogpilot_toggles.value("static_pedals_on_ui").toBool(); - scene.steering_metrics = scene.frogpilot_toggles.value("steering_metrics").toBool(); - scene.stopped_timer = scene.frogpilot_toggles.value("stopped_timer").toBool(); - scene.storage_left_metrics = scene.frogpilot_toggles.value("storage_left_metrics").toBool(); - scene.storage_used_metrics = scene.frogpilot_toggles.value("storage_used_metrics").toBool(); + scene.sidebar_metrics = static_cast(scene.frogpilot_toggles.value("sidebar_metrics").toBool()); + scene.signal_metrics = static_cast(scene.frogpilot_toggles.value("signal_metrics").toBool()); + scene.speed_limit_controller = static_cast(scene.frogpilot_toggles.value("speed_limit_controller").toBool()); + scene.speed_limit_vienna = static_cast(scene.frogpilot_toggles.value("speed_limit_vienna").toBool()); + scene.standby_mode = static_cast(scene.frogpilot_toggles.value("standby_mode").toBool()); + scene.static_pedals_on_ui = static_cast(scene.frogpilot_toggles.value("static_pedals_on_ui").toBool()); + scene.steering_metrics = static_cast(scene.frogpilot_toggles.value("steering_metrics").toBool()); + scene.stopped_timer = static_cast(scene.frogpilot_toggles.value("stopped_timer").toBool()); + scene.storage_left_metrics = static_cast(scene.frogpilot_toggles.value("storage_left_metrics").toBool()); + scene.storage_used_metrics = static_cast(scene.frogpilot_toggles.value("storage_used_metrics").toBool()); scene.tethering_config = scene.frogpilot_toggles.value("tethering_config").toDouble(); - scene.unlimited_road_ui_length = scene.frogpilot_toggles.value("unlimited_road_ui_length").toBool(); - scene.use_si_metrics = scene.frogpilot_toggles.value("use_si_metrics").toBool(); - scene.use_stock_colors = scene.frogpilot_toggles.value("color_scheme").toString() == "stock"; - scene.use_stock_wheel = scene.frogpilot_toggles.value("wheel_image").toString() == "stock"; - scene.use_wheel_speed = scene.frogpilot_toggles.value("use_wheel_speed").toBool(); + scene.unlimited_road_ui_length = static_cast(scene.frogpilot_toggles.value("unlimited_road_ui_length").toBool()); + scene.use_si_metrics = static_cast(scene.frogpilot_toggles.value("use_si_metrics").toBool()); + scene.use_stock_colors = static_cast(scene.frogpilot_toggles.value("color_scheme").toString() == "stock"); + scene.use_stock_wheel = static_cast(scene.frogpilot_toggles.value("wheel_image").toString() == "stock"); + scene.use_wheel_speed = static_cast(scene.frogpilot_toggles.value("use_wheel_speed").toBool()); if (scene.tethering_config == 1) { WifiManager(s).setTetheringEnabled(true); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 2de6fefd346296..9e1d55ca60835d 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -361,7 +361,7 @@ void update_model(UIState *s, const cereal::ModelDataV2::Reader &model, const cereal::UiPlan::Reader &plan); void update_dmonitoring(UIState *s, const cereal::DriverStateV2::Reader &driverstate, float dm_fade_state, bool is_rhd); -void update_leads(UIState *s, const cereal::ModelDataV2::Reader &model_data); +void update_leads(UIState *s, const cereal::RadarState::Reader &radar_state, const cereal::XYZTData::Reader &line); void update_line_data(const UIState *s, const cereal::XYZTData::Reader &line, float y_off, float z_off, QPolygonF *pvd, int max_idx, bool allow_invert); diff --git a/system/camerad/cameras/camera_qcom2.cc b/system/camerad/cameras/camera_qcom2.cc index 67215aea993226..096e288cc2e4a2 100644 --- a/system/camerad/cameras/camera_qcom2.cc +++ b/system/camerad/cameras/camera_qcom2.cc @@ -958,12 +958,6 @@ void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) { } void cameras_run(MultiCameraState *s) { - // FrogPilot variables - Params paramsMemory{"/dev/shm/params"}; - const std::chrono::seconds fpsUpdateInterval(1); - std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now(); - int frameCount = 0; - LOG("-- Starting threads"); std::vector threads; if (s->driver_cam.enabled) threads.push_back(start_process_thread(s, &s->driver_cam, process_driver_camera)); @@ -1006,17 +1000,6 @@ void cameras_run(MultiCameraState *s) { // for debugging //do_exit = do_exit || event_data->u.frame_msg.frame_id > (30*20); - frameCount++; - - std::chrono::steady_clock::time_point currentTime = std::chrono::steady_clock::now(); - if (currentTime - startTime >= fpsUpdateInterval) { - auto duration = std::chrono::duration_cast(currentTime - startTime).count(); - double fps = frameCount / duration; - paramsMemory.putIntNonBlocking("CameraFPS", fps / 3); - frameCount = 0; - startTime = currentTime; - } - if (event_data->session_hdl == s->road_cam.session_handle) { s->road_cam.handle_camera_event(event_data); } else if (event_data->session_hdl == s->wide_road_cam.session_handle) { diff --git a/system/manager/manager.py b/system/manager/manager.py index 75aea0e0f95085..820240dbde373a 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -32,8 +32,6 @@ def manager_init() -> None: build_metadata = get_build_metadata() - setup_frogpilot(build_metadata) - params = Params() setup_frogpilot(build_metadata, params) params_storage = Params("/persist/params") @@ -176,8 +174,8 @@ def manager_thread() -> None: started_prev = False # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(True) - classic_model = frogpilot_toggles.classic_model + frogpilot_toggles = get_frogpilot_toggles() + classic_model = getattr(frogpilot_toggles, 'classic_model', False) error_log = os.path.join(sentry.CRASHES_DIR, 'error.txt') if os.path.isfile(error_log):