2024-05-24 02:41:19 -07:00
|
|
|
from types import SimpleNamespace
|
|
|
|
|
|
|
|
from cereal import car
|
|
|
|
from openpilot.common.conversions import Conversions as CV
|
|
|
|
from openpilot.common.params import Params
|
|
|
|
|
|
|
|
from openpilot.selfdrive.frogpilot.controls.lib.model_manager import RADARLESS_MODELS
|
|
|
|
|
2024-05-29 03:43:25 -07:00
|
|
|
CITY_SPEED_LIMIT = 25 # 55mph is typically the minimum speed for highways
|
|
|
|
CRUISING_SPEED = 5 # Roughly the speed cars go when not touching the gas while in drive
|
|
|
|
PROBABILITY = 0.6 # 60% chance of condition being true
|
|
|
|
THRESHOLD = 5 # Time threshold (0.25s)
|
2024-05-24 02:41:19 -07:00
|
|
|
|
|
|
|
|
|
|
|
class FrogPilotVariables:
|
|
|
|
def __init__(self):
|
|
|
|
self.frogpilot_toggles = SimpleNamespace()
|
|
|
|
|
|
|
|
self.params = Params()
|
|
|
|
self.params_memory = Params("/dev/shm/params")
|
|
|
|
|
|
|
|
self.update_frogpilot_params(False)
|
|
|
|
|
|
|
|
@property
|
|
|
|
def toggles(self):
|
|
|
|
return self.frogpilot_toggles
|
|
|
|
|
|
|
|
@property
|
|
|
|
def toggles_updated(self):
|
|
|
|
return self.params_memory.get_bool("FrogPilotTogglesUpdated")
|
|
|
|
|
|
|
|
def update_frogpilot_params(self, started=True):
|
|
|
|
openpilot_installed = self.params.get_bool("HasAcceptedTerms")
|
|
|
|
|
|
|
|
toggles = self.frogpilot_toggles
|
|
|
|
|
|
|
|
key = "CarParams" if started else "CarParamsPersistent"
|
|
|
|
msg_bytes = self.params.get(key, block=started and openpilot_installed)
|
|
|
|
|
|
|
|
if msg_bytes is None:
|
|
|
|
car_name = "mock"
|
2024-05-25 02:39:44 -07:00
|
|
|
toggles.CSLC = False
|
2024-05-24 02:41:19 -07:00
|
|
|
openpilot_longitudinal = False
|
|
|
|
pcm_cruise = False
|
|
|
|
else:
|
|
|
|
with car.CarParams.from_bytes(msg_bytes) as msg:
|
|
|
|
CP = msg
|
|
|
|
car_name = CP.carName
|
2024-05-25 02:39:44 -07:00
|
|
|
toggles.CSLC = self.params.get_bool("CSLCEnabled")
|
2024-05-24 02:41:19 -07:00
|
|
|
openpilot_longitudinal = CP.openpilotLongitudinalControl
|
2024-05-25 02:39:44 -07:00
|
|
|
pcm_cruise = CP.pcmCruise and not toggles.CSLC
|
2024-05-24 02:41:19 -07:00
|
|
|
|
|
|
|
toggles.is_metric = self.params.get_bool("IsMetric")
|
|
|
|
distance_conversion = 1 if toggles.is_metric else CV.FOOT_TO_METER
|
|
|
|
speed_conversion = CV.KPH_TO_MS if toggles.is_metric else CV.MPH_TO_MS
|
|
|
|
|
|
|
|
if not started:
|
|
|
|
toggles.radarless_model = self.params.get("Model", block=openpilot_installed, encoding='utf-8') in RADARLESS_MODELS
|
|
|
|
|
|
|
|
toggles.alert_volume_control = self.params.get_bool("AlertVolumeControl")
|
|
|
|
toggles.disengage_volume = self.params.get_int("DisengageVolume") if toggles.alert_volume_control else 100
|
|
|
|
toggles.engage_volume = self.params.get_int("EngageVolume") if toggles.alert_volume_control else 100
|
|
|
|
toggles.prompt_volume = self.params.get_int("PromptVolume") if toggles.alert_volume_control else 100
|
|
|
|
toggles.promptDistracted_volume = self.params.get_int("PromptDistractedVolume") if toggles.alert_volume_control else 100
|
|
|
|
toggles.refuse_volume = self.params.get_int("RefuseVolume") if toggles.alert_volume_control else 100
|
|
|
|
toggles.warningSoft_volume = self.params.get_int("WarningSoftVolume") if toggles.alert_volume_control else 100
|
|
|
|
toggles.warningImmediate_volume = self.params.get_int("WarningImmediateVolume") if toggles.alert_volume_control else 100
|
|
|
|
|
|
|
|
always_on_lateral = self.params.get_bool("AlwaysOnLateral")
|
|
|
|
toggles.always_on_lateral_main = always_on_lateral and self.params.get_bool("AlwaysOnLateralMain")
|
|
|
|
toggles.always_on_lateral_pause_speed = self.params.get_int("PauseAOLOnBrake") if always_on_lateral else 0
|
|
|
|
|
|
|
|
toggles.automatic_updates = self.params.get_bool("AutomaticUpdates")
|
|
|
|
|
|
|
|
toggles.cluster_offset = self.params.get_float("ClusterOffset") if car_name == "toyota" else 1
|
|
|
|
|
|
|
|
toggles.conditional_experimental_mode = openpilot_longitudinal and self.params.get_bool("ConditionalExperimental")
|
|
|
|
toggles.conditional_curves = toggles.conditional_experimental_mode and self.params.get_bool("CECurves")
|
|
|
|
toggles.conditional_curves_lead = toggles.conditional_curves and self.params.get_bool("CECurvesLead")
|
|
|
|
toggles.conditional_limit = self.params.get_int("CESpeed") * speed_conversion if toggles.conditional_experimental_mode else 0
|
|
|
|
toggles.conditional_limit_lead = self.params.get_int("CESpeedLead") * speed_conversion if toggles.conditional_experimental_mode else 0
|
|
|
|
toggles.conditional_navigation = toggles.conditional_experimental_mode and self.params.get_bool("CENavigation")
|
|
|
|
toggles.conditional_navigation_intersections = toggles.conditional_navigation and self.params.get_bool("CENavigationIntersections")
|
|
|
|
toggles.conditional_navigation_lead = toggles.conditional_navigation and self.params.get_bool("CENavigationLead")
|
|
|
|
toggles.conditional_navigation_turns = toggles.conditional_navigation and self.params.get_bool("CENavigationTurns")
|
|
|
|
toggles.conditional_signal = toggles.conditional_experimental_mode and self.params.get_bool("CESignal")
|
|
|
|
toggles.conditional_slower_lead = toggles.conditional_experimental_mode and self.params.get_bool("CESlowerLead")
|
|
|
|
toggles.conditional_stop_lights = toggles.conditional_experimental_mode and self.params.get_bool("CEStopLights")
|
|
|
|
toggles.conditional_stop_lights_lead = toggles.conditional_stop_lights and self.params.get_bool("CEStopLightsLead")
|
|
|
|
|
|
|
|
custom_alerts = self.params.get_bool("CustomAlerts")
|
|
|
|
toggles.green_light_alert = custom_alerts and self.params.get_bool("GreenLightAlert")
|
|
|
|
toggles.lead_departing_alert = custom_alerts and self.params.get_bool("LeadDepartingAlert")
|
|
|
|
toggles.loud_blindspot_alert = custom_alerts and self.params.get_bool("LoudBlindspotAlert")
|
|
|
|
|
|
|
|
custom_themes = self.params.get_bool("CustomTheme")
|
|
|
|
holiday_themes = custom_themes and self.params.get_bool("HolidayThemes")
|
|
|
|
toggles.current_holiday_theme = self.params_memory.get_int("CurrentHolidayTheme") if holiday_themes else 0
|
|
|
|
toggles.custom_sounds = self.params.get_int("CustomSounds") if custom_themes else 0
|
|
|
|
toggles.goat_scream = toggles.current_holiday_theme == 0 and toggles.custom_sounds == 1 and self.params.get_bool("GoatScream")
|
|
|
|
toggles.random_events = custom_themes and self.params.get_bool("RandomEvents")
|
|
|
|
|
|
|
|
custom_ui = self.params.get_bool("CustomUI")
|
|
|
|
toggles.adjacent_lanes = custom_ui and self.params.get_bool("AdjacentPath")
|
|
|
|
toggles.blind_spot_path = custom_ui and self.params.get_bool("BlindSpotPath")
|
|
|
|
|
|
|
|
toggles.device_management = self.params.get_bool("DeviceManagement")
|
|
|
|
device_shutdown_setting = self.params.get_int("DeviceShutdown") if toggles.device_management else 33
|
|
|
|
toggles.device_shutdown_time = (device_shutdown_setting - 3) * 3600 if device_shutdown_setting >= 4 else device_shutdown_setting * (60 * 15)
|
|
|
|
toggles.increase_thermal_limits = toggles.device_management and self.params.get_bool("IncreaseThermalLimits")
|
|
|
|
toggles.low_voltage_shutdown = self.params.get_float("LowVoltageShutdown") if toggles.device_management else 11.8
|
|
|
|
toggles.offline_mode = toggles.device_management and self.params.get_bool("OfflineMode")
|
|
|
|
|
|
|
|
driving_personalities = openpilot_longitudinal and self.params.get_bool("DrivingPersonalities")
|
|
|
|
toggles.custom_personalities = driving_personalities and self.params.get_bool("CustomPersonalities")
|
|
|
|
aggressive_profile = toggles.custom_personalities and self.params.get_bool("AggressivePersonalityProfile")
|
|
|
|
toggles.aggressive_jerk_acceleration = self.params.get_int("AggressiveJerkAcceleration") / 100 if aggressive_profile else 0.5
|
|
|
|
toggles.aggressive_jerk_speed = self.params.get_int("AggressiveJerkSpeed") / 100 if aggressive_profile else 0.5
|
|
|
|
toggles.aggressive_follow = self.params.get_float("AggressiveFollow") if aggressive_profile else 1.25
|
|
|
|
standard_profile = toggles.custom_personalities and self.params.get_bool("StandardPersonalityProfile")
|
|
|
|
toggles.standard_jerk_acceleration = self.params.get_int("StandardJerkAcceleration") / 100 if standard_profile else 1.0
|
|
|
|
toggles.standard_jerk_speed = self.params.get_int("StandardJerkSpeed") / 100 if standard_profile else 1.0
|
|
|
|
toggles.standard_follow = self.params.get_float("StandardFollow") if standard_profile else 1.45
|
|
|
|
relaxed_profile = toggles.custom_personalities and self.params.get_bool("RelaxedPersonalityProfile")
|
|
|
|
toggles.relaxed_jerk_acceleration = self.params.get_int("RelaxedJerkAcceleration") / 100 if relaxed_profile else 1.0
|
|
|
|
toggles.relaxed_jerk_speed = self.params.get_int("RelaxedJerkSpeed") / 100 if relaxed_profile else 1.0
|
|
|
|
toggles.relaxed_follow = self.params.get_float("RelaxedFollow") if relaxed_profile else 1.75
|
|
|
|
traffic_profile = toggles.custom_personalities and self.params.get_bool("TrafficPersonalityProfile")
|
|
|
|
toggles.traffic_mode_jerk_acceleration = [self.params.get_int("TrafficJerkAcceleration") / 100.0, toggles.aggressive_jerk_acceleration] if traffic_profile else [0.5, 0.5]
|
|
|
|
toggles.traffic_mode_jerk_speed = [self.params.get_int("TrafficJerkSpeed") / 100.0, toggles.aggressive_jerk_speed] if traffic_profile else [0.5, 0.5]
|
|
|
|
toggles.traffic_mode_t_follow = [self.params.get_float("TrafficFollow"), toggles.aggressive_follow] if traffic_profile else [0.5, 1.0]
|
|
|
|
|
|
|
|
toggles.experimental_mode_via_press = openpilot_longitudinal and self.params.get_bool("ExperimentalModeActivation")
|
|
|
|
toggles.experimental_mode_via_distance = toggles.experimental_mode_via_press and self.params.get_bool("ExperimentalModeViaDistance")
|
|
|
|
toggles.experimental_mode_via_lkas = toggles.experimental_mode_via_press and self.params.get_bool("ExperimentalModeViaLKAS")
|
|
|
|
|
|
|
|
lane_change_customizations = self.params.get_bool("LaneChangeCustomizations")
|
|
|
|
toggles.lane_change_delay = self.params.get_int("LaneChangeTime") if lane_change_customizations else 0
|
|
|
|
toggles.lane_detection_width = self.params.get_int("LaneDetectionWidth") * distance_conversion / 10 if lane_change_customizations else 0
|
|
|
|
toggles.lane_detection = toggles.lane_detection_width != 0
|
|
|
|
toggles.minimum_lane_change_speed = self.params.get_int("MinimumLaneChangeSpeed") * speed_conversion if lane_change_customizations else 20 * CV.MPH_TO_MS
|
|
|
|
toggles.nudgeless = lane_change_customizations and self.params.get_bool("NudgelessLaneChange")
|
|
|
|
toggles.one_lane_change = lane_change_customizations and self.params.get_bool("OneLaneChange")
|
|
|
|
|
|
|
|
lateral_tune = self.params.get_bool("LateralTune")
|
|
|
|
toggles.force_auto_tune = lateral_tune and self.params.get_bool("ForceAutoTune")
|
|
|
|
stock_steer_ratio = self.params.get_float("SteerRatioStock")
|
|
|
|
toggles.steer_ratio = self.params.get_float("SteerRatio") if lateral_tune else stock_steer_ratio
|
|
|
|
toggles.use_custom_steer_ratio = toggles.steer_ratio != stock_steer_ratio
|
|
|
|
toggles.taco_tune = lateral_tune and self.params.get_bool("TacoTune")
|
|
|
|
toggles.turn_desires = lateral_tune and self.params.get_bool("TurnDesires")
|
|
|
|
|
|
|
|
toggles.long_pitch = openpilot_longitudinal and car_name == "gm" and self.params.get_bool("LongPitch")
|
|
|
|
|
|
|
|
longitudinal_tune = openpilot_longitudinal and self.params.get_bool("LongitudinalTune")
|
|
|
|
toggles.acceleration_profile = self.params.get_int("AccelerationProfile") if longitudinal_tune else 0
|
|
|
|
toggles.aggressive_acceleration = longitudinal_tune and self.params.get_bool("AggressiveAcceleration")
|
|
|
|
toggles.aggressive_acceleration_experimental = toggles.aggressive_acceleration and self.params.get_bool("AggressiveAccelerationExperimental")
|
|
|
|
toggles.deceleration_profile = self.params.get_int("DecelerationProfile") if longitudinal_tune else 0
|
|
|
|
toggles.increased_stopping_distance = self.params.get_int("StoppingDistance") * distance_conversion if longitudinal_tune else 0
|
|
|
|
toggles.lead_detection_threshold = self.params.get_int("LeadDetectionThreshold") / 100 if longitudinal_tune else 0.5
|
|
|
|
toggles.smoother_braking = longitudinal_tune and self.params.get_bool("SmoothBraking")
|
|
|
|
toggles.smoother_braking_far_lead = toggles.smoother_braking and self.params.get_bool("SmoothBrakingFarLead")
|
|
|
|
toggles.smoother_braking_jerk = toggles.smoother_braking and self.params.get_bool("SmoothBrakingJerk")
|
|
|
|
toggles.sport_plus = longitudinal_tune and toggles.acceleration_profile == 3
|
|
|
|
toggles.traffic_mode = longitudinal_tune and self.params.get_bool("TrafficMode")
|
|
|
|
|
|
|
|
toggles.model_selector = self.params.get_bool("ModelSelector")
|
|
|
|
|
|
|
|
quality_of_life = self.params.get_bool("QOLControls")
|
|
|
|
toggles.custom_cruise_increase = self.params.get_int("CustomCruise") if quality_of_life and not pcm_cruise else 1
|
|
|
|
toggles.custom_cruise_increase_long = self.params.get_int("CustomCruiseLong") if quality_of_life and not pcm_cruise else 5
|
|
|
|
map_gears = quality_of_life and self.params.get_bool("MapGears")
|
|
|
|
toggles.map_acceleration = map_gears and self.params.get_bool("MapAcceleration")
|
|
|
|
toggles.map_deceleration = map_gears and self.params.get_bool("MapDeceleration")
|
|
|
|
toggles.pause_lateral_below_speed = self.params.get_int("PauseLateralSpeed") * speed_conversion if quality_of_life else 0
|
|
|
|
toggles.pause_lateral_below_signal = quality_of_life and self.params.get_bool("PauseLateralOnSignal")
|
|
|
|
toggles.reverse_cruise_increase = quality_of_life and pcm_cruise and self.params.get_bool("ReverseCruise")
|
|
|
|
toggles.set_speed_offset = self.params.get_int("SetSpeedOffset") * (1 if toggles.is_metric else CV.MPH_TO_KPH) if quality_of_life and not pcm_cruise else 0
|
|
|
|
|
|
|
|
toggles.map_turn_speed_controller = openpilot_longitudinal and self.params.get_bool("MTSCEnabled")
|
|
|
|
toggles.mtsc_curvature_check = toggles.map_turn_speed_controller and self.params.get_bool("MTSCCurvatureCheck")
|
|
|
|
self.params_memory.put_float("MapTargetLatA", 2 * (self.params.get_int("MTSCAggressiveness") / 100))
|
|
|
|
|
|
|
|
toggles.sng_hack = openpilot_longitudinal and car_name == "toyota" and self.params.get_bool("SNGHack")
|
|
|
|
|
|
|
|
toggles.speed_limit_controller = openpilot_longitudinal and self.params.get_bool("SpeedLimitController")
|
|
|
|
toggles.force_mph_dashboard = toggles.speed_limit_controller and self.params.get_bool("ForceMPHDashboard")
|
|
|
|
toggles.map_speed_lookahead_higher = self.params.get_int("SLCLookaheadHigher") if toggles.speed_limit_controller else 0
|
|
|
|
toggles.map_speed_lookahead_lower = self.params.get_int("SLCLookaheadLower") if toggles.speed_limit_controller else 0
|
|
|
|
toggles.offset1 = self.params.get_int("Offset1") * speed_conversion if toggles.speed_limit_controller else 0
|
|
|
|
toggles.offset2 = self.params.get_int("Offset2") * speed_conversion if toggles.speed_limit_controller else 0
|
|
|
|
toggles.offset3 = self.params.get_int("Offset3") * speed_conversion if toggles.speed_limit_controller else 0
|
|
|
|
toggles.offset4 = self.params.get_int("Offset4") * speed_conversion if toggles.speed_limit_controller else 0
|
|
|
|
toggles.set_speed_limit = toggles.speed_limit_controller and self.params.get_bool("SetSpeedLimit")
|
|
|
|
toggles.speed_limit_alert = toggles.speed_limit_controller and self.params.get_bool("SpeedLimitChangedAlert")
|
|
|
|
toggles.speed_limit_confirmation = toggles.speed_limit_controller and self.params.get_bool("SLCConfirmation")
|
|
|
|
toggles.speed_limit_confirmation_lower = toggles.speed_limit_confirmation and self.params.get_bool("SLCConfirmationLower")
|
|
|
|
toggles.speed_limit_confirmation_higher = toggles.speed_limit_confirmation and self.params.get_bool("SLCConfirmationHigher")
|
|
|
|
toggles.speed_limit_controller_override = self.params.get_int("SLCOverride") if toggles.speed_limit_controller else 0
|
|
|
|
toggles.use_experimental_mode = toggles.speed_limit_controller and self.params.get_int("SLCFallback") == 1
|
|
|
|
toggles.use_previous_limit = toggles.speed_limit_controller and self.params.get_int("SLCFallback") == 2
|
|
|
|
toggles.speed_limit_priority1 = self.params.get("SLCPriority1", encoding='utf-8') if toggles.speed_limit_controller else None
|
|
|
|
toggles.speed_limit_priority2 = self.params.get("SLCPriority2", encoding='utf-8') if toggles.speed_limit_controller else None
|
|
|
|
toggles.speed_limit_priority3 = self.params.get("SLCPriority3", encoding='utf-8') if toggles.speed_limit_controller else None
|
|
|
|
toggles.speed_limit_priority_highest = toggles.speed_limit_priority1 == "Highest"
|
|
|
|
toggles.speed_limit_priority_lowest = toggles.speed_limit_priority1 == "Lowest"
|
|
|
|
|
|
|
|
toyota_doors = car_name == "toyota" and self.params.get_bool("ToyotaDoors")
|
|
|
|
toggles.lock_doors = toyota_doors and self.params.get_bool("LockDoors")
|
|
|
|
toggles.unlock_doors = toyota_doors and self.params.get_bool("UnlockDoors")
|
|
|
|
|
|
|
|
toggles.vision_turn_controller = openpilot_longitudinal and self.params.get_bool("VisionTurnControl")
|
|
|
|
toggles.curve_sensitivity = self.params.get_int("CurveSensitivity") / 100 if toggles.vision_turn_controller else 1
|
|
|
|
toggles.turn_aggressiveness = self.params.get_int("TurnAggressiveness") / 100 if toggles.vision_turn_controller else 1
|
|
|
|
|
|
|
|
FrogPilotVariables = FrogPilotVariables()
|