diff --git a/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json index 3be299090..54eff578a 100644 --- a/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json +++ b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json @@ -235,6 +235,14 @@ "step": 1.0, "parent_key": "QOLLateral" }, + { + "key": "PauseLateralOnSignal", + "label": "Turn Signal Only", + "description": "Only pause steering when the turn signal is active.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "QOLLateral" + }, { "key": "LateralResumeDelay", "label": "Lateral Resume Delay", @@ -276,6 +284,99 @@ "ui_type": "toggle", "parent_key": "AdvancedLongitudinalTune" }, + { + "key": "CustomAccelProfile", + "label": "Custom Accel Profile", + "description": "Replace the built-in acceleration profile with your own per-speed max-acceleration values. Breakpoint speeds stay fixed, and the starting defaults mirror the currently selected acceleration profile plus EV or Truck tuning.", + "data_type": "bool", + "ui_type": "toggle", + "is_parent_toggle": true, + "parent_key": "AdvancedLongitudinalTune" + }, + { + "key": "CustomAccelProfile0MPH", + "label": "0 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 0 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, + { + "key": "CustomAccelProfile11MPH", + "label": "11 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 11 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, + { + "key": "CustomAccelProfile22MPH", + "label": "22 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 22 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, + { + "key": "CustomAccelProfile34MPH", + "label": "34 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 34 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, + { + "key": "CustomAccelProfile45MPH", + "label": "45 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 45 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, + { + "key": "CustomAccelProfile56MPH", + "label": "56 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 56 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, + { + "key": "CustomAccelProfile89MPH", + "label": "89 mph", + "description": "Max acceleration in m/s\u00b2 at the fixed 89 mph breakpoint.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.0, + "max": 6.0, + "step": 0.01, + "precision": 2, + "parent_key": "CustomAccelProfile" + }, { "key": "LongitudinalActuatorDelay", "label": "Actuator Delay", @@ -467,71 +568,6 @@ "ui_type": "toggle", "parent_key": "ConditionalExperimental" }, - { - "key": "ConditionalChill", - "label": "Conditional Chill Mode", - "description": "Keep \"Experimental Mode\" on by default, but temporarily switch to \"Chill Mode\" in simple cruising scenes where speed holding is usually better.", - "data_type": "bool", - "ui_type": "toggle", - "is_parent_toggle": true - }, - { - "key": "PersistChillState", - "label": "Persist Chill State", - "description": "Keep your manual Conditional Chill override through reboots until you manually clear it.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill" - }, - { - "key": "CCMSpeed", - "label": "Above", - "description": "Switch to \"Chill Mode\" on open roads above this speed when no lead is detected and the car is still below the set speed.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalChill" - }, - { - "key": "CCMSpeedLead", - "label": "Above (With Lead)", - "description": "Switch to \"Chill Mode\" when following a stable lead above this speed.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalChill" - }, - { - "key": "CCMLead", - "label": "Stable Lead Ahead", - "description": "Switch to \"Chill Mode\" when following a steady, well-tracked lead vehicle at cruising speeds.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill" - }, - { - "key": "CCMSetSpeedMargin", - "label": "Set Speed Margin", - "description": "How far below the set speed the car must be before open-road Conditional Chill can engage.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 15.0, - "step": 1.0, - "parent_key": "ConditionalChill" - }, - { - "key": "ShowCCMStatus", - "label": "Status Widget", - "description": "Show which condition triggered \"Chill Mode\" on the driving screen.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill" - }, { "key": "CurveSpeedController", "label": "Curve Speed Controller", @@ -565,6 +601,33 @@ "parent_key": "CustomPersonalities", "is_parent_toggle": true }, + { + "key": "AggressivePersonalityProfile", + "label": "Aggressive", + "description": "Customize the \"Aggressive\" personality profile. Designed for assertive driving with tighter gaps.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "CustomPersonalities", + "is_parent_toggle": true + }, + { + "key": "StandardPersonalityProfile", + "label": "Standard", + "description": "Customize the \"Standard\" personality profile. Designed for balanced driving with moderate gaps.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "CustomPersonalities", + "is_parent_toggle": true + }, + { + "key": "RelaxedPersonalityProfile", + "label": "Relaxed", + "description": "Customize the \"Relaxed\" personality profile. Designed for smoother, more comfortable driving with larger gaps.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "CustomPersonalities", + "is_parent_toggle": true + }, { "key": "TrafficFollow", "label": "Following Distance", @@ -631,15 +694,6 @@ "step": 0.01, "parent_key": "TrafficPersonalityProfile" }, - { - "key": "AggressivePersonalityProfile", - "label": "Aggressive", - "description": "Customize the \"Aggressive\" personality profile. Designed for assertive driving with tighter gaps.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CustomPersonalities", - "is_parent_toggle": true - }, { "key": "AggressiveFollow", "label": "Following Distance", @@ -717,15 +771,6 @@ "step": 0.01, "parent_key": "AggressivePersonalityProfile" }, - { - "key": "StandardPersonalityProfile", - "label": "Standard", - "description": "Customize the \"Standard\" personality profile. Designed for balanced driving with moderate gaps.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CustomPersonalities", - "is_parent_toggle": true - }, { "key": "StandardFollow", "label": "Following Distance", @@ -803,15 +848,6 @@ "step": 0.01, "parent_key": "StandardPersonalityProfile" }, - { - "key": "RelaxedPersonalityProfile", - "label": "Relaxed", - "description": "Customize the \"Relaxed\" personality profile. Designed for smoother, more comfortable driving with larger gaps.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CustomPersonalities", - "is_parent_toggle": true - }, { "key": "RelaxedFollow", "label": "Following Distance", @@ -897,6 +933,54 @@ "ui_type": "toggle", "is_parent_toggle": true }, + { + "key": "AccelerationProfile", + "label": "Acceleration Profile", + "description": "How quickly openpilot speeds up. \"Eco\" is gentle and efficient, \"Sport\" is firmer and more responsive, and \"Sport+\" accelerates at the maximum rate allowed.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "Standard" + }, + { + "value": 1, + "label": "Eco" + }, + { + "value": 2, + "label": "Sport" + }, + { + "value": 3, + "label": "Sport+" + } + ], + "parent_key": "LongitudinalTune" + }, + { + "key": "DecelerationProfile", + "label": "Deceleration Profile", + "description": "How firmly openpilot slows down. \"Eco\" favors coasting, \"Sport\" applies stronger braking.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "Standard" + }, + { + "value": 1, + "label": "Eco" + }, + { + "value": 2, + "label": "Sport" + } + ], + "parent_key": "LongitudinalTune" + }, { "key": "HumanAcceleration", "label": "Human-Like Acceleration", @@ -1037,6 +1121,14 @@ "max": 99.0, "parent_key": "QOLLongitudinal" }, + { + "key": "RedneckCruise", + "label": "Redneck Cruise", + "description": "On supported Hyundai stock-long cars, use RES/SET button presses to match the cluster set speed to StarPilot's target.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "QOLLongitudinal" + }, { "key": "ReverseCruise", "label": "Reverse Cruise Increase", @@ -1053,6 +1145,14 @@ "ui_type": "toggle", "parent_key": "QOLLongitudinal" }, + { + "key": "LowVisibilityOffsets", + "label": "Low Visibility (fog)", + "description": "Customise settings for driving in low visibility situations", + "ui_type": "group", + "is_parent_toggle": true, + "parent_key": "WeatherPresets" + }, { "key": "IncreaseFollowingLowVisibility", "label": "Increase Following Distance by:", @@ -1092,6 +1192,14 @@ "max": 99.0, "step": 1.0 }, + { + "key": "RainOffsets", + "label": "Light/Medium Rain", + "description": "Customise settings for driving in light & medium rain", + "ui_type": "group", + "is_parent_toggle": true, + "parent_key": "WeatherPresets" + }, { "key": "IncreaseFollowingRain", "label": "Increase Following Distance by:", @@ -1131,6 +1239,14 @@ "max": 99.0, "step": 1.0 }, + { + "key": "RainStormOffsets", + "label": "Heavy Rain", + "description": "Customise settings for driving in heavy rain", + "ui_type": "group", + "is_parent_toggle": true, + "parent_key": "WeatherPresets" + }, { "key": "IncreaseFollowingRainStorm", "label": "Increase Following Distance by:", @@ -1170,6 +1286,14 @@ "max": 99.0, "step": 1.0 }, + { + "key": "SnowOffsets", + "label": "Snow", + "description": "Customise settings for driving in snow", + "ui_type": "group", + "is_parent_toggle": true, + "parent_key": "WeatherPresets" + }, { "key": "IncreaseFollowingSnow", "label": "Increase Following Distance by:", @@ -1217,6 +1341,38 @@ "ui_type": "toggle", "is_parent_toggle": true }, + { + "key": "VisionSpeedLimitDetection", + "label": "Vision Speed Limit Detection", + "description": "Use the road camera to detect speed limit signs for SLC and speed limit filling.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "SpeedLimitController" + }, + { + "key": "VisionSpeedLimitAutoBookmark", + "label": "Auto-Bookmark Vision Signs", + "description": "Automatically save confirmed vision-detected speed limit signs into the speed-limit debug session so they can be imported into the training set later.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "VisionSpeedLimitDetection" + }, + { + "key": "VisionSpeedLimitTrainingCollector", + "label": "Collect Extra Vision Training Samples", + "description": "Save lower-threshold vision sign candidates into the debug session for later training import without showing or applying them live. Leave this on if you want to help improve the model.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "VisionSpeedLimitDetection" + }, + { + "key": "VisionSpeedLimitAutoPreserveSegment", + "label": "Preserve Auto-Bookmarked Segments", + "description": "Also send a real bookmark for confirmed auto-bookmarks so loggerd preserves the route segment. Leave this off unless you specifically want the extra storage usage.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "VisionSpeedLimitAutoBookmark" + }, { "key": "SLCConfirmation", "label": "Confirm New Speed Limits", @@ -1225,6 +1381,22 @@ "ui_type": "toggle", "parent_key": "SpeedLimitController" }, + { + "key": "SLCConfirmationLower", + "label": "Confirm Lower Limits", + "description": "Require confirmation before applying a newly detected lower speed limit.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "SLCConfirmation" + }, + { + "key": "SLCConfirmationHigher", + "label": "Confirm Higher Limits", + "description": "Require confirmation before applying a newly detected higher speed limit.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "SLCConfirmation" + }, { "key": "SLCLookaheadHigher", "label": "Higher Limit Lookahead Time", @@ -1253,6 +1425,50 @@ "ui_type": "toggle", "parent_key": "SpeedLimitController" }, + { + "key": "SLCFallback", + "label": "Fallback Speed", + "description": "Choose the speed to use when no speed limit source is currently available.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "Set Speed" + }, + { + "value": 1, + "label": "Experimental Mode" + }, + { + "value": 2, + "label": "Previous Limit" + } + ], + "parent_key": "SpeedLimitController" + }, + { + "key": "SLCOverride", + "label": "Override Speed", + "description": "Choose how SLC behaves after you manually drive faster than the posted speed limit.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "None" + }, + { + "value": 1, + "label": "Set With Gas Pedal" + }, + { + "value": 2, + "label": "Max Set Speed" + } + ], + "parent_key": "SpeedLimitController" + }, { "key": "SLCMapboxFiller", "label": "Use Mapbox as Fallback", @@ -1262,11 +1478,59 @@ "parent_key": "SpeedLimitController" }, { - "key": "VisionSpeedLimitDetection", - "label": "Vision Speed Limit Detection", - "description": "Use the road camera to detect speed limit signs for SLC and speed limit filling.", - "data_type": "bool", - "ui_type": "toggle", + "key": "SLCPriority1", + "label": "Primary Speed Limit Source", + "description": "Choose the first speed-limit source to trust when more than one is available.", + "data_type": "string", + "ui_type": "dropdown", + "options": [ + { + "value": "Dashboard", + "label": "Dashboard" + }, + { + "value": "Map Data", + "label": "Map Data" + }, + { + "value": "Vision", + "label": "Vision" + }, + { + "value": "Highest", + "label": "Highest" + }, + { + "value": "Lowest", + "label": "Lowest" + } + ], + "parent_key": "SpeedLimitController" + }, + { + "key": "SLCPriority2", + "label": "Secondary Speed Limit Source", + "description": "Choose the backup speed-limit source when the primary one is unavailable.", + "data_type": "string", + "ui_type": "dropdown", + "options": [ + { + "value": "None", + "label": "None" + }, + { + "value": "Dashboard", + "label": "Dashboard" + }, + { + "value": "Map Data", + "label": "Map Data" + }, + { + "value": "Vision", + "label": "Vision" + } + ], "parent_key": "SpeedLimitController" }, { @@ -1355,6 +1619,71 @@ "ui_type": "toggle", "parent_key": "SpeedLimitController" }, + { + "key": "ConditionalChill", + "label": "Conditional Chill Mode", + "description": "Keep \"Experimental Mode\" on by default, but temporarily switch to \"Chill Mode\" in simple cruising scenes where speed holding is usually better.", + "data_type": "bool", + "ui_type": "toggle", + "is_parent_toggle": true + }, + { + "key": "PersistChillState", + "label": "Persist Chill State", + "description": "Keep your manual Conditional Chill override through reboots until you manually clear it.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "ConditionalChill" + }, + { + "key": "CCMSpeed", + "label": "Above", + "description": "Switch to \"Chill Mode\" on open roads above this speed when no lead is detected and the car is still below the set speed.", + "data_type": "int", + "ui_type": "numeric", + "min": 0.0, + "max": 99.0, + "step": 1.0, + "parent_key": "ConditionalChill" + }, + { + "key": "CCMSpeedLead", + "label": "Above (With Lead)", + "description": "Switch to \"Chill Mode\" when following a stable lead above this speed.", + "data_type": "int", + "ui_type": "numeric", + "min": 0.0, + "max": 99.0, + "step": 1.0, + "parent_key": "ConditionalChill" + }, + { + "key": "CCMLead", + "label": "Stable Lead Ahead", + "description": "Switch to \"Chill Mode\" when following a steady, well-tracked lead vehicle at cruising speeds.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "ConditionalChill" + }, + { + "key": "CCMSetSpeedMargin", + "label": "Set Speed Margin", + "description": "How far below the set speed the car must be before open-road Conditional Chill can engage.", + "data_type": "int", + "ui_type": "numeric", + "min": 0.0, + "max": 15.0, + "step": 1.0, + "parent_key": "ConditionalChill" + }, + { + "key": "ShowCCMStatus", + "label": "Status Widget", + "description": "Show which condition triggered \"Chill Mode\" on the driving screen.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "ConditionalChill" + }, { "key": "SLCAbbreviatedSources", "label": "Show Abbreviated Icon Sources", @@ -1417,38 +1746,6 @@ "ui_type": "toggle", "parent_key": "AdvancedCustomUI" }, - { - "key": "HideChangingLanesBanner", - "label": "Hide Changing Lanes Banner", - "description": "Hide the 'Changing Lanes' banner from the driving screen.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "AdvancedCustomUI" - }, - { - "key": "HideDistanceProfileBanner", - "label": "Hide Distance Profile Banner", - "description": "Hide the driving personality banner when changing distance profiles.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "AdvancedCustomUI" - }, - { - "key": "HideDMIcon", - "label": "Hide Driver Monitoring Icon", - "description": "Hide the driver monitoring icon from the driving screen.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "AdvancedCustomUI" - }, - { - "key": "HideTurningBanner", - "label": "Hide Turning Banner", - "description": "Hide the 'Turning Left/Right' banner from the driving screen.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "AdvancedCustomUI" - }, { "key": "HideSpeedLimit", "label": "Hide Speed Limits", @@ -1465,6 +1762,13 @@ "ui_type": "toggle", "parent_key": "AdvancedCustomUI" }, + { + "key": "HolidayThemes", + "label": "Holiday Themes", + "description": "Automatically apply seasonal theme assets during holiday windows. Turn this off to keep your normal theme year-round.", + "data_type": "bool", + "ui_type": "toggle" + }, { "key": "CustomUI", "label": "Driving Screen Widgets", @@ -1481,6 +1785,22 @@ "ui_type": "toggle", "parent_key": "CustomUI" }, + { + "key": "RainbowPath", + "label": "Rainbow Road", + "description": "Color the driving path like a rainbow road.\n\nOn the Python UIs this overrides acceleration and braking path coloring.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "CustomUI" + }, + { + "key": "ShowModeStatusBanner", + "label": "Show Mode Status Banner", + "description": "Show a popup banner when the Python driving UIs switch into chill, experimental, switchback, or override mode.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "CustomUI" + }, { "key": "AdjacentPath", "label": "Adjacent Lanes", @@ -1555,6 +1875,26 @@ "max": 24.0, "parent_key": "ModelUI" }, + { + "key": "LaneLinesColor", + "label": "Lane Line Color", + "description": "Set a custom lane-line color for the Python UIs.\n\nUse Stock to follow the default line color behavior.", + "data_type": "string", + "ui_type": "color", + "default_color": "#00FF00", + "parent_key": "ModelUI" + }, + { + "key": "BorderWidth", + "label": "Border Width", + "description": "Scale the driving-screen border thickness.\n\n100% matches the stock border width.", + "data_type": "float", + "ui_type": "numeric", + "min": 25.0, + "max": 250.0, + "step": 5.0, + "parent_key": "ModelUI" + }, { "key": "PathEdgeWidth", "label": "Path Edges Width", @@ -1565,6 +1905,15 @@ "max": 100.0, "parent_key": "ModelUI" }, + { + "key": "PathEdgesColor", + "label": "Path Edge Color", + "description": "Set a custom path-edge color for the Python UIs.\n\nUse Stock to follow the default line color behavior.", + "data_type": "string", + "ui_type": "color", + "default_color": "#00FF00", + "parent_key": "ModelUI" + }, { "key": "PathWidth", "label": "Path Width", @@ -1576,6 +1925,15 @@ "step": 0.1, "parent_key": "ModelUI" }, + { + "key": "PathColor", + "label": "Path Color", + "description": "Set a custom filled-path color for the Python UIs.\n\nUse Stock to follow the default path color behavior.", + "data_type": "string", + "ui_type": "color", + "default_color": "#30FF9C", + "parent_key": "ModelUI" + }, { "key": "RoadEdgesWidth", "label": "Road Edges Width", @@ -1634,6 +1992,32 @@ "ui_type": "toggle", "is_parent_toggle": true }, + { + "key": "CameraView", + "label": "Camera View", + "description": "Choose which camera feed the driving screen uses: Auto, Driver, Standard, or Wide.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "Auto" + }, + { + "value": 1, + "label": "Driver" + }, + { + "value": 2, + "label": "Standard" + }, + { + "value": 3, + "label": "Wide" + } + ], + "parent_key": "QOLVisuals" + }, { "key": "DriverCamera", "label": "Show Driver Camera When In Reverse", @@ -1650,6 +2034,46 @@ "ui_type": "toggle", "parent_key": "QOLVisuals" }, + { + "key": "SimpleMode", + "label": "Simple Mode", + "description": "Use a more stock-like presentation by hiding most branch-specific UI, theme, sound, and alert styling. This only changes presentation and does not change driving behavior.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "QOLVisuals" + }, + { + "key": "HideChangingLanesBanner", + "label": "Hide Changing Lanes Banner", + "description": "Hide the 'Changing Lanes' banner from the driving screen.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "AdvancedCustomUI" + }, + { + "key": "HideDistanceProfileBanner", + "label": "Hide Distance Profile Banner", + "description": "Hide the driving personality banner when changing distance profiles.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "AdvancedCustomUI" + }, + { + "key": "HideDMIcon", + "label": "Hide Driver Monitoring Icon", + "description": "Hide the driver monitoring icon from the driving screen.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "AdvancedCustomUI" + }, + { + "key": "HideTurningBanner", + "label": "Hide Turning Banner", + "description": "Hide the 'Turning Left/Right' banner from the driving screen.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "AdvancedCustomUI" + }, { "key": "DisableWideRoad", "label": "Disable Wide Road Camera", @@ -1671,6 +2095,17 @@ "ui_type": "toggle", "is_parent_toggle": true }, + { + "key": "SwitchbackModeCooldown", + "label": "Switchback Mode Cooldown", + "description": "Set the minimum time between repeated steering-limit and minimum-steer-speed alerts while \"Switchback Mode\" is active. Useful on winding roads where \"Turn Exceeds Steering Limit\" and \"Steer Unavailable Under\" can repeat frequently. Set to Off to disable the cooldown even when the mode is on.", + "data_type": "int", + "ui_type": "numeric", + "min": 0.0, + "max": 30.0, + "step": 1.0, + "parent_key": "AlertVolumeControl" + }, { "key": "BelowSteerSpeedVolume", "label": "Min Steer Speed Alert Volume", @@ -1851,6 +2286,107 @@ "data_type": "bool", "ui_type": "toggle" }, + { + "key": "DisableOpenpilotLongitudinal", + "label": "Disable openpilot Longitudinal", + "description": "Use the vehicle's stock longitudinal control instead of openpilot longitudinal control. This can stop openpilot from sending cruise-control acceleration and braking commands on supported vehicles.", + "data_type": "bool", + "ui_type": "toggle" + }, + { + "key": "NAPRadarEnabled", + "label": "Tesla Pre-AP Bosch Radar", + "description": "Use the stock Bosch radar path on pre-Autopilot Teslas.", + "data_type": "bool", + "ui_type": "toggle", + "is_parent_toggle": true + }, + { + "key": "NAPRadarBehindNosecone", + "label": "Radar Behind Nosecone", + "description": "Enable this if the Bosch radar is mounted behind the nosecone instead of being exposed.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "NAPRadarEnabled" + }, + { + "key": "NAPRadarOffset", + "label": "Radar Offset", + "description": "Adjust the radar position offset in meters if the radar alignment needs a small correction.", + "data_type": "float", + "ui_type": "numeric", + "min": -2.0, + "max": 2.0, + "step": 0.01, + "precision": 2, + "parent_key": "NAPRadarEnabled" + }, + { + "key": "NAPPedalEnabled", + "label": "Tesla Pre-AP comma Pedal Longitudinal", + "description": "Use a comma pedal interceptor for acceleration and regenerative braking on pre-Autopilot Teslas.", + "data_type": "bool", + "ui_type": "toggle", + "is_parent_toggle": true + }, + { + "key": "NAPPedalCanBus", + "label": "Pedal CAN Bus", + "description": "Select the CAN bus used by the Tesla pedal interceptor.", + "data_type": "int", + "ui_type": "dropdown", + "parent_key": "NAPPedalEnabled", + "options": [ + { + "value": 0, + "label": "CAN 0" + }, + { + "value": 2, + "label": "CAN 2" + } + ] + }, + { + "key": "NAPAdaptiveAccel", + "label": "Adaptive Acceleration Limit", + "description": "Reduce maximum acceleration as you close in on a lead vehicle when Tesla pedal-long is active.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "NAPPedalEnabled" + }, + { + "key": "NAPPedalCalibDone", + "label": "Pedal Calibration Complete", + "description": "Enable only after entering valid Tesla pedal calibration values. Pedal-long stays inactive until this is on.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "NAPPedalEnabled" + }, + { + "key": "NAPPedalCalibFactor", + "label": "Pedal Calibration Factor", + "description": "Scaling factor used to convert Tesla pedal interceptor output into the internal DI range.", + "data_type": "float", + "ui_type": "numeric", + "min": 0.01, + "max": 10.0, + "step": 0.01, + "precision": 2, + "parent_key": "NAPPedalEnabled" + }, + { + "key": "NAPPedalCalibZero", + "label": "Pedal Calibration Zero", + "description": "Zero point used to convert Tesla pedal interceptor output into the internal DI range.", + "data_type": "float", + "ui_type": "numeric", + "min": -50.0, + "max": 50.0, + "step": 0.01, + "precision": 2, + "parent_key": "NAPPedalEnabled" + }, { "key": "GMPedalLongitudinal", "label": "Use Pedal For Longitudinal", @@ -1880,16 +2416,16 @@ "ui_type": "toggle" }, { - "key": "RemapCancelToDistance", - "label": "Remap Cancel Button", - "description": "On pedal-interceptor Bolts, treat the steering-wheel CANCEL button as an extra mappable button.", + "key": "VoltSNG", + "label": "Stop-and-Go Hack", + "description": "Force stop-and-go on the 2017 Chevy Volt.", "data_type": "bool", "ui_type": "toggle" }, { - "key": "VoltSNG", - "label": "Stop-and-Go Hack", - "description": "Force stop-and-go on the 2017 Chevy Volt.", + "key": "GMAutoHold", + "label": "Volt Auto Hold", + "description": "Hold the car at a stop on supported non-CC-only Chevy Volts until the gas pedal is pressed.", "data_type": "bool", "ui_type": "toggle" }, @@ -1916,6 +2452,643 @@ "description": "Force stop-and-go on Lexus/Toyota vehicles without stock stop-and-go functionality.", "data_type": "bool", "ui_type": "toggle" + }, + { + "key": "RemapCancelToDistance", + "label": "Remap Cancel Button", + "description": "On pedal-interceptor Bolts, treat the steering-wheel CANCEL button as an extra mappable button.", + "data_type": "bool", + "ui_type": "toggle" + } + ] + }, + { + "name": "Wheel Controls", + "icon": "bi-controller", + "params": [ + { + "key": "RemapCancelToDistance", + "label": "Remap Cancel Button", + "description": "On pedal-interceptor Bolts, treat the steering-wheel CANCEL button as an extra mappable button.", + "data_type": "bool", + "ui_type": "toggle" + }, + { + "key": "NostalgiaMode", + "label": "Nostalgia Mode", + "description": "Use the left paddle to pause openpilot acceleration and braking while Always On Lateral stays active on supported Hyundai CAN-FD cars.", + "data_type": "bool", + "ui_type": "toggle" + }, + { + "key": "CancelButtonControl", + "label": "Cancel Button (Short Press)", + "description": "Action performed when the remapped \"Cancel\" button is pressed.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "DistanceButtonControl", + "label": "Distance Button (Short Press)", + "description": "Action performed when the \"Distance\" button is pressed.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "LongCancelButtonControl", + "label": "Cancel Button (Long Press)", + "description": "Action performed when the remapped \"Cancel\" button is pressed for more than 0.5 seconds.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "LongDistanceButtonControl", + "label": "Distance Button (Long Press)", + "description": "Action performed when the \"Distance\" button is pressed for more than 0.5 seconds.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "VeryLongCancelButtonControl", + "label": "Cancel Button (Extra Long Press)", + "description": "Action performed when the remapped \"Cancel\" button is pressed for more than 2.5 seconds.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "VeryLongDistanceButtonControl", + "label": "Distance Button (Extra Long Press)", + "description": "Action performed when the \"Distance\" button is pressed for more than 2.5 seconds.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "LKASButtonControl", + "label": "LKAS Button", + "description": "Action performed when the \"LKAS\" button is pressed.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + }, + { + "value": 9, + "label": "Toggle Always On Lateral" + } + ] + }, + { + "key": "MainCruiseButtonControl", + "label": "CC Main Button", + "description": "Action performed when the cruise control main button is pressed.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 9, + "label": "Toggle Always On Lateral" + }, + { + "value": 10, + "label": "Adopt Current Speed Limit" + } + ] + }, + { + "key": "ModeButtonControl", + "label": "Mode Button (Short Press)", + "description": "Action performed when the \"Mode\" button is pressed. Hyundai CAN-FD only.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "LongModeButtonControl", + "label": "Mode Button (Long Press)", + "description": "Action performed when the \"Mode\" button is pressed for more than 0.5 seconds. Hyundai CAN-FD only.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "VeryLongModeButtonControl", + "label": "Mode Button (Extra Long Press)", + "description": "Action performed when the \"Mode\" button is pressed for more than 2.5 seconds. Hyundai CAN-FD only.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "StarButtonControl", + "label": "Star Button (Short Press)", + "description": "Action performed when the \"Star\" button is pressed. Hyundai CAN-FD only.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "LongStarButtonControl", + "label": "Star Button (Long Press)", + "description": "Action performed when the \"Star\" button is pressed for more than 0.5 seconds. Hyundai CAN-FD only.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] + }, + { + "key": "VeryLongStarButtonControl", + "label": "Star Button (Extra Long Press)", + "description": "Action performed when the \"Star\" button is pressed for more than 2.5 seconds. Hyundai CAN-FD only.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "No Action" + }, + { + "value": 1, + "label": "Change Personality" + }, + { + "value": 2, + "label": "Force Coast" + }, + { + "value": 3, + "label": "Pause Steering" + }, + { + "value": 4, + "label": "Pause Accel/Brake" + }, + { + "value": 5, + "label": "Toggle Experimental" + }, + { + "value": 6, + "label": "Toggle Traffic" + }, + { + "value": 7, + "label": "Toggle Switchback" + }, + { + "value": 8, + "label": "Create Bookmark" + } + ] } ] }, @@ -1941,14 +3114,6 @@ "max": 33.0, "parent_key": "DeviceManagement" }, - { - "key": "DisableWideRoad", - "label": "Disable Wide Road Camera", - "description": "WARNING: Only use this if the wide camera is malfunctioning or for development purposes. This may cause instability!\n\nRequires a reboot to take effect.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "DeviceManagement" - }, { "key": "NoLogging", "label": "Disable Logging", @@ -1965,6 +3130,22 @@ "ui_type": "toggle", "parent_key": "DeviceManagement" }, + { + "key": "DisableOnroadUploads", + "label": "Disable Onroad Uploads", + "description": "When \"Disable Uploads\" is enabled, allow uploads only while parked (offroad).", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "NoUploads" + }, + { + "key": "AlwaysAllowUploads", + "label": "Always Allow Uploads", + "description": "Override upload blocks and always keep uploader enabled. Advanced use only.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "NoUploads" + }, { "key": "HigherBitrate", "label": "High-Quality Recording", @@ -1973,6 +3154,14 @@ "ui_type": "toggle", "parent_key": "DeviceManagement" }, + { + "key": "GsmMetered", + "label": "Cellular Metered", + "description": "Prevent large uploads on cellular. Turn this off to allow full/unfiltered uploads over mobile data.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "DeviceManagement" + }, { "key": "LowVoltageShutdown", "label": "Low-Voltage Cutoff", @@ -2063,6 +3252,14 @@ "data_type": "bool", "ui_type": "toggle", "parent_key": "ScreenManagement" + }, + { + "key": "DisableWideRoad", + "label": "Disable Wide Road Camera", + "description": "WARNING: Only use this if the wide camera is malfunctioning or for development purposes. This may cause instability!\n\nRequires a reboot to take effect.", + "data_type": "bool", + "ui_type": "toggle", + "parent_key": "DeviceManagement" } ] }, @@ -2113,5 +3310,25 @@ "options_endpoint": "/api/models/installed" } ] + }, + { + "name": "Developer", + "icon": "bi-exclamation-triangle", + "params": [ + { + "key": "DisableWideRoad", + "label": "Disable Wide Road Camera", + "description": "Only enable this if the wide camera is broken or for development!\n\nDisabling the wide camera may degrade driving performance and cause instability.\n\nRequires a reboot to take effect.", + "data_type": "bool", + "ui_type": "toggle" + }, + { + "key": "AllowImpossibleAcceleration", + "label": "Allow Impossible Acceleration", + "description": "WARNING: This suppresses openpilot's excessive longitudinal actuation diagnostic when measured acceleration looks impossible for the requested gas/brake command.\n\nLeave this OFF unless you are intentionally testing edge cases like shifting to neutral and understand that it can hide a real actuation problem.", + "data_type": "bool", + "ui_type": "toggle" + } + ] } ] \ No newline at end of file diff --git a/tools/StarPilot/generate_pond_layout.py b/tools/StarPilot/generate_pond_layout.py index 2b1b5a0c6..d9c39dc64 100755 --- a/tools/StarPilot/generate_pond_layout.py +++ b/tools/StarPilot/generate_pond_layout.py @@ -548,8 +548,55 @@ def parse_cpp_file(filename): return items + +def merge_layouts(existing_layout, generated_layout): + existing_sections = {section["name"]: section for section in existing_layout} + generated_sections = {section["name"]: section for section in generated_layout} + + merged_layout = [] + + for section in existing_layout: + name = section["name"] + generated = generated_sections.get(name) + if generated is None: + merged_layout.append(section) + continue + + existing_params = section.get("params", []) + generated_params = generated.get("params", []) + generated_by_key = {param["key"]: param for param in generated_params} + + merged_params = [] + seen_keys = set() + + for param in existing_params: + key = param["key"] + if key in generated_by_key: + merged_params.append(generated_by_key[key]) + else: + merged_params.append(param) + seen_keys.add(key) + + for param in generated_params: + key = param["key"] + if key not in seen_keys: + merged_params.append(param) + seen_keys.add(key) + + merged_section = dict(section) + merged_section["icon"] = generated.get("icon", section.get("icon")) + merged_section["params"] = merged_params + merged_layout.append(merged_section) + + existing_names = {section["name"] for section in existing_layout} + for section in generated_layout: + if section["name"] not in existing_names: + merged_layout.append(section) + + return merged_layout + def main(): - layout = [] + generated_layout = [] for cat in CATEGORIES: items = parse_cpp_file(cat["file"]) injected = INJECTED_SECTION_PARAMS.get(cat["name"], []) @@ -557,12 +604,17 @@ def main(): existing_keys = {item["key"] for item in items} items = [dict(item) for item in injected if item["key"] not in existing_keys] + items if items: - layout.append({ + generated_layout.append({ "name": cat["name"], "icon": cat["icon"], "params": items }) output_path = os.path.join(REPO_ROOT, "starpilot/system/the_pond/assets/components/tools/device_settings_layout.json") + layout = generated_layout + if os.path.exists(output_path): + with open(output_path, 'r', encoding='utf-8') as f: + existing_layout = json.load(f) + layout = merge_layouts(existing_layout, generated_layout) with open(output_path, 'w', encoding='utf-8') as f: json.dump(layout, f, indent=2)