From 04f59c55d8e18c31f958256276a56bfa9631e4f8 Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:00:00 -0700 Subject: [PATCH] Custom Themes --- .../assets/stock_theme/colors/colors.json | 44 ++ .../stock_theme/distance_icons/aggressive.png | Bin 0 -> 40840 bytes .../stock_theme/distance_icons/relaxed.png | Bin 0 -> 47561 bytes .../stock_theme/distance_icons/standard.png | Bin 0 -> 42802 bytes .../stock_theme/distance_icons/traffic.png | Bin 0 -> 37777 bytes frogpilot/assets/stock_theme/icons | 1 + frogpilot/assets/stock_theme/sounds | 1 + .../stock_theme/steering_wheel/wheel.png | 1 + frogpilot/assets/theme_manager.py | 522 ++++++++++++++++++ frogpilot/common/frogpilot_functions.py | 7 +- frogpilot/common/frogpilot_variables.py | 26 + frogpilot/controls/frogpilot_planner.py | 4 +- frogpilot/frogpilot_process.py | 29 +- frogpilot/ui/frogpilot_ui.cc | 3 + frogpilot/ui/frogpilot_ui.h | 1 + .../qt/onroad/frogpilot_annotated_camera.cc | 140 +++++ .../ui/qt/onroad/frogpilot_annotated_camera.h | 23 + selfdrive/ui/qt/onroad/buttons.cc | 19 +- selfdrive/ui/qt/onroad/buttons.h | 5 + selfdrive/ui/qt/onroad/model.cc | 38 +- selfdrive/ui/qt/sidebar.cc | 18 +- selfdrive/ui/qt/sidebar.h | 5 + selfdrive/ui/soundd.py | 53 +- 23 files changed, 897 insertions(+), 43 deletions(-) create mode 100644 frogpilot/assets/stock_theme/colors/colors.json create mode 100644 frogpilot/assets/stock_theme/distance_icons/aggressive.png create mode 100644 frogpilot/assets/stock_theme/distance_icons/relaxed.png create mode 100644 frogpilot/assets/stock_theme/distance_icons/standard.png create mode 100644 frogpilot/assets/stock_theme/distance_icons/traffic.png create mode 120000 frogpilot/assets/stock_theme/icons create mode 120000 frogpilot/assets/stock_theme/sounds create mode 120000 frogpilot/assets/stock_theme/steering_wheel/wheel.png create mode 100644 frogpilot/assets/theme_manager.py diff --git a/frogpilot/assets/stock_theme/colors/colors.json b/frogpilot/assets/stock_theme/colors/colors.json new file mode 100644 index 000000000..177c002a1 --- /dev/null +++ b/frogpilot/assets/stock_theme/colors/colors.json @@ -0,0 +1,44 @@ +{ + "LaneLines": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 178 + }, + "LeadMarker": { + "red": 201, + "green": 34, + "blue": 49, + "alpha": 255 + }, + "Path": { + "red": 48, + "green": 255, + "blue": 156, + "alpha": 255 + }, + "PathEdge": { + "red": 38, + "green": 209, + "blue": 125, + "alpha": 255 + }, + "Sidebar1": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 178 + }, + "Sidebar2": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + }, + "Sidebar3": { + "red": 255, + "green": 255, + "blue": 255, + "alpha": 255 + } +} 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 0000000000000000000000000000000000000000..9aa3ea30f13b2d28c5655ce9aca1fa623e87cb28 GIT binary patch literal 40840 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 Hu0mjf3R_{2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9e12057391f07dae4501506c112e299d82ff0702 GIT binary patch literal 42802 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 UH9?9OJpcdz07*qoM6N<$g11a0g8%>k literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e028dc365b7e98340e5740cd91ead54101c9e61f GIT binary patch literal 37777 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 0: + local_size = self.theme_sizes.get("wheels", {}).get(theme_name) + if local_size != size: + self.download_theme("steering_wheels", theme_name, THEME_COMPONENT_PARAMS["steering_wheels"], frogpilot_toggles) + + elif branch == "Distance-Icons": + component_name = "distance_icons" + theme_name = Path(path).stem + assets["themes"].setdefault(theme_name, set()).add(component_name) + + local_path = THEME_SAVE_PATH / "theme_packs" / theme_name / component_name + if local_path.exists() and size > 0: + local_size = self.theme_sizes.get("themes", {}).get(theme_name, {}).get(component_name) + if local_size != size: + self.download_theme(component_name, theme_name, THEME_COMPONENT_PARAMS[component_name], frogpilot_toggles) + + branch = "Themes" + for item in list_files(branch): + if item.get("type") not in ("file", "blob") or "/" not in item["path"]: + continue + + expected_size = file_size(branch, item["path"], item.get("size", 0)) + + theme_name, sub_path = item["path"].split("/", 1) + theme_path = sub_path.lower() + + for key in ("colors", "icons", "signals", "sounds"): + if key in theme_path: + assets["themes"].setdefault(theme_name, set()).add(key) + + local_path = THEME_SAVE_PATH / "theme_packs" / theme_name / key + if local_path.exists(): + local_size = self.theme_sizes.get("themes", {}).get(theme_name, {}).get(key) + if local_size != expected_size: + print(f"{key} {theme_name} is outdated, redownloading...") + self.download_theme(key, theme_name, THEME_COMPONENT_PARAMS[key], frogpilot_toggles) + break + + assets["themes"] = {key: sorted(list(value)) for key, value in assets["themes"].items()} + assets["wheels"].sort() + return assets + + except requests.exceptions.RequestException as error: + print(f"Failed to fetch theme sizes from {'GitHub' if is_github else 'GitLab'}: {error}") + return {} + + @staticmethod + def format_name(name, component): + base = Path(name).stem + creator = "" + if "~" in base: + base, creator = base.split("~", 1) + + parts = base.replace("_", "-").split("-") + capitalized_parts = [part.capitalize() for part in parts if part] + + if len(capitalized_parts) > 1 and component != "steering_wheels": + display = f"{capitalized_parts[0]} ({' '.join(capitalized_parts[1:])})" + else: + display = " ".join(capitalized_parts) + + if creator: + return f"{display} - by: {creator}" + return display + + @staticmethod + def get_full_themes(): + theme_packs_path = THEME_SAVE_PATH / "theme_packs" + if not theme_packs_path.exists(): + return [] + + valid_themes = set() + for theme_directory in theme_packs_path.iterdir(): + if not theme_directory.is_dir(): + continue + + base_name = theme_directory.name.replace("-animated", "") + + animated_path = theme_packs_path / f"{base_name}-animated" + base_path = theme_packs_path / base_name + + 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 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) + + return sorted(valid_themes) + + def handle_verification_failure(self, extension, theme_component, theme_name, asset_param, theme_path, download_path, frogpilot_toggles): + if theme_component == "distance_icons": + download_link = f"{GITLAB_URL}/Distance-Icons/{theme_name}" + elif theme_component == "steering_wheels": + download_link = f"{GITLAB_URL}/Steering-Wheels/{theme_name}" + else: + download_link = f"{GITLAB_URL}/Themes/{theme_name}/{theme_component}" + + delete_file(theme_path) + + theme_url = download_link + extension + print(f"Downloading theme from GitLab: {theme_name}") + download_file(CANCEL_DOWNLOAD_PARAM, theme_path, asset_param, self.params_memory, DOWNLOAD_PROGRESS_PARAM, self.session, theme_url) + + if theme_component == "steering_wheels" and not theme_path.exists() and theme_path.with_suffix(".png").exists(): + theme_path = theme_path.with_suffix(".png") + extension = ".png" + theme_url = theme_url.replace(".gif", ".png") + + if verify_download(theme_path, self.params_memory, self.session, theme_url): + print(f"Theme {theme_name} downloaded and verified successfully from GitLab!") + self.update_theme_size(theme_component, theme_name, theme_path.stat().st_size) + + if extension == ".zip": + self.params_memory.put(DOWNLOAD_PROGRESS_PARAM, "Unpacking theme...") + extract_zip(theme_path, download_path) + + self.params_memory.put(DOWNLOAD_PROGRESS_PARAM, "Downloaded!") + self.params_memory.remove(asset_param) + + self.downloading_theme = False + + self.update_themes(frogpilot_toggles) + return True + + handle_error(None, asset_param, "Download failed...", "Download failed...", self.params_memory, DOWNLOAD_PROGRESS_PARAM) + self.downloading_theme = False + return False + + def update_active_theme(self, frogpilot_toggles, boot_run=False): + asset_mappings = { + "color_scheme": ("colors", frogpilot_toggles.color_scheme), + "distance_icons": ("distance_icons", frogpilot_toggles.distance_icons), + "icon_pack": ("icons", frogpilot_toggles.icon_pack), + "sound_pack": ("sounds", frogpilot_toggles.sound_pack), + "turn_signal_pack": ("signals", frogpilot_toggles.signal_icons), + "wheel_image": ("wheel_image", frogpilot_toggles.wheel_image) + } + + if asset_mappings != self.previous_asset_mappings: + for asset, (asset_type, current_value) in asset_mappings.items(): + print(f"Updating {asset}: {asset_type} with value {current_value}") + + if asset_type == "wheel_image": + self.update_wheel_image(current_value, boot_run=boot_run) + else: + self.update_theme_asset(asset_type, current_value, boot_run=boot_run) + + self.previous_asset_mappings = asset_mappings + + self.theme_updated = True + + def update_theme_asset(self, asset_type, theme, boot_run=False): + save_location = ACTIVE_THEME_PATH / asset_type + asset_location = THEME_SAVE_PATH / "theme_packs" / theme / asset_type + + if not asset_location.exists() or theme == "stock": + asset_location = STOCKOP_THEME_PATH / asset_type + print(f"Using the stock {asset_type[:-1]} instead") + + delete_file(save_location, print_error=not boot_run) + + save_location.parent.mkdir(parents=True, exist_ok=True) + save_location.symlink_to(asset_location, target_is_directory=True) + print(f"Linked {save_location} to {asset_location}") + + def update_theme_params(self, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels): + def update_param(key, assets, subfolder): + if subfolder == "steering_wheels": + themes_path = THEME_SAVE_PATH / subfolder + existing_assets = {self.format_name(item.name, "steering_wheels") for item in themes_path.glob("*") if item.is_file()} + else: + themes_path = THEME_SAVE_PATH / "theme_packs" + existing_assets = {self.format_name(item.parent.name, subfolder) for item in themes_path.glob(f"*/{subfolder}") if item.is_dir()} + + self.params.put(key, ",".join(sorted(set(assets) - existing_assets))) + print(f"{key} updated successfully") + + update_param("DownloadableColors", downloadable_colors, "colors") + update_param("DownloadableDistanceIcons", downloadable_distance_icons, "distance_icons") + update_param("DownloadableIcons", downloadable_icons, "icons") + update_param("DownloadableSignals", downloadable_signals, "signals") + update_param("DownloadableSounds", downloadable_sounds, "sounds") + update_param("DownloadableWheels", downloadable_wheels, "steering_wheels") + + downloaded_themes = {} + for theme_dir in (THEME_SAVE_PATH / "theme_packs").iterdir(): + components = [] + for component in ["colors", "distance_icons", "icons", "signals", "sounds"]: + if (theme_dir / component).is_dir(): + components.append(component) + + if components: + theme_name = self.format_name(theme_dir.name, "theme_packs") + downloaded_themes[theme_name] = sorted(components) + + downloaded_wheels = [] + for wheel_file in (THEME_SAVE_PATH / "steering_wheels").iterdir(): + if wheel_file.is_file(): + downloaded_wheels.append(self.format_name(wheel_file.name, "steering_wheels")) + + self.params.put("ThemesDownloaded", { + "themes": {key: downloaded_themes[key] for key in sorted(downloaded_themes)}, + "steering_wheels": sorted(downloaded_wheels) + }) + + print("ThemesDownloaded updated successfully") + + def update_theme_size(self, theme_component, theme_name, file_size): + if theme_component == "steering_wheels": + key = "wheels" + else: + key = "themes" + + if key not in self.theme_sizes: + self.theme_sizes[key] = {} + + if key == "wheels": + self.theme_sizes[key][theme_name] = file_size + else: + if theme_name not in self.theme_sizes[key]: + self.theme_sizes[key][theme_name] = {} + self.theme_sizes[key][theme_name][theme_component] = file_size + + update_json_file(self.theme_sizes_path, self.theme_sizes) + + def update_themes(self, frogpilot_toggles, boot_run=False): + if self.downloading_theme: + return + + repo_url = get_repository_url(self.session) + if repo_url is None: + print("GitHub and GitLab are offline...") + return + + assets = self.fetch_assets(repo_url, frogpilot_toggles) + if not assets: + return + + downloadable_colors = [] + downloadable_distance_icons = [] + downloadable_icons = [] + downloadable_signals = [] + downloadable_sounds = [] + + for theme, available_assets in assets["themes"].items(): + theme_name = self.format_name(theme, "theme_packs") + print(f"Theme found: {theme_name}") + + if "colors" in available_assets: + downloadable_colors.append(theme_name) + if "distance_icons" in available_assets: + downloadable_distance_icons.append(theme_name) + if "icons" in available_assets: + downloadable_icons.append(theme_name) + if "signals" in available_assets: + downloadable_signals.append(theme_name) + if "sounds" in available_assets: + downloadable_sounds.append(theme_name) + + downloadable_wheels = [self.format_name(wheel, "steering_wheels") for wheel in assets["wheels"]] + + print(f"Downloadable Colors: {downloadable_colors}") + print(f"Downloadable Icons: {downloadable_icons}") + print(f"Downloadable Signals: {downloadable_signals}") + print(f"Downloadable Sounds: {downloadable_sounds}") + print(f"Downloadable Distance Icons: {downloadable_distance_icons}") + print(f"Downloadable Wheels: {downloadable_wheels}") + + if boot_run: + self.validate_themes(downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels, frogpilot_toggles) + + self.update_theme_params(downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels) + + def update_wheel_image(self, image, boot_run=False): + wheel_save_location = ACTIVE_THEME_PATH / "steering_wheel" + + if image == "stock": + wheel_location = STOCKOP_THEME_PATH / "steering_wheel" + else: + wheel_location = THEME_SAVE_PATH / "steering_wheels" + + if not wheel_location.exists(): + wheel_location = STOCKOP_THEME_PATH / "steering_wheel" + print("Using the stock steering wheel instead") + + delete_file(wheel_save_location, print_error=not boot_run) + wheel_save_location.mkdir(parents=True, exist_ok=True) + + image_name = image.replace(" ", "_").lower() + matching_files = [images for images in wheel_location.iterdir() if images.stem.lower() in {image_name, "wheel"}] + if matching_files: + source_file = matching_files[0] + destination_file = wheel_save_location / f"wheel{source_file.suffix}" + destination_file.symlink_to(source_file) + print(f"Linked {destination_file} to {source_file}") + + def validate_themes(self, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels, frogpilot_toggles): + downloaded_data = self.params.get("ThemesDownloaded") + + for display_name, components in downloaded_data.get("themes", {}).items(): + raw_name = display_name.lower().replace(" ", "_").replace("(", "").replace(")", "") + theme_folder_name = raw_name.replace("_animated", "-animated") + + for component in components: + component_path = THEME_SAVE_PATH / "theme_packs" / theme_folder_name / component + if not component_path.is_dir() or not any(component_path.iterdir()): + print(f"Missing or empty component '{component}' for theme '{theme_folder_name}'. Downloading...") + self.download_theme(component, theme_folder_name, THEME_COMPONENT_PARAMS.get(component), frogpilot_toggles) + self.update_active_theme(frogpilot_toggles) + + wheels_path = THEME_SAVE_PATH / "steering_wheels" + for display_name in downloaded_data.get("steering_wheels", []): + file_stem = display_name.replace(" ", "_").lower() + matching_files = list(wheels_path.glob(f"{file_stem}.*")) + if not matching_files: + print(f"Missing steering wheel '{display_name}'. Downloading...") + self.download_theme("steering_wheels", file_stem, THEME_COMPONENT_PARAMS["steering_wheels"], frogpilot_toggles) + self.update_active_theme(frogpilot_toggles) + + for dir_path in THEME_SAVE_PATH.glob("**/*"): + if dir_path.is_dir() and not any(dir_path.iterdir()): + print(f"Deleting empty folder: {dir_path}") + delete_file(dir_path) + elif dir_path.is_file() and dir_path.name.startswith("tmp"): + print(f"Deleting temp file: {dir_path}") + delete_file(dir_path) + + print("Theme validation complete.") diff --git a/frogpilot/common/frogpilot_functions.py b/frogpilot/common/frogpilot_functions.py index f5192d84a..b5bf3a5ce 100644 --- a/frogpilot/common/frogpilot_functions.py +++ b/frogpilot/common/frogpilot_functions.py @@ -11,11 +11,12 @@ from openpilot.common.params import Params from openpilot.common.time_helpers import system_time_valid from openpilot.system.hardware import HARDWARE +from openpilot.frogpilot.assets.theme_manager import ThemeManager from openpilot.frogpilot.common.frogpilot_backups import backup_frogpilot from openpilot.frogpilot.common.frogpilot_utilities import is_FrogsGoMoo, run_cmd from openpilot.frogpilot.common.frogpilot_variables import ( - FROGS_GO_MOO_PATH, - FrogPilotVariables + FROGS_GO_MOO_PATH, THEME_SAVE_PATH, + FrogPilotVariables, get_frogpilot_toggles ) @@ -23,6 +24,7 @@ def frogpilot_boot_functions(build_metadata, params): params_memory = Params(memory=True) FrogPilotVariables() + ThemeManager(params, params_memory, boot_run=True).update_active_theme(frogpilot_toggles=get_frogpilot_toggles(), boot_run=True) def boot_thread(): while not system_time_valid(): @@ -36,6 +38,7 @@ def frogpilot_boot_functions(build_metadata, params): def install_frogpilot(build_metadata, params): paths = [ + THEME_SAVE_PATH ] for path in paths: path.mkdir(parents=True, exist_ok=True) diff --git a/frogpilot/common/frogpilot_variables.py b/frogpilot/common/frogpilot_variables.py index ab9f19d64..aa5415b96 100644 --- a/frogpilot/common/frogpilot_variables.py +++ b/frogpilot/common/frogpilot_variables.py @@ -148,8 +148,18 @@ class FrogPilotVariables: self.frogs_go_moo = FROGS_GO_MOO_PATH.is_file() toggle.block_user = (self.development_branch or branch == "MAKE-PRS-HERE" or self.vetting_branch) and not self.frogs_go_moo + stock_colors_json = (STOCK_THEME_PATH / "colors/colors.json") + self.stock_colors = json.loads(stock_colors_json.read_text()) if stock_colors_json.is_file() else {} + self.update() + def get_color(self, key, theme_colors): + for source in (theme_colors, self.stock_colors): + color = source.get(key) + if isinstance(color, dict): + return f"#{color.get("alpha", 255):02X}{color.get("red", 255):02X}{color.get("green", 255):02X}{color.get("blue", 255):02X}" + return "#FFFFFFFF" + def get_value(self, key, cast=bool, condition=True, conversion=None, default=None, min=None, max=None): if not condition or (self.tuning_level < self.tuning_levels.get(key, 0)): if default is not None: @@ -336,6 +346,22 @@ class FrogPilotVariables: toggle.traffic_mode_jerk_speed_decrease = [self.get_value("TrafficJerkSpeedDecrease", cast=float, condition=toggle.custom_personalities, conversion=0.01, min=0.25, max=2.0), toggle.aggressive_jerk_speed_decrease] toggle.traffic_mode_follow = [self.get_value("TrafficFollow", cast=float, condition=toggle.custom_personalities, min=0.5, max=MAX_T_FOLLOW), toggle.aggressive_follow] + custom_themes = self.get_value("CustomThemes") + toggle.color_scheme = self.get_value("ColorScheme", cast=None, condition=custom_themes, default="stock") + theme_colors = json.loads(THEME_COLORS_PATH.read_text()) if THEME_COLORS_PATH.is_file() else {} + toggle.lane_lines_color = self.get_color("LaneLines", theme_colors) + toggle.lead_marker_color = self.get_color("LeadMarker", theme_colors) + toggle.path_color = self.get_color("Path", theme_colors) + toggle.path_edges_color = self.get_color("PathEdge", theme_colors) + toggle.sidebar_color1 = self.get_color("Sidebar1", theme_colors) + toggle.sidebar_color2 = self.get_color("Sidebar2", theme_colors) + toggle.sidebar_color3 = self.get_color("Sidebar3", theme_colors) + toggle.distance_icons = self.get_value("DistanceIconPack", cast=None, condition=custom_themes, default="stock") + toggle.icon_pack = self.get_value("IconPack", cast=None, condition=custom_themes, default="stock") + toggle.signal_icons = self.get_value("SignalAnimation", cast=None, condition=custom_themes, default="stock") + toggle.sound_pack = self.get_value("SoundPack", cast=None, condition=custom_themes, default="stock") + toggle.wheel_image = self.get_value("WheelIcon", cast=None, condition=custom_themes, default="stock") + custom_ui = self.get_value("CustomUI") toggle.acceleration_path = toggle.openpilot_longitudinal and (self.get_value("AccelerationPath", condition=custom_ui)) toggle.adjacent_paths = self.get_value("AdjacentPath", condition=custom_ui) diff --git a/frogpilot/controls/frogpilot_planner.py b/frogpilot/controls/frogpilot_planner.py index a9b4a0cc3..350e63a06 100644 --- a/frogpilot/controls/frogpilot_planner.py +++ b/frogpilot/controls/frogpilot_planner.py @@ -106,7 +106,7 @@ class FrogPilotPlanner: self.tracking_lead_filter.update(following_lead) return self.tracking_lead_filter.x >= THRESHOLD - def publish(self, sm, pm, frogpilot_toggles): + def publish(self, theme_updated, sm, pm, frogpilot_toggles): frogpilot_plan_send = messaging.new_message("frogpilotPlan") frogpilot_plan_send.valid = sm.all_checks(service_list=["carState", "controlsState", "selfdriveState", "radarState"]) frogpilotPlan = frogpilot_plan_send.frogpilotPlan @@ -136,6 +136,8 @@ class FrogPilotPlanner: frogpilotPlan.roadCurvature = self.road_curvature + frogpilotPlan.themeUpdated = theme_updated + frogpilotPlan.vCruise = float(self.v_cruise) pm.send("frogpilotPlan", frogpilot_plan_send) diff --git a/frogpilot/frogpilot_process.py b/frogpilot/frogpilot_process.py index f8d21b0a7..eeb2b5c35 100644 --- a/frogpilot/frogpilot_process.py +++ b/frogpilot/frogpilot_process.py @@ -8,6 +8,7 @@ from openpilot.common.params import Params from openpilot.common.realtime import DT_MDL, Priority, Ratekeeper, config_realtime_process from openpilot.common.time_helpers import system_time_valid +from openpilot.frogpilot.assets.theme_manager import THEME_COMPONENT_PARAMS, ThemeManager from openpilot.frogpilot.common.frogpilot_backups import backup_toggles from openpilot.frogpilot.common.frogpilot_functions import update_openpilot from openpilot.frogpilot.common.frogpilot_utilities import ThreadManager, is_url_pingable @@ -18,7 +19,11 @@ from openpilot.frogpilot.system.frogpilot_tracking import FrogPilotTracking ASSET_CHECK_RATE = (1 / DT_MDL) -def check_assets(thread_manager, params_memory, frogpilot_toggles): +def check_assets(theme_manager, thread_manager, params_memory, frogpilot_toggles): + for asset_type, asset_param in THEME_COMPONENT_PARAMS.items(): + asset_to_download = params_memory.get(asset_param) + if asset_to_download: + thread_manager.run_with_lock(theme_manager.download_theme, (asset_type, asset_to_download, asset_param, frogpilot_toggles)) def transition_offroad(frogpilot_planner, thread_manager, time_validated, sm, params, frogpilot_toggles): params.put("LastGPSPosition", json.dumps(frogpilot_planner.gps_position)) @@ -28,19 +33,23 @@ def transition_offroad(frogpilot_planner, thread_manager, time_validated, sm, pa def transition_onroad(): -def update_checks(now, thread_manager, params, params_memory, frogpilot_toggles, boot_run=False): +def update_checks(now, theme_manager, thread_manager, params, params_memory, frogpilot_toggles, boot_run=False): while not (is_url_pingable("https://github.com") or is_url_pingable("https://gitlab.com")): time.sleep(60) + theme_manager.update_themes(frogpilot_toggles, boot_run) + if frogpilot_toggles.automatic_updates: thread_manager.run_with_lock(update_openpilot, (thread_manager, params)) time.sleep(1) -def update_toggles(frogpilot_variables, started, thread_manager, time_validated, params): +def update_toggles(frogpilot_variables, started, theme_manager, thread_manager, time_validated, params): frogpilot_variables.update(started) frogpilot_toggles = frogpilot_variables.frogpilot_toggles + theme_manager.update_active_theme(frogpilot_toggles) + if time_validated: thread_manager.run_with_lock(backup_toggles, (params)) @@ -62,6 +71,7 @@ def frogpilot_thread(): params_memory = Params(memory=True) frogpilot_variables = FrogPilotVariables() + theme_manager = ThemeManager(params, params_memory) thread_manager = ThreadManager() frogpilot_toggles = frogpilot_variables.frogpilot_toggles @@ -78,7 +88,7 @@ def frogpilot_thread(): started = sm["deviceState"].started if not started and started_previously: - frogpilot_toggles = update_toggles(frogpilot_variables, started, thread_manager, time_validated, params) + frogpilot_toggles = update_toggles(frogpilot_variables, started, theme_manager, thread_manager, time_validated, params) transition_offroad(frogpilot_planner, thread_manager, time_validated, sm, params, frogpilot_toggles) run_update_checks = True @@ -90,28 +100,29 @@ def frogpilot_thread(): if started and sm.updated["modelV2"]: frogpilot_planner.update(now, time_validated, sm, frogpilot_toggles) - frogpilot_planner.publish(sm, pm, frogpilot_toggles) + frogpilot_planner.publish(theme_manager.theme_updated, sm, pm, frogpilot_toggles) frogpilot_tracking.update(now, time_validated, sm, frogpilot_toggles) elif not started: frogpilot_plan_send = messaging.new_message("frogpilotPlan") frogpilot_plan_send.frogpilotPlan.frogpilotToggles = json.dumps(vars(frogpilot_toggles)) + frogpilot_plan_send.frogpilotPlan.themeUpdated = theme_manager.theme_updated pm.send("frogpilotPlan", frogpilot_plan_send) started_previously = started if rate_keeper.frame % ASSET_CHECK_RATE == 0: - check_assets(thread_manager, params_memory, frogpilot_toggles) + check_assets(theme_manager, thread_manager, params_memory, frogpilot_toggles) if params_memory.get_bool("FrogPilotTogglesUpdated"): - frogpilot_toggles = update_toggles(frogpilot_variables, started, thread_manager, time_validated, params) + frogpilot_toggles = update_toggles(frogpilot_variables, started, theme_manager, thread_manager, time_validated, params) run_update_checks |= params_memory.get_bool("ManualUpdateInitiated") run_update_checks |= now.second == 0 and (now.minute % 60 == 0 or (now.minute % 5 == 0 and frogpilot_variables.frogs_go_moo)) run_update_checks &= time_validated if run_update_checks: - thread_manager.run_with_lock(update_checks, (now, thread_manager, params, params_memory, frogpilot_toggles)) + thread_manager.run_with_lock(update_checks, (now, theme_manager, thread_manager, params, params_memory, frogpilot_toggles)) run_update_checks = False elif not time_validated: @@ -121,7 +132,7 @@ def frogpilot_thread(): thread_manager.run_with_lock(backup_toggles, (params, True)) thread_manager.run_with_lock(send_stats, (params, frogpilot_toggles)) - thread_manager.run_with_lock(update_checks, (now, thread_manager, params, params_memory, frogpilot_toggles, True)) + thread_manager.run_with_lock(update_checks, (now, theme_manager, thread_manager, params, params_memory, frogpilot_toggles, True)) rate_keeper.keep_time() diff --git a/frogpilot/ui/frogpilot_ui.cc b/frogpilot/ui/frogpilot_ui.cc index 05ab0b513..dc63586e8 100644 --- a/frogpilot/ui/frogpilot_ui.cc +++ b/frogpilot/ui/frogpilot_ui.cc @@ -16,6 +16,9 @@ static void update_state(FrogPilotUIState *fs) { } if (fpsm.updated("frogpilotPlan")) { const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan(); + if (frogpilotPlan.getThemeUpdated()) { + emit fs->themeUpdated(); + } capnp::Text::Reader toggles = frogpilotPlan.getFrogpilotToggles(); QByteArray current_toggles(toggles.cStr(), toggles.size()); static QByteArray previous_toggles; diff --git a/frogpilot/ui/frogpilot_ui.h b/frogpilot/ui/frogpilot_ui.h index 8eba66a1e..09ef20528 100644 --- a/frogpilot/ui/frogpilot_ui.h +++ b/frogpilot/ui/frogpilot_ui.h @@ -39,6 +39,7 @@ public: WifiManager *wifi; signals: + void themeUpdated(); }; FrogPilotUIState *frogpilotUIState(); diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc index 4f11a07b3..17454989d 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc @@ -1,6 +1,8 @@ #include "frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h" FrogPilotAnnotatedCameraWidget::FrogPilotAnnotatedCameraWidget(QWidget *parent) : QWidget(parent) { + animationTimer = new QTimer(this); + QSize iconSize(img_size / 4, img_size / 4); curveSpeedIcon = loadPixmap("../../frogpilot/assets/other_images/curve_speed.png", {btn_size, btn_size}); @@ -13,9 +15,96 @@ FrogPilotAnnotatedCameraWidget::FrogPilotAnnotatedCameraWidget(QWidget *parent) loadGif("../../frogpilot/assets/other_images/turn_icon.gif", cemTurnIcon, QSize(widget_size, widget_size), this); loadGif("../../frogpilot/assets/other_images/chill_mode_icon.gif", chillModeIcon, QSize(widget_size, widget_size), this); loadGif("../../frogpilot/assets/other_images/experimental_mode_icon.gif", experimentalModeIcon, QSize(widget_size, widget_size), this); + + QObject::connect(animationTimer, &QTimer::timeout, [this] { + animationFrameIndex = (animationFrameIndex + 1) % totalFrames; + }); + QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &FrogPilotAnnotatedCameraWidget::updateSignals); + QObject::connect(uiState(), &UIState::offroadTransition, [this] { + QJsonObject stats = QJsonDocument::fromJson(QString::fromStdString(params.get("FrogPilotStats")).toUtf8()).object(); + stats["FrogHops"] = stats.value("FrogHops").toInt(0) + frogHopCount; + params.putNonBlocking("FrogPilotStats", QJsonDocument(stats).toJson(QJsonDocument::Compact).toStdString()); + + frogHopCount = 0; + }); } void FrogPilotAnnotatedCameraWidget::showEvent(QShowEvent *event) { + updateSignals(); +} + +void FrogPilotAnnotatedCameraWidget::updateSignals() { + QVector().swap(blindspotImages); + QVector().swap(blindspotImagesRight); + QVector().swap(signalImages); + QVector().swap(signalImagesRight); + + bool isGif = false; + + QFileInfoList files = QDir("../../frogpilot/assets/active_theme/signals/").entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name); + for (const QFileInfo &fileInfo : files) { + QString fileName = fileInfo.fileName(); + QString filePath = fileInfo.absoluteFilePath(); + + if (fileName.endsWith(".gif", Qt::CaseInsensitive)) { + isGif = true; + + QMovie movie(filePath); + movie.setCacheMode(QMovie::CacheNone); + movie.start(); + + int frameCount = movie.frameCount(); + signalImages.reserve(frameCount); + signalImagesRight.reserve(frameCount); + + for (int i = 0; i < frameCount; ++i) { + movie.jumpToFrame(i); + + QPixmap frame = movie.currentPixmap(); + signalImages.append(frame); + signalImagesRight.append(frame.transformed(QTransform().scale(-1, 1))); + } + + movie.stop(); + } else if (fileName.endsWith(".png", Qt::CaseInsensitive)) { + QPixmap img(filePath); + if (fileName.contains("blindspot", Qt::CaseInsensitive)) { + blindspotImages.append(img); + blindspotImagesRight.append(img.transformed(QTransform().scale(-1, 1))); + } else { + signalImages.append(img); + signalImagesRight.append(img.transformed(QTransform().scale(-1, 1))); + } + } else { + QStringList parts = fileName.split('_'); + if (parts.size() == 2) { + signalStyle = parts[0]; + signalAnimationLength = parts[1].toInt(); + } + } + } + + if (!signalImages.isEmpty()) { + QPixmap &firstImage = signalImages.front(); + signalHeight = firstImage.height(); + signalWidth = firstImage.width(); + totalFrames = signalImages.size(); + + if (isGif && signalStyle == "traditional") { + signalMovement = (width() + signalWidth * 2) / totalFrames; + signalStyle = "traditional_gif"; + } else { + signalMovement = 0; + } + } else { + signalAnimationLength = 0; + signalHeight = 0; + signalMovement = 0; + signalWidth = 0; + totalFrames = 0; + + signalStyle = "None"; + } } void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPilotUIState &fs) { @@ -51,6 +140,8 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil blindspotLeft = carState.getLeftBlindspot(); blindspotRight = carState.getRightBlindspot(); + blinkerLeft = carState.getLeftBlinker(); + blinkerRight = carState.getRightBlinker(); cscControllingSpeed = frogpilotPlan.getCscControllingSpeed(); cscSpeed = frogpilotPlan.getCscSpeed(); cscTraining = frogpilotPlan.getCscTraining(); @@ -59,6 +150,22 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil hideBottomIcons = selfdriveState.getAlertSize() != cereal::SelfdriveState::AlertSize::NONE; hideBottomIcons |= frogpilotSelfdriveState.getAlertSize() != cereal::FrogPilotSelfdriveState::AlertSize::NONE; + hideBottomIcons |= signalStyle.startsWith("traditional") && (blinkerLeft || blinkerRight); + + static int lastFrameIndex; + if (lastFrameIndex > animationFrameIndex && frogpilot_toggles.value("signal_icons").toString() == "frog") { + frogHopCount++; + } + lastFrameIndex = animationFrameIndex; + + if ((blinkerLeft || blinkerRight) && signalStyle != "None") { + if (!animationTimer->isActive()) { + animationTimer->start(signalAnimationLength); + } + } else if (animationTimer->isActive()) { + animationFrameIndex = 0; + animationTimer->stop(); + } if (cscTraining) { if (!glowTimer.isValid()) { @@ -95,6 +202,10 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState paintCurveSpeedControl(p); } } + + if ((blinkerLeft || blinkerRight) && signalStyle != "None") { + paintTurnSignals(p); + } } void FrogPilotAnnotatedCameraWidget::paintBlindSpotPath(QPainter &p) { @@ -306,3 +417,32 @@ void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControlTraining(QPainter &p) p.restore(); } + +void FrogPilotAnnotatedCameraWidget::paintTurnSignals(QPainter &p) { + int frameIndex = qBound(0, animationFrameIndex, totalFrames - 1); + + bool blindspotActive = blinkerLeft ? blindspotLeft : blindspotRight; + + int signalXPosition = 0; + int signalYPosition = 0; + + if (signalStyle == "static") { + signalXPosition = blinkerLeft ? (rect().center().x() * 0.75) - signalWidth : rect().center().x() * 1.25; + signalYPosition = signalHeight / 2; + } else { + if (signalStyle == "traditional_gif") { + signalXPosition = blinkerLeft ? width() - (frameIndex * signalMovement) + signalWidth : (frameIndex * signalMovement) - signalWidth; + } else { + signalXPosition = blinkerLeft ? width() - ((frameIndex + 1) * signalWidth) : frameIndex * signalWidth; + } + signalYPosition = height() - signalHeight - alertHeight; + } + + if (blinkerLeft) { + QPixmap &imgToDraw = (blindspotActive && !blindspotImages.empty()) ? blindspotImages[0] : signalImages[frameIndex]; + p.drawPixmap(signalXPosition, signalYPosition, signalWidth, signalHeight, imgToDraw); + } else { + QPixmap &imgToDraw = (blindspotActive && !blindspotImagesRight.empty()) ? blindspotImagesRight[0] : signalImagesRight[frameIndex]; + p.drawPixmap(signalXPosition, signalYPosition, signalWidth, signalHeight, imgToDraw); + } +} diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h index f82e4efa7..f0f2eb3cc 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h +++ b/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h @@ -20,6 +20,8 @@ public: bool isCruiseSet; bool rightHandDM; + int alertHeight; + float speed; FrogPilotUIScene frogpilot_scene; @@ -37,6 +39,8 @@ public: QSize defaultSize; + QString signalStyle; + protected: void showEvent(QShowEvent *event) override; @@ -45,13 +49,25 @@ private: void paintCompass(QPainter &p); void paintCurveSpeedControl(QPainter &p); void paintCurveSpeedControlTraining(QPainter &p); + void paintTurnSignals(QPainter &p); + void updateSignals(); bool blindspotLeft; bool blindspotRight; + bool blinkerLeft; + bool blinkerRight; bool cscControllingSpeed; bool cscTraining; bool experimentalMode; + int animationFrameIndex; + int frogHopCount; + int signalAnimationLength; + int signalHeight; + int signalMovement; + int signalWidth; + int totalFrames; + float cscSpeed; float distanceConversion; float roadCurvature; @@ -84,4 +100,11 @@ private: QString leadDistanceUnit; QString leadSpeedUnit; QString speedUnit; + + QTimer *animationTimer; + + QVector blindspotImages; + QVector blindspotImagesRight; + QVector signalImages; + QVector signalImagesRight; }; diff --git a/selfdrive/ui/qt/onroad/buttons.cc b/selfdrive/ui/qt/onroad/buttons.cc index 722cad7ee..046a0af87 100644 --- a/selfdrive/ui/qt/onroad/buttons.cc +++ b/selfdrive/ui/qt/onroad/buttons.cc @@ -24,6 +24,7 @@ ExperimentalButton::ExperimentalButton(QWidget *parent) : experimental_mode(fals QObject::connect(this, &QPushButton::clicked, this, &ExperimentalButton::changeMode); // FrogPilot variables + QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &ExperimentalButton::updateTheme); } void ExperimentalButton::changeMode() { @@ -57,12 +58,22 @@ void ExperimentalButton::updateState(const UIState &s, const FrogPilotUIState &f void ExperimentalButton::paintEvent(QPaintEvent *event) { QPainter p(this); - QPixmap img = experimental_mode ? experimental_img : engage_img; - drawIcon(p, QPoint(btn_size / 2, btn_size / 2), img, background_color, (isDown() || !engageable) ? 0.6 : 1.0); + p.setClipRegion(QRegion(QRect(0, 0, btn_size, btn_size), QRegion::Ellipse)); + p.setRenderHint(QPainter::Antialiasing); + + if (frogpilot_toggles.value("wheel_image").toString() == "stock") { + QPixmap img = experimental_mode ? experimental_img : engage_img; + drawIcon(p, QPoint(btn_size / 2, btn_size / 2), img, background_color, (isDown() || !engageable) ? 0.6 : 1.0); + } else if (wheel_gif) { + drawIcon(p, QPoint(btn_size / 2, btn_size / 2), wheel_gif->currentPixmap(), background_color, (isDown() || !engageable) ? 0.6 : 1.0); + } else if (!wheel_img.isNull()) { + drawIcon(p, QPoint(btn_size / 2, btn_size / 2), wheel_img, background_color, (isDown() || !engageable) ? 0.6 : 1.0); + } } // FrogPilot variables void ExperimentalButton::showEvent(QShowEvent *event) { + updateTheme(); } void ExperimentalButton::updateBackgroundColor() { @@ -78,3 +89,7 @@ void ExperimentalButton::updateBackgroundColor() { background_color = QColor(0, 0, 0, 166); } } + +void ExperimentalButton::updateTheme() { + loadImage("../../frogpilot/assets/active_theme/steering_wheel/wheel", wheel_img, wheel_gif, QSize(img_size, img_size), this); +} diff --git a/selfdrive/ui/qt/onroad/buttons.h b/selfdrive/ui/qt/onroad/buttons.h index d006891db..889419503 100644 --- a/selfdrive/ui/qt/onroad/buttons.h +++ b/selfdrive/ui/qt/onroad/buttons.h @@ -32,10 +32,15 @@ private: // FrogPilot variables void showEvent(QShowEvent *event) override; void updateBackgroundColor(); + void updateTheme(); Params params_memory{"", true}; QColor background_color; + + QPixmap wheel_img; + + QSharedPointer wheel_gif; }; void drawIcon(QPainter &p, const QPoint ¢er, const QPixmap &img, const QBrush &bg, float opacity); diff --git a/selfdrive/ui/qt/onroad/model.cc b/selfdrive/ui/qt/onroad/model.cc index db2d8d087..3bacd090f 100644 --- a/selfdrive/ui/qt/onroad/model.cc +++ b/selfdrive/ui/qt/onroad/model.cc @@ -41,11 +41,11 @@ void ModelRenderer::draw(QPainter &painter, const QRect &surface_rect) { update_leads(radar_state, model.getPosition()); const auto &lead_two = radar_state.getLeadTwo(); if (lead_one.getStatus()) { - drawLead(painter, lead_one, lead_vertices[0], surface_rect); + drawLead(painter, lead_one, lead_vertices[0], surface_rect, QColor(frogpilot_toggles.value("lead_marker_color").toString())); } else { // FrogPilot variables if (lead_two.getStatus() && (std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0)) { - drawLead(painter, lead_two, lead_vertices[1], surface_rect); + drawLead(painter, lead_two, lead_vertices[1], surface_rect, QColor(frogpilot_toggles.value("lead_marker_color").toString())); } // FrogPilot variables @@ -120,7 +120,13 @@ void ModelRenderer::update_model(const cereal::ModelDataV2::Reader &model, const void ModelRenderer::drawLaneLines(QPainter &painter) { // lanelines for (int i = 0; i < std::size(lane_line_vertices); ++i) { - painter.setBrush(QColor::fromRgbF(1.0, 1.0, 1.0, std::clamp(lane_line_probs[i], 0.0, 0.7))); + if (frogpilot_toggles.value("color_scheme").toString() != "stock") { + painter.setBrush(QColor::fromRgbF(1.0, 1.0, 1.0, std::clamp(lane_line_probs[i], 0.0, 0.7))); + } else { + QColor lane_color = QColor(frogpilot_toggles.value("lane_lines_color").toString()); + lane_color.setAlphaF(lane_color.alphaF() * std::clamp(lane_line_probs[i], 0.0, 0.7)); + painter.setBrush(lane_color); + } painter.drawPolygon(lane_line_vertices[i]); } @@ -146,18 +152,24 @@ void ModelRenderer::drawPath(QPainter &painter, const cereal::ModelDataV2::Reade // Flip so 0 is bottom of frame float lin_grad_point = (height - track_vertices[track_idx].y()) / height; - // speed up: 120, slow down: 0 - float path_hue = fmax(fmin(60 + acceleration[i] * 35, 120), 0); - // FIXME: painter.drawPolygon can be slow if hue is not rounded - path_hue = int(path_hue * 100 + 0.5) / 100; + if (fabs(acceleration[i]) < 0.25 && frogpilot_toggles.value("color_scheme").toString() != "stock") { + QColor color = QColor(frogpilot_toggles.value("path_color").toString()); + color.setAlphaF(util::map_val(lin_grad_point, 0.0f, 1.0f, 1.0f, 0.1f)); + bg.setColorAt(lin_grad_point, color); + } else { + // speed up: 120, slow down: 0 + float path_hue = fmax(fmin(60 + acceleration[i] * 35, 120), 0); + // FIXME: painter.drawPolygon can be slow if hue is not rounded + path_hue = int(path_hue * 100 + 0.5) / 100; - float saturation = fmin(fabs(acceleration[i] * 1.5), 1); - float lightness = util::map_val(saturation, 0.0f, 1.0f, 0.95f, 0.62f); // lighter when grey - float alpha = util::map_val(lin_grad_point, 0.75f / 2.f, 0.75f, 0.4f, 0.0f); // matches previous alpha fade - bg.setColorAt(lin_grad_point, QColor::fromHslF(path_hue / 360., saturation, lightness, alpha)); + float saturation = fmin(fabs(acceleration[i] * 1.5), 1); + float lightness = util::map_val(saturation, 0.0f, 1.0f, 0.95f, 0.62f); // lighter when grey + float alpha = util::map_val(lin_grad_point, 0.75f / 2.f, 0.75f, 0.4f, 0.0f); // matches previous alpha fade + bg.setColorAt(lin_grad_point, QColor::fromHslF(path_hue / 360., saturation, lightness, alpha)); - // Skip a point, unless next is last - i += (i + 2) < max_len ? 1 : 0; + // Skip a point, unless next is last + i += (i + 2) < max_len ? 1 : 0; + } } } else { diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index e7d346dc2..1ab2fbb5f 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -42,6 +42,7 @@ Sidebar::Sidebar(QWidget *parent) : QFrame(parent), onroad(false), flag_pressed( pm = std::make_unique(std::vector{"bookmarkButton"}); // FrogPilot variables + QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &Sidebar::updateTheme); } void Sidebar::mousePressEvent(QMouseEvent *event) { @@ -109,7 +110,7 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { connectStatus = ItemStatus{{tr("CONNECT"), tr("OFFLINE")}, warning_color}; } else { connectStatus = nanos_since_boot() - last_ping < 80e9 - ? ItemStatus{{tr("CONNECT"), tr("ONLINE")}, good_color} + ? ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(frogpilot_toggles.value("sidebar_color3").toString())} : ItemStatus{{tr("CONNECT"), tr("ERROR")}, danger_color}; } setProperty("connectStatus", QVariant::fromValue(connectStatus)); @@ -117,13 +118,13 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { ItemStatus tempStatus = {{tr("TEMP"), tr("HIGH")}, danger_color}; auto ts = deviceState.getThermalStatus(); if (ts == cereal::DeviceState::ThermalStatus::GREEN) { - tempStatus = {{tr("TEMP"), tr("GOOD")}, good_color}; + tempStatus = {{tr("TEMP"), tr("GOOD")}, QColor(frogpilot_toggles.value("sidebar_color1").toString())}; } else if (ts == cereal::DeviceState::ThermalStatus::YELLOW) { tempStatus = {{tr("TEMP"), tr("OK")}, warning_color}; } setProperty("tempStatus", QVariant::fromValue(tempStatus)); - ItemStatus pandaStatus = {{tr("VEHICLE"), tr("ONLINE")}, good_color}; + ItemStatus pandaStatus = {{tr("VEHICLE"), tr("ONLINE")}, QColor(frogpilot_toggles.value("sidebar_color2").toString())}; if (s.scene.pandaType == cereal::PandaState::PandaType::UNKNOWN) { pandaStatus = {{tr("NO"), tr("PANDA")}, danger_color}; } @@ -143,9 +144,9 @@ void Sidebar::paintEvent(QPaintEvent *event) { // buttons p.setOpacity(settings_pressed ? 0.65 : 1.0); - p.drawPixmap(settings_btn.x(), settings_btn.y(), settings_img); + p.drawPixmap(settings_btn.x(), settings_btn.y(), settings_gif ? settings_gif->currentPixmap() : settings_img); p.setOpacity(onroad && flag_pressed ? 0.65 : 1.0); - p.drawPixmap(home_btn.x(), home_btn.y(), onroad ? flag_img : home_img); + p.drawPixmap(home_btn.x(), home_btn.y(), onroad ? flag_gif ? flag_gif->currentPixmap() : flag_img : home_gif ? home_gif->currentPixmap() : home_img); if (recording_audio) { p.setBrush(danger_color); p.setOpacity(mic_indicator_pressed ? 0.65 : 1.0); @@ -188,4 +189,11 @@ void Sidebar::paintEvent(QPaintEvent *event) { // FrogPilot variables void Sidebar::showEvent(QShowEvent *event) { + updateTheme(); +} + +void Sidebar::updateTheme() { + loadImage("../../frogpilot/assets/active_theme/icons/button_home", home_img, home_gif, home_btn.size(), this); + loadImage("../../frogpilot/assets/active_theme/icons/button_flag", flag_img, flag_gif, home_btn.size(), this); + loadImage("../../frogpilot/assets/active_theme/icons/button_settings", settings_img, settings_gif, settings_btn.size(), this); } diff --git a/selfdrive/ui/qt/sidebar.h b/selfdrive/ui/qt/sidebar.h index 246117864..ae4427822 100644 --- a/selfdrive/ui/qt/sidebar.h +++ b/selfdrive/ui/qt/sidebar.h @@ -70,6 +70,11 @@ private: // FrogPilot variables void showEvent(QShowEvent *event); + void updateTheme(); Params params; + + QSharedPointer flag_gif; + QSharedPointer home_gif; + QSharedPointer settings_gif; }; diff --git a/selfdrive/ui/soundd.py b/selfdrive/ui/soundd.py index 779adc280..09fde8397 100644 --- a/selfdrive/ui/soundd.py +++ b/selfdrive/ui/soundd.py @@ -3,6 +3,7 @@ import numpy as np import time import wave +from pathlib import Path from cereal import car, custom, messaging from openpilot.common.basedir import BASEDIR @@ -15,7 +16,7 @@ from openpilot.common.swaglog import cloudlog from openpilot.system import micd from openpilot.system.hardware import HARDWARE -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH, get_frogpilot_toggles SAMPLE_RATE = 48000 SAMPLE_BUFFER = 4096 # (approx 100ms) @@ -70,8 +71,6 @@ def check_selfdrive_timeout_alert(sm): class Soundd: def __init__(self): - self.load_sounds() - self.current_alert = AudibleAlert.none self.current_volume = MIN_VOLUME self.current_sound_frame = 0 @@ -87,6 +86,8 @@ class Soundd: self.auto_volume = 0 + self.previous_sound_pack = None + self.update_frogpilot_sounds() def load_sounds(self): @@ -96,13 +97,26 @@ class Soundd: for sound in sound_list: filename, play_count, volume = sound_list[sound] - with wave.open(BASEDIR + "/selfdrive/assets/sounds/" + filename, 'r') as wavefile: - assert wavefile.getnchannels() == 1 - assert wavefile.getsampwidth() == 2 - assert wavefile.getframerate() == SAMPLE_RATE + sounds_path = self.sound_directory / filename - length = wavefile.getnframes() - self.loaded_sounds[sound] = np.frombuffer(wavefile.readframes(length), dtype=np.int16).astype(np.float32) / (2**16/2) + if not sounds_path.exists() and "_tizi" in filename: + standard_path = self.sound_directory / filename.replace("_tizi", "") + if standard_path.exists(): + sounds_path = standard_path + + if sounds_path.exists(): + wavefile = wave.open(str(sounds_path), 'r') + else: + if filename == "startup.wav": + filename = "engage.wav" + wavefile = wave.open(BASEDIR + "/selfdrive/assets/sounds/" + filename, 'r') + + assert wavefile.getnchannels() == 1 + assert wavefile.getsampwidth() == 2 + assert wavefile.getframerate() == SAMPLE_RATE + + length = wavefile.getnframes() + self.loaded_sounds[sound] = np.frombuffer(wavefile.readframes(length), dtype=np.int16).astype(np.float32) / (2**16/2) def get_sound_data(self, frames): # get "frames" worth of data from the current alert sound, looping when required @@ -207,9 +221,9 @@ class Soundd: if frogpilot_toggles != self.frogpilot_toggles: self.frogpilot_toggles = frogpilot_toggles - self.update_frogpilot_sounds() + stream = self.update_frogpilot_sounds(sd, stream) - def update_frogpilot_sounds(self): + def update_frogpilot_sounds(self, sd=None, stream=None): self.volume_map = { AudibleAlert.engage: self.frogpilot_toggles.engage_volume / 100.0, AudibleAlert.disengage: self.frogpilot_toggles.disengage_volume / 100.0, @@ -230,6 +244,23 @@ class Soundd: if sound not in self.volume_map: self.volume_map[sound] = 1.01 + if self.frogpilot_toggles.sound_pack != "stock": + self.sound_directory = ACTIVE_THEME_PATH / "sounds" + else: + self.sound_directory = Path(BASEDIR) / "selfdrive" / "assets" / "sounds" + + if self.frogpilot_toggles.sound_pack != self.previous_sound_pack: + self.load_sounds() + + self.previous_sound_pack = self.frogpilot_toggles.sound_pack + + if stream is not None: + stream.close() + stream = self.get_stream(sd) + stream.start() + + return stream + def main(): s = Soundd()