diff --git a/.github/update_date b/.github/update_date deleted file mode 100644 index c76e76d1f1..0000000000 --- a/.github/update_date +++ /dev/null @@ -1 +0,0 @@ -2025-04-26 diff --git a/.github/workflows/compile_frogpilot.yaml b/.github/workflows/compile_frogpilot.yaml index ac377e13a9..cdf197eac9 100644 --- a/.github/workflows/compile_frogpilot.yaml +++ b/.github/workflows/compile_frogpilot.yaml @@ -80,8 +80,8 @@ jobs: with: ref: ${{ needs.get_branch.outputs.branch }} sparse-checkout: | + frogpilot/ui/ selfdrive/controls/lib/alerts_offroad.json - selfdrive/frogpilot/ui/ selfdrive/ui/ selfdrive/ui/update_translations.py selfdrive/ui/translations/ diff --git a/cereal/custom.capnp b/cereal/custom.capnp index 9b9db861f4..2b8e73fa96 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -10,7 +10,13 @@ using Car = import "car.capnp"; # cereal, so use these if you want custom events in your fork. # you can rename the struct, but don't change the identifier -struct FrogPilotCarState @0x81c2f05a394cf4af { +struct FrogPilotCarParams @0x81c2f05a394cf4af { + fpFlags @0 :UInt32; + isHDA2 @1 :Bool; + openpilotLongitudinalControlDisabled @2 :Bool; +} + +struct FrogPilotCarState @0xaedffd8f31e7b55d { struct ButtonEvent { enum Type { lkas @0; @@ -31,56 +37,54 @@ struct FrogPilotCarState @0x81c2f05a394cf4af { pauseLateral @11 :Bool; pauseLongitudinal @12 :Bool; sportGear @13 :Bool; - trafficMode @14 :Bool; + trafficModeEnabled @14 :Bool; } -struct FrogPilotDeviceState @0xaedffd8f31e7b55d { +struct FrogPilotDeviceState @0xf35cc4560bbf6ec2 { freeSpace @0 :Int16; usedSpace @1 :Int16; } -struct FrogPilotNavigation @0xf35cc4560bbf6ec2 { +struct FrogPilotNavigation @0xda96579883444c35 { approachingIntersection @0 :Bool; approachingTurn @1 :Bool; navigationSpeedLimit @2 :Float32; } -struct FrogPilotPlan @0xda96579883444c35 { +struct FrogPilotPlan @0x80ae746ee2596b11 { accelerationJerk @0 :Float32; accelerationJerkStock @1 :Float32; dangerJerk @2 :Float32; desiredFollowDistance @3 :Int64; experimentalMode @4 :Bool; - forcingStop @5 :Bool; - forcingStopLength @6 :Float32; - frogpilotEvents @7 :List(Car.CarEvent); - lateralCheck @8 :Bool; - laneWidthLeft @9 :Float32; - laneWidthRight @10 :Float32; - maxAcceleration @11 :Float32; - minAcceleration @12 :Float32; - mtscSpeed @13 :Float32; - redLight @14 :Bool; - roadCurvature @15 :Float32; - slcMapSpeedLimit @16 :Float32; - slcOverridden @17 :Bool; - slcOverriddenSpeed @18 :Float32; - slcSpeedLimit @19 :Float32; - slcSpeedLimitOffset @20 :Float32; - slcSpeedLimitSource @21 :Text; - speedJerk @22 :Float32; - speedJerkStock @23 :Float32; - speedLimitChanged @24 :Bool; - tFollow @25 :Float32; - togglesUpdated @26 :Bool; - unconfirmedSlcSpeedLimit @27 :Float32; - upcomingSLCSpeedLimit @28 :Float32; - vCruise @29 :Float32; - vtscControllingCurve @30 :Bool; - vtscSpeed @31 :Float32; -} - -struct CustomReserved4 @0x80ae746ee2596b11 { + trackingLead @5 :Bool; + forcingStop @6 :Bool; + forcingStopLength @7 :Float32; + frogpilotEvents @8 :List(Car.CarEvent); + lateralCheck @9 :Bool; + laneWidthLeft @10 :Float32; + laneWidthRight @11 :Float32; + maxAcceleration @12 :Float32; + minAcceleration @13 :Float32; + mtscSpeed @14 :Float32; + redLight @15 :Bool; + roadCurvature @16 :Float32; + slcMapSpeedLimit @17 :Float32; + slcMapboxSpeedLimit @18 :Float32; + slcNextSpeedLimit @19 :Float32; + slcOverriddenSpeed @20 :Float32; + slcSpeedLimit @21 :Float32; + slcSpeedLimitOffset @22 :Float32; + slcSpeedLimitSource @23 :Text; + speedJerk @24 :Float32; + speedJerkStock @25 :Float32; + speedLimitChanged @26 :Bool; + tFollow @27 :Float32; + togglesUpdated @28 :Bool; + unconfirmedSlcSpeedLimit @29 :Float32; + vCruise @30 :Float32; + vtscControllingCurve @31 :Bool; + vtscSpeed @32 :Float32; } struct CustomReserved5 @0xa5cd762cd951a455 { diff --git a/cereal/log.capnp b/cereal/log.capnp index 12c0b34207..c06556e94e 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -638,6 +638,7 @@ struct RadarState @0x9a185389d6fdd05f { modelProb @13 :Float32; radar @14 :Bool; radarTrackId @15 :Int32 = -1; + farLead @16 :Bool; aLeadDEPRECATED @5 :Float32; } @@ -1048,6 +1049,8 @@ struct ModelDataV2 { struct Action { desiredCurvature @0 :Float32; + desiredAcceleration @1 :Float32; + shouldStop @2 :Bool; } } @@ -1267,6 +1270,38 @@ struct LiveLocationKalman { } } + +struct LivePose { + # More info on reference frames: + # https://github.com/commaai/openpilot/tree/master/common/transformations + orientationNED @0 :XYZMeasurement; + velocityDevice @1 :XYZMeasurement; + accelerationDevice @2 :XYZMeasurement; + angularVelocityDevice @3 :XYZMeasurement; + + inputsOK @4 :Bool = false; + posenetOK @5 :Bool = false; + sensorsOK @6 :Bool = false; + + filterState @7 :FilterState; + + struct XYZMeasurement { + x @0 :Float32; + y @1 :Float32; + z @2 :Float32; + xStd @3 :Float32; + yStd @4 :Float32; + zStd @5 :Float32; + valid @6 :Bool; + } + + struct FilterState { + value @0 : List(Float64); + std @1 : List(Float64); + valid @2 : Bool; + } +} + struct ProcLog { cpuTimes @0 :List(CPUTimes); mem @1 :Mem; @@ -2087,6 +2122,22 @@ struct LiveTorqueParametersData { useParams @12 :Bool; } +struct LiveDelayData { + lateralDelay @0 :Float32; + validBlocks @1 :Int32; + status @2 :Status; + + lateralDelayEstimate @3 :Float32; + lateralDelayEstimateStd @5 :Float32; + points @4 :List(Float32); + + enum Status { + unestimated @0; + estimated @1; + invalid @2; + } +} + struct LiveMapDataDEPRECATED { speedLimitValid @0 :Bool; speedLimit @1 :Float32; @@ -2303,12 +2354,14 @@ struct Event { gnssMeasurements @91 :GnssMeasurements; liveParameters @61 :LiveParametersData; liveTorqueParameters @94 :LiveTorqueParametersData; + liveDelay @130 : LiveDelayData; cameraOdometry @63 :CameraOdometry; thumbnail @66: Thumbnail; onroadEvents @68: List(Car.CarEvent); carParams @69: Car.CarParams; driverMonitoringState @71: DriverMonitoringState; liveLocationKalman @72 :LiveLocationKalman; + livePose @129 :LivePose; modelV2 @75 :ModelDataV2; drivingModelData @128 :DrivingModelData; driverStateV2 @92 :DriverStateV2; @@ -2365,11 +2418,11 @@ struct Event { customReservedRawData2 @126 :Data; # *********** Custom: reserved for forks *********** - frogpilotCarState @107 :Custom.FrogPilotCarState; - frogpilotDeviceState @108 :Custom.FrogPilotDeviceState; - frogpilotNavigation @109 :Custom.FrogPilotNavigation; - frogpilotPlan @110 :Custom.FrogPilotPlan; - customReserved4 @111 :Custom.CustomReserved4; + frogpilotCarParams @107 :Custom.FrogPilotCarParams; + frogpilotCarState @108 :Custom.FrogPilotCarState; + frogpilotDeviceState @109 :Custom.FrogPilotDeviceState; + frogpilotNavigation @110 :Custom.FrogPilotNavigation; + frogpilotPlan @111 :Custom.FrogPilotPlan; customReserved5 @112 :Custom.CustomReserved5; customReserved6 @113 :Custom.CustomReserved6; customReserved7 @114 :Custom.CustomReserved7; diff --git a/cereal/services.py b/cereal/services.py index fbd0b9db33..76dff67f61 100755 --- a/cereal/services.py +++ b/cereal/services.py @@ -34,6 +34,7 @@ _services: dict[str, tuple] = { "errorLogMessage": (True, 0., 1), "liveCalibration": (True, 4., 4), "liveTorqueParameters": (True, 4., 1), + "liveDelay": (True, 4., 1), "androidLog": (True, 0.), "carState": (True, 100., 10), "carControl": (True, 100., 10), @@ -47,7 +48,8 @@ _services: dict[str, tuple] = { "gnssMeasurements": (True, 10., 10), "clocks": (True, 0.1, 1), "ubloxRaw": (True, 20.), - "liveLocationKalman": (True, 20., 5), + "livePose": (True, 20., 4), + "liveLocationKalman": (True, 20.), "liveParameters": (True, 20., 5), "cameraOdometry": (True, 20., 5), "thumbnail": (True, 0.2, 1), @@ -92,6 +94,7 @@ _services: dict[str, tuple] = { "customReservedRawData2": (True, 0.), # FrogPilot + "frogpilotCarParams": (True, 0.02, 1), "frogpilotCarState": (True, 100., 10), "frogpilotDeviceState": (True, 2., 1), "frogpilotNavigation": (True, 1., 10), diff --git a/common/api/__init__.py b/common/api/__init__.py index f3a7d83842..d7df48460b 100644 --- a/common/api/__init__.py +++ b/common/api/__init__.py @@ -5,7 +5,10 @@ from datetime import datetime, timedelta from openpilot.system.hardware.hw import Paths from openpilot.system.version import get_version +from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server + API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') +KONIK_API_HOST = os.getenv('API_HOST', 'https://api.konik.ai') class Api: def __init__(self, dongle_id): @@ -43,4 +46,4 @@ def api_get(endpoint, method='GET', timeout=None, access_token=None, **params): headers['User-Agent'] = "openpilot-" + get_version() - return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params) + return requests.request(method, (KONIK_API_HOST if use_konik_server() else API_HOST) + "/" + endpoint, timeout=timeout, headers=headers, params=params) diff --git a/common/params.cc b/common/params.cc index 2c1b32c0aa..7ac0731a5d 100644 --- a/common/params.cc +++ b/common/params.cc @@ -161,6 +161,7 @@ std::unordered_map keys = { {"LastPowerDropDetected", CLEAR_ON_MANAGER_START}, {"LastUpdateException", CLEAR_ON_MANAGER_START}, {"LastUpdateTime", PERSISTENT}, + {"LiveDelay", PERSISTENT}, {"LiveParameters", PERSISTENT}, {"LiveTorqueParameters", PERSISTENT | DONT_LOG}, {"LongitudinalPersonality", PERSISTENT}, @@ -283,6 +284,16 @@ std::unordered_map keys = { {"CustomUI", PERSISTENT}, {"DebugMode", CLEAR_ON_OFFROAD_TRANSITION}, {"DecelerationProfile", PERSISTENT}, + {"DeveloperMetrics", PERSISTENT}, + {"DeveloperSidebar", PERSISTENT}, + {"DeveloperSidebarMetric1", PERSISTENT}, + {"DeveloperSidebarMetric2", PERSISTENT}, + {"DeveloperSidebarMetric3", PERSISTENT}, + {"DeveloperSidebarMetric4", PERSISTENT}, + {"DeveloperSidebarMetric5", PERSISTENT}, + {"DeveloperSidebarMetric6", PERSISTENT}, + {"DeveloperSidebarMetric7", PERSISTENT}, + {"DeveloperWidgets", PERSISTENT}, {"DeveloperUI", PERSISTENT}, {"DeviceManagement", PERSISTENT}, {"DeviceShutdown", PERSISTENT}, @@ -317,6 +328,7 @@ std::unordered_map keys = { {"ForceStandstill", PERSISTENT}, {"ForceStops", PERSISTENT}, {"FPSCounter", PERSISTENT}, + {"FrogPilotCarParamsPersistent", PERSISTENT}, {"FrogPilotDrives", PERSISTENT}, {"FrogPilotKilometers", PERSISTENT}, {"FrogPilotMinutes", PERSISTENT}, @@ -342,7 +354,8 @@ std::unordered_map keys = { {"IncreasedStoppedDistance", PERSISTENT}, {"IncreaseThermalLimits", PERSISTENT}, {"IssueReported", CLEAR_ON_MANAGER_START}, - {"JerkInfo", PERSISTENT}, + {"KonikDongleId", PERSISTENT}, + {"KonikMinutes", PERSISTENT}, {"LaneChangeCustomizations", PERSISTENT}, {"LaneChangeTime", PERSISTENT}, {"LaneDetectionWidth", PERSISTENT}, @@ -365,8 +378,10 @@ std::unordered_map keys = { {"ManualUpdateInitiated", CLEAR_ON_MANAGER_START}, {"MapAcceleration", PERSISTENT}, {"MapboxPublicKey", PERSISTENT}, + {"MapBoxRequests", PERSISTENT}, {"MapboxSecretKey", PERSISTENT}, {"MapDeceleration", PERSISTENT}, + {"MapdLogLevel", CLEAR_ON_MANAGER_START}, {"MapGears", PERSISTENT}, {"MapsSelected", PERSISTENT}, {"MapSpeedLimit", CLEAR_ON_MANAGER_START}, @@ -410,6 +425,7 @@ std::unordered_map keys = { {"OSMDownloadBounds", PERSISTENT}, {"OSMDownloadLocations", PERSISTENT}, {"OSMDownloadProgress", CLEAR_ON_MANAGER_START}, + {"OverpassRequests", PERSISTENT}, {"PathEdgeWidth", PERSISTENT}, {"PathWidth", PERSISTENT}, {"PauseAOLOnBrake", PERSISTENT}, @@ -473,6 +489,7 @@ std::unordered_map keys = { {"SLCFallback", PERSISTENT}, {"SLCLookaheadHigher", PERSISTENT}, {"SLCLookaheadLower", PERSISTENT}, + {"SLCMapboxFiller", PERSISTENT}, {"SLCOverride", PERSISTENT}, {"SLCPriority1", PERSISTENT}, {"SLCPriority2", PERSISTENT}, @@ -482,6 +499,9 @@ std::unordered_map keys = { {"SpeedLimitAccepted", CLEAR_ON_MANAGER_START}, {"SpeedLimitChangedAlert", PERSISTENT}, {"SpeedLimitController", PERSISTENT}, + {"SpeedLimitFiller", PERSISTENT}, + {"SpeedLimits", PERSISTENT}, + {"SpeedLimitsFiltered", PERSISTENT}, {"SpeedLimitSources", PERSISTENT}, {"StandardFollow", PERSISTENT}, {"StandardJerkAcceleration", PERSISTENT}, @@ -502,8 +522,10 @@ std::unordered_map keys = { {"SteerKPStock", PERSISTENT}, {"SteerRatio", PERSISTENT}, {"SteerRatioStock", PERSISTENT}, + {"StockDongleId", PERSISTENT}, {"StoppedTimer", PERSISTENT}, {"TacoTune", PERSISTENT}, + {"TacoTuneHacks", PERSISTENT}, {"TestAlert", CLEAR_ON_MANAGER_START}, {"TetheringEnabled", PERSISTENT}, {"ThemeDownloadProgress", CLEAR_ON_MANAGER_START}, @@ -515,7 +537,6 @@ std::unordered_map keys = { {"TrafficJerkSpeed", PERSISTENT}, {"TrafficJerkSpeedDecrease", PERSISTENT}, {"TrafficPersonalityProfile", PERSISTENT}, - {"TuningInfo", PERSISTENT}, {"TuningLevel", PERSISTENT}, {"TuningLevelConfirmed", PERSISTENT}, {"TurnAggressiveness", PERSISTENT}, @@ -523,7 +544,10 @@ std::unordered_map keys = { {"UnlimitedLength", PERSISTENT}, {"UnlockDoors", PERSISTENT}, {"Updated", PERSISTENT}, + {"UpdateSpeedLimits", CLEAR_ON_MANAGER_START}, + {"UpdateSpeedLimitsStatus", CLEAR_ON_MANAGER_START}, {"UpdateWheelImage", CLEAR_ON_MANAGER_START}, + {"UseKonikServer", PERSISTENT}, {"UseSI", PERSISTENT}, {"UseVienna", PERSISTENT}, {"VeryLongDistanceButtonControl", PERSISTENT}, diff --git a/selfdrive/frogpilot/assets/download_functions.py b/frogpilot/assets/download_functions.py similarity index 97% rename from selfdrive/frogpilot/assets/download_functions.py rename to frogpilot/assets/download_functions.py index 7bcf2e8a08..3d31ea8ed9 100644 --- a/selfdrive/frogpilot/assets/download_functions.py +++ b/frogpilot/assets/download_functions.py @@ -5,7 +5,7 @@ import tempfile from datetime import datetime from pathlib import Path -from openpilot.selfdrive.frogpilot.frogpilot_utilities import delete_file, is_url_pingable +from openpilot.frogpilot.common.frogpilot_utilities import delete_file, is_url_pingable GITHUB_URL = "https://raw.githubusercontent.com/FrogAi/FrogPilot-Resources" GITLAB_URL = "https://gitlab.com/FrogAi/FrogPilot-Resources/-/raw" diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/colors/colors.json b/frogpilot/assets/holiday_themes/april_fools/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/colors/colors.json rename to frogpilot/assets/holiday_themes/april_fools/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/icons/button_flag.png b/frogpilot/assets/holiday_themes/april_fools/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/icons/button_flag.png rename to frogpilot/assets/holiday_themes/april_fools/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/icons/button_home.gif b/frogpilot/assets/holiday_themes/april_fools/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/icons/button_home.gif rename to frogpilot/assets/holiday_themes/april_fools/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/icons/button_settings.png b/frogpilot/assets/holiday_themes/april_fools/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/icons/button_settings.png rename to frogpilot/assets/holiday_themes/april_fools/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/traditional_100 b/frogpilot/assets/holiday_themes/april_fools/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/traditional_100 rename to frogpilot/assets/holiday_themes/april_fools/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/sounds/disengage.wav b/frogpilot/assets/holiday_themes/april_fools/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/april_fools/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/sounds/engage.wav b/frogpilot/assets/holiday_themes/april_fools/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/sounds/engage.wav rename to frogpilot/assets/holiday_themes/april_fools/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/colors/colors.json b/frogpilot/assets/holiday_themes/christmas_week/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/colors/colors.json rename to frogpilot/assets/holiday_themes/christmas_week/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/christmas_week/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/christmas_week/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/icons/button_flag.png b/frogpilot/assets/holiday_themes/christmas_week/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/icons/button_flag.png rename to frogpilot/assets/holiday_themes/christmas_week/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/icons/button_home.png b/frogpilot/assets/holiday_themes/christmas_week/icons/button_home.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/icons/button_home.png rename to frogpilot/assets/holiday_themes/christmas_week/icons/button_home.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/icons/button_settings.png b/frogpilot/assets/holiday_themes/christmas_week/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/icons/button_settings.png rename to frogpilot/assets/holiday_themes/christmas_week/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/traditional_100 b/frogpilot/assets/holiday_themes/christmas_week/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/traditional_100 rename to frogpilot/assets/holiday_themes/christmas_week/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav b/frogpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/sounds/engage.wav b/frogpilot/assets/holiday_themes/christmas_week/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/sounds/engage.wav rename to frogpilot/assets/holiday_themes/christmas_week/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/sounds/startup.wav b/frogpilot/assets/holiday_themes/christmas_week/sounds/startup.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/sounds/startup.wav rename to frogpilot/assets/holiday_themes/christmas_week/sounds/startup.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json b/frogpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json rename to frogpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png new file mode 100644 index 0000000000..682afd43fd Binary files /dev/null and b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png differ diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png new file mode 100644 index 0000000000..d0cccd8d7d Binary files /dev/null and b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png differ diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png new file mode 100644 index 0000000000..68f6bd8e8f Binary files /dev/null and b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png differ diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png new file mode 100644 index 0000000000..cd6333e54a Binary files /dev/null and b/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif b/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_flag.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif rename to frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif b/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif new file mode 100644 index 0000000000..5c2d051a43 Binary files /dev/null and b/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_100 b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_100 rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav b/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav b/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav rename to frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav b/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav rename to frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/colors/colors.json b/frogpilot/assets/holiday_themes/easter_week/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/colors/colors.json rename to frogpilot/assets/holiday_themes/easter_week/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/icons/button_flag.gif b/frogpilot/assets/holiday_themes/easter_week/icons/button_flag.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/icons/button_flag.gif rename to frogpilot/assets/holiday_themes/easter_week/icons/button_flag.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/icons/button_home.gif b/frogpilot/assets/holiday_themes/easter_week/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/icons/button_home.gif rename to frogpilot/assets/holiday_themes/easter_week/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/icons/button_settings.png b/frogpilot/assets/holiday_themes/easter_week/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/icons/button_settings.png rename to frogpilot/assets/holiday_themes/easter_week/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/traditional_100 b/frogpilot/assets/holiday_themes/easter_week/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/traditional_100 rename to frogpilot/assets/holiday_themes/easter_week/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/sounds/disengage.wav b/frogpilot/assets/holiday_themes/easter_week/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/easter_week/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/sounds/engage.wav b/frogpilot/assets/holiday_themes/easter_week/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/sounds/engage.wav rename to frogpilot/assets/holiday_themes/easter_week/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/colors/colors.json b/frogpilot/assets/holiday_themes/fourth_of_july/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/colors/colors.json rename to frogpilot/assets/holiday_themes/fourth_of_july/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.png b/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.png rename to frogpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_home.png b/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_home.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_home.png rename to frogpilot/assets/holiday_themes/fourth_of_july/icons/button_home.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png b/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png rename to frogpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/traditional_100 b/frogpilot/assets/holiday_themes/fourth_of_july/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/traditional_100 rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav b/frogpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav b/frogpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav rename to frogpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/colors/colors.json b/frogpilot/assets/holiday_themes/halloween_week/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/colors/colors.json rename to frogpilot/assets/holiday_themes/halloween_week/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif b/frogpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif rename to frogpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/icons/button_home.gif b/frogpilot/assets/holiday_themes/halloween_week/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/icons/button_home.gif rename to frogpilot/assets/holiday_themes/halloween_week/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/icons/button_settings.png b/frogpilot/assets/holiday_themes/halloween_week/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/icons/button_settings.png rename to frogpilot/assets/holiday_themes/halloween_week/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/traditional_25 b/frogpilot/assets/holiday_themes/halloween_week/signals/traditional_25 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/traditional_25 rename to frogpilot/assets/holiday_themes/halloween_week/signals/traditional_25 diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal.gif b/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal.gif rename to frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav b/frogpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/sounds/engage.wav b/frogpilot/assets/holiday_themes/halloween_week/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/sounds/engage.wav rename to frogpilot/assets/holiday_themes/halloween_week/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/sounds/prompt_repeat.wav b/frogpilot/assets/holiday_themes/halloween_week/sounds/prompt_repeat.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/sounds/prompt_repeat.wav rename to frogpilot/assets/holiday_themes/halloween_week/sounds/prompt_repeat.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.gif b/frogpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.gif rename to frogpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/colors/colors.json b/frogpilot/assets/holiday_themes/may_the_fourth/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/colors/colors.json rename to frogpilot/assets/holiday_themes/may_the_fourth/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png new file mode 100644 index 0000000000..a16b77544a Binary files /dev/null and b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png differ diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png new file mode 100644 index 0000000000..f999b2165f Binary files /dev/null and b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png differ diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png new file mode 100644 index 0000000000..a792ab3846 Binary files /dev/null and b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png differ diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png new file mode 100644 index 0000000000..bd24a3a83a Binary files /dev/null and b/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif b/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_flag.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif rename to frogpilot/assets/holiday_themes/may_the_fourth/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif b/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif new file mode 100644 index 0000000000..d3ef30d8f4 Binary files /dev/null and b/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png b/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png rename to frogpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/traditional_100 b/frogpilot/assets/holiday_themes/may_the_fourth/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/traditional_100 rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav b/frogpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav b/frogpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav rename to frogpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav b/frogpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav rename to frogpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/colors/colors.json b/frogpilot/assets/holiday_themes/new_years/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/colors/colors.json rename to frogpilot/assets/holiday_themes/new_years/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/new_years/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/new_years/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/new_years/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/new_years/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/new_years/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/new_years/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/new_years/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/new_years/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/icons/button_flag.png b/frogpilot/assets/holiday_themes/new_years/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/icons/button_flag.png rename to frogpilot/assets/holiday_themes/new_years/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/icons/button_home.gif b/frogpilot/assets/holiday_themes/new_years/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/icons/button_home.gif rename to frogpilot/assets/holiday_themes/new_years/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/icons/button_settings.png b/frogpilot/assets/holiday_themes/new_years/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/icons/button_settings.png rename to frogpilot/assets/holiday_themes/new_years/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/traditional_100 b/frogpilot/assets/holiday_themes/new_years/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/traditional_100 rename to frogpilot/assets/holiday_themes/new_years/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/sounds/disengage.wav b/frogpilot/assets/holiday_themes/new_years/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/new_years/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/sounds/engage.wav b/frogpilot/assets/holiday_themes/new_years/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/sounds/engage.wav rename to frogpilot/assets/holiday_themes/new_years/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/colors/colors.json b/frogpilot/assets/holiday_themes/st_patricks/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/colors/colors.json rename to frogpilot/assets/holiday_themes/st_patricks/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/aggressive.png b/frogpilot/assets/holiday_themes/st_patricks/distance_icons/aggressive.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/aggressive.png rename to frogpilot/assets/holiday_themes/st_patricks/distance_icons/aggressive.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/relaxed.png b/frogpilot/assets/holiday_themes/st_patricks/distance_icons/relaxed.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/relaxed.png rename to frogpilot/assets/holiday_themes/st_patricks/distance_icons/relaxed.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/standard.png b/frogpilot/assets/holiday_themes/st_patricks/distance_icons/standard.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/standard.png rename to frogpilot/assets/holiday_themes/st_patricks/distance_icons/standard.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/traffic.png b/frogpilot/assets/holiday_themes/st_patricks/distance_icons/traffic.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/distance_icons/traffic.png rename to frogpilot/assets/holiday_themes/st_patricks/distance_icons/traffic.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/icons/button_flag.png b/frogpilot/assets/holiday_themes/st_patricks/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/icons/button_flag.png rename to frogpilot/assets/holiday_themes/st_patricks/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/icons/button_home.gif b/frogpilot/assets/holiday_themes/st_patricks/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/icons/button_home.gif rename to frogpilot/assets/holiday_themes/st_patricks/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/icons/button_settings.png b/frogpilot/assets/holiday_themes/st_patricks/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/icons/button_settings.png rename to frogpilot/assets/holiday_themes/st_patricks/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/traditional_100 b/frogpilot/assets/holiday_themes/st_patricks/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/traditional_100 rename to frogpilot/assets/holiday_themes/st_patricks/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/st_patricks/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/sounds/disengage.wav b/frogpilot/assets/holiday_themes/st_patricks/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/st_patricks/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/sounds/engage.wav b/frogpilot/assets/holiday_themes/st_patricks/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/sounds/engage.wav rename to frogpilot/assets/holiday_themes/st_patricks/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/st_patricks/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/st_patricks/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/st_patricks/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/st_patricks/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/colors/colors.json b/frogpilot/assets/holiday_themes/stitch_day/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/colors/colors.json rename to frogpilot/assets/holiday_themes/stitch_day/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/stitch_day/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/stitch_day/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/icons/button_flag.png b/frogpilot/assets/holiday_themes/stitch_day/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/icons/button_flag.png rename to frogpilot/assets/holiday_themes/stitch_day/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/icons/button_home.gif b/frogpilot/assets/holiday_themes/stitch_day/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/icons/button_home.gif rename to frogpilot/assets/holiday_themes/stitch_day/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/icons/button_settings.png b/frogpilot/assets/holiday_themes/stitch_day/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/icons/button_settings.png rename to frogpilot/assets/holiday_themes/stitch_day/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/traditional_100 b/frogpilot/assets/holiday_themes/stitch_day/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/traditional_100 rename to frogpilot/assets/holiday_themes/stitch_day/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav b/frogpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/sounds/engage.wav b/frogpilot/assets/holiday_themes/stitch_day/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/sounds/engage.wav rename to frogpilot/assets/holiday_themes/stitch_day/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json b/frogpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json rename to frogpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif b/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif rename to frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif b/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif rename to frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png b/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_100 b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_100 rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav b/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav b/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav rename to frogpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/colors/colors.json b/frogpilot/assets/holiday_themes/valentines/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/colors/colors.json rename to frogpilot/assets/holiday_themes/valentines/colors/colors.json diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/valentines/distance_icons/aggressive.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/aggressive.gif rename to frogpilot/assets/holiday_themes/valentines/distance_icons/aggressive.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/valentines/distance_icons/relaxed.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/relaxed.gif rename to frogpilot/assets/holiday_themes/valentines/distance_icons/relaxed.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/valentines/distance_icons/standard.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/standard.gif rename to frogpilot/assets/holiday_themes/valentines/distance_icons/standard.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/valentines/distance_icons/traffic.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/distance_icons/traffic.gif rename to frogpilot/assets/holiday_themes/valentines/distance_icons/traffic.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/icons/button_flag.png b/frogpilot/assets/holiday_themes/valentines/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/icons/button_flag.png rename to frogpilot/assets/holiday_themes/valentines/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/icons/button_home.gif b/frogpilot/assets/holiday_themes/valentines/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/icons/button_home.gif rename to frogpilot/assets/holiday_themes/valentines/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/icons/button_settings.png b/frogpilot/assets/holiday_themes/valentines/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/icons/button_settings.png rename to frogpilot/assets/holiday_themes/valentines/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/traditional_100 b/frogpilot/assets/holiday_themes/valentines/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/traditional_100 rename to frogpilot/assets/holiday_themes/valentines/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/valentines/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/sounds/disengage.wav b/frogpilot/assets/holiday_themes/valentines/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/valentines/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/sounds/engage.wav b/frogpilot/assets/holiday_themes/valentines/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/sounds/engage.wav rename to frogpilot/assets/holiday_themes/valentines/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/valentines/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/valentines/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/valentines/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/valentines/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/colors/colors.json b/frogpilot/assets/holiday_themes/world_frog_day/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/colors/colors.json rename to frogpilot/assets/holiday_themes/world_frog_day/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif new file mode 100644 index 0000000000..938eedb829 Binary files /dev/null and b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif differ diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif new file mode 100644 index 0000000000..30efbb7a04 Binary files /dev/null and b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif differ diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif new file mode 100644 index 0000000000..d7c8c8681b Binary files /dev/null and b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif differ diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif new file mode 100644 index 0000000000..63c8c11b45 Binary files /dev/null and b/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif b/frogpilot/assets/holiday_themes/world_frog_day/icons/button_flag.gif similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif rename to frogpilot/assets/holiday_themes/world_frog_day/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif b/frogpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif new file mode 100644 index 0000000000..133d8d34ed Binary files /dev/null and b/frogpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif differ diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png b/frogpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png rename to frogpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/traditional_100 b/frogpilot/assets/holiday_themes/world_frog_day/signals/traditional_100 similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/traditional_100 rename to frogpilot/assets/holiday_themes/world_frog_day/signals/traditional_100 diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png b/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png rename to frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav b/frogpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav rename to frogpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav b/frogpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav rename to frogpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav diff --git a/selfdrive/frogpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png b/frogpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png rename to frogpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/model_manager.py b/frogpilot/assets/model_manager.py similarity index 89% rename from selfdrive/frogpilot/assets/model_manager.py rename to frogpilot/assets/model_manager.py index 28420ea0f9..b264118b9e 100644 --- a/selfdrive/frogpilot/assets/model_manager.py +++ b/frogpilot/assets/model_manager.py @@ -9,11 +9,11 @@ import urllib.request from pathlib import Path -from openpilot.selfdrive.frogpilot.assets.download_functions import GITLAB_URL, download_file, get_repository_url, handle_error, handle_request_error, verify_download -from openpilot.selfdrive.frogpilot.frogpilot_utilities import delete_file -from openpilot.selfdrive.frogpilot.frogpilot_variables import DEFAULT_CLASSIC_MODEL, DEFAULT_MODEL, DEFAULT_TINYGRAD_MODEL, MODELS_PATH, params, params_default, params_memory +from openpilot.frogpilot.assets.download_functions import GITLAB_URL, download_file, get_repository_url, handle_error, handle_request_error, verify_download +from openpilot.frogpilot.common.frogpilot_utilities import delete_file +from openpilot.frogpilot.common.frogpilot_variables import DEFAULT_CLASSIC_MODEL, DEFAULT_MODEL, DEFAULT_TINYGRAD_MODEL, MODELS_PATH, params, params_default, params_memory -VERSION = "v13" +VERSION = "v15" CANCEL_DOWNLOAD_PARAM = "CancelModelDownload" DOWNLOAD_PROGRESS_PARAM = "ModelDownloadProgress" @@ -119,23 +119,17 @@ class ModelManager: @staticmethod def copy_default_model(): classic_default_model_path = MODELS_PATH / f"{DEFAULT_CLASSIC_MODEL}.thneed" - source_path = Path(__file__).parents[2] / "classic_modeld/models/supercombo.thneed" + source_path = Path(__file__).parents[1] / "classic_modeld/models/supercombo.thneed" if source_path.is_file() and not classic_default_model_path.is_file(): shutil.copyfile(source_path, classic_default_model_path) print(f"Copied the classic default model from {source_path} to {classic_default_model_path}") default_model_path = MODELS_PATH / f"{DEFAULT_MODEL}.thneed" - source_path = Path(__file__).parents[2] / "modeld/models/supercombo.thneed" + source_path = Path(__file__).parents[2] / "selfdrive/modeld/models/supercombo.thneed" if source_path.is_file() and not default_model_path.is_file(): shutil.copyfile(source_path, default_model_path) print(f"Copied the default model from {source_path} to {default_model_path}") - tingrad_default_model_path = MODELS_PATH / f"{DEFAULT_TINYGRAD_MODEL}.pkl" - source_path = Path(__file__).parents[2] / "tinygrad_modeld/models/supercombo_tinygrad.pkl" - if source_path.is_file() and not tingrad_default_model_path.is_file(): - shutil.copyfile(source_path, tingrad_default_model_path) - print(f"Copied the default tinygrad model from {source_path} to {tingrad_default_model_path}") - def check_models(self, boot_run, repo_url): available_models = set(self.available_models) - {DEFAULT_MODEL, DEFAULT_CLASSIC_MODEL} downloaded_models = {path.stem for path in MODELS_PATH.iterdir() if path.is_file()} - {DEFAULT_MODEL, DEFAULT_CLASSIC_MODEL} @@ -150,7 +144,7 @@ class ModelManager: if tmp_file.is_file(): delete_file(tmp_file) - if params.get("Model", encoding="utf-8") not in self.available_models: + if params.get("Model", encoding="utf-8") not in self.available_models + [DEFAULT_TINYGRAD_MODEL]: params.put("Model", params_default.get("Model", encoding="utf-8")) automatically_download_models = not boot_run and params.get_bool("AutomaticallyDownloadModels") @@ -187,11 +181,11 @@ class ModelManager: self.download_all_models() def update_model_params(self, model_info, repo_url): - self.available_models = [model["id"] for model in model_info] - self.model_versions = [model["version"] for model in model_info] + self.available_models = [model["id"] for model in model_info if model["id"] != DEFAULT_TINYGRAD_MODEL] + self.model_versions = [model["version"] for model in model_info if model["id"] != DEFAULT_TINYGRAD_MODEL] params.put("AvailableModels", ",".join(self.available_models)) - params.put("AvailableModelNames", ",".join([model["name"] for model in model_info])) + params.put("AvailableModelNames", ",".join([model["name"] for model in model_info if model["id"] != DEFAULT_TINYGRAD_MODEL])) params.put("ExperimentalModels", ",".join([model["id"] for model in model_info if model.get("experimental", False)])) params.put("ModelVersions", ",".join(self.model_versions)) print("Models list updated successfully") @@ -226,8 +220,8 @@ class ModelManager: model_info = self.fetch_models(f"{repo_url}/Versions/model_names_{VERSION}.json") if model_info: - available_models = [model["id"] for model in model_info] - available_model_names = [re.sub(r"[🗺️👀📡]", "", model["name"]).strip() for model in model_info] + available_models = [model["id"] for model in model_info if model["id"] != DEFAULT_TINYGRAD_MODEL] + available_model_names = [re.sub(r"[🗺️👀📡]", "", model["name"]).strip() for model in model_info if model["id"] != DEFAULT_TINYGRAD_MODEL] for model_id, model_name in zip(available_models, available_model_names): model_downloaded = list(MODELS_PATH.glob(f"{model_id}.*")) diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v1.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v1.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v1.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v1.pkl diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v2.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v2.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v2.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v2.pkl diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v3.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v3.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v3.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v3.pkl diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v4.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v4.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v4.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v4.pkl diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v5.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v5.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v5.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v5.pkl diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v6.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v6.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v6.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v6.pkl diff --git a/selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v7.pkl b/frogpilot/assets/model_metadata/supercombo_metadata_v7.pkl similarity index 100% rename from selfdrive/frogpilot/assets/model_metadata/supercombo_metadata_v7.pkl rename to frogpilot/assets/model_metadata/supercombo_metadata_v7.pkl diff --git a/selfdrive/frogpilot/assets/other_images/brake_pedal.png b/frogpilot/assets/other_images/brake_pedal.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/brake_pedal.png rename to frogpilot/assets/other_images/brake_pedal.png diff --git a/selfdrive/frogpilot/assets/other_images/chill_mode_icon.png b/frogpilot/assets/other_images/chill_mode_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/chill_mode_icon.png rename to frogpilot/assets/other_images/chill_mode_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/curve_icon.png b/frogpilot/assets/other_images/curve_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/curve_icon.png rename to frogpilot/assets/other_images/curve_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/curve_speed_left.png b/frogpilot/assets/other_images/curve_speed_left.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/curve_speed_left.png rename to frogpilot/assets/other_images/curve_speed_left.png diff --git a/frogpilot/assets/other_images/dashboard_icon.png b/frogpilot/assets/other_images/dashboard_icon.png new file mode 100644 index 0000000000..34ab75cbae Binary files /dev/null and b/frogpilot/assets/other_images/dashboard_icon.png differ diff --git a/frogpilot/assets/other_images/frogpilot_boot_logo.png b/frogpilot/assets/other_images/frogpilot_boot_logo.png new file mode 100644 index 0000000000..8e96d7c2cd Binary files /dev/null and b/frogpilot/assets/other_images/frogpilot_boot_logo.png differ diff --git a/selfdrive/frogpilot/assets/other_images/gas_pedal.png b/frogpilot/assets/other_images/gas_pedal.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/gas_pedal.png rename to frogpilot/assets/other_images/gas_pedal.png diff --git a/selfdrive/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg b/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg similarity index 100% rename from selfdrive/frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg rename to frogpilot/assets/other_images/icon_wifi_uploading_disabled.svg diff --git a/selfdrive/frogpilot/assets/other_images/lead_icon.png b/frogpilot/assets/other_images/lead_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/lead_icon.png rename to frogpilot/assets/other_images/lead_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/light_icon.png b/frogpilot/assets/other_images/light_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/light_icon.png rename to frogpilot/assets/other_images/light_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/navigation_icon.png b/frogpilot/assets/other_images/navigation_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/navigation_icon.png rename to frogpilot/assets/other_images/navigation_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/upcoming_maps_icon.png b/frogpilot/assets/other_images/next_maps_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/upcoming_maps_icon.png rename to frogpilot/assets/other_images/next_maps_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/offline_maps_icon.png b/frogpilot/assets/other_images/offline_maps_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/offline_maps_icon.png rename to frogpilot/assets/other_images/offline_maps_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/paused_icon.png b/frogpilot/assets/other_images/paused_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/paused_icon.png rename to frogpilot/assets/other_images/paused_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/speed_icon.png b/frogpilot/assets/other_images/speed_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/speed_icon.png rename to frogpilot/assets/other_images/speed_icon.png diff --git a/selfdrive/frogpilot/assets/other_images/stock_bg.jpg b/frogpilot/assets/other_images/stock_bg.jpg similarity index 100% rename from selfdrive/frogpilot/assets/other_images/stock_bg.jpg rename to frogpilot/assets/other_images/stock_bg.jpg diff --git a/selfdrive/frogpilot/assets/other_images/stop_sign.png b/frogpilot/assets/other_images/stop_sign.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/stop_sign.png rename to frogpilot/assets/other_images/stop_sign.png diff --git a/selfdrive/frogpilot/assets/other_images/turn_icon.png b/frogpilot/assets/other_images/turn_icon.png similarity index 100% rename from selfdrive/frogpilot/assets/other_images/turn_icon.png rename to frogpilot/assets/other_images/turn_icon.png diff --git a/selfdrive/frogpilot/assets/random_events/icons/button_home.gif b/frogpilot/assets/random_events/icons/button_home.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/icons/button_home.gif rename to frogpilot/assets/random_events/icons/button_home.gif diff --git a/selfdrive/frogpilot/assets/random_events/sounds/angry.wav b/frogpilot/assets/random_events/sounds/angry.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/angry.wav rename to frogpilot/assets/random_events/sounds/angry.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/continued.wav b/frogpilot/assets/random_events/sounds/continued.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/continued.wav rename to frogpilot/assets/random_events/sounds/continued.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/dejaVu.wav b/frogpilot/assets/random_events/sounds/dejaVu.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/dejaVu.wav rename to frogpilot/assets/random_events/sounds/dejaVu.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/doc.wav b/frogpilot/assets/random_events/sounds/doc.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/doc.wav rename to frogpilot/assets/random_events/sounds/doc.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/fart.wav b/frogpilot/assets/random_events/sounds/fart.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/fart.wav rename to frogpilot/assets/random_events/sounds/fart.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/firefox.wav b/frogpilot/assets/random_events/sounds/firefox.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/firefox.wav rename to frogpilot/assets/random_events/sounds/firefox.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/goat.wav b/frogpilot/assets/random_events/sounds/goat.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/goat.wav rename to frogpilot/assets/random_events/sounds/goat.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/hal9000.wav b/frogpilot/assets/random_events/sounds/hal9000.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/hal9000.wav rename to frogpilot/assets/random_events/sounds/hal9000.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/mail.wav b/frogpilot/assets/random_events/sounds/mail.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/mail.wav rename to frogpilot/assets/random_events/sounds/mail.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/nessie.wav b/frogpilot/assets/random_events/sounds/nessie.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/nessie.wav rename to frogpilot/assets/random_events/sounds/nessie.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/noice.wav b/frogpilot/assets/random_events/sounds/noice.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/noice.wav rename to frogpilot/assets/random_events/sounds/noice.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/this_is_fine.wav b/frogpilot/assets/random_events/sounds/this_is_fine.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/this_is_fine.wav rename to frogpilot/assets/random_events/sounds/this_is_fine.wav diff --git a/selfdrive/frogpilot/assets/random_events/sounds/uwu.wav b/frogpilot/assets/random_events/sounds/uwu.wav similarity index 100% rename from selfdrive/frogpilot/assets/random_events/sounds/uwu.wav rename to frogpilot/assets/random_events/sounds/uwu.wav diff --git a/selfdrive/frogpilot/assets/random_events/steering_wheels/firefox.gif b/frogpilot/assets/random_events/steering_wheels/firefox.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/steering_wheels/firefox.gif rename to frogpilot/assets/random_events/steering_wheels/firefox.gif diff --git a/selfdrive/frogpilot/assets/random_events/steering_wheels/goat.gif b/frogpilot/assets/random_events/steering_wheels/goat.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/steering_wheels/goat.gif rename to frogpilot/assets/random_events/steering_wheels/goat.gif diff --git a/selfdrive/frogpilot/assets/random_events/steering_wheels/great_scott.gif b/frogpilot/assets/random_events/steering_wheels/great_scott.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/steering_wheels/great_scott.gif rename to frogpilot/assets/random_events/steering_wheels/great_scott.gif diff --git a/selfdrive/frogpilot/assets/random_events/steering_wheels/this_is_fine.gif b/frogpilot/assets/random_events/steering_wheels/this_is_fine.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/steering_wheels/this_is_fine.gif rename to frogpilot/assets/random_events/steering_wheels/this_is_fine.gif diff --git a/selfdrive/frogpilot/assets/random_events/steering_wheels/tree_fiddy.gif b/frogpilot/assets/random_events/steering_wheels/tree_fiddy.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/steering_wheels/tree_fiddy.gif rename to frogpilot/assets/random_events/steering_wheels/tree_fiddy.gif diff --git a/selfdrive/frogpilot/assets/random_events/steering_wheels/weeb_wheel.gif b/frogpilot/assets/random_events/steering_wheels/weeb_wheel.gif similarity index 100% rename from selfdrive/frogpilot/assets/random_events/steering_wheels/weeb_wheel.gif rename to frogpilot/assets/random_events/steering_wheels/weeb_wheel.gif diff --git a/selfdrive/frogpilot/assets/stock_theme/colors/colors.json b/frogpilot/assets/stock_theme/colors/colors.json similarity index 100% rename from selfdrive/frogpilot/assets/stock_theme/colors/colors.json rename to frogpilot/assets/stock_theme/colors/colors.json diff --git a/frogpilot/assets/stock_theme/distance_icons/aggressive.png b/frogpilot/assets/stock_theme/distance_icons/aggressive.png new file mode 100644 index 0000000000..82fc5b31d9 Binary files /dev/null and b/frogpilot/assets/stock_theme/distance_icons/aggressive.png differ diff --git a/frogpilot/assets/stock_theme/distance_icons/relaxed.png b/frogpilot/assets/stock_theme/distance_icons/relaxed.png new file mode 100644 index 0000000000..1e5acc7d11 Binary files /dev/null and b/frogpilot/assets/stock_theme/distance_icons/relaxed.png differ diff --git a/frogpilot/assets/stock_theme/distance_icons/standard.png b/frogpilot/assets/stock_theme/distance_icons/standard.png new file mode 100644 index 0000000000..94d8172f57 Binary files /dev/null and b/frogpilot/assets/stock_theme/distance_icons/standard.png differ diff --git a/frogpilot/assets/stock_theme/distance_icons/traffic.png b/frogpilot/assets/stock_theme/distance_icons/traffic.png new file mode 100644 index 0000000000..fbefcda1e9 Binary files /dev/null and b/frogpilot/assets/stock_theme/distance_icons/traffic.png differ diff --git a/selfdrive/frogpilot/assets/stock_theme/icons/button_flag.png b/frogpilot/assets/stock_theme/icons/button_flag.png similarity index 100% rename from selfdrive/frogpilot/assets/stock_theme/icons/button_flag.png rename to frogpilot/assets/stock_theme/icons/button_flag.png diff --git a/selfdrive/frogpilot/assets/stock_theme/icons/button_home.png b/frogpilot/assets/stock_theme/icons/button_home.png similarity index 100% rename from selfdrive/frogpilot/assets/stock_theme/icons/button_home.png rename to frogpilot/assets/stock_theme/icons/button_home.png diff --git a/selfdrive/frogpilot/assets/stock_theme/icons/button_settings.png b/frogpilot/assets/stock_theme/icons/button_settings.png similarity index 100% rename from selfdrive/frogpilot/assets/stock_theme/icons/button_settings.png rename to frogpilot/assets/stock_theme/icons/button_settings.png diff --git a/selfdrive/frogpilot/assets/stock_theme/steering_wheel/wheel.png b/frogpilot/assets/stock_theme/steering_wheel/wheel.png similarity index 100% rename from selfdrive/frogpilot/assets/stock_theme/steering_wheel/wheel.png rename to frogpilot/assets/stock_theme/steering_wheel/wheel.png diff --git a/selfdrive/frogpilot/assets/theme_manager.py b/frogpilot/assets/theme_manager.py similarity index 83% rename from selfdrive/frogpilot/assets/theme_manager.py rename to frogpilot/assets/theme_manager.py index d08e4d0a27..56dbe56c98 100644 --- a/selfdrive/frogpilot/assets/theme_manager.py +++ b/frogpilot/assets/theme_manager.py @@ -9,9 +9,9 @@ from datetime import date, timedelta from dateutil import easter from pathlib import Path -from openpilot.selfdrive.frogpilot.assets.download_functions import GITLAB_URL, download_file, get_repository_url, handle_error, handle_request_error, verify_download -from openpilot.selfdrive.frogpilot.frogpilot_utilities import delete_file, extract_zip -from openpilot.selfdrive.frogpilot.frogpilot_variables import ACTIVE_THEME_PATH, RANDOM_EVENTS_PATH, THEME_SAVE_PATH, params, params_memory, update_frogpilot_toggles +from openpilot.frogpilot.assets.download_functions import GITLAB_URL, download_file, get_repository_url, handle_error, handle_request_error, verify_download +from openpilot.frogpilot.common.frogpilot_utilities import delete_file, extract_zip +from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH, RANDOM_EVENTS_PATH, THEME_SAVE_PATH, params, params_memory, update_frogpilot_toggles CANCEL_DOWNLOAD_PARAM = "CancelThemeDownload" DOWNLOAD_PROGRESS_PARAM = "ThemeDownloadProgress" @@ -19,63 +19,82 @@ DOWNLOAD_PROGRESS_PARAM = "ThemeDownloadProgress" HOLIDAY_THEME_PATH = Path(__file__).parent / "holiday_themes" STOCKOP_THEME_PATH = Path(__file__).parent / "stock_theme" -def randomize_distance_icons(): +def get_full_themes(): theme_packs_path = THEME_SAVE_PATH / "theme_packs" if not theme_packs_path.exists(): - return "stock" + return [] - candidates = [directory.name for directory in theme_packs_path.iterdir() if (directory / "distance_icons").is_dir()] - - return random.choice(candidates) if candidates else "stock" - -def randomize_theme_asset(): - theme_packs_path = THEME_SAVE_PATH / "theme_packs" - if not theme_packs_path.exists(): - return "stock" - - animated_required = {"icons"} - base_required = {"colors", "icons", "sounds"} - - candidates = [] + valid_themes = set() for theme_directory in theme_packs_path.iterdir(): if not theme_directory.is_dir(): continue - name = theme_directory.name - base_name = name.replace("-animated", "") + base_name = theme_directory.name.replace("-animated", "") + + animated_path = theme_packs_path / f"{base_name}-animated" base_path = theme_packs_path / base_name - animated_valid = "-animated" in name and all((theme_directory / directory).is_dir() for directory in animated_required) - base_valid = all((base_path / directory).is_dir() for directory in base_required) or (theme_packs_path / f"{base_name}-animated" / "icons").is_dir() + base_valid = all((base_path / asset).is_dir() for asset in {"colors", "sounds"}) + animated_icons_exist = (animated_path / "icons").is_dir() + base_icons_exist = (base_path / "icons").is_dir() - if animated_valid or base_valid: - candidates.append(name) + if base_valid and (animated_icons_exist or base_icons_exist): + if animated_icons_exist: + valid_themes.add(f"{base_name}-animated") + else: + valid_themes.add(base_name) - animated_themes = {name.replace("-animated", "") for name in candidates if name.endswith("-animated")} - candidates = [name for name in candidates if name not in animated_themes] + return sorted(valid_themes) + +def randomize_distance_icons(available_themes, selected_theme): + theme_packs_path = THEME_SAVE_PATH / "theme_packs" + if not theme_packs_path.exists(): + return "stock" + + candidates = [] + for theme_pack in theme_packs_path.iterdir(): + if not theme_pack.is_dir(): + continue + + distance_icons_dir = theme_pack / "distance_icons" + if not distance_icons_dir.is_dir(): + continue + + icon_name = theme_pack.name.lower() + + theme_association = [theme for theme in available_themes if theme.replace("-animated", "") in icon_name] + if theme_association and selected_theme not in icon_name: + continue + + weight = 5 if selected_theme in icon_name else 1 + candidates.extend([theme_pack.name] * weight) return random.choice(candidates) if candidates else "stock" -def randomize_wheel_image(selected_theme): - steering_wheels_path = THEME_SAVE_PATH / "steering_wheels" - theme_packs_path = THEME_SAVE_PATH / "theme_packs" - - if not steering_wheels_path.exists(): +def randomize_theme_asset(available_themes): + if not available_themes: return "stock" - theme_names = [] - if theme_packs_path.exists(): - theme_names = [directory.name.replace("-animated", "") for directory in theme_packs_path.iterdir() if directory.is_dir()] + return random.choice(available_themes) + +def randomize_wheel_image(available_themes, selected_theme): + steering_wheels_path = THEME_SAVE_PATH / "steering_wheels" + if not steering_wheels_path.exists(): + return "stock" candidates = [] for wheel_file in steering_wheels_path.iterdir(): if not wheel_file.is_file(): continue - if any(part in theme_names for part in wheel_file.stem.split("_")): + name = wheel_file.stem.lower() + + theme_association = [theme for theme in available_themes if theme.replace("-animated", "") in name] + if theme_association and selected_theme not in name: continue - candidates.append(wheel_file.stem) + weight = 5 if selected_theme in name else 1 + candidates.extend([wheel_file.stem] * weight) return random.choice(candidates) if candidates else "stock" @@ -149,15 +168,7 @@ class ThemeManager: def __init__(self): self.downloading_theme = False - self.theme_assets = { - "holiday_theme": "stock", - "color_scheme": "stock", - "distance_icons": "stock", - "icon_pack": "stock", - "sound_pack": "stock", - "turn_signal_pack": "stock", - "wheel_image": "stock" - } + self.holiday_theme = "stock" @staticmethod def calculate_thanksgiving(year): @@ -194,38 +205,36 @@ class ThemeManager: for holiday, holiday_date in holidays.items(): if (holiday.endswith("_week") and self.is_within_week_of(holiday_date, current_date)) or (current_date == holiday_date): - if holiday != self.theme_assets.get("holiday_theme"): - self.theme_assets["holiday_theme"] = holiday - return + return holiday - self.theme_assets["holiday_theme"] = "stock" + return "stock" def update_active_theme(self, time_validated, frogpilot_toggles, boot_run=False, randomize_theme=False): if time_validated and frogpilot_toggles.holiday_themes: - self.update_holiday() + self.holiday_theme = self.update_holiday() else: - self.theme_assets["holiday_theme"] = "stock" + self.holiday_theme = "stock" - if self.theme_assets.get("holiday_theme") != "stock": + if self.holiday_theme != "stock": asset_mappings = { - "color_scheme": ("colors", self.theme_assets.get("holiday_theme")), - "distance_icons": ("distance_icons", self.theme_assets.get("holiday_theme")), - "icon_pack": ("icons", self.theme_assets.get("holiday_theme")), - "sound_pack": ("sounds", self.theme_assets.get("holiday_theme")), - "turn_signal_pack": ("signals", self.theme_assets.get("holiday_theme")), - "wheel_image": ("wheel_image", self.theme_assets.get("holiday_theme")) + "color_scheme": ("colors", self.holiday_theme), + "distance_icons": ("distance_icons", self.holiday_theme), + "icon_pack": ("icons", self.holiday_theme), + "sound_pack": ("sounds", self.holiday_theme), + "turn_signal_pack": ("signals", self.holiday_theme), + "wheel_image": ("wheel_image", self.holiday_theme) } elif (boot_run or randomize_theme) and frogpilot_toggles.random_themes: - selected_theme = randomize_theme_asset() - selected_wheel = randomize_wheel_image(selected_theme) + available_themes = get_full_themes() + selected_theme = randomize_theme_asset(available_themes) asset_mappings = { "color_scheme": ("colors", selected_theme.replace("-animated", "")), - "distance_icons": ("distance_icons", randomize_distance_icons()), + "distance_icons": ("distance_icons", randomize_distance_icons(available_themes, selected_theme.replace("-animated", ""))), "icon_pack": ("icons", selected_theme), "sound_pack": ("sounds", selected_theme.replace("-animated", "")), "turn_signal_pack": ("signals", selected_theme.replace("-animated", "")), - "wheel_image": ("wheel_image", selected_wheel) + "wheel_image": ("wheel_image", randomize_wheel_image(available_themes, selected_theme.replace("-animated", ""))) } update_frogpilot_toggles() @@ -241,20 +250,13 @@ class ThemeManager: else: return False - theme_updated = False for asset, (asset_type, current_value) in asset_mappings.items(): - if current_value != self.theme_assets.get(asset) or boot_run: - print(f"Updating {asset}: {asset_type} with value {current_value}") + print(f"Updating {asset}: {asset_type} with value {current_value}") - if asset_type == "wheel_image": - update_wheel_image(current_value, self.theme_assets.get("holiday_theme"), random_event=False) - else: - update_theme_asset(asset_type, current_value, self.theme_assets.get("holiday_theme")) - - self.theme_assets[asset] = current_value - theme_updated = True - - return theme_updated + if asset_type == "wheel_image": + update_wheel_image(current_value, self.holiday_theme, random_event=False) + else: + update_theme_asset(asset_type, current_value, self.holiday_theme) @staticmethod def handle_verification_failure(ext, theme_component, theme_name, theme_param, theme_path, download_path): diff --git a/selfdrive/frogpilot/assets/toggle_icons/frog.png b/frogpilot/assets/toggle_icons/frog.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/frog.png rename to frogpilot/assets/toggle_icons/frog.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_device.png b/frogpilot/assets/toggle_icons/icon_advanced_device.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_advanced_device.png rename to frogpilot/assets/toggle_icons/icon_advanced_device.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png b/frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png rename to frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_always_on_lateral.png b/frogpilot/assets/toggle_icons/icon_always_on_lateral.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_always_on_lateral.png rename to frogpilot/assets/toggle_icons/icon_always_on_lateral.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_calendar.png b/frogpilot/assets/toggle_icons/icon_calendar.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_calendar.png rename to frogpilot/assets/toggle_icons/icon_calendar.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_conditional.png b/frogpilot/assets/toggle_icons/icon_conditional.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_conditional.png rename to frogpilot/assets/toggle_icons/icon_conditional.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_customization.png b/frogpilot/assets/toggle_icons/icon_customization.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_customization.png rename to frogpilot/assets/toggle_icons/icon_customization.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_device.png b/frogpilot/assets/toggle_icons/icon_device.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_device.png rename to frogpilot/assets/toggle_icons/icon_device.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_display.png b/frogpilot/assets/toggle_icons/icon_display.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_display.png rename to frogpilot/assets/toggle_icons/icon_display.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_green_light.png b/frogpilot/assets/toggle_icons/icon_green_light.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_green_light.png rename to frogpilot/assets/toggle_icons/icon_green_light.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_lane.png b/frogpilot/assets/toggle_icons/icon_lane.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_lane.png rename to frogpilot/assets/toggle_icons/icon_lane.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_lateral_tune.png b/frogpilot/assets/toggle_icons/icon_lateral_tune.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_lateral_tune.png rename to frogpilot/assets/toggle_icons/icon_lateral_tune.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_light.png b/frogpilot/assets/toggle_icons/icon_light.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_light.png rename to frogpilot/assets/toggle_icons/icon_light.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_longitudinal_tune.png b/frogpilot/assets/toggle_icons/icon_longitudinal_tune.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_longitudinal_tune.png rename to frogpilot/assets/toggle_icons/icon_longitudinal_tune.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_map.png b/frogpilot/assets/toggle_icons/icon_map.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_map.png rename to frogpilot/assets/toggle_icons/icon_map.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_message.png b/frogpilot/assets/toggle_icons/icon_message.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_message.png rename to frogpilot/assets/toggle_icons/icon_message.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_model.png b/frogpilot/assets/toggle_icons/icon_model.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_model.png rename to frogpilot/assets/toggle_icons/icon_model.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_mute.png b/frogpilot/assets/toggle_icons/icon_mute.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_mute.png rename to frogpilot/assets/toggle_icons/icon_mute.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_personality.png b/frogpilot/assets/toggle_icons/icon_personality.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_personality.png rename to frogpilot/assets/toggle_icons/icon_personality.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_rainbow.png b/frogpilot/assets/toggle_icons/icon_rainbow.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_rainbow.png rename to frogpilot/assets/toggle_icons/icon_rainbow.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_random.png b/frogpilot/assets/toggle_icons/icon_random.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_random.png rename to frogpilot/assets/toggle_icons/icon_random.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_random_themes.png b/frogpilot/assets/toggle_icons/icon_random_themes.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_random_themes.png rename to frogpilot/assets/toggle_icons/icon_random_themes.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_sound.png b/frogpilot/assets/toggle_icons/icon_sound.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_sound.png rename to frogpilot/assets/toggle_icons/icon_sound.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_speed_map.png b/frogpilot/assets/toggle_icons/icon_speed_map.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_speed_map.png rename to frogpilot/assets/toggle_icons/icon_speed_map.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_steering.png b/frogpilot/assets/toggle_icons/icon_steering.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_steering.png rename to frogpilot/assets/toggle_icons/icon_steering.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_system.png b/frogpilot/assets/toggle_icons/icon_system.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_system.png rename to frogpilot/assets/toggle_icons/icon_system.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_vehicle.png b/frogpilot/assets/toggle_icons/icon_vehicle.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_vehicle.png rename to frogpilot/assets/toggle_icons/icon_vehicle.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/icon_vtc.png b/frogpilot/assets/toggle_icons/icon_vtc.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/icon_vtc.png rename to frogpilot/assets/toggle_icons/icon_vtc.png diff --git a/selfdrive/frogpilot/assets/toggle_icons/quality_of_life.png b/frogpilot/assets/toggle_icons/quality_of_life.png similarity index 100% rename from selfdrive/frogpilot/assets/toggle_icons/quality_of_life.png rename to frogpilot/assets/toggle_icons/quality_of_life.png diff --git a/selfdrive/classic_modeld/classic_modeld b/frogpilot/classic_modeld/classic_modeld similarity index 100% rename from selfdrive/classic_modeld/classic_modeld rename to frogpilot/classic_modeld/classic_modeld diff --git a/selfdrive/classic_modeld/classic_modeld.py b/frogpilot/classic_modeld/classic_modeld.py similarity index 96% rename from selfdrive/classic_modeld/classic_modeld.py rename to frogpilot/classic_modeld/classic_modeld.py index b419535236..6528b59744 100755 --- a/selfdrive/classic_modeld/classic_modeld.py +++ b/frogpilot/classic_modeld/classic_modeld.py @@ -18,15 +18,15 @@ from openpilot.common.transformations.model import get_warp_matrix from openpilot.system import sentry from openpilot.selfdrive.car.car_helpers import get_demo_car_params from openpilot.selfdrive.controls.lib.desire_helper import DesireHelper -from openpilot.selfdrive.classic_modeld.runners import ModelRunner, Runtime -from openpilot.selfdrive.classic_modeld.parse_model_outputs import Parser -from openpilot.selfdrive.classic_modeld.fill_model_msg import fill_model_msg, fill_pose_msg, PublishState -from openpilot.selfdrive.classic_modeld.constants import ModelConstants -from openpilot.selfdrive.classic_modeld.models.commonmodel_pyx import ModelFrame, CLContext +from openpilot.frogpilot.classic_modeld.runners import ModelRunner, Runtime +from openpilot.frogpilot.classic_modeld.parse_model_outputs import Parser +from openpilot.frogpilot.classic_modeld.fill_model_msg import fill_model_msg, fill_pose_msg, PublishState +from openpilot.frogpilot.classic_modeld.constants import ModelConstants +from openpilot.frogpilot.classic_modeld.models.commonmodel_pyx import ModelFrame, CLContext -from openpilot.selfdrive.frogpilot.frogpilot_variables import METADATAS_PATH, MODELS_PATH, get_frogpilot_toggles +from openpilot.frogpilot.common.frogpilot_variables import METADATAS_PATH, MODELS_PATH, get_frogpilot_toggles -PROCESS_NAME = "selfdrive.classic_modeld.classic_modeld" +PROCESS_NAME = "frogpilot.classic_modeld.classic_modeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') MODEL_PATHS = { diff --git a/selfdrive/classic_modeld/constants.py b/frogpilot/classic_modeld/constants.py similarity index 100% rename from selfdrive/classic_modeld/constants.py rename to frogpilot/classic_modeld/constants.py diff --git a/selfdrive/classic_modeld/dmonitoringmodeld.py b/frogpilot/classic_modeld/dmonitoringmodeld.py similarity index 97% rename from selfdrive/classic_modeld/dmonitoringmodeld.py rename to frogpilot/classic_modeld/dmonitoringmodeld.py index 3d736c0cb4..f5f1db5c28 100644 --- a/selfdrive/classic_modeld/dmonitoringmodeld.py +++ b/frogpilot/classic_modeld/dmonitoringmodeld.py @@ -13,8 +13,8 @@ from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf from openpilot.common.swaglog import cloudlog from openpilot.common.params import Params from openpilot.common.realtime import set_realtime_priority -from openpilot.selfdrive.classic_modeld.runners import ModelRunner, Runtime -from openpilot.selfdrive.classic_modeld.models.commonmodel_pyx import sigmoid +from openpilot.frogpilot.classic_modeld.runners import ModelRunner, Runtime +from openpilot.frogpilot.classic_modeld.models.commonmodel_pyx import sigmoid CALIB_LEN = 3 REG_SCALE = 0.25 diff --git a/selfdrive/classic_modeld/fill_model_msg.py b/frogpilot/classic_modeld/fill_model_msg.py similarity index 89% rename from selfdrive/classic_modeld/fill_model_msg.py rename to frogpilot/classic_modeld/fill_model_msg.py index 916ffb7d70..3e871da5ea 100644 --- a/selfdrive/classic_modeld/fill_model_msg.py +++ b/frogpilot/classic_modeld/fill_model_msg.py @@ -2,7 +2,7 @@ import os import capnp import numpy as np from cereal import log -from openpilot.selfdrive.classic_modeld.constants import ModelConstants, Plan, Meta +from openpilot.frogpilot.classic_modeld.constants import ModelConstants, Plan, Meta SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') @@ -93,25 +93,18 @@ def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: dict[str, # lane lines modelV2.init('laneLines', 6) - road_edge_stds = net_output_data['road_edges_stds'][0,:,0,0] for i in range(6): lane_line = modelV2.laneLines[i] if i < 4: fill_xyzt(lane_line, PLAN_T_IDXS, np.array(ModelConstants.X_IDXS), net_output_data['lane_lines'][0,i,:,0], net_output_data['lane_lines'][0,i,:,1]) elif i == 4: - if road_edge_stds[0] >= 0.5: - leftLane_x = 0.5 * (net_output_data['lane_lines'][0,0,:,0] + net_output_data['lane_lines'][0,1,:,0]) - leftLane_y = 0.5 * (net_output_data['lane_lines'][0,0,:,1] + net_output_data['lane_lines'][0,1,:,1]) - fill_xyzt(lane_line, PLAN_T_IDXS, np.array(ModelConstants.X_IDXS), leftLane_x, leftLane_y) - else: - fill_xyzt(lane_line, PLAN_T_IDXS, np.empty((0,)), np.empty((0,)), np.empty((0,))) + leftLane_x = 0.5 * (net_output_data['lane_lines'][0,0,:,0] + net_output_data['lane_lines'][0,1,:,0]) + leftLane_y = 0.5 * (net_output_data['lane_lines'][0,0,:,1] + net_output_data['lane_lines'][0,1,:,1]) + fill_xyzt(lane_line, PLAN_T_IDXS, np.array(ModelConstants.X_IDXS), leftLane_x, leftLane_y) elif i == 5: - if road_edge_stds[1] >= 0.5: - rightLane_x = 0.5 * (net_output_data['lane_lines'][0,2,:,0] + net_output_data['lane_lines'][0,3,:,0]) - rightLane_y = 0.5 * (net_output_data['lane_lines'][0,2,:,1] + net_output_data['lane_lines'][0,3,:,1]) - fill_xyzt(lane_line, PLAN_T_IDXS, np.array(ModelConstants.X_IDXS), rightLane_x, rightLane_y) - else: - fill_xyzt(lane_line, PLAN_T_IDXS, np.empty((0,)), np.empty((0,)), np.empty((0,))) + rightLane_x = 0.5 * (net_output_data['lane_lines'][0,2,:,0] + net_output_data['lane_lines'][0,3,:,0]) + rightLane_y = 0.5 * (net_output_data['lane_lines'][0,2,:,1] + net_output_data['lane_lines'][0,3,:,1]) + fill_xyzt(lane_line, PLAN_T_IDXS, np.array(ModelConstants.X_IDXS), rightLane_x, rightLane_y) modelV2.laneLineStds = net_output_data['lane_lines_stds'][0,:,0,0].tolist() modelV2.laneLineProbs = net_output_data['lane_lines_prob'][0,1::2].tolist() @@ -120,7 +113,7 @@ def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: dict[str, for i in range(2): road_edge = modelV2.roadEdges[i] fill_xyzt(road_edge, PLAN_T_IDXS, np.array(ModelConstants.X_IDXS), net_output_data['road_edges'][0,i,:,0], net_output_data['road_edges'][0,i,:,1]) - modelV2.roadEdgeStds = road_edge_stds.tolist() + modelV2.roadEdgeStds = net_output_data['road_edges_stds'][0,:,0,0].tolist() # leads modelV2.init('leadsV3', 3) diff --git a/selfdrive/classic_modeld/get_model_metadata.py b/frogpilot/classic_modeld/get_model_metadata.py similarity index 100% rename from selfdrive/classic_modeld/get_model_metadata.py rename to frogpilot/classic_modeld/get_model_metadata.py diff --git a/frogpilot/classic_modeld/libthneed.so b/frogpilot/classic_modeld/libthneed.so new file mode 100644 index 0000000000..d8693aff7b Binary files /dev/null and b/frogpilot/classic_modeld/libthneed.so differ diff --git a/selfdrive/classic_modeld/models/README.md b/frogpilot/classic_modeld/models/README.md similarity index 96% rename from selfdrive/classic_modeld/models/README.md rename to frogpilot/classic_modeld/models/README.md index fa12d68674..d10aa73004 100644 --- a/selfdrive/classic_modeld/models/README.md +++ b/frogpilot/classic_modeld/models/README.md @@ -24,7 +24,7 @@ To view the architecture of the ONNX networks, you can use [netron](https://netr ### Supercombo output format (Full size: XXX x float32) -Read [here](https://github.com/commaai/openpilot/blob/90af436a121164a51da9fa48d093c29f738adf6a/selfdrive/classic_modeld/models/driving.h#L236) for more. +Read [here](https://github.com/commaai/openpilot/blob/90af436a121164a51da9fa48d093c29f738adf6a/frogpilot/classic_modeld/models/driving.h#L236) for more. ## Driver Monitoring Model @@ -38,7 +38,7 @@ Read [here](https://github.com/commaai/openpilot/blob/90af436a121164a51da9fa48d0 * camera calibration angles (roll, pitch, yaw) from liveCalibration: 3 x float32 inputs ### output format -* 84 x float32 outputs = 2 + 41 * 2 ([parsing example](https://github.com/commaai/openpilot/blob/22ce4e17ba0d3bfcf37f8255a4dd1dc683fe0c38/selfdrive/classic_modeld/models/dmonitoring.cc#L33)) +* 84 x float32 outputs = 2 + 41 * 2 ([parsing example](https://github.com/commaai/openpilot/blob/22ce4e17ba0d3bfcf37f8255a4dd1dc683fe0c38/frogpilot/classic_modeld/models/dmonitoring.cc#L33)) * for each person in the front seats (2 * 41) * face pose: 12 = 6 + 6 * face orientation [pitch, yaw, roll] in camera frame: 3 diff --git a/selfdrive/classic_modeld/models/commonmodel.pxd b/frogpilot/classic_modeld/models/commonmodel.pxd similarity index 88% rename from selfdrive/classic_modeld/models/commonmodel.pxd rename to frogpilot/classic_modeld/models/commonmodel.pxd index b67e866fb7..8a17fe8328 100644 --- a/selfdrive/classic_modeld/models/commonmodel.pxd +++ b/frogpilot/classic_modeld/models/commonmodel.pxd @@ -11,7 +11,7 @@ cdef extern from "common/clutil.h": cl_device_id cl_get_device_id(unsigned long) cl_context cl_create_context(cl_device_id) -cdef extern from "selfdrive/classic_modeld/models/commonmodel.h": +cdef extern from "frogpilot/classic_modeld/models/commonmodel.h": float sigmoid(float) cppclass ModelFrame: diff --git a/selfdrive/classic_modeld/models/commonmodel_pyx.pxd b/frogpilot/classic_modeld/models/commonmodel_pyx.pxd similarity index 100% rename from selfdrive/classic_modeld/models/commonmodel_pyx.pxd rename to frogpilot/classic_modeld/models/commonmodel_pyx.pxd diff --git a/selfdrive/classic_modeld/models/commonmodel_pyx.pyx b/frogpilot/classic_modeld/models/commonmodel_pyx.pyx similarity index 100% rename from selfdrive/classic_modeld/models/commonmodel_pyx.pyx rename to frogpilot/classic_modeld/models/commonmodel_pyx.pyx diff --git a/frogpilot/classic_modeld/models/commonmodel_pyx.so b/frogpilot/classic_modeld/models/commonmodel_pyx.so new file mode 100644 index 0000000000..b4c4f09b46 Binary files /dev/null and b/frogpilot/classic_modeld/models/commonmodel_pyx.so differ diff --git a/selfdrive/classic_modeld/models/dmonitoring_model.current b/frogpilot/classic_modeld/models/dmonitoring_model.current similarity index 100% rename from selfdrive/classic_modeld/models/dmonitoring_model.current rename to frogpilot/classic_modeld/models/dmonitoring_model.current diff --git a/selfdrive/classic_modeld/models/dmonitoring_model_q.dlc b/frogpilot/classic_modeld/models/dmonitoring_model_q.dlc similarity index 100% rename from selfdrive/classic_modeld/models/dmonitoring_model_q.dlc rename to frogpilot/classic_modeld/models/dmonitoring_model_q.dlc diff --git a/selfdrive/classic_modeld/models/navmodel_q.dlc b/frogpilot/classic_modeld/models/navmodel_q.dlc similarity index 100% rename from selfdrive/classic_modeld/models/navmodel_q.dlc rename to frogpilot/classic_modeld/models/navmodel_q.dlc diff --git a/selfdrive/classic_modeld/models/supercombo.thneed b/frogpilot/classic_modeld/models/supercombo.thneed similarity index 99% rename from selfdrive/classic_modeld/models/supercombo.thneed rename to frogpilot/classic_modeld/models/supercombo.thneed index 1bc870e0ce..b6609c9c51 100644 Binary files a/selfdrive/classic_modeld/models/supercombo.thneed and b/frogpilot/classic_modeld/models/supercombo.thneed differ diff --git a/selfdrive/classic_modeld/models/supercombo_metadata.pkl b/frogpilot/classic_modeld/models/supercombo_metadata.pkl similarity index 100% rename from selfdrive/classic_modeld/models/supercombo_metadata.pkl rename to frogpilot/classic_modeld/models/supercombo_metadata.pkl diff --git a/selfdrive/classic_modeld/navmodeld.py b/frogpilot/classic_modeld/navmodeld.py similarity index 96% rename from selfdrive/classic_modeld/navmodeld.py rename to frogpilot/classic_modeld/navmodeld.py index 8b3ada2e27..1b30f2348b 100644 --- a/selfdrive/classic_modeld/navmodeld.py +++ b/frogpilot/classic_modeld/navmodeld.py @@ -12,8 +12,8 @@ from msgq.visionipc import VisionIpcClient, VisionStreamType from openpilot.common.swaglog import cloudlog from openpilot.common.params import Params from openpilot.common.realtime import set_realtime_priority -from openpilot.selfdrive.classic_modeld.constants import ModelConstants -from openpilot.selfdrive.classic_modeld.runners import ModelRunner, Runtime +from openpilot.frogpilot.classic_modeld.constants import ModelConstants +from openpilot.frogpilot.classic_modeld.runners import ModelRunner, Runtime NAV_INPUT_SIZE = 256*256 NAV_FEATURE_LEN = 256 diff --git a/selfdrive/classic_modeld/parse_model_outputs.py b/frogpilot/classic_modeld/parse_model_outputs.py similarity index 98% rename from selfdrive/classic_modeld/parse_model_outputs.py rename to frogpilot/classic_modeld/parse_model_outputs.py index 804d776896..0ed5d10173 100644 --- a/selfdrive/classic_modeld/parse_model_outputs.py +++ b/frogpilot/classic_modeld/parse_model_outputs.py @@ -1,5 +1,5 @@ import numpy as np -from openpilot.selfdrive.classic_modeld.constants import ModelConstants +from openpilot.frogpilot.classic_modeld.constants import ModelConstants def sigmoid(x): return 1. / (1. + np.exp(-x)) diff --git a/selfdrive/classic_modeld/runners/__init__.py b/frogpilot/classic_modeld/runners/__init__.py similarity index 76% rename from selfdrive/classic_modeld/runners/__init__.py rename to frogpilot/classic_modeld/runners/__init__.py index 2c809317a1..5506235765 100644 --- a/selfdrive/classic_modeld/runners/__init__.py +++ b/frogpilot/classic_modeld/runners/__init__.py @@ -1,6 +1,6 @@ import os from openpilot.system.hardware import TICI -from openpilot.selfdrive.classic_modeld.runners.runmodel_pyx import RunModel, Runtime +from openpilot.frogpilot.classic_modeld.runners.runmodel_pyx import RunModel, Runtime assert Runtime USE_THNEED = int(os.getenv('USE_THNEED', str(int(TICI)))) @@ -13,13 +13,13 @@ class ModelRunner(RunModel): def __new__(cls, paths, *args, **kwargs): if ModelRunner.THNEED in paths and USE_THNEED: - from openpilot.selfdrive.classic_modeld.runners.thneedmodel_pyx import ThneedModel as Runner + from openpilot.frogpilot.classic_modeld.runners.thneedmodel_pyx import ThneedModel as Runner runner_type = ModelRunner.THNEED elif ModelRunner.SNPE in paths and USE_SNPE: - from openpilot.selfdrive.classic_modeld.runners.snpemodel_pyx import SNPEModel as Runner + from openpilot.frogpilot.classic_modeld.runners.snpemodel_pyx import SNPEModel as Runner runner_type = ModelRunner.SNPE elif ModelRunner.ONNX in paths: - from openpilot.selfdrive.classic_modeld.runners.onnxmodel import ONNXModel as Runner + from openpilot.frogpilot.classic_modeld.runners.onnxmodel import ONNXModel as Runner runner_type = ModelRunner.ONNX else: raise Exception("Couldn't select a model runner, make sure to pass at least one valid model path") diff --git a/selfdrive/classic_modeld/runners/onnxmodel.py b/frogpilot/classic_modeld/runners/onnxmodel.py similarity index 98% rename from selfdrive/classic_modeld/runners/onnxmodel.py rename to frogpilot/classic_modeld/runners/onnxmodel.py index 41064a8d01..bb2ba38dcd 100644 --- a/selfdrive/classic_modeld/runners/onnxmodel.py +++ b/frogpilot/classic_modeld/runners/onnxmodel.py @@ -5,7 +5,7 @@ import sys import numpy as np from typing import Any -from openpilot.selfdrive.classic_modeld.runners.runmodel_pyx import RunModel +from openpilot.frogpilot.classic_modeld.runners.runmodel_pyx import RunModel ORT_TYPES_TO_NP_TYPES = {'tensor(float16)': np.float16, 'tensor(float)': np.float32, 'tensor(uint8)': np.uint8} diff --git a/selfdrive/classic_modeld/runners/runmodel.pxd b/frogpilot/classic_modeld/runners/runmodel.pxd similarity index 82% rename from selfdrive/classic_modeld/runners/runmodel.pxd rename to frogpilot/classic_modeld/runners/runmodel.pxd index 35f9c6de17..f0e1169992 100644 --- a/selfdrive/classic_modeld/runners/runmodel.pxd +++ b/frogpilot/classic_modeld/runners/runmodel.pxd @@ -2,7 +2,7 @@ from libcpp.string cimport string -cdef extern from "selfdrive/classic_modeld/runners/runmodel.h": +cdef extern from "frogpilot/classic_modeld/runners/runmodel.h": cdef int USE_CPU_RUNTIME cdef int USE_GPU_RUNTIME cdef int USE_DSP_RUNTIME diff --git a/selfdrive/classic_modeld/runners/runmodel_pyx.pxd b/frogpilot/classic_modeld/runners/runmodel_pyx.pxd similarity index 100% rename from selfdrive/classic_modeld/runners/runmodel_pyx.pxd rename to frogpilot/classic_modeld/runners/runmodel_pyx.pxd diff --git a/selfdrive/classic_modeld/runners/runmodel_pyx.pyx b/frogpilot/classic_modeld/runners/runmodel_pyx.pyx similarity index 93% rename from selfdrive/classic_modeld/runners/runmodel_pyx.pyx rename to frogpilot/classic_modeld/runners/runmodel_pyx.pyx index 4c1ab2c8fc..ed42979848 100644 --- a/selfdrive/classic_modeld/runners/runmodel_pyx.pyx +++ b/frogpilot/classic_modeld/runners/runmodel_pyx.pyx @@ -4,7 +4,7 @@ from libcpp.string cimport string from .runmodel cimport USE_CPU_RUNTIME, USE_GPU_RUNTIME, USE_DSP_RUNTIME -from selfdrive.classic_modeld.models.commonmodel_pyx cimport CLMem +from frogpilot.classic_modeld.models.commonmodel_pyx cimport CLMem class Runtime: CPU = USE_CPU_RUNTIME diff --git a/selfdrive/classic_modeld/runners/runmodel_pyx.so b/frogpilot/classic_modeld/runners/runmodel_pyx.so similarity index 97% rename from selfdrive/classic_modeld/runners/runmodel_pyx.so rename to frogpilot/classic_modeld/runners/runmodel_pyx.so index 6f4431dcc7..ddb6189bfe 100644 Binary files a/selfdrive/classic_modeld/runners/runmodel_pyx.so and b/frogpilot/classic_modeld/runners/runmodel_pyx.so differ diff --git a/selfdrive/classic_modeld/runners/snpemodel.pxd b/frogpilot/classic_modeld/runners/snpemodel.pxd similarity index 76% rename from selfdrive/classic_modeld/runners/snpemodel.pxd rename to frogpilot/classic_modeld/runners/snpemodel.pxd index 2a09231284..45c8c0662f 100644 --- a/selfdrive/classic_modeld/runners/snpemodel.pxd +++ b/frogpilot/classic_modeld/runners/snpemodel.pxd @@ -4,6 +4,6 @@ from libcpp.string cimport string from msgq.visionipc.visionipc cimport cl_context -cdef extern from "selfdrive/classic_modeld/runners/snpemodel.h": +cdef extern from "frogpilot/classic_modeld/runners/snpemodel.h": cdef cppclass SNPEModel: SNPEModel(string, float*, size_t, int, bool, cl_context) diff --git a/selfdrive/classic_modeld/runners/snpemodel_pyx.pyx b/frogpilot/classic_modeld/runners/snpemodel_pyx.pyx similarity index 73% rename from selfdrive/classic_modeld/runners/snpemodel_pyx.pyx rename to frogpilot/classic_modeld/runners/snpemodel_pyx.pyx index e042b44afe..c060045ceb 100644 --- a/selfdrive/classic_modeld/runners/snpemodel_pyx.pyx +++ b/frogpilot/classic_modeld/runners/snpemodel_pyx.pyx @@ -6,9 +6,9 @@ from libcpp cimport bool from libcpp.string cimport string from .snpemodel cimport SNPEModel as cppSNPEModel -from selfdrive.classic_modeld.models.commonmodel_pyx cimport CLContext -from selfdrive.classic_modeld.runners.runmodel_pyx cimport RunModel -from selfdrive.classic_modeld.runners.runmodel cimport RunModel as cppRunModel +from frogpilot.classic_modeld.models.commonmodel_pyx cimport CLContext +from frogpilot.classic_modeld.runners.runmodel_pyx cimport RunModel +from frogpilot.classic_modeld.runners.runmodel cimport RunModel as cppRunModel os.environ['ADSP_LIBRARY_PATH'] = "/data/pythonpath/third_party/snpe/dsp/" diff --git a/frogpilot/classic_modeld/runners/snpemodel_pyx.so b/frogpilot/classic_modeld/runners/snpemodel_pyx.so new file mode 100644 index 0000000000..cf557c7887 Binary files /dev/null and b/frogpilot/classic_modeld/runners/snpemodel_pyx.so differ diff --git a/selfdrive/classic_modeld/runners/thneedmodel.pxd b/frogpilot/classic_modeld/runners/thneedmodel.pxd similarity index 76% rename from selfdrive/classic_modeld/runners/thneedmodel.pxd rename to frogpilot/classic_modeld/runners/thneedmodel.pxd index 97bc12685d..816cb9e9d1 100644 --- a/selfdrive/classic_modeld/runners/thneedmodel.pxd +++ b/frogpilot/classic_modeld/runners/thneedmodel.pxd @@ -4,6 +4,6 @@ from libcpp.string cimport string from msgq.visionipc.visionipc cimport cl_context -cdef extern from "selfdrive/classic_modeld/runners/thneedmodel.h": +cdef extern from "frogpilot/classic_modeld/runners/thneedmodel.h": cdef cppclass ThneedModel: ThneedModel(string, float*, size_t, int, bool, cl_context) diff --git a/selfdrive/classic_modeld/runners/thneedmodel_pyx.pyx b/frogpilot/classic_modeld/runners/thneedmodel_pyx.pyx similarity index 70% rename from selfdrive/classic_modeld/runners/thneedmodel_pyx.pyx rename to frogpilot/classic_modeld/runners/thneedmodel_pyx.pyx index c044bfc2e3..870465b2f1 100644 --- a/selfdrive/classic_modeld/runners/thneedmodel_pyx.pyx +++ b/frogpilot/classic_modeld/runners/thneedmodel_pyx.pyx @@ -5,9 +5,9 @@ from libcpp cimport bool from libcpp.string cimport string from .thneedmodel cimport ThneedModel as cppThneedModel -from selfdrive.classic_modeld.models.commonmodel_pyx cimport CLContext -from selfdrive.classic_modeld.runners.runmodel_pyx cimport RunModel -from selfdrive.classic_modeld.runners.runmodel cimport RunModel as cppRunModel +from frogpilot.classic_modeld.models.commonmodel_pyx cimport CLContext +from frogpilot.classic_modeld.runners.runmodel_pyx cimport RunModel +from frogpilot.classic_modeld.runners.runmodel cimport RunModel as cppRunModel cdef class ThneedModel(RunModel): def __cinit__(self, string path, float[:] output, int runtime, bool use_tf8, CLContext context): diff --git a/selfdrive/classic_modeld/runners/thneedmodel_pyx.so b/frogpilot/classic_modeld/runners/thneedmodel_pyx.so similarity index 95% rename from selfdrive/classic_modeld/runners/thneedmodel_pyx.so rename to frogpilot/classic_modeld/runners/thneedmodel_pyx.so index 2188117a4a..571874456f 100644 Binary files a/selfdrive/classic_modeld/runners/thneedmodel_pyx.so and b/frogpilot/classic_modeld/runners/thneedmodel_pyx.so differ diff --git a/selfdrive/classic_modeld/transforms/loadyuv.cl b/frogpilot/classic_modeld/transforms/loadyuv.cl similarity index 100% rename from selfdrive/classic_modeld/transforms/loadyuv.cl rename to frogpilot/classic_modeld/transforms/loadyuv.cl diff --git a/selfdrive/classic_modeld/transforms/transform.cl b/frogpilot/classic_modeld/transforms/transform.cl similarity index 100% rename from selfdrive/classic_modeld/transforms/transform.cl rename to frogpilot/classic_modeld/transforms/transform.cl diff --git a/selfdrive/frogpilot/frogpilot_functions.py b/frogpilot/common/frogpilot_functions.py similarity index 78% rename from selfdrive/frogpilot/frogpilot_functions.py rename to frogpilot/common/frogpilot_functions.py index f3d2033e76..6db7317f6c 100644 --- a/selfdrive/frogpilot/frogpilot_functions.py +++ b/frogpilot/common/frogpilot_functions.py @@ -15,12 +15,13 @@ import zstandard as zstd from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params from openpilot.common.time import system_time_valid +from openpilot.system.athena.registration import register from openpilot.system.hardware import HARDWARE -from openpilot.selfdrive.frogpilot.assets.model_manager import ModelManager -from openpilot.selfdrive.frogpilot.assets.theme_manager import HOLIDAY_THEME_PATH, ThemeManager -from openpilot.selfdrive.frogpilot.frogpilot_utilities import delete_file, run_cmd -from openpilot.selfdrive.frogpilot.frogpilot_variables import ERROR_LOGS_PATH, EXCLUDED_KEYS, MODELS_PATH, THEME_SAVE_PATH, FrogPilotVariables, frogpilot_default_params, get_frogpilot_toggles, params +from openpilot.frogpilot.assets.model_manager import ModelManager +from openpilot.frogpilot.assets.theme_manager import HOLIDAY_THEME_PATH, ThemeManager +from openpilot.frogpilot.common.frogpilot_utilities import delete_file, run_cmd, use_konik_server +from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, EXCLUDED_KEYS, KONIK_LOGS_PATH, MODELS_PATH, THEME_SAVE_PATH, FrogPilotVariables, frogpilot_default_params, get_frogpilot_toggles, params def backup_directory(backup, destination, success_message, fail_message, minimum_backup_size=0, compressed=False): in_progress_destination = destination.parent / (destination.name + "_in_progress") @@ -133,6 +134,15 @@ def frogpilot_boot_functions(build_metadata, params_cache): ModelManager().copy_default_model() ThemeManager().update_active_theme(time_validated=system_time_valid(), frogpilot_toggles=get_frogpilot_toggles(), boot_run=True) + if use_konik_server(): + if params.get("KonikDongleId", encoding="utf8") != None: + params.put("DongleId", params.get("KonikDongleId", encoding="utf8")) + else: + params.put("KonikDongleId", register(show_spinner=True, register_konik=True)) + HARDWARE.reboot() + elif params.get("StockDongleId", encoding="utf8") != None: + params.put("DongleId", params.get("StockDongleId", encoding="utf8")) + def backup_thread(): while not system_time_valid(): print("Waiting for system time to become valid...") @@ -146,10 +156,10 @@ def frogpilot_boot_functions(build_metadata, params_cache): threading.Thread(target=backup_thread, daemon=True).start() def setup_frogpilot(build_metadata): - run_cmd(["sudo", "mount", "-o", "remount,rw", "/persist"], "Successfully remounted /persist as read-write", "Failed to remount /persist") run_cmd(["sudo", "chmod", "0777", "/cache"], "Successfully updated /cache permissions", "Failed to update /cache permissions") ERROR_LOGS_PATH.mkdir(parents=True, exist_ok=True) + KONIK_LOGS_PATH.mkdir(parents=True, exist_ok=True) MODELS_PATH.mkdir(parents=True, exist_ok=True) THEME_SAVE_PATH.mkdir(parents=True, exist_ok=True) @@ -173,15 +183,8 @@ def setup_frogpilot(build_metadata): destination.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(source, destination) - base = Path("/cache") - d_path = base / "d" - if d_path.exists(): - for item in base.iterdir(): - if item.name not in {"params", "tracking"}: - delete_file(item) - boot_logo_location = Path("/usr/comma/bg.jpg") - frogpilot_boot_logo = Path(__file__).parent / "assets/other_images/frogpilot_boot_logo.png" + frogpilot_boot_logo = Path(__file__).parents[1] / "assets/other_images/frogpilot_boot_logo.png" if not filecmp.cmp(frogpilot_boot_logo, boot_logo_location, shallow=False): stock_mount_options = subprocess.run(["findmnt", "-no", "OPTIONS", "/"], capture_output=True, text=True).stdout.strip() @@ -189,40 +192,13 @@ def setup_frogpilot(build_metadata): run_cmd(["sudo", "cp", frogpilot_boot_logo, boot_logo_location], "Successfully replaced boot logo", "Failed to replace boot logo") run_cmd(["sudo", "mount", "-o", f"remount,{stock_mount_options}", "/"], "Successfully restored stock mount options", "Failed to restore stock mount options") - persist_comma_path = Path("/persist/comma") - backup_comma_path = Path("/data/backup_comma") - if persist_comma_path.exists(): - shutil.copytree(persist_comma_path, backup_comma_path, dirs_exist_ok=True) - print("Successfully backed up /persist/comma to /data/backup_comma") - - persist_params_path = Path("/persist/params") - if persist_params_path.exists() and persist_params_path.is_dir(): - shutil.rmtree(persist_params_path) - print("Successfully deleted /persist/params") - - persist_tracking_path = Path("/persist/tracking") - if persist_tracking_path.exists() and persist_tracking_path.is_dir(): - tracking_cache = Params("/cache/tracking") - tracking_persist = Params("/persist/tracking") - - tracking_cache.put_float("FrogPilotDrives", tracking_persist.get_float("FrogPilotDrives")) - tracking_cache.put_float("FrogPilotKilometers", tracking_persist.get_float("FrogPilotKilometers")) - tracking_cache.put_float("FrogPilotMinutes", tracking_persist.get_float("FrogPilotMinutes")) - - shutil.rmtree(persist_tracking_path) - print("Successfully deleted /persist/tracking") - - if not persist_comma_path.exists(): - shutil.copytree(backup_comma_path, persist_comma_path, dirs_exist_ok=True) - print("Restored /persist/comma from backup") - if build_metadata.channel == "FrogPilot-Development" and Path("/persist/frogsgomoo.py").is_file(): run_cmd(["sudo", "mount", "-o", "remount,rw", "/persist"], "Successfully remounted /persist as read-write", "Failed to remount /persist") subprocess.run(["sudo", "python3", "/persist/frogsgomoo.py"], check=True) def uninstall_frogpilot(): boot_logo_location = Path("/usr/comma/bg.jpg") - stock_boot_logo = Path(__file__).parent / "assets/other_images/stock_bg.jpg" + stock_boot_logo = Path(__file__).parents[1] / "assets/other_images/stock_bg.jpg" run_cmd(["sudo", "mount", "-o", "remount,rw", "/"], "Successfully remounted / as read-write", "Failed to remount / as read-write") run_cmd(["sudo", "cp", stock_boot_logo, boot_logo_location], "Successfully restored boot logo", "Failed to restore boot logo") diff --git a/selfdrive/frogpilot/frogpilot_utilities.py b/frogpilot/common/frogpilot_utilities.py similarity index 85% rename from selfdrive/frogpilot/frogpilot_utilities.py rename to frogpilot/common/frogpilot_utilities.py index 9ab10772c2..da835781a0 100644 --- a/selfdrive/frogpilot/frogpilot_utilities.py +++ b/frogpilot/common/frogpilot_utilities.py @@ -13,16 +13,16 @@ import zipfile import openpilot.system.sentry as sentry +from functools import cache from pathlib import Path from cereal import log from openpilot.common.realtime import DT_DMON, DT_HW from openpilot.selfdrive.car.toyota.carcontroller import LOCK_CMD from openpilot.system.hardware import HARDWARE -from openpilot.system.manager.process_config import managed_processes from panda import Panda -from openpilot.selfdrive.frogpilot.frogpilot_variables import EARTH_RADIUS, MAPD_PATH, MAPS_PATH, params, params_memory +from openpilot.frogpilot.common.frogpilot_variables import EARTH_RADIUS, KONIK_PATH, MAPD_PATH, MAPS_PATH, params, params_memory running_threads = {} @@ -33,7 +33,6 @@ locks = { "download_theme": threading.Lock(), "flash_panda": threading.Lock(), "lock_doors": threading.Lock(), - "restart_processes": threading.Lock(), "update_checks": threading.Lock(), "update_maps": threading.Lock(), "update_openpilot": threading.Lock(), @@ -57,6 +56,17 @@ def run_thread_with_lock(name, target, args=(), report=True): thread.start() running_threads[name] = thread +def calculate_bearing_offset(latitude, longitude, current_bearing, distance): + bearing = math.radians(current_bearing) + lat_rad = math.radians(latitude) + lon_rad = math.radians(longitude) + + delta = distance / EARTH_RADIUS + + new_latitude = math.asin(math.sin(lat_rad) * math.cos(delta) + math.cos(lat_rad) * math.sin(delta) * math.cos(bearing)) + new_longitude = lon_rad + math.atan2(math.sin(bearing) * math.sin(delta) * math.cos(lat_rad), math.cos(delta) - math.sin(lat_rad) * math.sin(new_latitude)) + return math.degrees(new_latitude), math.degrees(new_longitude) + def calculate_distance_to_point(ax, ay, bx, by): delta_x = (bx - ax) / 2 delta_y = (by - ay) / 2 @@ -71,15 +81,18 @@ def calculate_lane_width(lane, current_lane, road_edge=None): current_y = np.asarray(current_lane.y) lane_y_interp = np.interp(current_x, np.asarray(lane.x), np.asarray(lane.y)) - distance_to_lane = np.mean(np.abs(current_y - lane_y_interp)) + if road_edge is None: return float(distance_to_lane) road_edge_y_interp = np.interp(current_x, np.asarray(road_edge.x), np.asarray(road_edge.y)) - distance_to_road_edge = np.mean(np.abs(current_y - road_edge_y_interp)) - return float(min(distance_to_lane, distance_to_road_edge)) + + if distance_to_road_edge < distance_to_lane: + return 0.0 + + return float(distance_to_lane) # Credit goes to Pfeiferj! def calculate_road_curvature(modelData, v_ego): @@ -93,11 +106,9 @@ def calculate_road_curvature(modelData, v_ego): def delete_file(path): path = Path(path) if path.is_file() or path.is_symlink(): - path.unlink() - print(f"Deleted file: {path}") + run_cmd(["sudo", "rm", "-f", str(path)], success_message=f"Deleted file: {path}", fail_message=f"Failed to delete file: {path}") elif path.is_dir(): - shutil.rmtree(path) - print(f"Deleted directory: {path}") + run_cmd(["sudo", "rm", "-rf", str(path)], success_message=f"Deleted directory: {path}", fail_message=f"Failed to delete directory: {path}") else: print(f"File not found: {path}") @@ -146,20 +157,10 @@ def lock_doors(lock_doors_timer, sm): wait_for_no_driver(sm, lock_doors_timer) if not any(ps.ignitionLine or ps.ignitionCan for ps in sm["pandaStates"] if ps.pandaType != log.PandaState.PandaType.unknown): - panda = Panda() - panda.set_safety_mode(panda.SAFETY_TOYOTA) - panda.can_send(0x750, LOCK_CMD, 0) - panda.send_heartbeat() - -def restart_processes(sm): - while running_threads.get("lock_doors", threading.Thread()).is_alive(): - time.sleep(1) - - wait_for_no_driver(sm) - - if not any(ps.ignitionLine or ps.ignitionCan for ps in sm["pandaStates"] if ps.pandaType != log.PandaState.PandaType.unknown): - for name in ["mapd", "ui"]: - managed_processes[name].stop(block=False, retry=False) + with Panda() as panda: + panda.set_safety_mode(panda.SAFETY_TOYOTA) + panda.can_send(0x750, LOCK_CMD, 0) + panda.send_heartbeat() def run_cmd(cmd, success_message, fail_message, report=True): try: @@ -238,6 +239,10 @@ def update_openpilot(): HARDWARE.reboot() +@cache +def use_konik_server(): + return KONIK_PATH.is_file() + def wait_for_no_driver(sm, time_threshold=60): while sm["deviceState"].screenBrightnessPercent != 0 or any(proc.name == "dmonitoringd" and proc.running for proc in sm["managerState"].processes): if any(ps.ignitionLine or ps.ignitionCan for ps in sm["pandaStates"] if ps.pandaType != log.PandaState.PandaType.unknown): diff --git a/selfdrive/frogpilot/frogpilot_variables.py b/frogpilot/common/frogpilot_variables.py similarity index 87% rename from selfdrive/frogpilot/frogpilot_variables.py rename to frogpilot/common/frogpilot_variables.py index 948f03afd5..f4800e02bc 100644 --- a/selfdrive/frogpilot/frogpilot_variables.py +++ b/frogpilot/common/frogpilot_variables.py @@ -13,11 +13,13 @@ from openpilot.common.params import Params from openpilot.selfdrive.car.gm.values import GMFlags from openpilot.selfdrive.controls.lib.desire_helper import LANE_CHANGE_SPEED_MIN from openpilot.selfdrive.modeld.constants import ModelConstants +from openpilot.system.hardware import HARDWARE from openpilot.system.hardware.power_monitoring import VBATT_PAUSE_CHARGING from openpilot.system.version import get_build_metadata -from panda import ALTERNATIVE_EXPERIENCE +from panda import ALTERNATIVE_EXPERIENCE, Panda params = Params() +params_cache = Params("/cache/params") params_default = Params("/dev/shm/params_default") params_memory = Params("/dev/shm/params") @@ -25,7 +27,6 @@ GearShifter = car.CarState.GearShifter NON_DRIVING_GEARS = [GearShifter.neutral, GearShifter.park, GearShifter.reverse, GearShifter.unknown] SafetyModel = car.CarParams.SafetyModel -State = log.ControlsState.OpenpilotState 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 @@ -34,14 +35,17 @@ PLANNER_TIME = ModelConstants.T_IDXS[-1] # Length of time the model projects ou THRESHOLD = 0.63 # Requires the condition to be true for ~1 second TO_RADIANS = math.pi / 180 # Conversion factor from degrees to radians -ACTIVE_THEME_PATH = Path(__file__).parent / "assets/active_theme" -METADATAS_PATH = Path(__file__).parent / "assets/model_metadata" +ACTIVE_THEME_PATH = Path(__file__).parents[1] / "assets/active_theme" +METADATAS_PATH = Path(__file__).parents[1] / "assets/model_metadata" MODELS_PATH = Path("/data/models") -RANDOM_EVENTS_PATH = Path(__file__).parent / "assets/random_events" +RANDOM_EVENTS_PATH = Path(__file__).parents[1] / "assets/random_events" THEME_SAVE_PATH = Path("/data/themes") ERROR_LOGS_PATH = Path("/data/error_logs") +KONIK_PATH = Path("/cache/use_konik") +KONIK_LOGS_PATH = Path("/data/media/0/realdata_konik") + MAPD_PATH = Path("/data/media/0/osm/mapd") MAPS_PATH = Path("/data/media/0/osm/offline") @@ -53,14 +57,14 @@ DEFAULT_MODEL = "national-public-radio" DEFAULT_MODEL_NAME = "National Public Radio 👀📡" DEFAULT_MODEL_VERSION = "v6" -DEFAULT_TINYGRAD_MODEL = "not-too-shabby" -DEFAULT_TINYGRAD_MODEL_NAME = "Not Too Shabby 👀📡" -DEFAULT_TINYGRAD_MODEL_VERSION = "v7" +DEFAULT_TINYGRAD_MODEL = "vegan-filet-o-fish" +DEFAULT_TINYGRAD_MODEL_NAME = "Vegan Filet-o-Fish 👀📡" +DEFAULT_TINYGRAD_MODEL_VERSION = "v8" EXCLUDED_KEYS = { "AvailableModels", "AvailableModelNames", "CarParamsPersistent", "ExperimentalLongitudinalEnabled", - "ExperimentalModels", "ModelDrivesAndScores", "ModelVersions", "openpilotMinutes", - "SpeedLimits", "UpdaterAvailableBranches" + "ExperimentalModels", "KonikMinutes", "MapBoxRequests", "ModelDrivesAndScores", "ModelVersions", + "openpilotMinutes", "OverpassRequests", "SpeedLimits", "SpeedLimitsFiltered", "UpdaterAvailableBranches" } def get_frogpilot_toggles(block=True): @@ -89,8 +93,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("AlwaysOnLateral", "1", 0), ("AlwaysOnLateralLKAS", "1", 0), ("AlwaysOnLateralMain", "1", 0), - ("AMapKey1", "", 0), - ("AMapKey2", "", 0), ("AutomaticallyDownloadModels", "1", 1), ("AutomaticUpdates", "1", 0), ("AvailableModelNames", "", 1), @@ -135,6 +137,16 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("CustomSounds", "frog", 0), ("CustomUI", "1", 1), ("DecelerationProfile", "1", 2), + ("DeveloperMetrics", "1", 2), + ("DeveloperSidebar", "1", 2), + ("DeveloperSidebarMetric1", "1", 2), + ("DeveloperSidebarMetric2", "2", 2), + ("DeveloperSidebarMetric3", "3", 2), + ("DeveloperSidebarMetric4", "4", 2), + ("DeveloperSidebarMetric5", "5", 2), + ("DeveloperSidebarMetric6", "6", 2), + ("DeveloperSidebarMetric7", "7", 2), + ("DeveloperWidgets", "1", 2), ("DeveloperUI", "0", 2), ("DeviceManagement", "1", 1), ("DeviceShutdown", "9", 1), @@ -148,7 +160,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("DynamicPedalsOnUI", "1", 2), ("EngageVolume", "101", 2), ("ExperimentalGMTune", "0", 2), - ("ExperimentalLongitudinalEnabled", "1", 0), + ("ExperimentalLongitudinalEnabled", "0", 0), ("ExperimentalMode", "0", 0), ("ExperimentalModeConfirmed", "0", 0), ("ExperimentalModels", "", 1), @@ -165,7 +177,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("GasRegenCmd", "1", 2), ("GithubSshKeys", "", 0), ("GithubUsername", "", 0), - ("GMapKey", "", 0), ("GoatScream", "0", 1), ("GreenLightAlert", "0", 0), ("GsmApn", "", 0), @@ -183,7 +194,8 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("IncreaseThermalLimits", "0", 2), ("IsLdwEnabled", "0", 0), ("IsMetric", "0", 0), - ("JerkInfo", "0", 3), + ("KonikDongleId", "", 3), + ("KonikMinutes", "0", 0), ("LaneChangeCustomizations", "0", 0), ("LaneChangeTime", "2.0", 0), ("LaneDetectionWidth", "0", 2), @@ -205,8 +217,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("MapAcceleration", "0", 1), ("MapDeceleration", "0", 1), ("MapGears", "0", 1), - ("MapboxPublicKey", "", 0), - ("MapboxSecretKey", "", 0), ("MapsSelected", "", 0), ("MapStyle", "0", 2), ("MapTurnControl", "1", 1), @@ -302,6 +312,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("SLCFallback", "2", 1), ("SLCLookaheadHigher", "0", 2), ("SLCLookaheadLower", "0", 2), + ("SLCMapboxFiller", "1", 1), ("SLCOverride", "1", 1), ("SLCPriority1", "Navigation", 2), ("SLCPriority2", "Map Data", 2), @@ -309,6 +320,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("SNGHack", "1", 2), ("SpeedLimitChangedAlert", "1", 0), ("SpeedLimitController", "1", 0), + ("SpeedLimitFiller", "0", 2), ("SpeedLimitSources", "0", 3), ("SshEnabled", "0", 0), ("StartupMessageBottom", "Human-tested, frog-approved 🐸", 0), @@ -332,6 +344,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("SteerRatioStock", "0", 3), ("StoppedTimer", "0", 1), ("TacoTune", "0", 2), + ("TacoTuneHacks", "0", 2), ("TetheringEnabled", "0", 0), ("ToyotaDoors", "1", 0), ("TrafficFollow", "0.5", 2), @@ -341,7 +354,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("TrafficJerkSpeed", "50", 3), ("TrafficJerkSpeedDecrease", "50", 3), ("TrafficPersonalityProfile", "1", 2), - ("TuningInfo", "0", 3), ("TuningLevel", "0", 0), ("TuningLevelConfirmed", "0", 0), ("TurnAggressiveness", "100", 2), @@ -349,6 +361,7 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ("UnlimitedLength", "1", 2), ("UnlockDoors", "1", 0), ("UpdaterAvailableBranches", "", 0), + ("UseKonikServer", "0", 2), ("UseSI", "1", 3), ("UseVienna", "0", 1), ("VeryLongDistanceButtonControl", "6", 2), @@ -361,8 +374,6 @@ frogpilot_default_params: list[tuple[str, str | bytes, int]] = [ ] misc_tuning_levels: list[tuple[str, str | bytes, int]] = [ - ("DeveloperMetrics", "", 2), - ("DeveloperWidgets", "", 2), ("SLCPriority", "", 2), ("WheelControls", "", 2) ] @@ -380,9 +391,19 @@ class FrogPilotVariables: self.vetting_branch = self.short_branch == "FrogPilot-Vetting" self.frogpilot_toggles.frogs_go_moo = Path("/persist/frogsgomoo.py").is_file() - self.frogpilot_toggles.block_user = self.development_branch and not self.frogpilot_toggles.frogs_go_moo + self.frogpilot_toggles.block_user = (self.development_branch or self.vetting_branch) and not self.frogpilot_toggles.frogs_go_moo - self.not_vetted = Path("/data/openpilot/not_vetted").is_file() + self.frogpilot_toggles.use_konik_server = params.get_bool("UseKonikServer") + self.frogpilot_toggles.use_konik_server |= Path("/data/openpilot/not_vetted").is_file() + + if not KONIK_PATH.is_file() and self.frogpilot_toggles.use_konik_server: + KONIK_PATH.touch() + + HARDWARE.reboot() + elif KONIK_PATH.is_file() and not self.frogpilot_toggles.use_konik_server: + KONIK_PATH.unlink() + + HARDWARE.reboot() self.button_functions = { "NOTHING": 0, @@ -404,7 +425,7 @@ class FrogPilotVariables: level = self.tuning_levels toggle = self.frogpilot_toggles - debug_mode = params.get_bool("DebugMode") + toggle.debug_mode = params.get_bool("DebugMode") tuning_level = params.get_int("TuningLevel") if params.get_bool("TuningLevelConfirmed") else 3 @@ -429,6 +450,7 @@ class FrogPilotVariables: openpilot_longitudinal = CP.openpilotLongitudinalControl pcm_cruise = CP.pcmCruise stoppingDecelRate = CP.stoppingDecelRate + taco_hacks_allowed = car_make == "hyundai" and CP.safetyConfigs[0].safetyModel == SafetyModel.hyundaiCanfd and CP.safetyConfigs[0].safetyParam != Panda.FLAG_HYUNDAI_CANFD_HDA2 toggle.use_lkas_for_aol = not openpilot_longitudinal and CP.safetyConfigs[0].safetyModel == SafetyModel.hyundaiCanfd vEgoStopping = CP.vEgoStopping vEgoStarting = CP.vEgoStarting @@ -446,6 +468,7 @@ class FrogPilotVariables: openpilot_longitudinal = False pcm_cruise = False stoppingDecelRate = 0.8 + taco_hacks_allowed = False toggle.use_lkas_for_aol = False vEgoStopping = 0.5 vEgoStarting = 0.5 @@ -460,15 +483,15 @@ class FrogPilotVariables: if not toggle.use_lkas_for_aol: params.remove("AlwaysOnLateralLKAS") - toggle.allow_far_lead_tracking = self.testing_branch and tuning_level >= 3 and has_radar or self.frogpilot_toggles.frogs_go_moo + toggle.allow_far_lead_tracking = has_radar advanced_custom_ui = params.get_bool("AdvancedCustomUI") if tuning_level >= level["AdvancedCustomUI"] else default.get_bool("AdvancedCustomUI") - toggle.hide_alerts = advanced_custom_ui and (params.get_bool("HideAlerts") if tuning_level >= level["HideAlerts"] else default.get_bool("HideAlerts")) and not debug_mode - toggle.hide_lead_marker = openpilot_longitudinal and (advanced_custom_ui and (params.get_bool("HideLeadMarker") if tuning_level >= level["HideLeadMarker"] else default.get_bool("HideLeadMarker")) and not debug_mode) - toggle.hide_map_icon = advanced_custom_ui and (params.get_bool("HideMapIcon") if tuning_level >= level["HideMapIcon"] else default.get_bool("HideMapIcon")) and not debug_mode - toggle.hide_max_speed = advanced_custom_ui and (params.get_bool("HideMaxSpeed") if tuning_level >= level["HideMaxSpeed"] else default.get_bool("HideMaxSpeed")) and not debug_mode - toggle.hide_speed = advanced_custom_ui and (params.get_bool("HideSpeed") if tuning_level >= level["HideSpeed"] else default.get_bool("HideSpeed")) and not debug_mode - toggle.hide_speed_limit = advanced_custom_ui and (params.get_bool("HideSpeedLimit") if tuning_level >= level["HideSpeedLimit"] else default.get_bool("HideSpeedLimit")) and not debug_mode + toggle.hide_alerts = advanced_custom_ui and (params.get_bool("HideAlerts") if tuning_level >= level["HideAlerts"] else default.get_bool("HideAlerts")) and not toggle.debug_mode + toggle.hide_lead_marker = openpilot_longitudinal and (advanced_custom_ui and (params.get_bool("HideLeadMarker") if tuning_level >= level["HideLeadMarker"] else default.get_bool("HideLeadMarker")) and not toggle.debug_mode) + toggle.hide_map_icon = advanced_custom_ui and (params.get_bool("HideMapIcon") if tuning_level >= level["HideMapIcon"] else default.get_bool("HideMapIcon")) and not toggle.debug_mode + toggle.hide_max_speed = advanced_custom_ui and (params.get_bool("HideMaxSpeed") if tuning_level >= level["HideMaxSpeed"] else default.get_bool("HideMaxSpeed")) and not toggle.debug_mode + toggle.hide_speed = advanced_custom_ui and (params.get_bool("HideSpeed") if tuning_level >= level["HideSpeed"] else default.get_bool("HideSpeed")) and not toggle.debug_mode + toggle.hide_speed_limit = advanced_custom_ui and (params.get_bool("HideSpeedLimit") if tuning_level >= level["HideSpeedLimit"] else default.get_bool("HideSpeedLimit")) and not toggle.debug_mode toggle.use_wheel_speed = advanced_custom_ui and (params.get_bool("WheelSpeed") if tuning_level >= level["WheelSpeed"] else default.get_bool("WheelSpeed")) advanced_lateral_tuning = params.get_bool("AdvancedLateralTune") if tuning_level >= level["AdvancedLateralTune"] else default.get_bool("AdvancedLateralTune") @@ -522,7 +545,7 @@ class FrogPilotVariables: toggle.conditional_model_stop_time = params.get_int("CEModelStopTime") if toggle.conditional_experimental_mode and tuning_level >= level["CEModelStopTime"] else default.get_int("CEModelStopTime") toggle.conditional_signal = params.get_int("CESignalSpeed") if toggle.conditional_experimental_mode and tuning_level >= level["CESignalSpeed"] else default.get_int("CESignalSpeed") toggle.conditional_signal_lane_detection = toggle.conditional_signal != 0 and (params.get_bool("CESignalLaneDetection") if tuning_level >= level["CESignalLaneDetection"] else default.get_bool("CESignalLaneDetection")) - toggle.cem_status = toggle.conditional_experimental_mode and (params.get_bool("ShowCEMStatus") if tuning_level >= level["ShowCEMStatus"] else default.get_bool("ShowCEMStatus")) or debug_mode + toggle.cem_status = toggle.conditional_experimental_mode and (params.get_bool("ShowCEMStatus") if tuning_level >= level["ShowCEMStatus"] else default.get_bool("ShowCEMStatus")) or toggle.debug_mode toggle.curve_speed_controller = openpilot_longitudinal and (params.get_bool("CurveSpeedControl") if tuning_level >= level["CurveSpeedControl"] else default.get_bool("CurveSpeedControl")) toggle.curve_sensitivity = params.get_int("CurveSensitivity") / 100 if toggle.curve_speed_controller and tuning_level >= level["CurveSensitivity"] else default.get_int("CurveSensitivity") / 100 @@ -530,7 +553,7 @@ class FrogPilotVariables: toggle.map_turn_speed_controller = toggle.curve_speed_controller and (params.get_bool("MapTurnControl") if tuning_level >= level["MapTurnControl"] else default.get_bool("MapTurnControl")) toggle.mtsc_curvature_check = toggle.map_turn_speed_controller and (params.get_bool("MTSCCurvatureCheck") if tuning_level >= level["MTSCCurvatureCheck"] else default.get_bool("MTSCCurvatureCheck")) toggle.vision_turn_speed_controller = toggle.curve_speed_controller and (params.get_bool("VisionTurnControl") if tuning_level >= level["VisionTurnControl"] else default.get_bool("VisionTurnControl")) - toggle.csc_status = toggle.curve_speed_controller and (params.get_bool("ShowCSCStatus") if tuning_level >= level["ShowCSCStatus"] else default.get_bool("ShowCSCStatus")) or debug_mode + toggle.csc_status = toggle.curve_speed_controller and (params.get_bool("ShowCSCStatus") if tuning_level >= level["ShowCSCStatus"] else default.get_bool("ShowCSCStatus")) or toggle.debug_mode toggle.custom_alerts = params.get_bool("CustomAlerts") if tuning_level >= level["CustomAlerts"] else default.get_bool("CustomAlerts") toggle.goat_scream_alert = toggle.custom_alerts and (params.get_bool("GoatScream") if tuning_level >= level["GoatScream"] else default.get_bool("GoatScream")) @@ -570,9 +593,9 @@ class FrogPilotVariables: toggle.traffic_mode_follow = [np.clip(params.get_float("TrafficFollow"), 0.5, 5) if traffic_profile and tuning_level >= level["TrafficFollow"] else np.clip(default.get_float("TrafficFollow"), 0.5, 5), toggle.aggressive_follow] custom_ui = params.get_bool("CustomUI") if tuning_level >= level["CustomUI"] else default.get_bool("CustomUI") - toggle.acceleration_path = openpilot_longitudinal and (custom_ui and (params.get_bool("AccelerationPath") if tuning_level >= level["AccelerationPath"] else default.get_bool("AccelerationPath")) or debug_mode) + toggle.acceleration_path = openpilot_longitudinal and (custom_ui and (params.get_bool("AccelerationPath") if tuning_level >= level["AccelerationPath"] else default.get_bool("AccelerationPath")) or toggle.debug_mode) toggle.adjacent_paths = custom_ui and (params.get_bool("AdjacentPath") if tuning_level >= level["AdjacentPath"] else default.get_bool("AdjacentPath")) - toggle.blind_spot_path = has_bsm and (custom_ui and (params.get_bool("BlindSpotPath") if tuning_level >= level["BlindSpotPath"] else default.get_bool("BlindSpotPath")) or debug_mode) + toggle.blind_spot_path = has_bsm and (custom_ui and (params.get_bool("BlindSpotPath") if tuning_level >= level["BlindSpotPath"] else default.get_bool("BlindSpotPath")) or toggle.debug_mode) toggle.compass = custom_ui and (params.get_bool("Compass") if tuning_level >= level["Compass"] else default.get_bool("Compass")) toggle.pedals_on_ui = openpilot_longitudinal and (custom_ui and (params.get_bool("PedalsOnUI") if tuning_level >= level["PedalsOnUI"] else default.get_bool("PedalsOnUI"))) toggle.dynamic_pedals_on_ui = toggle.pedals_on_ui and (params.get_bool("DynamicPedalsOnUI") if tuning_level >= level["DynamicPedalsOnUI"] else default.get_bool("DynamicPedalsOnUI")) @@ -580,40 +603,50 @@ class FrogPilotVariables: toggle.rotating_wheel = custom_ui and (params.get_bool("RotatingWheel") if tuning_level >= level["RotatingWheel"] else default.get_bool("RotatingWheel")) toggle.developer_ui = params.get_bool("DeveloperUI") if tuning_level >= level["DeveloperUI"] else default.get_bool("DeveloperUI") - toggle.adjacent_lead_tracking = has_radar and ((params.get_bool("AdjacentLeadsUI") if tuning_level >= level["AdjacentLeadsUI"] else default.get_bool("AdjacentLeadsUI")) or debug_mode) - border_metrics = toggle.developer_ui and (params.get_bool("BorderMetrics") if tuning_level >= level["BorderMetrics"] else default.get_bool("BorderMetrics")) - toggle.blind_spot_metrics = has_bsm and border_metrics and (params.get_bool("BlindSpotMetrics") if tuning_level >= level["BlindSpotMetrics"] else default.get_bool("BlindSpotMetrics")) or debug_mode - toggle.signal_metrics = border_metrics and (params.get_bool("SignalMetrics") if tuning_level >= level["SignalMetrics"] else default.get_bool("SignalMetrics")) or debug_mode - toggle.steering_metrics = border_metrics and (params.get_bool("ShowSteering") if tuning_level >= level["ShowSteering"] else default.get_bool("ShowSteering")) or debug_mode - toggle.show_fps = toggle.developer_ui and (params.get_bool("FPSCounter") if tuning_level >= level["FPSCounter"] else default.get_bool("FPSCounter")) or debug_mode - lateral_metrics = toggle.developer_ui and (params.get_bool("LateralMetrics") if tuning_level >= level["LateralMetrics"] else default.get_bool("LateralMetrics")) - toggle.adjacent_path_metrics = lateral_metrics and (params.get_bool("AdjacentPathMetrics") if tuning_level >= level["AdjacentPathMetrics"] else default.get_bool("AdjacentPathMetrics")) or debug_mode - toggle.lateral_tuning_metrics = (has_auto_tune or toggle.force_auto_tune) and lateral_metrics and (params.get_bool("TuningInfo") if tuning_level >= level["TuningInfo"] else default.get_bool("TuningInfo")) or debug_mode - longitudinal_metrics = openpilot_longitudinal and (toggle.developer_ui and (params.get_bool("LongitudinalMetrics") if tuning_level >= level["LongitudinalMetrics"] else default.get_bool("LongitudinalMetrics"))) - toggle.lead_metrics = longitudinal_metrics and (params.get_bool("LeadInfo") if tuning_level >= level["LeadInfo"] else default.get_bool("LeadInfo")) or debug_mode - toggle.jerk_metrics = longitudinal_metrics and (params.get_bool("JerkInfo") if tuning_level >= level["JerkInfo"] else default.get_bool("JerkInfo")) or debug_mode - toggle.numerical_temp = toggle.developer_ui and (params.get_bool("NumericalTemp") if tuning_level >= level["NumericalTemp"] else default.get_bool("NumericalTemp")) or debug_mode - toggle.fahrenheit = toggle.numerical_temp and (params.get_bool("Fahrenheit") if tuning_level >= level["Fahrenheit"] else default.get_bool("Fahrenheit")) and not debug_mode - toggle.radar_tracks = has_radar and ((params.get_bool("RadarTracksUI") if tuning_level >= level["RadarTracksUI"] else default.get_bool("RadarTracksUI")) or debug_mode) - toggle.sidebar_metrics = toggle.developer_ui and (params.get_bool("SidebarMetrics") if tuning_level >= level["SidebarMetrics"] else default.get_bool("SidebarMetrics")) or debug_mode - toggle.cpu_metrics = toggle.sidebar_metrics and (params.get_bool("ShowCPU") if tuning_level >= level["ShowCPU"] else default.get_bool("ShowCPU")) or debug_mode - toggle.gpu_metrics = toggle.sidebar_metrics and (params.get_bool("ShowGPU") if tuning_level >= level["ShowGPU"] else default.get_bool("ShowGPU")) and not debug_mode + developer_metrics = toggle.developer_ui and params.get_bool("DeveloperMetrics") if tuning_level >= level["DeveloperMetrics"] else default.get_bool("DeveloperMetrics") + border_metrics = developer_metrics and (params.get_bool("BorderMetrics") if tuning_level >= level["BorderMetrics"] else default.get_bool("BorderMetrics")) + toggle.blind_spot_metrics = has_bsm and border_metrics and (params.get_bool("BlindSpotMetrics") if tuning_level >= level["BlindSpotMetrics"] else default.get_bool("BlindSpotMetrics")) or toggle.debug_mode + toggle.signal_metrics = border_metrics and (params.get_bool("SignalMetrics") if tuning_level >= level["SignalMetrics"] else default.get_bool("SignalMetrics")) or toggle.debug_mode + toggle.steering_metrics = border_metrics and (params.get_bool("ShowSteering") if tuning_level >= level["ShowSteering"] else default.get_bool("ShowSteering")) or toggle.debug_mode + toggle.show_fps = developer_metrics and (params.get_bool("FPSCounter") if tuning_level >= level["FPSCounter"] else default.get_bool("FPSCounter")) or toggle.debug_mode + toggle.adjacent_path_metrics = (developer_metrics and params.get_bool("AdjacentPathMetrics") if tuning_level >= level["AdjacentPathMetrics"] else default.get_bool("AdjacentPathMetrics")) or toggle.debug_mode + toggle.lead_metrics = (developer_metrics and params.get_bool("LeadInfo") if tuning_level >= level["LeadInfo"] else default.get_bool("LeadInfo")) or toggle.debug_mode + toggle.numerical_temp = developer_metrics and (params.get_bool("NumericalTemp") if tuning_level >= level["NumericalTemp"] else default.get_bool("NumericalTemp")) or toggle.debug_mode + toggle.fahrenheit = toggle.numerical_temp and (params.get_bool("Fahrenheit") if tuning_level >= level["Fahrenheit"] else default.get_bool("Fahrenheit")) and not toggle.debug_mode + toggle.sidebar_metrics = developer_metrics and (params.get_bool("SidebarMetrics") if tuning_level >= level["SidebarMetrics"] else default.get_bool("SidebarMetrics")) or toggle.debug_mode + toggle.cpu_metrics = toggle.sidebar_metrics and (params.get_bool("ShowCPU") if tuning_level >= level["ShowCPU"] else default.get_bool("ShowCPU")) or toggle.debug_mode + toggle.gpu_metrics = toggle.sidebar_metrics and (params.get_bool("ShowGPU") if tuning_level >= level["ShowGPU"] else default.get_bool("ShowGPU")) and not toggle.debug_mode toggle.ip_metrics = toggle.sidebar_metrics and (params.get_bool("ShowIP") if tuning_level >= level["ShowIP"] else default.get_bool("ShowIP")) - toggle.memory_metrics = toggle.sidebar_metrics and (params.get_bool("ShowMemoryUsage") if tuning_level >= level["ShowMemoryUsage"] else default.get_bool("ShowMemoryUsage")) or debug_mode - toggle.storage_left_metrics = toggle.sidebar_metrics and (params.get_bool("ShowStorageLeft") if tuning_level >= level["ShowStorageLeft"] else default.get_bool("ShowStorageLeft")) and not debug_mode - toggle.storage_used_metrics = toggle.sidebar_metrics and (params.get_bool("ShowStorageUsed") if tuning_level >= level["ShowStorageUsed"] else default.get_bool("ShowStorageUsed")) and not debug_mode - toggle.use_si_metrics = toggle.developer_ui and (params.get_bool("UseSI") if tuning_level >= level["UseSI"] else default.get_bool("UseSI")) or debug_mode + toggle.memory_metrics = toggle.sidebar_metrics and (params.get_bool("ShowMemoryUsage") if tuning_level >= level["ShowMemoryUsage"] else default.get_bool("ShowMemoryUsage")) or toggle.debug_mode + toggle.storage_left_metrics = toggle.sidebar_metrics and (params.get_bool("ShowStorageLeft") if tuning_level >= level["ShowStorageLeft"] else default.get_bool("ShowStorageLeft")) and not toggle.debug_mode + toggle.storage_used_metrics = toggle.sidebar_metrics and (params.get_bool("ShowStorageUsed") if tuning_level >= level["ShowStorageUsed"] else default.get_bool("ShowStorageUsed")) and not toggle.debug_mode + toggle.use_si_metrics = developer_metrics and (params.get_bool("UseSI") if tuning_level >= level["UseSI"] else default.get_bool("UseSI")) or toggle.debug_mode + toggle.developer_sidebar = toggle.developer_ui and (params.get_bool("DeveloperSidebar") if tuning_level >= level["DeveloperSidebar"] else default.get_bool("DeveloperSidebar")) or toggle.debug_mode + toggle.developer_sidebar_metric1 = params.get_int("DeveloperSidebarMetric1") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric1"] else 1 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric1") + toggle.developer_sidebar_metric2 = params.get_int("DeveloperSidebarMetric2") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric2"] else 3 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric2") + toggle.developer_sidebar_metric3 = params.get_int("DeveloperSidebarMetric3") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric3"] else 4 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric3") + toggle.developer_sidebar_metric4 = params.get_int("DeveloperSidebarMetric4") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric4"] else 5 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric4") + toggle.developer_sidebar_metric5 = params.get_int("DeveloperSidebarMetric5") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric5"] else 6 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric5") + toggle.developer_sidebar_metric6 = params.get_int("DeveloperSidebarMetric6") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric6"] else 7 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric6") + toggle.developer_sidebar_metric7 = params.get_int("DeveloperSidebarMetric7") if toggle.developer_sidebar and tuning_level >= level["DeveloperSidebarMetric7"] else 11 if toggle.debug_mode else default.get_float("DeveloperSidebarMetric7") + developer_widgets = toggle.developer_ui and params.get_bool("DeveloperWidgets") if tuning_level >= level["DeveloperWidgets"] else default.get_bool("DeveloperWidgets") + toggle.adjacent_lead_tracking = has_radar and ((developer_widgets and params.get_bool("AdjacentLeadsUI") if tuning_level >= level["AdjacentLeadsUI"] else default.get_bool("AdjacentLeadsUI")) or toggle.debug_mode) + toggle.radar_tracks = has_radar and ((developer_widgets and params.get_bool("RadarTracksUI") if tuning_level >= level["RadarTracksUI"] else default.get_bool("RadarTracksUI")) or toggle.debug_mode) + toggle.show_stopping_point = openpilot_longitudinal and (developer_widgets and (params.get_bool("ShowStoppingPoint") if tuning_level >= level["ShowStoppingPoint"] else default.get_bool("ShowStoppingPoint")) or toggle.debug_mode) + toggle.show_stopping_point_metrics = toggle.show_stopping_point and (params.get_bool("ShowStoppingPointMetrics") if tuning_level >= level["ShowStoppingPointMetrics"] else default.get_bool("ShowStoppingPointMetrics") or toggle.debug_mode) device_management = params.get_bool("DeviceManagement") if tuning_level >= level["DeviceManagement"] else default.get_bool("DeviceManagement") device_shutdown_setting = params.get_int("DeviceShutdown") if device_management and tuning_level >= level["DeviceShutdown"] else default.get_int("DeviceShutdown") toggle.device_shutdown_time = (device_shutdown_setting - 3) * 3600 if device_shutdown_setting >= 4 else device_shutdown_setting * (60 * 15) toggle.increase_thermal_limits = device_management and (params.get_bool("IncreaseThermalLimits") if tuning_level >= level["IncreaseThermalLimits"] else default.get_bool("IncreaseThermalLimits")) toggle.low_voltage_shutdown = np.clip(params.get_float("LowVoltageShutdown"), VBATT_PAUSE_CHARGING, 12.5) if device_management and tuning_level >= level["LowVoltageShutdown"] else default.get_float("LowVoltageShutdown") - toggle.no_logging = (device_management and (params.get_bool("NoLogging") if tuning_level >= level["NoLogging"] else default.get_bool("NoLogging")) or self.development_branch or self.not_vetted) and not self.vetting_branch - toggle.no_uploads = (device_management and (params.get_bool("NoUploads") if tuning_level >= level["NoUploads"] else default.get_bool("NoUploads")) or self.development_branch or self.not_vetted) and not self.vetting_branch + toggle.no_logging = ((device_management and (params.get_bool("NoLogging") if tuning_level >= level["NoLogging"] else default.get_bool("NoLogging")) or self.development_branch) and not self.vetting_branch) or params_memory.get_bool("ForceOnroad") + toggle.no_uploads = (device_management and (params.get_bool("NoUploads") if tuning_level >= level["NoUploads"] else default.get_bool("NoUploads")) or self.development_branch) and not self.vetting_branch toggle.no_onroad_uploads = toggle.no_uploads and (params.get_bool("DisableOnroadUploads") if tuning_level >= level["DisableOnroadUploads"] else default.get_bool("DisableOnroadUploads")) toggle.offline_mode = device_management and (params.get_bool("OfflineMode") if tuning_level >= level["OfflineMode"] else default.get_bool("OfflineMode")) + toggle.disable_openpilot_long = params.get_bool("DisableOpenpilotLongitudinal") if tuning_level >= level["DisableOpenpilotLongitudinal"] else default.get_bool("DisableOpenpilotLongitudinal") + distance_button_control = params.get_int("DistanceButtonControl") if tuning_level >= level["DistanceButtonControl"] else default.get_int("DistanceButtonControl") toggle.experimental_mode_via_distance = openpilot_longitudinal and distance_button_control == self.button_functions["EXPERIMENTAL_MODE"] toggle.experimental_mode_via_press = toggle.experimental_mode_via_distance @@ -665,8 +698,8 @@ class FrogPilotVariables: toggle.one_lane_change = lane_change_customizations and (params.get_bool("OneLaneChange") if tuning_level >= level["OneLaneChange"] else default.get_bool("OneLaneChange")) lateral_tuning = params.get_bool("LateralTune") if tuning_level >= level["LateralTune"] else default.get_bool("LateralTune") - toggle.nnff = lateral_tuning and (params.get_bool("NNFF") if tuning_level >= level["NNFF"] else default.get_bool("NNFF")) - toggle.nnff_lite = lateral_tuning and (params.get_bool("NNFFLite") if tuning_level >= level["NNFFLite"] else default.get_bool("NNFFLite")) + toggle.nnff = lateral_tuning and (params.get_bool("NNFF") if tuning_level >= level["NNFF"] else default.get_bool("NNFF")) and car_make != "honda" + toggle.nnff_lite = lateral_tuning and (params.get_bool("NNFFLite") if tuning_level >= level["NNFFLite"] else default.get_bool("NNFFLite")) and car_make != "honda" toggle.use_turn_desires = lateral_tuning and (params.get_bool("TurnDesires") if tuning_level >= level["TurnDesires"] else default.get_bool("TurnDesires")) lkas_button_control = (params.get_int("LKASButtonControl") if tuning_level >= level["LKASButtonControl"] else default.get_int("LKASButtonControl")) if car_make != "subaru" else 0 @@ -698,6 +731,10 @@ class FrogPilotVariables: downloaded_models = [model for model in toggle.available_models.split(",") if any(MODELS_PATH.glob(f"{model}.*"))] toggle.model_randomizer = downloaded_models and (params.get_bool("ModelRandomizer") if tuning_level >= level["ModelRandomizer"] else default.get_bool("ModelRandomizer")) if toggle.available_models and toggle.available_model_names and downloaded_models and toggle.model_versions: + toggle.available_models += f",{DEFAULT_TINYGRAD_MODEL}" + toggle.available_model_names += f",{DEFAULT_TINYGRAD_MODEL_NAME}" + toggle.model_versions += f",{DEFAULT_TINYGRAD_MODEL_VERSION}" + downloaded_models += [DEFAULT_TINYGRAD_MODEL] if toggle.model_randomizer: if not started: blacklisted_models = (params.get("BlacklistedModels", encoding="utf-8") or "").split(",") @@ -721,7 +758,7 @@ class FrogPilotVariables: toggle.classic_model = toggle.model_version in {"v1", "v2", "v3", "v4"} toggle.planner_curvature_model = toggle.model_version not in {"v1", "v2", "v3", "v4", "v5"} toggle.radarless_model = toggle.model_version in {"v3"} - toggle.tinygrad_model = toggle.model_version in {"v7"} + toggle.tinygrad_model = toggle.model_version in {"v8"} toggle.model_ui = params.get_bool("ModelUI") if tuning_level >= level["ModelUI"] else default.get_bool("ModelUI") toggle.dynamic_path_width = toggle.model_ui and (params.get_bool("DynamicPathWidth") if tuning_level >= level["DynamicPathWidth"] else default.get_bool("DynamicPathWidth")) @@ -729,8 +766,6 @@ class FrogPilotVariables: toggle.path_edge_width = params.get_int("PathEdgeWidth") if toggle.model_ui and tuning_level >= level["PathEdgeWidth"] else default.get_int("PathEdgeWidth") toggle.path_width = params.get_float("PathWidth") * distance_conversion / 2 if toggle.model_ui and tuning_level >= level["PathWidth"] else default.get_float("PathWidth") * CV.FOOT_TO_METER / 2 toggle.road_edge_width = params.get_int("RoadEdgesWidth") * small_distance_conversion / 200 if toggle.model_ui and tuning_level >= level["RoadEdgesWidth"] else default.get_int("RoadEdgesWidth") * CV.INCH_TO_CM / 200 - toggle.show_stopping_point = openpilot_longitudinal and (toggle.model_ui and (params.get_bool("ShowStoppingPoint") if tuning_level >= level["ShowStoppingPoint"] else default.get_bool("ShowStoppingPoint")) or debug_mode) - toggle.show_stopping_point_metrics = toggle.show_stopping_point and (params.get_bool("ShowStoppingPointMetrics") if tuning_level >= level["ShowStoppingPointMetrics"] else default.get_bool("ShowStoppingPointMetrics") or debug_mode) toggle.unlimited_road_ui_length = toggle.model_ui and (params.get_bool("UnlimitedLength") if tuning_level >= level["UnlimitedLength"] else default.get_bool("UnlimitedLength")) toggle.navigation_ui = params.get_bool("NavigationUI") if tuning_level >= level["NavigationUI"] else default.get_bool("NavigationUI") @@ -775,7 +810,7 @@ class FrogPilotVariables: quality_of_life_visuals = params.get_bool("QOLVisuals") if tuning_level >= level["QOLVisuals"] else default.get_bool("QOLVisuals") toggle.camera_view = params.get_int("CameraView") if quality_of_life_visuals and tuning_level >= level["CameraView"] else default.get_int("CameraView") toggle.driver_camera_in_reverse = quality_of_life_visuals and (params.get_bool("DriverCamera") if tuning_level >= level["DriverCamera"] else default.get_bool("DriverCamera")) - toggle.onroad_distance_button = openpilot_longitudinal and (quality_of_life_visuals and (params.get_bool("OnroadDistanceButton") if tuning_level >= level["OnroadDistanceButton"] else default.get_bool("OnroadDistanceButton")) or debug_mode) + toggle.onroad_distance_button = openpilot_longitudinal and (quality_of_life_visuals and (params.get_bool("OnroadDistanceButton") if tuning_level >= level["OnroadDistanceButton"] else default.get_bool("OnroadDistanceButton")) or toggle.debug_mode) toggle.standby_mode = quality_of_life_visuals and (params.get_bool("StandbyMode") if tuning_level >= level["StandbyMode"] else default.get_bool("StandbyMode")) toggle.stopped_timer = quality_of_life_visuals and (params.get_bool("StoppedTimer") if tuning_level >= level["StoppedTimer"] else default.get_bool("StoppedTimer")) @@ -786,7 +821,7 @@ class FrogPilotVariables: screen_management = params.get_bool("ScreenManagement") if tuning_level >= level["ScreenManagement"] else default.get_bool("ScreenManagement") toggle.screen_brightness = params.get_int("ScreenBrightness") if screen_management and tuning_level >= level["ScreenBrightness"] else default.get_int("ScreenBrightness") toggle.screen_brightness_onroad = params.get_int("ScreenBrightnessOnroad") if screen_management and tuning_level >= level["ScreenBrightnessOnroad"] else default.get_int("ScreenBrightnessOnroad") - toggle.screen_recorder = screen_management and (params.get_bool("ScreenRecorder") if tuning_level >= level["ScreenRecorder"] else default.get_bool("ScreenRecorder")) or debug_mode + toggle.screen_recorder = screen_management and (params.get_bool("ScreenRecorder") if tuning_level >= level["ScreenRecorder"] else default.get_bool("ScreenRecorder")) or toggle.debug_mode toggle.screen_timeout = params.get_int("ScreenTimeout") if screen_management and tuning_level >= level["ScreenTimeout"] else default.get_int("ScreenTimeout") toggle.screen_timeout_onroad = params.get_int("ScreenTimeoutOnroad") if screen_management and tuning_level >= level["ScreenTimeoutOnroad"] else default.get_int("ScreenTimeoutOnroad") @@ -797,17 +832,19 @@ class FrogPilotVariables: toggle.map_speed_lookahead_higher = params.get_int("SLCLookaheadHigher") if toggle.speed_limit_controller and tuning_level >= level["SLCLookaheadHigher"] else default.get_int("SLCLookaheadHigher") toggle.map_speed_lookahead_lower = params.get_int("SLCLookaheadLower") if toggle.speed_limit_controller and tuning_level >= level["SLCLookaheadLower"] else default.get_int("SLCLookaheadLower") toggle.set_speed_limit = toggle.speed_limit_controller and (params.get_bool("SetSpeedLimit") if tuning_level >= level["SetSpeedLimit"] else default.get_bool("SetSpeedLimit")) - toggle.show_speed_limit_offset = toggle.speed_limit_controller and (params.get_bool("ShowSLCOffset") if tuning_level >= level["ShowSLCOffset"] else default.get_bool("ShowSLCOffset")) or debug_mode + toggle.show_speed_limit_offset = toggle.speed_limit_controller and (params.get_bool("ShowSLCOffset") if tuning_level >= level["ShowSLCOffset"] else default.get_bool("ShowSLCOffset")) or toggle.debug_mode slc_fallback_method = params.get_int("SLCFallback") if toggle.speed_limit_controller and tuning_level >= level["SLCFallback"] else default.get_int("SLCFallback") toggle.slc_fallback_experimental_mode = slc_fallback_method == 1 toggle.slc_fallback_previous_speed_limit = slc_fallback_method == 2 toggle.slc_fallback_set_speed = slc_fallback_method == 0 + toggle.slc_mapbox_filler = toggle.speed_limit_controller and params_cache.get("MapboxSecretKey", encoding="utf-8") and (params.get_bool("SLCMapboxFiller") if tuning_level >= level["SLCMapboxFiller"] else default.get_bool("SLCMapboxFiller")) toggle.speed_limit_confirmation = toggle.speed_limit_controller and (params.get_bool("SLCConfirmation") if tuning_level >= level["SLCConfirmation"] else default.get_bool("SLCConfirmation")) toggle.speed_limit_confirmation_higher = toggle.speed_limit_confirmation and (params.get_bool("SLCConfirmationHigher") if tuning_level >= level["SLCConfirmationHigher"] else default.get_bool("SLCConfirmationHigher")) toggle.speed_limit_confirmation_lower = toggle.speed_limit_confirmation and (params.get_bool("SLCConfirmationLower") if tuning_level >= level["SLCConfirmationLower"] else default.get_bool("SLCConfirmationLower")) slc_override_method = params.get_int("SLCOverride") if toggle.speed_limit_controller and tuning_level >= level["SLCOverride"] else default.get_int("SLCOverride") toggle.speed_limit_controller_override_manual = slc_override_method == 1 toggle.speed_limit_controller_override_set_speed = slc_override_method == 2 + toggle.speed_limit_filler = toggle.speed_limit_controller and (params.get_bool("SpeedLimitFiller") if tuning_level >= level["SpeedLimitFiller"] else default.get_bool("SpeedLimitFiller")) toggle.speed_limit_offset1 = (params.get_int("Offset1") * speed_conversion if tuning_level >= level["Offset1"] else default.get_int("Offset1") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 toggle.speed_limit_offset2 = (params.get_int("Offset2") * speed_conversion if tuning_level >= level["Offset2"] else default.get_int("Offset2") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 toggle.speed_limit_offset3 = (params.get_int("Offset3") * speed_conversion if tuning_level >= level["Offset3"] else default.get_int("Offset3") * CV.MPH_TO_MS) if toggle.speed_limit_controller else 0 @@ -825,6 +862,8 @@ class FrogPilotVariables: toggle.startup_alert_top = params.get("StartupMessageTop", encoding="utf-8") if tuning_level >= level["StartupMessageTop"] else default.get("StartupMessageTop", encoding="utf-8") toggle.startup_alert_bottom = params.get("StartupMessageBottom", encoding="utf-8") if tuning_level >= level["StartupMessageBottom"] else default.get("StartupMessageBottom", encoding="utf-8") + toggle.taco_tune_hacks = taco_hacks_allowed and (params.get_bool("TacoTuneHacks") if tuning_level >= level["TacoTuneHacks"] else default.get_bool("TacoTuneHacks")) + toggle.tethering_config = params.get_int("TetheringEnabled") toyota_doors = car_make == "toyota" and (params.get_bool("ToyotaDoors") if tuning_level >= level["ToyotaDoors"] else default.get_bool("ToyotaDoors")) diff --git a/selfdrive/frogpilot/controls/frogpilot_card.py b/frogpilot/controls/frogpilot_card.py similarity index 93% rename from selfdrive/frogpilot/controls/frogpilot_card.py rename to frogpilot/controls/frogpilot_card.py index a0cb591ced..b18f8c2144 100644 --- a/selfdrive/frogpilot/controls/frogpilot_card.py +++ b/frogpilot/controls/frogpilot_card.py @@ -3,7 +3,7 @@ from cereal import car, custom from openpilot.selfdrive.controls.lib.drive_helpers import CRUISE_LONG_PRESS from openpilot.selfdrive.controls.lib.events import ET, EventName -from openpilot.selfdrive.frogpilot.frogpilot_variables import NON_DRIVING_GEARS, params, params_memory +from openpilot.frogpilot.common.frogpilot_variables import NON_DRIVING_GEARS, params, params_memory ButtonType = car.CarState.ButtonEvent.Type FrogPilotButtonType = custom.FrogPilotCarState.ButtonEvent.Type @@ -31,7 +31,7 @@ class FrogPilotCard: self.pause_lateral = False self.pause_longitudinal = False self.prev_distance_button = False - self.traffic_mode = False + self.traffic_mode_enabled = False self.gap_counter = 0 @@ -45,7 +45,7 @@ class FrogPilotCard: elif self.car.frogpilot_toggles.pause_longitudinal_via_distance: self.pause_longitudinal = not self.pause_longitudinal elif self.car.frogpilot_toggles.traffic_mode_via_distance: - self.traffic_mode = not self.traffic_mode + self.traffic_mode_enabled = not self.traffic_mode_enabled def update_distance_button_long(self, sm): if self.car.frogpilot_toggles.experimental_mode_via_distance_long and sm["carControl"].longActive: @@ -57,7 +57,7 @@ class FrogPilotCard: elif self.car.frogpilot_toggles.pause_longitudinal_via_distance_long: self.pause_longitudinal = not self.pause_longitudinal elif self.car.frogpilot_toggles.traffic_mode_via_distance_long: - self.traffic_mode = not self.traffic_mode + self.traffic_mode_enabled = not self.traffic_mode_enabled def update_distance_button_very_long(self, sm): self.update_distance_button_long(sm) @@ -71,7 +71,7 @@ class FrogPilotCard: elif self.car.frogpilot_toggles.pause_longitudinal_via_distance_very_long: self.pause_longitudinal = not self.pause_longitudinal elif self.car.frogpilot_toggles.traffic_mode_via_distance_very_long: - self.traffic_mode = not self.traffic_mode + self.traffic_mode_enabled = not self.traffic_mode_enabled def update_lkas_button(self, sm): if self.car.frogpilot_toggles.experimental_mode_via_lkas and sm["carControl"].longActive: @@ -83,7 +83,7 @@ class FrogPilotCard: elif self.car.frogpilot_toggles.pause_longitudinal_via_lkas: self.pause_longitudinal = not self.pause_longitudinal elif self.car.frogpilot_toggles.traffic_mode_via_lkas: - self.traffic_mode = not self.traffic_mode + self.traffic_mode_enabled = not self.traffic_mode_enabled def update(self, carState, frogpilotCarState, sm): self.always_on_lateral_enabled = self.car.frogpilot_toggles.always_on_lateral_set @@ -121,13 +121,13 @@ class FrogPilotCard: elif self.gap_counter == self.very_long_press_threshold: self.update_distance_button_very_long(sm) - self.prev_distance_button = frogpilotCarState.distancePressed - lkas_button = any(be.pressed and be.type == FrogPilotButtonType.lkas for be in carState.buttonEvents) if lkas_button: self.update_lkas_button(sm) + self.prev_distance_button = frogpilotCarState.distancePressed + frogpilotCarState.accelPressed = self.accel_pressed frogpilotCarState.alwaysOnLateralEnabled = self.always_on_lateral_enabled frogpilotCarState.decelPressed = self.decel_pressed @@ -136,6 +136,6 @@ class FrogPilotCard: frogpilotCarState.forceCoast = self.force_coast frogpilotCarState.pauseLateral = self.pause_lateral frogpilotCarState.pauseLongitudinal = self.pause_longitudinal - frogpilotCarState.trafficMode = self.traffic_mode + frogpilotCarState.trafficModeEnabled = self.traffic_mode_enabled return frogpilotCarState diff --git a/selfdrive/frogpilot/controls/frogpilot_planner.py b/frogpilot/controls/frogpilot_planner.py similarity index 61% rename from selfdrive/frogpilot/controls/frogpilot_planner.py rename to frogpilot/controls/frogpilot_planner.py index f96a8a0b0e..e97a45f0c2 100644 --- a/selfdrive/frogpilot/controls/frogpilot_planner.py +++ b/frogpilot/controls/frogpilot_planner.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import json import math import cereal.messaging as messaging @@ -12,13 +13,13 @@ from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import A_CHANGE_COST, DANGER_ZONE_COST, J_EGO_COST, STOP_DISTANCE from openpilot.selfdrive.controls.lib.longitudinal_planner import Lead -from openpilot.selfdrive.frogpilot.controls.lib.conditional_experimental_mode import ConditionalExperimentalMode -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_acceleration import FrogPilotAcceleration -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_events import FrogPilotEvents -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_following import FrogPilotFollowing -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_vcruise import FrogPilotVCruise -from openpilot.selfdrive.frogpilot.frogpilot_utilities import calculate_lane_width, calculate_road_curvature -from openpilot.selfdrive.frogpilot.frogpilot_variables import CRUISING_SPEED, PLANNER_TIME, THRESHOLD +from openpilot.frogpilot.common.frogpilot_utilities import calculate_lane_width, calculate_road_curvature +from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, PLANNER_TIME, THRESHOLD, params_memory +from openpilot.frogpilot.controls.lib.conditional_experimental_mode import ConditionalExperimentalMode +from openpilot.frogpilot.controls.lib.frogpilot_acceleration import FrogPilotAcceleration +from openpilot.frogpilot.controls.lib.frogpilot_events import FrogPilotEvents +from openpilot.frogpilot.controls.lib.frogpilot_following import FrogPilotFollowing +from openpilot.frogpilot.controls.lib.frogpilot_vcruise import FrogPilotVCruise class FrogPilotPlanner: def __init__(self): @@ -43,76 +44,80 @@ class FrogPilotPlanner: self.road_curvature = 0 self.v_cruise = 0 - def update(self, carState, controlsState, frogpilotCarState, frogpilotNavigation, liveLocationKalman, modelData, radarless_model, radarState, frogpilot_toggles): + def update(self, radarless_model, sm, frogpilot_toggles): if radarless_model: - model_leads = list(modelData.leadsV3) + model_leads = list(sm["modelV2"].leadsV3) if len(model_leads) > 0: - distance_offset = frogpilot_toggles.increased_stopped_distance if not frogpilotCarState.trafficMode else 0 + distance_offset = frogpilot_toggles.increased_stopped_distance if not sm["frogpilotCarState"].trafficModeEnabled else 0 model_lead = model_leads[0] self.lead_one.update(model_lead.x[0] - distance_offset, model_lead.y[0], model_lead.v[0], model_lead.a[0], model_lead.prob) else: self.lead_one.reset() else: - self.lead_one = radarState.leadOne + self.lead_one = sm["radarState"].leadOne - v_cruise = min(controlsState.vCruise, V_CRUISE_MAX) * CV.KPH_TO_MS - v_ego = max(carState.vEgo, 0) - v_lead = self.lead_one.vLead + v_cruise_kph = min(max(sm["controlsState"].vCruise, sm["controlsState"].vCruiseCluster), V_CRUISE_MAX) + v_cruise = v_cruise_kph * CV.KPH_TO_MS + v_ego = max(sm["carState"].vEgo, sm["carState"].vEgoCluster) - if controlsState.enabled: - self.frogpilot_acceleration.update(frogpilotCarState, v_ego, frogpilot_toggles) + if sm["controlsState"].enabled: + self.frogpilot_acceleration.update(v_ego, sm, frogpilot_toggles) else: self.frogpilot_acceleration.max_accel = 0 self.frogpilot_acceleration.min_accel = 0 - if controlsState.enabled and frogpilot_toggles.conditional_experimental_mode: - self.cem.update(carState, frogpilotCarState, frogpilotNavigation, v_ego, frogpilot_toggles) + if sm["controlsState"].enabled and frogpilot_toggles.conditional_experimental_mode: + self.cem.update(v_ego, sm, frogpilot_toggles) elif frogpilot_toggles.force_stops or frogpilot_toggles.green_light_alert or frogpilot_toggles.show_stopping_point: self.cem.curve_detected = False - self.cem.stop_sign_and_light(frogpilotCarState, v_ego, frogpilot_toggles) + self.cem.stop_sign_and_light(v_ego, sm, frogpilot_toggles) else: self.cem.stop_light_detected = False - self.frogpilot_events.update(carState, controlsState, frogpilotCarState, self.lead_one.dRel, modelData, v_cruise, frogpilot_toggles) + self.frogpilot_events.update(v_cruise, sm, frogpilot_toggles) - self.frogpilot_following.update(carState.aEgo, controlsState, frogpilotCarState, self.lead_one.dRel, v_ego, frogpilot_toggles) + self.frogpilot_following.update(v_ego, sm, frogpilot_toggles) - localizer_valid = (liveLocationKalman.status == log.LiveLocationKalman.Status.valid) and liveLocationKalman.positionGeodetic.valid - if liveLocationKalman.gpsOK and localizer_valid: + localizer_valid = (sm["liveLocationKalman"].status == log.LiveLocationKalman.Status.valid) and sm["liveLocationKalman"].positionGeodetic.valid + if sm["liveLocationKalman"].gpsOK and localizer_valid: gps_position = { - "latitude": liveLocationKalman.positionGeodetic.value[0], - "longitude": liveLocationKalman.positionGeodetic.value[1], - "bearing": math.degrees(liveLocationKalman.calibratedOrientationNED.value[2]) + "latitude": sm["liveLocationKalman"].positionGeodetic.value[0], + "longitude": sm["liveLocationKalman"].positionGeodetic.value[1], + "bearing": math.degrees(sm["liveLocationKalman"].calibratedOrientationNED.value[2]) } + + params_memory.put("LastGPSPosition", json.dumps(gps_position)) else: gps_position = None + params_memory.remove("LastGPSPosition") + check_lane_width = frogpilot_toggles.adjacent_paths or frogpilot_toggles.adjacent_path_metrics or frogpilot_toggles.blind_spot_path or frogpilot_toggles.lane_detection if check_lane_width and v_ego >= frogpilot_toggles.minimum_lane_change_speed: - self.lane_width_left = calculate_lane_width(modelData.laneLines[0], modelData.laneLines[1], modelData.roadEdges[0]) - self.lane_width_right = calculate_lane_width(modelData.laneLines[3], modelData.laneLines[2], modelData.roadEdges[1]) + self.lane_width_left = calculate_lane_width(sm["modelV2"].laneLines[0], sm["modelV2"].laneLines[1], sm["modelV2"].roadEdges[0]) + self.lane_width_right = calculate_lane_width(sm["modelV2"].laneLines[3], sm["modelV2"].laneLines[2], sm["modelV2"].roadEdges[1]) else: self.lane_width_left = 0 self.lane_width_right = 0 self.lateral_check = v_ego >= frogpilot_toggles.pause_lateral_below_speed - self.lateral_check |= not (carState.leftBlinker or carState.rightBlinker) and frogpilot_toggles.pause_lateral_below_signal - self.lateral_check |= carState.standstill + self.lateral_check |= not (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and frogpilot_toggles.pause_lateral_below_signal + self.lateral_check |= sm["carState"].standstill - self.model_length = modelData.position.x[-1] + self.model_length = sm["modelV2"].position.x[-1] self.model_stopped = self.model_length < CRUISING_SPEED * PLANNER_TIME self.model_stopped |= self.frogpilot_vcruise.forcing_stop - self.road_curvature = calculate_road_curvature(modelData, v_ego) + self.road_curvature = calculate_road_curvature(sm["modelV2"], v_ego) self.road_curvature_detected = (1 / abs(self.road_curvature))**0.5 < v_ego > CRUISING_SPEED - self.tracking_lead = self.set_lead_status() + self.tracking_lead = self.update_lead_status() - self.v_cruise = self.frogpilot_vcruise.update(carState, controlsState, frogpilotCarState, frogpilotNavigation, gps_position, v_cruise, v_ego, frogpilot_toggles) + self.v_cruise = self.frogpilot_vcruise.update(gps_position, v_cruise, v_ego, sm, frogpilot_toggles) - def set_lead_status(self): + def update_lead_status(self): following_lead = self.lead_one.status following_lead &= self.lead_one.dRel < self.model_length + STOP_DISTANCE @@ -157,17 +162,19 @@ class FrogPilotPlanner: frogpilotPlan.roadCurvature = self.road_curvature frogpilotPlan.slcMapSpeedLimit = self.frogpilot_vcruise.slc.map_speed_limit - frogpilotPlan.slcOverridden = bool(self.frogpilot_vcruise.override_slc) - frogpilotPlan.slcOverriddenSpeed = float(self.frogpilot_vcruise.overridden_speed) + frogpilotPlan.slcMapboxSpeedLimit = self.frogpilot_vcruise.slc.mapbox_limit + frogpilotPlan.slcNextSpeedLimit = self.frogpilot_vcruise.slc.next_speed_limit + frogpilotPlan.slcOverriddenSpeed = self.frogpilot_vcruise.slc.overridden_speed frogpilotPlan.slcSpeedLimit = self.frogpilot_vcruise.slc_target frogpilotPlan.slcSpeedLimitOffset = self.frogpilot_vcruise.slc_offset frogpilotPlan.slcSpeedLimitSource = self.frogpilot_vcruise.slc.source - frogpilotPlan.speedLimitChanged = self.frogpilot_vcruise.slc.speed_limit_changed - frogpilotPlan.unconfirmedSlcSpeedLimit = self.frogpilot_vcruise.slc.desired_speed_limit - frogpilotPlan.upcomingSLCSpeedLimit = self.frogpilot_vcruise.slc.upcoming_speed_limit + frogpilotPlan.speedLimitChanged = self.frogpilot_vcruise.slc.speed_limit_changed_timer > DT_MDL + frogpilotPlan.unconfirmedSlcSpeedLimit = self.frogpilot_vcruise.slc.unconfirmed_speed_limit frogpilotPlan.togglesUpdated = toggles_updated - frogpilotPlan.vCruise = float(self.v_cruise) + frogpilotPlan.trackingLead = self.tracking_lead + + frogpilotPlan.vCruise = self.v_cruise pm.send("frogpilotPlan", frogpilot_plan_send) diff --git a/selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py b/frogpilot/controls/lib/conditional_experimental_mode.py similarity index 72% rename from selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py rename to frogpilot/controls/lib/conditional_experimental_mode.py index 4d53571ecf..753a1e2997 100644 --- a/selfdrive/frogpilot/controls/lib/conditional_experimental_mode.py +++ b/frogpilot/controls/lib/conditional_experimental_mode.py @@ -2,7 +2,7 @@ from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.realtime import DT_MDL -from openpilot.selfdrive.frogpilot.frogpilot_variables import CITY_SPEED_LIMIT, CRUISING_SPEED, THRESHOLD, params_memory +from openpilot.frogpilot.common.frogpilot_variables import CITY_SPEED_LIMIT, CRUISING_SPEED, THRESHOLD, params_memory class ConditionalExperimentalMode: def __init__(self, FrogPilotPlanner): @@ -16,37 +16,37 @@ class ConditionalExperimentalMode: self.experimental_mode = False self.stop_light_detected = False - def update(self, carState, frogpilotCarState, frogpilotNavigation, v_ego, frogpilot_toggles): + def update(self, v_ego, sm, frogpilot_toggles): if frogpilot_toggles.experimental_mode_via_press: self.status_value = params_memory.get_int("CEStatus") else: self.status_value = 0 - if self.status_value not in {1, 2} and not carState.standstill: - self.update_conditions(frogpilotCarState, v_ego, frogpilot_toggles) - self.experimental_mode = self.check_conditions(carState, frogpilotNavigation, v_ego, frogpilot_toggles) + if self.status_value not in {1, 2} and not sm["carState"].standstill: + self.update_conditions(v_ego, sm, frogpilot_toggles) + self.experimental_mode = self.check_conditions(v_ego, sm, frogpilot_toggles) params_memory.put_int("CEStatus", self.status_value if self.experimental_mode else 0) else: - self.experimental_mode = self.status_value == 2 or carState.standstill and self.experimental_mode and self.frogpilot_planner.model_stopped + self.experimental_mode = self.status_value == 2 or sm["carState"].standstill and self.experimental_mode and self.frogpilot_planner.model_stopped self.stop_light_detected &= self.status_value not in {1, 2} self.stop_light_filter.x = 0 - def check_conditions(self, carState, frogpilotNavigation, v_ego, frogpilot_toggles): + def check_conditions(self, v_ego, sm, frogpilot_toggles): below_speed = frogpilot_toggles.conditional_limit > v_ego >= 1 and not self.frogpilot_planner.frogpilot_following.following_lead below_speed_with_lead = frogpilot_toggles.conditional_limit_lead > v_ego >= 1 and self.frogpilot_planner.frogpilot_following.following_lead if below_speed or below_speed_with_lead: self.status_value = 3 if self.frogpilot_planner.frogpilot_following.following_lead else 4 return True - desired_lane = self.frogpilot_planner.lane_width_left if carState.leftBlinker else self.frogpilot_planner.lane_width_right + desired_lane = self.frogpilot_planner.lane_width_left if sm["carState"].leftBlinker else self.frogpilot_planner.lane_width_right lane_available = desired_lane >= frogpilot_toggles.lane_detection_width or not frogpilot_toggles.conditional_signal_lane_detection - if v_ego < frogpilot_toggles.conditional_signal and (carState.leftBlinker or carState.rightBlinker) and not lane_available: + if v_ego < frogpilot_toggles.conditional_signal and (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and not lane_available: self.status_value = 5 return True - approaching_maneuver = frogpilotNavigation.approachingIntersection or frogpilotNavigation.approachingTurn + approaching_maneuver = sm["frogpilotNavigation"].approachingIntersection or sm["frogpilotNavigation"].approachingTurn if frogpilot_toggles.conditional_navigation and approaching_maneuver and (frogpilot_toggles.conditional_navigation_lead or not self.frogpilot_planner.frogpilot_following.following_lead): - self.status_value = 6 if frogpilotNavigation.approachingIntersection else 7 + self.status_value = 6 if sm["frogpilotNavigation"].approachingIntersection else 7 return True if frogpilot_toggles.conditional_curves and self.curve_detected and (frogpilot_toggles.conditional_curves_lead or not self.frogpilot_planner.frogpilot_following.following_lead): @@ -67,10 +67,10 @@ class ConditionalExperimentalMode: return False - def update_conditions(self, frogpilotCarState, v_ego, frogpilot_toggles): + def update_conditions(self, v_ego, sm, frogpilot_toggles): self.curve_detection(v_ego, frogpilot_toggles) self.slow_lead(frogpilot_toggles) - self.stop_sign_and_light(frogpilotCarState, v_ego, frogpilot_toggles) + self.stop_sign_and_light(v_ego, sm, frogpilot_toggles) def curve_detection(self, v_ego, frogpilot_toggles): curve_active = self.curve_detected and (0.9 / abs(self.frogpilot_planner.road_curvature))**0.5 < v_ego @@ -89,8 +89,8 @@ class ConditionalExperimentalMode: self.slow_lead_filter.x = 0 self.slow_lead_detected = False - def stop_sign_and_light(self, frogpilotCarState, v_ego, frogpilot_toggles): - if not (self.curve_detected or frogpilotCarState.trafficMode): + def stop_sign_and_light(self, v_ego, sm, frogpilot_toggles): + if not (self.curve_detected or sm["frogpilotCarState"].trafficModeEnabled): model_stopping = self.frogpilot_planner.model_length < v_ego * frogpilot_toggles.conditional_model_stop_time self.stop_light_filter.update(self.frogpilot_planner.model_stopped or model_stopping) diff --git a/selfdrive/frogpilot/controls/lib/frogpilot_acceleration.py b/frogpilot/controls/lib/frogpilot_acceleration.py similarity index 89% rename from selfdrive/frogpilot/controls/lib/frogpilot_acceleration.py rename to frogpilot/controls/lib/frogpilot_acceleration.py index 1bc02e5188..6ea62c5987 100644 --- a/selfdrive/frogpilot/controls/lib/frogpilot_acceleration.py +++ b/frogpilot/controls/lib/frogpilot_acceleration.py @@ -3,7 +3,7 @@ import numpy as np from openpilot.selfdrive.controls.lib.longitudinal_planner import A_CRUISE_MIN, get_max_accel -from openpilot.selfdrive.frogpilot.frogpilot_variables import CITY_SPEED_LIMIT +from openpilot.frogpilot.common.frogpilot_variables import CITY_SPEED_LIMIT A_CRUISE_MIN_ECO = A_CRUISE_MIN / 2 A_CRUISE_MIN_SPORT = A_CRUISE_MIN * 2 @@ -39,11 +39,11 @@ class FrogPilotAcceleration: self.max_accel = 0 self.min_accel = 0 - def update(self, frogpilotCarState, v_ego, frogpilot_toggles): - eco_gear = frogpilotCarState.ecoGear - sport_gear = frogpilotCarState.sportGear + def update(self, v_ego, sm, frogpilot_toggles): + eco_gear = sm["frogpilotCarState"].ecoGear + sport_gear = sm["frogpilotCarState"].sportGear - if frogpilotCarState.trafficMode: + if sm["frogpilotCarState"].trafficModeEnabled: self.max_accel = get_max_accel(v_ego) elif frogpilot_toggles.map_acceleration and (eco_gear or sport_gear): if eco_gear: @@ -64,12 +64,12 @@ class FrogPilotAcceleration: self.max_accel = get_max_accel(v_ego) if frogpilot_toggles.human_acceleration: - if self.frogpilot_planner.frogpilot_following.following_lead and not frogpilotCarState.trafficMode: + if self.frogpilot_planner.frogpilot_following.following_lead and not sm["frogpilotCarState"].trafficModeEnabled: self.max_accel = float(np.clip(self.frogpilot_planner.lead_one.aLeadK, self.max_accel, get_max_allowed_accel(v_ego))) self.max_accel = min(get_max_accel_low_speeds(self.max_accel, self.frogpilot_planner.v_cruise), self.max_accel) self.max_accel = min(get_max_accel_ramp_off(self.max_accel, self.frogpilot_planner.v_cruise, v_ego), self.max_accel) - if frogpilotCarState.forceCoast: + if sm["frogpilotCarState"].forceCoast: self.min_accel = A_CRUISE_MIN_ECO elif frogpilot_toggles.map_deceleration and (eco_gear or sport_gear): if eco_gear: diff --git a/selfdrive/frogpilot/controls/lib/frogpilot_events.py b/frogpilot/controls/lib/frogpilot_events.py similarity index 67% rename from selfdrive/frogpilot/controls/lib/frogpilot_events.py rename to frogpilot/controls/lib/frogpilot_events.py index 20da8d4a55..65e8541707 100644 --- a/selfdrive/frogpilot/controls/lib/frogpilot_events.py +++ b/frogpilot/controls/lib/frogpilot_events.py @@ -6,8 +6,8 @@ from openpilot.common.realtime import DT_MDL from openpilot.selfdrive.controls.controlsd import Desire from openpilot.selfdrive.controls.lib.events import ET, EVENTS, EventName, Events -from openpilot.selfdrive.frogpilot.assets.theme_manager import update_wheel_image -from openpilot.selfdrive.frogpilot.frogpilot_variables import CRUISING_SPEED, NON_DRIVING_GEARS, params, params_memory +from openpilot.frogpilot.assets.theme_manager import update_wheel_image +from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, NON_DRIVING_GEARS, params, params_memory RANDOM_EVENTS_CHANCE = 0.01 * DT_MDL @@ -40,13 +40,13 @@ class FrogPilotEvents: self.random_event_timer = 0 self.tracking_lead_distance = 0 - def update(self, carState, controlsState, frogpilotCarState, lead_distance, modelData, v_cruise, frogpilot_toggles): + def update(self, v_cruise, sm, frogpilot_toggles): self.events.clear() if self.random_event_playing: self.random_event_timer += DT_MDL - if self.random_event_timer >= 4: + if self.random_event_timer >= 5: update_wheel_image(frogpilot_toggles.wheel_image, frogpilot_toggles.current_holiday_theme, False) params_memory.put_bool("UpdateWheelImage", True) @@ -57,7 +57,7 @@ class FrogPilotEvents: if self.frogpilot_planner.frogpilot_vcruise.forcing_stop: self.events.add(EventName.forcingStop) - if not self.frogpilot_planner.tracking_lead and carState.standstill and carState.gearShifter not in NON_DRIVING_GEARS and frogpilot_toggles.green_light_alert: + if not self.frogpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS and frogpilot_toggles.green_light_alert: if not self.frogpilot_planner.model_stopped and self.stopped_for_light: self.events.add(EventName.greenLight) @@ -65,16 +65,16 @@ class FrogPilotEvents: else: self.stopped_for_light = False - if not self.holiday_theme_played and self.startup_seen and controlsState.alertText1 == "" and frogpilot_toggles.current_holiday_theme != "stock" and len(self.events) == 0: + if not self.holiday_theme_played and self.startup_seen and sm["controlsState"].alertText1 == "" and frogpilot_toggles.current_holiday_theme != "stock" and len(self.events) == 0: self.events.add(EventName.holidayActive) self.holiday_theme_played = True - if self.frogpilot_planner.tracking_lead and carState.standstill and carState.gearShifter not in NON_DRIVING_GEARS and frogpilot_toggles.lead_departing_alert: + if self.frogpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS and frogpilot_toggles.lead_departing_alert: if self.tracking_lead_distance == 0: - self.tracking_lead_distance = lead_distance + self.tracking_lead_distance = self.frogpilot_planner.lead_one.dRel - lead_departing = lead_distance - self.tracking_lead_distance > 1 + lead_departing = self.frogpilot_planner.lead_one.dRel - self.tracking_lead_distance > 1 lead_departing &= self.frogpilot_planner.lead_one.vLead > 1 if lead_departing: @@ -82,15 +82,15 @@ class FrogPilotEvents: else: self.tracking_lead_distance = 0 - if not self.nnff_played and self.startup_seen and controlsState.alertText1 == "" and len(self.events) == 0 and params.get("NNFFModelName", encoding="utf-8") is not None: + if not self.nnff_played and self.startup_seen and sm["controlsState"].alertText1 == "" and len(self.events) == 0 and params.get("NNFFModelName", encoding="utf-8") is not None: self.events.add(EventName.torqueNNLoad) self.nnff_played = True if not self.random_event_playing and frogpilot_toggles.random_events: - acceleration = carState.aEgo + acceleration = sm["carState"].aEgo - if not carState.gasPressed: + if not sm["carState"].gasPressed: self.max_acceleration = max(acceleration, self.max_acceleration) else: self.max_acceleration = 0 @@ -132,21 +132,21 @@ class FrogPilotEvents: self.max_acceleration = 0 - if not self.dejaVu_played and carState.vEgo > CRUISING_SPEED * 2 and self.frogpilot_planner.road_curvature_detected: - if carState.vEgo > (1 / abs(self.frogpilot_planner.road_curvature))**0.75 * 2 > CRUISING_SPEED * 2 and abs(carState.steeringAngleDeg) > 30: + if not self.dejaVu_played and sm["carState"].vEgo > CRUISING_SPEED * 2 and self.frogpilot_planner.road_curvature_detected: + if sm["carState"].vEgo > (1 / abs(self.frogpilot_planner.road_curvature))**0.75 * 2 > CRUISING_SPEED * 2 and abs(sm["carState"].steeringAngleDeg) > 30: self.events.add(EventName.dejaVuCurve) self.dejaVu_played = True self.random_event_playing = True - if not self.no_entry_alert_played and controlsState.alertType == ET.NO_ENTRY: + if not self.no_entry_alert_played and sm["controlsState"].alertType == ET.NO_ENTRY: self.events.add(EventName.hal9000) self.no_entry_alert_played = True self.random_event_playing = True saturated_event_names = [EventName.steerSaturated, EventName.goatSteerSaturated] - saturated_alert_match = any((controlsState.alertText1, controlsState.alertText2) == (EVENTS[e][ET.WARNING].alert_text_1, EVENTS[e][ET.WARNING].alert_text_2) for e in saturated_event_names) + saturated_alert_match = any((sm["controlsState"].alertText1, sm["controlsState"].alertText2) == (EVENTS[e][ET.WARNING].alert_text_1, EVENTS[e][ET.WARNING].alert_text_2) for e in saturated_event_names) if saturated_alert_match: event_choices = [] @@ -187,15 +187,15 @@ class FrogPilotEvents: self.random_event_playing = True - if not self.vCruise69_played and 70 > max(controlsState.vCruise, controlsState.vCruiseCluster) * (1 if frogpilot_toggles.is_metric else CV.KPH_TO_MPH) >= 69: + if not self.vCruise69_played and 70 > max(sm["controlsState"].vCruise, sm["controlsState"].vCruiseCluster) * (1 if frogpilot_toggles.is_metric else CV.KPH_TO_MPH) >= 69: self.events.add(EventName.vCruise69) self.vCruise69_played = True self.random_event_playing = True if not self.fcw_played: - fcw_alert_match = controlsState.alertText1 == EVENTS[EventName.fcw][ET.PERMANENT].alert_text_1 and controlsState.alertText2 == EVENTS[EventName.fcw][ET.PERMANENT].alert_text_2 - stock_aeb_alert_match = controlsState.alertText1 == EVENTS[EventName.stockAeb][ET.PERMANENT].alert_text_1 and controlsState.alertText2 == EVENTS[EventName.stockAeb][ET.PERMANENT].alert_text_2 + fcw_alert_match = sm["controlsState"].alertText1 == EVENTS[EventName.fcw][ET.PERMANENT].alert_text_1 and sm["controlsState"].alertText2 == EVENTS[EventName.fcw][ET.PERMANENT].alert_text_2 + stock_aeb_alert_match = sm["controlsState"].alertText1 == EVENTS[EventName.stockAeb][ET.PERMANENT].alert_text_1 and sm["controlsState"].alertText2 == EVENTS[EventName.stockAeb][ET.PERMANENT].alert_text_2 if fcw_alert_match or stock_aeb_alert_match: event_choices = [] @@ -212,28 +212,28 @@ class FrogPilotEvents: self.fcw_played = True self.random_event_playing = True - if not self.youveGotMail_played and frogpilotCarState.alwaysOnLateralEnabled and not self.always_on_lateral_enabled_previously: + if not self.youveGotMail_played and sm["frogpilotCarState"].alwaysOnLateralEnabled and not self.always_on_lateral_enabled_previously: if random.random() < RANDOM_EVENTS_CHANCE: self.events.add(EventName.youveGotMail) self.youveGotMail_played = True self.random_event_playing = True - self.always_on_lateral_enabled_previously = frogpilotCarState.alwaysOnLateralEnabled + self.always_on_lateral_enabled_previously = sm["frogpilotCarState"].alwaysOnLateralEnabled - if frogpilot_toggles.speed_limit_changed_alert and self.frogpilot_planner.frogpilot_vcruise.slc.speed_limit_changed and self.frogpilot_planner.frogpilot_vcruise.speed_limit_timer < 1: + if frogpilot_toggles.speed_limit_changed_alert and self.frogpilot_planner.frogpilot_vcruise.slc.speed_limit_changed_timer == DT_MDL: self.events.add(EventName.speedLimitChanged) - startup_alert_match = controlsState.alertText1 == frogpilot_toggles.startup_alert_top and controlsState.alertText2 == frogpilot_toggles.startup_alert_bottom + startup_alert_match = sm["controlsState"].alertText1 == frogpilot_toggles.startup_alert_top and sm["controlsState"].alertText2 == frogpilot_toggles.startup_alert_bottom self.startup_seen |= startup_alert_match - if frogpilotCarState.trafficMode != self.previous_traffic_mode: + if sm["frogpilotCarState"].trafficModeEnabled != self.previous_traffic_mode: if self.previous_traffic_mode: self.events.add(EventName.trafficModeInactive) else: self.events.add(EventName.trafficModeActive) - self.previous_traffic_mode = frogpilotCarState.trafficMode + self.previous_traffic_mode = sm["frogpilotCarState"].trafficModeEnabled - if modelData.meta.turnDirection == Desire.turnLeft: + if sm["modelV2"].meta.turnDirection == Desire.turnLeft: self.events.add(EventName.turningLeft) - elif modelData.meta.turnDirection == Desire.turnRight: + elif sm["modelV2"].meta.turnDirection == Desire.turnRight: self.events.add(EventName.turningRight) diff --git a/selfdrive/frogpilot/controls/lib/frogpilot_following.py b/frogpilot/controls/lib/frogpilot_following.py similarity index 83% rename from selfdrive/frogpilot/controls/lib/frogpilot_following.py rename to frogpilot/controls/lib/frogpilot_following.py index b195bedbdc..1f5bd67560 100644 --- a/selfdrive/frogpilot/controls/lib/frogpilot_following.py +++ b/frogpilot/controls/lib/frogpilot_following.py @@ -3,7 +3,7 @@ import numpy as np from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import COMFORT_BRAKE, STOP_DISTANCE, desired_follow_distance, get_jerk_factor, get_T_FOLLOW -from openpilot.selfdrive.frogpilot.frogpilot_variables import CITY_SPEED_LIMIT +from openpilot.frogpilot.common.frogpilot_variables import CITY_SPEED_LIMIT TRAFFIC_MODE_BP = [0., CITY_SPEED_LIMIT] @@ -20,9 +20,9 @@ class FrogPilotFollowing: self.speed_jerk = 0 self.t_follow = 0 - def update(self, aEgo, controlsState, frogpilotCarState, lead_distance, v_ego, frogpilot_toggles): - if controlsState.enabled and frogpilotCarState.trafficMode: - if aEgo >= 0: + def update(self, v_ego, sm, frogpilot_toggles): + if sm["controlsState"].enabled and sm["frogpilotCarState"].trafficModeEnabled: + if sm["carState"].aEgo >= 0: self.base_acceleration_jerk = float(np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_acceleration)) self.base_speed_jerk = float(np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_speed)) else: @@ -31,27 +31,27 @@ class FrogPilotFollowing: self.base_danger_jerk = float(np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_danger)) self.t_follow = float(np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_follow)) - elif controlsState.enabled: - if aEgo >= 0: + elif sm["controlsState"].enabled: + if sm["carState"].aEgo >= 0: self.base_acceleration_jerk, self.base_danger_jerk, self.base_speed_jerk = get_jerk_factor( frogpilot_toggles.aggressive_jerk_acceleration, frogpilot_toggles.aggressive_jerk_danger, frogpilot_toggles.aggressive_jerk_speed, frogpilot_toggles.standard_jerk_acceleration, frogpilot_toggles.standard_jerk_danger, frogpilot_toggles.standard_jerk_speed, frogpilot_toggles.relaxed_jerk_acceleration, frogpilot_toggles.relaxed_jerk_danger, frogpilot_toggles.relaxed_jerk_speed, - frogpilot_toggles.custom_personalities, controlsState.personality + frogpilot_toggles.custom_personalities, sm["controlsState"].personality ) else: self.base_acceleration_jerk, self.base_danger_jerk, self.base_speed_jerk = get_jerk_factor( frogpilot_toggles.aggressive_jerk_deceleration, frogpilot_toggles.aggressive_jerk_danger, frogpilot_toggles.aggressive_jerk_speed_decrease, frogpilot_toggles.standard_jerk_deceleration, frogpilot_toggles.standard_jerk_danger, frogpilot_toggles.standard_jerk_speed_decrease, frogpilot_toggles.relaxed_jerk_deceleration, frogpilot_toggles.relaxed_jerk_danger, frogpilot_toggles.relaxed_jerk_speed_decrease, - frogpilot_toggles.custom_personalities, controlsState.personality + frogpilot_toggles.custom_personalities, sm["controlsState"].personality ) self.t_follow = get_T_FOLLOW( frogpilot_toggles.aggressive_follow, frogpilot_toggles.standard_follow, frogpilot_toggles.relaxed_follow, - frogpilot_toggles.custom_personalities, controlsState.personality + frogpilot_toggles.custom_personalities, sm["controlsState"].personality ) else: self.base_acceleration_jerk = 0 @@ -63,10 +63,10 @@ class FrogPilotFollowing: self.danger_jerk = self.base_danger_jerk self.speed_jerk = self.base_speed_jerk - self.following_lead = self.frogpilot_planner.tracking_lead and lead_distance < (self.t_follow + 1) * v_ego + self.following_lead = self.frogpilot_planner.tracking_lead and self.frogpilot_planner.lead_one.dRel < (self.t_follow + 1) * v_ego - if controlsState.enabled and self.frogpilot_planner.tracking_lead: - self.update_follow_values(lead_distance, v_ego, self.frogpilot_planner.lead_one.vLead, frogpilot_toggles) + if sm["controlsState"].enabled and self.frogpilot_planner.tracking_lead: + self.update_follow_values(self.frogpilot_planner.lead_one.dRel, v_ego, self.frogpilot_planner.lead_one.vLead, frogpilot_toggles) self.desired_follow_distance = int(desired_follow_distance(v_ego, self.frogpilot_planner.lead_one.vLead, self.t_follow)) else: self.desired_follow_distance = 0 diff --git a/selfdrive/frogpilot/controls/lib/frogpilot_tracking.py b/frogpilot/controls/lib/frogpilot_tracking.py similarity index 80% rename from selfdrive/frogpilot/controls/lib/frogpilot_tracking.py rename to frogpilot/controls/lib/frogpilot_tracking.py index 3662acbbef..8ab87c5eb6 100644 --- a/selfdrive/frogpilot/controls/lib/frogpilot_tracking.py +++ b/frogpilot/controls/lib/frogpilot_tracking.py @@ -16,13 +16,13 @@ class FrogPilotTracking: self.drive_distance = 0 self.drive_time = 0 - def update(self, carState, controlsState, frogpilotCarState): - self.enabled |= controlsState.enabled or frogpilotCarState.alwaysOnLateralEnabled + def update(self, sm): + self.enabled |= sm["controlsState"].enabled or sm["frogpilotCarState"].alwaysOnLateralEnabled - self.drive_distance += carState.vEgo * DT_MDL + self.drive_distance += sm["carState"].vEgo * DT_MDL self.drive_time += DT_MDL - if self.drive_time > 60 and carState.standstill and self.enabled: + if self.drive_time > 60 and sm["carState"].standstill and self.enabled: self.total_kilometers += self.drive_distance / 1000 self.params_tracking.put_float_nonblocking("FrogPilotKilometers", self.total_kilometers) self.drive_distance = 0 diff --git a/frogpilot/controls/lib/frogpilot_vcruise.py b/frogpilot/controls/lib/frogpilot_vcruise.py new file mode 100644 index 0000000000..a0d685f8e4 --- /dev/null +++ b/frogpilot/controls/lib/frogpilot_vcruise.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +from openpilot.common.realtime import DT_MDL +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import COMFORT_BRAKE + +from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, PLANNER_TIME +from openpilot.frogpilot.controls.lib.map_turn_speed_controller import MapTurnSpeedController +from openpilot.frogpilot.controls.lib.speed_limit_controller import SpeedLimitController + +TARGET_LAT_A = 2.0 + +class FrogPilotVCruise: + def __init__(self, FrogPilotPlanner): + self.frogpilot_planner = FrogPilotPlanner + + self.mtsc = MapTurnSpeedController() + self.slc = SpeedLimitController() + + self.forcing_stop = False + self.override_force_stop = False + + self.mtsc_target = 0 + self.override_force_stop_timer = 0 + + def update(self, gps_position, v_cruise, v_ego, sm, frogpilot_toggles): + force_stop = self.frogpilot_planner.cem.stop_light_detected and sm["controlsState"].enabled and frogpilot_toggles.force_stops + force_stop &= self.frogpilot_planner.model_stopped + force_stop &= self.override_force_stop_timer <= 0 + + self.force_stop_timer = self.force_stop_timer + DT_MDL if force_stop else 0 + + force_stop_enabled = self.force_stop_timer >= 1 + + self.override_force_stop |= sm["carState"].gasPressed + self.override_force_stop |= sm["frogpilotCarState"].accelPressed + self.override_force_stop &= force_stop_enabled + + if self.override_force_stop: + self.override_force_stop_timer = 10 + elif self.override_force_stop_timer > 0: + self.override_force_stop_timer -= DT_MDL + + # Mike's extended lead linear braking + if self.frogpilot_planner.lead_one.vLead < v_ego > CRUISING_SPEED and sm["controlsState"].enabled and self.frogpilot_planner.tracking_lead and frogpilot_toggles.human_following: + self.linear_braking_active |= self.frogpilot_planner.v_cruise - v_ego < 1 + + if not self.frogpilot_planner.frogpilot_following.following_lead and self.linear_braking_active: + decel_rate = (v_ego - self.frogpilot_planner.lead_one.vLead)**2 / self.frogpilot_planner.lead_one.dRel + self.braking_target = max(v_ego - (decel_rate * DT_MDL), self.frogpilot_planner.lead_one.vLead + CRUISING_SPEED) + else: + self.braking_target = v_cruise + else: + self.linear_braking_active = False + + self.braking_target = v_cruise + + # Pfeiferj's Map Turn Speed Controller + if v_ego > CRUISING_SPEED and sm["controlsState"].enabled and frogpilot_toggles.map_turn_speed_controller: + mtsc_active = self.mtsc_target < v_cruise + + if self.frogpilot_planner.road_curvature_detected and mtsc_active: + self.mtsc_target = self.mtsc_target + elif not self.frogpilot_planner.road_curvature_detected and frogpilot_toggles.mtsc_curvature_check: + self.mtsc_target = v_cruise + else: + mtsc_speed = ((TARGET_LAT_A * frogpilot_toggles.turn_aggressiveness) / (self.mtsc.get_map_curvature(gps_position, v_ego) * frogpilot_toggles.curve_sensitivity))**0.5 + self.mtsc_target = max(CRUISING_SPEED, mtsc_speed) + else: + self.mtsc_target = v_cruise + + # Pfeiferj's Speed Limit Controller + self.slc.frogpilot_toggles = frogpilot_toggles + + if frogpilot_toggles.speed_limit_controller: + self.slc.update_limits(sm["frogpilotCarState"].dashboardSpeedLimit, gps_position, sm["frogpilotNavigation"].navigationSpeedLimit, v_cruise, v_ego, sm) + self.slc.update_override(v_cruise, v_ego, sm) + + self.slc_offset = self.slc.offset + self.slc_target = self.slc.target + elif frogpilot_toggles.show_speed_limits: + self.slc.update_limits(sm["frogpilotCarState"].dashboardSpeedLimit, gps_position, sm["frogpilotNavigation"].navigationSpeedLimit, v_cruise, v_ego, sm) + + self.slc_offset = 0 + self.slc_target = self.slc.target + else: + self.slc_offset = 0 + self.slc_target = 0 + + # Pfeiferj's Vision Turn Controller + if v_ego > CRUISING_SPEED and sm["controlsState"].enabled and self.frogpilot_planner.road_curvature_detected and frogpilot_toggles.vision_turn_speed_controller: + vtsc_speed = ((TARGET_LAT_A * frogpilot_toggles.turn_aggressiveness) / (abs(self.frogpilot_planner.road_curvature) * frogpilot_toggles.curve_sensitivity))**0.5 + self.vtsc_target = max(CRUISING_SPEED, vtsc_speed) + else: + self.vtsc_target = v_cruise + + if sm["carState"].standstill and not self.override_force_stop and sm["controlsState"].enabled and frogpilot_toggles.force_standstill: + self.forcing_stop = True + + v_cruise = -1 + + elif force_stop_enabled and not self.override_force_stop: + self.forcing_stop |= not sm["carState"].standstill + + self.tracked_model_length = max(self.tracked_model_length - (v_ego * DT_MDL), 0) + v_cruise = min((self.tracked_model_length // PLANNER_TIME), v_cruise) + + else: + self.forcing_stop = False + + self.tracked_model_length = self.frogpilot_planner.model_length + + targets = [self.braking_target, self.mtsc_target, self.vtsc_target, v_cruise] + if frogpilot_toggles.speed_limit_controller: + targets.append(max(self.slc.overridden_speed, self.slc_target + self.slc_offset)) + + v_cruise = min([target if target > CRUISING_SPEED else v_cruise for target in targets]) + + return v_cruise diff --git a/selfdrive/frogpilot/controls/lib/map_turn_speed_controller.py b/frogpilot/controls/lib/map_turn_speed_controller.py similarity index 93% rename from selfdrive/frogpilot/controls/lib/map_turn_speed_controller.py rename to frogpilot/controls/lib/map_turn_speed_controller.py index 40a47bcf0e..74d4e79a4c 100644 --- a/selfdrive/frogpilot/controls/lib/map_turn_speed_controller.py +++ b/frogpilot/controls/lib/map_turn_speed_controller.py @@ -3,8 +3,8 @@ import json import math -from openpilot.selfdrive.frogpilot.frogpilot_utilities import calculate_distance_to_point -from openpilot.selfdrive.frogpilot.frogpilot_variables import PLANNER_TIME, TO_RADIANS, params_memory +from openpilot.frogpilot.common.frogpilot_utilities import calculate_distance_to_point +from openpilot.frogpilot.common.frogpilot_variables import PLANNER_TIME, TO_RADIANS, params_memory def calculate_curvature(p1, p2, p3): lat1, lon1 = p1 diff --git a/frogpilot/controls/lib/speed_limit_controller.py b/frogpilot/controls/lib/speed_limit_controller.py new file mode 100644 index 0000000000..48acc1c47c --- /dev/null +++ b/frogpilot/controls/lib/speed_limit_controller.py @@ -0,0 +1,340 @@ +#!/usr/bin/env python3 +# PFEIFER - SLC - Modified by FrogAi for FrogPilot +import calendar +import json +import math +import numpy as np +import requests + +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime + +import openpilot.system.sentry as sentry + +from openpilot.common.conversions import Conversions as CV +from openpilot.common.realtime import DT_MDL +from openpilot.common.time import system_time_valid + +from openpilot.frogpilot.common.frogpilot_utilities import calculate_bearing_offset, calculate_distance_to_point, is_url_pingable +from openpilot.frogpilot.common.frogpilot_variables import TO_RADIANS, params, params_cache, params_memory + +FREE_MAPBOX_REQUESTS = 100_000 + +class SpeedLimitController: + def __init__(self): + self.executor = ThreadPoolExecutor(max_workers=1) + + self.calling_mapbox = False + self.override_slc = False + + self.denied_target = 0 + self.map_speed_limit = 0 + self.mapbox_limit = 0 + self.next_speed_limit = 0 + self.overridden_speed = 0 + self.segment_distance = 0 + self.speed_limit_changed_timer = 0 + self.target = 0 + self.unconfirmed_speed_limit = 0 + + self.previous_source = "None" + self.source = "None" + + self.mapbox_requests = json.loads(params.get("MapBoxRequests") or "{}") + self.mapbox_requests.setdefault("month", datetime.now().month) + self.mapbox_requests.setdefault("total_requests", 0) + self.mapbox_requests.setdefault("max_requests", FREE_MAPBOX_REQUESTS - (28 * 100)) + + self.mapbox_host = "https://api.mapbox.com" + self.mapbox_token = params_cache.get("MapboxSecretKey", encoding="utf8") + + self.previous_target = params.get_float("PreviousSpeedLimit") + + @property + def experimental_mode(self): + return self.frogpilot_toggles.slc_fallback_experimental_mode and self.target == 0 + + @property + def offset(self): + if self.frogpilot_toggles.is_metric: + offset_map = [ + (0, 8.1, self.frogpilot_toggles.speed_limit_offset1), # 0–29 km/h + (8.1, 13.6, self.frogpilot_toggles.speed_limit_offset2), # 30–49 + (13.6, 16.4, self.frogpilot_toggles.speed_limit_offset3), # 50–59 + (16.4, 21.9, self.frogpilot_toggles.speed_limit_offset4), # 60–79 + (21.9, 27.5, self.frogpilot_toggles.speed_limit_offset5), # 80–99 + (27.5, 33.1, self.frogpilot_toggles.speed_limit_offset6), # 100–119 + (33.1, 38.9, self.frogpilot_toggles.speed_limit_offset7), # 120–140 + ] + else: + offset_map = [ + (0, 11.2, self.frogpilot_toggles.speed_limit_offset1), # 0–24 mph + (11.2, 15.2, self.frogpilot_toggles.speed_limit_offset2), # 25–34 + (15.2, 19.6, self.frogpilot_toggles.speed_limit_offset3), # 35–44 + (19.6, 24.1, self.frogpilot_toggles.speed_limit_offset4), # 45–54 + (24.1, 28.6, self.frogpilot_toggles.speed_limit_offset5), # 55–64 + (28.6, 33.1, self.frogpilot_toggles.speed_limit_offset6), # 65–74 + (33.1, 44.2, self.frogpilot_toggles.speed_limit_offset7), # 75–99 + ] + return next((offset for low, high, offset in offset_map if low < self.target < high), 0) + + def get_mapbox_speed_limit(self, gps_position, v_ego): + try: + if not gps_position or not self.mapbox_token: + self.mapbox_limit = 0 + self.segment_distance = 0 + return + + if v_ego == 0: + return + + if self.segment_distance > 0: + self.segment_distance -= v_ego * DT_MDL + return + + if self.calling_mapbox: + self.segment_distance = v_ego + return + + def make_request(): + try: + self.calling_mapbox = True + + successful = False + + if not is_url_pingable(self.mapbox_host): + self.segment_distance = 1000 + return None + + if system_time_valid(): + current_month = datetime.now().month + if current_month != self.mapbox_requests.get("month"): + self.mapbox_requests.update({ + "month": current_month, + "total_requests": 0, + "max_requests": FREE_MAPBOX_REQUESTS - calendar.monthrange(datetime.now().year, current_month)[1] * 100, + }) + + self.mapbox_requests["total_requests"] += 1 + params.put_nonblocking("MapBoxRequests", json.dumps(self.mapbox_requests)) + + current_bearing = gps_position.get("bearing") + current_latitude = gps_position.get("latitude") + current_longitude = gps_position.get("longitude") + + future_latitude, future_longitude = calculate_bearing_offset(current_latitude, current_longitude, current_bearing, v_ego) + + url = f"{self.mapbox_host}/matching/v5/mapbox/driving/{current_longitude},{current_latitude};{future_longitude},{future_latitude}.json" + mapbox_params = { + "access_token": self.mapbox_token, + "annotations": "maxspeed,distance", + "geometries": "geojson", + "overview": "full", + } + + response = requests.get(url, params=mapbox_params, timeout=10) + response.raise_for_status() + + successful = True + + return response.json() + except requests.ConnectionError: + print("ConnectionError while fetching Mapbox data...") + except requests.HTTPError: + print("HTTPError while fetching Mapbox data...") + except requests.RequestException: + print("RequestException while fetching Mapbox data...") + except requests.Timeout: + print("Timeout while fetching Mapbox data...") + except Exception as error: + sentry.capture_exception(error) + print(f"Unexpected error in Mapbox request: {error}") + finally: + self.calling_mapbox = False + + if not successful: + self.mapbox_limit = 0 + self.segment_distance = v_ego + + return None + + def complete_request(future): + try: + data = future.result() + if data: + if (matchings := data.get("matchings")) and matchings[0].get("legs"): + annotations = matchings[0]["legs"][0].get("annotation", {}) + if (speed_data := annotations.get("maxspeed")) and (speed_limit_kph := speed_data[0].get("speed")): + self.mapbox_limit = speed_limit_kph * CV.KPH_TO_MS + self.segment_distance = annotations.get("distance", [v_ego])[0] + return + except Exception as error: + sentry.capture_exception(error) + print(f"Mapbox Callback Error: {error}") + + self.mapbox_limit = 0 + self.segment_distance = v_ego + + future = self.executor.submit(make_request) + future.add_done_callback(complete_request) + except Exception as error: + sentry.capture_exception(error) + print(f"Unexpected error in get_mapbox_speed_limit: {error}") + + self.calling_mapbox = False + + self.mapbox_limit = 0 + self.segment_distance = v_ego + + def handle_limit_change(self, desired_source, desired_target, sm): + self.speed_limit_changed_timer += DT_MDL + + speed_limit_accepted = (sm["frogpilotCarState"].accelPressed and sm["carControl"].longActive) or params_memory.get_bool("SpeedLimitAccepted") + speed_limit_denied = sm["frogpilotCarState"].decelPressed or (self.speed_limit_changed_timer >= 30) + + if speed_limit_accepted: + self.overridden_speed = 0 + + self.source = desired_source + self.target = desired_target + + params_memory.remove("SpeedLimitAccepted") + + elif speed_limit_denied: + self.denied_target = desired_target + + self.previous_source = desired_source + self.previous_target = desired_target + + elif desired_target < self.target and not self.frogpilot_toggles.speed_limit_confirmation_lower: + self.source = desired_source + self.target = desired_target + + elif desired_target > self.target and not self.frogpilot_toggles.speed_limit_confirmation_higher: + self.source = desired_source + self.target = desired_target + + else: + self.source = "None" + self.unconfirmed_speed_limit = desired_target + + if self.target != self.previous_target and self.target > 0 and not speed_limit_denied: + self.denied_target = 0 + + self.previous_source = self.source + self.previous_target = self.target + + params.put_float_nonblocking("PreviousSpeedLimit", self.target) + + + def update_limits(self, dashboard_speed_limit, gps_position, navigation_speed_limit, v_cruise, v_ego, sm): + self.update_map_speed_limit(gps_position, v_ego) + + limits = { + "Dashboard": dashboard_speed_limit, + "Map Data": self.map_speed_limit, + "Navigation": navigation_speed_limit + } + filtered_limits = {source: limit for source, limit in limits.items() if limit} + + if self.frogpilot_toggles.speed_limit_priority_highest: + desired_source = max(filtered_limits, key=filtered_limits.get, default="None") + desired_target = filtered_limits.get(desired_source, 0) + + elif self.frogpilot_toggles.speed_limit_priority_lowest: + desired_source = min(filtered_limits, key=filtered_limits.get, default="None") + desired_target = filtered_limits.get(desired_source, 0) + + elif filtered_limits: + for priority in [ + self.frogpilot_toggles.speed_limit_priority1, + self.frogpilot_toggles.speed_limit_priority2, + self.frogpilot_toggles.speed_limit_priority3 + ]: + if priority in filtered_limits: + desired_source = priority + desired_target = filtered_limits[desired_source] + break + else: + desired_source = "None" + desired_target = 0 + + else: + desired_source = "None" + desired_target = 0 + + if desired_target == 0: + if self.mapbox_requests["total_requests"] < self.mapbox_requests["max_requests"] and self.frogpilot_toggles.slc_mapbox_filler: + self.get_mapbox_speed_limit(gps_position, v_ego) + + if self.mapbox_limit: + desired_source = "Mapbox" + desired_target = self.mapbox_limit + print(f"Mapbox limit found: {desired_target}") + + if desired_target == 0: + if self.denied_target != self.previous_target > 0 and self.frogpilot_toggles.slc_fallback_previous_speed_limit: + desired_source = self.previous_source + desired_target = self.previous_target + + self.target = desired_target + + elif sm["controlsState"].enabled and self.frogpilot_toggles.slc_fallback_set_speed: + desired_source = "None" + desired_target = v_cruise + else: + self.mapbox_limit = 0 + self.segment_distance = 0 + + if abs(desired_target - self.previous_target) >= 1: + self.handle_limit_change(desired_source, desired_target, sm) + elif desired_source != self.source and abs(desired_target - self.target) < 1: + self.source = desired_source + else: + self.speed_limit_changed_timer = 0 + self.unconfirmed_speed_limit = 0 + + def update_override(self, v_cruise, v_ego, sm): + self.override_slc = self.overridden_speed > self.target + self.offset > 0 + self.override_slc |= sm["carState"].gasPressed and v_ego > self.target + self.offset > 0 + self.override_slc &= sm["controlsState"].enabled + + if self.override_slc: + if self.frogpilot_toggles.speed_limit_controller_override_manual: + if sm["carState"].gasPressed: + self.overridden_speed = max(v_ego, self.overridden_speed) + self.overridden_speed = float(np.clip(self.overridden_speed, self.target + self.offset, v_cruise)) + elif self.frogpilot_toggles.speed_limit_controller_override_set_speed: + self.overridden_speed = v_cruise + + self.source = "None" + else: + self.overridden_speed = 0 + + def update_map_speed_limit(self, gps_position, v_ego): + if not gps_position: + return + + self.map_speed_limit = params_memory.get_float("MapSpeedLimit") + + next_map_speed_limit = json.loads(params_memory.get("NextMapSpeedLimit") or "{}") + self.next_speed_limit = next_map_speed_limit.get("speedlimit", 0) + + if self.next_speed_limit: + current_latitude = gps_position.get("latitude") + current_longitude = gps_position.get("longitude") + + next_latitude = next_map_speed_limit.get("latitude") + next_longitude = next_map_speed_limit.get("longitude") + + distance_to_upcoming = calculate_distance_to_point(current_latitude * TO_RADIANS, current_longitude * TO_RADIANS, next_latitude * TO_RADIANS, next_longitude * TO_RADIANS) + + if self.map_speed_limit < self.next_speed_limit: + max_lookahead = self.frogpilot_toggles.map_speed_lookahead_higher * v_ego + elif self.map_speed_limit > self.next_speed_limit: + max_lookahead = self.frogpilot_toggles.map_speed_lookahead_lower * v_ego + else: + max_lookahead = 0 + + if distance_to_upcoming < max_lookahead: + self.map_speed_limit = self.next_speed_limit diff --git a/selfdrive/frogpilot/frogpilot_process.py b/frogpilot/frogpilot_process.py similarity index 72% rename from selfdrive/frogpilot/frogpilot_process.py rename to frogpilot/frogpilot_process.py index 05d3625d0f..d3aedcb094 100644 --- a/selfdrive/frogpilot/frogpilot_process.py +++ b/frogpilot/frogpilot_process.py @@ -6,17 +6,16 @@ import time import openpilot.system.sentry as sentry from cereal import messaging -from openpilot.common.params import Params from openpilot.common.realtime import Priority, config_realtime_process from openpilot.common.time import system_time_valid -from openpilot.selfdrive.frogpilot.assets.model_manager import ModelManager, MODEL_DOWNLOAD_ALL_PARAM, MODEL_DOWNLOAD_PARAM -from openpilot.selfdrive.frogpilot.assets.theme_manager import ThemeManager -from openpilot.selfdrive.frogpilot.controls.frogpilot_planner import FrogPilotPlanner -from openpilot.selfdrive.frogpilot.controls.lib.frogpilot_tracking import FrogPilotTracking -from openpilot.selfdrive.frogpilot.frogpilot_functions import backup_toggles -from openpilot.selfdrive.frogpilot.frogpilot_utilities import flash_panda, is_url_pingable, lock_doors, restart_processes, run_thread_with_lock, update_maps, update_openpilot -from openpilot.selfdrive.frogpilot.frogpilot_variables import ERROR_LOGS_PATH, FrogPilotVariables, get_frogpilot_toggles, params, params_memory +from openpilot.frogpilot.assets.model_manager import ModelManager, MODEL_DOWNLOAD_ALL_PARAM, MODEL_DOWNLOAD_PARAM +from openpilot.frogpilot.assets.theme_manager import ThemeManager +from openpilot.frogpilot.common.frogpilot_functions import backup_toggles +from openpilot.frogpilot.common.frogpilot_utilities import flash_panda, is_url_pingable, lock_doors, run_thread_with_lock, update_maps, update_openpilot +from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, FrogPilotVariables, get_frogpilot_toggles, params, params_cache, params_memory +from openpilot.frogpilot.controls.frogpilot_planner import FrogPilotPlanner +from openpilot.frogpilot.controls.lib.frogpilot_tracking import FrogPilotTracking def assets_checks(model_manager, theme_manager): if params_memory.get_bool(MODEL_DOWNLOAD_ALL_PARAM): @@ -69,8 +68,6 @@ def frogpilot_thread(): if error_log.is_file(): error_log.unlink() - params_cache = Params("/cache/params") - frogpilot_planner = FrogPilotPlanner() frogpilot_tracking = FrogPilotTracking() frogpilot_variables = FrogPilotVariables() @@ -80,7 +77,6 @@ def frogpilot_thread(): assets_checked = False run_update_checks = False started_previously = False - theme_updated = False time_validated = False toggles_updated = False @@ -89,7 +85,7 @@ def frogpilot_thread(): toggles_last_updated = datetime.datetime.now() pm = messaging.PubMaster(["frogpilotPlan"]) - sm = messaging.SubMaster(["carState", "controlsState", "deviceState", "driverMonitoringState", + sm = messaging.SubMaster(["carControl", "carState", "controlsState", "deviceState", "driverMonitoringState", "liveLocationKalman", "managerState", "modelV2", "pandaStates", "radarState", "frogpilotCarState", "frogpilotNavigation"], poll="modelV2", ignore_avg_freq=["radarState"]) @@ -101,11 +97,17 @@ def frogpilot_thread(): started = sm["deviceState"].started - if params_memory.get_bool("FrogPilotTogglesUpdated") or theme_updated: - frogpilot_variables.update(theme_manager.theme_assets["holiday_theme"], started) + if params_memory.get_bool("FrogPilotTogglesUpdated"): + previous_holiday_themes = frogpilot_toggles.holiday_themes + previous_random_themes = frogpilot_toggles.random_themes + + frogpilot_variables.update(theme_manager.holiday_theme, started) frogpilot_toggles = get_frogpilot_toggles() - theme_updated = theme_manager.update_active_theme(time_validated, frogpilot_toggles) + randomize_theme = frogpilot_toggles.holiday_themes != previous_holiday_themes + randomize_theme |= frogpilot_toggles.random_themes != previous_random_themes + + theme_manager.update_active_theme(time_validated, frogpilot_toggles, randomize_theme=randomize_theme) if time_validated: run_thread_with_lock("backup_toggles", backup_toggles, (params_cache,), report=False) @@ -119,16 +121,14 @@ def frogpilot_thread(): run_update_checks = True - frogpilot_variables.update(theme_manager.theme_assets["holiday_theme"], started) + frogpilot_variables.update(theme_manager.holiday_theme, started) frogpilot_toggles = get_frogpilot_toggles() if frogpilot_toggles.lock_doors_timer: run_thread_with_lock("lock_doors", lock_doors, (frogpilot_toggles.lock_doors_timer, sm)) if frogpilot_toggles.random_themes: - theme_updated = theme_manager.update_active_theme(time_validated, frogpilot_toggles, randomize_theme=True) - - run_thread_with_lock("restart_processes", restart_processes, (sm,)) + theme_manager.update_active_theme(time_validated, frogpilot_toggles, randomize_theme=True) params_memory.put_bool("IsOnroad", False) @@ -141,11 +141,10 @@ def frogpilot_thread(): params_memory.put_bool("IsOnroad", True) if started and sm.updated["modelV2"]: - frogpilot_planner.update(sm["carState"], sm["controlsState"], sm["frogpilotCarState"], sm["frogpilotNavigation"], - sm["liveLocationKalman"], sm["modelV2"], radarless_model, sm["radarState"], frogpilot_toggles) + frogpilot_planner.update(radarless_model, sm, frogpilot_toggles) frogpilot_planner.publish(sm, pm, toggles_updated) - frogpilot_tracking.update(sm["carState"], sm["controlsState"], sm["frogpilotCarState"]) + frogpilot_tracking.update(sm) elif not started and toggles_updated: frogpilot_plan_send = messaging.new_message("frogpilotPlan") frogpilot_plan_send.frogpilotPlan.togglesUpdated = toggles_updated @@ -168,7 +167,7 @@ def frogpilot_thread(): run_update_checks &= time_validated if run_update_checks: - theme_updated = theme_manager.update_active_theme(time_validated, frogpilot_toggles) + theme_manager.update_active_theme(time_validated, frogpilot_toggles) run_thread_with_lock("update_checks", update_checks, (manually_updated, model_manager, now, sm, theme_manager, frogpilot_toggles)) run_update_checks = False @@ -177,7 +176,7 @@ def frogpilot_thread(): if not time_validated: continue - theme_updated = theme_manager.update_active_theme(time_validated, frogpilot_toggles) + theme_manager.update_active_theme(time_validated, frogpilot_toggles) run_thread_with_lock("update_checks", update_checks, (manually_updated, model_manager, now, sm, theme_manager, frogpilot_toggles, True)) def main(): diff --git a/selfdrive/frogpilot/navigation/mapd.py b/frogpilot/navigation/mapd.py similarity index 91% rename from selfdrive/frogpilot/navigation/mapd.py rename to frogpilot/navigation/mapd.py index 149d570886..3018c6e6c3 100644 --- a/selfdrive/frogpilot/navigation/mapd.py +++ b/frogpilot/navigation/mapd.py @@ -10,10 +10,10 @@ import urllib.request from pathlib import Path -from openpilot.selfdrive.frogpilot.frogpilot_utilities import is_url_pingable -from openpilot.selfdrive.frogpilot.frogpilot_variables import MAPD_PATH +from openpilot.frogpilot.common.frogpilot_utilities import is_url_pingable +from openpilot.frogpilot.common.frogpilot_variables import MAPD_PATH, params_memory -VERSION = "v1" +VERSION = "v2" GITHUB_VERSION_URL = f"https://github.com/FrogAi/FrogPilot-Resources/raw/Versions/mapd_version_{VERSION}.json" GITLAB_VERSION_URL = f"https://gitlab.com/FrogAi/FrogPilot-Resources/-/raw/Versions/mapd_version_{VERSION}.json" @@ -83,6 +83,8 @@ def mapd_thread(): process.wait() def main(): + params_memory.put("MapdLogLevel", "disabled") + mapd_thread() if __name__ == "__main__": diff --git a/selfdrive/frogpilot/navigation/navigation_training/both_keys_set.png b/frogpilot/navigation/navigation_training/both_keys_set.png similarity index 100% rename from selfdrive/frogpilot/navigation/navigation_training/both_keys_set.png rename to frogpilot/navigation/navigation_training/both_keys_set.png diff --git a/selfdrive/frogpilot/navigation/navigation_training/no_keys_set.png b/frogpilot/navigation/navigation_training/no_keys_set.png similarity index 100% rename from selfdrive/frogpilot/navigation/navigation_training/no_keys_set.png rename to frogpilot/navigation/navigation_training/no_keys_set.png diff --git a/selfdrive/frogpilot/navigation/navigation_training/public_key_set.png b/frogpilot/navigation/navigation_training/public_key_set.png similarity index 100% rename from selfdrive/frogpilot/navigation/navigation_training/public_key_set.png rename to frogpilot/navigation/navigation_training/public_key_set.png diff --git a/selfdrive/frogpilot/navigation/navigation_training/setup_completed.png b/frogpilot/navigation/navigation_training/setup_completed.png similarity index 100% rename from selfdrive/frogpilot/navigation/navigation_training/setup_completed.png rename to frogpilot/navigation/navigation_training/setup_completed.png diff --git a/selfdrive/frogpilot/fleetmanager/README.md b/frogpilot/system/fleetmanager/README.md similarity index 100% rename from selfdrive/frogpilot/fleetmanager/README.md rename to frogpilot/system/fleetmanager/README.md diff --git a/selfdrive/frogpilot/fleetmanager/fleet_manager.py b/frogpilot/system/fleetmanager/fleet_manager.py similarity index 95% rename from selfdrive/frogpilot/fleetmanager/fleet_manager.py rename to frogpilot/system/fleetmanager/fleet_manager.py index 94d780cbea..721f2b237a 100644 --- a/selfdrive/frogpilot/fleetmanager/fleet_manager.py +++ b/frogpilot/system/fleetmanager/fleet_manager.py @@ -21,12 +21,13 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +import json import os import requests import secrets import traceback -import openpilot.selfdrive.frogpilot.fleetmanager.helpers as fleet +import openpilot.frogpilot.system.fleetmanager.helpers as fleet from flask import Flask, Response, jsonify, redirect, render_template, request, send_from_directory, session, url_for from pathlib import Path @@ -36,6 +37,8 @@ from openpilot.common.realtime import set_core_affinity from openpilot.common.swaglog import cloudlog from openpilot.system.hardware.hw import Paths +from openpilot.frogpilot.common.frogpilot_variables import params + app = Flask(__name__) @app.route("/") @@ -352,6 +355,21 @@ def download_tmux_log(filename): except Exception as error: return jsonify({"error": "Failed to download the file...", "details": str(error)}), 400 +@app.route("/speed_limits", methods=['GET']) +def speed_limits(): + try: + os.makedirs(fleet.SPEED_LIMITS_PATH, exist_ok=True) + file_path = os.path.join(fleet.SPEED_LIMITS_PATH, "speed_limits.json") + + with open(file_path, "w") as json_file: + json.dump(json.loads(params.get("SpeedLimitsFiltered") or "[]"), json_file, indent=2) + + fleet.update_dataset() + + return send_from_directory(fleet.SPEED_LIMITS_PATH, "speed_limits.json", as_attachment=True) + except Exception as error: + return jsonify({"error": "Failed to download the speed limits file...", "details": str(error)}), 400 + @app.route("/lock_doors", methods=['POST']) def lock_doors_route(): try: diff --git a/selfdrive/frogpilot/fleetmanager/helpers.py b/frogpilot/system/fleetmanager/helpers.py similarity index 83% rename from selfdrive/frogpilot/fleetmanager/helpers.py rename to frogpilot/system/fleetmanager/helpers.py index a593b37286..8d7368d2b6 100644 --- a/selfdrive/frogpilot/fleetmanager/helpers.py +++ b/frogpilot/system/fleetmanager/helpers.py @@ -30,7 +30,7 @@ import traceback import openpilot.system.sentry as sentry -from datetime import datetime +from datetime import datetime, timedelta, timezone from pathlib import Path from typing import List from urllib.parse import quote @@ -44,7 +44,7 @@ from openpilot.system.loggerd.xattr_cache import getxattr from panda import Panda from tools.lib.route import SegmentName -from openpilot.selfdrive.frogpilot.frogpilot_variables import ERROR_LOGS_PATH, EXCLUDED_KEYS, frogpilot_default_params, params, update_frogpilot_toggles +from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, EXCLUDED_KEYS, frogpilot_default_params, params, params_cache, update_frogpilot_toggles XOR_KEY = "s8#pL3*Xj!aZ@dWq" @@ -62,10 +62,12 @@ PRESERVE_COUNT = 5 if PC: SCREENRECORD_PATH = os.path.join(str(Path.home()), ".comma", "media", "screen_recordings", "") ERROR_LOGS_PATH = os.path.join(str(Path.home()), ".comma", "error_logs", "") + SPEED_LIMITS_PATH = os.path.join(str(Path.home()), ".comma", "speed_limits") TMUX_LOGS_PATH = os.path.join(str(Path.home()), ".comma", "tmux_logs") else: SCREENRECORD_PATH = "/data/media/screen_recordings/" ERROR_LOGS_PATH = ERROR_LOGS_PATH + SPEED_LIMITS_PATH = "/data/speed_limits/" TMUX_LOGS_PATH = "/data/tmux_logs/" @@ -231,20 +233,20 @@ def get_nav_active(): return False def get_amap_key(): - token = params.get("AMapKey1", encoding='utf8') - token2 = params.get("AMapKey2", encoding='utf8') + token = params_cache.get("AMapKey1", encoding='utf8') + token2 = params_cache.get("AMapKey2", encoding='utf8') return (token.strip() if token else None, token2.strip() if token2 else None) def get_gmap_key(): - token = params.get("GMapKey", encoding='utf8') + token = params_cache.get("GMapKey", encoding='utf8') return token.strip() if token else None def get_public_token(): - token = params.get("MapboxPublicKey", encoding='utf8') + token = params_cache.get("MapboxPublicKey", encoding='utf8') return token.strip() if token and token.startswith("pk") else None def get_secret_token(): - token = params.get("MapboxSecretKey", encoding='utf8') + token = params_cache.get("MapboxSecretKey", encoding='utf8') return token.strip() if token and token.startswith("sk") else None def get_search_input(): @@ -379,7 +381,7 @@ def public_token_input(postvars): if "pk." not in token: return postvars else: - params.put("MapboxPublicKey", token) + params_cache.put("MapboxPublicKey", token) return token def app_token_input(postvars): @@ -390,7 +392,7 @@ def app_token_input(postvars): if "sk." not in token: return postvars else: - params.put("MapboxSecretKey", token) + params_cache.put("MapboxSecretKey", token) return token def gmap_key_input(postvars): @@ -398,7 +400,7 @@ def gmap_key_input(postvars): return postvars else: token = postvars.get("gmap_key_val").strip() - params.put("GMapKey", token) + params_cache.put("GMapKey", token) return token def amap_key_input(postvars): @@ -407,8 +409,8 @@ def amap_key_input(postvars): else: token = postvars.get("amap_key_val").strip() token2 = postvars.get("amap_key_val_2").strip() - params.put("AMapKey1", token) - params.put("AMapKey2", token2) + params_cache.put("AMapKey1", token) + params_cache.put("AMapKey2", token2) return token def gcj02towgs84(lng, lat): @@ -503,105 +505,23 @@ def capture_tmux_log(): except subprocess.CalledProcessError as e: raise Exception(f"Error capturing tmux log: {e}") +def update_dataset(): + updated_dataset = json.loads(params.get("SpeedLimitsFiltered") or "[]") + last_vetted_time = (datetime.now(timezone.utc) - timedelta(days=6, hours=23)).isoformat() + updated_dataset = [{**entry, "last_vetted": last_vetted_time} for entry in updated_dataset] + params.put("SpeedLimitsFiltered", json.dumps(updated_dataset)) + def lock_doors(): - try: - print("Attempting to lock doors...") - - panda = Panda() - print(f"Panda connected: {panda.get_usb_serial()}") - print(f"Firmware Version: {panda.get_version()}") - print(f"Hardware Type: {panda.get_type()}") - initial_safety = panda.health()["safety_mode"] - print(f"Initial Safety Mode: {initial_safety}") - - os.system("pkill -STOP -f pandad") - - print("Setting safety mode to SAFETY_TOYOTA...") + with Panda() as panda: panda.set_safety_mode(panda.SAFETY_TOYOTA) - - new_safety = panda.health()["safety_mode"] - print(f"Safety Mode after change: {new_safety}") - - if new_safety != panda.SAFETY_TOYOTA: - print("Failed to set SAFETY_TOYOTA! Aborting.") - return - - can_health = panda.can_health(0) - print(f"CAN0 Health: {can_health}") - - print(f"Sending CAN message to lock doors (ID=0x750, CMD={LOCK_CMD.hex()})...") panda.can_send(0x750, LOCK_CMD, 0) - - new_can_health = panda.can_health(0) - print(f"CAN0 Health after send: {new_can_health}") - - final_safety = panda.health()["safety_mode"] - print(f"Final Safety Mode: {final_safety}") - - print("Sending Panda heartbeat...") panda.send_heartbeat() - print("Closing Panda connection.") - panda.close() - - print("Lock doors operation completed successfully!") - - print("Starting the pandad process...") - os.system("pkill -CONT -f pandad") - - except Exception as error: - print(f"Error in lock_doors(): {error}") - print(traceback.format_exc()) - def unlock_doors(): - try: - print("Attempting to unlock doors...") - - panda = Panda() - print(f"Panda connected: {panda.get_usb_serial()}") - print(f"Firmware Version: {panda.get_version()}") - print(f"Hardware Type: {panda.get_type()}") - initial_safety = panda.health()["safety_mode"] - print(f"Initial Safety Mode: {initial_safety}") - - os.system("pkill -STOP -f pandad") - - print("Setting safety mode to SAFETY_TOYOTA...") + with Panda() as panda: panda.set_safety_mode(panda.SAFETY_TOYOTA) - - new_safety = panda.health()["safety_mode"] - print(f"Safety Mode after change: {new_safety}") - - if new_safety != panda.SAFETY_TOYOTA: - print("Failed to set SAFETY_TOYOTA! Aborting.") - return - - can_health = panda.can_health(0) - print(f"CAN0 Health: {can_health}") - - print(f"Sending CAN message to unlock doors (ID=0x750, CMD={UNLOCK_CMD.hex()})...") panda.can_send(0x750, UNLOCK_CMD, 0) - - new_can_health = panda.can_health(0) - print(f"CAN0 Health after send: {new_can_health}") - - final_safety = panda.health()["safety_mode"] - print(f"Final Safety Mode: {final_safety}") - - print("Sending Panda heartbeat...") panda.send_heartbeat() - print("Closing Panda connection.") - panda.close() - - print("Unlock doors operation completed successfully!") - - print("Starting the pandad process...") - os.system("pkill -CONT -f pandad") - - except Exception as error: - print(f"Error in unlock_doors(): {error}") - print(traceback.format_exc()) - def reboot_device(): HARDWARE.reboot() diff --git a/selfdrive/frogpilot/fleetmanager/static/favicon.ico b/frogpilot/system/fleetmanager/static/favicon.ico similarity index 100% rename from selfdrive/frogpilot/fleetmanager/static/favicon.ico rename to frogpilot/system/fleetmanager/static/favicon.ico diff --git a/frogpilot/system/fleetmanager/static/frog.png b/frogpilot/system/fleetmanager/static/frog.png new file mode 100644 index 0000000000..aab72c37a3 Binary files /dev/null and b/frogpilot/system/fleetmanager/static/frog.png differ diff --git a/selfdrive/frogpilot/fleetmanager/templates/about.html b/frogpilot/system/fleetmanager/templates/about.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/about.html rename to frogpilot/system/fleetmanager/templates/about.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/addr.html b/frogpilot/system/fleetmanager/templates/addr.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/addr.html rename to frogpilot/system/fleetmanager/templates/addr.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/addr_input.html b/frogpilot/system/fleetmanager/templates/addr_input.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/addr_input.html rename to frogpilot/system/fleetmanager/templates/addr_input.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/amap_addr_input.html b/frogpilot/system/fleetmanager/templates/amap_addr_input.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/amap_addr_input.html rename to frogpilot/system/fleetmanager/templates/amap_addr_input.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/amap_key_input.html b/frogpilot/system/fleetmanager/templates/amap_key_input.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/amap_key_input.html rename to frogpilot/system/fleetmanager/templates/amap_key_input.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/app_token_input.html b/frogpilot/system/fleetmanager/templates/app_token_input.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/app_token_input.html rename to frogpilot/system/fleetmanager/templates/app_token_input.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/error.html b/frogpilot/system/fleetmanager/templates/error.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/error.html rename to frogpilot/system/fleetmanager/templates/error.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/error_log.html b/frogpilot/system/fleetmanager/templates/error_log.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/error_log.html rename to frogpilot/system/fleetmanager/templates/error_log.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/error_logs.html b/frogpilot/system/fleetmanager/templates/error_logs.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/error_logs.html rename to frogpilot/system/fleetmanager/templates/error_logs.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/footage.html b/frogpilot/system/fleetmanager/templates/footage.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/footage.html rename to frogpilot/system/fleetmanager/templates/footage.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/gmap_key_input.html b/frogpilot/system/fleetmanager/templates/gmap_key_input.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/gmap_key_input.html rename to frogpilot/system/fleetmanager/templates/gmap_key_input.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/index.html b/frogpilot/system/fleetmanager/templates/index.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/index.html rename to frogpilot/system/fleetmanager/templates/index.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/layout.html b/frogpilot/system/fleetmanager/templates/layout.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/layout.html rename to frogpilot/system/fleetmanager/templates/layout.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/nav_confirmation.html b/frogpilot/system/fleetmanager/templates/nav_confirmation.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/nav_confirmation.html rename to frogpilot/system/fleetmanager/templates/nav_confirmation.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/nav_directions.html b/frogpilot/system/fleetmanager/templates/nav_directions.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/nav_directions.html rename to frogpilot/system/fleetmanager/templates/nav_directions.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/nonprime.html b/frogpilot/system/fleetmanager/templates/nonprime.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/nonprime.html rename to frogpilot/system/fleetmanager/templates/nonprime.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/preserved.html b/frogpilot/system/fleetmanager/templates/preserved.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/preserved.html rename to frogpilot/system/fleetmanager/templates/preserved.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/public_token_input.html b/frogpilot/system/fleetmanager/templates/public_token_input.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/public_token_input.html rename to frogpilot/system/fleetmanager/templates/public_token_input.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/route.html b/frogpilot/system/fleetmanager/templates/route.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/route.html rename to frogpilot/system/fleetmanager/templates/route.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/screenrecords.html b/frogpilot/system/fleetmanager/templates/screenrecords.html similarity index 100% rename from selfdrive/frogpilot/fleetmanager/templates/screenrecords.html rename to frogpilot/system/fleetmanager/templates/screenrecords.html diff --git a/selfdrive/frogpilot/fleetmanager/templates/tools.html b/frogpilot/system/fleetmanager/templates/tools.html similarity index 96% rename from selfdrive/frogpilot/fleetmanager/templates/tools.html rename to frogpilot/system/fleetmanager/templates/tools.html index 67fc80b385..40ddfa8c97 100644 --- a/selfdrive/frogpilot/fleetmanager/templates/tools.html +++ b/frogpilot/system/fleetmanager/templates/tools.html @@ -115,6 +115,15 @@ Tools + +
+ +

Download Speed Limits

+