carrot/selfdrive/frogpilot/controls/lib/frogpilot_variables.py

216 lines
16 KiB
Python
Raw Normal View History

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"
openpilot_longitudinal = False
pcm_cruise = False
else:
with car.CarParams.from_bytes(msg_bytes) as msg:
CP = msg
car_name = CP.carName
openpilot_longitudinal = CP.openpilotLongitudinalControl
pcm_cruise = CP.pcmCruise
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()