From 3d8af2361e4039e5a74f35f590ee2f5b3e43b892 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Fri, 27 Mar 2026 18:05:44 -0500 Subject: [PATCH] Rename --- ..._frogpilot.yaml => compile_starpilot.yaml} | 28 +- .github/workflows/review_pull_request.yaml | 2 +- .github/workflows/schedule_update.yaml | 6 +- .github/workflows/update_pr_branch.yaml | 10 +- .github/workflows/update_release_branch.yaml | 14 +- .github/workflows/update_tinygrad.yaml | 8 +- README.md | 6 +- UICheatSheet.md | 12 +- cereal/custom.capnp | 24 +- cereal/libcereal.a | Bin 607176 -> 607176 bytes cereal/libsocketmaster.a | Bin 114052 -> 114052 bytes cereal/log.capnp | 18 +- cereal/messaging/__init__.py | 6 +- cereal/messaging/bridge | Bin 157704 -> 157704 bytes cereal/services.h | 18 +- cereal/services.py | 20 +- common/api.py | 2 +- common/clutil.cc | 2 +- common/constants.py | 2 +- common/libcommon.a | Bin 641468 -> 641468 bytes common/params.cc | 8 +- common/params.h | 6 +- common/params_keys.h | 14 +- common/params_pyx.cpp | 18 +- common/params_pyx.pyx | 12 +- common/params_pyx.so | Bin 769888 -> 769888 bytes common/util.h | 2 +- docs/how-to/laptop-device-build.md | 8 +- frogpilot/controls/frogpilot_planner.py | 203 ---------- frogpilot/system/frogpilot_tracking.py | 175 --------- frogpilot/ui/qt/offroad/data_settings.h | 23 -- frogpilot/ui/qt/offroad/utilities.cc | 369 ------------------ frogpilot/ui/qt/offroad/utilities.h | 34 -- launch_chffrplus.sh | 4 +- launch_env.sh | 6 +- .../opendbc/car/body/carcontroller.py | 2 +- opendbc_repo/opendbc/car/body/carstate.py | 6 +- opendbc_repo/opendbc/car/car_helpers.py | 26 +- .../opendbc/car/chrysler/carcontroller.py | 2 +- opendbc_repo/opendbc/car/chrysler/carstate.py | 12 +- opendbc_repo/opendbc/car/chrysler/values.py | 4 +- .../opendbc/car/ford/carcontroller.py | 2 +- opendbc_repo/opendbc/car/ford/carstate.py | 6 +- opendbc_repo/opendbc/car/gm/carcontroller.py | 14 +- opendbc_repo/opendbc/car/gm/carstate.py | 8 +- opendbc_repo/opendbc/car/gm/fingerprints.py | 2 +- opendbc_repo/opendbc/car/gm/gmcan.py | 4 +- opendbc_repo/opendbc/car/gm/interface.py | 2 +- opendbc_repo/opendbc/car/gm/values.py | 2 +- .../opendbc/car/honda/carcontroller.py | 2 +- opendbc_repo/opendbc/car/honda/carstate.py | 6 +- .../opendbc/car/hyundai/carcontroller.py | 2 +- opendbc_repo/opendbc/car/hyundai/carstate.py | 10 +- opendbc_repo/opendbc/car/hyundai/values.py | 4 +- opendbc_repo/opendbc/car/interfaces.py | 50 +-- .../opendbc/car/mazda/carcontroller.py | 2 +- opendbc_repo/opendbc/car/mazda/carstate.py | 6 +- opendbc_repo/opendbc/car/mazda/interface.py | 2 +- .../opendbc/car/mock/carcontroller.py | 2 +- opendbc_repo/opendbc/car/mock/carstate.py | 2 +- .../opendbc/car/nissan/carcontroller.py | 2 +- opendbc_repo/opendbc/car/nissan/carstate.py | 8 +- opendbc_repo/opendbc/car/psa/carcontroller.py | 2 +- opendbc_repo/opendbc/car/psa/carstate.py | 6 +- .../opendbc/car/rivian/carcontroller.py | 2 +- opendbc_repo/opendbc/car/rivian/carstate.py | 6 +- .../opendbc/car/subaru/carcontroller.py | 20 +- opendbc_repo/opendbc/car/subaru/carstate.py | 8 +- opendbc_repo/opendbc/car/subaru/subarucan.py | 2 +- opendbc_repo/opendbc/car/subaru/values.py | 2 +- .../opendbc/car/tesla/carcontroller.py | 2 +- opendbc_repo/opendbc/car/tesla/carstate.py | 6 +- .../opendbc/car/torque_data/params.toml | 2 +- .../opendbc/car/torque_data/substitute.toml | 2 +- .../opendbc/car/toyota/carcontroller.py | 22 +- opendbc_repo/opendbc/car/toyota/carstate.py | 18 +- opendbc_repo/opendbc/car/toyota/values.py | 4 +- .../opendbc/car/volkswagen/carcontroller.py | 4 +- .../opendbc/car/volkswagen/carstate.py | 10 +- opendbc_repo/opendbc/safety/__init__.py | 2 +- opendbc_repo/opendbc/safety/declarations.h | 4 +- opendbc_repo/opendbc/safety/modes/chrysler.h | 2 +- opendbc_repo/opendbc/safety/modes/ford.h | 2 +- opendbc_repo/opendbc/safety/modes/gm.h | 2 +- opendbc_repo/opendbc/safety/modes/hyundai.h | 10 +- .../opendbc/safety/modes/hyundai_canfd.h | 4 +- .../opendbc/safety/modes/hyundai_common.h | 10 +- opendbc_repo/opendbc/safety/modes/mazda.h | 2 +- opendbc_repo/opendbc/safety/modes/nissan.h | 2 +- opendbc_repo/opendbc/safety/modes/psa.h | 12 +- opendbc_repo/opendbc/safety/modes/rivian.h | 2 +- opendbc_repo/opendbc/safety/modes/subaru.h | 2 +- .../opendbc/safety/modes/subaru_preglobal.h | 2 +- opendbc_repo/opendbc/safety/modes/tesla.h | 2 +- opendbc_repo/opendbc/safety/modes/toyota.h | 4 +- opendbc_repo/opendbc/safety/safety.h | 6 +- opendbc_repo/opendbc/safety/tests/common.py | 4 +- .../opendbc/safety/tests/hyundai_common.py | 2 +- .../opendbc/safety/tests/test_chrysler.py | 2 +- .../opendbc/safety/tests/test_ford.py | 2 +- opendbc_repo/opendbc/safety/tests/test_gm.py | 2 +- .../opendbc/safety/tests/test_honda.py | 2 +- .../safety/tests/test_hyundai_canfd.py | 4 +- .../opendbc/safety/tests/test_mazda.py | 2 +- .../opendbc/safety/tests/test_nissan.py | 4 +- .../opendbc/safety/tests/test_subaru.py | 2 +- .../safety/tests/test_subaru_preglobal.py | 2 +- .../opendbc/safety/tests/test_tesla.py | 2 +- .../opendbc/safety/tests/test_toyota.py | 2 +- .../safety/tests/test_volkswagen_mqb.py | 2 +- .../safety/tests/test_volkswagen_pq.py | 2 +- openpilot/frogpilot | 1 - openpilot/starpilot | 1 + panda/board/obj/body_h7.bin.signed | Bin 76344 -> 76344 bytes panda/board/obj/body_h7/bootstub.elf | Bin 112692 -> 112692 bytes panda/board/obj/body_h7/main.bin | Bin 76208 -> 76208 bytes panda/board/obj/body_h7/main.elf | Bin 367016 -> 367016 bytes panda/board/obj/bootstub.body_h7.bin | Bin 12644 -> 12644 bytes panda/board/obj/bootstub.panda.bin | Bin 11068 -> 11068 bytes panda/board/obj/bootstub.panda_h7.bin | Bin 18784 -> 18784 bytes panda/board/obj/bootstub.panda_h7_remote.bin | Bin 18784 -> 18784 bytes panda/board/obj/bootstub.panda_jungle_h7.bin | Bin 13956 -> 13956 bytes panda/board/obj/bootstub.panda_remote.bin | Bin 11068 -> 11068 bytes panda/board/obj/gitversion.h | 2 +- panda/board/obj/panda.bin.signed | Bin 68604 -> 68604 bytes panda/board/obj/panda/bootstub.elf | Bin 100760 -> 100760 bytes panda/board/obj/panda/main.bin | Bin 68468 -> 68468 bytes panda/board/obj/panda/main.elf | Bin 332684 -> 332684 bytes panda/board/obj/panda_h7.bin.signed | Bin 84284 -> 84284 bytes panda/board/obj/panda_h7/bootstub.elf | Bin 152728 -> 152728 bytes panda/board/obj/panda_h7/main.bin | Bin 84148 -> 84148 bytes panda/board/obj/panda_h7/main.elf | Bin 410340 -> 410340 bytes panda/board/obj/panda_h7_remote.bin.signed | Bin 84228 -> 84228 bytes panda/board/obj/panda_h7_remote/bootstub.elf | Bin 152736 -> 152736 bytes panda/board/obj/panda_h7_remote/main.bin | Bin 84092 -> 84092 bytes panda/board/obj/panda_h7_remote/main.elf | Bin 410264 -> 410264 bytes panda/board/obj/panda_jungle_h7.bin.signed | Bin 78192 -> 78192 bytes panda/board/obj/panda_jungle_h7/bootstub.elf | Bin 123936 -> 123936 bytes panda/board/obj/panda_jungle_h7/main.bin | Bin 78056 -> 78056 bytes panda/board/obj/panda_jungle_h7/main.elf | Bin 375084 -> 375084 bytes panda/board/obj/panda_remote.bin.signed | Bin 68560 -> 68560 bytes panda/board/obj/panda_remote/bootstub.elf | Bin 100768 -> 100768 bytes panda/board/obj/panda_remote/main.bin | Bin 68424 -> 68424 bytes panda/board/obj/panda_remote/main.elf | Bin 332688 -> 332688 bytes panda/board/obj/version | 2 +- scripts/host_tool_runner.sh | 2 +- scripts/laptop_device_build.sh | 4 +- scripts/launch_ui_c4_desktop.sh | 8 +- scripts/launch_ui_desktop.sh | 10 +- scripts/launch_ui_raybig_desktop.sh | 8 +- scripts/starpilot_build_flow.sh | 6 +- selfdrive/car/car_specific.py | 2 +- selfdrive/car/card.py | 58 +-- selfdrive/car/cruise.py | 10 +- selfdrive/controls/controlsd.py | 34 +- selfdrive/controls/lib/desire_helper.py | 32 +- selfdrive/controls/lib/latcontrol.py | 2 +- selfdrive/controls/lib/latcontrol_angle.py | 2 +- selfdrive/controls/lib/latcontrol_pid.py | 2 +- selfdrive/controls/lib/latcontrol_torque.py | 2 +- selfdrive/controls/lib/longcontrol.py | 42 +- .../controls/lib/longitudinal_planner.py | 38 +- selfdrive/controls/plannerd.py | 14 +- selfdrive/controls/radard.py | 58 +-- selfdrive/controls/tests/test_latcontrol.py | 8 +- selfdrive/locationd/lagd.py | 16 +- selfdrive/locationd/paramsd.py | 18 +- selfdrive/locationd/torqued.py | 20 +- selfdrive/modeld/modeld.py | 28 +- selfdrive/modeld/models/commonmodel_pyx.so | Bin 431968 -> 431968 bytes selfdrive/monitoring/dmonitoringd.py | 6 +- selfdrive/monitoring/helpers.py | 2 +- selfdrive/pandad/panda_safety.cc | 20 +- selfdrive/pandad/pandad | Bin 717920 -> 717920 bytes selfdrive/pandad/pandad.cc | 4 +- selfdrive/selfdrived/events.py | 228 +++++------ selfdrive/selfdrived/selfdrived.py | 136 +++---- selfdrive/selfdrived/state.py | 28 +- .../test/longitudinal_maneuvers/plant.py | 8 +- selfdrive/ui/SConscript | 42 +- selfdrive/ui/layouts/settings/settings.py | 2 +- .../ui/layouts/settings/starpilot/data.py | 17 + .../settings/starpilot/driving_model.py | 6 +- .../ui/layouts/settings/starpilot/sounds.py | 2 +- .../ui/layouts/settings/starpilot/themes.py | 8 +- .../layouts/settings/starpilot/utilities.py | 23 +- selfdrive/ui/lib/starpilot_state.py | 8 +- selfdrive/ui/mici/layouts/home.py | 2 +- selfdrive/ui/mici/layouts/settings/device.py | 2 +- .../ui/mici/layouts/settings/driving_model.py | 4 +- selfdrive/ui/moc_ui.cc | 16 +- selfdrive/ui/qt/api.h | 2 +- selfdrive/ui/qt/home.cc | 60 +-- selfdrive/ui/qt/home.h | 8 +- selfdrive/ui/qt/moc_home.cc | 6 +- selfdrive/ui/qt/moc_sidebar.cc | 6 +- selfdrive/ui/qt/network/wifi_manager.h | 2 +- selfdrive/ui/qt/offroad/developer_panel.cc | 52 +-- selfdrive/ui/qt/offroad/developer_panel.h | 14 +- selfdrive/ui/qt/offroad/settings.cc | 72 ++-- selfdrive/ui/qt/offroad/settings.h | 8 +- selfdrive/ui/qt/offroad/software_settings.cc | 48 +-- selfdrive/ui/qt/onroad/alerts.cc | 32 +- selfdrive/ui/qt/onroad/alerts.h | 18 +- selfdrive/ui/qt/onroad/annotated_camera.cc | 44 +-- selfdrive/ui/qt/onroad/annotated_camera.h | 16 +- selfdrive/ui/qt/onroad/buttons.cc | 32 +- selfdrive/ui/qt/onroad/buttons.h | 10 +- selfdrive/ui/qt/onroad/driver_monitoring.cc | 14 +- selfdrive/ui/qt/onroad/driver_monitoring.h | 8 +- selfdrive/ui/qt/onroad/hud.cc | 28 +- selfdrive/ui/qt/onroad/hud.h | 8 +- selfdrive/ui/qt/onroad/moc_onroad_home.cc | 6 +- selfdrive/ui/qt/onroad/model.cc | 106 ++--- selfdrive/ui/qt/onroad/model.h | 14 +- selfdrive/ui/qt/onroad/onroad_home.cc | 56 +-- selfdrive/ui/qt/onroad/onroad_home.h | 10 +- selfdrive/ui/qt/sidebar.cc | 100 ++--- selfdrive/ui/qt/sidebar.h | 8 +- selfdrive/ui/qt/widgets/controls.h | 4 +- selfdrive/ui/qt/widgets/input.cc | 6 +- selfdrive/ui/qt/widgets/input.h | 4 +- selfdrive/ui/qt/window.cc | 14 +- selfdrive/ui/qt/window.h | 2 +- selfdrive/ui/soundd.py | 96 ++--- selfdrive/ui/translations/main_uk.qm | Bin 276095 -> 275990 bytes selfdrive/ui/translations/main_uk.ts | 160 ++++---- selfdrive/ui/ui | Bin 4271688 -> 4269048 bytes selfdrive/ui/ui.cc | 98 ++--- selfdrive/ui/ui.h | 16 +- selfdrive/ui/ui_state.py | 10 +- selfdrive/ui/update_translations.py | 4 +- .../assets/active_theme/colors | 0 .../assets/active_theme/distance_icons | 0 .../assets/active_theme/icons | 0 .../assets/active_theme/signals | 0 .../assets/active_theme/sounds | 0 .../assets/download_functions.py | 2 +- .../april_fools/colors/colors.json | 0 .../april_fools/icons/button_flag.png | Bin .../april_fools/icons/button_home.gif | Bin .../april_fools/icons/button_settings.png | Bin .../april_fools/signals/traditional_125 | 0 .../april_fools/signals/turn_signal_1.png | Bin .../april_fools/signals/turn_signal_2.png | Bin .../april_fools/signals/turn_signal_3.png | Bin .../april_fools/signals/turn_signal_4.png | Bin .../april_fools/signals/turn_signal_5.png | Bin .../april_fools/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../april_fools/sounds/disengage.wav | Bin .../april_fools/sounds/engage.wav | Bin .../april_fools/steering_wheel/wheel.png | Bin .../christmas_week/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../christmas_week/distance_icons/relaxed.png | Bin .../distance_icons/standard.png | Bin .../christmas_week/distance_icons/traffic.png | Bin .../christmas_week/icons/button_flag.gif | Bin .../christmas_week/icons/button_home.gif | Bin .../christmas_week/icons/button_settings.png | Bin .../christmas_week/signals/traditional_125 | 0 .../christmas_week/signals/turn_signal_1.png | Bin .../christmas_week/signals/turn_signal_2.png | Bin .../christmas_week/signals/turn_signal_3.png | Bin .../christmas_week/signals/turn_signal_4.png | Bin .../christmas_week/signals/turn_signal_5.png | Bin .../christmas_week/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../christmas_week/sounds/disengage.wav | Bin .../christmas_week/sounds/engage.wav | Bin .../christmas_week/sounds/startup.wav | Bin .../christmas_week/steering_wheel/wheel.png | Bin .../cinco_de_mayo/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../cinco_de_mayo/distance_icons/relaxed.png | Bin .../cinco_de_mayo/distance_icons/standard.png | Bin .../cinco_de_mayo/distance_icons/traffic.png | Bin .../cinco_de_mayo/icons/button_flag.gif | Bin .../cinco_de_mayo/icons/button_home.gif | Bin .../cinco_de_mayo/icons/button_settings.png | Bin .../cinco_de_mayo/signals/traditional_125 | 0 .../cinco_de_mayo/signals/turn_signal_1.png | Bin .../cinco_de_mayo/signals/turn_signal_2.png | Bin .../cinco_de_mayo/signals/turn_signal_3.png | Bin .../cinco_de_mayo/signals/turn_signal_4.png | Bin .../cinco_de_mayo/signals/turn_signal_5.png | Bin .../cinco_de_mayo/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../cinco_de_mayo/sounds/disengage.wav | Bin .../cinco_de_mayo/sounds/engage.wav | Bin .../cinco_de_mayo/sounds/startup.wav | Bin .../cinco_de_mayo/steering_wheel/wheel.png | Bin .../easter_week/colors/colors.json | 0 .../easter_week/icons/button_flag.gif | Bin .../easter_week/icons/button_home.gif | Bin .../easter_week/icons/button_settings.png | Bin .../easter_week/signals/traditional_125 | 0 .../easter_week/signals/turn_signal_1.png | Bin .../easter_week/signals/turn_signal_2.png | Bin .../easter_week/signals/turn_signal_3.png | Bin .../easter_week/signals/turn_signal_4.png | Bin .../easter_week/signals/turn_signal_5.png | Bin .../signals/turn_signal_blindspot.png | Bin .../easter_week/sounds/disengage.wav | Bin .../easter_week/sounds/engage.wav | Bin .../easter_week/steering_wheel/wheel.png | Bin .../fourth_of_july/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../fourth_of_july/distance_icons/relaxed.png | Bin .../distance_icons/standard.png | Bin .../fourth_of_july/distance_icons/traffic.png | Bin .../fourth_of_july/icons/button_flag.gif | Bin .../fourth_of_july/icons/button_home.gif | Bin .../fourth_of_july/icons/button_settings.png | Bin .../fourth_of_july/signals/traditional_125 | 0 .../fourth_of_july/signals/turn_signal_1.png | Bin .../fourth_of_july/signals/turn_signal_2.png | Bin .../fourth_of_july/signals/turn_signal_3.png | Bin .../fourth_of_july/signals/turn_signal_4.png | Bin .../fourth_of_july/signals/turn_signal_5.png | Bin .../fourth_of_july/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../fourth_of_july/sounds/disengage.wav | Bin .../fourth_of_july/sounds/engage.wav | Bin .../fourth_of_july/sounds/startup.wav | Bin .../fourth_of_july/steering_wheel/wheel.png | Bin .../halloween_week/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../halloween_week/distance_icons/relaxed.png | Bin .../distance_icons/standard.png | Bin .../halloween_week/distance_icons/traffic.png | Bin .../halloween_week/icons/button_flag.gif | Bin .../halloween_week/icons/button_home.gif | Bin .../halloween_week/icons/button_settings.png | Bin .../halloween_week/signals/traditional_125 | 0 .../halloween_week/signals/turn_signal_1.png | Bin .../halloween_week/signals/turn_signal_2.png | Bin .../halloween_week/signals/turn_signal_3.png | Bin .../halloween_week/signals/turn_signal_4.png | Bin .../halloween_week/signals/turn_signal_5.png | Bin .../halloween_week/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../halloween_week/sounds/disengage.wav | Bin .../halloween_week/sounds/engage.wav | Bin .../halloween_week/sounds/prompt.wav | Bin .../halloween_week/steering_wheel/wheel.png | Bin .../may_the_fourth/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../may_the_fourth/distance_icons/relaxed.png | Bin .../distance_icons/standard.png | Bin .../may_the_fourth/distance_icons/traffic.png | Bin .../may_the_fourth/icons/button_flag.gif | Bin .../may_the_fourth/icons/button_home.gif | Bin .../may_the_fourth/icons/button_settings.png | Bin .../may_the_fourth/signals/traditional_125 | 0 .../may_the_fourth/signals/turn_signal_1.png | Bin .../may_the_fourth/signals/turn_signal_2.png | Bin .../may_the_fourth/signals/turn_signal_3.png | Bin .../may_the_fourth/signals/turn_signal_4.png | Bin .../may_the_fourth/signals/turn_signal_5.png | Bin .../may_the_fourth/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../may_the_fourth/sounds/disengage.wav | Bin .../may_the_fourth/sounds/engage.wav | Bin .../may_the_fourth/sounds/startup.wav | Bin .../may_the_fourth/steering_wheel/wheel.png | Bin .../new_years/colors/colors.json | 0 .../new_years/distance_icons/aggressive.png | Bin .../new_years/distance_icons/relaxed.png | Bin .../new_years/distance_icons/standard.png | Bin .../new_years/distance_icons/traffic.png | Bin .../new_years/icons/button_flag.gif | Bin .../new_years/icons/button_home.gif | Bin .../new_years/icons/button_settings.png | Bin .../new_years/signals/traditional_125 | 0 .../new_years/signals/turn_signal_1.png | Bin .../new_years/signals/turn_signal_2.png | Bin .../new_years/signals/turn_signal_3.png | Bin .../new_years/signals/turn_signal_4.png | Bin .../new_years/signals/turn_signal_5.png | Bin .../new_years/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../new_years/sounds/disengage.wav | Bin .../new_years/sounds/engage.wav | Bin .../new_years/steering_wheel/wheel.png | Bin .../st_patricks_day/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../distance_icons/relaxed.png | Bin .../distance_icons/standard.png | Bin .../distance_icons/traffic.png | Bin .../st_patricks_day/icons/button_flag.png | Bin .../st_patricks_day/icons/button_home.gif | Bin .../st_patricks_day/icons/button_settings.png | Bin .../st_patricks_day/signals/traditional_125 | 0 .../st_patricks_day/signals/turn_signal_1.png | Bin .../st_patricks_day/signals/turn_signal_2.png | Bin .../st_patricks_day/signals/turn_signal_3.png | Bin .../st_patricks_day/signals/turn_signal_4.png | Bin .../st_patricks_day/signals/turn_signal_5.png | Bin .../st_patricks_day/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../st_patricks_day/sounds/disengage.wav | Bin .../st_patricks_day/sounds/engage.wav | Bin .../st_patricks_day/steering_wheel/wheel.png | Bin .../stitch_day/colors/colors.json | 0 .../stitch_day/distance_icons/aggressive.png | Bin .../stitch_day/distance_icons/relaxed.png | Bin .../stitch_day/distance_icons/standard.png | Bin .../stitch_day/distance_icons/traffic.png | Bin .../stitch_day/icons/button_flag.gif | Bin .../stitch_day/icons/button_home.gif | Bin .../stitch_day/icons/button_settings.png | Bin .../stitch_day/signals/traditional_125 | 0 .../stitch_day/signals/turn_signal_1.png | Bin .../stitch_day/signals/turn_signal_2.png | Bin .../stitch_day/signals/turn_signal_3.png | Bin .../stitch_day/signals/turn_signal_4.png | Bin .../stitch_day/signals/turn_signal_5.png | Bin .../stitch_day/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../stitch_day/sounds/disengage.wav | Bin .../stitch_day/sounds/engage.wav | Bin .../stitch_day/sounds/startup.wav | Bin .../stitch_day/steering_wheel/wheel.gif | Bin .../thanksgiving_week/colors/colors.json | 0 .../distance_icons/aggressive.png | Bin .../distance_icons/relaxed.png | Bin .../distance_icons/standard.png | Bin .../distance_icons/traffic.png | Bin .../thanksgiving_week/icons/button_flag.gif | Bin .../thanksgiving_week/icons/button_home.gif | Bin .../icons/button_settings.png | Bin .../thanksgiving_week/signals/traditional_125 | 0 .../signals/turn_signal_1.png | Bin .../signals/turn_signal_2.png | Bin .../signals/turn_signal_3.png | Bin .../signals/turn_signal_4.png | Bin .../signals/turn_signal_5.png | Bin .../signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../thanksgiving_week/sounds/disengage.wav | Bin .../thanksgiving_week/sounds/engage.wav | Bin .../steering_wheel/wheel.png | Bin .../valentines_day/colors/colors.json | 0 .../distance_icons/aggressive.gif | Bin .../valentines_day/distance_icons/relaxed.gif | Bin .../distance_icons/standard.gif | Bin .../valentines_day/distance_icons/traffic.gif | Bin .../valentines_day/icons/button_flag.png | Bin .../valentines_day/icons/button_home.gif | Bin .../valentines_day/icons/button_settings.png | Bin .../valentines_day/signals/traditional_125 | 0 .../valentines_day/signals/turn_signal_1.png | Bin .../valentines_day/signals/turn_signal_2.png | Bin .../valentines_day/signals/turn_signal_3.png | Bin .../valentines_day/signals/turn_signal_4.png | Bin .../valentines_day/signals/turn_signal_5.png | Bin .../valentines_day/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../valentines_day/sounds/disengage.wav | Bin .../valentines_day/sounds/engage.wav | Bin .../valentines_day/steering_wheel/wheel.png | Bin .../world_frog_day/colors/colors.json | 0 .../distance_icons/aggressive.gif | Bin .../world_frog_day/distance_icons/relaxed.gif | Bin .../distance_icons/standard.gif | Bin .../world_frog_day/distance_icons/traffic.gif | Bin .../world_frog_day/icons/button_flag.gif | Bin .../world_frog_day/icons/button_home.gif | Bin .../world_frog_day/icons/button_settings.png | Bin .../world_frog_day/signals/traditional_125 | 0 .../world_frog_day/signals/turn_signal_1.png | Bin .../world_frog_day/signals/turn_signal_2.png | Bin .../world_frog_day/signals/turn_signal_3.png | Bin .../world_frog_day/signals/turn_signal_4.png | Bin .../world_frog_day/signals/turn_signal_5.png | Bin .../world_frog_day/signals/turn_signal_6.png | Bin .../signals/turn_signal_blindspot.png | Bin .../world_frog_day/sounds/disengage.wav | Bin .../world_frog_day/sounds/engage.wav | Bin .../world_frog_day/steering_wheel/wheel.png | Bin .../assets/model_manager.py | 6 +- .../assets/nnff_models/ACURA_RDX_3G.json | 0 .../assets/nnff_models/AUDI_A3_MK3.json | 0 .../assets/nnff_models/AUDI_Q3_MK2.json | 0 .../assets/nnff_models/BUICK_LACROSSE.json | 0 .../nnff_models/CHEVROLET_BOLT_EUV.json | 0 .../assets/nnff_models/CHEVROLET_EQUINOX.json | 0 .../nnff_models/CHEVROLET_EQUINOX_CC.json | 0 .../nnff_models/CHEVROLET_SILVERADO.json | 0 .../nnff_models/CHEVROLET_SUBURBAN.json | 0 .../nnff_models/CHEVROLET_SUBURBAN_CC.json | 0 .../nnff_models/CHEVROLET_TRAILBLAZER.json | 0 .../assets/nnff_models/CHEVROLET_VOLT.json | 0 .../CHRYSLER_PACIFICA_2017_HYBRID.json | 0 .../CHRYSLER_PACIFICA_2018_HYBRID.json | 0 .../CHRYSLER_PACIFICA_2019_HYBRID.json | 0 .../nnff_models/CHRYSLER_PACIFICA_2020.json | 0 .../assets/nnff_models/GENESIS_G70.json | 0 .../nnff_models/GENESIS_GV60_EV_1ST_GEN.json | 0 .../nnff_models/GENESIS_GV70_1ST_GEN.json | 0 .../assets/nnff_models/GMC_ACADIA.json | 0 .../assets/nnff_models/HONDA_ACCORD.json | 0 .../assets/nnff_models/HONDA_CIVIC.json | 0 .../assets/nnff_models/HONDA_CIVIC_2022.json | 0 .../assets/nnff_models/HONDA_CIVIC_BOSCH.json | 0 .../assets/nnff_models/HONDA_CLARITY.json | 0 .../assets/nnff_models/HONDA_CRV_5G.json | 0 .../assets/nnff_models/HONDA_CRV_HYBRID.json | 0 .../assets/nnff_models/HONDA_HRV.json | 0 .../assets/nnff_models/HONDA_INSIGHT.json | 0 .../assets/nnff_models/HONDA_ODYSSEY.json | 0 .../assets/nnff_models/HONDA_PILOT.json | 0 .../assets/nnff_models/HONDA_RIDGELINE.json | 0 .../nnff_models/HYUNDAI_ELANTRA_2021.json | 0 .../nnff_models/HYUNDAI_ELANTRA_HEV_2021.json | 0 .../assets/nnff_models/HYUNDAI_GENESIS.json | 0 .../assets/nnff_models/HYUNDAI_IONIQ_5.json | 0 .../nnff_models/HYUNDAI_IONIQ_EV_LTD.json | 0 .../nnff_models/HYUNDAI_IONIQ_PHEV.json | 0 .../assets/nnff_models/HYUNDAI_KONA_EV.json | 0 .../nnff_models/HYUNDAI_KONA_EV_2022.json | 0 .../assets/nnff_models/HYUNDAI_KONA_HEV.json | 0 .../assets/nnff_models/HYUNDAI_PALISADE.json | 0 .../assets/nnff_models/HYUNDAI_SANTA_FE.json | 0 .../nnff_models/HYUNDAI_SANTA_FE_2022.json | 0 .../HYUNDAI_SANTA_FE_HEV_2022.json | 0 .../HYUNDAI_SANTA_FE_PHEV_2022.json | 0 .../assets/nnff_models/HYUNDAI_SONATA.json | 0 .../nnff_models/HYUNDAI_SONATA_HYBRID.json | 0 .../assets/nnff_models/HYUNDAI_SONATA_LF.json | 0 .../nnff_models/HYUNDAI_TUCSON_4TH_GEN.json | 0 .../nnff_models/JEEP_GRAND_CHEROKEE.json | 0 .../nnff_models/JEEP_GRAND_CHEROKEE_2019.json | 0 .../assets/nnff_models/KIA_CEED.json | 0 .../assets/nnff_models/KIA_EV6.json | 0 .../assets/nnff_models/KIA_K5_2021.json | 0 .../assets/nnff_models/KIA_NIRO_EV.json | 0 .../assets/nnff_models/KIA_NIRO_HEV_2021.json | 0 .../nnff_models/KIA_NIRO_HEV_2ND_GEN.json | 0 .../nnff_models/KIA_NIRO_PHEV_2022.json | 0 .../assets/nnff_models/KIA_OPTIMA_G4_FL.json | 0 .../assets/nnff_models/KIA_SELTOS.json | 0 .../assets/nnff_models/KIA_SORENTO.json | 0 .../nnff_models/KIA_SORENTO_4TH_GEN.json | 0 .../nnff_models/KIA_SORENTO_HEV_4TH_GEN.json | 0 .../nnff_models/KIA_SPORTAGE_5TH_GEN.json | 0 .../assets/nnff_models/KIA_STINGER.json | 0 .../assets/nnff_models/KIA_STINGER_2022.json | 0 .../assets/nnff_models/LEXUS_ES_TSS2.json | 0 .../assets/nnff_models/LEXUS_IS.json | 0 .../assets/nnff_models/LEXUS_NX.json | 0 .../assets/nnff_models/LEXUS_NX_TSS2.json | 0 .../assets/nnff_models/LEXUS_RX.json | 0 .../assets/nnff_models/LEXUS_RX_TSS2.json | 0 .../assets/nnff_models/MAZDA_3.json | 0 .../assets/nnff_models/MAZDA_CX5_2022.json | 0 .../assets/nnff_models/MAZDA_CX9.json | 0 .../assets/nnff_models/MAZDA_CX9_2021.json | 0 .../assets/nnff_models/RAM_1500_5TH_GEN.json | 0 .../assets/nnff_models/RAM_HD_5TH_GEN.json | 0 .../assets/nnff_models/SKODA_KAROQ_MK1.json | 0 .../assets/nnff_models/SKODA_KODIAQ_MK1.json | 0 .../assets/nnff_models/SKODA_OCTAVIA_MK3.json | 0 .../assets/nnff_models/SKODA_SUPERB_MK3.json | 0 .../assets/nnff_models/SUBARU_ASCENT.json | 0 .../assets/nnff_models/SUBARU_FORESTER.json | 0 .../assets/nnff_models/SUBARU_IMPREZA.json | 0 .../nnff_models/SUBARU_IMPREZA_2020.json | 0 .../assets/nnff_models/SUBARU_LEGACY.json | 0 .../nnff_models/SUBARU_LEGACY_PREGLOBAL.json | 0 .../assets/nnff_models/SUBARU_OUTBACK.json | 0 .../nnff_models/SUBARU_OUTBACK_PREGLOBAL.json | 0 .../assets/nnff_models/TOYOTA_AVALON.json | 0 .../nnff_models/TOYOTA_AVALON_2019.json | 0 .../nnff_models/TOYOTA_AVALON_TSS2.json | 0 .../assets/nnff_models/TOYOTA_CAMRY.json | 0 .../assets/nnff_models/TOYOTA_CAMRY_TSS2.json | 0 .../assets/nnff_models/TOYOTA_CHR.json | 0 .../assets/nnff_models/TOYOTA_CHR_TSS2.json | 0 .../assets/nnff_models/TOYOTA_COROLLA.json | 0 .../nnff_models/TOYOTA_COROLLA_TSS2.json | 0 .../assets/nnff_models/TOYOTA_HIGHLANDER.json | 0 .../nnff_models/TOYOTA_HIGHLANDER_TSS2.json | 0 .../assets/nnff_models/TOYOTA_MIRAI.json | 0 .../assets/nnff_models/TOYOTA_PRIUS.json | 0 ..._2017_b'8965B47070x00x00x00x00x00x00'.json | 0 .../assets/nnff_models/TOYOTA_PRIUS_TSS2.json | 0 .../assets/nnff_models/TOYOTA_PRIUS_V.json | 0 .../assets/nnff_models/TOYOTA_RAV4.json | 0 .../assets/nnff_models/TOYOTA_RAV4H.json | 0 .../assets/nnff_models/TOYOTA_RAV4_PRIME.json | 0 .../assets/nnff_models/TOYOTA_RAV4_TSS2.json | 0 .../nnff_models/TOYOTA_RAV4_TSS2_2022.json | 0 .../assets/nnff_models/TOYOTA_SIENNA.json | 0 .../nnff_models/TOYOTA_SIENNA_4TH_GEN.json | 0 .../nnff_models/VOLKSWAGEN_ARTEON_MK1.json | 0 .../nnff_models/VOLKSWAGEN_ATLAS_MK1.json | 0 .../nnff_models/VOLKSWAGEN_GOLF_MK7.json | 0 .../nnff_models/VOLKSWAGEN_JETTA_MK7.json | 0 .../nnff_models/VOLKSWAGEN_PASSAT_MK8.json | 0 .../nnff_models/VOLKSWAGEN_PASSAT_NMS.json | 0 .../nnff_models/VOLKSWAGEN_TIGUAN_MK2.json | 0 .../assets/other_images/brake_pedal.png | Bin .../assets/other_images/chill_mode_icon.gif | Bin .../assets/other_images/curve_icon.gif | Bin .../assets/other_images/curve_speed.png | Bin .../assets/other_images/dashboard_icon.png | Bin .../other_images/experimental_mode_icon.gif | Bin .../assets/other_images/gas_pedal.png | Bin .../assets/other_images/lead_icon.gif | Bin .../assets/other_images/light_icon.gif | Bin .../assets/other_images/mapbox_icon.png | Bin .../assets/other_images/next_maps_icon.png | Bin .../assets/other_images/offline_maps_icon.png | Bin .../assets/other_images/paused_icon.png | Bin .../assets/other_images/speed_icon.gif | Bin .../assets/other_images/speed_icon.png | Bin .../other_images/starpilot_boot_logo.jpg | Bin .../assets/other_images/stock_bg.jpg | Bin .../assets/other_images/stop_sign.png | Bin .../assets/other_images/turn_icon.gif | Bin .../assets/other_images/turn_icon.png | Bin .../assets/other_images/weather_clear_day.gif | Bin .../other_images/weather_clear_night.gif | Bin .../other_images/weather_low_visibility.gif | Bin .../assets/other_images/weather_rain.gif | Bin .../assets/other_images/weather_snow.gif | Bin .../random_events/icons/button_home.gif | Bin .../assets/random_events/icons/ferg.png | Bin .../assets/random_events/sounds/angry.wav | Bin .../assets/random_events/sounds/continued.wav | Bin .../assets/random_events/sounds/dejaVu.wav | Bin .../assets/random_events/sounds/doc.wav | Bin .../assets/random_events/sounds/fart.wav | Bin .../assets/random_events/sounds/firefox.wav | Bin .../assets/random_events/sounds/goat.wav | Bin .../assets/random_events/sounds/hal9000.wav | Bin .../assets/random_events/sounds/mail.wav | Bin .../assets/random_events/sounds/nessie.wav | Bin .../assets/random_events/sounds/noice.wav | Bin .../random_events/sounds/this_is_fine.wav | Bin .../assets/random_events/sounds/uwu.wav | Bin .../random_events/steering_wheels/accel30.gif | Bin .../random_events/steering_wheels/accel35.gif | Bin .../random_events/steering_wheels/accel40.gif | Bin .../steering_wheels/firefoxSteerSaturated.gif | Bin .../steering_wheels/goatSteerSaturated.gif | Bin .../thisIsFineSteerSaturated.gif | Bin .../assets/stock_theme/colors/colors.json | 0 .../stock_theme/distance_icons/aggressive.png | Bin .../stock_theme/distance_icons/relaxed.png | Bin .../stock_theme/distance_icons/standard.png | Bin .../stock_theme/distance_icons/traffic.png | Bin .../assets/stock_theme/icons | 0 .../assets/stock_theme/sounds | 0 .../stock_theme/steering_wheel/wheel.png | 0 .../assets/theme_manager.py | 76 ++-- .../toggle_icons/icon_advanced_device.png | Bin .../icon_advanced_lateral_tune.png | Bin .../icon_advanced_longitudinal_tune.png | Bin .../toggle_icons/icon_always_on_lateral.png | Bin .../assets/toggle_icons/icon_calendar.png | Bin .../assets/toggle_icons/icon_conditional.png | Bin .../assets/toggle_icons/icon_device.png | Bin .../assets/toggle_icons/icon_display.png | Bin .../assets/toggle_icons/icon_frog.png | Bin .../assets/toggle_icons/icon_green_light.png | Bin .../assets/toggle_icons/icon_lane.png | Bin .../assets/toggle_icons/icon_lateral_tune.png | Bin .../assets/toggle_icons/icon_light.png | Bin .../toggle_icons/icon_longitudinal_tune.png | Bin .../assets/toggle_icons/icon_map.png | Bin .../assets/toggle_icons/icon_message.png | Bin .../assets/toggle_icons/icon_mute.png | Bin .../assets/toggle_icons/icon_navigate.png | Bin .../assets/toggle_icons/icon_personality.png | Bin .../toggle_icons/icon_quality_of_life.png | Bin .../assets/toggle_icons/icon_rainbow.png | Bin .../assets/toggle_icons/icon_random.png | Bin .../toggle_icons/icon_random_themes.png | Bin .../assets/toggle_icons/icon_road.png | Bin .../assets/toggle_icons/icon_sound.png | Bin .../assets/toggle_icons/icon_speed_limit.png | Bin .../assets/toggle_icons/icon_speed_map.png | Bin .../assets/toggle_icons/icon_steering.png | Bin .../assets/toggle_icons/icon_system.png | Bin .../assets/toggle_icons/icon_tuning.png | Bin .../assets/toggle_icons/icon_vehicle.png | Bin .../common/starpilot_backups.py | 16 +- .../common/starpilot_download_utilities.py | 4 +- .../common/starpilot_functions.py | 92 ++--- .../common/starpilot_utilities.py | 20 +- .../common/starpilot_variables.py | 97 +++-- .../common/testing_grounds.py | 0 .../lib/conditional_experimental_mode.py | 66 ++-- .../controls/lib/curve_speed_controller.py | 30 +- .../lib/neural_network_feedforward.py | 8 +- .../controls/lib/speed_limit_controller.py | 70 ++-- .../controls/lib/starpilot_acceleration.py | 48 +-- .../controls/lib/starpilot_events.py | 138 +++---- .../controls/lib/starpilot_following.py | 82 ++-- .../controls/lib/starpilot_vcruise.py | 36 +- .../controls/lib/weather_checker.py | 46 +-- .../controls/starpilot_card.py | 84 ++-- starpilot/controls/starpilot_planner.py | 203 ++++++++++ {frogpilot => starpilot}/navigation/mapd | Bin .../navigation/mapd_wrapper.py | 2 +- .../navigation/test_mapd_wrapper.py | 4 +- .../starpilot_process.py | 113 +++--- .../system/device_syncd.py | 46 +-- .../system/environment_variables | Bin .../system/environment_variables.backup | Bin .../system/galaxy/bin/frpc_darwin_amd64 | Bin .../system/galaxy/bin/frpc_darwin_arm64 | Bin .../system/galaxy/bin/frpc_linux_amd64 | Bin .../system/galaxy/bin/frpc_linux_arm64 | Bin .../system/galaxy/galaxy.py | 2 +- .../system/speed_limit_filler.py | 10 +- .../system/starpilot_stats.py | 74 ++-- starpilot/system/starpilot_tracking.py | 175 +++++++++ .../system/the_pond/README.md | 0 .../the_pond/assets/components/home/home.css | 0 .../the_pond/assets/components/home/home.js | 2 +- .../the_pond/assets/components/main.css | 0 .../the_pond/assets/components/modal.css | 0 .../the_pond/assets/components/modal.js | 0 .../navigation/navigation_destination.css | 0 .../navigation/navigation_destination.js | 0 .../components/navigation/navigation_keys.css | 0 .../components/navigation/navigation_keys.js | 0 .../navigation/navigation_utilities.js | 0 .../components/recordings/dashcam_routes.css | 0 .../components/recordings/dashcam_routes.js | 0 .../recordings/screen_recordings.css | 0 .../recordings/screen_recordings.js | 0 .../the_pond/assets/components/router.js | 0 .../the_pond/assets/components/settings.css | 0 .../the_pond/assets/components/settings.js | 0 .../the_pond/assets/components/sidebar.css | 0 .../the_pond/assets/components/sidebar.js | 0 .../assets/components/tailscale/tailscale.css | 0 .../assets/components/tailscale/tailscale.js | 0 .../components/tools/device_settings.css | 0 .../components/tools/device_settings.js | 0 .../tools/device_settings_layout.json | 6 +- .../assets/components/tools/doors.css | 0 .../the_pond/assets/components/tools/doors.js | 0 .../assets/components/tools/error_logs.css | 0 .../assets/components/tools/error_logs.js | 0 .../assets/components/tools/galaxy.css | 0 .../assets/components/tools/galaxy.js | 0 .../tools/longitudinal_maneuvers.css | 0 .../tools/longitudinal_maneuvers.js | 0 .../assets/components/tools/model_manager.css | 0 .../assets/components/tools/model_manager.js | 0 .../assets/components/tools/plots.css | 0 .../the_pond/assets/components/tools/plots.js | 0 .../assets/components/tools/speed_limits.css | 0 .../assets/components/tools/speed_limits.js | 2 +- .../components/tools/testing_ground.css | 0 .../assets/components/tools/testing_ground.js | 0 .../assets/components/tools/theme_maker.css | 0 .../assets/components/tools/theme_maker.js | 0 .../the_pond/assets/components/tools/tmux.css | 0 .../the_pond/assets/components/tools/tmux.js | 0 .../assets/components/tools/toggles.css | 0 .../assets/components/tools/toggles.js | 2 +- .../assets/components/tools/troubleshoot.css | 0 .../assets/components/tools/troubleshoot.js | 0 .../assets/components/tools/tsk_manager.css | 0 .../assets/components/tools/tsk_manager.js | 0 .../components/tools/update_manager.css | 0 .../assets/components/tools/update_manager.js | 0 .../components/tools/vehicle_features.js | 0 .../system/the_pond/assets/images/about.txt | 0 .../assets/images/android-chrome-192x192.png | Bin .../assets/images/android-chrome-512x512.png | Bin .../assets/images/apple-touch-icon.png | Bin .../the_pond/assets/images/favicon-16x16.png | Bin .../the_pond/assets/images/favicon-32x32.png | Bin .../system/the_pond/assets/images/favicon.ico | Bin .../system/the_pond/assets/images/favicon.svg | 0 .../the_pond/assets/images/main_logo.png | Bin .../assets/images/safari-pinned-tab.svg | 0 .../the_pond/assets/images/site.webmanifest | 0 .../system/the_pond/assets/js/snackbar.js | 0 .../system/the_pond/assets/js/utils.js | 0 .../system/the_pond/assets/manifest.json | 0 .../the_pond/assets/vendor/arrow-core.js | 0 .../bootstrap-icons/bootstrap-icons.min.css | 0 .../fonts/bootstrap-icons.woff | Bin .../fonts/bootstrap-icons.woff2 | Bin .../font-awesome/css/font-awesome.min.css | 0 .../fonts/fontawesome-webfont.eot | Bin .../fonts/fontawesome-webfont.svg | 0 .../fonts/fontawesome-webfont.ttf | Bin .../fonts/fontawesome-webfont.woff | Bin .../fonts/fontawesome-webfont.woff2 | Bin .../assets/vendor/fonts/Inter-Bold.ttf | Bin .../assets/vendor/fonts/Inter-Regular.ttf | Bin .../the_pond/assets/vendor/fonts/fonts.css | 0 .../the_pond/assets/vendor/fonts/password.ttf | Bin .../assets/vendor/remix-router-1.3.1.js | 0 .../system/the_pond/templates/index.html | 0 .../system/the_pond/the_pond.py | 55 +-- .../system/the_pond/utilities.py | 14 +- .../blinker-1.9.0.dist-info/INSTALLER | 0 .../blinker-1.9.0.dist-info/LICENSE.txt | 0 .../blinker-1.9.0.dist-info/METADATA | 0 .../blinker-1.9.0.dist-info/RECORD | 0 .../blinker-1.9.0.dist-info/REQUESTED | 0 .../third_party/blinker-1.9.0.dist-info/WHEEL | 0 .../third_party/blinker/__init__.py | 0 .../third_party/blinker/_utilities.py | 0 .../third_party/blinker/base.py | 0 .../third_party/blinker/py.typed | 0 .../third_party/certifi/__init__.py | 0 .../third_party/certifi/__main__.py | 0 .../third_party/certifi/cacert.pem | 0 .../third_party/certifi/core.py | 0 .../third_party/certifi/py.typed | 0 .../click-8.3.1.dist-info/INSTALLER | 0 .../click-8.3.1.dist-info/METADATA | 0 .../third_party/click-8.3.1.dist-info/RECORD | 0 .../click-8.3.1.dist-info/REQUESTED | 0 .../third_party/click-8.3.1.dist-info/WHEEL | 0 .../licenses/LICENSE.txt | 0 .../third_party/click/__init__.py | 0 .../third_party/click/_compat.py | 0 .../third_party/click/_termui_impl.py | 0 .../third_party/click/_textwrap.py | 0 .../third_party/click/_utils.py | 0 .../third_party/click/_winconsole.py | 0 .../third_party/click/core.py | 0 .../third_party/click/decorators.py | 0 .../third_party/click/exceptions.py | 0 .../third_party/click/formatting.py | 0 .../third_party/click/globals.py | 0 .../third_party/click/parser.py | 0 .../third_party/click/py.typed | 0 .../third_party/click/shell_completion.py | 0 .../third_party/click/termui.py | 0 .../third_party/click/testing.py | 0 .../third_party/click/types.py | 0 .../third_party/click/utils.py | 0 .../third_party/dateutil/__init__.py | 0 .../third_party/dateutil/_common.py | 0 .../third_party/dateutil/_version.py | 0 .../third_party/dateutil/easter.py | 0 .../third_party/dateutil/parser/__init__.py | 0 .../third_party/dateutil/parser/_parser.py | 0 .../third_party/dateutil/parser/isoparser.py | 0 .../third_party/dateutil/relativedelta.py | 0 .../third_party/dateutil/rrule.py | 0 .../third_party/dateutil/tz/__init__.py | 0 .../third_party/dateutil/tz/_common.py | 0 .../third_party/dateutil/tz/_factories.py | 0 .../third_party/dateutil/tz/tz.py | 0 .../third_party/dateutil/tz/win.py | 0 .../third_party/dateutil/tzwin.py | 0 .../third_party/dateutil/utils.py | 0 .../third_party/dateutil/zoneinfo/__init__.py | 0 .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin .../third_party/dateutil/zoneinfo/rebuild.py | 0 .../flask-3.1.3.dist-info/INSTALLER | 0 .../flask-3.1.3.dist-info/METADATA | 0 .../third_party/flask-3.1.3.dist-info/RECORD | 0 .../flask-3.1.3.dist-info/REQUESTED | 0 .../third_party/flask-3.1.3.dist-info/WHEEL | 0 .../flask-3.1.3.dist-info/entry_points.txt | 0 .../licenses/LICENSE.txt | 0 .../third_party/flask/__init__.py | 0 .../third_party/flask/__main__.py | 0 .../third_party/flask/app.py | 0 .../third_party/flask/blueprints.py | 0 .../third_party/flask/cli.py | 0 .../third_party/flask/config.py | 0 .../third_party/flask/ctx.py | 0 .../third_party/flask/debughelpers.py | 0 .../third_party/flask/globals.py | 0 .../third_party/flask/helpers.py | 0 .../third_party/flask/json/__init__.py | 0 .../third_party/flask/json/provider.py | 0 .../third_party/flask/json/tag.py | 0 .../third_party/flask/logging.py | 0 .../third_party/flask/py.typed | 0 .../third_party/flask/sansio/README.md | 0 .../third_party/flask/sansio/app.py | 0 .../third_party/flask/sansio/blueprints.py | 0 .../third_party/flask/sansio/scaffold.py | 0 .../third_party/flask/sessions.py | 0 .../third_party/flask/signals.py | 0 .../third_party/flask/templating.py | 0 .../third_party/flask/testing.py | 0 .../third_party/flask/typing.py | 0 .../third_party/flask/views.py | 0 .../third_party/flask/wrappers.py | 0 .../third_party/flatbuffers/__init__.py | 0 .../third_party/flatbuffers/_version.py | 0 .../third_party/flatbuffers/builder.py | 0 .../third_party/flatbuffers/compat.py | 0 .../third_party/flatbuffers/encode.py | 0 .../third_party/flatbuffers/number_types.py | 0 .../third_party/flatbuffers/packer.py | 0 .../third_party/flatbuffers/table.py | 0 .../third_party/flatbuffers/util.py | 0 .../third_party/h3/__init__.py | 0 .../third_party/h3/_cy/__init__.py | 0 .../cells.cpython-312-aarch64-linux-gnu.so | Bin .../edges.cpython-312-aarch64-linux-gnu.so | Bin ...or_system.cpython-312-aarch64-linux-gnu.so | Bin .../latlng.cpython-312-aarch64-linux-gnu.so | Bin .../memory.cpython-312-aarch64-linux-gnu.so | Bin ...multipoly.cpython-312-aarch64-linux-gnu.so | Bin .../_cy/util.cpython-312-aarch64-linux-gnu.so | Bin .../vertex.cpython-312-aarch64-linux-gnu.so | Bin .../third_party/h3/_h3shape.py | 0 .../third_party/h3/_version.py | 0 .../third_party/h3/api/__init__.py | 0 .../third_party/h3/api/basic_int/__init__.py | 0 .../third_party/h3/api/basic_int/_convert.py | 0 .../third_party/h3/api/basic_str/__init__.py | 0 .../third_party/h3/api/basic_str/_convert.py | 0 .../h3/api/memview_int/__init__.py | 0 .../h3/api/memview_int/_convert.py | 0 .../third_party/h3/api/numpy_int/__init__.py | 0 .../third_party/h3/api/numpy_int/_convert.py | 0 .../third_party/influxdb_client/__init__.py | 0 .../influxdb_client/_async/__init__.py | 0 .../influxdb_client/_async/api_client.py | 0 .../influxdb_client/_async/rest.py | 0 .../influxdb_client/_sync/__init__.py | 0 .../influxdb_client/_sync/api_client.py | 0 .../third_party/influxdb_client/_sync/rest.py | 0 .../influxdb_client/client/__init__.py | 0 .../influxdb_client/client/_base.py | 0 .../influxdb_client/client/_pages.py | 0 .../client/authorizations_api.py | 0 .../influxdb_client/client/bucket_api.py | 0 .../influxdb_client/client/delete_api.py | 0 .../client/delete_api_async.py | 0 .../influxdb_client/client/exceptions.py | 0 .../influxdb_client/client/flux_csv_parser.py | 0 .../influxdb_client/client/flux_table.py | 0 .../influxdb_client/client/influxdb_client.py | 0 .../client/influxdb_client_async.py | 0 .../client/invokable_scripts_api.py | 0 .../influxdb_client/client/labels_api.py | 0 .../influxdb_client/client/logging_handler.py | 0 .../client/organizations_api.py | 0 .../influxdb_client/client/query_api.py | 0 .../influxdb_client/client/query_api_async.py | 0 .../influxdb_client/client/tasks_api.py | 0 .../influxdb_client/client/users_api.py | 0 .../influxdb_client/client/util/__init__.py | 0 .../influxdb_client/client/util/date_utils.py | 0 .../client/util/date_utils_pandas.py | 0 .../influxdb_client/client/util/helpers.py | 0 .../client/util/multiprocessing_helper.py | 0 .../influxdb_client/client/warnings.py | 0 .../influxdb_client/client/write/__init__.py | 0 .../client/write/dataframe_serializer.py | 0 .../influxdb_client/client/write/point.py | 0 .../influxdb_client/client/write/retry.py | 0 .../influxdb_client/client/write_api.py | 0 .../influxdb_client/client/write_api_async.py | 0 .../influxdb_client/configuration.py | 0 .../influxdb_client/domain/__init__.py | 0 .../add_resource_member_request_body.py | 0 .../domain/analyze_query_response.py | 0 .../domain/analyze_query_response_errors.py | 0 .../domain/array_expression.py | 0 .../influxdb_client/domain/ast_response.py | 0 .../influxdb_client/domain/authorization.py | 0 .../domain/authorization_post_request.py | 0 .../domain/authorization_update_request.py | 0 .../influxdb_client/domain/authorizations.py | 0 .../influxdb_client/domain/axes.py | 0 .../influxdb_client/domain/axis.py | 0 .../influxdb_client/domain/axis_scale.py | 0 .../influxdb_client/domain/bad_statement.py | 0 .../domain/band_view_properties.py | 0 .../domain/binary_expression.py | 0 .../influxdb_client/domain/block.py | 0 .../influxdb_client/domain/boolean_literal.py | 0 .../influxdb_client/domain/bucket.py | 0 .../influxdb_client/domain/bucket_links.py | 0 .../domain/bucket_metadata_manifest.py | 0 .../domain/bucket_retention_rules.py | 0 .../domain/bucket_shard_mapping.py | 0 .../influxdb_client/domain/buckets.py | 0 .../domain/builder_aggregate_function_type.py | 0 .../influxdb_client/domain/builder_config.py | 0 .../domain/builder_config_aggregate_window.py | 0 .../domain/builder_functions_type.py | 0 .../domain/builder_tags_type.py | 0 .../domain/builtin_statement.py | 0 .../influxdb_client/domain/call_expression.py | 0 .../influxdb_client/domain/cell.py | 0 .../influxdb_client/domain/cell_links.py | 0 .../influxdb_client/domain/cell_update.py | 0 .../domain/cell_with_view_properties.py | 0 .../influxdb_client/domain/check.py | 0 .../influxdb_client/domain/check_base.py | 0 .../domain/check_base_links.py | 0 .../domain/check_discriminator.py | 0 .../influxdb_client/domain/check_patch.py | 0 .../domain/check_status_level.py | 0 .../domain/check_view_properties.py | 0 .../influxdb_client/domain/checks.py | 0 .../domain/column_data_type.py | 0 .../domain/column_semantic_type.py | 0 .../domain/conditional_expression.py | 0 .../influxdb_client/domain/config.py | 0 .../domain/constant_variable_properties.py | 0 .../influxdb_client/domain/create_cell.py | 0 .../domain/create_dashboard_request.py | 0 .../influxdb_client/domain/custom_check.py | 0 .../influxdb_client/domain/dashboard.py | 0 .../influxdb_client/domain/dashboard_color.py | 0 .../influxdb_client/domain/dashboard_query.py | 0 .../domain/dashboard_with_view_properties.py | 0 .../influxdb_client/domain/dashboards.py | 0 .../domain/date_time_literal.py | 0 .../influxdb_client/domain/dbr_ps.py | 0 .../influxdb_client/domain/dbrp.py | 0 .../influxdb_client/domain/dbrp_create.py | 0 .../influxdb_client/domain/dbrp_get.py | 0 .../influxdb_client/domain/dbrp_update.py | 0 .../influxdb_client/domain/deadman_check.py | 0 .../influxdb_client/domain/decimal_places.py | 0 .../domain/delete_predicate_request.py | 0 .../influxdb_client/domain/dialect.py | 0 .../influxdb_client/domain/dict_expression.py | 0 .../influxdb_client/domain/dict_item.py | 0 .../influxdb_client/domain/duration.py | 0 .../domain/duration_literal.py | 0 .../influxdb_client/domain/error.py | 0 .../influxdb_client/domain/expression.py | 0 .../domain/expression_statement.py | 0 .../influxdb_client/domain/field.py | 0 .../influxdb_client/domain/file.py | 0 .../influxdb_client/domain/float_literal.py | 0 .../influxdb_client/domain/flux_response.py | 0 .../influxdb_client/domain/flux_suggestion.py | 0 .../domain/flux_suggestions.py | 0 .../domain/function_expression.py | 0 .../domain/gauge_view_properties.py | 0 .../domain/greater_threshold.py | 0 .../influxdb_client/domain/health_check.py | 0 .../domain/heatmap_view_properties.py | 0 .../domain/histogram_view_properties.py | 0 .../domain/http_notification_endpoint.py | 0 .../domain/http_notification_rule.py | 0 .../domain/http_notification_rule_base.py | 0 .../influxdb_client/domain/identifier.py | 0 .../domain/import_declaration.py | 0 .../domain/index_expression.py | 0 .../influxdb_client/domain/integer_literal.py | 0 .../influxdb_client/domain/is_onboarding.py | 0 .../influxdb_client/domain/label.py | 0 .../domain/label_create_request.py | 0 .../influxdb_client/domain/label_mapping.py | 0 .../influxdb_client/domain/label_response.py | 0 .../influxdb_client/domain/label_update.py | 0 .../influxdb_client/domain/labels_response.py | 0 .../domain/language_request.py | 0 .../legacy_authorization_post_request.py | 0 .../domain/lesser_threshold.py | 0 .../line_plus_single_stat_properties.py | 0 .../domain/line_protocol_error.py | 0 .../domain/line_protocol_length_error.py | 0 .../influxdb_client/domain/links.py | 0 .../domain/list_stacks_response.py | 0 .../influxdb_client/domain/log_event.py | 0 .../domain/logical_expression.py | 0 .../influxdb_client/domain/logs.py | 0 .../domain/map_variable_properties.py | 0 .../domain/markdown_view_properties.py | 0 .../domain/measurement_schema.py | 0 .../domain/measurement_schema_column.py | 0 .../measurement_schema_create_request.py | 0 .../domain/measurement_schema_list.py | 0 .../measurement_schema_update_request.py | 0 .../domain/member_assignment.py | 0 .../domain/member_expression.py | 0 .../influxdb_client/domain/metadata_backup.py | 0 .../influxdb_client/domain/model_property.py | 0 .../domain/mosaic_view_properties.py | 0 .../influxdb_client/domain/node.py | 0 .../domain/notification_endpoint.py | 0 .../domain/notification_endpoint_base.py | 0 .../notification_endpoint_base_links.py | 0 .../notification_endpoint_discriminator.py | 0 .../domain/notification_endpoint_type.py | 0 .../domain/notification_endpoint_update.py | 0 .../domain/notification_endpoints.py | 0 .../domain/notification_rule.py | 0 .../domain/notification_rule_base.py | 0 .../domain/notification_rule_base_links.py | 0 .../domain/notification_rule_discriminator.py | 0 .../domain/notification_rule_update.py | 0 .../domain/notification_rules.py | 0 .../domain/object_expression.py | 0 .../domain/onboarding_request.py | 0 .../domain/onboarding_response.py | 0 .../domain/option_statement.py | 0 .../influxdb_client/domain/organization.py | 0 .../domain/organization_links.py | 0 .../influxdb_client/domain/organizations.py | 0 .../influxdb_client/domain/package.py | 0 .../influxdb_client/domain/package_clause.py | 0 .../pager_duty_notification_endpoint.py | 0 .../domain/pager_duty_notification_rule.py | 0 .../pager_duty_notification_rule_base.py | 0 .../domain/paren_expression.py | 0 .../domain/password_reset_body.py | 0 .../domain/patch_bucket_request.py | 0 .../domain/patch_dashboard_request.py | 0 .../domain/patch_organization_request.py | 0 .../domain/patch_retention_rule.py | 0 .../domain/patch_stack_request.py | 0 ...atch_stack_request_additional_resources.py | 0 .../influxdb_client/domain/permission.py | 0 .../domain/permission_resource.py | 0 .../influxdb_client/domain/pipe_expression.py | 0 .../influxdb_client/domain/pipe_literal.py | 0 .../domain/post_bucket_request.py | 0 .../influxdb_client/domain/post_check.py | 0 .../domain/post_notification_endpoint.py | 0 .../domain/post_notification_rule.py | 0 .../domain/post_organization_request.py | 0 .../domain/post_restore_kv_response.py | 0 .../domain/post_stack_request.py | 0 .../influxdb_client/domain/property_key.py | 0 .../influxdb_client/domain/query.py | 0 .../influxdb_client/domain/query_edit_mode.py | 0 .../domain/query_variable_properties.py | 0 .../query_variable_properties_values.py | 0 .../influxdb_client/domain/range_threshold.py | 0 .../influxdb_client/domain/ready.py | 0 .../influxdb_client/domain/regexp_literal.py | 0 .../domain/remote_connection.py | 0 .../remote_connection_creation_request.py | 0 .../remote_connection_update_request.py | 0 .../domain/remote_connections.py | 0 .../influxdb_client/domain/renamable_field.py | 0 .../influxdb_client/domain/replication.py | 0 .../domain/replication_creation_request.py | 0 .../domain/replication_update_request.py | 0 .../influxdb_client/domain/replications.py | 0 .../influxdb_client/domain/resource_member.py | 0 .../domain/resource_members.py | 0 .../domain/resource_members_links.py | 0 .../influxdb_client/domain/resource_owner.py | 0 .../influxdb_client/domain/resource_owners.py | 0 .../domain/restored_bucket_mappings.py | 0 .../domain/retention_policy_manifest.py | 0 .../domain/return_statement.py | 0 .../influxdb_client/domain/routes.py | 0 .../influxdb_client/domain/routes_external.py | 0 .../influxdb_client/domain/routes_query.py | 0 .../influxdb_client/domain/routes_system.py | 0 .../domain/rule_status_level.py | 0 .../third_party/influxdb_client/domain/run.py | 0 .../influxdb_client/domain/run_links.py | 0 .../influxdb_client/domain/run_manually.py | 0 .../influxdb_client/domain/runs.py | 0 .../domain/scatter_view_properties.py | 0 .../influxdb_client/domain/schema_type.py | 0 .../domain/scraper_target_request.py | 0 .../domain/scraper_target_response.py | 0 .../domain/scraper_target_responses.py | 0 .../influxdb_client/domain/script.py | 0 .../domain/script_create_request.py | 0 .../domain/script_invocation_params.py | 0 .../influxdb_client/domain/script_language.py | 0 .../domain/script_update_request.py | 0 .../influxdb_client/domain/scripts.py | 0 .../influxdb_client/domain/secret_keys.py | 0 .../domain/secret_keys_response.py | 0 .../domain/shard_group_manifest.py | 0 .../influxdb_client/domain/shard_manifest.py | 0 .../influxdb_client/domain/shard_owner.py | 0 .../domain/simple_table_view_properties.py | 0 .../domain/single_stat_view_properties.py | 0 .../domain/slack_notification_endpoint.py | 0 .../domain/slack_notification_rule.py | 0 .../domain/slack_notification_rule_base.py | 0 .../domain/smtp_notification_rule.py | 0 .../domain/smtp_notification_rule_base.py | 0 .../influxdb_client/domain/source.py | 0 .../influxdb_client/domain/source_links.py | 0 .../influxdb_client/domain/sources.py | 0 .../influxdb_client/domain/stack.py | 0 .../domain/stack_associations.py | 0 .../influxdb_client/domain/stack_events.py | 0 .../influxdb_client/domain/stack_links.py | 0 .../influxdb_client/domain/stack_resources.py | 0 .../influxdb_client/domain/statement.py | 0 .../influxdb_client/domain/static_legend.py | 0 .../influxdb_client/domain/status_rule.py | 0 .../influxdb_client/domain/string_literal.py | 0 .../domain/subscription_manifest.py | 0 .../domain/table_view_properties.py | 0 .../table_view_properties_table_options.py | 0 .../influxdb_client/domain/tag_rule.py | 0 .../influxdb_client/domain/task.py | 0 .../domain/task_create_request.py | 0 .../influxdb_client/domain/task_links.py | 0 .../domain/task_status_type.py | 0 .../domain/task_update_request.py | 0 .../influxdb_client/domain/tasks.py | 0 .../influxdb_client/domain/telegraf.py | 0 .../influxdb_client/domain/telegraf_plugin.py | 0 .../domain/telegraf_plugin_request.py | 0 .../domain/telegraf_plugin_request_plugins.py | 0 .../domain/telegraf_plugins.py | 0 .../domain/telegraf_request.py | 0 .../domain/telegraf_request_metadata.py | 0 .../influxdb_client/domain/telegrafs.py | 0 .../domain/telegram_notification_endpoint.py | 0 .../domain/telegram_notification_rule.py | 0 .../domain/telegram_notification_rule_base.py | 0 .../influxdb_client/domain/template_apply.py | 0 .../domain/template_apply_remotes.py | 0 .../domain/template_apply_template.py | 0 .../influxdb_client/domain/template_chart.py | 0 .../domain/template_export_by_id.py | 0 .../domain/template_export_by_id_org_ids.py | 0 .../template_export_by_id_resource_filters.py | 0 .../domain/template_export_by_id_resources.py | 0 .../domain/template_export_by_name.py | 0 .../template_export_by_name_resources.py | 0 .../influxdb_client/domain/template_kind.py | 0 .../domain/template_summary.py | 0 .../domain/template_summary_diff.py | 0 .../domain/template_summary_diff_buckets.py | 0 .../template_summary_diff_buckets_new_old.py | 0 .../domain/template_summary_diff_checks.py | 0 .../template_summary_diff_dashboards.py | 0 ...emplate_summary_diff_dashboards_new_old.py | 0 .../template_summary_diff_label_mappings.py | 0 .../domain/template_summary_diff_labels.py | 0 .../template_summary_diff_labels_new_old.py | 0 ...ate_summary_diff_notification_endpoints.py | 0 ...emplate_summary_diff_notification_rules.py | 0 ...summary_diff_notification_rules_new_old.py | 0 .../domain/template_summary_diff_tasks.py | 0 .../template_summary_diff_tasks_new_old.py | 0 .../template_summary_diff_telegraf_configs.py | 0 .../domain/template_summary_diff_variables.py | 0 ...template_summary_diff_variables_new_old.py | 0 .../domain/template_summary_errors.py | 0 .../domain/template_summary_label.py | 0 .../template_summary_label_properties.py | 0 .../domain/template_summary_summary.py | 0 .../template_summary_summary_buckets.py | 0 .../template_summary_summary_dashboards.py | 0 ...template_summary_summary_label_mappings.py | 0 ...late_summary_summary_notification_rules.py | 0 .../template_summary_summary_status_rules.py | 0 .../template_summary_summary_tag_rules.py | 0 .../domain/template_summary_summary_tasks.py | 0 .../template_summary_summary_variables.py | 0 .../influxdb_client/domain/test_statement.py | 0 .../influxdb_client/domain/threshold.py | 0 .../influxdb_client/domain/threshold_base.py | 0 .../influxdb_client/domain/threshold_check.py | 0 .../domain/unary_expression.py | 0 .../domain/unsigned_integer_literal.py | 0 .../influxdb_client/domain/user.py | 0 .../influxdb_client/domain/user_response.py | 0 .../domain/user_response_links.py | 0 .../influxdb_client/domain/users.py | 0 .../influxdb_client/domain/variable.py | 0 .../domain/variable_assignment.py | 0 .../influxdb_client/domain/variable_links.py | 0 .../domain/variable_properties.py | 0 .../influxdb_client/domain/variables.py | 0 .../influxdb_client/domain/view.py | 0 .../influxdb_client/domain/view_links.py | 0 .../influxdb_client/domain/view_properties.py | 0 .../influxdb_client/domain/views.py | 0 .../influxdb_client/domain/write_precision.py | 0 .../influxdb_client/domain/xy_geom.py | 0 .../domain/xy_view_properties.py | 0 .../third_party/influxdb_client/extras.py | 0 .../third_party/influxdb_client/py.typed | 0 .../third_party/influxdb_client/rest.py | 0 .../influxdb_client/service/__init__.py | 0 .../influxdb_client/service/_base_service.py | 0 .../service/authorizations_service.py | 0 .../influxdb_client/service/backup_service.py | 0 .../service/bucket_schemas_service.py | 0 .../service/buckets_service.py | 0 .../influxdb_client/service/cells_service.py | 0 .../influxdb_client/service/checks_service.py | 0 .../influxdb_client/service/config_service.py | 0 .../service/dashboards_service.py | 0 .../influxdb_client/service/dbr_ps_service.py | 0 .../influxdb_client/service/delete_service.py | 0 .../influxdb_client/service/health_service.py | 0 .../service/invokable_scripts_service.py | 0 .../influxdb_client/service/labels_service.py | 0 .../service/legacy_authorizations_service.py | 0 .../service/metrics_service.py | 0 .../service/notification_endpoints_service.py | 0 .../service/notification_rules_service.py | 0 .../service/organizations_service.py | 0 .../influxdb_client/service/ping_service.py | 0 .../influxdb_client/service/query_service.py | 0 .../influxdb_client/service/ready_service.py | 0 .../service/remote_connections_service.py | 0 .../service/replications_service.py | 0 .../service/resources_service.py | 0 .../service/restore_service.py | 0 .../influxdb_client/service/routes_service.py | 0 .../influxdb_client/service/rules_service.py | 0 .../service/scraper_targets_service.py | 0 .../service/secrets_service.py | 0 .../influxdb_client/service/setup_service.py | 0 .../influxdb_client/service/signin_service.py | 0 .../service/signout_service.py | 0 .../service/sources_service.py | 0 .../influxdb_client/service/tasks_service.py | 0 .../service/telegraf_plugins_service.py | 0 .../service/telegrafs_service.py | 0 .../service/templates_service.py | 0 .../influxdb_client/service/users_service.py | 0 .../service/variables_service.py | 0 .../influxdb_client/service/views_service.py | 0 .../influxdb_client/service/write_service.py | 0 .../third_party/influxdb_client/version.py | 0 .../itsdangerous-2.2.0.dist-info/INSTALLER | 0 .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 0 .../itsdangerous-2.2.0.dist-info/METADATA | 0 .../itsdangerous-2.2.0.dist-info/RECORD | 0 .../itsdangerous-2.2.0.dist-info/REQUESTED | 0 .../itsdangerous-2.2.0.dist-info/WHEEL | 0 .../third_party/itsdangerous/__init__.py | 0 .../third_party/itsdangerous/_json.py | 0 .../third_party/itsdangerous/encoding.py | 0 .../third_party/itsdangerous/exc.py | 0 .../third_party/itsdangerous/py.typed | 0 .../third_party/itsdangerous/serializer.py | 0 .../third_party/itsdangerous/signer.py | 0 .../third_party/itsdangerous/timed.py | 0 .../third_party/itsdangerous/url_safe.py | 0 .../jinja2-3.1.6.dist-info/INSTALLER | 0 .../jinja2-3.1.6.dist-info/METADATA | 0 .../third_party/jinja2-3.1.6.dist-info/RECORD | 0 .../jinja2-3.1.6.dist-info/REQUESTED | 0 .../third_party/jinja2-3.1.6.dist-info/WHEEL | 0 .../jinja2-3.1.6.dist-info/entry_points.txt | 0 .../licenses/LICENSE.txt | 0 .../third_party/jinja2/__init__.py | 0 .../third_party/jinja2/_identifier.py | 0 .../third_party/jinja2/async_utils.py | 0 .../third_party/jinja2/bccache.py | 0 .../third_party/jinja2/compiler.py | 0 .../third_party/jinja2/constants.py | 0 .../third_party/jinja2/debug.py | 0 .../third_party/jinja2/defaults.py | 0 .../third_party/jinja2/environment.py | 0 .../third_party/jinja2/exceptions.py | 0 .../third_party/jinja2/ext.py | 0 .../third_party/jinja2/filters.py | 0 .../third_party/jinja2/idtracking.py | 0 .../third_party/jinja2/lexer.py | 0 .../third_party/jinja2/loaders.py | 0 .../third_party/jinja2/meta.py | 0 .../third_party/jinja2/nativetypes.py | 0 .../third_party/jinja2/nodes.py | 0 .../third_party/jinja2/optimizer.py | 0 .../third_party/jinja2/parser.py | 0 .../third_party/jinja2/py.typed | 0 .../third_party/jinja2/runtime.py | 0 .../third_party/jinja2/sandbox.py | 0 .../third_party/jinja2/tests.py | 0 .../third_party/jinja2/utils.py | 0 .../third_party/jinja2/visitor.py | 0 .../third_party/kaitaistruct.py | 0 .../markupsafe-3.0.3.dist-info/INSTALLER | 0 .../markupsafe-3.0.3.dist-info/METADATA | 0 .../markupsafe-3.0.3.dist-info/RECORD | 0 .../markupsafe-3.0.3.dist-info/REQUESTED | 0 .../markupsafe-3.0.3.dist-info/WHEEL | 0 .../licenses/LICENSE.txt | 0 .../markupsafe-3.0.3.dist-info/top_level.txt | 0 .../third_party/markupsafe/__init__.py | 0 .../third_party/markupsafe/_native.py | 0 .../third_party/markupsafe/_speedups.c | 0 .../third_party/markupsafe/_speedups.pyi | 0 .../third_party/markupsafe/py.typed | 0 .../pydub-0.25.1.dist-info/AUTHORS | 0 .../pydub-0.25.1.dist-info/INSTALLER | 0 .../pydub-0.25.1.dist-info/LICENSE | 0 .../pydub-0.25.1.dist-info/METADATA | 0 .../third_party/pydub-0.25.1.dist-info/RECORD | 0 .../pydub-0.25.1.dist-info/REQUESTED | 0 .../third_party/pydub-0.25.1.dist-info/WHEEL | 0 .../pydub-0.25.1.dist-info/top_level.txt | 0 .../third_party/pydub/__init__.py | 0 .../third_party/pydub/audio_segment.py | 0 .../third_party/pydub/effects.py | 0 .../third_party/pydub/exceptions.py | 0 .../third_party/pydub/generators.py | 0 .../third_party/pydub/logging_utils.py | 0 .../third_party/pydub/playback.py | 0 .../third_party/pydub/pyaudioop.py | 0 .../third_party/pydub/scipy_effects.py | 0 .../third_party/pydub/silence.py | 0 .../third_party/pydub/utils.py | 0 .../third_party/reactivex/__init__.py | 0 .../third_party/reactivex/_version.py | 0 .../third_party/reactivex/abc/__init__.py | 0 .../third_party/reactivex/abc/disposable.py | 0 .../third_party/reactivex/abc/observable.py | 0 .../third_party/reactivex/abc/observer.py | 0 .../reactivex/abc/periodicscheduler.py | 0 .../third_party/reactivex/abc/scheduler.py | 0 .../third_party/reactivex/abc/startable.py | 0 .../third_party/reactivex/abc/subject.py | 0 .../reactivex/disposable/__init__.py | 0 .../reactivex/disposable/booleandisposable.py | 0 .../disposable/compositedisposable.py | 0 .../reactivex/disposable/disposable.py | 0 .../multipleassignmentdisposable.py | 0 .../disposable/refcountdisposable.py | 0 .../disposable/scheduleddisposable.py | 0 .../reactivex/disposable/serialdisposable.py | 0 .../disposable/singleassignmentdisposable.py | 0 .../reactivex/internal/__init__.py | 0 .../third_party/reactivex/internal/basic.py | 0 .../reactivex/internal/concurrency.py | 0 .../reactivex/internal/constants.py | 0 .../reactivex/internal/exceptions.py | 0 .../reactivex/internal/priorityqueue.py | 0 .../third_party/reactivex/internal/utils.py | 0 .../third_party/reactivex/notification.py | 0 .../reactivex/observable/__init__.py | 0 .../third_party/reactivex/observable/amb.py | 0 .../third_party/reactivex/observable/case.py | 0 .../third_party/reactivex/observable/catch.py | 0 .../reactivex/observable/combinelatest.py | 0 .../reactivex/observable/concat.py | 0 .../observable/connectableobservable.py | 0 .../third_party/reactivex/observable/defer.py | 0 .../third_party/reactivex/observable/empty.py | 0 .../reactivex/observable/forkjoin.py | 0 .../reactivex/observable/fromcallback.py | 0 .../reactivex/observable/fromfuture.py | 0 .../reactivex/observable/fromiterable.py | 0 .../reactivex/observable/generate.py | 0 .../observable/generatewithrelativetime.py | 0 .../reactivex/observable/groupedobservable.py | 0 .../reactivex/observable/ifthen.py | 0 .../reactivex/observable/interval.py | 0 .../reactivex/observable/marbles.py | 0 .../third_party/reactivex/observable/merge.py | 0 .../third_party/reactivex/observable/never.py | 0 .../reactivex/observable/observable.py | 0 .../reactivex/observable/onerrorresumenext.py | 0 .../third_party/reactivex/observable/range.py | 0 .../reactivex/observable/repeat.py | 0 .../reactivex/observable/returnvalue.py | 0 .../third_party/reactivex/observable/start.py | 0 .../reactivex/observable/startasync.py | 0 .../third_party/reactivex/observable/throw.py | 0 .../third_party/reactivex/observable/timer.py | 0 .../reactivex/observable/toasync.py | 0 .../third_party/reactivex/observable/using.py | 0 .../reactivex/observable/withlatestfrom.py | 0 .../third_party/reactivex/observable/zip.py | 0 .../reactivex/observer/__init__.py | 0 .../reactivex/observer/autodetachobserver.py | 0 .../reactivex/observer/observeonobserver.py | 0 .../reactivex/observer/observer.py | 0 .../reactivex/observer/scheduledobserver.py | 0 .../reactivex/operators/__init__.py | 0 .../third_party/reactivex/operators/_all.py | 0 .../third_party/reactivex/operators/_amb.py | 0 .../reactivex/operators/_asobservable.py | 0 .../reactivex/operators/_average.py | 0 .../reactivex/operators/_buffer.py | 0 .../reactivex/operators/_bufferwithtime.py | 0 .../operators/_bufferwithtimeorcount.py | 0 .../third_party/reactivex/operators/_catch.py | 0 .../reactivex/operators/_combinelatest.py | 0 .../reactivex/operators/_concat.py | 0 .../reactivex/operators/_contains.py | 0 .../third_party/reactivex/operators/_count.py | 0 .../reactivex/operators/_debounce.py | 0 .../reactivex/operators/_defaultifempty.py | 0 .../third_party/reactivex/operators/_delay.py | 0 .../reactivex/operators/_delaysubscription.py | 0 .../reactivex/operators/_delaywithmapper.py | 0 .../reactivex/operators/_dematerialize.py | 0 .../reactivex/operators/_distinct.py | 0 .../operators/_distinctuntilchanged.py | 0 .../third_party/reactivex/operators/_do.py | 0 .../reactivex/operators/_dowhile.py | 0 .../operators/_elementatordefault.py | 0 .../reactivex/operators/_exclusive.py | 0 .../reactivex/operators/_expand.py | 0 .../reactivex/operators/_filter.py | 0 .../reactivex/operators/_finallyaction.py | 0 .../third_party/reactivex/operators/_find.py | 0 .../third_party/reactivex/operators/_first.py | 0 .../reactivex/operators/_firstordefault.py | 0 .../reactivex/operators/_flatmap.py | 0 .../reactivex/operators/_forkjoin.py | 0 .../reactivex/operators/_groupby.py | 0 .../reactivex/operators/_groupbyuntil.py | 0 .../reactivex/operators/_groupjoin.py | 0 .../reactivex/operators/_ignoreelements.py | 0 .../reactivex/operators/_isempty.py | 0 .../third_party/reactivex/operators/_join.py | 0 .../third_party/reactivex/operators/_last.py | 0 .../reactivex/operators/_lastordefault.py | 0 .../third_party/reactivex/operators/_map.py | 0 .../reactivex/operators/_materialize.py | 0 .../third_party/reactivex/operators/_max.py | 0 .../third_party/reactivex/operators/_maxby.py | 0 .../third_party/reactivex/operators/_merge.py | 0 .../third_party/reactivex/operators/_min.py | 0 .../third_party/reactivex/operators/_minby.py | 0 .../reactivex/operators/_multicast.py | 0 .../reactivex/operators/_observeon.py | 0 .../reactivex/operators/_onerrorresumenext.py | 0 .../reactivex/operators/_pairwise.py | 0 .../reactivex/operators/_partition.py | 0 .../third_party/reactivex/operators/_pluck.py | 0 .../reactivex/operators/_publish.py | 0 .../reactivex/operators/_publishvalue.py | 0 .../reactivex/operators/_reduce.py | 0 .../reactivex/operators/_repeat.py | 0 .../reactivex/operators/_replay.py | 0 .../third_party/reactivex/operators/_retry.py | 0 .../reactivex/operators/_sample.py | 0 .../third_party/reactivex/operators/_scan.py | 0 .../reactivex/operators/_sequenceequal.py | 0 .../reactivex/operators/_single.py | 0 .../reactivex/operators/_singleordefault.py | 0 .../third_party/reactivex/operators/_skip.py | 0 .../reactivex/operators/_skiplast.py | 0 .../reactivex/operators/_skiplastwithtime.py | 0 .../reactivex/operators/_skipuntil.py | 0 .../reactivex/operators/_skipuntilwithtime.py | 0 .../reactivex/operators/_skipwhile.py | 0 .../reactivex/operators/_skipwithtime.py | 0 .../third_party/reactivex/operators/_slice.py | 0 .../third_party/reactivex/operators/_some.py | 0 .../reactivex/operators/_startswith.py | 0 .../reactivex/operators/_subscribeon.py | 0 .../third_party/reactivex/operators/_sum.py | 0 .../reactivex/operators/_switchlatest.py | 0 .../third_party/reactivex/operators/_take.py | 0 .../reactivex/operators/_takelast.py | 0 .../reactivex/operators/_takelastbuffer.py | 0 .../reactivex/operators/_takelastwithtime.py | 0 .../reactivex/operators/_takeuntil.py | 0 .../reactivex/operators/_takeuntilwithtime.py | 0 .../reactivex/operators/_takewhile.py | 0 .../reactivex/operators/_takewithtime.py | 0 .../reactivex/operators/_throttlefirst.py | 0 .../reactivex/operators/_timeinterval.py | 0 .../reactivex/operators/_timeout.py | 0 .../reactivex/operators/_timeoutwithmapper.py | 0 .../reactivex/operators/_timestamp.py | 0 .../reactivex/operators/_todict.py | 0 .../reactivex/operators/_tofuture.py | 0 .../reactivex/operators/_toiterable.py | 0 .../reactivex/operators/_tomarbles.py | 0 .../third_party/reactivex/operators/_toset.py | 0 .../reactivex/operators/_whiledo.py | 0 .../reactivex/operators/_window.py | 0 .../reactivex/operators/_windowwithcount.py | 0 .../reactivex/operators/_windowwithtime.py | 0 .../operators/_windowwithtimeorcount.py | 0 .../reactivex/operators/_withlatestfrom.py | 0 .../third_party/reactivex/operators/_zip.py | 0 .../operators/connectable/__init__.py | 0 .../operators/connectable/_refcount.py | 0 .../third_party/reactivex/pipe.py | 0 .../third_party/reactivex/py.typed | 0 .../third_party/reactivex/run.py | 0 .../reactivex/scheduler/__init__.py | 0 .../reactivex/scheduler/catchscheduler.py | 0 .../scheduler/currentthreadscheduler.py | 0 .../reactivex/scheduler/eventloop/__init__.py | 0 .../scheduler/eventloop/asyncioscheduler.py | 0 .../eventloop/asynciothreadsafescheduler.py | 0 .../scheduler/eventloop/eventletscheduler.py | 0 .../scheduler/eventloop/geventscheduler.py | 0 .../scheduler/eventloop/ioloopscheduler.py | 0 .../scheduler/eventloop/twistedscheduler.py | 0 .../reactivex/scheduler/eventloopscheduler.py | 0 .../scheduler/historicalscheduler.py | 0 .../reactivex/scheduler/immediatescheduler.py | 0 .../reactivex/scheduler/mainloop/__init__.py | 0 .../scheduler/mainloop/gtkscheduler.py | 0 .../scheduler/mainloop/pygamescheduler.py | 0 .../scheduler/mainloop/qtscheduler.py | 0 .../scheduler/mainloop/tkinterscheduler.py | 0 .../scheduler/mainloop/wxscheduler.py | 0 .../reactivex/scheduler/newthreadscheduler.py | 0 .../reactivex/scheduler/periodicscheduler.py | 0 .../reactivex/scheduler/scheduleditem.py | 0 .../reactivex/scheduler/scheduler.py | 0 .../scheduler/threadpoolscheduler.py | 0 .../reactivex/scheduler/timeoutscheduler.py | 0 .../reactivex/scheduler/trampoline.py | 0 .../scheduler/trampolinescheduler.py | 0 .../scheduler/virtualtimescheduler.py | 0 .../third_party/reactivex/subject/__init__.py | 0 .../reactivex/subject/asyncsubject.py | 0 .../reactivex/subject/behaviorsubject.py | 0 .../reactivex/subject/innersubscription.py | 0 .../reactivex/subject/replaysubject.py | 0 .../third_party/reactivex/subject/subject.py | 0 .../third_party/reactivex/testing/__init__.py | 0 .../reactivex/testing/coldobservable.py | 0 .../reactivex/testing/hotobservable.py | 0 .../third_party/reactivex/testing/marbles.py | 0 .../reactivex/testing/mockdisposable.py | 0 .../reactivex/testing/mockobserver.py | 0 .../reactivex/testing/reactivetest.py | 0 .../third_party/reactivex/testing/recorded.py | 0 .../reactivex/testing/subscription.py | 0 .../reactivex/testing/testscheduler.py | 0 .../third_party/reactivex/typing.py | 0 {frogpilot => starpilot}/third_party/six.py | 0 .../third_party/timezonefinder/__init__.py | 0 .../timezonefinder/_numba_replacements.py | 0 .../third_party/timezonefinder/configs.py | 0 .../timezonefinder/coord_accessors.py | 0 .../data/boundaries/coordinates.fbs | Bin .../timezonefinder/data/boundaries/xmax.npy | Bin .../timezonefinder/data/boundaries/xmin.npy | Bin .../timezonefinder/data/boundaries/ymax.npy | Bin .../timezonefinder/data/boundaries/ymin.npy | Bin .../timezonefinder/data/hole_registry.json | 0 .../timezonefinder/data/holes/coordinates.fbs | Bin .../timezonefinder/data/holes/xmax.npy | Bin .../timezonefinder/data/holes/xmin.npy | Bin .../timezonefinder/data/holes/ymax.npy | Bin .../timezonefinder/data/holes/ymin.npy | Bin .../data/hybrid_shortcuts_uint16.fbs | Bin .../timezonefinder/data/timezone_names.txt | 0 .../timezonefinder/data/zone_ids.npy | Bin .../timezonefinder/data/zone_positions.npy | Bin .../timezonefinder/flatbuf/__init__.py | 0 .../flatbuf/generated/__init__.py | 0 .../flatbuf/generated/polygons/Polygon.py | 0 .../generated/polygons/PolygonCollection.py | 0 .../flatbuf/generated/polygons/__init__.py | 0 .../HybridShortcutCollection.py | 0 .../shortcuts_uint16/HybridShortcutEntry.py | 0 .../generated/shortcuts_uint16/PolygonList.py | 0 .../shortcuts_uint16/ShortcutValue.py | 0 .../generated/shortcuts_uint16/UniqueZone.py | 0 .../generated/shortcuts_uint16/__init__.py | 0 .../HybridShortcutCollection.py | 0 .../shortcuts_uint8/HybridShortcutEntry.py | 0 .../generated/shortcuts_uint8/PolygonList.py | 0 .../shortcuts_uint8/ShortcutValue.py | 0 .../generated/shortcuts_uint8/UniqueZone.py | 0 .../generated/shortcuts_uint8/__init__.py | 0 .../timezonefinder/flatbuf/io/__init__.py | 0 .../flatbuf/io/hybrid_shortcuts.py | 0 .../timezonefinder/flatbuf/io/polygons.py | 0 .../flatbuf/schemas/__init__.py | 0 .../timezonefinder/global_functions.py | 0 .../timezonefinder/np_binary_helpers.py | 0 .../timezonefinder/polygon_array.py | 0 .../timezonefinder/timezonefinder.py | 0 .../third_party/timezonefinder/utils.py | 0 .../third_party/timezonefinder/utils_clang.py | 0 .../third_party/timezonefinder/utils_numba.py | 0 .../third_party/timezonefinder/zone_names.py | 0 .../third_party/typing_extensions.py | 0 .../third_party/urllib3/__init__.py | 0 .../third_party/urllib3/_base_connection.py | 0 .../third_party/urllib3/_collections.py | 0 .../third_party/urllib3/_request_methods.py | 0 .../third_party/urllib3/_version.py | 0 .../third_party/urllib3/connection.py | 0 .../third_party/urllib3/connectionpool.py | 0 .../third_party/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/emscripten/__init__.py | 0 .../urllib3/contrib/emscripten/connection.py | 0 .../emscripten/emscripten_fetch_worker.js | 0 .../urllib3/contrib/emscripten/fetch.py | 0 .../urllib3/contrib/emscripten/request.py | 0 .../urllib3/contrib/emscripten/response.py | 0 .../third_party/urllib3/contrib/pyopenssl.py | 0 .../third_party/urllib3/contrib/socks.py | 0 .../third_party/urllib3/exceptions.py | 0 .../third_party/urllib3/fields.py | 0 .../third_party/urllib3/filepost.py | 0 .../third_party/urllib3/http2/__init__.py | 0 .../third_party/urllib3/http2/connection.py | 0 .../third_party/urllib3/http2/probe.py | 0 .../third_party/urllib3/poolmanager.py | 0 .../third_party/urllib3/py.typed | 0 .../third_party/urllib3/response.py | 0 .../third_party/urllib3/util/__init__.py | 0 .../third_party/urllib3/util/connection.py | 0 .../third_party/urllib3/util/proxy.py | 0 .../third_party/urllib3/util/request.py | 0 .../third_party/urllib3/util/response.py | 0 .../third_party/urllib3/util/retry.py | 0 .../third_party/urllib3/util/ssl_.py | 0 .../urllib3/util/ssl_match_hostname.py | 0 .../third_party/urllib3/util/ssltransport.py | 0 .../third_party/urllib3/util/timeout.py | 0 .../third_party/urllib3/util/url.py | 0 .../third_party/urllib3/util/util.py | 0 .../third_party/urllib3/util/wait.py | 0 .../werkzeug-3.1.3.dist-info/INSTALLER | 0 .../werkzeug-3.1.3.dist-info/LICENSE.txt | 0 .../werkzeug-3.1.3.dist-info/METADATA | 0 .../werkzeug-3.1.3.dist-info/RECORD | 0 .../werkzeug-3.1.3.dist-info/REQUESTED | 0 .../werkzeug-3.1.3.dist-info/WHEEL | 0 .../third_party/werkzeug/__init__.py | 0 .../third_party/werkzeug/_internal.py | 0 .../third_party/werkzeug/_reloader.py | 0 .../werkzeug/datastructures/__init__.py | 0 .../werkzeug/datastructures/accept.py | 0 .../werkzeug/datastructures/auth.py | 0 .../werkzeug/datastructures/cache_control.py | 0 .../werkzeug/datastructures/csp.py | 0 .../werkzeug/datastructures/etag.py | 0 .../werkzeug/datastructures/file_storage.py | 0 .../werkzeug/datastructures/headers.py | 0 .../werkzeug/datastructures/mixins.py | 0 .../werkzeug/datastructures/range.py | 0 .../werkzeug/datastructures/structures.py | 0 .../third_party/werkzeug/debug/__init__.py | 0 .../third_party/werkzeug/debug/console.py | 0 .../third_party/werkzeug/debug/repr.py | 0 .../werkzeug/debug/shared/ICON_LICENSE.md | 0 .../werkzeug/debug/shared/console.png | Bin .../werkzeug/debug/shared/debugger.js | 0 .../werkzeug/debug/shared/less.png | Bin .../werkzeug/debug/shared/more.png | Bin .../werkzeug/debug/shared/style.css | 0 .../third_party/werkzeug/debug/tbtools.py | 0 .../third_party/werkzeug/exceptions.py | 0 .../third_party/werkzeug/formparser.py | 0 .../third_party/werkzeug/http.py | 0 .../third_party/werkzeug/local.py | 0 .../werkzeug/middleware/__init__.py | 0 .../werkzeug/middleware/dispatcher.py | 0 .../werkzeug/middleware/http_proxy.py | 0 .../third_party/werkzeug/middleware/lint.py | 0 .../werkzeug/middleware/profiler.py | 0 .../werkzeug/middleware/proxy_fix.py | 0 .../werkzeug/middleware/shared_data.py | 0 .../third_party/werkzeug/py.typed | 0 .../third_party/werkzeug/routing/__init__.py | 0 .../werkzeug/routing/converters.py | 0 .../werkzeug/routing/exceptions.py | 0 .../third_party/werkzeug/routing/map.py | 0 .../third_party/werkzeug/routing/matcher.py | 0 .../third_party/werkzeug/routing/rules.py | 0 .../third_party/werkzeug/sansio/__init__.py | 0 .../third_party/werkzeug/sansio/http.py | 0 .../third_party/werkzeug/sansio/multipart.py | 0 .../third_party/werkzeug/sansio/request.py | 0 .../third_party/werkzeug/sansio/response.py | 0 .../third_party/werkzeug/sansio/utils.py | 0 .../third_party/werkzeug/security.py | 0 .../third_party/werkzeug/serving.py | 0 .../third_party/werkzeug/test.py | 0 .../third_party/werkzeug/testapp.py | 0 .../third_party/werkzeug/urls.py | 0 .../third_party/werkzeug/user_agent.py | 0 .../third_party/werkzeug/utils.py | 0 .../third_party/werkzeug/wrappers/__init__.py | 0 .../third_party/werkzeug/wrappers/request.py | 0 .../third_party/werkzeug/wrappers/response.py | 0 .../third_party/werkzeug/wsgi.py | 0 .../tinygrad_modeld/__init__.py | 0 .../tinygrad_modeld/constants.py | 0 .../tinygrad_modeld/dmonitoringmodeld.py | 2 +- .../tinygrad_modeld/fill_model_msg.py | 2 +- .../tinygrad_modeld/get_model_metadata.py | 0 .../tinygrad_modeld/models/README.md | 0 .../tinygrad_modeld/models/__init__.py | 0 .../models/big_driving_policy.onnx | 0 .../models/big_driving_vision.onnx | 0 .../tinygrad_modeld/models/commonmodel.cc | 0 .../tinygrad_modeld/models/commonmodel.h | 0 .../tinygrad_modeld/models/commonmodel.pxd | 0 .../models/commonmodel_pyx.cpp | 0 .../models/commonmodel_pyx.pxd | 0 .../models/commonmodel_pyx.pyx | 0 .../models/dm_warp_1344x760_tinygrad.pkl | Bin .../models/dm_warp_1928x1208_tinygrad.pkl | Bin .../models/dmonitoring_model.onnx | Bin .../models/dmonitoring_model_metadata.pkl | Bin .../models/driving_policy.onnx | Bin .../models/driving_policy_metadata.pkl | Bin .../models/driving_vision.onnx | Bin .../models/driving_vision_metadata.pkl | Bin .../models/warp_1344x760_tinygrad.pkl | Bin .../models/warp_1928x1208_tinygrad.pkl | Bin .../tinygrad_modeld/parse_model_outputs.py | 2 +- .../runners/tinygrad_helpers.py | 0 .../tinygrad_modeld/tinygrad_modeld.py | 44 +-- .../tinygrad_modeld/transforms/loadyuv.cc | 2 +- .../tinygrad_modeld/transforms/loadyuv.cl | 0 .../tinygrad_modeld/transforms/loadyuv.h | 0 .../tinygrad_modeld/transforms/transform.cc | 2 +- .../tinygrad_modeld/transforms/transform.cl | 0 .../tinygrad_modeld/transforms/transform.h | 0 .../tools/compile_models.py | 12 +- .../ui/moc_starpilot_ui.cc | 42 +- .../ui/qt/offroad/data_settings.cc | 134 +++---- starpilot/ui/qt/offroad/data_settings.h | 23 ++ .../ui/qt/offroad/device_settings.cc | 64 +-- .../ui/qt/offroad/device_settings.h | 8 +- .../offroad/expandable_multi_option_dialog.cc | 4 +- .../offroad/expandable_multi_option_dialog.h | 0 .../ui/qt/offroad/lateral_settings.cc | 130 +++--- .../ui/qt/offroad/lateral_settings.h | 18 +- .../ui/qt/offroad/longitudinal_settings.cc | 322 +++++++-------- .../ui/qt/offroad/longitudinal_settings.h | 22 +- .../ui/qt/offroad/maps_settings.cc | 50 +-- .../ui/qt/offroad/maps_settings.h | 14 +- .../ui/qt/offroad/moc_data_settings.cc | 42 +- .../ui/qt/offroad/moc_device_settings.cc | 42 +- .../moc_expandable_multi_option_dialog.cc | 0 .../ui/qt/offroad/moc_lateral_settings.cc | 42 +- .../qt/offroad/moc_longitudinal_settings.cc | 54 +-- .../ui/qt/offroad/moc_maps_settings.cc | 42 +- .../ui/qt/offroad/moc_model_settings.cc | 42 +- .../ui/qt/offroad/moc_navigation_settings.cc | 48 +-- .../ui/qt/offroad/moc_sounds_settings.cc | 42 +- .../ui/qt/offroad/moc_starpilot_settings.cc | 90 ++--- .../ui/qt/offroad/moc_theme_settings.cc | 42 +- .../ui/qt/offroad/moc_utilities.cc | 34 +- .../ui/qt/offroad/moc_vehicle_settings.cc | 42 +- .../ui/qt/offroad/moc_visual_settings.cc | 48 +-- .../ui/qt/offroad/moc_wheel_settings.cc | 34 +- .../ui/qt/offroad/model_settings.cc | 96 ++--- .../ui/qt/offroad/model_settings.h | 20 +- .../ui/qt/offroad/navigation_settings.cc | 80 ++-- .../ui/qt/offroad/navigation_settings.h | 16 +- .../ui/qt/offroad/sounds_settings.cc | 54 +-- .../ui/qt/offroad/sounds_settings.h | 8 +- .../ui/qt/offroad/starpilot_settings.cc | 216 +++++----- .../ui/qt/offroad/starpilot_settings.h | 28 +- .../ui/qt/offroad/theme_settings.cc | 106 ++--- .../ui/qt/offroad/theme_settings.h | 24 +- starpilot/ui/qt/offroad/utilities.cc | 192 +++++++++ starpilot/ui/qt/offroad/utilities.h | 25 ++ .../ui/qt/offroad/vehicle_settings.cc | 62 +-- .../ui/qt/offroad/vehicle_settings.h | 8 +- .../ui/qt/offroad/visual_settings.cc | 82 ++-- .../ui/qt/offroad/visual_settings.h | 8 +- .../ui/qt/offroad/wheel_settings.cc | 18 +- .../ui/qt/offroad/wheel_settings.h | 8 +- .../onroad/moc_starpilot_annotated_camera.cc | 34 +- .../ui/qt/onroad/moc_starpilot_buttons.cc | 6 +- .../ui/qt/onroad/moc_starpilot_onroad.cc | 34 +- .../qt/onroad/starpilot_annotated_camera.cc | 256 ++++++------ .../ui/qt/onroad/starpilot_annotated_camera.h | 12 +- .../ui/qt/onroad/starpilot_buttons.cc | 18 +- .../ui/qt/onroad/starpilot_buttons.h | 2 +- .../ui/qt/onroad/starpilot_onroad.cc | 24 +- .../ui/qt/onroad/starpilot_onroad.h | 10 +- .../ui/qt/widgets/developer_sidebar.cc | 36 +- .../ui/qt/widgets/developer_sidebar.h | 2 +- .../ui/qt/widgets/drive_stats.cc | 22 +- .../ui/qt/widgets/drive_stats.h | 4 +- .../ui/qt/widgets/drive_summary.cc | 18 +- .../ui/qt/widgets/drive_summary.h | 4 +- .../ui/qt/widgets/moc_developer_sidebar.cc | 0 .../ui/qt/widgets/moc_drive_stats.cc | 0 .../ui/qt/widgets/moc_drive_summary.cc | 36 +- .../ui/qt/widgets/moc_navigation_functions.cc | 0 .../ui/qt/widgets/moc_starpilot_controls.cc | 316 +++++++-------- .../ui/qt/widgets/navigation_functions.cc | 2 +- .../ui/qt/widgets/navigation_functions.h | 2 +- .../ui/qt/widgets/starpilot_controls.cc | 10 +- .../ui/qt/widgets/starpilot_controls.h | 62 +-- .../ui/screenrecorder/blocking_queue.h | 0 .../ui/screenrecorder/moc_screenrecorder.cc | 0 .../ui/screenrecorder/omx_encoder.cc | 2 +- .../ui/screenrecorder/omx_encoder.h | 0 .../openmax/include/OMX_Audio.h | 0 .../openmax/include/OMX_Component.h | 0 .../openmax/include/OMX_ContentPipe.h | 0 .../screenrecorder/openmax/include/OMX_Core.h | 0 .../openmax/include/OMX_CoreExt.h | 0 .../openmax/include/OMX_IVCommon.h | 0 .../openmax/include/OMX_Image.h | 0 .../openmax/include/OMX_Index.h | 0 .../openmax/include/OMX_IndexExt.h | 0 .../openmax/include/OMX_Other.h | 0 .../openmax/include/OMX_QCOMExtns.h | 0 .../include/OMX_Skype_VideoExtensions.h | 0 .../openmax/include/OMX_Types.h | 0 .../openmax/include/OMX_Video.h | 0 .../openmax/include/OMX_VideoExt.h | 0 .../ui/screenrecorder/screenrecorder.cc | 2 +- .../ui/screenrecorder/screenrecorder.h | 0 .../ui/starpilot_ui.cc | 58 +-- .../ui/starpilot_ui.h | 16 +- system/athena/athenad.py | 2 +- system/camerad/camerad | Bin 807208 -> 807208 bytes system/hardware/hardwared.py | 36 +- system/hardware/hw.h | 2 +- system/hardware/power_monitoring.py | 6 +- system/hardware/tici/updater | 2 +- system/loggerd/bootlog | Bin 550264 -> 550264 bytes system/loggerd/config.py | 2 +- system/loggerd/encoderd | Bin 789344 -> 789344 bytes system/loggerd/loggerd | Bin 716552 -> 716552 bytes system/manager/manager.py | 263 +++++++++++-- system/manager/process.py | 6 +- system/manager/process_config.py | 58 +-- system/sentry.py | 6 +- system/timed.py | 6 +- system/ui/lib/application.py | 6 +- system/ui/spinner.py | 2 +- system/ui/widgets/selection_dialog.py | 2 +- system/updated/updated.py | 12 +- system/version.py | 4 +- tools/StarPilot/derive_feasible_params.py | 6 +- tools/StarPilot/feasibleparams.txt | 2 +- tools/StarPilot/generate_pond_layout.py | 24 +- tools/agnos/patch_system_reset_image.py | 2 +- tools/lib/api.py | 2 +- tools/lib/auth.py | 2 +- tools/scripts/fetch_image_from_route.py | 2 +- 1943 files changed, 4675 insertions(+), 4661 deletions(-) rename .github/workflows/{compile_frogpilot.yaml => compile_starpilot.yaml} (90%) delete mode 100644 frogpilot/controls/frogpilot_planner.py delete mode 100644 frogpilot/system/frogpilot_tracking.py delete mode 100644 frogpilot/ui/qt/offroad/data_settings.h delete mode 100644 frogpilot/ui/qt/offroad/utilities.cc delete mode 100644 frogpilot/ui/qt/offroad/utilities.h delete mode 120000 openpilot/frogpilot create mode 120000 openpilot/starpilot rename {frogpilot => starpilot}/assets/active_theme/colors (100%) rename {frogpilot => starpilot}/assets/active_theme/distance_icons (100%) rename {frogpilot => starpilot}/assets/active_theme/icons (100%) rename {frogpilot => starpilot}/assets/active_theme/signals (100%) rename {frogpilot => starpilot}/assets/active_theme/sounds (100%) rename {frogpilot => starpilot}/assets/download_functions.py (98%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/icons/button_flag.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/april_fools/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/sounds/startup.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/christmas_week/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/easter_week/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/sounds/startup.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/sounds/prompt.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/halloween_week/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/sounds/startup.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/new_years/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/icons/button_flag.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/st_patricks_day/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/sounds/startup.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/stitch_day/steering_wheel/wheel.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/distance_icons/aggressive.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/distance_icons/relaxed.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/distance_icons/standard.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/distance_icons/traffic.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/icons/button_flag.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/valentines_day/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/distance_icons/standard.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/icons/button_flag.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/icons/button_settings.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/traditional_125 (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/sounds/disengage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/sounds/engage.wav (100%) rename {frogpilot => starpilot}/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/model_manager.py (98%) rename {frogpilot => starpilot}/assets/nnff_models/ACURA_RDX_3G.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/AUDI_A3_MK3.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/AUDI_Q3_MK2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/BUICK_LACROSSE.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_BOLT_EUV.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_EQUINOX.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_EQUINOX_CC.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_SILVERADO.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_SUBURBAN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_SUBURBAN_CC.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_TRAILBLAZER.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHEVROLET_VOLT.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHRYSLER_PACIFICA_2017_HYBRID.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHRYSLER_PACIFICA_2018_HYBRID.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHRYSLER_PACIFICA_2019_HYBRID.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/CHRYSLER_PACIFICA_2020.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/GENESIS_G70.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/GENESIS_GV60_EV_1ST_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/GENESIS_GV70_1ST_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/GMC_ACADIA.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_ACCORD.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_CIVIC.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_CIVIC_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_CIVIC_BOSCH.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_CLARITY.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_CRV_5G.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_CRV_HYBRID.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_HRV.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_INSIGHT.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_ODYSSEY.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_PILOT.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HONDA_RIDGELINE.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_ELANTRA_2021.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_ELANTRA_HEV_2021.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_GENESIS.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_IONIQ_5.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_IONIQ_EV_LTD.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_IONIQ_PHEV.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_KONA_EV.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_KONA_EV_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_KONA_HEV.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_PALISADE.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SANTA_FE.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SANTA_FE_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SANTA_FE_HEV_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SANTA_FE_PHEV_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SONATA.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SONATA_HYBRID.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_SONATA_LF.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/HYUNDAI_TUCSON_4TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/JEEP_GRAND_CHEROKEE.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/JEEP_GRAND_CHEROKEE_2019.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_CEED.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_EV6.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_K5_2021.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_NIRO_EV.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_NIRO_HEV_2021.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_NIRO_HEV_2ND_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_NIRO_PHEV_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_OPTIMA_G4_FL.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_SELTOS.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_SORENTO.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_SORENTO_4TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_SORENTO_HEV_4TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_SPORTAGE_5TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_STINGER.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/KIA_STINGER_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/LEXUS_ES_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/LEXUS_IS.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/LEXUS_NX.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/LEXUS_NX_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/LEXUS_RX.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/LEXUS_RX_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/MAZDA_3.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/MAZDA_CX5_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/MAZDA_CX9.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/MAZDA_CX9_2021.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/RAM_1500_5TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/RAM_HD_5TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SKODA_KAROQ_MK1.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SKODA_KODIAQ_MK1.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SKODA_OCTAVIA_MK3.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SKODA_SUPERB_MK3.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_ASCENT.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_FORESTER.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_IMPREZA.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_IMPREZA_2020.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_LEGACY.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_LEGACY_PREGLOBAL.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_OUTBACK.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/SUBARU_OUTBACK_PREGLOBAL.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_AVALON.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_AVALON_2019.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_AVALON_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_CAMRY.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_CAMRY_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_CHR.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_CHR_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_COROLLA.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_COROLLA_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_HIGHLANDER.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_HIGHLANDER_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_MIRAI.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_PRIUS.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_PRIUS_2017_b'8965B47070x00x00x00x00x00x00'.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_PRIUS_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_PRIUS_V.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_RAV4.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_RAV4H.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_RAV4_PRIME.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_RAV4_TSS2.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_RAV4_TSS2_2022.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_SIENNA.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/TOYOTA_SIENNA_4TH_GEN.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_ARTEON_MK1.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_ATLAS_MK1.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_GOLF_MK7.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_JETTA_MK7.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_PASSAT_MK8.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_PASSAT_NMS.json (100%) rename {frogpilot => starpilot}/assets/nnff_models/VOLKSWAGEN_TIGUAN_MK2.json (100%) rename {frogpilot => starpilot}/assets/other_images/brake_pedal.png (100%) rename {frogpilot => starpilot}/assets/other_images/chill_mode_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/curve_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/curve_speed.png (100%) rename {frogpilot => starpilot}/assets/other_images/dashboard_icon.png (100%) rename {frogpilot => starpilot}/assets/other_images/experimental_mode_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/gas_pedal.png (100%) rename {frogpilot => starpilot}/assets/other_images/lead_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/light_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/mapbox_icon.png (100%) rename {frogpilot => starpilot}/assets/other_images/next_maps_icon.png (100%) rename {frogpilot => starpilot}/assets/other_images/offline_maps_icon.png (100%) rename {frogpilot => starpilot}/assets/other_images/paused_icon.png (100%) rename {frogpilot => starpilot}/assets/other_images/speed_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/speed_icon.png (100%) rename frogpilot/assets/other_images/frogpilot_boot_logo.jpg => starpilot/assets/other_images/starpilot_boot_logo.jpg (100%) rename {frogpilot => starpilot}/assets/other_images/stock_bg.jpg (100%) rename {frogpilot => starpilot}/assets/other_images/stop_sign.png (100%) rename {frogpilot => starpilot}/assets/other_images/turn_icon.gif (100%) rename {frogpilot => starpilot}/assets/other_images/turn_icon.png (100%) rename {frogpilot => starpilot}/assets/other_images/weather_clear_day.gif (100%) rename {frogpilot => starpilot}/assets/other_images/weather_clear_night.gif (100%) rename {frogpilot => starpilot}/assets/other_images/weather_low_visibility.gif (100%) rename {frogpilot => starpilot}/assets/other_images/weather_rain.gif (100%) rename {frogpilot => starpilot}/assets/other_images/weather_snow.gif (100%) rename {frogpilot => starpilot}/assets/random_events/icons/button_home.gif (100%) rename {frogpilot => starpilot}/assets/random_events/icons/ferg.png (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/angry.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/continued.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/dejaVu.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/doc.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/fart.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/firefox.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/goat.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/hal9000.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/mail.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/nessie.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/noice.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/this_is_fine.wav (100%) rename {frogpilot => starpilot}/assets/random_events/sounds/uwu.wav (100%) rename {frogpilot => starpilot}/assets/random_events/steering_wheels/accel30.gif (100%) rename {frogpilot => starpilot}/assets/random_events/steering_wheels/accel35.gif (100%) rename {frogpilot => starpilot}/assets/random_events/steering_wheels/accel40.gif (100%) rename {frogpilot => starpilot}/assets/random_events/steering_wheels/firefoxSteerSaturated.gif (100%) rename {frogpilot => starpilot}/assets/random_events/steering_wheels/goatSteerSaturated.gif (100%) rename {frogpilot => starpilot}/assets/random_events/steering_wheels/thisIsFineSteerSaturated.gif (100%) rename {frogpilot => starpilot}/assets/stock_theme/colors/colors.json (100%) rename {frogpilot => starpilot}/assets/stock_theme/distance_icons/aggressive.png (100%) rename {frogpilot => starpilot}/assets/stock_theme/distance_icons/relaxed.png (100%) rename {frogpilot => starpilot}/assets/stock_theme/distance_icons/standard.png (100%) rename {frogpilot => starpilot}/assets/stock_theme/distance_icons/traffic.png (100%) rename {frogpilot => starpilot}/assets/stock_theme/icons (100%) rename {frogpilot => starpilot}/assets/stock_theme/sounds (100%) rename {frogpilot => starpilot}/assets/stock_theme/steering_wheel/wheel.png (100%) rename {frogpilot => starpilot}/assets/theme_manager.py (93%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_advanced_device.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_advanced_lateral_tune.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_advanced_longitudinal_tune.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_always_on_lateral.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_calendar.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_conditional.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_device.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_display.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_frog.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_green_light.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_lane.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_lateral_tune.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_light.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_longitudinal_tune.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_map.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_message.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_mute.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_navigate.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_personality.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_quality_of_life.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_rainbow.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_random.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_random_themes.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_road.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_sound.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_speed_limit.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_speed_map.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_steering.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_system.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_tuning.png (100%) rename {frogpilot => starpilot}/assets/toggle_icons/icon_vehicle.png (100%) rename frogpilot/common/frogpilot_backups.py => starpilot/common/starpilot_backups.py (87%) rename frogpilot/common/frogpilot_download_utilities.py => starpilot/common/starpilot_download_utilities.py (97%) rename frogpilot/common/frogpilot_functions.py => starpilot/common/starpilot_functions.py (73%) rename frogpilot/common/frogpilot_utilities.py => starpilot/common/starpilot_utilities.py (94%) rename frogpilot/common/frogpilot_variables.py => starpilot/common/starpilot_variables.py (95%) rename {frogpilot => starpilot}/common/testing_grounds.py (100%) rename {frogpilot => starpilot}/controls/lib/conditional_experimental_mode.py (75%) rename {frogpilot => starpilot}/controls/lib/curve_speed_controller.py (76%) rename {frogpilot => starpilot}/controls/lib/neural_network_feedforward.py (98%) rename {frogpilot => starpilot}/controls/lib/speed_limit_controller.py (81%) rename frogpilot/controls/lib/frogpilot_acceleration.py => starpilot/controls/lib/starpilot_acceleration.py (79%) rename frogpilot/controls/lib/frogpilot_events.py => starpilot/controls/lib/starpilot_events.py (53%) rename frogpilot/controls/lib/frogpilot_following.py => starpilot/controls/lib/starpilot_following.py (56%) rename frogpilot/controls/lib/frogpilot_vcruise.py => starpilot/controls/lib/starpilot_vcruise.py (70%) rename {frogpilot => starpilot}/controls/lib/weather_checker.py (76%) rename frogpilot/controls/frogpilot_card.py => starpilot/controls/starpilot_card.py (60%) create mode 100644 starpilot/controls/starpilot_planner.py rename {frogpilot => starpilot}/navigation/mapd (100%) rename {frogpilot => starpilot}/navigation/mapd_wrapper.py (98%) rename {frogpilot => starpilot}/navigation/test_mapd_wrapper.py (91%) rename frogpilot/frogpilot_process.py => starpilot/starpilot_process.py (62%) rename {frogpilot => starpilot}/system/device_syncd.py (83%) rename {frogpilot => starpilot}/system/environment_variables (100%) rename {frogpilot => starpilot}/system/environment_variables.backup (100%) rename {frogpilot => starpilot}/system/galaxy/bin/frpc_darwin_amd64 (100%) rename {frogpilot => starpilot}/system/galaxy/bin/frpc_darwin_arm64 (100%) rename {frogpilot => starpilot}/system/galaxy/bin/frpc_linux_amd64 (100%) rename {frogpilot => starpilot}/system/galaxy/bin/frpc_linux_arm64 (100%) rename {frogpilot => starpilot}/system/galaxy/galaxy.py (99%) rename {frogpilot => starpilot}/system/speed_limit_filler.py (97%) rename frogpilot/system/frogpilot_stats.py => starpilot/system/starpilot_stats.py (78%) create mode 100644 starpilot/system/starpilot_tracking.py rename {frogpilot => starpilot}/system/the_pond/README.md (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/home/home.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/home/home.js (98%) rename {frogpilot => starpilot}/system/the_pond/assets/components/main.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/modal.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/modal.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/navigation/navigation_destination.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/navigation/navigation_destination.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/navigation/navigation_keys.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/navigation/navigation_keys.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/navigation/navigation_utilities.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/recordings/dashcam_routes.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/recordings/dashcam_routes.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/recordings/screen_recordings.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/recordings/screen_recordings.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/router.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/settings.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/settings.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/sidebar.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/sidebar.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tailscale/tailscale.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tailscale/tailscale.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/device_settings.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/device_settings.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/device_settings_layout.json (99%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/doors.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/doors.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/error_logs.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/error_logs.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/galaxy.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/galaxy.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/longitudinal_maneuvers.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/longitudinal_maneuvers.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/model_manager.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/model_manager.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/plots.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/plots.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/speed_limits.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/speed_limits.js (94%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/testing_ground.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/testing_ground.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/theme_maker.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/theme_maker.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/tmux.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/tmux.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/toggles.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/toggles.js (99%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/troubleshoot.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/troubleshoot.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/tsk_manager.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/tsk_manager.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/update_manager.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/update_manager.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/components/tools/vehicle_features.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/about.txt (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/android-chrome-192x192.png (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/android-chrome-512x512.png (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/apple-touch-icon.png (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/favicon-16x16.png (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/favicon-32x32.png (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/favicon.ico (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/favicon.svg (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/main_logo.png (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/safari-pinned-tab.svg (100%) rename {frogpilot => starpilot}/system/the_pond/assets/images/site.webmanifest (100%) rename {frogpilot => starpilot}/system/the_pond/assets/js/snackbar.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/js/utils.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/manifest.json (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/arrow-core.js (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/bootstrap-icons/bootstrap-icons.min.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/font-awesome/css/font-awesome.min.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/fonts/Inter-Bold.ttf (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/fonts/Inter-Regular.ttf (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/fonts/fonts.css (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/fonts/password.ttf (100%) rename {frogpilot => starpilot}/system/the_pond/assets/vendor/remix-router-1.3.1.js (100%) rename {frogpilot => starpilot}/system/the_pond/templates/index.html (100%) rename {frogpilot => starpilot}/system/the_pond/the_pond.py (99%) rename {frogpilot => starpilot}/system/the_pond/utilities.py (98%) rename {frogpilot => starpilot}/third_party/blinker-1.9.0.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/blinker-1.9.0.dist-info/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/blinker-1.9.0.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/blinker-1.9.0.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/blinker-1.9.0.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/blinker-1.9.0.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/blinker/__init__.py (100%) rename {frogpilot => starpilot}/third_party/blinker/_utilities.py (100%) rename {frogpilot => starpilot}/third_party/blinker/base.py (100%) rename {frogpilot => starpilot}/third_party/blinker/py.typed (100%) rename {frogpilot => starpilot}/third_party/certifi/__init__.py (100%) rename {frogpilot => starpilot}/third_party/certifi/__main__.py (100%) rename {frogpilot => starpilot}/third_party/certifi/cacert.pem (100%) rename {frogpilot => starpilot}/third_party/certifi/core.py (100%) rename {frogpilot => starpilot}/third_party/certifi/py.typed (100%) rename {frogpilot => starpilot}/third_party/click-8.3.1.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/click-8.3.1.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/click-8.3.1.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/click-8.3.1.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/click-8.3.1.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/click-8.3.1.dist-info/licenses/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/click/__init__.py (100%) rename {frogpilot => starpilot}/third_party/click/_compat.py (100%) rename {frogpilot => starpilot}/third_party/click/_termui_impl.py (100%) rename {frogpilot => starpilot}/third_party/click/_textwrap.py (100%) rename {frogpilot => starpilot}/third_party/click/_utils.py (100%) rename {frogpilot => starpilot}/third_party/click/_winconsole.py (100%) rename {frogpilot => starpilot}/third_party/click/core.py (100%) rename {frogpilot => starpilot}/third_party/click/decorators.py (100%) rename {frogpilot => starpilot}/third_party/click/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/click/formatting.py (100%) rename {frogpilot => starpilot}/third_party/click/globals.py (100%) rename {frogpilot => starpilot}/third_party/click/parser.py (100%) rename {frogpilot => starpilot}/third_party/click/py.typed (100%) rename {frogpilot => starpilot}/third_party/click/shell_completion.py (100%) rename {frogpilot => starpilot}/third_party/click/termui.py (100%) rename {frogpilot => starpilot}/third_party/click/testing.py (100%) rename {frogpilot => starpilot}/third_party/click/types.py (100%) rename {frogpilot => starpilot}/third_party/click/utils.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/__init__.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/_common.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/_version.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/easter.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/parser/__init__.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/parser/_parser.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/parser/isoparser.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/relativedelta.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/rrule.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/tz/__init__.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/tz/_common.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/tz/_factories.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/tz/tz.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/tz/win.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/tzwin.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/utils.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/zoneinfo/__init__.py (100%) rename {frogpilot => starpilot}/third_party/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz (100%) rename {frogpilot => starpilot}/third_party/dateutil/zoneinfo/rebuild.py (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/entry_points.txt (100%) rename {frogpilot => starpilot}/third_party/flask-3.1.3.dist-info/licenses/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/flask/__init__.py (100%) rename {frogpilot => starpilot}/third_party/flask/__main__.py (100%) rename {frogpilot => starpilot}/third_party/flask/app.py (100%) rename {frogpilot => starpilot}/third_party/flask/blueprints.py (100%) rename {frogpilot => starpilot}/third_party/flask/cli.py (100%) rename {frogpilot => starpilot}/third_party/flask/config.py (100%) rename {frogpilot => starpilot}/third_party/flask/ctx.py (100%) rename {frogpilot => starpilot}/third_party/flask/debughelpers.py (100%) rename {frogpilot => starpilot}/third_party/flask/globals.py (100%) rename {frogpilot => starpilot}/third_party/flask/helpers.py (100%) rename {frogpilot => starpilot}/third_party/flask/json/__init__.py (100%) rename {frogpilot => starpilot}/third_party/flask/json/provider.py (100%) rename {frogpilot => starpilot}/third_party/flask/json/tag.py (100%) rename {frogpilot => starpilot}/third_party/flask/logging.py (100%) rename {frogpilot => starpilot}/third_party/flask/py.typed (100%) rename {frogpilot => starpilot}/third_party/flask/sansio/README.md (100%) rename {frogpilot => starpilot}/third_party/flask/sansio/app.py (100%) rename {frogpilot => starpilot}/third_party/flask/sansio/blueprints.py (100%) rename {frogpilot => starpilot}/third_party/flask/sansio/scaffold.py (100%) rename {frogpilot => starpilot}/third_party/flask/sessions.py (100%) rename {frogpilot => starpilot}/third_party/flask/signals.py (100%) rename {frogpilot => starpilot}/third_party/flask/templating.py (100%) rename {frogpilot => starpilot}/third_party/flask/testing.py (100%) rename {frogpilot => starpilot}/third_party/flask/typing.py (100%) rename {frogpilot => starpilot}/third_party/flask/views.py (100%) rename {frogpilot => starpilot}/third_party/flask/wrappers.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/__init__.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/_version.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/builder.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/compat.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/encode.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/number_types.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/packer.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/table.py (100%) rename {frogpilot => starpilot}/third_party/flatbuffers/util.py (100%) rename {frogpilot => starpilot}/third_party/h3/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/cells.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/edges.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/error_system.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/latlng.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/memory.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/to_multipoly.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/util.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_cy/vertex.cpython-312-aarch64-linux-gnu.so (100%) rename {frogpilot => starpilot}/third_party/h3/_h3shape.py (100%) rename {frogpilot => starpilot}/third_party/h3/_version.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/basic_int/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/basic_int/_convert.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/basic_str/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/basic_str/_convert.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/memview_int/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/memview_int/_convert.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/numpy_int/__init__.py (100%) rename {frogpilot => starpilot}/third_party/h3/api/numpy_int/_convert.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/_async/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/_async/api_client.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/_async/rest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/_sync/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/_sync/api_client.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/_sync/rest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/_pages.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/authorizations_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/bucket_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/delete_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/delete_api_async.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/flux_csv_parser.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/flux_table.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/influxdb_client.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/influxdb_client_async.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/invokable_scripts_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/labels_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/logging_handler.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/organizations_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/query_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/query_api_async.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/tasks_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/users_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/util/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/util/date_utils.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/util/date_utils_pandas.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/util/helpers.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/util/multiprocessing_helper.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/warnings.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/write/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/write/dataframe_serializer.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/write/point.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/write/retry.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/write_api.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/client/write_api_async.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/configuration.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/add_resource_member_request_body.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/analyze_query_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/analyze_query_response_errors.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/array_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/ast_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/authorization.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/authorization_post_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/authorization_update_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/authorizations.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/axes.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/axis.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/axis_scale.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/bad_statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/band_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/binary_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/block.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/boolean_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/bucket.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/bucket_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/bucket_metadata_manifest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/bucket_retention_rules.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/bucket_shard_mapping.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/buckets.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/builder_aggregate_function_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/builder_config.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/builder_config_aggregate_window.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/builder_functions_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/builder_tags_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/builtin_statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/call_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/cell.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/cell_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/cell_update.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/cell_with_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check_base_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check_discriminator.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check_patch.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check_status_level.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/check_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/checks.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/column_data_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/column_semantic_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/conditional_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/config.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/constant_variable_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/create_cell.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/create_dashboard_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/custom_check.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dashboard.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dashboard_color.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dashboard_query.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dashboard_with_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dashboards.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/date_time_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dbr_ps.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dbrp.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dbrp_create.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dbrp_get.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dbrp_update.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/deadman_check.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/decimal_places.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/delete_predicate_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dialect.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dict_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/dict_item.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/duration.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/duration_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/error.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/expression_statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/field.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/file.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/float_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/flux_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/flux_suggestion.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/flux_suggestions.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/function_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/gauge_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/greater_threshold.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/health_check.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/heatmap_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/histogram_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/http_notification_endpoint.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/http_notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/http_notification_rule_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/identifier.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/import_declaration.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/index_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/integer_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/is_onboarding.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/label.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/label_create_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/label_mapping.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/label_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/label_update.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/labels_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/language_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/legacy_authorization_post_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/lesser_threshold.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/line_plus_single_stat_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/line_protocol_error.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/line_protocol_length_error.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/list_stacks_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/log_event.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/logical_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/logs.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/map_variable_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/markdown_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/measurement_schema.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/measurement_schema_column.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/measurement_schema_create_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/measurement_schema_list.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/measurement_schema_update_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/member_assignment.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/member_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/metadata_backup.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/model_property.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/mosaic_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/node.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoint.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoint_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoint_base_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoint_discriminator.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoint_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoint_update.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_endpoints.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_rule_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_rule_base_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_rule_discriminator.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_rule_update.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/notification_rules.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/object_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/onboarding_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/onboarding_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/option_statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/organization.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/organization_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/organizations.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/package.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/package_clause.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/pager_duty_notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/paren_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/password_reset_body.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/patch_bucket_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/patch_dashboard_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/patch_organization_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/patch_retention_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/patch_stack_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/permission.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/permission_resource.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/pipe_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/pipe_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_bucket_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_check.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_notification_endpoint.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_organization_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_restore_kv_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/post_stack_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/property_key.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/query.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/query_edit_mode.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/query_variable_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/query_variable_properties_values.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/range_threshold.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/ready.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/regexp_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/remote_connection.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/remote_connection_creation_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/remote_connection_update_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/remote_connections.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/renamable_field.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/replication.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/replication_creation_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/replication_update_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/replications.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/resource_member.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/resource_members.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/resource_members_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/resource_owner.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/resource_owners.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/restored_bucket_mappings.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/retention_policy_manifest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/return_statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/routes.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/routes_external.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/routes_query.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/routes_system.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/rule_status_level.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/run.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/run_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/run_manually.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/runs.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/scatter_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/schema_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/scraper_target_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/scraper_target_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/scraper_target_responses.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/script.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/script_create_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/script_invocation_params.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/script_language.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/script_update_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/scripts.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/secret_keys.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/secret_keys_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/shard_group_manifest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/shard_manifest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/shard_owner.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/simple_table_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/single_stat_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/slack_notification_endpoint.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/slack_notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/slack_notification_rule_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/smtp_notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/smtp_notification_rule_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/source.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/source_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/sources.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/stack.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/stack_associations.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/stack_events.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/stack_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/stack_resources.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/static_legend.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/status_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/string_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/subscription_manifest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/table_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/table_view_properties_table_options.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/tag_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/task.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/task_create_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/task_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/task_status_type.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/task_update_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/tasks.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf_plugin.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf_plugin_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf_plugins.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf_request.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegraf_request_metadata.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegrafs.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegram_notification_endpoint.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegram_notification_rule.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/telegram_notification_rule_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_apply.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_apply_remotes.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_apply_template.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_chart.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_export_by_id.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_export_by_id_org_ids.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_export_by_id_resources.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_export_by_name.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_export_by_name_resources.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_kind.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_buckets.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_checks.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_dashboards.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_labels.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_tasks.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_variables.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_errors.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_label.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_label_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_buckets.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_dashboards.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_status_rules.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_tasks.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/template_summary_summary_variables.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/test_statement.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/threshold.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/threshold_base.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/threshold_check.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/unary_expression.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/unsigned_integer_literal.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/user.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/user_response.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/user_response_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/users.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/variable.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/variable_assignment.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/variable_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/variable_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/variables.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/view.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/view_links.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/views.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/write_precision.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/xy_geom.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/domain/xy_view_properties.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/extras.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/py.typed (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/rest.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/__init__.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/_base_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/authorizations_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/backup_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/bucket_schemas_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/buckets_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/cells_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/checks_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/config_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/dashboards_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/dbr_ps_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/delete_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/health_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/invokable_scripts_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/labels_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/legacy_authorizations_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/metrics_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/notification_endpoints_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/notification_rules_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/organizations_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/ping_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/query_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/ready_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/remote_connections_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/replications_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/resources_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/restore_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/routes_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/rules_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/scraper_targets_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/secrets_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/setup_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/signin_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/signout_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/sources_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/tasks_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/telegraf_plugins_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/telegrafs_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/templates_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/users_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/variables_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/views_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/service/write_service.py (100%) rename {frogpilot => starpilot}/third_party/influxdb_client/version.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous-2.2.0.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/itsdangerous-2.2.0.dist-info/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/itsdangerous-2.2.0.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/itsdangerous-2.2.0.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/itsdangerous-2.2.0.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/itsdangerous-2.2.0.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/__init__.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/_json.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/encoding.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/exc.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/py.typed (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/serializer.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/signer.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/timed.py (100%) rename {frogpilot => starpilot}/third_party/itsdangerous/url_safe.py (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/entry_points.txt (100%) rename {frogpilot => starpilot}/third_party/jinja2-3.1.6.dist-info/licenses/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/jinja2/__init__.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/_identifier.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/async_utils.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/bccache.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/compiler.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/constants.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/debug.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/defaults.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/environment.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/ext.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/filters.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/idtracking.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/lexer.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/loaders.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/meta.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/nativetypes.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/nodes.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/optimizer.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/parser.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/py.typed (100%) rename {frogpilot => starpilot}/third_party/jinja2/runtime.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/sandbox.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/tests.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/utils.py (100%) rename {frogpilot => starpilot}/third_party/jinja2/visitor.py (100%) rename {frogpilot => starpilot}/third_party/kaitaistruct.py (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/markupsafe-3.0.3.dist-info/top_level.txt (100%) rename {frogpilot => starpilot}/third_party/markupsafe/__init__.py (100%) rename {frogpilot => starpilot}/third_party/markupsafe/_native.py (100%) rename {frogpilot => starpilot}/third_party/markupsafe/_speedups.c (100%) rename {frogpilot => starpilot}/third_party/markupsafe/_speedups.pyi (100%) rename {frogpilot => starpilot}/third_party/markupsafe/py.typed (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/AUTHORS (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/LICENSE (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/pydub-0.25.1.dist-info/top_level.txt (100%) rename {frogpilot => starpilot}/third_party/pydub/__init__.py (100%) rename {frogpilot => starpilot}/third_party/pydub/audio_segment.py (100%) rename {frogpilot => starpilot}/third_party/pydub/effects.py (100%) rename {frogpilot => starpilot}/third_party/pydub/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/pydub/generators.py (100%) rename {frogpilot => starpilot}/third_party/pydub/logging_utils.py (100%) rename {frogpilot => starpilot}/third_party/pydub/playback.py (100%) rename {frogpilot => starpilot}/third_party/pydub/pyaudioop.py (100%) rename {frogpilot => starpilot}/third_party/pydub/scipy_effects.py (100%) rename {frogpilot => starpilot}/third_party/pydub/silence.py (100%) rename {frogpilot => starpilot}/third_party/pydub/utils.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/_version.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/disposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/observable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/observer.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/periodicscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/scheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/startable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/abc/subject.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/booleandisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/compositedisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/disposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/multipleassignmentdisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/refcountdisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/scheduleddisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/serialdisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/disposable/singleassignmentdisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/basic.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/concurrency.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/constants.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/priorityqueue.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/internal/utils.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/notification.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/amb.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/case.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/catch.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/combinelatest.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/concat.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/connectableobservable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/defer.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/empty.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/forkjoin.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/fromcallback.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/fromfuture.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/fromiterable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/generate.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/generatewithrelativetime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/groupedobservable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/ifthen.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/interval.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/marbles.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/merge.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/never.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/observable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/onerrorresumenext.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/range.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/repeat.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/returnvalue.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/start.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/startasync.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/throw.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/timer.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/toasync.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/using.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/withlatestfrom.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observable/zip.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observer/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observer/autodetachobserver.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observer/observeonobserver.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observer/observer.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/observer/scheduledobserver.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_all.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_amb.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_asobservable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_average.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_buffer.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_bufferwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_bufferwithtimeorcount.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_catch.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_combinelatest.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_concat.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_contains.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_count.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_debounce.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_defaultifempty.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_delay.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_delaysubscription.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_delaywithmapper.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_dematerialize.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_distinct.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_distinctuntilchanged.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_do.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_dowhile.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_elementatordefault.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_exclusive.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_expand.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_filter.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_finallyaction.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_find.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_first.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_firstordefault.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_flatmap.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_forkjoin.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_groupby.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_groupbyuntil.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_groupjoin.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_ignoreelements.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_isempty.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_join.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_last.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_lastordefault.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_map.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_materialize.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_max.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_maxby.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_merge.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_min.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_minby.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_multicast.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_observeon.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_onerrorresumenext.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_pairwise.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_partition.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_pluck.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_publish.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_publishvalue.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_reduce.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_repeat.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_replay.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_retry.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_sample.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_scan.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_sequenceequal.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_single.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_singleordefault.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skip.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skiplast.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skiplastwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skipuntil.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skipuntilwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skipwhile.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_skipwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_slice.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_some.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_startswith.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_subscribeon.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_sum.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_switchlatest.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_take.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takelast.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takelastbuffer.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takelastwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takeuntil.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takeuntilwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takewhile.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_takewithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_throttlefirst.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_timeinterval.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_timeout.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_timeoutwithmapper.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_timestamp.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_todict.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_tofuture.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_toiterable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_tomarbles.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_toset.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_whiledo.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_window.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_windowwithcount.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_windowwithtime.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_windowwithtimeorcount.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_withlatestfrom.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/_zip.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/connectable/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/operators/connectable/_refcount.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/pipe.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/py.typed (100%) rename {frogpilot => starpilot}/third_party/reactivex/run.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/catchscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/currentthreadscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/asyncioscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/asynciothreadsafescheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/eventletscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/geventscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/ioloopscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloop/twistedscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/eventloopscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/historicalscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/immediatescheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/mainloop/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/mainloop/gtkscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/mainloop/pygamescheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/mainloop/qtscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/mainloop/tkinterscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/mainloop/wxscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/newthreadscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/periodicscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/scheduleditem.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/scheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/threadpoolscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/timeoutscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/trampoline.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/trampolinescheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/scheduler/virtualtimescheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/subject/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/subject/asyncsubject.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/subject/behaviorsubject.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/subject/innersubscription.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/subject/replaysubject.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/subject/subject.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/__init__.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/coldobservable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/hotobservable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/marbles.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/mockdisposable.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/mockobserver.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/reactivetest.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/recorded.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/subscription.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/testing/testscheduler.py (100%) rename {frogpilot => starpilot}/third_party/reactivex/typing.py (100%) rename {frogpilot => starpilot}/third_party/six.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/_numba_replacements.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/configs.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/coord_accessors.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/boundaries/coordinates.fbs (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/boundaries/xmax.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/boundaries/xmin.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/boundaries/ymax.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/boundaries/ymin.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/hole_registry.json (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/holes/coordinates.fbs (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/holes/xmax.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/holes/xmin.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/holes/ymax.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/holes/ymin.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/hybrid_shortcuts_uint16.fbs (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/timezone_names.txt (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/zone_ids.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/data/zone_positions.npy (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/polygons/Polygon.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/polygons/PolygonCollection.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/polygons/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutCollection.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutEntry.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/PolygonList.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/ShortcutValue.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/UniqueZone.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutCollection.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutEntry.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/PolygonList.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/ShortcutValue.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/UniqueZone.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/io/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/io/hybrid_shortcuts.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/io/polygons.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/flatbuf/schemas/__init__.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/global_functions.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/np_binary_helpers.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/polygon_array.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/timezonefinder.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/utils.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/utils_clang.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/utils_numba.py (100%) rename {frogpilot => starpilot}/third_party/timezonefinder/zone_names.py (100%) rename {frogpilot => starpilot}/third_party/typing_extensions.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/__init__.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/_base_connection.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/_collections.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/_request_methods.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/_version.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/connection.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/connectionpool.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/__init__.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/emscripten/__init__.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/emscripten/connection.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/emscripten/emscripten_fetch_worker.js (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/emscripten/fetch.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/emscripten/request.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/emscripten/response.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/pyopenssl.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/contrib/socks.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/fields.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/filepost.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/http2/__init__.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/http2/connection.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/http2/probe.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/poolmanager.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/py.typed (100%) rename {frogpilot => starpilot}/third_party/urllib3/response.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/__init__.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/connection.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/proxy.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/request.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/response.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/retry.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/ssl_.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/ssl_match_hostname.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/ssltransport.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/timeout.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/url.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/util.py (100%) rename {frogpilot => starpilot}/third_party/urllib3/util/wait.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug-3.1.3.dist-info/INSTALLER (100%) rename {frogpilot => starpilot}/third_party/werkzeug-3.1.3.dist-info/LICENSE.txt (100%) rename {frogpilot => starpilot}/third_party/werkzeug-3.1.3.dist-info/METADATA (100%) rename {frogpilot => starpilot}/third_party/werkzeug-3.1.3.dist-info/RECORD (100%) rename {frogpilot => starpilot}/third_party/werkzeug-3.1.3.dist-info/REQUESTED (100%) rename {frogpilot => starpilot}/third_party/werkzeug-3.1.3.dist-info/WHEEL (100%) rename {frogpilot => starpilot}/third_party/werkzeug/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/_internal.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/_reloader.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/accept.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/auth.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/cache_control.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/csp.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/etag.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/file_storage.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/headers.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/mixins.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/range.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/datastructures/structures.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/console.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/repr.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/shared/ICON_LICENSE.md (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/shared/console.png (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/shared/debugger.js (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/shared/less.png (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/shared/more.png (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/shared/style.css (100%) rename {frogpilot => starpilot}/third_party/werkzeug/debug/tbtools.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/formparser.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/http.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/local.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/dispatcher.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/http_proxy.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/lint.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/profiler.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/proxy_fix.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/middleware/shared_data.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/py.typed (100%) rename {frogpilot => starpilot}/third_party/werkzeug/routing/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/routing/converters.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/routing/exceptions.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/routing/map.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/routing/matcher.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/routing/rules.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/sansio/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/sansio/http.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/sansio/multipart.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/sansio/request.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/sansio/response.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/sansio/utils.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/security.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/serving.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/test.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/testapp.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/urls.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/user_agent.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/utils.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/wrappers/__init__.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/wrappers/request.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/wrappers/response.py (100%) rename {frogpilot => starpilot}/third_party/werkzeug/wsgi.py (100%) rename {frogpilot => starpilot}/tinygrad_modeld/__init__.py (100%) rename {frogpilot => starpilot}/tinygrad_modeld/constants.py (100%) rename {frogpilot => starpilot}/tinygrad_modeld/dmonitoringmodeld.py (99%) rename {frogpilot => starpilot}/tinygrad_modeld/fill_model_msg.py (99%) rename {frogpilot => starpilot}/tinygrad_modeld/get_model_metadata.py (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/README.md (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/__init__.py (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/big_driving_policy.onnx (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/big_driving_vision.onnx (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/commonmodel.cc (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/commonmodel.h (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/commonmodel.pxd (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/commonmodel_pyx.cpp (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/commonmodel_pyx.pxd (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/commonmodel_pyx.pyx (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/dm_warp_1344x760_tinygrad.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/dm_warp_1928x1208_tinygrad.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/dmonitoring_model.onnx (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/dmonitoring_model_metadata.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/driving_policy.onnx (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/driving_policy_metadata.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/driving_vision.onnx (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/driving_vision_metadata.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/warp_1344x760_tinygrad.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/models/warp_1928x1208_tinygrad.pkl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/parse_model_outputs.py (99%) rename {frogpilot => starpilot}/tinygrad_modeld/runners/tinygrad_helpers.py (100%) rename {frogpilot => starpilot}/tinygrad_modeld/tinygrad_modeld.py (96%) rename {frogpilot => starpilot}/tinygrad_modeld/transforms/loadyuv.cc (98%) rename {frogpilot => starpilot}/tinygrad_modeld/transforms/loadyuv.cl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/transforms/loadyuv.h (100%) rename {frogpilot => starpilot}/tinygrad_modeld/transforms/transform.cc (98%) rename {frogpilot => starpilot}/tinygrad_modeld/transforms/transform.cl (100%) rename {frogpilot => starpilot}/tinygrad_modeld/transforms/transform.h (100%) rename {frogpilot => starpilot}/tools/compile_models.py (86%) rename frogpilot/ui/moc_frogpilot_ui.cc => starpilot/ui/moc_starpilot_ui.cc (71%) rename {frogpilot => starpilot}/ui/qt/offroad/data_settings.cc (87%) create mode 100644 starpilot/ui/qt/offroad/data_settings.h rename {frogpilot => starpilot}/ui/qt/offroad/device_settings.cc (81%) rename {frogpilot => starpilot}/ui/qt/offroad/device_settings.h (76%) rename {frogpilot => starpilot}/ui/qt/offroad/expandable_multi_option_dialog.cc (99%) rename {frogpilot => starpilot}/ui/qt/offroad/expandable_multi_option_dialog.h (100%) rename {frogpilot => starpilot}/ui/qt/offroad/lateral_settings.cc (80%) rename {frogpilot => starpilot}/ui/qt/offroad/lateral_settings.h (65%) rename {frogpilot => starpilot}/ui/qt/offroad/longitudinal_settings.cc (84%) rename {frogpilot => starpilot}/ui/qt/offroad/longitudinal_settings.h (87%) rename {frogpilot => starpilot}/ui/qt/offroad/maps_settings.cc (85%) rename {frogpilot => starpilot}/ui/qt/offroad/maps_settings.h (68%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_data_settings.cc (71%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_device_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_expandable_multi_option_dialog.cc (100%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_lateral_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_longitudinal_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_maps_settings.cc (71%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_model_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_navigation_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_sounds_settings.cc (70%) rename frogpilot/ui/qt/offroad/moc_frogpilot_settings.cc => starpilot/ui/qt/offroad/moc_starpilot_settings.cc (73%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_theme_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_utilities.cc (65%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_vehicle_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_visual_settings.cc (70%) rename {frogpilot => starpilot}/ui/qt/offroad/moc_wheel_settings.cc (65%) rename {frogpilot => starpilot}/ui/qt/offroad/model_settings.cc (91%) rename {frogpilot => starpilot}/ui/qt/offroad/model_settings.h (66%) rename {frogpilot => starpilot}/ui/qt/offroad/navigation_settings.cc (81%) rename {frogpilot => starpilot}/ui/qt/offroad/navigation_settings.h (59%) rename {frogpilot => starpilot}/ui/qt/offroad/sounds_settings.cc (81%) rename {frogpilot => starpilot}/ui/qt/offroad/sounds_settings.h (79%) rename frogpilot/ui/qt/offroad/frogpilot_settings.cc => starpilot/ui/qt/offroad/starpilot_settings.cc (66%) rename frogpilot/ui/qt/offroad/frogpilot_settings.h => starpilot/ui/qt/offroad/starpilot_settings.h (74%) rename {frogpilot => starpilot}/ui/qt/offroad/theme_settings.cc (89%) rename {frogpilot => starpilot}/ui/qt/offroad/theme_settings.h (71%) create mode 100644 starpilot/ui/qt/offroad/utilities.cc create mode 100644 starpilot/ui/qt/offroad/utilities.h rename {frogpilot => starpilot}/ui/qt/offroad/vehicle_settings.cc (89%) rename {frogpilot => starpilot}/ui/qt/offroad/vehicle_settings.h (83%) rename {frogpilot => starpilot}/ui/qt/offroad/visual_settings.cc (83%) rename {frogpilot => starpilot}/ui/qt/offroad/visual_settings.h (82%) rename {frogpilot => starpilot}/ui/qt/offroad/wheel_settings.cc (84%) rename {frogpilot => starpilot}/ui/qt/offroad/wheel_settings.h (54%) rename frogpilot/ui/qt/onroad/moc_frogpilot_annotated_camera.cc => starpilot/ui/qt/onroad/moc_starpilot_annotated_camera.cc (64%) rename frogpilot/ui/qt/onroad/moc_frogpilot_buttons.cc => starpilot/ui/qt/onroad/moc_starpilot_buttons.cc (94%) rename frogpilot/ui/qt/onroad/moc_frogpilot_onroad.cc => starpilot/ui/qt/onroad/moc_starpilot_onroad.cc (65%) rename frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc => starpilot/ui/qt/onroad/starpilot_annotated_camera.cc (81%) rename frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h => starpilot/ui/qt/onroad/starpilot_annotated_camera.h (93%) rename frogpilot/ui/qt/onroad/frogpilot_buttons.cc => starpilot/ui/qt/onroad/starpilot_buttons.cc (81%) rename frogpilot/ui/qt/onroad/frogpilot_buttons.h => starpilot/ui/qt/onroad/starpilot_buttons.h (89%) rename frogpilot/ui/qt/onroad/frogpilot_onroad.cc => starpilot/ui/qt/onroad/starpilot_onroad.cc (84%) rename frogpilot/ui/qt/onroad/frogpilot_onroad.h => starpilot/ui/qt/onroad/starpilot_onroad.h (75%) rename {frogpilot => starpilot}/ui/qt/widgets/developer_sidebar.cc (85%) rename {frogpilot => starpilot}/ui/qt/widgets/developer_sidebar.h (94%) rename {frogpilot => starpilot}/ui/qt/widgets/drive_stats.cc (81%) rename {frogpilot => starpilot}/ui/qt/widgets/drive_stats.h (88%) rename {frogpilot => starpilot}/ui/qt/widgets/drive_summary.cc (93%) rename {frogpilot => starpilot}/ui/qt/widgets/drive_summary.h (86%) rename {frogpilot => starpilot}/ui/qt/widgets/moc_developer_sidebar.cc (100%) rename {frogpilot => starpilot}/ui/qt/widgets/moc_drive_stats.cc (100%) rename {frogpilot => starpilot}/ui/qt/widgets/moc_drive_summary.cc (74%) rename {frogpilot => starpilot}/ui/qt/widgets/moc_navigation_functions.cc (100%) rename frogpilot/ui/qt/widgets/moc_frogpilot_controls.cc => starpilot/ui/qt/widgets/moc_starpilot_controls.cc (64%) rename {frogpilot => starpilot}/ui/qt/widgets/navigation_functions.cc (97%) rename {frogpilot => starpilot}/ui/qt/widgets/navigation_functions.h (99%) rename frogpilot/ui/qt/widgets/frogpilot_controls.cc => starpilot/ui/qt/widgets/starpilot_controls.cc (92%) rename frogpilot/ui/qt/widgets/frogpilot_controls.h => starpilot/ui/qt/widgets/starpilot_controls.h (90%) rename {frogpilot => starpilot}/ui/screenrecorder/blocking_queue.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/moc_screenrecorder.cc (100%) rename {frogpilot => starpilot}/ui/screenrecorder/omx_encoder.cc (99%) rename {frogpilot => starpilot}/ui/screenrecorder/omx_encoder.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Audio.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Component.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_ContentPipe.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Core.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_CoreExt.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_IVCommon.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Image.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Index.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_IndexExt.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Other.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_QCOMExtns.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Skype_VideoExtensions.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Types.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_Video.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/openmax/include/OMX_VideoExt.h (100%) rename {frogpilot => starpilot}/ui/screenrecorder/screenrecorder.cc (98%) rename {frogpilot => starpilot}/ui/screenrecorder/screenrecorder.h (100%) rename frogpilot/ui/frogpilot_ui.cc => starpilot/ui/starpilot_ui.cc (52%) rename frogpilot/ui/frogpilot_ui.h => starpilot/ui/starpilot_ui.h (64%) diff --git a/.github/workflows/compile_frogpilot.yaml b/.github/workflows/compile_starpilot.yaml similarity index 90% rename from .github/workflows/compile_frogpilot.yaml rename to .github/workflows/compile_starpilot.yaml index f8191362..37920c3d 100644 --- a/.github/workflows/compile_frogpilot.yaml +++ b/.github/workflows/compile_starpilot.yaml @@ -1,4 +1,4 @@ -name: Compile FrogPilot +name: Compile StarPilot on: workflow_dispatch: @@ -13,18 +13,18 @@ on: type: string default: "" required: false - publish_frogpilot: - description: "Push to FrogPilot" + publish_starpilot: + description: "Push to StarPilot" type: boolean default: false required: false publish_staging: - description: "Push to FrogPilot-Staging" + description: "Push to StarPilot-Staging" type: boolean default: false required: false publish_testing: - description: "Push to FrogPilot-Testing" + description: "Push to StarPilot-Testing" type: boolean default: false required: false @@ -88,7 +88,7 @@ jobs: with: ref: ${{ needs.get_branch.outputs.branch }} sparse-checkout: | - frogpilot/ui/ + starpilot/ui/ selfdrive/controls/lib/alerts_offroad.json selfdrive/ui/ selfdrive/ui/translations/ @@ -151,7 +151,7 @@ jobs: git config http.postBuffer 104857600 git config user.name "$GIT_NAME" git config user.email "$GIT_EMAIL" - git remote set-url origin "https://${{ secrets.PERSONAL_ACCESS_TOKEN }}@github.com/FrogAi/FrogPilot.git" + git remote set-url origin "https://${{ secrets.PERSONAL_ACCESS_TOKEN }}@github.com/FrogAi/StarPilot.git" - name: Sync Translation Updates if: inputs.update_translations @@ -181,7 +181,7 @@ jobs: find .github -mindepth 1 -maxdepth 1 ! -name 'workflows' -exec rm -rf {} + find .github/workflows -mindepth 1 ! \( \ -type f \( \ - -name 'compile_frogpilot.yaml' -o \ + -name 'compile_starpilot.yaml' -o \ -name 'review_pull_request.yaml' -o \ -name 'schedule_update.yaml' -o \ -name 'update_pr_branch.yaml' -o \ @@ -214,24 +214,24 @@ jobs: if: inputs.publish_staging continue-on-error: true run: | - curl -fLsS https://raw.githubusercontent.com/FrogAi/FrogPilot/FrogPilot-Staging/.github/update_date -o .github/update_date || echo "No update_date found, skipping..." + curl -fLsS https://raw.githubusercontent.com/FrogAi/StarPilot/StarPilot-Staging/.github/update_date -o .github/update_date || echo "No update_date found, skipping..." - name: Commit and Push Build run: | git add -f . - git commit -m "Compile FrogPilot" + git commit -m "Compile StarPilot" git push --force origin HEAD - if [ "${{ inputs.publish_frogpilot }}" = "true" ]; then - git push --force origin HEAD:FrogPilot + if [ "${{ inputs.publish_starpilot }}" = "true" ]; then + git push --force origin HEAD:StarPilot fi if [ "${{ inputs.publish_staging }}" = "true" ]; then - git push --force origin HEAD:FrogPilot-Staging + git push --force origin HEAD:StarPilot-Staging fi if [ "${{ inputs.publish_testing }}" = "true" ]; then - git push --force origin HEAD:FrogPilot-Testing + git push --force origin HEAD:StarPilot-Testing fi if [ -n "$CUSTOM_BRANCH" ]; then diff --git a/.github/workflows/review_pull_request.yaml b/.github/workflows/review_pull_request.yaml index d2e02a3b..3b10a2c3 100644 --- a/.github/workflows/review_pull_request.yaml +++ b/.github/workflows/review_pull_request.yaml @@ -34,5 +34,5 @@ jobs: echo "Valid target branch." gh pr comment "$PR_NUMBER" --repo "$REPO" \ - --body "Thank you for your PR! If you're not already in the FrogPilot Discord, [feel free to join](https://discord.FrogPilot.com) and let me know you've opened a PR!" + --body "Thank you for your PR! If you're not already in the StarPilot Discord, [feel free to join](https://discord.StarPilot.com) and let me know you've opened a PR!" fi diff --git a/.github/workflows/schedule_update.yaml b/.github/workflows/schedule_update.yaml index 9aa585a3..e48cb42b 100644 --- a/.github/workflows/schedule_update.yaml +++ b/.github/workflows/schedule_update.yaml @@ -1,16 +1,16 @@ -name: Schedule FrogPilot Update +name: Schedule StarPilot Update on: workflow_dispatch: inputs: scheduled_date: - description: "Enter the date to update the \"FrogPilot\" branch (YYYY-MM-DD)" + description: "Enter the date to update the \"StarPilot\" branch (YYYY-MM-DD)" required: true env: GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com" GIT_NAME: "James" - TARGET_BRANCH: "FrogPilot-Staging" + TARGET_BRANCH: "StarPilot-Staging" UPDATE_FILE_PATH: ".github/update_date" jobs: diff --git a/.github/workflows/update_pr_branch.yaml b/.github/workflows/update_pr_branch.yaml index d7c5d231..5891c6eb 100644 --- a/.github/workflows/update_pr_branch.yaml +++ b/.github/workflows/update_pr_branch.yaml @@ -4,13 +4,13 @@ run-name: Update MAKE-PRS-HERE on: push: branches: - - FrogPilot-Testing + - StarPilot-Testing env: GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com" GIT_NAME: "James" GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - SOURCE_BRANCH: FrogPilot-Testing + SOURCE_BRANCH: StarPilot-Testing TARGET_BRANCH: MAKE-PRS-HERE TZ: America/Phoenix @@ -33,13 +33,13 @@ jobs: git config --global user.name "$GIT_NAME" git config --global user.email "$GIT_EMAIL" - - name: Revert "Compile FrogPilot" + - name: Revert "Compile StarPilot" id: prepare_source run: | - COMPILE_COMMIT=$(git rev-list HEAD -n 1 --grep="Compile FrogPilot" || true) + COMPILE_COMMIT=$(git rev-list HEAD -n 1 --grep="Compile StarPilot" || true) if [ -n "$COMPILE_COMMIT" ]; then - echo "Found 'Compile FrogPilot' at $COMPILE_COMMIT. Reverting..." + echo "Found 'Compile StarPilot' at $COMPILE_COMMIT. Reverting..." git revert --no-edit "$COMPILE_COMMIT" else echo "Compile commit not found. Proceeding with current source state." diff --git a/.github/workflows/update_release_branch.yaml b/.github/workflows/update_release_branch.yaml index 82f981c3..7e289002 100644 --- a/.github/workflows/update_release_branch.yaml +++ b/.github/workflows/update_release_branch.yaml @@ -1,13 +1,13 @@ -name: Update FrogPilot Branch +name: Update StarPilot Branch on: schedule: - cron: "0 18 * * 6" env: - BRANCH_FROGPILOT: FrogPilot - BRANCH_PREVIOUS: FrogPilot-Previous - BRANCH_STAGING: FrogPilot-Staging + BRANCH_STARPILOT: StarPilot + BRANCH_PREVIOUS: StarPilot-Previous + BRANCH_STAGING: StarPilot-Staging GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com" GIT_NAME: "James" GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} @@ -102,6 +102,6 @@ jobs: - name: Push and Sync Branches run: | git push origin "$BRANCH_STAGING" --force - git fetch origin "$BRANCH_FROGPILOT:$BRANCH_FROGPILOT" - git push origin "$BRANCH_FROGPILOT:$BRANCH_PREVIOUS" --force - git push origin "$BRANCH_STAGING:$BRANCH_FROGPILOT" --force + git fetch origin "$BRANCH_STARPILOT:$BRANCH_STARPILOT" + git push origin "$BRANCH_STARPILOT:$BRANCH_PREVIOUS" --force + git push origin "$BRANCH_STAGING:$BRANCH_STARPILOT" --force diff --git a/.github/workflows/update_tinygrad.yaml b/.github/workflows/update_tinygrad.yaml index 101fa3ed..17b61dcc 100644 --- a/.github/workflows/update_tinygrad.yaml +++ b/.github/workflows/update_tinygrad.yaml @@ -15,8 +15,8 @@ on: env: GIT_EMAIL: "91348155+FrogAi@users.noreply.github.com" GIT_NAME: "James" - GITLAB_REPO_DIR: "FrogPilot-Resources" - GITLAB_URL: "gitlab.com/FrogAi/FrogPilot-Resources.git" + GITLAB_REPO_DIR: "StarPilot-Resources" + GITLAB_URL: "gitlab.com/FrogAi/StarPilot-Resources.git" OPENPILOT_DIR: "/data/openpilot" jobs: @@ -26,7 +26,7 @@ jobs: - name: Get Version id: get_version run: | - VERSION=$(grep -oP '^VERSION\s*=\s*"\K[^"]+' "$OPENPILOT_DIR/frogpilot/assets/model_manager.py") + VERSION=$(grep -oP '^VERSION\s*=\s*"\K[^"]+' "$OPENPILOT_DIR/starpilot/assets/model_manager.py") echo "VERSION=$VERSION" echo "version=$VERSION" >> "$GITHUB_OUTPUT" @@ -35,7 +35,7 @@ jobs: env: GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }} run: | - WORK_DIR="$RUNNER_TEMP/frogpilot_tinygrad" + WORK_DIR="$RUNNER_TEMP/starpilot_tinygrad" rm -rf "$WORK_DIR" && mkdir -p "$WORK_DIR" echo "work_dir=$WORK_DIR" >> "$GITHUB_OUTPUT" diff --git a/README.md b/README.md index 7eb00a88..5d84539e 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ Openpilot provides StarPilot adds support for many GM vehicles along with improved tuning, especially for radar-less (camera only) vehicles. -StarPilot is built off of [FrogPilot](https://github.com/FrogAi/FrogPilot) -and supports the major features FrogPilot offers. +StarPilot is built off of [StarPilot](https://github.com/FrogAi/StarPilot) +and supports the major features StarPilot offers. StarPilot has a vibrant, welcoming community [discord](https://firestar.link/discord). Stop by to chat or ask questions! @@ -48,7 +48,7 @@ Download models, change settings, update software, visualize live model outputs * High quality dashcam recordings* * Enhanced tuning for CEM (dynamic experimental mode switching) -\* [Inherited from FrogPilot](https://github.com/FrogAi/FrogPilot#openpilot-vs-frogpilot) +\* [Inherited from StarPilot](https://github.com/FrogAi/StarPilot#openpilot-vs-starpilot) ## GM-only Features diff --git a/UICheatSheet.md b/UICheatSheet.md index 9ca52aef..177c99e8 100644 --- a/UICheatSheet.md +++ b/UICheatSheet.md @@ -637,7 +637,7 @@ Legend: ✅ = Full | 🟡 = Structure/stub | 🔴 = Not started #### Completed (March 17, 2026) - **Created `StarPilotState` singleton** (`selfdrive/ui/lib/starpilot_state.py`) with: - `StarPilotCarState` dataclass with all car type, capability, and value fields - - Reads `CarParamsPersistent`, `FrogPilotCarParamsPersistent`, `LiveTorqueParameters`, `FrogPilotToggles` from Params + - Reads `CarParamsPersistent`, `StarPilotCarParamsPersistent`, `LiveTorqueParameters`, `StarPilotToggles` from Params - Throttled updates (2.0s interval) to avoid slowing UI - PC/desktop fallback mode with configurable car make/model - Global import: `from openpilot.selfdrive.ui.lib.starpilot_state import starpilot_state` @@ -1270,7 +1270,7 @@ emit closeSubSubSubPanel(); // Back from Level 4 → Level 3 **Longitudinal Panel Structure** (17 sub-panels, ~80 controls): ``` -FROGPILOT LONGITUDINAL LAYOUT (top level - MANAGE buttons) +STARPILOT LONGITUDINAL LAYOUT (top level - MANAGE buttons) ├── Advanced Longitudinal Tuning → StarPilotAdvancedLongLayout │ └── 8 value controls ├── Conditional Experimental Mode → StarPilotConditionalExpLayout @@ -1741,7 +1741,7 @@ KM_TO_MILE = 0.621371 | Rainbow Path | Toggle | | | | Random Events | Toggle | | | | Random Themes | TOGGLE+TOGGLE | - | Includes "Include Holiday Themes" | -| Startup Alert | BUTTON | STOCK, FROGPILOT, CUSTOM, CLEAR | | +| Startup Alert | BUTTON | STOCK, STARPILOT, CUSTOM, CLEAR | | | Download Status | LABEL | - | Shows download progress | **Custom Themes Sub-Panel** (7 theme types, each with DELETE/DOWNLOAD/SELECT): @@ -1973,7 +1973,7 @@ Acura, Audi, Buick, Cadillac, Chevrolet, Chrysler, CUPRA, Dodge, Ford, Genesis, | Debug Mode | Toggle | | | Flash Panda | BUTTON | FLASH | | Force Drive State | BUTTONS | OFFROAD / ONROAD / OFF | -| Pair to "The Pond" | BUTTON | PAIR/UNPAIR | +| Galaxy | BUTTON | PAIR/UNPAIR | | Report a Bug | BUTTON | REPORT | | Reset Toggles to Default | BUTTON | RESET | | Reset Toggles to Stock | BUTTON | RESET | @@ -2613,9 +2613,9 @@ ensures that if the car state changes (e.g. from a CarParams update), the UI ref **Data sources parsed:** 1. `CarParamsPersistent` — Car fingerprint, lateral tuning, capabilities -2. `FrogPilotCarParamsPersistent` — canUsePedal, canUseSDSU, openpilotLongitudinalControlDisabled +2. `StarPilotCarParamsPersistent` — canUsePedal, canUseSDSU, openpilotLongitudinalControlDisabled 3. `LiveTorqueParameters` — hasAutoTune (useParams) -4. `FrogPilotToggles` — JSON blob with supplementary toggles +4. `StarPilotToggles` — JSON blob with supplementary toggles **Update throttling:** 2.0s minimum interval between heavy param parsing diff --git a/cereal/custom.capnp b/cereal/custom.capnp index bb88c2c6..3b6cde3e 100644 --- a/cereal/custom.capnp +++ b/cereal/custom.capnp @@ -12,7 +12,7 @@ using Car = import "car.capnp"; # DO rename the structs # DON'T change the identifier (e.g. @0x81c2f05a394cf4af) -struct FrogPilotCarControl @0x81c2f05a394cf4af { +struct StarPilotCarControl @0x81c2f05a394cf4af { hudControl @0 :HUDControl; struct HUDControl { @@ -51,7 +51,7 @@ struct FrogPilotCarControl @0x81c2f05a394cf4af { } } -struct FrogPilotCarParams @0xaedffd8f31e7b55d { +struct StarPilotCarParams @0xaedffd8f31e7b55d { alternativeExperience @0 :Int16; canUsePedal @1 :Bool; canUseSDSU @2 :Bool; @@ -65,7 +65,7 @@ struct FrogPilotCarParams @0xaedffd8f31e7b55d { } } -struct FrogPilotCarState @0xf35cc4560bbf6ec2 { +struct StarPilotCarState @0xf35cc4560bbf6ec2 { accelPressed @0 :Bool; alwaysOnLateralEnabled @1 :Bool; brakeLights @2 :Bool; @@ -84,12 +84,12 @@ struct FrogPilotCarState @0xf35cc4560bbf6ec2 { gasStack @15 :Bool; # Compatibility with older StarPilot payloads } -struct FrogPilotDeviceState @0xda96579883444c35 { +struct StarPilotDeviceState @0xda96579883444c35 { freeSpace @0 :Int16; usedSpace @1 :Int16; } -struct FrogPilotModelDataV2 @0x80ae746ee2596b11 { +struct StarPilotModelDataV2 @0x80ae746ee2596b11 { turnDirection @0 :TurnDirection; enum TurnDirection { @@ -99,7 +99,7 @@ struct FrogPilotModelDataV2 @0x80ae746ee2596b11 { } } -struct FrogPilotOnroadEvent @0xa5cd762cd951a455 { +struct StarPilotOnroadEvent @0xa5cd762cd951a455 { name @0 :EventName; enable @1 :Bool; @@ -148,7 +148,7 @@ struct FrogPilotOnroadEvent @0xa5cd762cd951a455 { } } -struct FrogPilotPlan @0xf98d843bfd7004a3 { +struct StarPilotPlan @0xf98d843bfd7004a3 { accelerationJerk @0 :Float32; cscControllingSpeed @1 :Bool; cscSpeed @2 :Float32; @@ -159,8 +159,8 @@ struct FrogPilotPlan @0xf98d843bfd7004a3 { experimentalMode @7 :Bool; forcingStop @8 :Bool; forcingStopLength @9 :Float32; - frogpilotEvents @10 :List(FrogPilotOnroadEvent); - frogpilotToggles @11 :Text; + starpilotEvents @10 :List(StarPilotOnroadEvent); + starpilotToggles @11 :Text; increasedStoppedDistance @12 :Float32; lateralCheck @13 :Bool; laneWidthLeft @14 :Float32; @@ -188,7 +188,7 @@ struct FrogPilotPlan @0xf98d843bfd7004a3 { trackingLead @36 :Bool; } -struct FrogPilotRadarState @0xb86e6369214c01c8 { +struct StarPilotRadarState @0xb86e6369214c01c8 { leadLeft @0 :LeadData; leadRight @1 :LeadData; @@ -213,7 +213,7 @@ struct FrogPilotRadarState @0xb86e6369214c01c8 { } } -struct FrogPilotSelfdriveState @0xf416ec09499d9d19 { +struct StarPilotSelfdriveState @0xf416ec09499d9d19 { alertText1 @0 :Text; alertText2 @1 :Text; alertStatus @2 :AlertStatus; @@ -225,7 +225,7 @@ struct FrogPilotSelfdriveState @0xf416ec09499d9d19 { normal @0; userPrompt @1; critical @2; - frogpilot @3; + starpilot @3; } enum AlertSize { diff --git a/cereal/libcereal.a b/cereal/libcereal.a index e2d9b89c2719bc3e0f7e5b2052ea3e9b34dcfc12..3e40537bfc4239265d51e0a3e044fc0a5582e3fa 100644 GIT binary patch delta 403 zcmX@nu6m+fbwk;`$sP9=2xc?nFyu1iG2}B8FcdNrF%&ne-)~pH&j`d!+tu$gi|(2J z;S3wgbcfk2J`mOfIO_qNWiSUO+W==>n8T6-)jOBP1;Xl>3su*CV=fC2vjQ>O_8W8A zzkHc~VG@TDGZzE*^pBG`b~7_DFmGQ!nWK-9CAcK9XuIQ74ihM|avFyXl(};{#}#IX zf{C*^Vpt%|kMlWXpb7*Ra%|yX1(^^q-Ea2Eeq%2C zmoLm*4BXRCPvTIXbdF{Ew@Dn^n3)+Ewy&Se(Z|T*26Vx8$Eh49P-f*c4jU+Q=X8!M z%n$_=XLH1`K$surbI3py2rlH!0SRqW$ogDhy5MR_B;Yb0qwm&(-!N~!&@(jlom;vWFY#^f358mPs-u~wr Z$3ci2LHzv?Lt1WgR6=wz-r+c&4gdh)ntcEO diff --git a/cereal/libsocketmaster.a b/cereal/libsocketmaster.a index b24ff987f98c6b8ddc6cea7e2f4d80b44860434d..0c1e2da2e954adce9ff7c9269c50102cb6e25f39 100644 GIT binary patch delta 171 zcmZqq&DQdpZA0DJ`r?wrqJqqv{1WHHBIo?PlA`<^24t~-#G=I9Vicj^lEji!gosOO zS!Qx7nxJofN@`A+5ki%JUQvExifdVFUI~(E0Wvv>c?d;8i7AOi2$METp38m@0EHSv A{{R30 delta 171 zcmZqq&DQdpZA0DJ`n00_^n%Qs{1WHHBIo?PlA`<^24t~-#G=I9Vicj^lEji!gosOO zS!Qx7nxJofN@`A+5ki%JUQvExifdVFUI~(E0Wvv>c?d;8i7AOi2$METp38m@0Aa;M AlK=n! diff --git a/cereal/log.capnp b/cereal/log.capnp index 6cd6599a..917cd972 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -2625,15 +2625,15 @@ struct Event { # DO change the name of the field and struct # DON'T change the ID (e.g. @107) # DON'T change which struct it points to - frogpilotCarControl @107 :Custom.FrogPilotCarControl; - frogpilotCarParams @108 :Custom.FrogPilotCarParams; - frogpilotCarState @109 :Custom.FrogPilotCarState; - frogpilotDeviceState @110 :Custom.FrogPilotDeviceState; - frogpilotModelV2 @111 :Custom.FrogPilotModelDataV2; - frogpilotOnroadEvents @112 :List(Custom.FrogPilotOnroadEvent); - frogpilotPlan @113 :Custom.FrogPilotPlan; - frogpilotRadarState @114 :Custom.FrogPilotRadarState; - frogpilotSelfdriveState @115 :Custom.FrogPilotSelfdriveState; + starpilotCarControl @107 :Custom.StarPilotCarControl; + starpilotCarParams @108 :Custom.StarPilotCarParams; + starpilotCarState @109 :Custom.StarPilotCarState; + starpilotDeviceState @110 :Custom.StarPilotDeviceState; + starpilotModelV2 @111 :Custom.StarPilotModelDataV2; + starpilotOnroadEvents @112 :List(Custom.StarPilotOnroadEvent); + starpilotPlan @113 :Custom.StarPilotPlan; + starpilotRadarState @114 :Custom.StarPilotRadarState; + starpilotSelfdriveState @115 :Custom.StarPilotSelfdriveState; customReserved9 @116 :Custom.CustomReserved9; customReserved10 @136 :Custom.CustomReserved10; customReserved11 @137 :Custom.CustomReserved11; diff --git a/cereal/messaging/__init__.py b/cereal/messaging/__init__.py index 1bc9b4d8..17bde5bd 100644 --- a/cereal/messaging/__init__.py +++ b/cereal/messaging/__init__.py @@ -197,7 +197,7 @@ class SubMaster: self.data[s] = getattr(data.as_reader(), s) self.freq_tracker[s] = FrequencyTracker(SERVICE_LIST[s].frequency, self.update_freq, s == poll) - # FrogPilot variables + # StarPilot variables self.addr = addr self.poll = poll @@ -252,7 +252,7 @@ class SubMaster: def all_checks(self, service_list: Optional[List[str]] = None) -> bool: return self.all_alive(service_list) and self.all_freq_ok(service_list) and self.all_valid(service_list) - # FrogPilot variables + # StarPilot variables def extend(self, new_services: List[str]): return SubMaster( self.services + new_services, @@ -286,7 +286,7 @@ class PubMaster: def all_readers_updated(self, s: str) -> bool: return self.sock[s].all_readers_updated() # type: ignore - # FrogPilot variables + # StarPilot variables def extend(self, new_services: List[str]): for service in new_services: if service not in self.sock: diff --git a/cereal/messaging/bridge b/cereal/messaging/bridge index 04a2d1984d2d2c8cee01266aa1c3fb686d2cd246..a6ec07d499d79dd17cbf1ebae1cd82307a6a70b8 100755 GIT binary patch delta 201 zcmeCUz}azub3+P~h{D>Pk7ECSnteR*X!rfI&o2480#|u&2Ci| delta 201 zcmeCUz}azub3+P~$gxo8u(b>CJ$mKS=&4^VHs#B services = { { "customReservedRawData0", {"customReservedRawData0", true, 0.000000, -1, 256000}}, { "customReservedRawData1", {"customReservedRawData1", true, 0.000000, -1, 256000}}, { "customReservedRawData2", {"customReservedRawData2", true, 0.000000, -1, 256000}}, - { "frogpilotCarControl", {"frogpilotCarControl", true, 100.000000, 10, 256000}}, - { "frogpilotCarParams", {"frogpilotCarParams", true, 0.020000, 1, 256000}}, - { "frogpilotCarState", {"frogpilotCarState", true, 100.000000, 10, 256000}}, - { "frogpilotDeviceState", {"frogpilotDeviceState", true, 2.000000, 1, 256000}}, - { "frogpilotModelV2", {"frogpilotModelV2", true, 20.000000, -1, 256000}}, - { "frogpilotOnroadEvents", {"frogpilotOnroadEvents", true, 1.000000, 1, 256000}}, - { "frogpilotPlan", {"frogpilotPlan", true, 20.000000, 10, 256000}}, - { "frogpilotRadarState", {"frogpilotRadarState", true, 20.000000, 5, 256000}}, - { "frogpilotSelfdriveState", {"frogpilotSelfdriveState", true, 100.000000, 10, 256000}}, + { "starpilotCarControl", {"starpilotCarControl", true, 100.000000, 10, 256000}}, + { "starpilotCarParams", {"starpilotCarParams", true, 0.020000, 1, 256000}}, + { "starpilotCarState", {"starpilotCarState", true, 100.000000, 10, 256000}}, + { "starpilotDeviceState", {"starpilotDeviceState", true, 2.000000, 1, 256000}}, + { "starpilotModelV2", {"starpilotModelV2", true, 20.000000, -1, 256000}}, + { "starpilotOnroadEvents", {"starpilotOnroadEvents", true, 1.000000, 1, 256000}}, + { "starpilotPlan", {"starpilotPlan", true, 20.000000, 10, 256000}}, + { "starpilotRadarState", {"starpilotRadarState", true, 20.000000, 5, 256000}}, + { "starpilotSelfdriveState", {"starpilotSelfdriveState", true, 100.000000, 10, 256000}}, { "mapdExtendedOut", {"mapdExtendedOut", true, 1.000000, 1, 2097152}}, { "mapdIn", {"mapdIn", true, 1.000000, 1, 2097152}}, { "mapdOut", {"mapdOut", true, 20.000000, 20, 2097152}}, diff --git a/cereal/services.py b/cereal/services.py index b5a0a1e5..0583f24d 100755 --- a/cereal/services.py +++ b/cereal/services.py @@ -103,16 +103,16 @@ _services: dict[str, tuple] = { "customReservedRawData1": (True, 0.), "customReservedRawData2": (True, 0.), - # FrogPilot variables - "frogpilotCarControl": (True, 100., 10), - "frogpilotCarParams": (True, 0.02, 1), - "frogpilotCarState": (True, 100., 10), - "frogpilotDeviceState": (True, 2., 1), - "frogpilotModelV2": (True, 20.), - "frogpilotOnroadEvents": (True, 1., 1), - "frogpilotPlan": (True, 20., 10), - "frogpilotRadarState": (True, 20., 5), - "frogpilotSelfdriveState": (True, 100., 10), + # StarPilot variables + "starpilotCarControl": (True, 100., 10), + "starpilotCarParams": (True, 0.02, 1), + "starpilotCarState": (True, 100., 10), + "starpilotDeviceState": (True, 2., 1), + "starpilotModelV2": (True, 20.), + "starpilotOnroadEvents": (True, 1., 1), + "starpilotPlan": (True, 20., 10), + "starpilotRadarState": (True, 20., 5), + "starpilotSelfdriveState": (True, 100., 10), "mapdExtendedOut": (True, 1., 1, QueueSize.MEDIUM), "mapdIn": (True, 1., 1, QueueSize.MEDIUM), "mapdOut": (True, 20., 20, QueueSize.MEDIUM), diff --git a/common/api.py b/common/api.py index c9e89a16..f2e5e61b 100644 --- a/common/api.py +++ b/common/api.py @@ -5,7 +5,7 @@ from datetime import datetime, timedelta, UTC from openpilot.system.hardware.hw import Paths from openpilot.system.version import get_version -from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server +from openpilot.starpilot.common.starpilot_utilities import use_konik_server API_HOST = os.getenv('API_HOST', f"https://api.{'konik.ai' if use_konik_server() else 'commadotai.com'}") diff --git a/common/clutil.cc b/common/clutil.cc index 2c919dd8..d6272021 100644 --- a/common/clutil.cc +++ b/common/clutil.cc @@ -70,7 +70,7 @@ std::string resolve_program_path(const char *path) { } // Recover from build-path-embedded absolute paths like "/work/selfdrive/...". - for (const char *marker : {"/selfdrive/", "/frogpilot/", "/common/"}) { + for (const char *marker : {"/selfdrive/", "/starpilot/", "/common/"}) { if (const size_t idx = resolved_path.find(marker); idx != std::string::npos) { const std::string candidate = basedir + "/" + resolved_path.substr(idx + 1); if (util::file_exists(candidate)) { diff --git a/common/constants.py b/common/constants.py index 55c23f75..b3cd45df 100644 --- a/common/constants.py +++ b/common/constants.py @@ -19,7 +19,7 @@ class CV: # Mass LB_TO_KG = 0.453592 - # FrogPilot variables + # StarPilot variables METER_TO_FOOT = 3.28084 FOOT_TO_METER = 1. / METER_TO_FOOT CM_TO_INCH = 1. / 2.54 diff --git a/common/libcommon.a b/common/libcommon.a index bff030421bcc4497311ff7d0dce7ce95defea8ab..c2ed2af59ec5a4bfe8a559dc56959cb5ade3188c 100644 GIT binary patch delta 128 zcmdlpS$)rB^@bM47N!>FEi9W>X$F@h76oMHq~Ywo9(&Tr39wWFEi9W>X}T5Vrw3%_h&Am-RExtepa8~{@dFOmQN diff --git a/common/params.cc b/common/params.cc index 5ce983f0..4ee1df69 100644 --- a/common/params.cc +++ b/common/params.cc @@ -94,7 +94,7 @@ private: Params::Params(const std::string &path, bool memory) { params_prefix = "/" + util::getenv("OPENPILOT_PREFIX", "d"); - // FrogPilot variables + // StarPilot variables std::string params_folder; if (memory) { params_folder = Path::shm_path() + "/params"; @@ -179,7 +179,7 @@ int Params::remove(const std::string &key) { FileLock file_lock(params_path + "/.lock"); int result = unlink(getParamPath(key).c_str()); - // FrogPilot variables + // StarPilot variables if (!cache_path.empty()) { unlink((cache_path + key).c_str()); } @@ -231,7 +231,7 @@ void Params::clearAll(ParamKeyFlag key_flag) { if (it == keys.end() || (it->second.flags & key_flag)) { unlink(getParamPath(de->d_name).c_str()); - // FrogPilot variables + // StarPilot variables if (!cache_path.empty()) { unlink((cache_path + de->d_name).c_str()); } @@ -261,7 +261,7 @@ void Params::asyncWriteThread() { } } -// FrogPilot variables +// StarPilot variables int Params::getTuningLevel(const std::string &key) { return keys[key].tuning_level; } diff --git a/common/params.h b/common/params.h index f3505683..79b2fca5 100644 --- a/common/params.h +++ b/common/params.h @@ -36,7 +36,7 @@ struct ParamKeyAttributes { ParamKeyType type; std::optional default_value = std::nullopt; - // FrogPilot variables + // StarPilot variables std::optional stock_value = std::nullopt; int tuning_level = 0; @@ -83,7 +83,7 @@ public: putNonBlocking(key, val ? "1" : "0"); } - // FrogPilot variables + // StarPilot variables int getInt(const std::string &key, bool block = false) { std::string value = get(key, block); return value.empty() ? 0 : std::stoi(value); @@ -122,6 +122,6 @@ private: std::future future; SafeQueue> queue; - // FrogPilot variables + // StarPilot variables std::string cache_path; }; diff --git a/common/params_keys.h b/common/params_keys.h index a0875512..c1358878 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -135,7 +135,7 @@ inline static std::unordered_map keys = { {"UptimeOnroad", {PERSISTENT, FLOAT, "0.0"}}, {"Version", {PERSISTENT, STRING}}, - // FrogPilot variables + // StarPilot variables {"AccelerationPath", {PERSISTENT, BOOL, "1", "0", 2}}, {"AccelerationProfile", {PERSISTENT, INT, "2", "0", 0}}, {"AdjacentLeadsUI", {PERSISTENT, BOOL, "1", "0", 3}}, @@ -261,12 +261,12 @@ inline static std::unordered_map keys = { {"ForceStops", {PERSISTENT, BOOL, "0", "0", 2}}, {"ForceTorqueController", {PERSISTENT, BOOL, "0", "0", 3}}, {"FPSCounter", {PERSISTENT, BOOL, "1", "0", 3}}, - {"FrogPilotApiToken", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, - {"FrogPilotCarParams", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BYTES, "", ""}}, - {"FrogPilotCarParamsPersistent", {PERSISTENT, BYTES, "", ""}}, - {"FrogPilotDongleId", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, - {"FrogPilotStats", {PERSISTENT | DONT_LOG, JSON, "{}", "{}"}}, - {"FrogPilotTogglesUpdated", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}}, + {"StarPilotApiToken", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, + {"StarPilotCarParams", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BYTES, "", ""}}, + {"StarPilotCarParamsPersistent", {PERSISTENT, BYTES, "", ""}}, + {"StarPilotDongleId", {PERSISTENT | DONT_LOG, STRING, "", "", 0}}, + {"StarPilotStats", {PERSISTENT | DONT_LOG, JSON, "{}", "{}"}}, + {"StarPilotTogglesUpdated", {CLEAR_ON_MANAGER_START, BOOL, "0", "0"}}, {"FrogsGoMoosTweak", {PERSISTENT, BOOL, "1", "0", 2}}, {"GoatScream", {PERSISTENT, BOOL, "0", "0", 1}}, {"GreenLightAlert", {PERSISTENT, BOOL, "0", "0", 0}}, diff --git a/common/params_pyx.cpp b/common/params_pyx.cpp index f9639f6d..de8240f1 100644 --- a/common/params_pyx.cpp +++ b/common/params_pyx.cpp @@ -6097,7 +6097,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com * def __cinit__(self, d="", *, memory=False, return_defaults=False): * cdef string path = d.encode() # <<<<<<<<<<<<<< * - * # FrogPilot variables + * # StarPilot variables */ __pyx_t_2 = __pyx_v_d; __Pyx_INCREF(__pyx_t_2); @@ -6115,7 +6115,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com /* "common/params_pyx.pyx":119 * - * # FrogPilot variables + * # StarPilot variables * cdef bool c_memory = memory # <<<<<<<<<<<<<< * * with nogil: @@ -6182,7 +6182,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com * self.p = new c_Params(path, c_memory) * self.d = d # <<<<<<<<<<<<<< * - * # FrogPilot variables + * # StarPilot variables */ __pyx_t_1 = __pyx_v_d; __Pyx_INCREF(__pyx_t_1); @@ -6195,7 +6195,7 @@ static int __pyx_pf_6common_10params_pyx_6Params___cinit__(struct __pyx_obj_6com /* "common/params_pyx.pyx":126 * - * # FrogPilot variables + * # StarPilot variables * self.m = memory # <<<<<<<<<<<<<< * * self.return_defaults = return_defaults or memory @@ -10127,7 +10127,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_38cpp2python(struct __pyx * cdef ParamKeyType t = self.p.getKeyType(k) * return self._cpp2python(t, value, None, key) # <<<<<<<<<<<<<< * - * # FrogPilot variables + * # StarPilot variables */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = ((PyObject *)__pyx_v_self); @@ -10170,7 +10170,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_38cpp2python(struct __pyx /* "common/params_pyx.pyx":245 * - * # FrogPilot variables + * # StarPilot variables * def get_key_flag(self, key): # <<<<<<<<<<<<<< * return self.p.getKeyFlag(self.check_key(key)) * @@ -10274,7 +10274,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_40get_key_flag(struct __p __Pyx_RefNannySetupContext("get_key_flag", 0); /* "common/params_pyx.pyx":246 - * # FrogPilot variables + * # StarPilot variables * def get_key_flag(self, key): * return self.p.getKeyFlag(self.check_key(key)) # <<<<<<<<<<<<<< * @@ -10301,7 +10301,7 @@ static PyObject *__pyx_pf_6common_10params_pyx_6Params_40get_key_flag(struct __p /* "common/params_pyx.pyx":245 * - * # FrogPilot variables + * # StarPilot variables * def get_key_flag(self, key): # <<<<<<<<<<<<<< * return self.p.getKeyFlag(self.check_key(key)) * @@ -12347,7 +12347,7 @@ __Pyx_RefNannySetupContext("PyInit_params_pyx", 0); /* "common/params_pyx.pyx":245 * - * # FrogPilot variables + * # StarPilot variables * def get_key_flag(self, key): # <<<<<<<<<<<<<< * return self.p.getKeyFlag(self.check_key(key)) * diff --git a/common/params_pyx.pyx b/common/params_pyx.pyx index 3cd8d9b1..9767b61e 100644 --- a/common/params_pyx.pyx +++ b/common/params_pyx.pyx @@ -20,7 +20,7 @@ cdef extern from "common/params.h": CLEAR_ON_IGNITION_ON ALL - # FrogPilot variables + # StarPilot variables DONT_LOG cpdef enum ParamKeyType: @@ -48,7 +48,7 @@ cdef extern from "common/params.h": void clearAll(ParamKeyFlag) vector[string] allKeys() - # FrogPilot variables + # StarPilot variables ParamKeyFlag getKeyFlag(string) nogil optional[string] getStockValue(string) nogil @@ -108,21 +108,21 @@ cdef class Params: cdef c_Params* p cdef str d - # FrogPilot variables + # StarPilot variables cdef bool m cdef bool return_defaults def __cinit__(self, d="", *, memory=False, return_defaults=False): cdef string path = d.encode() - # FrogPilot variables + # StarPilot variables cdef bool c_memory = memory with nogil: self.p = new c_Params(path, c_memory) self.d = d - # FrogPilot variables + # StarPilot variables self.m = memory self.return_defaults = return_defaults or memory @@ -241,7 +241,7 @@ cdef class Params: cdef ParamKeyType t = self.p.getKeyType(k) return self._cpp2python(t, value, None, key) - # FrogPilot variables + # StarPilot variables def get_key_flag(self, key): return self.p.getKeyFlag(self.check_key(key)) diff --git a/common/params_pyx.so b/common/params_pyx.so index 1f550526bf73e071850c90569d9345c55a41a4b3..8d4769c49303e5017a6734e5a191241f876ddd1b 100755 GIT binary patch delta 213 zcmaFxPw&A$y$v@QMGh>@h&lEx&WiO+o1CN9=hR0l**TlvFt)#81Yss1W(HywAZ7(( zHXvr-{)Ul5Uc5fIB(W$UGbg{qu^=-fKRY##0WRVUlu0Z~%q_+u6p&g}oLO9wnpc95 zbji<4&q?)6L5Kj2DnZg6lAjJ#P#jv2l30?O!r)evpWfaj$pOTiK+LthOOpHAQUJ6i BR09A2 delta 213 zcmaFxPw&A$y$v@QMM_u9D}SkYLZSKS1`)*zjqhDneoStD!`S|Y5rmn5m>Gy!fS47C z*?^dR`x{0MdGUI;qWtuL%$)oZ$AZj|{Or^`2DpfGVo^Y1QDSZ}7NLODqT comma 22 scripts/laptop_device_build.sh build-image ``` @@ -52,7 +52,7 @@ scripts/laptop_device_build.sh setup comma 22 ## Build device-compatible artifacts ```bash -cd /path/to/frogpilot +cd /path/to/starpilot scripts/laptop_device_build.sh build ``` diff --git a/frogpilot/controls/frogpilot_planner.py b/frogpilot/controls/frogpilot_planner.py deleted file mode 100644 index 312c212d..00000000 --- a/frogpilot/controls/frogpilot_planner.py +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env python3 -import json - -import cereal.messaging as messaging - -from openpilot.common.constants import CV -from openpilot.common.filter_simple import FirstOrderFilter -from openpilot.common.gps import get_gps_location_service -from openpilot.common.params import Params -from openpilot.common.realtime import DT_MDL -from openpilot.selfdrive.car.cruise import V_CRUISE_MAX, V_CRUISE_UNSET -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import A_CHANGE_COST, DANGER_ZONE_COST, J_EGO_COST, STOP_DISTANCE - -from openpilot.frogpilot.common.frogpilot_utilities import calculate_lane_width, calculate_road_curvature -from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, MINIMUM_LATERAL_ACCELERATION, PLANNER_TIME, THRESHOLD -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 -from openpilot.frogpilot.controls.lib.weather_checker import WeatherChecker - - -class FrogPilotPlanner: - def __init__(self, error_log, ThemeManager): - self.params = Params(return_defaults=True) - self.params_memory = Params(memory=True) - - self.frogpilot_acceleration = FrogPilotAcceleration(self) - self.frogpilot_cem = ConditionalExperimentalMode(self) - self.frogpilot_events = FrogPilotEvents(self, error_log, ThemeManager) - self.frogpilot_following = FrogPilotFollowing(self) - self.frogpilot_vcruise = FrogPilotVCruise(self) - self.frogpilot_weather = WeatherChecker(self) - - self.driving_in_curve = False - self.gps_valid = False - self.lateral_check = False - self.model_stopped = False - self.road_curvature_detected = False - self.tracking_lead = False - - self.lane_width_left = 0 - self.lane_width_right = 0 - self.lateral_acceleration = 0 - self.model_length = 0 - self.road_curvature = 0 - self.time_to_curve = 0 - self.v_cruise = 0 - - self.gps_position = None - - self.gps_location_service = get_gps_location_service(self.params) - - self.tracking_lead_filter = FirstOrderFilter(0, 0.5, DT_MDL) - - def shutdown(self): - self.frogpilot_vcruise.slc.executor.shutdown(wait=False, cancel_futures=True) - self.frogpilot_weather.executor.shutdown(wait=False, cancel_futures=True) - - def update(self, now, time_validated, sm, frogpilot_toggles): - self.lead_one = sm["radarState"].leadOne - - controls_enabled = sm["selfdriveState"].enabled - - v_cruise_kph = min(sm["carState"].vCruise, V_CRUISE_MAX) - if 0 < v_cruise_kph < V_CRUISE_UNSET and frogpilot_toggles.set_speed_offset > 0: - v_cruise_kph += frogpilot_toggles.set_speed_offset - v_cruise = v_cruise_kph * CV.KPH_TO_MS - v_ego = max(sm["carState"].vEgo, 0) - - if controls_enabled: - self.frogpilot_acceleration.update(v_ego, sm, frogpilot_toggles) - else: - self.frogpilot_acceleration.max_accel = 0 - self.frogpilot_acceleration.min_accel = 0 - - if controls_enabled and frogpilot_toggles.conditional_experimental_mode: - self.frogpilot_cem.update(v_ego, sm, frogpilot_toggles) - else: - self.frogpilot_cem.curve_detected = False - self.frogpilot_cem.stop_sign_and_light(v_ego, sm, PLANNER_TIME - 2) - - self.driving_in_curve = abs(self.lateral_acceleration) >= MINIMUM_LATERAL_ACCELERATION - - self.frogpilot_events.update(controls_enabled, v_cruise, sm, frogpilot_toggles) - - self.frogpilot_following.update(controls_enabled, v_ego, sm, frogpilot_toggles) - - gps_location = sm[self.gps_location_service] - self.gps_position = { - "latitude": gps_location.latitude, - "longitude": gps_location.longitude, - "bearing": gps_location.bearingDeg, - } - self.gps_valid = self.gps_position["latitude"] != 0 or self.gps_position["longitude"] != 0 - self.params_memory.put("LastGPSPosition", json.dumps(self.gps_position)) - - if v_ego >= frogpilot_toggles.minimum_lane_change_speed: - 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_acceleration = v_ego**2 * sm["controlsState"].curvature - - self.lateral_check = v_ego >= frogpilot_toggles.pause_lateral_below_speed - 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.lateral_check &= not sm["frogpilotCarState"].pauseLateral - - 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, self.time_to_curve = calculate_road_curvature(sm["modelV2"]) - - self.road_curvature_detected = (1 / abs(self.road_curvature))**0.5 < v_ego > CRUISING_SPEED and not (sm["carState"].leftBlinker or sm["carState"].rightBlinker) - - if not sm["carState"].standstill: - self.tracking_lead = self.update_lead_status(frogpilot_toggles.stop_distance) - - self.v_cruise = self.frogpilot_vcruise.update(controls_enabled, now, time_validated, v_cruise, v_ego, sm, frogpilot_toggles) - - if self.gps_valid and time_validated and frogpilot_toggles.weather_presets: - self.frogpilot_weather.update_weather(now, frogpilot_toggles) - else: - self.frogpilot_weather.weather_id = 0 - - def update_lead_status(self, stop_distance=STOP_DISTANCE): - following_lead = self.lead_one.status - following_lead &= self.lead_one.dRel < self.model_length + max(float(stop_distance), 4.0) - - self.tracking_lead_filter.update(following_lead) - return self.tracking_lead_filter.x >= THRESHOLD - - 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 - - frogpilotPlan.accelerationJerk = float(A_CHANGE_COST * self.frogpilot_following.acceleration_jerk) - frogpilotPlan.dangerFactor = float(self.frogpilot_following.danger_factor) - frogpilotPlan.dangerJerk = float(DANGER_ZONE_COST * self.frogpilot_following.danger_jerk) - frogpilotPlan.speedJerk = float(J_EGO_COST * self.frogpilot_following.speed_jerk) - frogpilotPlan.tFollow = float(self.frogpilot_following.t_follow) - - frogpilotPlan.cscControllingSpeed = self.frogpilot_vcruise.csc_controlling_speed - frogpilotPlan.cscSpeed = float(self.frogpilot_vcruise.csc_target) - frogpilotPlan.cscTraining = self.frogpilot_vcruise.csc.enable_training - - frogpilotPlan.desiredFollowDistance = int(self.frogpilot_following.desired_follow_distance) - frogpilotPlan.disableThrottle = self.frogpilot_following.disable_throttle - frogpilotPlan.trackingLead = self.tracking_lead - - frogpilotPlan.experimentalMode = self.frogpilot_cem.experimental_mode or self.frogpilot_vcruise.slc.experimental_mode - - frogpilotPlan.forcingStop = self.frogpilot_vcruise.forcing_stop - frogpilotPlan.forcingStopLength = self.frogpilot_vcruise.tracked_model_length - - frogpilotPlan.frogpilotEvents = self.frogpilot_events.events.to_msg() - - frogpilotPlan.frogpilotToggles = json.dumps(vars(frogpilot_toggles)) - - if sm["frogpilotCarState"].trafficModeEnabled: - frogpilotPlan.increasedStoppedDistance = 0 - else: - frogpilotPlan.increasedStoppedDistance = frogpilot_toggles.increase_stopped_distance - if self.frogpilot_weather.weather_id != 0: - frogpilotPlan.increasedStoppedDistance += self.frogpilot_weather.increase_stopped_distance - - frogpilotPlan.laneWidthLeft = self.lane_width_left - frogpilotPlan.laneWidthRight = self.lane_width_right - - frogpilotPlan.lateralCheck = self.lateral_check - - frogpilotPlan.maxAcceleration = float(self.frogpilot_acceleration.max_accel) - frogpilotPlan.minAcceleration = float(self.frogpilot_acceleration.min_accel) - - frogpilotPlan.redLight = self.frogpilot_cem.stop_light_detected - - frogpilotPlan.roadCurvature = self.road_curvature - - frogpilotPlan.slcMapSpeedLimit = self.frogpilot_vcruise.slc.map_speed_limit - 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_timer > DT_MDL - frogpilotPlan.unconfirmedSlcSpeedLimit = self.frogpilot_vcruise.slc.unconfirmed_speed_limit - - frogpilotPlan.themeUpdated = theme_updated - - frogpilotPlan.vCruise = float(self.v_cruise) - - frogpilotPlan.weatherDaytime = self.frogpilot_weather.is_daytime - frogpilotPlan.weatherId = self.frogpilot_weather.weather_id - - pm.send("frogpilotPlan", frogpilot_plan_send) diff --git a/frogpilot/system/frogpilot_tracking.py b/frogpilot/system/frogpilot_tracking.py deleted file mode 100644 index 5ba913e3..00000000 --- a/frogpilot/system/frogpilot_tracking.py +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env python3 -from openpilot.common.constants import CV -from openpilot.common.realtime import DT_MDL -from openpilot.selfdrive.car.cruise import V_CRUISE_MAX -from openpilot.selfdrive.selfdrived.events import FROGPILOT_EVENT_NAME -from openpilot.selfdrive.selfdrived.selfdrived import LONGITUDINAL_PERSONALITY_MAP, State -from openpilot.selfdrive.selfdrived.state import ACTIVE_STATES -from openpilot.selfdrive.ui.soundd import FrogPilotAudibleAlert - -from openpilot.frogpilot.common.frogpilot_utilities import clean_model_name -from openpilot.frogpilot.controls.lib.frogpilot_events import RANDOM_EVENT_END, RANDOM_EVENT_START -from openpilot.frogpilot.controls.lib.weather_checker import WEATHER_CATEGORIES - -class FrogPilotTracking: - def __init__(self, frogpilot_planner, frogpilot_toggles): - self.params = frogpilot_planner.params - - self.frogpilot_events = frogpilot_planner.frogpilot_events - self.frogpilot_weather = frogpilot_planner.frogpilot_weather - - self.frogpilot_stats = self.params.get("FrogPilotStats") - self.frogpilot_stats.pop("CurrentMonthsKilometers", None) - self.frogpilot_stats.pop("ResetStats", None) - - self.drive_added = False - self.previously_enabled = False - - self.distance_since_override = 0 - self.tracked_time = 0 - - self.previous_random_events = set() - - self.previous_alert = None - self.previous_sound = FrogPilotAudibleAlert.none - self.previous_state = State.disabled - - self.model_name = clean_model_name(frogpilot_toggles.model_name) - - def update(self, now, time_validated, sm, frogpilot_toggles): - v_cruise = min(sm["carState"].vCruiseCluster, V_CRUISE_MAX) * CV.KPH_TO_MS - v_ego = max(sm["carState"].vEgo, 0) - - distance_driven = v_ego * DT_MDL - self.previously_enabled |= sm["selfdriveState"].enabled or sm["frogpilotCarState"].alwaysOnLateralEnabled - self.tracked_time += DT_MDL - - if sm["selfdriveState"].alertType not in (self.previous_alert, ""): - alert_name = sm["selfdriveState"].alertType.split('/')[0] - total_events = self.frogpilot_stats.get("TotalEvents", {}) - total_events[alert_name] = total_events.get(alert_name, 0) + 1 - self.frogpilot_stats["TotalEvents"] = total_events - self.previous_alert = sm["selfdriveState"].alertType - - if sm["selfdriveState"].enabled: - key = str(round(v_cruise, 2)) - total_cruise_speed_times = self.frogpilot_stats.get("CruiseSpeedTimes", {}) - total_cruise_speed_times[key] = total_cruise_speed_times.get(key, 0) + DT_MDL - self.frogpilot_stats["CruiseSpeedTimes"] = total_cruise_speed_times - - self.frogpilot_stats["CurrentMonthsMeters"] = self.frogpilot_stats.get("CurrentMonthsMeters", 0) + distance_driven - - if self.frogpilot_weather.sunrise != 0 and self.frogpilot_weather.sunset != 0: - if self.frogpilot_weather.is_daytime: - self.frogpilot_stats["DayTime"] = self.frogpilot_stats.get("DayTime", 0) + DT_MDL - else: - self.frogpilot_stats["NightTime"] = self.frogpilot_stats.get("NightTime", 0) + DT_MDL - - if sm["selfdriveState"].state != self.previous_state: - if sm["selfdriveState"].state in ACTIVE_STATES and self.previous_state not in ACTIVE_STATES: - self.frogpilot_stats["Engages"] = self.frogpilot_stats.get("Engages", 0) + 1 - if frogpilot_toggles.sound_pack == "frog": - self.frogpilot_stats["FrogChirps"] = self.frogpilot_stats.get("FrogChirps", 0) + 1 - - elif sm["selfdriveState"].state == State.disabled and self.previous_state in ACTIVE_STATES: - self.frogpilot_stats["Disengages"] = self.frogpilot_stats.get("Disengages", 0) + 1 - if frogpilot_toggles.sound_pack == "frog": - self.frogpilot_stats["FrogSqueaks"] = self.frogpilot_stats.get("FrogSqueaks", 0) + 1 - - if sm["selfdriveState"].state == State.overriding and self.previous_state != State.overriding: - self.frogpilot_stats["Overrides"] = self.frogpilot_stats.get("Overrides", 0) + 1 - - self.previous_state = sm["selfdriveState"].state - - if sm["selfdriveState"].experimentalMode: - self.frogpilot_stats["ExperimentalModeTime"] = self.frogpilot_stats.get("ExperimentalModeTime", 0) + DT_MDL - - self.frogpilot_stats["FrogPilotMeters"] = self.frogpilot_stats.get("FrogPilotMeters", 0) + distance_driven - - if sm["frogpilotSelfdriveState"].alertSound != self.previous_sound: - if sm["frogpilotSelfdriveState"].alertSound == FrogPilotAudibleAlert.goat: - self.frogpilot_stats["GoatScreams"] = self.frogpilot_stats.get("GoatScreams", 0) + 1 - - self.previous_sound = sm["frogpilotSelfdriveState"].alertSound - - self.frogpilot_stats["MaxAcceleration"] = max(self.frogpilot_events.max_acceleration, self.frogpilot_stats.get("MaxAcceleration", 0)) - - if sm["carControl"].latActive: - self.frogpilot_stats["LateralTime"] = self.frogpilot_stats.get("LateralTime", 0) + DT_MDL - if sm["carControl"].longActive: - self.frogpilot_stats["LongitudinalTime"] = self.frogpilot_stats.get("LongitudinalTime", 0) + DT_MDL - - personality_name = LONGITUDINAL_PERSONALITY_MAP.get(sm["selfdriveState"].personality, "Unknown").capitalize() - total_personality_times = self.frogpilot_stats.get("PersonalityTimes", {}) - total_personality_times[personality_name] = total_personality_times.get(personality_name, 0) + DT_MDL - self.frogpilot_stats["PersonalityTimes"] = total_personality_times - elif sm["frogpilotCarState"].alwaysOnLateralEnabled: - self.frogpilot_stats["AOLTime"] = self.frogpilot_stats.get("AOLTime", 0) + DT_MDL - - if sm["selfdriveState"].state in (State.disabled, State.overriding): - self.distance_since_override = 0 - self.frogpilot_stats["OverrideTime"] = self.frogpilot_stats.get("OverrideTime", 0) + DT_MDL - else: - self.distance_since_override += distance_driven - self.frogpilot_stats["LongestDistanceWithoutOverride"] = max(self.distance_since_override, self.frogpilot_stats.get("LongestDistanceWithoutOverride", 0)) - - current_random_events = {event for event in self.frogpilot_events.events.names if RANDOM_EVENT_START <= event <= RANDOM_EVENT_END} - if len(current_random_events) > 0: - new_events = current_random_events - self.previous_random_events - if new_events: - total_random_events = self.frogpilot_stats.get("RandomEvents", {}) - for event in new_events: - event_name = FROGPILOT_EVENT_NAME[event] - total_random_events[event_name] = total_random_events.get(event_name, 0) + 1 - self.frogpilot_stats["RandomEvents"] = total_random_events - - self.previous_random_events = current_random_events - - if sm["carState"].standstill: - self.frogpilot_stats["StandstillTime"] = self.frogpilot_stats.get("StandstillTime", 0) + DT_MDL - if self.frogpilot_events.stopped_for_light: - self.frogpilot_stats["StopLightTime"] = self.frogpilot_stats.get("StopLightTime", 0) + DT_MDL - - weather_api_calls = self.frogpilot_stats.get("WeatherAPICalls", {}) - weather_api_calls["2.5"] = weather_api_calls.get("2.5", 0) + self.frogpilot_weather.api_25_calls - weather_api_calls["3.0"] = weather_api_calls.get("3.0", 0) + self.frogpilot_weather.api_3_calls - self.frogpilot_stats["WeatherAPICalls"] = weather_api_calls - - self.frogpilot_weather.api_25_calls = 0 - self.frogpilot_weather.api_3_calls = 0 - - suffix = "unknown" - for category in WEATHER_CATEGORIES.values(): - if any(start <= self.frogpilot_weather.weather_id <= end for start, end in category["ranges"]): - suffix = category["suffix"] - break - - weather_times = self.frogpilot_stats.get("WeatherTimes", {}) - weather_times[suffix] = weather_times.get(suffix, 0) + DT_MDL - self.frogpilot_stats["WeatherTimes"] = weather_times - - if self.tracked_time >= 60 and sm["carState"].standstill and self.previously_enabled: - if time_validated: - current_month = now.month - if current_month != self.frogpilot_stats.get("Month"): - self.frogpilot_stats.update({ - "CurrentMonthsMeters": 0, - "Month": current_month - }) - - self.frogpilot_stats["FrogPilotSeconds"] = self.frogpilot_stats.get("FrogPilotSeconds", 0) + self.tracked_time - - current_model = self.model_name - total_model_times = self.frogpilot_stats.get("ModelTimes", {}) - total_model_times[current_model] = total_model_times.get(current_model, 0) + self.tracked_time - self.frogpilot_stats["ModelTimes"] = total_model_times - - self.frogpilot_stats["TrackedTime"] = self.frogpilot_stats.get("TrackedTime", 0) + self.tracked_time - - self.tracked_time = 0 - - if not self.drive_added: - self.frogpilot_stats["FrogPilotDrives"] = self.frogpilot_stats.get("FrogPilotDrives", 0) + 1 - self.drive_added = True - - self.params.put_nonblocking("FrogPilotStats", dict(sorted(self.frogpilot_stats.items()))) diff --git a/frogpilot/ui/qt/offroad/data_settings.h b/frogpilot/ui/qt/offroad/data_settings.h deleted file mode 100644 index 9b13d009..00000000 --- a/frogpilot/ui/qt/offroad/data_settings.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" - -class FrogPilotDataPanel : public FrogPilotListWidget { - Q_OBJECT - -public: - explicit FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); - -signals: - void openSubPanel(); - -private: - void updateStatsLabels(FrogPilotListWidget *labelsList); - - bool forceOpenDescriptions; - bool isMetric; - - FrogPilotSettingsWindow *parent; - - Params params; -}; diff --git a/frogpilot/ui/qt/offroad/utilities.cc b/frogpilot/ui/qt/offroad/utilities.cc deleted file mode 100644 index 126de9d6..00000000 --- a/frogpilot/ui/qt/offroad/utilities.cc +++ /dev/null @@ -1,369 +0,0 @@ -#include "frogpilot/ui/qt/offroad/utilities.h" - -FrogPilotUtilitiesPanel::FrogPilotUtilitiesPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { - networkManager = new QNetworkAccessManager(this); - pairingPollTimer = new QTimer(this); - - forceOpenDescriptions = forceOpen; - - ParamControl *debugModeToggle = new ParamControl("DebugMode", tr("Debug Mode"), tr("Use all of FrogPilot's developer metrics on your next drive to diagnose issues and improve bug reports."), ""); - if (forceOpenDescriptions) { - debugModeToggle->showDescription(); - } - addItem(debugModeToggle); - - ButtonControl *flashPandaButton = new ButtonControl(tr("Flash Panda"), tr("FLASH"), tr("Flash the latest, official firmware onto your Panda device to restore core functionality, fix bugs, or ensure you have the most up-to-date software.")); - QObject::connect(flashPandaButton, &ButtonControl::clicked, [parent, flashPandaButton, this]() { - if (ConfirmationDialog::confirm(tr("Are you sure you want to flash the Panda firmware?"), tr("Flash"), this)) { - std::thread([parent, flashPandaButton, this]() { - parent->keepScreenOn = true; - - flashPandaButton->setEnabled(false); - flashPandaButton->setValue(tr("Flashing...")); - - params_memory.putBool("FlashPanda", true); - while (params_memory.getBool("FlashPanda")) { - util::sleep_for(UI_FREQ); - } - - flashPandaButton->setValue(tr("Flashed!")); - - util::sleep_for(2500); - - flashPandaButton->setValue(tr("Rebooting...")); - - util::sleep_for(2500); - - Hardware::reboot(); - }).detach(); - } - }); - if (forceOpenDescriptions) { - flashPandaButton->showDescription(); - } - addItem(flashPandaButton); - - FrogPilotButtonsControl *forceStartedButton = new FrogPilotButtonsControl(tr("Force Drive State"), tr("Force openpilot to be offroad or onroad."), "", {tr("OFFROAD"), tr("ONROAD"), tr("OFF")}, true); - QObject::connect(forceStartedButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { - if (id == 0) { - params.putBool("ForceOffroad", true); - params.putBool("ForceOnroad", false); - - updateFrogPilotToggles(); - } else if (id == 1) { - params.put("CarParams", params.get("CarParamsPersistent")); - params.put("FrogPilotCarParams", params.get("FrogPilotCarParamsPersistent")); - - params.putBool("ForceOffroad", false); - params.putBool("ForceOnroad", true); - - updateFrogPilotToggles(); - } else if (id == 2) { - params.putBool("ForceOffroad", false); - params.putBool("ForceOnroad", false); - - updateFrogPilotToggles(); - } - }); - forceStartedButton->setCheckedButton(2); - if (forceOpenDescriptions) { - forceStartedButton->showDescription(); - } - addItem(forceStartedButton); - - bool paired = params.getBool("PondPaired"); - pondButton = new ButtonControl( - tr("Pair to \"The Pond\""), - paired ? tr("UNPAIR") : tr("PAIR"), - tr("Pair this device with your frogpilot.com account to remotely manage settings from anywhere.") - ); - QObject::connect(pondButton, &ButtonControl::clicked, [this]() { - if (!frogpilotUIState()->frogpilot_scene.online) { - ConfirmationDialog::alert(tr("Please connect to the internet first!"), this); - return; - } - - bool isPaired = params.getBool("PondPaired"); - - if (isPaired && !ConfirmationDialog::confirm(tr("Are you sure you want to unpair from \"The Pond\"?"), tr("Unpair"), this)) { - return; - } - - pondButton->setEnabled(false); - pondButton->setValue(isPaired ? tr("Unpairing...") : tr("Requesting code...")); - - QJsonObject payload; - payload["api_token"] = QString::fromStdString(params.get("FrogPilotApiToken")); - payload["device"] = QString::fromStdString(Hardware::get_name()).trimmed().remove(QChar('\0')); - payload["frogpilot_dongle_id"] = QString::fromStdString(params.get("FrogPilotDongleId")); - - QString buildMetadataStr = QString::fromStdString(params.get("BuildMetadata")); - if (!buildMetadataStr.isEmpty()) { - QJsonDocument bmDoc = QJsonDocument::fromJson(buildMetadataStr.toUtf8()); - if (!bmDoc.isNull()) { - payload["build_metadata"] = bmDoc.object(); - } - } - - QNetworkRequest request(QUrl(QString("https://www.frogpilot.com/api/pond/pair/") + (isPaired ? "unpair" : "request"))); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - request.setRawHeader("User-Agent", "frogpilot-api/1.0"); - - QByteArray postData = QJsonDocument(payload).toJson(QJsonDocument::Compact); - - QNetworkReply *reply = networkManager->post(request, postData); - QObject::connect(reply, &QNetworkReply::finished, [this, reply, isPaired, payload]() { - QByteArray responseBody = reply->readAll(); - - reply->deleteLater(); - - pondButton->setEnabled(true); - pondButton->setValue(""); - - if (reply->error() != QNetworkReply::NoError) { - QString errorDetail; - QString serverError = QJsonDocument::fromJson(responseBody).object().value("error").toString(); - - int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - if (statusCode == 401) { - errorDetail = tr("Authentication failed. Please restart your device."); - } else if (statusCode == 403) { - errorDetail = serverError.contains("build", Qt::CaseInsensitive) - ? tr("Unofficial or modified build detected.") - : tr("Access denied: %1").arg(serverError); - } else if (statusCode == 429) { - errorDetail = tr("Too many attempts. Please wait and try again."); - } else if (statusCode == 503) { - errorDetail = tr("Server is temporarily unavailable. Please try again later."); - } else if (statusCode > 0) { - errorDetail = tr("Server error (%1): %2").arg(statusCode).arg(serverError.isEmpty() ? tr("Unknown error") : serverError); - } else { - errorDetail = tr("Network error: %1").arg(reply->errorString()); - } - - if (isPaired) { - pondButton->setValue(tr("Failed to unpair")); - - QTimer::singleShot(2500, [this]() { - pondButton->setValue(""); - }); - } else { - ConfirmationDialog::alert(tr("Failed to get pairing code.\n\n%1").arg(errorDetail), this); - } - return; - } - - if (isPaired) { - params.putBool("PondPaired", false); - - pondButton->setText(tr("PAIR")); - pondButton->setValue(tr("Unpaired!")); - - QTimer::singleShot(2500, [this]() { - pondButton->setValue(""); - }); - return; - } - - QString code = QJsonDocument::fromJson(responseBody).object().value("code").toString(); - if (code.isEmpty()) { - ConfirmationDialog::alert(tr("Failed to get pairing code. Please try again."), this); - return; - } - - pondButton->setValue(tr("Code: %1").arg(code)); - - ConfirmationDialog::alert(tr("Go to \"frogpilot.com/the_pond\" and enter this code: %1").arg(code), this); - - QString dongleId = payload["frogpilot_dongle_id"].toString(); - QString apiToken = payload["api_token"].toString(); - - pairingPollTimer->disconnect(); - - int pollCount = 0; - QObject::connect(pairingPollTimer, &QTimer::timeout, [this, code, dongleId, apiToken, pollCount]() mutable { - if (++pollCount > 200) { - pairingPollTimer->stop(); - - pondButton->setValue(tr("Code expired")); - - QTimer::singleShot(2500, [this]() { - pondButton->setValue(""); - }); - return; - } - - QNetworkRequest statusRequest{QUrl(QString("https://www.frogpilot.com/api/pond/pair/status?code=%1&dongle_id=%2&api_token=%3").arg(code, dongleId, apiToken))}; - statusRequest.setRawHeader("User-Agent", "frogpilot-api/1.0"); - - QNetworkReply *statusReply = networkManager->get(statusRequest); - QObject::connect(statusReply, &QNetworkReply::finished, [this, statusReply]() { - statusReply->deleteLater(); - if (statusReply->error() != QNetworkReply::NoError) { - return; - } - - QString status = QJsonDocument::fromJson(statusReply->readAll()).object().value("status").toString(); - if (status == "paired") { - pairingPollTimer->stop(); - - params.putBool("PondPaired", true); - - pondButton->setText(tr("UNPAIR")); - pondButton->setValue(tr("Paired!")); - - ConfirmationDialog::alert(tr("Device successfully paired to \"The Pond\"!"), this); - - QTimer::singleShot(2500, [this]() { - pondButton->setValue(""); - }); - } else if (status == "expired") { - pairingPollTimer->stop(); - - pondButton->setValue(tr("Code expired")); - - QTimer::singleShot(2500, [this]() { - pondButton->setValue(""); - }); - } - }); - }); - - pairingPollTimer->start(3000); - }); - }); - if (forceOpenDescriptions) { - pondButton->showDescription(); - } - addItem(pondButton); - pondButton->setVisible(true); - - ButtonControl *reportIssueButton = new ButtonControl(tr("Report a Bug or an Issue"), tr("REPORT"), tr("Send a bug report so we can help fix the problem!")); - QObject::connect(reportIssueButton, &ButtonControl::clicked, [this]() { - if (!frogpilotUIState()->frogpilot_scene.online) { - ConfirmationDialog::alert(tr("Please connect to the internet before sending a report!"), this); - return; - } - - QStringList report_messages = { - tr("Acceleration feels harsh or jerky"), - tr("An alert was unclear and I'm not sure what it meant"), - tr("Braking is too sudden or uncomfortable"), - tr("I'm not sure if this is normal or a bug:"), - tr("My steering wheel buttons aren't working"), - tr("openpilot disengages when I don't expect it"), - tr("openpilot feels sluggish or slow to respond"), - tr("Something else (please describe)") - }; - - if (QFile::exists("/data/error_logs/error.txt")) { - report_messages.prepend(tr("I saw an alert that said \"openpilot crashed\"")); - } - - QString selected_issue = MultiOptionDialog::getSelection(tr("What's going on?"), report_messages, "", this); - if (selected_issue.isEmpty()) { - return; - } - - if (selected_issue.contains("crashed") || selected_issue.contains("not sure") || selected_issue.contains("Something else")) { - QString extra_input = InputDialog::getText(tr("Please describe what's happening"), this, tr("Send Report"), false, 10, "", 300).trimmed(); - if (extra_input.isEmpty()) { - return; - } - selected_issue += " — " + extra_input; - } - - QString discord_user = InputDialog::getText(tr("What's your Discord username?"), this, tr("Send Report"), false, -1, QString::fromStdString(params.get("DiscordUsername"))).trimmed(); - - QJsonObject reportData; - reportData["DiscordUser"] = discord_user; - reportData["Issue"] = selected_issue; - - params.putNonBlocking("DiscordUsername", discord_user.toStdString()); - params_memory.put("IssueReported", QJsonDocument(reportData).toJson(QJsonDocument::Compact).toStdString()); - - ConfirmationDialog::alert(tr("Report Sent! Thanks for letting us know!"), this); - }); - if (forceOpenDescriptions) { - reportIssueButton->showDescription(); - } - addItem(reportIssueButton); - reportIssueButton->setVisible(true); - - ButtonControl *resetTogglesButton = new ButtonControl(tr("Reset Toggles to Default"), tr("RESET"), tr("Reset all toggles to their default values.")); - QObject::connect(resetTogglesButton, &ButtonControl::clicked, [parent, resetTogglesButton, this]() { - if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all toggles to their default values?"), tr("Reset"), this)) { - std::thread([parent, resetTogglesButton, this]() { - parent->keepScreenOn = true; - - resetTogglesButton->setEnabled(false); - resetTogglesButton->setValue(tr("Resetting...")); - - std::vector all_keys = params.allKeys(); - for (const std::string &key : all_keys) { - if (excluded_keys.count(key)) { - continue; - } - std::optional default_value = params.getKeyDefaultValue(key); - if (default_value.has_value()) { - params.put(key, default_value.value()); - } - } - - updateFrogPilotToggles(); - - resetTogglesButton->setValue(tr("Reset!")); - - util::sleep_for(2500); - - resetTogglesButton->setValue(""); - }).detach(); - } - }); - if (forceOpenDescriptions) { - resetTogglesButton->showDescription(); - } - addItem(resetTogglesButton); - - ButtonControl *resetTogglesButtonStock = new ButtonControl(tr("Reset Toggles to Stock openpilot"), tr("RESET"), tr("Reset all toggles to match stock openpilot.")); - QObject::connect(resetTogglesButtonStock, &ButtonControl::clicked, [parent, resetTogglesButtonStock, this]() { - if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all toggles to match stock openpilot?"), tr("Reset"), this)) { - std::thread([parent, resetTogglesButtonStock, this]() { - parent->keepScreenOn = true; - - resetTogglesButtonStock->setEnabled(false); - resetTogglesButtonStock->setValue(tr("Resetting...")); - - std::vector all_keys = params.allKeys(); - for (const std::string &key : all_keys) { - if (excluded_keys.count(key)) { - continue; - } - std::optional stock_value = params.getStockValue(key); - if (stock_value.has_value()) { - params.put(key, stock_value.value()); - } - } - - updateFrogPilotToggles(); - - resetTogglesButtonStock->setValue(tr("Reset!")); - - util::sleep_for(2500); - - resetTogglesButtonStock->setValue(""); - }).detach(); - } - }); - if (forceOpenDescriptions) { - resetTogglesButtonStock->showDescription(); - } - addItem(resetTogglesButtonStock); -} - -void FrogPilotUtilitiesPanel::showEvent(QShowEvent *event) { - FrogPilotListWidget::showEvent(event); - - bool isPaired = params.getBool("PondPaired"); - pondButton->setText(isPaired ? tr("UNPAIR") : tr("PAIR")); -} diff --git a/frogpilot/ui/qt/offroad/utilities.h b/frogpilot/ui/qt/offroad/utilities.h deleted file mode 100644 index 646ecd14..00000000 --- a/frogpilot/ui/qt/offroad/utilities.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" - -class FrogPilotUtilitiesPanel : public FrogPilotListWidget { - Q_OBJECT - -public: - explicit FrogPilotUtilitiesPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); - -protected: - void showEvent(QShowEvent *event) override; - -private: - bool forceOpenDescriptions; - - ButtonControl *pondButton; - - FrogPilotSettingsWindow *parent; - - Params params; - Params params_memory{"", true}; - - QNetworkAccessManager *networkManager; - - QTimer *pairingPollTimer; - - std::set excluded_keys = { - "AvailableModels", "AvailableModelNames", "FrogPilotStats", - "GithubSshKeys", "GithubUsername", "MapBoxRequests", - "ModelDrivesAndScores", "OverpassRequests", "SpeedLimits", - "SpeedLimitsFiltered", "UpdaterAvailableBranches", - }; -}; diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh index 1cda1786..81f91610 100755 --- a/launch_chffrplus.sh +++ b/launch_chffrplus.sh @@ -30,7 +30,7 @@ function agnos_init { sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0 sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0 - # FrogPilot variables + # StarPilot variables sudo chmod 0777 /cache # Check if AGNOS update is required @@ -85,7 +85,7 @@ function launch { # handle pythonpath ln -sfn $(pwd) /data/pythonpath export BASEDIR="$DIR" - export PYTHONPATH="$DIR/frogpilot/third_party:$PWD" + export PYTHONPATH="$DIR/starpilot/third_party:$PWD" # hardware specific init if [ -f /AGNOS ]; then diff --git a/launch_env.sh b/launch_env.sh index e00044f6..e14348c7 100755 --- a/launch_env.sh +++ b/launch_env.sh @@ -26,7 +26,7 @@ fi export STAGING_ROOT="/data/safe_staging" -# FrogPilot variables (only available after StarPilot is installed to /data/openpilot) -if [ -x /data/openpilot/frogpilot/system/environment_variables ]; then - eval "$(/data/openpilot/frogpilot/system/environment_variables)" +# StarPilot variables (only available after StarPilot is installed to /data/openpilot) +if [ -x /data/openpilot/starpilot/system/environment_variables ]; then + eval "$(/data/openpilot/starpilot/system/environment_variables)" fi diff --git a/opendbc_repo/opendbc/car/body/carcontroller.py b/opendbc_repo/opendbc/car/body/carcontroller.py index bcdf10ae..40b0f064 100644 --- a/opendbc_repo/opendbc/car/body/carcontroller.py +++ b/opendbc_repo/opendbc/car/body/carcontroller.py @@ -34,7 +34,7 @@ class CarController(CarControllerBase): torque -= deadband return torque - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): torque_l = 0 torque_r = 0 diff --git a/opendbc_repo/opendbc/car/body/carstate.py b/opendbc_repo/opendbc/car/body/carstate.py index d6912a2c..bf8c5e0d 100644 --- a/opendbc_repo/opendbc/car/body/carstate.py +++ b/opendbc_repo/opendbc/car/body/carstate.py @@ -6,7 +6,7 @@ from opendbc.car.body.values import DBC class CarState(CarStateBase): - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.main] ret = structs.CarState() @@ -29,8 +29,8 @@ class CarState(CarStateBase): ret.cruiseState.enabled = True ret.cruiseState.available = True - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/car_helpers.py b/opendbc_repo/opendbc/car/car_helpers.py index f2be02dc..91041e1c 100644 --- a/opendbc_repo/opendbc/car/car_helpers.py +++ b/opendbc_repo/opendbc/car/car_helpers.py @@ -11,15 +11,15 @@ from opendbc.car.structs import CarParams, CarParamsT from opendbc.car.fingerprints import eliminate_incompatible_cars, all_legacy_fingerprint_cars from opendbc.car.fw_versions import ObdCallback, get_fw_versions_ordered, get_present_ecus, match_fw_to_car from opendbc.car.mock.values import CAR as MOCK -from opendbc.car.toyota.values import ToyotaFrogPilotFlags +from opendbc.car.toyota.values import ToyotaStarPilotFlags from opendbc.car.values import BRANDS from opendbc.car.vin import get_vin, is_valid_vin, VIN_UNKNOWN from openpilot.common.params import Params FRAME_FINGERPRINT = 100 # 1s -# FrogPilot variables -FrogPilotCarParams = custom.FrogPilotCarParams +# StarPilot variables +StarPilotCarParams = custom.StarPilotCarParams def load_interfaces(brand_names): @@ -212,15 +212,15 @@ def fingerprint(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_mu def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multiplexing: ObdCallback, alpha_long_allowed: bool, - is_release: bool, params: Params, num_pandas: int = 1, cached_params: CarParamsT | None = None, frogpilot_toggles: SimpleNamespace = None): + is_release: bool, params: Params, num_pandas: int = 1, cached_params: CarParamsT | None = None, starpilot_toggles: SimpleNamespace = None): candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(can_recv, can_send, set_obd_multiplexing, num_pandas, cached_params) candidate = _normalize_gm_bolt_candidate(candidate, fingerprints) candidate = _normalize_forced_candidate(candidate) fingerprinted_candidate = candidate - if candidate is None or frogpilot_toggles.force_fingerprint: - if frogpilot_toggles.force_fingerprint: - forced_candidate = _normalize_forced_candidate(frogpilot_toggles.car_model) + if candidate is None or starpilot_toggles.force_fingerprint: + if starpilot_toggles.force_fingerprint: + forced_candidate = _normalize_forced_candidate(starpilot_toggles.car_model) candidate = forced_candidate if candidate not in interfaces and fingerprinted_candidate in interfaces: carlog.error({ @@ -236,7 +236,7 @@ def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multip params.put_nonblocking("CarMake", candidate.split('_')[0].title()) params.put_nonblocking("CarModel", str(candidate)) - if frogpilot_toggles.block_user: + if starpilot_toggles.block_user: candidate = "MOCK" # Legacy branch migration guard: normalize stale platform names from any source @@ -251,20 +251,20 @@ def get_car(can_recv: CanRecvCallable, can_send: CanSendCallable, set_obd_multip candidate = fingerprinted_candidate CarInterface = interfaces[candidate] - CP: CarParams = CarInterface.get_params(candidate, fingerprints, car_fw, alpha_long_allowed, is_release, docs=False, frogpilot_toggles=frogpilot_toggles) + CP: CarParams = CarInterface.get_params(candidate, fingerprints, car_fw, alpha_long_allowed, is_release, docs=False, starpilot_toggles=starpilot_toggles) CP.carVin = vin CP.carFw = car_fw CP.fingerprintSource = source CP.fuzzyFingerprint = not exact_match - # FrogPilot variables - FPCP: FrogPilotCarParams = CarInterface.get_frogpilot_params(candidate, fingerprints, car_fw, CP, frogpilot_toggles) + # StarPilot variables + FPCP: StarPilotCarParams = CarInterface.get_starpilot_params(candidate, fingerprints, car_fw, CP, starpilot_toggles) - if CP.brand == "toyota" and FPCP.flags & ToyotaFrogPilotFlags.SMART_DSU.value: + if CP.brand == "toyota" and FPCP.flags & ToyotaStarPilotFlags.SMART_DSU.value: CP.minEnableSpeed = -1 CP.openpilotLongitudinalControl = True - if not CP.alphaLongitudinalAvailable and frogpilot_toggles.disable_openpilot_long: + if not CP.alphaLongitudinalAvailable and starpilot_toggles.disable_openpilot_long: CP.openpilotLongitudinalControl = False FPCP.openpilotLongitudinalControlDisabled = True diff --git a/opendbc_repo/opendbc/car/chrysler/carcontroller.py b/opendbc_repo/opendbc/car/chrysler/carcontroller.py index 3078124a..a616daf9 100644 --- a/opendbc_repo/opendbc/car/chrysler/carcontroller.py +++ b/opendbc_repo/opendbc/car/chrysler/carcontroller.py @@ -19,7 +19,7 @@ class CarController(CarControllerBase): self.packer = CANPacker(dbc_names[Bus.pt]) self.params = CarControllerParams(CP) - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): can_sends = [] lkas_active = CC.latActive and self.lkas_control_bit_prev diff --git a/opendbc_repo/opendbc/car/chrysler/carstate.py b/opendbc_repo/opendbc/car/chrysler/carstate.py index 86cc6a93..60e1ca07 100644 --- a/opendbc_repo/opendbc/car/chrysler/carstate.py +++ b/opendbc_repo/opendbc/car/chrysler/carstate.py @@ -1,7 +1,7 @@ from cereal import custom from opendbc.can import CANDefine, CANParser from opendbc.car import Bus, create_button_events, structs -from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS, ChryslerFrogPilotFlags +from opendbc.car.chrysler.values import DBC, STEER_THRESHOLD, RAM_CARS, ChryslerStarPilotFlags from opendbc.car.common.conversions import Conversions as CV from opendbc.car.interfaces import CarStateBase @@ -26,12 +26,12 @@ class CarState(CarStateBase): self.distance_button = 0 # RealFast variables - self.button_message = "CRUISE_BUTTONS_ALT" if FPCP.flags & ChryslerFrogPilotFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS" + self.button_message = "CRUISE_BUTTONS_ALT" if FPCP.flags & ChryslerStarPilotFlags.RAM_HD_ALT_BUTTONS else "CRUISE_BUTTONS" - # FrogPilot variables + # StarPilot variables self.lkas_button = 0 - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] @@ -104,8 +104,8 @@ class CarState(CarStateBase): buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() self.prev_lkas_button = self.lkas_button if self.CP.carFingerprint in RAM_CARS: diff --git a/opendbc_repo/opendbc/car/chrysler/values.py b/opendbc_repo/opendbc/car/chrysler/values.py index 1d919631..6342e43d 100644 --- a/opendbc_repo/opendbc/car/chrysler/values.py +++ b/opendbc_repo/opendbc/car/chrysler/values.py @@ -19,8 +19,8 @@ class ChryslerFlags(IntFlag): HIGHER_MIN_STEERING_SPEED = 1 -# FrogPilot variables -class ChryslerFrogPilotFlags(IntFlag): +# StarPilot variables +class ChryslerStarPilotFlags(IntFlag): RAM_HD_ALT_BUTTONS = 1 diff --git a/opendbc_repo/opendbc/car/ford/carcontroller.py b/opendbc_repo/opendbc/car/ford/carcontroller.py index 2e7d91ec..3e8eb562 100644 --- a/opendbc_repo/opendbc/car/ford/carcontroller.py +++ b/opendbc_repo/opendbc/car/ford/carcontroller.py @@ -75,7 +75,7 @@ class CarController(CarControllerBase): self.lead_distance_bars_last = None self.distance_bar_frame = 0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): can_sends = [] actuators = CC.actuators diff --git a/opendbc_repo/opendbc/car/ford/carstate.py b/opendbc_repo/opendbc/car/ford/carstate.py index 98081b76..714ea56c 100644 --- a/opendbc_repo/opendbc/car/ford/carstate.py +++ b/opendbc_repo/opendbc/car/ford/carstate.py @@ -21,7 +21,7 @@ class CarState(CarStateBase): self.distance_button = 0 self.lc_button = 0 - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] @@ -114,8 +114,8 @@ class CarState(CarStateBase): *create_button_events(self.lc_button, prev_lc_button, {1: ButtonType.lkas}), ] - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/gm/carcontroller.py b/opendbc_repo/opendbc/car/gm/carcontroller.py index 6fa99105..a6f74224 100644 --- a/opendbc_repo/opendbc/car/gm/carcontroller.py +++ b/opendbc_repo/opendbc/car/gm/carcontroller.py @@ -8,7 +8,7 @@ from opendbc.car.common.conversions import Conversions as CV from opendbc.car.gm.values import ASCM_INT, CAR, CC_ONLY_CAR, CC_REGEN_PADDLE_CAR, DBC, EV_CAR, SDGM_CAR, AccState, CanBus, CarControllerParams, CruiseButtons, GMFlags from opendbc.car.interfaces import CarControllerBase from openpilot.common.params import Params, UnknownKeyName -from openpilot.frogpilot.common.testing_grounds import testing_ground +from openpilot.starpilot.common.testing_grounds import testing_ground VisualAlert = structs.CarControl.HUDControl.VisualAlert NetworkLocation = structs.CarParams.NetworkLocation @@ -213,7 +213,7 @@ class CarController(CarControllerBase): self.malibu_cancel_phase = phase self.malibu_button_phase = phase - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators self.aego = CS.out.aEgo accel = actuators.accel @@ -366,11 +366,11 @@ class CarController(CarControllerBase): self.regen_min_on_frames = 0 self.regen_min_off_frames = 0 elif near_stop and stopping and not CC.cruiseControl.resume: - stop_accel = getattr(frogpilot_toggles, "stopAccel", self.CP.stopAccel) + stop_accel = getattr(starpilot_toggles, "stopAccel", self.CP.stopAccel) self.apply_gas = self.params.INACTIVE_REGEN self.apply_brake = int(min(-100 * stop_accel, self.params.MAX_BRAKE)) else: - long_pitch_enabled = bool(getattr(frogpilot_toggles, "long_pitch", True)) + long_pitch_enabled = bool(getattr(starpilot_toggles, "long_pitch", True)) pedal_long_path = bool(self.CP.enableGasInterceptorDEPRECATED and (self.CP.flags & GMFlags.PEDAL_LONG.value)) long_pitch_for_powertrain = long_pitch_enabled and not pedal_long_path @@ -453,7 +453,7 @@ class CarController(CarControllerBase): if self.CP.flags & GMFlags.CC_LONG.value: if CC.longActive and CS.out.cruiseState.enabled and CS.out.vEgo > self.CP.minEnableSpeed: # Using extend instead of append since the message is only sent intermittently - can_sends.extend(gmcan.create_gm_cc_spam_command(self.packer_pt, self, CS, actuators, frogpilot_toggles)) + can_sends.extend(gmcan.create_gm_cc_spam_command(self.packer_pt, self, CS, actuators, starpilot_toggles)) elif (CS.out.cruiseState.enabled and CC.enabled and self.frame % 52 == 0 and CS.cruise_buttons == CruiseButtons.UNPRESS and CS.out.gasPressed and CS.out.cruiseState.speed < CS.out.vEgo < hud_v_cruise): if self.CP.carFingerprint == CAR.CHEVROLET_MALIBU_HYBRID_CC: @@ -479,8 +479,8 @@ class CarController(CarControllerBase): resume = actuators.longControlState != LongCtrlState.starting or CC.cruiseControl.resume at_full_stop = at_full_stop and not resume - # FrogPilot variables - if CC.cruiseControl.resume and CS.pcm_acc_status == AccState.STANDSTILL and frogpilot_toggles.volt_sng: + # StarPilot variables + if CC.cruiseControl.resume and CS.pcm_acc_status == AccState.STANDSTILL and starpilot_toggles.volt_sng: acc_engaged = False else: acc_engaged = CC.enabled diff --git a/opendbc_repo/opendbc/car/gm/carstate.py b/opendbc_repo/opendbc/car/gm/carstate.py index 47bea4ed..ac4d9e2b 100644 --- a/opendbc_repo/opendbc/car/gm/carstate.py +++ b/opendbc_repo/opendbc/car/gm/carstate.py @@ -78,7 +78,7 @@ class CarState(CarStateBase): return True return False - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: pt_cp = can_parsers[Bus.pt] cam_cp = can_parsers[Bus.cam] loopback_cp = can_parsers[Bus.loopback] @@ -133,7 +133,7 @@ class CarState(CarStateBase): pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"], pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"], ) - ret.vEgoCluster = ret.vEgo * getattr(frogpilot_toggles, "cluster_offset", 1.0) + ret.vEgoCluster = ret.vEgo * getattr(starpilot_toggles, "cluster_offset", 1.0) # standstill=True if ECM allows engagement with brake. ret.standstill = abs(pt_cp.vl["EBCMWheelSpdRear"]["RLWheelSpd"]) <= STANDSTILL_THRESHOLD and \ abs(pt_cp.vl["EBCMWheelSpdRear"]["RRWheelSpd"]) <= STANDSTILL_THRESHOLD @@ -283,7 +283,7 @@ class CarState(CarStateBase): remap_cancel_to_distance = bool(self.CP.alternativeExperience & ALTERNATIVE_EXPERIENCE.GM_REMAP_CANCEL_TO_DISTANCE) if not remap_cancel_to_distance: remap_cancel_to_distance = ( - getattr(frogpilot_toggles, "remap_cancel_to_distance", False) and + getattr(starpilot_toggles, "remap_cancel_to_distance", False) and self.CP.openpilotLongitudinalControl and bool(self.CP.flags & GMFlags.PEDAL_LONG.value) and self.CP.carFingerprint in (BOLT_GEN1_CANCEL_PERSONALITY_CARS | {CAR.CHEVROLET_MALIBU_HYBRID_CC}) @@ -342,7 +342,7 @@ class CarState(CarStateBase): if ret.vEgo < self.CP.minSteerSpeed: ret.lowSpeedAlert = True - fp_ret = custom.FrogPilotCarState.new_message() + fp_ret = custom.StarPilotCarState.new_message() if bolt_cancel_personality and self.cruise_buttons == CruiseButtons.CANCEL: # Feed long-press personality logic as if distance is held while CANCEL is held. fp_ret.distancePressed = True diff --git a/opendbc_repo/opendbc/car/gm/fingerprints.py b/opendbc_repo/opendbc/car/gm/fingerprints.py index 5cfc7c88..78539f0a 100644 --- a/opendbc_repo/opendbc/car/gm/fingerprints.py +++ b/opendbc_repo/opendbc/car/gm/fingerprints.py @@ -191,7 +191,7 @@ FINGERPRINTS = { { 190: 6, 193: 8, 197: 8, 199: 4, 201: 8, 208: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 1, 309: 8, 313: 8, 320: 3, 322: 7, 328: 1, 352: 5, 353: 3, 381: 6, 384: 4, 386: 8, 388: 8, 393: 7, 398: 8, 407: 7, 413: 8, 417: 7, 419: 1, 422: 4, 426: 7, 431: 8, 442: 8, 451: 8, 452: 8, 453: 6, 454: 8, 455: 7, 462: 4, 463: 3, 479: 3, 481: 7, 485: 8, 487: 8, 489: 8, 495: 4, 497: 8, 499: 3, 500: 6, 501: 8, 503: 1, 508: 8, 510: 8, 532: 6, 554: 3, 560: 8, 562: 8, 563: 5, 564: 5, 567: 5, 647: 3, 707: 8, 717: 5, 723: 2, 753: 5, 761: 7, 800: 6, 840: 5, 842: 5, 844: 8, 866: 4, 869: 4, 872: 1, 961: 8, 967: 4, 969: 8, 977: 8, 979: 8, 985: 5, 1001: 8, 1005: 6, 1009: 8, 1011: 6, 1013: 3, 1017: 8, 1019: 2, 1020: 8, 1022: 1, 1105: 6, 1217: 8, 1221: 5, 1223: 3, 1225: 7, 1233: 8, 1243: 3, 1249: 8, 1257: 6, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1280: 4, 1300: 8, 1322: 6, 1328: 4, 1417: 8, 1904: 7, 1906: 7, 1907: 7, 1912: 7, 1913: 7, 1914: 7, 1919: 7, 1920: 7 }], - # FrogPilot variables + # StarPilot variables CAR.CHEVROLET_TRAX: [ { 190: 6, 193: 8, 197: 8, 201: 8, 209: 7, 211: 2, 241: 6, 249: 8, 288: 5, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 413: 8, 451: 8, 452: 8, 453: 6, 455: 7, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 587: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 869: 4, 880: 6, 977: 8, 1001: 8, 1011: 6, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1271: 8, 1280: 4, 1296: 4, 1300: 8, 1611: 8, 1930: 7 diff --git a/opendbc_repo/opendbc/car/gm/gmcan.py b/opendbc_repo/opendbc/car/gm/gmcan.py index 3faaf11d..5562f3ca 100644 --- a/opendbc_repo/opendbc/car/gm/gmcan.py +++ b/opendbc_repo/opendbc/car/gm/gmcan.py @@ -273,12 +273,12 @@ def create_lka_icon_command(bus, active, critical, steer): return CanData(0x104c006c, dat, bus) -def create_gm_cc_spam_command(packer, controller, CS, actuators, frogpilot_toggles): +def create_gm_cc_spam_command(packer, controller, CS, actuators, starpilot_toggles): accel = actuators.accel v_ego = CS.out.vEgo cruise_btn = CruiseButtons.INIT rate = 1 if abs(accel) <= 0.15 else 0.2 - ms_convert = CV.MS_TO_KPH if getattr(frogpilot_toggles, "is_metric", False) else CV.MS_TO_MPH + ms_convert = CV.MS_TO_KPH if getattr(starpilot_toggles, "is_metric", False) else CV.MS_TO_MPH speed_setpoint = int(round(CS.out.cruiseState.speed * ms_convert)) desired_setpoint = int(round((v_ego * 1.01 + 3 * accel) * ms_convert)) diff --git a/opendbc_repo/opendbc/car/gm/interface.py b/opendbc_repo/opendbc/car/gm/interface.py index 1d1dadd8..e91f359e 100755 --- a/opendbc_repo/opendbc/car/gm/interface.py +++ b/opendbc_repo/opendbc/car/gm/interface.py @@ -627,7 +627,7 @@ class CarInterface(CarInterfaceBase): if remap_cancel_to_distance or malibu_cancel_passthrough: ret.alternativeExperience |= ALTERNATIVE_EXPERIENCE.GM_REMAP_CANCEL_TO_DISTANCE - # FrogPilot variables + # StarPilot variables if candidate == CAR.CHEVROLET_TRAX: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/opendbc_repo/opendbc/car/gm/values.py b/opendbc_repo/opendbc/car/gm/values.py index 9fe99601..0ba47142 100644 --- a/opendbc_repo/opendbc/car/gm/values.py +++ b/opendbc_repo/opendbc/car/gm/values.py @@ -567,5 +567,5 @@ STEER_THRESHOLD = 1.0 DBC = CAR.create_dbc_map() -# FrogPilot variables +# StarPilot variables CAMERA_ACC_CAR.update({CAR.CHEVROLET_TRAX}) diff --git a/opendbc_repo/opendbc/car/honda/carcontroller.py b/opendbc_repo/opendbc/car/honda/carcontroller.py index ff0c86eb..68f1b1b3 100644 --- a/opendbc_repo/opendbc/car/honda/carcontroller.py +++ b/opendbc_repo/opendbc/car/honda/carcontroller.py @@ -109,7 +109,7 @@ class CarController(CarControllerBase): self.brake = 0.0 self.last_torque = 0.0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators hud_control = CC.hudControl hud_v_cruise = hud_control.setSpeed / CS.v_cruise_factor if hud_control.speedVisible else 255 diff --git a/opendbc_repo/opendbc/car/honda/carstate.py b/opendbc_repo/opendbc/car/honda/carstate.py index cb15e794..0c2706dd 100644 --- a/opendbc_repo/opendbc/car/honda/carstate.py +++ b/opendbc_repo/opendbc/car/honda/carstate.py @@ -50,7 +50,7 @@ class CarState(CarStateBase): # However, on cars without a digital speedometer this is not always present (HRV, FIT, CRV 2016, ILX and RDX) self.dash_speed_seen = False - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] if self.CP.enableBsm: @@ -220,8 +220,8 @@ class CarState(CarStateBase): *create_button_events(self.cruise_setting, prev_cruise_setting, SETTINGS_BUTTONS_DICT), ] - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/hyundai/carcontroller.py b/opendbc_repo/opendbc/car/hyundai/carcontroller.py index 06ff5950..44b19fa3 100644 --- a/opendbc_repo/opendbc/car/hyundai/carcontroller.py +++ b/opendbc_repo/opendbc/car/hyundai/carcontroller.py @@ -55,7 +55,7 @@ class CarController(CarControllerBase): self.car_fingerprint = CP.carFingerprint self.last_button_frame = 0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators hud_control = CC.hudControl diff --git a/opendbc_repo/opendbc/car/hyundai/carstate.py b/opendbc_repo/opendbc/car/hyundai/carstate.py index 6f8db6b7..e1dce0d6 100644 --- a/opendbc_repo/opendbc/car/hyundai/carstate.py +++ b/opendbc_repo/opendbc/car/hyundai/carstate.py @@ -70,7 +70,7 @@ class CarState(CarStateBase): # Main button also can trigger an engagement on these cars return any(btn in ENABLE_BUTTONS for btn in self.cruise_buttons) or any(self.main_buttons) - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] @@ -203,8 +203,8 @@ class CarState(CarStateBase): self.low_speed_alert = False ret.lowSpeedAlert = self.low_speed_alert - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret @@ -301,8 +301,8 @@ class CarState(CarStateBase): ret.blockPcmEnable = not self.recent_button_interaction() - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/hyundai/values.py b/opendbc_repo/opendbc/car/hyundai/values.py index c29286b7..d623567b 100644 --- a/opendbc_repo/opendbc/car/hyundai/values.py +++ b/opendbc_repo/opendbc/car/hyundai/values.py @@ -68,8 +68,8 @@ class HyundaiSafetyFlags(IntFlag): ALT_LIMITS_2 = 512 -# FrogPilot variables -class HyundaiFrogPilotSafetyFlags(IntFlag): +# StarPilot variables +class HyundaiStarPilotSafetyFlags(IntFlag): HAS_LDA_BUTTON = 1024 diff --git a/opendbc_repo/opendbc/car/interfaces.py b/opendbc_repo/opendbc/car/interfaces.py index 22b85461..bfde3cb8 100644 --- a/opendbc_repo/opendbc/car/interfaces.py +++ b/opendbc_repo/opendbc/car/interfaces.py @@ -13,16 +13,16 @@ from cereal import custom from opendbc.car import DT_CTRL, apply_hysteresis, create_button_events, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG from opendbc.car import structs from opendbc.car.can_definitions import CanData, CanRecvCallable, CanSendCallable -from opendbc.car.chrysler.values import CAR as CHRYSLER, ChryslerFrogPilotFlags +from opendbc.car.chrysler.values import CAR as CHRYSLER, ChryslerStarPilotFlags from opendbc.car.common.basedir import BASEDIR from opendbc.car.common.conversions import Conversions as CV from opendbc.car.common.simple_kalman import KF1D, get_kalman_gain from opendbc.car.gm.values import CAR as GM from opendbc.car.honda.values import CAR as HONDA, HONDA_BOSCH, HondaSafetyFlags from opendbc.car.hyundai.hyundaicanfd import CanBus -from opendbc.car.hyundai.values import CAR as HYUNDAI, CANFD_CAR, HyundaiFlags, HyundaiFrogPilotSafetyFlags +from opendbc.car.hyundai.values import CAR as HYUNDAI, CANFD_CAR, HyundaiFlags, HyundaiStarPilotSafetyFlags from opendbc.car.mock.values import CAR as MOCK -from opendbc.car.toyota.values import CAR as TOYOTA, NO_DSU_CAR, TSS2_CAR, UNSUPPORTED_DSU_CAR, ToyotaFrogPilotFlags, ToyotaSafetyFlags +from opendbc.car.toyota.values import CAR as TOYOTA, NO_DSU_CAR, TSS2_CAR, UNSUPPORTED_DSU_CAR, ToyotaStarPilotFlags, ToyotaSafetyFlags from opendbc.car.values import PLATFORMS from opendbc.can import CANParser from openpilot.common.params import Params @@ -30,7 +30,7 @@ from openpilot.common.params import Params GearShifter = structs.CarState.GearShifter ButtonType = structs.CarState.ButtonEvent.Type -# FrogPilot variables +# StarPilot variables Ecu = structs.CarParams.Ecu V_CRUISE_MAX = 145 @@ -121,7 +121,7 @@ class CarInterfaceBase(ABC): CarController: 'CarControllerBase' RadarInterface: 'RadarInterfaceBase' = RadarInterfaceBase - def __init__(self, CP: structs.CarParams, FPCP: custom.FrogPilotCarParams): + def __init__(self, CP: structs.CarParams, FPCP: custom.StarPilotCarParams): self.CP = CP self.frame = 0 @@ -133,17 +133,17 @@ class CarInterfaceBase(ABC): dbc_names = {bus: cp.dbc_name for bus, cp in self.can_parsers.items()} self.CC: CarControllerBase = self.CarController(dbc_names, CP) - # FrogPilot variables + # StarPilot variables self.FPCP = FPCP self.params_memory = Params(memory=True) self.distance_button = 0 - def apply(self, c: structs.CarControl, now_nanos: int | None = None, frogpilot_toggles: SimpleNamespace = None) -> tuple[structs.CarControl.Actuators, list[CanData]]: + def apply(self, c: structs.CarControl, now_nanos: int | None = None, starpilot_toggles: SimpleNamespace = None) -> tuple[structs.CarControl.Actuators, list[CanData]]: if now_nanos is None: now_nanos = int(time.monotonic() * 1e9) - return self.CC.update(c, self.CS, now_nanos, frogpilot_toggles) + return self.CC.update(c, self.CS, now_nanos, starpilot_toggles) @staticmethod def get_pid_accel_limits(CP, current_speed, cruise_speed): @@ -158,7 +158,7 @@ class CarInterfaceBase(ABC): @classmethod def get_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], - alpha_long: bool, is_release: bool, docs: bool, frogpilot_toggles: SimpleNamespace) -> structs.CarParams: + alpha_long: bool, is_release: bool, docs: bool, starpilot_toggles: SimpleNamespace) -> structs.CarParams: ret = CarInterfaceBase.get_std_params(candidate) platform = PLATFORMS[candidate] @@ -181,28 +181,28 @@ class CarInterfaceBase(ABC): ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase) ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront, ret.tireStiffnessFactor) - # FrogPilot variables + # StarPilot variables toggles_to_check = ("force_torque_controller", "nnff", "nnff_lite") - if ret.steerControlType != structs.CarParams.SteerControlType.angle and any(getattr(frogpilot_toggles, toggle, False) for toggle in toggles_to_check): + if ret.steerControlType != structs.CarParams.SteerControlType.angle and any(getattr(starpilot_toggles, toggle, False) for toggle in toggles_to_check): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) return ret - # FrogPilot variables + # StarPilot variables @classmethod - def get_frogpilot_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], CP: structs.CarParams, frogpilot_toggles: SimpleNamespace): - fp_ret = custom.FrogPilotCarParams.new_message() + def get_starpilot_params(cls, candidate: str, fingerprint: dict[int, dict[int, int]], car_fw: list[structs.CarParams.CarFw], CP: structs.CarParams, starpilot_toggles: SimpleNamespace): + fp_ret = custom.StarPilotCarParams.new_message() platform = PLATFORMS[candidate] fp_ret.flags |= int(platform.config.flags) - fp_ret.safetyConfigs = [custom.FrogPilotCarParams.SafetyConfig.new_message(safetyParam=config.safetyParam) for config in CP.safetyConfigs] + fp_ret.safetyConfigs = [custom.StarPilotCarParams.SafetyConfig.new_message(safetyParam=config.safetyParam) for config in CP.safetyConfigs] if platform not in MOCK: if platform in CHRYSLER: if candidate == CHRYSLER.RAM_HD_5TH_GEN: if 570 not in fingerprint[0]: - fp_ret.flags |= ChryslerFrogPilotFlags.RAM_HD_ALT_BUTTONS.value + fp_ret.flags |= ChryslerStarPilotFlags.RAM_HD_ALT_BUTTONS.value elif platform in GM: fp_ret.canUsePedal = True @@ -217,7 +217,7 @@ class CarInterfaceBase(ABC): fp_ret.isHDA2 = hda2 if CP.flags & HyundaiFlags.HAS_LDA_BUTTON: - fp_ret.safetyConfigs[-1].safetyParam |= HyundaiFrogPilotSafetyFlags.HAS_LDA_BUTTON.value + fp_ret.safetyConfigs[-1].safetyParam |= HyundaiStarPilotSafetyFlags.HAS_LDA_BUTTON.value elif platform in TOYOTA: fp_ret.canUsePedal = not CP.autoResumeSng @@ -227,11 +227,11 @@ class CarInterfaceBase(ABC): fp_ret.flags |= ToyotaFlags.RADAR_CAN_FILTER.value if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR): - fp_ret.flags |= ToyotaFrogPilotFlags.SMART_DSU.value + fp_ret.flags |= ToyotaStarPilotFlags.SMART_DSU.value if candidate == TOYOTA.TOYOTA_PRIUS: if 0x23 in fingerprint[0]: - fp_ret.flags |= ToyotaFrogPilotFlags.ZSS.value + fp_ret.flags |= ToyotaStarPilotFlags.ZSS.value return fp_ret @@ -313,14 +313,14 @@ class CarInterfaceBase(ABC): tune.torque.latAccelOffset = 0.0 tune.torque.steeringAngleDeadzoneDeg = steering_angle_deadzone_deg - def update(self, can_packets: list[tuple[int, list[CanData]]], frogpilot_toggles: SimpleNamespace) -> structs.CarState: + def update(self, can_packets: list[tuple[int, list[CanData]]], starpilot_toggles: SimpleNamespace) -> structs.CarState: # parse can for cp in self.can_parsers.values(): if cp is not None: cp.update(can_packets) # get CarState - ret, fp_ret = self.CS.update(self.can_parsers, frogpilot_toggles) + ret, fp_ret = self.CS.update(self.can_parsers, starpilot_toggles) ret.canValid = all(cp.can_valid for cp in self.can_parsers.values()) ret.canTimeout = any(cp.bus_timeout for cp in self.can_parsers.values()) @@ -343,7 +343,7 @@ class CarInterfaceBase(ABC): # save for next iteration self.CS.out = ret - # FrogPilot variables + # StarPilot variables prev_distance_button = self.distance_button self.distance_button = self.params_memory.get_bool("OnroadDistanceButtonPressed") if self.distance_button != prev_distance_button: @@ -359,7 +359,7 @@ class CarInterfaceBase(ABC): class CarStateBase(ABC): - def __init__(self, CP: structs.CarParams, FPCP: custom.FrogPilotCarParams): + def __init__(self, CP: structs.CarParams, FPCP: custom.StarPilotCarParams): self.CP = CP self.car_fingerprint = CP.carFingerprint self.out = structs.CarState() @@ -383,7 +383,7 @@ class CarStateBase(ABC): K = get_kalman_gain(DT_CTRL, np.array(A), np.array(C), np.array(Q), R) self.v_ego_kf = KF1D(x0=x0, A=A, C=C[0], K=K) - # FrogPilot variables + # StarPilot variables self.FPCP = FPCP self.CC: structs.CarControl = structs.CarControl.new_message() @@ -391,7 +391,7 @@ class CarStateBase(ABC): self.distance_button = False @abstractmethod - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: pass def parse_wheel_speeds(self, cs, fl, fr, rl, rr, unit=CV.KPH_TO_MS): diff --git a/opendbc_repo/opendbc/car/mazda/carcontroller.py b/opendbc_repo/opendbc/car/mazda/carcontroller.py index 687c9d24..6e2b1e40 100644 --- a/opendbc_repo/opendbc/car/mazda/carcontroller.py +++ b/opendbc_repo/opendbc/car/mazda/carcontroller.py @@ -15,7 +15,7 @@ class CarController(CarControllerBase): self.packer = CANPacker(dbc_names[Bus.pt]) self.brake_counter = 0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): can_sends = [] apply_torque = 0 diff --git a/opendbc_repo/opendbc/car/mazda/carstate.py b/opendbc_repo/opendbc/car/mazda/carstate.py index 7c8f8994..bad0d6f1 100644 --- a/opendbc_repo/opendbc/car/mazda/carstate.py +++ b/opendbc_repo/opendbc/car/mazda/carstate.py @@ -21,7 +21,7 @@ class CarState(CarStateBase): self.distance_button = 0 - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] @@ -116,8 +116,8 @@ class CarState(CarStateBase): # TODO: add button types for inc and dec ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/mazda/interface.py b/opendbc_repo/opendbc/car/mazda/interface.py index 5b6e5154..4a3d8274 100644 --- a/opendbc_repo/opendbc/car/mazda/interface.py +++ b/opendbc_repo/opendbc/car/mazda/interface.py @@ -29,7 +29,7 @@ class CarInterface(CarInterfaceBase): ret.centerToFront = ret.wheelbase * 0.41 - # FrogPilot variables + # StarPilot variables ret.enableBsm = True return ret diff --git a/opendbc_repo/opendbc/car/mock/carcontroller.py b/opendbc_repo/opendbc/car/mock/carcontroller.py index eb75508e..ecf82c42 100644 --- a/opendbc_repo/opendbc/car/mock/carcontroller.py +++ b/opendbc_repo/opendbc/car/mock/carcontroller.py @@ -2,5 +2,5 @@ from opendbc.car.interfaces import CarControllerBase class CarController(CarControllerBase): - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): return CC.actuators.as_builder(), [] diff --git a/opendbc_repo/opendbc/car/mock/carstate.py b/opendbc_repo/opendbc/car/mock/carstate.py index 50ba0a52..b37cf1aa 100644 --- a/opendbc_repo/opendbc/car/mock/carstate.py +++ b/opendbc_repo/opendbc/car/mock/carstate.py @@ -5,4 +5,4 @@ from opendbc.car.interfaces import CarStateBase class CarState(CarStateBase): def update(self, *_) -> structs.CarState: - return structs.CarState(), custom.FrogPilotCarState() + return structs.CarState(), custom.StarPilotCarState() diff --git a/opendbc_repo/opendbc/car/nissan/carcontroller.py b/opendbc_repo/opendbc/car/nissan/carcontroller.py index 76ec2e74..3126c255 100644 --- a/opendbc_repo/opendbc/car/nissan/carcontroller.py +++ b/opendbc_repo/opendbc/car/nissan/carcontroller.py @@ -17,7 +17,7 @@ class CarController(CarControllerBase): self.packer = CANPacker(dbc_names[Bus.pt]) - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators hud_control = CC.hudControl pcm_cancel_cmd = CC.cruiseControl.cancel diff --git a/opendbc_repo/opendbc/car/nissan/carstate.py b/opendbc_repo/opendbc/car/nissan/carstate.py index d9aee75e..6e853216 100644 --- a/opendbc_repo/opendbc/car/nissan/carstate.py +++ b/opendbc_repo/opendbc/car/nissan/carstate.py @@ -25,10 +25,10 @@ class CarState(CarStateBase): self.distance_button = 0 - # FrogPilot variables + # StarPilot variables self.lkas_button = 0 - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] cp_adas = can_parsers[Bus.adas] @@ -132,8 +132,8 @@ class CarState(CarStateBase): buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() self.prev_lkas_button = self.lkas_button self.lkas_button = ret.invalidLkasSetting diff --git a/opendbc_repo/opendbc/car/psa/carcontroller.py b/opendbc_repo/opendbc/car/psa/carcontroller.py index 93fbc2b3..63910918 100644 --- a/opendbc_repo/opendbc/car/psa/carcontroller.py +++ b/opendbc_repo/opendbc/car/psa/carcontroller.py @@ -13,7 +13,7 @@ class CarController(CarControllerBase): self.apply_angle_last = 0 self.status = 2 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): can_sends = [] actuators = CC.actuators diff --git a/opendbc_repo/opendbc/car/psa/carstate.py b/opendbc_repo/opendbc/car/psa/carstate.py index 01485753..581060c9 100644 --- a/opendbc_repo/opendbc/car/psa/carstate.py +++ b/opendbc_repo/opendbc/car/psa/carstate.py @@ -10,7 +10,7 @@ TransmissionType = structs.CarParams.TransmissionType class CarState(CarStateBase): - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.main] cp_adas = can_parsers[Bus.adas] cp_cam = can_parsers[Bus.cam] @@ -64,8 +64,8 @@ class CarState(CarStateBase): ret.doorOpen = any((cp_cam.vl['Dat_BSI']['DRIVER_DOOR'], cp_cam.vl['Dat_BSI']['PASSENGER_DOOR'])) ret.seatbeltUnlatched = cp_cam.vl['RESTRAINTS']['DRIVER_SEATBELT'] != 2 - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/rivian/carcontroller.py b/opendbc_repo/opendbc/car/rivian/carcontroller.py index 888e62fb..41d9cce9 100644 --- a/opendbc_repo/opendbc/car/rivian/carcontroller.py +++ b/opendbc_repo/opendbc/car/rivian/carcontroller.py @@ -15,7 +15,7 @@ class CarController(CarControllerBase): self.cancel_frames = 0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators can_sends = [] diff --git a/opendbc_repo/opendbc/car/rivian/carstate.py b/opendbc_repo/opendbc/car/rivian/carstate.py index 52445a20..52877fd8 100644 --- a/opendbc_repo/opendbc/car/rivian/carstate.py +++ b/opendbc_repo/opendbc/car/rivian/carstate.py @@ -18,7 +18,7 @@ class CarState(CarStateBase): self.sccm_wheel_touch = None self.vdm_adas_status = None - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] cp_adas = can_parsers[Bus.adas] @@ -93,8 +93,8 @@ class CarState(CarStateBase): self.sccm_wheel_touch = copy.copy(cp.vl["SCCM_WheelTouch"]) self.vdm_adas_status = copy.copy(cp.vl["VDM_AdasSts"]) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/subaru/carcontroller.py b/opendbc_repo/opendbc/car/subaru/carcontroller.py index 8b192e86..280b200c 100644 --- a/opendbc_repo/opendbc/car/subaru/carcontroller.py +++ b/opendbc_repo/opendbc/car/subaru/carcontroller.py @@ -11,7 +11,7 @@ from opendbc.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarController MAX_STEER_RATE = 25 # deg/s MAX_STEER_RATE_FRAMES = 7 # tx control frames needed before torque can be cut -# FrogPilot variables +# StarPilot variables _SNG_ACC_MIN_DIST = 3 _SNG_ACC_MAX_DIST = 4.5 @@ -27,7 +27,7 @@ class CarController(CarControllerBase): self.p = CarControllerParams(CP) self.packer = CANPacker(DBC[CP.carFingerprint][Bus.pt]) - # FrogPilot variables + # StarPilot variables self.manual_hold = False self.prev_standstill = False self.sng_acc_resume = False @@ -37,7 +37,7 @@ class CarController(CarControllerBase): self.sng_acc_resume_cnt = 0 self.standstill_start = 0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators hud_control = CC.hudControl pcm_cancel_cmd = CC.cruiseControl.cancel @@ -71,9 +71,9 @@ class CarController(CarControllerBase): self.apply_torque_last = apply_torque - # FrogPilot variables + # StarPilot variables # *** stop and go *** - if frogpilot_toggles.subaru_sng: + if starpilot_toggles.subaru_sng: throttle_cmd, speed_cmd = self.stop_and_go(CC, CS) # *** longitudinal *** @@ -112,8 +112,8 @@ class CarController(CarControllerBase): can_sends.append(subarucan.create_preglobal_es_distance(self.packer, cruise_button, CS.es_distance_msg)) - # FrogPilot variables - if frogpilot_toggles.subaru_sng: + # StarPilot variables + if starpilot_toggles.subaru_sng: can_sends.append(subarucan.create_preglobal_throttle(self.packer, CS.throttle_msg["COUNTER"] + 1, CS.throttle_msg, throttle_cmd)) else: if self.frame % 10 == 0: @@ -127,8 +127,8 @@ class CarController(CarControllerBase): if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT: can_sends.append(subarucan.create_es_infotainment(self.packer, self.frame // 10, CS.es_infotainment_msg, hud_control.visualAlert)) - # FrogPilot variables - if frogpilot_toggles.subaru_sng: + # StarPilot variables + if starpilot_toggles.subaru_sng: can_sends.append(subarucan.create_throttle(self.packer, CS.throttle_msg["COUNTER"] + 1, CS.throttle_msg, throttle_cmd)) if self.frame % 2 == 0: can_sends.append(subarucan.create_brake_pedal(self.packer, self.frame // 2, CS.brake_pedal_msg, speed_cmd, pcm_cancel_cmd)) @@ -171,7 +171,7 @@ class CarController(CarControllerBase): self.frame += 1 return new_actuators, can_sends - # FrogPilot variables + # StarPilot variables def stop_and_go(self, CC, CS, speed_cmd=False, throttle_cmd=False): if self.CP.flags & SubaruFlags.PREGLOBAL: trigger_resume = CC.enabled diff --git a/opendbc_repo/opendbc/car/subaru/carstate.py b/opendbc_repo/opendbc/car/subaru/carstate.py index e25a137f..1de2e623 100644 --- a/opendbc_repo/opendbc/car/subaru/carstate.py +++ b/opendbc_repo/opendbc/car/subaru/carstate.py @@ -16,7 +16,7 @@ class CarState(CarStateBase): self.angle_rate_calulator = CanSignalRateCalculator(50) - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] cp_alt = can_parsers[Bus.alt] @@ -124,10 +124,10 @@ class CarState(CarStateBase): if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT: self.es_infotainment_msg = copy.copy(cp_cam.vl["ES_Infotainment"]) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() - if frogpilot_toggles.subaru_sng: + if starpilot_toggles.subaru_sng: self.brake_pedal_msg = copy.copy(cp.vl["Brake_Pedal"]) self.car_follow = cp_es_distance.vl["ES_Distance"]["Car_Follow"] self.close_distance = cp_es_distance.vl["ES_Distance"]["Close_Distance"] diff --git a/opendbc_repo/opendbc/car/subaru/subarucan.py b/opendbc_repo/opendbc/car/subaru/subarucan.py index 66e205dd..c7bfc427 100644 --- a/opendbc_repo/opendbc/car/subaru/subarucan.py +++ b/opendbc_repo/opendbc/car/subaru/subarucan.py @@ -336,7 +336,7 @@ def subaru_checksum(address: int, sig, d: bytearray) -> int: return s & 0xFF -# FrogPilot variables +# StarPilot variables def create_brake_pedal(packer, frame, brake_pedal_msg, speed_cmd, brake_cmd): values = {s: brake_pedal_msg[s] for s in sorted([ "Brake_Lights", diff --git a/opendbc_repo/opendbc/car/subaru/values.py b/opendbc_repo/opendbc/car/subaru/values.py index e5e83e70..29df2a1d 100644 --- a/opendbc_repo/opendbc/car/subaru/values.py +++ b/opendbc_repo/opendbc/car/subaru/values.py @@ -26,7 +26,7 @@ class CarControllerParams: elif CP.carFingerprint == CAR.SUBARU_IMPREZA_2020: self.STEER_DELTA_UP = 35 self.STEER_MAX = 1439 - # FrogPilot variables + # StarPilot variables elif CP.carFingerprint == CAR.SUBARU_IMPREZA: self.STEER_MAX = 3071 else: diff --git a/opendbc_repo/opendbc/car/tesla/carcontroller.py b/opendbc_repo/opendbc/car/tesla/carcontroller.py index bdf45ae2..bcf801c1 100644 --- a/opendbc_repo/opendbc/car/tesla/carcontroller.py +++ b/opendbc_repo/opendbc/car/tesla/carcontroller.py @@ -25,7 +25,7 @@ class CarController(CarControllerBase): # Vehicle model used for lateral limiting self.VM = VehicleModel(get_safety_CP()) - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators can_sends = [] diff --git a/opendbc_repo/opendbc/car/tesla/carstate.py b/opendbc_repo/opendbc/car/tesla/carstate.py index aed91805..b7b5d48a 100644 --- a/opendbc_repo/opendbc/car/tesla/carstate.py +++ b/opendbc_repo/opendbc/car/tesla/carstate.py @@ -31,7 +31,7 @@ class CarState(CarStateBase): self.autopark_prev = autopark_now self.cruise_enabled_prev = cruise_enabled - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp_party = can_parsers[Bus.party] cp_ap_party = can_parsers[Bus.ap_party] ret = structs.CarState() @@ -118,8 +118,8 @@ class CarState(CarStateBase): # Messages needed by carcontroller self.das_control = copy.copy(cp_ap_party.vl["DAS_control"]) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/car/torque_data/params.toml b/opendbc_repo/opendbc/car/torque_data/params.toml index d2cfd4cc..6e350a52 100644 --- a/opendbc_repo/opendbc/car/torque_data/params.toml +++ b/opendbc_repo/opendbc/car/torque_data/params.toml @@ -81,4 +81,4 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "VOLKSWAGEN_PASSAT_MK8" = [1.3432120736752917, 1.7087275587362314, 0.19444383787326647] "VOLKSWAGEN_TIGUAN_MK2" = [0.9711965500094828, 1.0001565939459098, 0.1465626137072916] -# FrogPilot variables +# StarPilot variables diff --git a/opendbc_repo/opendbc/car/torque_data/substitute.toml b/opendbc_repo/opendbc/car/torque_data/substitute.toml index 75196650..79f9f62e 100644 --- a/opendbc_repo/opendbc/car/torque_data/substitute.toml +++ b/opendbc_repo/opendbc/car/torque_data/substitute.toml @@ -103,5 +103,5 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "GMC_YUKON_CC" = "CHEVROLET_SILVERADO" "CHEVROLET_TRAILBLAZER_CC" = "CHEVROLET_TRAILBLAZER" -# FrogPilot variables +# StarPilot variables "CHEVROLET_TRAX" = "CHEVROLET_VOLT" diff --git a/opendbc_repo/opendbc/car/toyota/carcontroller.py b/opendbc_repo/opendbc/car/toyota/carcontroller.py index 34febafc..4eadb837 100644 --- a/opendbc_repo/opendbc/car/toyota/carcontroller.py +++ b/opendbc_repo/opendbc/car/toyota/carcontroller.py @@ -35,7 +35,7 @@ MAX_STEER_RATE_FRAMES = 18 # tx control frames needed before torque can be cut # EPS allows user torque above threshold for 50 frames before permanently faulting MAX_USER_TORQUE = 500 -# FrogPilot variables +# StarPilot variables PARK = structs.CarState.GearShifter.park # Lock / unlock door commands - Credit goes to AlexandreSato! @@ -86,10 +86,10 @@ class CarController(CarControllerBase): self.secoc_acc_message_counter = 0 self.secoc_prev_reset_counter = 0 - # FrogPilot variables + # StarPilot variables self.doors_locked = False - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators stopping = actuators.longControlState == LongCtrlState.stopping hud_control = CC.hudControl @@ -183,7 +183,7 @@ class CarController(CarControllerBase): # on entering standstill, send standstill request for older TSS-P cars that aren't designed to stay engaged at a stop if self.CP.carFingerprint not in NO_STOP_TIMER_CAR: - if CS.out.standstill and not self.last_standstill and not frogpilot_toggles.sng_hack: + if CS.out.standstill and not self.last_standstill and not starpilot_toggles.sng_hack: self.standstill_req = True if CS.pcm_acc_status != 8: # pcm entered standstill or it's disabled @@ -194,7 +194,7 @@ class CarController(CarControllerBase): # brakes can take a while to ramp up causing a lurch forward. prevent resume press until planner wants to move. # don't use CC.cruiseControl.resume since it is gated on CS.cruiseState.standstill which goes false for 3s after resume press # TODO: hybrids do not have this issue and can stay stopped after resume press, whitelist them - should_resume = actuators.accel > 0 or frogpilot_toggles.sng_hack + should_resume = actuators.accel > 0 or starpilot_toggles.sng_hack if should_resume: self.standstill_req = False @@ -241,7 +241,7 @@ class CarController(CarControllerBase): self.aego.update(a_ego_blended) j_ego = (self.aego.x - prev_aego) / (DT_CTRL * 3) - if frogpilot_toggles.frogsgomoo_tweak: + if starpilot_toggles.frogsgomoo_tweak: future_t = float(np.interp(CS.out.vEgo, [2., 5.], [0.35, 1.0])) else: future_t = float(np.interp(CS.out.vEgo, [2., 5.], [0.25, 0.5])) @@ -279,7 +279,7 @@ class CarController(CarControllerBase): main_accel_cmd = 0. if self.CP.flags & ToyotaFlags.SECOC.value else pcm_accel_cmd can_sends.append(toyotacan.create_accel_command(self.packer, main_accel_cmd, pcm_cancel_cmd, self.permit_braking, self.standstill_req, lead, - CS.acc_type, fcw_alert, self.distance_button, frogpilot_toggles.reverse_cruise_increase)) + CS.acc_type, fcw_alert, self.distance_button, starpilot_toggles.reverse_cruise_increase)) if self.CP.flags & ToyotaFlags.SECOC.value: acc_cmd_2 = toyotacan.create_accel_command_2(self.packer, pcm_accel_cmd) acc_cmd_2 = add_mac(self.secoc_key, @@ -298,7 +298,7 @@ class CarController(CarControllerBase): if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR: can_sends.append(toyotacan.create_acc_cancel_command(self.packer)) else: - can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, True, False, lead, CS.acc_type, False, self.distance_button, frogpilot_toggles.reverse_cruise_increase)) + can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, True, False, lead, CS.acc_type, False, self.distance_button, starpilot_toggles.reverse_cruise_increase)) # *** hud ui *** if self.CP.carFingerprint != CAR.TOYOTA_PRIUS_V: @@ -334,13 +334,13 @@ class CarController(CarControllerBase): self.frame += 1 - # FrogPilot variables + # StarPilot variables if not self.doors_locked and CS.out.gearShifter != PARK: - if frogpilot_toggles.lock_doors: + if starpilot_toggles.lock_doors: can_sends.append(CanData(0x750, LOCK_CMD, 0)) self.doors_locked = True elif self.doors_locked and CS.out.gearShifter == PARK: - if frogpilot_toggles.unlock_doors: + if starpilot_toggles.unlock_doors: can_sends.append(CanData(0x750, UNLOCK_CMD, 0)) self.doors_locked = False diff --git a/opendbc_repo/opendbc/car/toyota/carstate.py b/opendbc_repo/opendbc/car/toyota/carstate.py index 7aaecb04..9d1847c8 100644 --- a/opendbc_repo/opendbc/car/toyota/carstate.py +++ b/opendbc_repo/opendbc/car/toyota/carstate.py @@ -6,7 +6,7 @@ from opendbc.car import Bus, DT_CTRL, create_button_events, structs from opendbc.car.common.conversions import Conversions as CV from opendbc.car.common.filter_simple import FirstOrderFilter from opendbc.car.interfaces import CarStateBase -from opendbc.car.toyota.values import ToyotaFlags, ToyotaFrogPilotFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \ +from opendbc.car.toyota.values import ToyotaFlags, ToyotaStarPilotFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \ TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR, \ SECOC_CAR @@ -67,17 +67,17 @@ class CarState(CarStateBase): self.gvc = 0.0 self.secoc_synchronization = None - # FrogPilot variables + # StarPilot variables self.latActive_previous = False self.needs_angle_offset_zss = False self.angle_offset_zss = 0 - self.has_can_filter = self.FPCP.flags & ToyotaFrogPilotFlags.RADAR_CAN_FILTER.value - self.has_SDSU = self.FPCP.flags & ToyotaFrogPilotFlags.SMART_DSU.value - self.has_ZSS = self.FPCP.flags & ToyotaFrogPilotFlags.ZSS.value + self.has_can_filter = self.FPCP.flags & ToyotaStarPilotFlags.RADAR_CAN_FILTER.value + self.has_SDSU = self.FPCP.flags & ToyotaStarPilotFlags.SMART_DSU.value + self.has_ZSS = self.FPCP.flags & ToyotaStarPilotFlags.ZSS.value - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: cp = can_parsers[Bus.pt] cp_cam = can_parsers[Bus.cam] @@ -111,7 +111,7 @@ class CarState(CarStateBase): cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RL"], cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_RR"], ) - ret.vEgoCluster = ret.vEgo * frogpilot_toggles.cluster_offset + ret.vEgoCluster = ret.vEgo * starpilot_toggles.cluster_offset ret.standstill = abs(ret.vEgoRaw) < 1e-3 @@ -222,8 +222,8 @@ class CarState(CarStateBase): buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}) - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() if self.has_SDSU and not self.has_can_filter: prev_distance_button = self.distance_button diff --git a/opendbc_repo/opendbc/car/toyota/values.py b/opendbc_repo/opendbc/car/toyota/values.py index d44feb14..5ff2ccb6 100644 --- a/opendbc_repo/opendbc/car/toyota/values.py +++ b/opendbc_repo/opendbc/car/toyota/values.py @@ -80,8 +80,8 @@ class ToyotaFlags(IntFlag): SNG_WITHOUT_DSU_DEPRECATED = 512 -# FrogPilot variables -class ToyotaFrogPilotFlags(IntFlag): +# StarPilot variables +class ToyotaStarPilotFlags(IntFlag): RADAR_CAN_FILTER = 1 SMART_DSU = 2 ZSS = 4 diff --git a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py index 62d7d79d..f91425b5 100644 --- a/opendbc_repo/opendbc/car/volkswagen/carcontroller.py +++ b/opendbc_repo/opendbc/car/volkswagen/carcontroller.py @@ -32,7 +32,7 @@ class CarController(CarControllerBase): self.hca_frame_timer_running = 0 self.hca_frame_same_torque = 0 - def update(self, CC, CS, now_nanos, frogpilot_toggles): + def update(self, CC, CS, now_nanos, starpilot_toggles): actuators = CC.actuators hud_control = CC.hudControl can_sends = [] @@ -88,7 +88,7 @@ class CarController(CarControllerBase): acc_control = self.CCS.acc_control_value(CS.out.cruiseState.available, CS.out.accFaulted, CC.longActive) accel = float(np.clip(actuators.accel, self.CCP.ACCEL_MIN, self.CCP.ACCEL_MAX) if CC.longActive else 0) stopping = actuators.longControlState == LongCtrlState.stopping - starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < frogpilot_toggles.vEgoStopping) + starting = actuators.longControlState == LongCtrlState.pid and (CS.esp_hold_confirmation or CS.out.vEgo < starpilot_toggles.vEgoStopping) can_sends.extend(self.CCS.create_acc_accel_control(self.packer_pt, self.CAN.pt, CS.acc_type, CC.longActive, accel, acc_control, stopping, starting, CS.esp_hold_confirmation)) diff --git a/opendbc_repo/opendbc/car/volkswagen/carstate.py b/opendbc_repo/opendbc/car/volkswagen/carstate.py index fbbef8b0..ba36d130 100644 --- a/opendbc_repo/opendbc/car/volkswagen/carstate.py +++ b/opendbc_repo/opendbc/car/volkswagen/carstate.py @@ -43,7 +43,7 @@ class CarState(CarStateBase): return button_events - def update(self, can_parsers, frogpilot_toggles) -> structs.CarState: + def update(self, can_parsers, starpilot_toggles) -> structs.CarState: pt_cp = can_parsers[Bus.pt] cam_cp = can_parsers[Bus.cam] ext_cp = pt_cp if self.CP.networkLocation == NetworkLocation.fwdCamera else cam_cp @@ -139,8 +139,8 @@ class CarState(CarStateBase): self.frame += 1 - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret @@ -234,8 +234,8 @@ class CarState(CarStateBase): self.frame += 1 - # FrogPilot variables - fp_ret = custom.FrogPilotCarState.new_message() + # StarPilot variables + fp_ret = custom.StarPilotCarState.new_message() return ret, fp_ret diff --git a/opendbc_repo/opendbc/safety/__init__.py b/opendbc_repo/opendbc/safety/__init__.py index 24b0b532..436bc507 100644 --- a/opendbc_repo/opendbc/safety/__init__.py +++ b/opendbc_repo/opendbc/safety/__init__.py @@ -9,6 +9,6 @@ class ALTERNATIVE_EXPERIENCE: RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX = 8 ALLOW_AEB = 16 - # FrogPilot variables + # StarPilot variables ALWAYS_ON_LATERAL = 32 GM_REMAP_CANCEL_TO_DISTANCE = 64 diff --git a/opendbc_repo/opendbc/safety/declarations.h b/opendbc_repo/opendbc/safety/declarations.h index 576943ad..e0d6be62 100644 --- a/opendbc_repo/opendbc/safety/declarations.h +++ b/opendbc_repo/opendbc/safety/declarations.h @@ -268,7 +268,7 @@ extern bool acc_main_on; // referred to as "ACC off" in ISO 15622:2018 extern int cruise_button_prev; extern bool safety_rx_checks_invalid; -// FrogPilot variables +// StarPilot variables extern bool aol_allowed; extern bool lkas_button_prev; extern bool lkas_on; @@ -317,7 +317,7 @@ extern bool gm_remote_start_boots_comma; // This flag allows AEB to be commanded from openpilot. #define ALT_EXP_ALLOW_AEB 16 -// FrogPilot variables +// StarPilot variables #define ALT_EXP_ALWAYS_ON_LATERAL 32 #define ALT_EXP_GM_REMAP_CANCEL_TO_DISTANCE 64 diff --git a/opendbc_repo/opendbc/safety/modes/chrysler.h b/opendbc_repo/opendbc/safety/modes/chrysler.h index 9348e8fb..67ff9a94 100644 --- a/opendbc_repo/opendbc/safety/modes/chrysler.h +++ b/opendbc_repo/opendbc/safety/modes/chrysler.h @@ -79,7 +79,7 @@ static void chrysler_rx_hook(const CANPacket_t *msg) { bool cruise_engaged = GET_BIT(msg, 21U); pcm_cruise_check(cruise_engaged); - // FrogPilot variables + // StarPilot variables acc_main_on = GET_BIT(msg, 20U); } diff --git a/opendbc_repo/opendbc/safety/modes/ford.h b/opendbc_repo/opendbc/safety/modes/ford.h index a1957ad0..423d9f63 100644 --- a/opendbc_repo/opendbc/safety/modes/ford.h +++ b/opendbc_repo/opendbc/safety/modes/ford.h @@ -159,7 +159,7 @@ static void ford_rx_hook(const CANPacket_t *msg) { bool cruise_engaged = (cruise_state == 4U) || (cruise_state == 5U); pcm_cruise_check(cruise_engaged); - // FrogPilot variables + // StarPilot variables acc_main_on = (cruise_state == 3U) || cruise_engaged; } } diff --git a/opendbc_repo/opendbc/safety/modes/gm.h b/opendbc_repo/opendbc/safety/modes/gm.h index 6e550053..bd8846b9 100644 --- a/opendbc_repo/opendbc/safety/modes/gm.h +++ b/opendbc_repo/opendbc/safety/modes/gm.h @@ -350,7 +350,7 @@ static void gm_rx_hook(const CANPacket_t *msg) { } } - // FrogPilot variables + // StarPilot variables if (msg->addr == 0xC9U) { acc_main_on = GET_BIT(msg, 29U); } diff --git a/opendbc_repo/opendbc/safety/modes/hyundai.h b/opendbc_repo/opendbc/safety/modes/hyundai.h index 2d917358..c431997c 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai.h @@ -52,7 +52,7 @@ const LongitudinalLimits HYUNDAI_LONG_LIMITS = { #define HYUNDAI_FCEV_GAS_ADDR_CHECK \ {.msg = {{0x91, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ -// FrogPilot variables +// StarPilot variables #define HYUNDAI_LDA_BUTTON_ADDR_CHECK \ {.msg = {{0x391, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ @@ -178,7 +178,7 @@ static void hyundai_rx_hook(const CANPacket_t *msg) { brake_pressed = ((msg->data[5] >> 5U) & 0x3U) == 0x2U; } - // FrogPilot variables + // StarPilot variables if (msg->addr == 0x391U) { hyundai_lkas_button_check(GET_BIT(msg, 4U)); } @@ -288,7 +288,7 @@ static safety_config hyundai_init(uint16_t param) { HYUNDAI_FCEV_GAS_ADDR_CHECK }; - // FrogPilot variables + // StarPilot variables static RxCheck hyundai_long_rx_checks_lda[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_LDA_BUTTON_ADDR_CHECK @@ -325,7 +325,7 @@ static safety_config hyundai_init(uint16_t param) { HYUNDAI_SCC12_ADDR_CHECK(2) }; - // FrogPilot variables + // StarPilot variables static RxCheck hyundai_cam_scc_rx_checks_lda[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_SCC12_ADDR_CHECK(2) @@ -349,7 +349,7 @@ static safety_config hyundai_init(uint16_t param) { HYUNDAI_FCEV_GAS_ADDR_CHECK }; - // FrogPilot variables + // StarPilot variables static RxCheck hyundai_rx_checks_lda[] = { HYUNDAI_COMMON_RX_CHECKS(false) HYUNDAI_SCC12_ADDR_CHECK(0) diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h index 3a7b5c9e..fb508132 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_canfd.h @@ -89,13 +89,13 @@ static void hyundai_canfd_rx_hook(const CANPacket_t *msg) { cruise_button = msg->data[2] & 0x7U; main_button = GET_BIT(msg, 19U); - // FrogPilot variables + // StarPilot variables hyundai_lkas_button_check(GET_BIT(msg, 23U)); } else { cruise_button = (msg->data[4] >> 4) & 0x7U; main_button = GET_BIT(msg, 34U); - // FrogPilot variables + // StarPilot variables hyundai_lkas_button_check(GET_BIT(msg, 39U)); } hyundai_common_cruise_buttons_check(cruise_button, main_button); diff --git a/opendbc_repo/opendbc/safety/modes/hyundai_common.h b/opendbc_repo/opendbc/safety/modes/hyundai_common.h index f57b34e2..4d6648ca 100644 --- a/opendbc_repo/opendbc/safety/modes/hyundai_common.h +++ b/opendbc_repo/opendbc/safety/modes/hyundai_common.h @@ -42,7 +42,7 @@ bool hyundai_fcev_gas_signal = false; extern bool hyundai_alt_limits_2; bool hyundai_alt_limits_2 = false; -// FrogPilot variables +// StarPilot variables extern bool hyundai_has_lda_button; bool hyundai_has_lda_button = false; @@ -57,7 +57,7 @@ void hyundai_common_init(uint16_t param) { const uint16_t HYUNDAI_PARAM_FCEV_GAS = 256; const uint16_t HYUNDAI_PARAM_ALT_LIMITS_2 = 512; - // FrogPilot variables + // StarPilot variables const int HYUNDAI_PARAM_HAS_LDA_BUTTON = 1024; hyundai_ev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_EV_GAS); @@ -68,7 +68,7 @@ void hyundai_common_init(uint16_t param) { hyundai_fcev_gas_signal = GET_FLAG(param, HYUNDAI_PARAM_FCEV_GAS); hyundai_alt_limits_2 = GET_FLAG(param, HYUNDAI_PARAM_ALT_LIMITS_2); - // FrogPilot variables + // StarPilot variables hyundai_has_lda_button = GET_FLAG(param, HYUNDAI_PARAM_HAS_LDA_BUTTON); hyundai_last_button_interaction = HYUNDAI_PREV_BUTTON_SAMPLES; @@ -121,7 +121,7 @@ void hyundai_common_cruise_buttons_check(const int cruise_button, const bool mai cruise_button_prev = cruise_button; } - // FrogPilot variables + // StarPilot variables if (main_button && !main_button_prev) { acc_main_on = !acc_main_on; } @@ -155,7 +155,7 @@ uint32_t hyundai_common_canfd_compute_checksum(const CANPacket_t *msg) { } #endif -// FrogPilot variables +// StarPilot variables void hyundai_lkas_button_check(const bool lkas_button) { if (lkas_button && !lkas_button_prev) { lkas_on = !lkas_on; diff --git a/opendbc_repo/opendbc/safety/modes/mazda.h b/opendbc_repo/opendbc/safety/modes/mazda.h index cb9d9f37..888e7c6d 100644 --- a/opendbc_repo/opendbc/safety/modes/mazda.h +++ b/opendbc_repo/opendbc/safety/modes/mazda.h @@ -35,7 +35,7 @@ static void mazda_rx_hook(const CANPacket_t *msg) { bool cruise_engaged = msg->data[0] & 0x8U; pcm_cruise_check(cruise_engaged); - // FrogPilot variables + // StarPilot variables acc_main_on = GET_BIT(msg, 17U); } diff --git a/opendbc_repo/opendbc/safety/modes/nissan.h b/opendbc_repo/opendbc/safety/modes/nissan.h index 23765687..350133a0 100644 --- a/opendbc_repo/opendbc/safety/modes/nissan.h +++ b/opendbc_repo/opendbc/safety/modes/nissan.h @@ -51,7 +51,7 @@ static void nissan_rx_hook(const CANPacket_t *msg) { pcm_cruise_check(cruise_engaged); } - // FrogPilot variables + // StarPilot variables if ((msg->addr == 0x1B6U) && (msg->bus == (nissan_alt_eps ? 2U : 1U))) { acc_main_on = GET_BIT(msg, 36U); } diff --git a/opendbc_repo/opendbc/safety/modes/psa.h b/opendbc_repo/opendbc/safety/modes/psa.h index 04e12b7c..8e3a65da 100644 --- a/opendbc_repo/opendbc/safety/modes/psa.h +++ b/opendbc_repo/opendbc/safety/modes/psa.h @@ -10,7 +10,7 @@ #define PSA_DAT_BSI 1042U // RX from BSI, brake #define PSA_LANE_KEEP_ASSIST 1010U // TX from OP, EPS -// FrogPilot variables +// StarPilot variables #define PSA_HS2_DYN1_MDD_ETAT_2B6 694U // RX from BSI, ACC status // CAN bus @@ -24,7 +24,7 @@ static uint8_t psa_get_counter(const CANPacket_t *msg) { cnt = (msg->data[3] >> 4) & 0xFU; } else if (msg->addr == PSA_HS2_DYN_ABR_38D) { cnt = (msg->data[5] >> 4) & 0xFU; - // FrogPilot variables + // StarPilot variables } else if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) { cnt = (msg->data[7] >> 4) & 0xFU; } else { @@ -38,7 +38,7 @@ static uint32_t psa_get_checksum(const CANPacket_t *msg) { chksum = msg->data[5] & 0xFU; } else if (msg->addr == PSA_HS2_DYN_ABR_38D) { chksum = msg->data[5] & 0xFU; - // FrogPilot variables + // StarPilot variables } else if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) { chksum = msg->data[7] & 0xFU; } else { @@ -68,7 +68,7 @@ static uint32_t psa_compute_checksum(const CANPacket_t *msg) { chk = _psa_compute_checksum(msg, 0x4, 5); } else if (msg->addr == PSA_HS2_DYN_ABR_38D) { chk = _psa_compute_checksum(msg, 0x7, 5); - // FrogPilot variables + // StarPilot variables } else if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) { chk = _psa_compute_checksum(msg, 0x3, 7); } else { @@ -96,7 +96,7 @@ static void psa_rx_hook(const CANPacket_t *msg) { if (msg->addr == PSA_HS2_DAT_MDD_CMD_452) { pcm_cruise_check((msg->data[2U] >> 7U) & 1U); // RVV_ACC_ACTIVATION_REQ } - // FrogPilot variables + // StarPilot variables if (msg->addr == PSA_HS2_DYN1_MDD_ETAT_2B6) { acc_main_on = (msg->data[3] & 0x0FU) > 2; } @@ -153,7 +153,7 @@ static safety_config psa_init(uint16_t param) { {.msg = {{PSA_DYN_CMM, PSA_MAIN_BUS, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // gas pedal {.msg = {{PSA_DAT_BSI, PSA_CAM_BUS, 8, 20U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // brake - // FrogPilot variables + // StarPilot variables {.msg = {{PSA_HS2_DYN1_MDD_ETAT_2B6, PSA_ADAS_BUS, 8, 20U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // ACC status }; diff --git a/opendbc_repo/opendbc/safety/modes/rivian.h b/opendbc_repo/opendbc/safety/modes/rivian.h index 176694b7..c55c6e8b 100644 --- a/opendbc_repo/opendbc/safety/modes/rivian.h +++ b/opendbc_repo/opendbc/safety/modes/rivian.h @@ -98,7 +98,7 @@ static void rivian_rx_hook(const CANPacket_t *msg) { const int feature_status = msg->data[2] >> 5U; pcm_cruise_check(feature_status == 1); - // FrogPilot variables + // StarPilot variables acc_main_on = (feature_status == 0) || (feature_status == 1); } } diff --git a/opendbc_repo/opendbc/safety/modes/subaru.h b/opendbc_repo/opendbc/safety/modes/subaru.h index 94955cdd..be893bbb 100644 --- a/opendbc_repo/opendbc/safety/modes/subaru.h +++ b/opendbc_repo/opendbc/safety/modes/subaru.h @@ -110,7 +110,7 @@ static void subaru_rx_hook(const CANPacket_t *msg) { bool cruise_engaged = (msg->data[5] >> 1) & 1U; pcm_cruise_check(cruise_engaged); - // FrogPilot variables + // StarPilot variables acc_main_on = GET_BIT(msg, 40U); } diff --git a/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h b/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h index 673728d6..77a83065 100644 --- a/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h +++ b/opendbc_repo/opendbc/safety/modes/subaru_preglobal.h @@ -34,7 +34,7 @@ static void subaru_preglobal_rx_hook(const CANPacket_t *msg) { bool cruise_engaged = (msg->data[6] >> 1) & 1U; pcm_cruise_check(cruise_engaged); - // FrogPilot variables + // StarPilot variables acc_main_on = GET_BIT(msg, 48U); } diff --git a/opendbc_repo/opendbc/safety/modes/tesla.h b/opendbc_repo/opendbc/safety/modes/tesla.h index dd1394b3..9bfc2b5a 100644 --- a/opendbc_repo/opendbc/safety/modes/tesla.h +++ b/opendbc_repo/opendbc/safety/modes/tesla.h @@ -160,7 +160,7 @@ static void tesla_rx_hook(const CANPacket_t *msg) { pcm_cruise_check(cruise_engaged); - // FrogPilot variables + // StarPilot variables acc_main_on = ((cruise_state == 1) || cruise_engaged) && !tesla_autopark; } diff --git a/opendbc_repo/opendbc/safety/modes/toyota.h b/opendbc_repo/opendbc/safety/modes/toyota.h index 47b50cf1..912d8727 100644 --- a/opendbc_repo/opendbc/safety/modes/toyota.h +++ b/opendbc_repo/opendbc/safety/modes/toyota.h @@ -39,7 +39,7 @@ #define TOYOTA_COMMON_RX_CHECKS(lta) \ {.msg = {{ 0xaa, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ {.msg = {{0x260, 0, 8, 50U, .ignore_counter = true, .ignore_quality_flag=!(lta)}, { 0 }, { 0 }}}, \ - /* FrogPilot Variables */ \ + /* StarPilot Variables */ \ {.msg = {{0x1D3, 0, 8, 33U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \ #define TOYOTA_RX_CHECKS(lta) \ @@ -162,7 +162,7 @@ static void toyota_rx_hook(const CANPacket_t *msg) { UPDATE_VEHICLE_SPEED(speed / 4.0 * 0.01 * KPH_TO_MS); } - // FrogPilot variables + // StarPilot variables if (msg->addr == 0x1D3U) { acc_main_on = GET_BIT(msg, 15U); } diff --git a/opendbc_repo/opendbc/safety/safety.h b/opendbc_repo/opendbc/safety/safety.h index f18f01e9..47709c0b 100644 --- a/opendbc_repo/opendbc/safety/safety.h +++ b/opendbc_repo/opendbc/safety/safety.h @@ -60,7 +60,7 @@ bool acc_main_on = false; // referred to as "ACC off" in ISO 15622:2018 int cruise_button_prev = 0; bool safety_rx_checks_invalid = false; -// FrogPilot variables +// StarPilot variables bool aol_allowed = false; bool lkas_button_prev = false; bool lkas_on = false; @@ -375,7 +375,7 @@ static void generic_rx_checks(void) { } steering_disengage_prev = steering_disengage; - // FrogPilot variables + // StarPilot variables aol_allowed = (acc_main_on || lkas_on) && (alternative_experience & ALT_EXP_ALWAYS_ON_LATERAL); } @@ -501,7 +501,7 @@ int set_safety_hooks(uint16_t mode, uint16_t param) { enable_gas_interceptor = false; gas_interceptor_prev = 0; - // FrogPilot variables + // StarPilot variables aol_allowed = false; lkas_button_prev = false; lkas_on = false; diff --git a/opendbc_repo/opendbc/safety/tests/common.py b/opendbc_repo/opendbc/safety/tests/common.py index 51d3bba7..4be28d7f 100644 --- a/opendbc_repo/opendbc/safety/tests/common.py +++ b/opendbc_repo/opendbc/safety/tests/common.py @@ -310,7 +310,7 @@ class TorqueSteeringSafetyTestBase(SafetyTestBase, abc.ABC): for _ in range(10): self.assertFalse(self._tx(self._torque_cmd_msg(self.MAX_TORQUE, 1))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): """Toggles "Always On Lateral" On/Off""" pass @@ -851,7 +851,7 @@ class AngleSteeringSafetyTest(VehicleSpeedSafetyTest): for _ in range(5): self.assertTrue(self._tx(self._angle_cmd_msg(0, True, increment_timer=False))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): """Toggles "Always On Lateral" on/off""" pass diff --git a/opendbc_repo/opendbc/safety/tests/hyundai_common.py b/opendbc_repo/opendbc/safety/tests/hyundai_common.py index fb18e495..9ec336b6 100644 --- a/opendbc_repo/opendbc/safety/tests/hyundai_common.py +++ b/opendbc_repo/opendbc/safety/tests/hyundai_common.py @@ -71,7 +71,7 @@ class HyundaiButtonBase: self.assertEqual(controls_allowed, self.safety.get_controls_allowed()) self._rx(self._button_msg(Buttons.NONE)) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): """ Simulates toggling the main cruise button. The safety model requires a diff --git a/opendbc_repo/opendbc/safety/tests/test_chrysler.py b/opendbc_repo/opendbc/safety/tests/test_chrysler.py index be424584..b461b670 100755 --- a/opendbc_repo/opendbc/safety/tests/test_chrysler.py +++ b/opendbc_repo/opendbc/safety/tests/test_chrysler.py @@ -71,7 +71,7 @@ class TestChryslerSafety(common.CarSafetyTest, common.MotorTorqueSteeringSafetyT self.assertFalse(self._tx(self._button_msg(cancel=True, resume=True))) self.assertFalse(self._tx(self._button_msg(cancel=False, resume=False))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # DAS_3, bit 20 is ACC_AVAILABLE values = {"ACC_AVAILABLE": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_ford.py b/opendbc_repo/opendbc/safety/tests/test_ford.py index 3c9ab26f..b977315f 100755 --- a/opendbc_repo/opendbc/safety/tests/test_ford.py +++ b/opendbc_repo/opendbc/safety/tests/test_ford.py @@ -378,7 +378,7 @@ class TestFordSafetyBase(common.CarSafetyTest): for bus in (0, 2): self.assertEqual(enabled, self._tx(self._acc_button_msg(Buttons.CANCEL, bus))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # EngBrakeData, CcStat_D_Actl is the cruise state # 3 is standby (main on), 5 is active (engaged) diff --git a/opendbc_repo/opendbc/safety/tests/test_gm.py b/opendbc_repo/opendbc/safety/tests/test_gm.py index 6ee2e3af..5815c37a 100755 --- a/opendbc_repo/opendbc/safety/tests/test_gm.py +++ b/opendbc_repo/opendbc/safety/tests/test_gm.py @@ -132,7 +132,7 @@ class TestGmSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTe values = {"ACCButtons": buttons} return self.packer.make_can_msg_safety("ASCMSteeringButton", self.BUTTONS_BUS, values) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # ECMEngineStatus, bit 29 is CruiseMainOn values = {"CruiseMainOn": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_honda.py b/opendbc_repo/opendbc/safety/tests/test_honda.py index 571f7cf0..c0ab7d59 100755 --- a/opendbc_repo/opendbc/safety/tests/test_honda.py +++ b/opendbc_repo/opendbc/safety/tests/test_honda.py @@ -237,7 +237,7 @@ class HondaBase(common.CarSafetyTest): self.assertTrue(self._tx(self._send_steer_msg(0x0000))) self.assertFalse(self._tx(self._send_steer_msg(0x1000))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # SCM_FEEDBACK, bit 28 is MAIN_ON values = {"MAIN_ON": 1 if toggle_on else 0, "COUNTER": self.cnt_acc_state % 4} diff --git a/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py b/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py index 7264453d..ab894ce4 100755 --- a/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py +++ b/opendbc_repo/opendbc/safety/tests/test_hyundai_canfd.py @@ -81,7 +81,7 @@ class TestHyundaiCanfdBase(HyundaiButtonBase, common.CarSafetyTest, common.Drive } return self.packer.make_can_msg_safety("CRUISE_BUTTONS", bus, values) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): if not hasattr(self, "_aol_state"): self._aol_state = False @@ -172,7 +172,7 @@ class TestHyundaiCanfdLFASteeringAltButtonsBase(TestHyundaiCanfdLFASteeringBase) self.assertFalse(self._tx(self._acc_cancel_msg(True, accel=1))) self.assertFalse(self._tx(self._acc_cancel_msg(False))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): if not hasattr(self, "_aol_state"): self._aol_state = False diff --git a/opendbc_repo/opendbc/safety/tests/test_mazda.py b/opendbc_repo/opendbc/safety/tests/test_mazda.py index 70ca8581..533259cf 100755 --- a/opendbc_repo/opendbc/safety/tests/test_mazda.py +++ b/opendbc_repo/opendbc/safety/tests/test_mazda.py @@ -80,7 +80,7 @@ class TestMazdaSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTes self.assertTrue(self._tx(self._button_msg(cancel=True))) self.assertTrue(self._tx(self._button_msg(resume=True))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # CRZ_CTRL, CRZ_AVAILABLE is the main on button values = {"CRZ_AVAILABLE": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_nissan.py b/opendbc_repo/opendbc/safety/tests/test_nissan.py index 8f9940a8..94b2e61e 100755 --- a/opendbc_repo/opendbc/safety/tests/test_nissan.py +++ b/opendbc_repo/opendbc/safety/tests/test_nissan.py @@ -79,7 +79,7 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest): tx = self._tx(self._acc_button_cmd(**args)) self.assertEqual(tx, should_tx) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # PRO_PILOT, CRUISE_ON is the main on button for X-Trail/Rogue/Altima values = {"CRUISE_ON": 1 if toggle_on else 0} @@ -119,7 +119,7 @@ class TestNissanLeafSafety(TestNissanSafety): def test_acc_buttons(self): pass - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # CRUISE_THROTTLE, CRUISE_AVAILABLE is the main on button for Leaf values = {"CRUISE_AVAILABLE": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_subaru.py b/opendbc_repo/opendbc/safety/tests/test_subaru.py index 14ea0d55..37a7b1b2 100755 --- a/opendbc_repo/opendbc/safety/tests/test_subaru.py +++ b/opendbc_repo/opendbc/safety/tests/test_subaru.py @@ -111,7 +111,7 @@ class TestSubaruSafetyBase(common.CarSafetyTest): values = {"Cruise_Activated": enable} return self.packer.make_can_msg_safety("CruiseControl", self.ALT_MAIN_BUS, values) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # CruiseControl, Cruise_On is the main on button values = {"Cruise_On": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_subaru_preglobal.py b/opendbc_repo/opendbc/safety/tests/test_subaru_preglobal.py index 405b62d2..ec726f3f 100755 --- a/opendbc_repo/opendbc/safety/tests/test_subaru_preglobal.py +++ b/opendbc_repo/opendbc/safety/tests/test_subaru_preglobal.py @@ -59,7 +59,7 @@ class TestSubaruPreglobalSafety(common.CarSafetyTest, common.DriverTorqueSteerin values = {"Cruise_Activated": enable} return self.packer.make_can_msg_safety("CruiseControl", 0, values) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # CruiseControl, Cruise_On is the main on button values = {"Cruise_On": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_tesla.py b/opendbc_repo/opendbc/safety/tests/test_tesla.py index 95088954..cbca544a 100755 --- a/opendbc_repo/opendbc/safety/tests/test_tesla.py +++ b/opendbc_repo/opendbc/safety/tests/test_tesla.py @@ -353,7 +353,7 @@ class TestTeslaSafetyBase(common.CarSafetyTest, common.AngleSteeringSafetyTest, # Recover self.assertTrue(self._tx(self._angle_cmd_msg(0, True))) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # DI_state, DI_cruiseState is the cruise state, 1 is standby values = {"DI_cruiseState": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_toyota.py b/opendbc_repo/opendbc/safety/tests/test_toyota.py index e52d1183..59b7dc46 100644 --- a/opendbc_repo/opendbc/safety/tests/test_toyota.py +++ b/opendbc_repo/opendbc/safety/tests/test_toyota.py @@ -122,7 +122,7 @@ class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyT self.assertFalse(self._rx(msg)) self.assertFalse(self.safety.get_controls_allowed()) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # pcm_cruise_2, bit 15 is toggle_on values = {"MAIN_ON": 1 if toggle_on else 0} diff --git a/opendbc_repo/opendbc/safety/tests/test_volkswagen_mqb.py b/opendbc_repo/opendbc/safety/tests/test_volkswagen_mqb.py index a8bb66d8..79189d3f 100755 --- a/opendbc_repo/opendbc/safety/tests/test_volkswagen_mqb.py +++ b/opendbc_repo/opendbc/safety/tests/test_volkswagen_mqb.py @@ -126,7 +126,7 @@ class TestVolkswagenMqbSafetyBase(common.CarSafetyTest, common.DriverTorqueSteer self.assertEqual(0, self.safety.get_torque_driver_max()) self.assertEqual(0, self.safety.get_torque_driver_min()) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # TSK_06, TSK_Status is the cruise state, 2 is standby return self._tsk_status_msg(False, main_switch=toggle_on) diff --git a/opendbc_repo/opendbc/safety/tests/test_volkswagen_pq.py b/opendbc_repo/opendbc/safety/tests/test_volkswagen_pq.py index 79ab1029..2f472e58 100755 --- a/opendbc_repo/opendbc/safety/tests/test_volkswagen_pq.py +++ b/opendbc_repo/opendbc/safety/tests/test_volkswagen_pq.py @@ -108,7 +108,7 @@ class TestVolkswagenPqSafetyBase(common.CarSafetyTest, common.DriverTorqueSteeri self.assertEqual(0, self.safety.get_torque_driver_max()) self.assertEqual(0, self.safety.get_torque_driver_min()) - # FrogPilot variables + # StarPilot variables def _toggle_aol(self, toggle_on): # Motor_5, GRA_Hauptschalter is the main cruise switch return self._motor_5_msg(main_switch=toggle_on) diff --git a/openpilot/frogpilot b/openpilot/frogpilot deleted file mode 120000 index 7f578691..00000000 --- a/openpilot/frogpilot +++ /dev/null @@ -1 +0,0 @@ -../frogpilot \ No newline at end of file diff --git a/openpilot/starpilot b/openpilot/starpilot new file mode 120000 index 00000000..0b215aff --- /dev/null +++ b/openpilot/starpilot @@ -0,0 +1 @@ +../starpilot \ No newline at end of file diff --git a/panda/board/obj/body_h7.bin.signed b/panda/board/obj/body_h7.bin.signed index c754022d624417da596f3ead9f89bf79e0b45543..d33c3825617fd11a62ba0b7f23db81616974b8d1 100644 GIT binary patch delta 153 zcmV;K0A~NV)C9QH1h5FI2w`J1V`XD9WwQ{fsDFRB4q;i$a~Eqx&9KjDQR(%alB0~^ zGRX%Ldgygg+`)vR$@!ENShEb|ebktK+i1$@f9R}z5kTysw6RD1PAogrcqZ7;bi1!c%{2Jm=#0U}+$0!fS>*sHRyLf7q{$ Hw4DJuPZ&-B delta 153 zcmV;K0A~NV)C9QH1h5FI2sSWbGhsL}WU~;esDFPki{KKM+O_5FAVn?JN*ULZ7ozkb zRnm#;wnj65gke(BjqDR!^P*LM4x(_D9*=W!ki_|+qgv*2vD6SOcFb)4v_sCE z_+XS-<5+SsVOCZLWq0n!ba>?k!MKr3lx517dL2T@Boa`Dcp`z{2kIgYk*F#fttLjG H5##}5J-JB% diff --git a/panda/board/obj/body_h7/bootstub.elf b/panda/board/obj/body_h7/bootstub.elf index 5b2abfa472509b95e61d957b31e3dfd4b68e0c58..0d3c2667ab61d42b2f362beb98abc0cae679e586 100755 GIT binary patch delta 27 jcmdn;fo;nNwhgW}9Er&$$*IXksm;DN+kI^qpH~9_qI(MW delta 27 jcmdn;fo;nNwhgW}9A*ZI#)%e&Db2n%+kI^qpH~9_nkEWm diff --git a/panda/board/obj/body_h7/main.bin b/panda/board/obj/body_h7/main.bin index b2ab0e11c3ce0126ac91c25b6ee8a2429ca51e92..b005fb48d7ceb55896643c996ebf6257edf9540d 100755 GIT binary patch delta 23 dcmdmRnPmeIajfDlQKwF~TG1Y#y2X5KEai)F@r04ACa#{d8T diff --git a/panda/board/obj/bootstub.body_h7.bin b/panda/board/obj/bootstub.body_h7.bin index c34f2ef03f12b7ae32a5aca77a88c65ecae4b999..7eccda5e320573cfd9f4a3290f0fae3e4dc3f960 100755 GIT binary patch delta 21 ccmaEo^dxD6s}4tEvPp7kvQg@0UmbB)0A#xdxBvhE delta 21 ccmaEo^dxD6s}6^mL85V@g<;BOUmbB)0A8*KCIA2c diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index a6a153f47bcb9925e4d3cc172f55d616562493f1..88ef9ff2d4003edfffc79dc5f0d9cafa3c2e5e48 100755 GIT binary patch delta 34 qcmdlJwkK?ZubNp(pJ3|A*Zo9oo}u>b(qU<;`L delta 34 qcmdlJwkK?ZubQBlL85V@g<*=Wi>p(pJ3|A*Zo9oo}u>b(c=?fPC diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin index 8fca7344f22f2cfcb2ea7d1e3768c5428748cff0..61d7943fbd42632bc268fac0da11f3c8f79af41d 100755 GIT binary patch delta 23 fcmaDbiSfZC#tog$9Er&$$*IXkshcM{pJxRCco+$Q delta 23 fcmaDbiSfZC#tog$9A*ZI#)%e&DVrxcpJxRCatjFV diff --git a/panda/board/obj/bootstub.panda_h7_remote.bin b/panda/board/obj/bootstub.panda_h7_remote.bin index 8fca7344f22f2cfcb2ea7d1e3768c5428748cff0..61d7943fbd42632bc268fac0da11f3c8f79af41d 100755 GIT binary patch delta 23 fcmaDbiSfZC#tog$9Er&$$*IXkshcM{pJxRCco+$Q delta 23 fcmaDbiSfZC#tog$9A*ZI#)%e&DVrxcpJxRCatjFV diff --git a/panda/board/obj/bootstub.panda_jungle_h7.bin b/panda/board/obj/bootstub.panda_jungle_h7.bin index b7d30822dc24b5a08ec7569568c38bc728f6a481..893b8cee1f715e204e06e76c584b4b844ba7f571 100755 GIT binary patch delta 21 ccmZq4ZOPrR*MK82*(5nN*(i1MQG@-g0Af`Lt^fc4 delta 21 ccmZq4ZOPrR*MP&!AkjF{!Z2m?QG@-g09;528~^|S diff --git a/panda/board/obj/bootstub.panda_remote.bin b/panda/board/obj/bootstub.panda_remote.bin index a6a153f47bcb9925e4d3cc172f55d616562493f1..88ef9ff2d4003edfffc79dc5f0d9cafa3c2e5e48 100755 GIT binary patch delta 34 qcmdlJwkK?ZubNp(pJ3|A*Zo9oo}u>b(qU<;`L delta 34 qcmdlJwkK?ZubQBlL85V@g<*=Wi>p(pJ3|A*Zo9oo}u>b(c=?fPC diff --git a/panda/board/obj/gitversion.h b/panda/board/obj/gitversion.h index 40f8c9ae..75c19505 100644 --- a/panda/board/obj/gitversion.h +++ b/panda/board/obj/gitversion.h @@ -1,2 +1,2 @@ extern const uint8_t gitversion[19]; -const uint8_t gitversion[19] = "DEV-60a3a81d-DEBUG"; +const uint8_t gitversion[19] = "DEV-ac4cec2e-DEBUG"; diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index 8689490d56f84a2eec44c0d23fd350c287580b96..bb860ca931df15c495ae6dfce203221a46d09217 100644 GIT binary patch delta 153 zcmV;K0A~OEmjwKm1hDX$2w`J1V`XD9WwZF2gm8a;f`VPZE53FQ&^m1VvwWn>YnIrA zWcEcZU6X9D*dd)?6=cYg!A!qZ&bpMnoPA4!9Gp7D+SD1=6^Tfue`=t5L>$u-5|?uT z@ht9?`BfavcI=^s=cvj3T^Z~;{_uZ_G`{g?0&e)yB61!wOGv|(R9U0nBG28}@invZ HL_z^KtmID` delta 153 zcmV;K0A~OEmjwKm1hDX$2sSWbGhsL}WV861gm8Z;&GX=P)PW@M2h1jr;Hf|znOuPi zl3PumHaLvxlle1B^X#DOoZA2O*gbSD-VL{i3m0ZEe`S}}zzEJ}f|sWxMmMCwt*%>_ z`!#Bd+TIa`Y1BNGY0Y7MBajQB9ZVk}^eSJ$WRG}T0sJ?^XH3uy5Msd&o2}&MrX?Q5 H6b%9OAAL%@ diff --git a/panda/board/obj/panda/bootstub.elf b/panda/board/obj/panda/bootstub.elf index 43ac7aafc8a7fb5184faa41d6d0471b6a8c1a95c..6f20f172152b34a16eaa89d1d604d90da10e6799 100755 GIT binary patch delta 40 wcmbO+nQg{owhg{!f{Do{$*IXksk$z%PND7$4GfbfnkqEcnQgB#W0VR802dYv{r~^~ delta 40 wcmbO+nQg{owhg{!f@TJZ#)%e&DY`DMPND7$4GfbfnkqEcnQgB#W0VR800&nLYybcN diff --git a/panda/board/obj/panda/main.bin b/panda/board/obj/panda/main.bin index 92feb62c4576c0c7a2eaad619c80cca83e4d73a5..5bf7fdac1391da357fc8d4d0a51b3a5303c11756 100755 GIT binary patch delta 23 fcmew|jpfTUmJJ_faU>?2B&Q}DrEdN)tEK<|ihK)7 delta 23 fcmew|jpfTUmJJ_fahMq-8Yfy9rfmK(tEK<|gl`JC diff --git a/panda/board/obj/panda/main.elf b/panda/board/obj/panda/main.elf index 9801cd8f8bcbe2e3269aa4e33b87dfa631b209d8..b3edac6227980cd46572c45e75a2ba3379344291 100755 GIT binary patch delta 39 scmeBKF4D7HWW$G59Er&$$*IXksm(uDwf|Vf2*gZ4%)I@_DwZi30D5{8ng9R* delta 39 scmeBKF4D7HWW$G59A*ZI#)%e&Da}7twf|Vf2*gZ4%)I@_DwZi30BcPX2mk;8 diff --git a/panda/board/obj/panda_h7.bin.signed b/panda/board/obj/panda_h7.bin.signed index e9d2bf1884e25ebde3b460e2b8a65b33a05b2f5e..a7b746e9b672f1a70ed3c68746abddec9ebe020e 100644 GIT binary patch delta 152 zcmV;J0B8Tak_Ehy1)#X0Bu?DX956G-m{bhYXzJONcEn!-`z(RF=AA;K%Ok9*`{Q*F= zqiaINMfR^5a?JD2Z- z+BTC;ug}W)Wc@I;xB9g^r5!#&exL?hr2){~{xH62(-jcsu8T3vx0!iwBuJ4n{!h*L zceX80qmxwl4tJC`N-9^;tp<)BJDj$LLOXZsB);9)rgWqz1HphI$o2IK1}-+#o~)Jb Gt^rBAIZ5XL diff --git a/panda/board/obj/panda_h7/bootstub.elf b/panda/board/obj/panda_h7/bootstub.elf index 2a4eb0b43efbee566d26468da59019be7d556aa5..be7df209f157f92f5859ae1a57be53eaea14e1ad 100755 GIT binary patch delta 31 ncmbQSl5@sN&JCTx9Er&$$*IXksm&9E+b0GyZl4&;#Lfr+$3hER delta 31 ncmbQSl5@sN&JCTx9A*ZI#)%e&Da{ju+b0GyZl4&;#Lfr+yrl}s diff --git a/panda/board/obj/panda_h7/main.bin b/panda/board/obj/panda_h7/main.bin index 808133dfbb1f7e2560eb4ec17b41d680c57891f9..cacad09ed506143c3eaa5950102c06583300d9a8 100755 GIT binary patch delta 22 ecmdlok#);N)&<8n5|d4mQUa=|r@#AK7?)MTU7W{zv^9M>3umUa=|qYGlN9qL<_@|W{zv^9M>3um)(t0)awI03B&Q}DrEb1(bWIZgi(Lzt delta 23 fcmew}f%VS>)(t0)a+nz;8Yfy9rfj}&bWIZgg-{Cy diff --git a/panda/board/obj/panda_h7_remote/main.elf b/panda/board/obj/panda_h7_remote/main.elf index 252915cee770fe2957e6a7736b578fb9f4cacf5b..ef3e89e39b9453d948bcc021257aa500c803309d 100755 GIT binary patch delta 43 vcmbQyDmkN7a>I$M9Er&$$*IXksm&LzwqLl)2*gZ4%nZaV+b>*YJ&^+d%1#yY delta 43 vcmbQyDmkN7a>I$M9A*ZI#)%e&Da{wIwqLl)2*gZ4%nZaV+b>*YJ&^+dxY-q9 diff --git a/panda/board/obj/panda_jungle_h7.bin.signed b/panda/board/obj/panda_jungle_h7.bin.signed index ac236627810ee386555209f2064547950c7d2b5f..5cc2f66cb42e0f8b8765da394f7b6482b6f7b465 100644 GIT binary patch delta 153 zcmV;K0A~O2;so&G1hBQP2w`J1V`XD9WwX7mGlGAYhqte$W797kt{>qA+|2uS&<6pA zhLMdQJ$*KJ1eAEZExP06Zh{TG{E^8b$mMHN*d?UGET delta 153 zcmV;K0A~O2;so&G1hBQP2sSWbGhsL}WV5}lGlGAeI*)8b_${m00i`Pyz|SnN#MGwO z*m6e*#j&MyMC>|Y8T0F!%R-`p+>Qb7hYqJ!T%e7S1lk`?4!)y}=vXj(Q^Lic9*O6F z!P}-+y=!g!39o;3s$aHh`L!%Eg*8abY>y~t(t}gqhD$hI5A64Ahg_XfMe$?Vn*3-q H7>NOJJ9JGC diff --git a/panda/board/obj/panda_jungle_h7/bootstub.elf b/panda/board/obj/panda_jungle_h7/bootstub.elf index dacf056e5e54616cc50f025d819a6420f863f872..d5bfb275cbe214229cd3f43f3d2dab0b39032401 100755 GIT binary patch delta 27 jcmZ2*f_=dW_6>U-I1-ahl2en7Qk#!DY(MJ27`+$(rUna< delta 27 jcmZ2*f_=dW_6>U-ILr(ZjT0>lQ<{%DY(MJ27`+$(ov{l4 diff --git a/panda/board/obj/panda_jungle_h7/main.bin b/panda/board/obj/panda_jungle_h7/main.bin index 9242cb7f34a0e33f70c6e67bb8ac94d3baba3faa..6838926c5190c3669593c602b6de21cb6292b8b0 100755 GIT binary patch delta 23 fcmaFykmbcgmJM6iaU>?2B&Q}DrEcE4PP+*Jkhcpv delta 23 fcmaFykmbcgmJM6iahMq-8Yfy9rflB3PP+*JimD2! diff --git a/panda/board/obj/panda_jungle_h7/main.elf b/panda/board/obj/panda_jungle_h7/main.elf index fbca5aa64eb85e497b468710893ee46dbfb9a48c..1d583d2a8cc97a2989abcd7a2411b6a2dadd637d 100755 GIT binary patch delta 39 tcmZ4UNo>t0u?<`IaU>?2B&Q}Dr8e)~*S>cjBM>tIG4uAl`&jaS0RW2o6ZZfB delta 39 tcmZ4UNo>t0u?<`IahMq-8Yfy9rZn%}*S>cjBM>tIG4uAl`&jaS0RVf>6J-DZ diff --git a/panda/board/obj/panda_remote.bin.signed b/panda/board/obj/panda_remote.bin.signed index a0bcdc514b0d07a8795b2e060de4355e25ecd411..f45bc170c45f695d5afcc96f837c18923926b5cf 100644 GIT binary patch delta 153 zcmV;K0A~Ntmjuw41hB-K2w`J1V`XD9WwXqhgm8aQ^sCKoa`&Aot+fE!T4Q9Oyb-Mh zJC$-K)w_1WQI4ZNi;5t{bOHcL3WJW;o!6-(+7ZH|UTyIT^gbX4F=-kXq0X4~S)+%d zw&+&Uy%+Ru*X<2o_C|Y3fKLAJqB?}e$_`UQpurImRH8Bp=0e3F3?t)kMBI8A8ny`l HbQb~1OWH@^ delta 153 zcmV;K0A~Ntmjuw41hB-K2sSWbGhsL}WV6hggm8aaE&%F)(azQ2P3zFAaVJ(l`gq9w zHtRA1EEJM4{ti>NdXOY*V+c!=ma^(I zYO)3XR=SN(#NA}o;8ne6E}^j0zY*VQj*7M9v_Xwy>R HkK+N;)}c;p diff --git a/panda/board/obj/panda_remote/bootstub.elf b/panda/board/obj/panda_remote/bootstub.elf index c207d7c47ef87a1083b949187574e62637c6f525..020b076dab0d7f54776ca0e3f8dd8d77eec79758 100755 GIT binary patch delta 40 wcmZ25nQg&jwhg{!f{Do{$*IXksk$z%PND7$4GfbfnkqEcnQgB#V^j(T02z)A761SM delta 40 wcmZ25nQg&jwhg{!f@TJZ#)%e&DY`DMPND7$4GfbfnkqEcnQgB#V^j(T013|wga7~l diff --git a/panda/board/obj/panda_remote/main.bin b/panda/board/obj/panda_remote/main.bin index 128d5f0db3076b94955396641e9ba3ae6ed23817..cb6a37fe2bab28af5813a65b8fca2f6bed98a6f2 100755 GIT binary patch delta 23 fcmX>xjpf8NmJLT{aU>?2B&Q}DrEWemtEK<|f2azY delta 23 fcmX>xjpf8NmJLT{ahMq-8Yfy9rffbltEK<|d7BCd diff --git a/panda/board/obj/panda_remote/main.elf b/panda/board/obj/panda_remote/main.elf index f2e004cb62c0468a7bafbdf535474d49cd87cc4b..f5863202b156d921ef7df4e944b43566c1a559c4 100755 GIT binary patch delta 39 tcmbQRTx7y>kqt*yaU>?2B&Q}Dr8b{g)qZ9bBM>tIG4u8_t5}X?003)-63PGo delta 39 tcmbQRTx7y>kqt*yahMq-8Yfy9rZk^f)qZ9bBM>tIG4u8_t5}X?003NB5;y<= diff --git a/panda/board/obj/version b/panda/board/obj/version index 7906e632..1f33886d 100644 --- a/panda/board/obj/version +++ b/panda/board/obj/version @@ -1 +1 @@ -DEV-60a3a81d-DEBUG \ No newline at end of file +DEV-ac4cec2e-DEBUG \ No newline at end of file diff --git a/scripts/host_tool_runner.sh b/scripts/host_tool_runner.sh index 0b6d4e00..91af81da 100755 --- a/scripts/host_tool_runner.sh +++ b/scripts/host_tool_runner.sh @@ -319,7 +319,7 @@ setup_build_env() { } export_workdir_pythonpath() { - export PYTHONPATH="${WORK_DIR}:${WORK_DIR}/frogpilot/third_party" + export PYTHONPATH="${WORK_DIR}:${WORK_DIR}/starpilot/third_party" local repo_dir="" for repo_dir in "${WORK_DIR}"/*_repo; do [[ -d "${repo_dir}" ]] && export PYTHONPATH="${PYTHONPATH}:${repo_dir}" diff --git a/scripts/laptop_device_build.sh b/scripts/laptop_device_build.sh index 31509404..8dae02bb 100755 --- a/scripts/laptop_device_build.sh +++ b/scripts/laptop_device_build.sh @@ -237,8 +237,8 @@ scrub_mixed_arch_artifacts() { "${ROOT_DIR}/common/transformations/transformations.so" \ "${ROOT_DIR}/selfdrive/modeld/models/commonmodel_pyx.o" \ "${ROOT_DIR}/selfdrive/modeld/models/commonmodel_pyx.so" \ - "${ROOT_DIR}/frogpilot/tinygrad_modeld/models/commonmodel_pyx.o" \ - "${ROOT_DIR}/frogpilot/tinygrad_modeld/models/commonmodel_pyx.so" + "${ROOT_DIR}/starpilot/tinygrad_modeld/models/commonmodel_pyx.o" \ + "${ROOT_DIR}/starpilot/tinygrad_modeld/models/commonmodel_pyx.so" } sync_sysroot_from_device() { diff --git a/scripts/launch_ui_c4_desktop.sh b/scripts/launch_ui_c4_desktop.sh index 18c71a15..2c9e0194 100755 --- a/scripts/launch_ui_c4_desktop.sh +++ b/scripts/launch_ui_c4_desktop.sh @@ -44,7 +44,7 @@ if [[ ! -x "${PY_BIN}" ]]; then fi export PATH="${ROOT_DIR}/.venv/bin:${PATH}" -export PYTHONPATH="${ROOT_DIR}:${ROOT_DIR}/frogpilot/third_party" +export PYTHONPATH="${ROOT_DIR}:${ROOT_DIR}/starpilot/third_party" for d in "${ROOT_DIR}"/*_repo; do [[ -d "$d" ]] && export PYTHONPATH="${PYTHONPATH}:$d"; done [[ -d "${ROOT_DIR}/third_party/acados" ]] && export PYTHONPATH="${PYTHONPATH}:${ROOT_DIR}/third_party/acados" export BIG=0 @@ -53,10 +53,10 @@ export SIMULATION=1 export SKIP_FW_QUERY=1 export USE_WEBCAM=1 -backup_dir="$(mktemp -d /tmp/frogpilot_c4_ui_backup.XXXXXX)" +backup_dir="$(mktemp -d /tmp/starpilot_c4_ui_backup.XXXXXX)" backup_manifest="${backup_dir}/.artifact_manifest" -PRE_TRACKED_DIRTY="$(mktemp /tmp/frogpilot_c4_pretracked.XXXXXX)" -POST_TRACKED_DIRTY="$(mktemp /tmp/frogpilot_c4_posttracked.XXXXXX)" +PRE_TRACKED_DIRTY="$(mktemp /tmp/starpilot_c4_pretracked.XXXXXX)" +POST_TRACKED_DIRTY="$(mktemp /tmp/starpilot_c4_posttracked.XXXXXX)" FAKE_WIFI_PID="" runtime_artifacts=( diff --git a/scripts/launch_ui_desktop.sh b/scripts/launch_ui_desktop.sh index b8f260fc..c05b5e7e 100755 --- a/scripts/launch_ui_desktop.sh +++ b/scripts/launch_ui_desktop.sh @@ -31,9 +31,9 @@ if [[ "$(uname -s)" == "Darwin" ]]; then OS_EXT="macos" fi HOST_UI="${ROOT_DIR}/selfdrive/ui/ui.${OS_EXT}" -PRE_TRACKED_DIRTY="$(mktemp /tmp/frogpilot_c3_pretracked.XXXXXX)" -POST_TRACKED_DIRTY="$(mktemp /tmp/frogpilot_c3_posttracked.XXXXXX)" -BACKUP_DIR="$(mktemp -d /tmp/frogpilot_c3_backup.XXXXXX)" +PRE_TRACKED_DIRTY="$(mktemp /tmp/starpilot_c3_pretracked.XXXXXX)" +POST_TRACKED_DIRTY="$(mktemp /tmp/starpilot_c3_posttracked.XXXXXX)" +BACKUP_DIR="$(mktemp -d /tmp/starpilot_c3_backup.XXXXXX)" BACKUP_MANIFEST="${BACKUP_DIR}/.artifact_manifest" FAKE_WIFI_PID="" @@ -181,7 +181,7 @@ prepare_host_artifacts() { remove_if_elf "msgq_repo/msgq/visionipc/visionipc_pyx.so" purge_objects "${ROOT_DIR}/selfdrive/ui" - purge_objects "${ROOT_DIR}/frogpilot/ui" + purge_objects "${ROOT_DIR}/starpilot/ui" rm -f "${ROOT_DIR}/selfdrive/ui/ui" } @@ -206,7 +206,7 @@ unset CPATH C_INCLUDE_PATH CPLUS_INCLUDE_PATH CPPFLAGS CFLAGS CXXFLAGS LDFLAGS prepare_host_artifacts -export PYTHONPATH="${ROOT_DIR}:${ROOT_DIR}/frogpilot/third_party" +export PYTHONPATH="${ROOT_DIR}:${ROOT_DIR}/starpilot/third_party" for d in "${ROOT_DIR}"/*_repo; do [[ -d "$d" ]] && export PYTHONPATH="${PYTHONPATH}:$d"; done [[ -d "${ROOT_DIR}/third_party/acados" ]] && export PYTHONPATH="${PYTHONPATH}:${ROOT_DIR}/third_party/acados" diff --git a/scripts/launch_ui_raybig_desktop.sh b/scripts/launch_ui_raybig_desktop.sh index b2db0699..30657d0f 100755 --- a/scripts/launch_ui_raybig_desktop.sh +++ b/scripts/launch_ui_raybig_desktop.sh @@ -44,7 +44,7 @@ if [[ ! -x "${PY_BIN}" ]]; then fi export PATH="${ROOT_DIR}/.venv/bin:${PATH}" -export PYTHONPATH="${ROOT_DIR}:${ROOT_DIR}/frogpilot/third_party" +export PYTHONPATH="${ROOT_DIR}:${ROOT_DIR}/starpilot/third_party" for d in "${ROOT_DIR}"/*_repo; do [[ -d "$d" ]] && export PYTHONPATH="${PYTHONPATH}:$d"; done [[ -d "${ROOT_DIR}/third_party/acados" ]] && export PYTHONPATH="${PYTHONPATH}:${ROOT_DIR}/third_party/acados" export BIG=1 @@ -53,10 +53,10 @@ export SIMULATION=1 export SKIP_FW_QUERY=1 export USE_WEBCAM=1 -backup_dir="$(mktemp -d /tmp/frogpilot_raybig_ui_backup.XXXXXX)" +backup_dir="$(mktemp -d /tmp/starpilot_raybig_ui_backup.XXXXXX)" backup_manifest="${backup_dir}/.artifact_manifest" -PRE_TRACKED_DIRTY="$(mktemp /tmp/frogpilot_raybig_pretracked.XXXXXX)" -POST_TRACKED_DIRTY="$(mktemp /tmp/frogpilot_raybig_posttracked.XXXXXX)" +PRE_TRACKED_DIRTY="$(mktemp /tmp/starpilot_raybig_pretracked.XXXXXX)" +POST_TRACKED_DIRTY="$(mktemp /tmp/starpilot_raybig_posttracked.XXXXXX)" FAKE_WIFI_PID="" runtime_artifacts=( diff --git a/scripts/starpilot_build_flow.sh b/scripts/starpilot_build_flow.sh index 732e1031..fec77f2f 100755 --- a/scripts/starpilot_build_flow.sh +++ b/scripts/starpilot_build_flow.sh @@ -121,13 +121,13 @@ build_mac() { system/timed.py \ common/spinner.py \ common/text_window.py \ - frogpilot/system/frogpilot_stats.py + starpilot/system/starpilot_stats.py python -m compileall -q \ selfdrive/ui \ system/ui \ - frogpilot/system/the_pond \ - frogpilot/system/galaxy + starpilot/system/the_pond \ + starpilot/system/galaxy SP_DISABLE_AUTO_DEVICE_SCONS=1 scons -j"${jobs}" selfdrive/ui/ui diff --git a/selfdrive/car/car_specific.py b/selfdrive/car/car_specific.py index 0b1754bd..44ff06e3 100644 --- a/selfdrive/car/car_specific.py +++ b/selfdrive/car/car_specific.py @@ -18,7 +18,7 @@ class MockCarState: def __init__(self): self.sm = messaging.SubMaster(['gpsLocation', 'gpsLocationExternal']) - def update(self, CS: car.CarState, FPCS: custom.FrogPilotCarState): + def update(self, CS: car.CarState, FPCS: custom.StarPilotCarState): self.sm.update(0) gps_sock = 'gpsLocationExternal' if self.sm.recv_frame['gpsLocationExternal'] > 1 else 'gpsLocation' diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index e201e940..f2a34de8 100644 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -22,8 +22,8 @@ from openpilot.selfdrive.pandad import can_capnp_to_list, can_list_to_can_capnp from openpilot.selfdrive.car.cruise import VCruiseHelper from openpilot.selfdrive.car.car_specific import MockCarState -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles, update_frogpilot_toggles -from openpilot.frogpilot.controls.frogpilot_card import FrogPilotCard +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles, update_starpilot_toggles +from openpilot.starpilot.controls.starpilot_card import StarPilotCard REPLAY = "REPLAY" in os.environ @@ -67,8 +67,8 @@ class Car: RI: RadarInterfaceBase CP: car.CarParams - # FrogPilot variables - FPCP: custom.FrogPilotCarParams + # StarPilot variables + FPCP: custom.StarPilotCarParams def __init__(self, CI=None, RI=None) -> None: self.can_sock = messaging.sub_sock('can', timeout=20) @@ -106,14 +106,14 @@ class Car: with car.CarParams.from_bytes(cached_params_raw) as _cached_params: cached_params = _cached_params - self.CI = get_car(*self.can_callbacks, obd_callback(self.params), alpha_long_allowed, is_release, self.params, num_pandas, cached_params, get_frogpilot_toggles()) + self.CI = get_car(*self.can_callbacks, obd_callback(self.params), alpha_long_allowed, is_release, self.params, num_pandas, cached_params, get_starpilot_toggles()) self.RI = interfaces[self.CI.CP.carFingerprint].RadarInterface(self.CI.CP) self.CP = self.CI.CP # continue onto next fingerprinting step in pandad self.params.put_bool("FirmwareQueryDone", True) - # FrogPilot variables + # StarPilot variables self.FPCP = self.CI.FPCP else: self.CI, self.CP, self.FPCP = CI, CI.CP, CI.FPCP @@ -172,24 +172,24 @@ class Car: # OPGM variables self.resume_prev_button = False - # FrogPilot variables - self.frogpilot_toggles = get_frogpilot_toggles() + # StarPilot variables + self.starpilot_toggles = get_starpilot_toggles() - if self.frogpilot_toggles.always_on_lateral: + if self.starpilot_toggles.always_on_lateral: self.FPCP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL - if getattr(self.frogpilot_toggles, "remap_cancel_to_distance", False): + if getattr(self.starpilot_toggles, "remap_cancel_to_distance", False): self.FPCP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.GM_REMAP_CANCEL_TO_DISTANCE fpcp_bytes = self.FPCP.to_bytes() - self.params.put("FrogPilotCarParams", fpcp_bytes) - self.params.put_nonblocking("FrogPilotCarParamsPersistent", fpcp_bytes) + self.params.put("StarPilotCarParams", fpcp_bytes) + self.params.put_nonblocking("StarPilotCarParamsPersistent", fpcp_bytes) - update_frogpilot_toggles() + update_starpilot_toggles() - self.frogpilot_card = FrogPilotCard(self.CP, self.FPCP) + self.starpilot_card = StarPilotCard(self.CP, self.FPCP) - self.sm = self.sm.extend(['frogpilotOnroadEvents', 'frogpilotPlan', 'frogpilotSelfdriveState', 'liveCalibration', 'selfdriveState']) - self.pm = self.pm.extend(['frogpilotCarState']) + self.sm = self.sm.extend(['starpilotOnroadEvents', 'starpilotPlan', 'starpilotSelfdriveState', 'liveCalibration', 'selfdriveState']) + self.pm = self.pm.extend(['starpilotCarState']) def state_update(self) -> tuple[car.CarState, structs.RadarDataT | None]: """carState update loop, driven by can""" @@ -198,7 +198,7 @@ class Car: can_list = can_capnp_to_list(can_strs) # Update carState from CAN - CS, FPCS = self.CI.update(can_list, self.frogpilot_toggles) + CS, FPCS = self.CI.update(can_list, self.starpilot_toggles) if self.CP.brand == 'mock': CS, FPCS = self.mock_carstate.update(CS, FPCS) @@ -216,10 +216,10 @@ class Car: if can_rcv_valid and REPLAY: self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime - self.v_cruise_helper.update_v_cruise(CS, self.sm['carControl'].enabled, self.is_metric, self.frogpilot_toggles) + self.v_cruise_helper.update_v_cruise(CS, self.sm['carControl'].enabled, self.is_metric, self.starpilot_toggles) if self.sm['carControl'].enabled and not self.CC_prev.enabled: # Use CarState w/ buttons from the step selfdrived enables on - self.v_cruise_helper.initialize_v_cruise(self.CS_prev, self.experimental_mode, self.resume_prev_button, self.frogpilot_toggles) + self.v_cruise_helper.initialize_v_cruise(self.CS_prev, self.experimental_mode, self.resume_prev_button, self.starpilot_toggles) # TODO: mirror the carState.cruiseState struct? CS.vCruise = float(self.v_cruise_helper.v_cruise_kph) @@ -231,12 +231,12 @@ class Car: elif any(be.type in (ButtonType.decelCruise, ButtonType.setCruise) for be in CS.buttonEvents): self.resume_prev_button = False - # FrogPilot variables - FPCS = self.frogpilot_card.update(CS, FPCS, self.sm, self.frogpilot_toggles) + # StarPilot variables + FPCS = self.starpilot_card.update(CS, FPCS, self.sm, self.starpilot_toggles) return CS, RD, FPCS - def state_publish(self, CS: car.CarState, RD: structs.RadarDataT | None, FPCS: custom.FrogPilotCarState): + def state_publish(self, CS: car.CarState, RD: structs.RadarDataT | None, FPCS: custom.StarPilotCarState): """carState and carParams publish loop""" # carParams - logged every 50 seconds (> 1 per segment) @@ -266,11 +266,11 @@ class Car: tracks_msg.liveTracks = RD self.pm.send('liveTracks', tracks_msg) - # FrogPilot variables - fpcs_send = messaging.new_message('frogpilotCarState') + # StarPilot variables + fpcs_send = messaging.new_message('starpilotCarState') fpcs_send.valid = CS.canValid - fpcs_send.frogpilotCarState = FPCS - self.pm.send('frogpilotCarState', fpcs_send) + fpcs_send.starpilotCarState = FPCS + self.pm.send('starpilotCarState', fpcs_send) def controls_update(self, CS: car.CarState, CC: car.CarControl): """control update loop, driven by carControl""" @@ -285,7 +285,7 @@ class Car: if self.sm.all_alive(['carControl']): # send car controls over can now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) - self.last_actuators_output, can_sends = self.CI.apply(CC, now_nanos, self.frogpilot_toggles) + self.last_actuators_output, can_sends = self.CI.apply(CC, now_nanos, self.starpilot_toggles) self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=CS.canValid)) self.CC_prev = CC @@ -303,10 +303,10 @@ class Car: self.initialized_prev = initialized self.CS_prev = CS - # FrogPilot variables + # StarPilot variables self.CI.CS.CC = self.sm['carControl'] - self.frogpilot_toggles = get_frogpilot_toggles(self.sm) + self.starpilot_toggles = get_starpilot_toggles(self.sm) def params_thread(self, evt): while not evt.is_set(): diff --git a/selfdrive/car/cruise.py b/selfdrive/car/cruise.py index a7e828e6..1ef95bb1 100644 --- a/selfdrive/car/cruise.py +++ b/selfdrive/car/cruise.py @@ -47,13 +47,13 @@ class VCruiseHelper: def v_cruise_initialized(self): return self.v_cruise_kph != V_CRUISE_UNSET - def update_v_cruise(self, CS, enabled, is_metric, frogpilot_toggles): + def update_v_cruise(self, CS, enabled, is_metric, starpilot_toggles): self.v_cruise_kph_last = self.v_cruise_kph if CS.cruiseState.available: if self.gm_cc_only or not self.CP.pcmCruise: # if stock cruise is completely disabled, then we can use our own set speed logic - self._update_v_cruise_non_pcm(CS, enabled, is_metric, frogpilot_toggles) + self._update_v_cruise_non_pcm(CS, enabled, is_metric, starpilot_toggles) self.v_cruise_cluster_kph = self.v_cruise_kph self.update_button_timers(CS, enabled) else: @@ -69,7 +69,7 @@ class VCruiseHelper: self.v_cruise_kph = V_CRUISE_UNSET self.v_cruise_cluster_kph = V_CRUISE_UNSET - def _update_v_cruise_non_pcm(self, CS, enabled, is_metric, frogpilot_toggles): + def _update_v_cruise_non_pcm(self, CS, enabled, is_metric, starpilot_toggles): # handle button presses. TODO: this should be in state_control, but a decelCruise press # would have the effect of both enabling and changing speed is checked after the state transition if not enabled: @@ -105,7 +105,7 @@ class VCruiseHelper: if not self.button_change_states[button_type]["enabled"]: return - v_cruise_delta_interval = frogpilot_toggles.cruise_increase_long if long_press else frogpilot_toggles.cruise_increase + v_cruise_delta_interval = starpilot_toggles.cruise_increase_long if long_press else starpilot_toggles.cruise_increase v_cruise_delta = v_cruise_delta * v_cruise_delta_interval if v_cruise_delta_interval % 5 == 0 and self.v_cruise_kph % v_cruise_delta != 0: # partial interval self.v_cruise_kph = CRUISE_NEAREST_FUNC[button_type](self.v_cruise_kph / v_cruise_delta) * v_cruise_delta @@ -130,7 +130,7 @@ class VCruiseHelper: self.button_timers[b.type.raw] = 1 if b.pressed else 0 self.button_change_states[b.type.raw] = {"standstill": CS.cruiseState.standstill, "enabled": enabled} - def initialize_v_cruise(self, CS, experimental_mode: bool, resume_prev_button: bool, frogpilot_toggles: SimpleNamespace) -> None: + def initialize_v_cruise(self, CS, experimental_mode: bool, resume_prev_button: bool, starpilot_toggles: SimpleNamespace) -> None: # initializing is handled by the PCM if self.CP.pcmCruise and not self.gm_cc_only: return diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 64311024..5149e82e 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -20,8 +20,8 @@ from openpilot.selfdrive.controls.lib.longcontrol import LongControl from openpilot.selfdrive.modeld.modeld import LAT_SMOOTH_SECONDS from openpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles -from openpilot.frogpilot.controls.lib.neural_network_feedforward import LatControlNNFF +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles +from openpilot.starpilot.controls.lib.neural_network_feedforward import LatControlNNFF State = log.SelfdriveState.OpenpilotState LaneChangeState = log.LaneChangeState @@ -35,7 +35,7 @@ class Controls: self.params = Params() cloudlog.info("controlsd is waiting for CarParams") self.CP = messaging.log_from_bytes(self.params.get("CarParams", block=True), car.CarParams) - self.FPCP = messaging.log_from_bytes(self.params.get("FrogPilotCarParams", block=True), custom.FrogPilotCarParams) + self.FPCP = messaging.log_from_bytes(self.params.get("StarPilotCarParams", block=True), custom.StarPilotCarParams) cloudlog.info("controlsd got CarParams") self.CI = interfaces[self.CP.carFingerprint](self.CP, self.FPCP) @@ -62,12 +62,12 @@ class Controls: elif self.CP.lateralTuning.which() == 'torque': self.LaC = LatControlTorque(self.CP, self.CI, DT_CTRL) - # FrogPilot variables - self.sm = self.sm.extend(['liveDelay', 'frogpilotCarState', 'frogpilotPlan']) + # StarPilot variables + self.sm = self.sm.extend(['liveDelay', 'starpilotCarState', 'starpilotPlan']) - self.frogpilot_toggles = get_frogpilot_toggles() + self.starpilot_toggles = get_starpilot_toggles() - if self.CP.lateralTuning.which() == "torque" and (self.frogpilot_toggles.nnff or self.frogpilot_toggles.nnff_lite): + if self.CP.lateralTuning.which() == "torque" and (self.starpilot_toggles.nnff or self.starpilot_toggles.nnff_lite): self.LaC = LatControlNNFF(self.CP, self.CI, DT_CTRL) def update(self): @@ -78,14 +78,14 @@ class Controls: device_pose = Pose.from_live_pose(self.sm['livePose']) self.calibrated_pose = self.pose_calibrator.build_calibrated_pose(device_pose) - # FrogPilot variables + # StarPilot variables if hasattr(self.LaC, "pid") and self.CP.lateralTuning.which() != "pid": - self.LaC.pid._k_p = self.frogpilot_toggles.steerKp + self.LaC.pid._k_p = self.starpilot_toggles.steerKp if self.sm.updated['liveDelay'] and hasattr(self.LaC, "update_live_delay"): self.LaC.update_live_delay(self.sm['liveDelay'].lateralDelay) - self.frogpilot_toggles = get_frogpilot_toggles(self.sm) + self.starpilot_toggles = get_starpilot_toggles(self.sm) def state_control(self): CS = self.sm['carState'] @@ -102,7 +102,7 @@ class Controls: # Update Torque Params if self.CP.lateralTuning.which() == 'torque': torque_params = self.sm['liveTorqueParameters'] - if self.sm.all_checks(['liveTorqueParameters']) and (torque_params.useParams or self.frogpilot_toggles.force_auto_tune): + if self.sm.all_checks(['liveTorqueParameters']) and (torque_params.useParams or self.starpilot_toggles.force_auto_tune): self.LaC.update_live_torque_params(torque_params.latAccelFactorFiltered, torque_params.latAccelOffsetFiltered, torque_params.frictionCoefficientFiltered) @@ -114,9 +114,9 @@ class Controls: # Check which actuators can be enabled standstill = abs(CS.vEgo) <= max(self.CP.minSteerSpeed, 0.3) or CS.standstill - CC.latActive = (self.sm['selfdriveState'].active or self.sm['frogpilotCarState'].alwaysOnLateralEnabled) and not CS.steerFaultTemporary and not CS.steerFaultPermanent and \ - (not standstill or self.CP.steerAtStandstill) and self.sm['frogpilotPlan'].lateralCheck - CC.longActive = CC.enabled and not any(e.overrideLongitudinal for e in self.sm['onroadEvents']) and not self.sm['frogpilotCarState'].pauseLongitudinal and self.CP.openpilotLongitudinalControl + CC.latActive = (self.sm['selfdriveState'].active or self.sm['starpilotCarState'].alwaysOnLateralEnabled) and not CS.steerFaultTemporary and not CS.steerFaultPermanent and \ + (not standstill or self.CP.steerAtStandstill) and self.sm['starpilotPlan'].lateralCheck + CC.longActive = CC.enabled and not any(e.overrideLongitudinal for e in self.sm['onroadEvents']) and not self.sm['starpilotCarState'].pauseLongitudinal and self.CP.openpilotLongitudinalControl actuators = CC.actuators actuators.longControlState = self.LoC.long_control_state @@ -134,7 +134,7 @@ class Controls: # accel PID loop pid_accel_limits = self.CI.get_pid_accel_limits(self.CP, CS.vEgo, CS.vCruise * CV.KPH_TO_MS) self.LoC.experimental_mode = bool(self.sm['selfdriveState'].experimentalMode) - actuators.accel = float(min(self.LoC.update(CC.longActive, CS, long_plan.aTarget, long_plan.shouldStop, pid_accel_limits, self.frogpilot_toggles), self.frogpilot_toggles.max_desired_acceleration)) + actuators.accel = float(min(self.LoC.update(CC.longActive, CS, long_plan.aTarget, long_plan.shouldStop, pid_accel_limits, self.starpilot_toggles), self.starpilot_toggles.max_desired_acceleration)) # Steering PID loop and lateral MPC # Reset desired curvature to current to avoid violating the limits on engage @@ -148,7 +148,7 @@ class Controls: curvature_limited, lat_delay, self.calibrated_pose, self.sm['modelV2'], - self.frogpilot_toggles) + self.starpilot_toggles) actuators.torque = float(steer) actuators.steeringAngleDeg = float(steeringAngleDeg) @@ -221,7 +221,7 @@ class Controls: cs.uiAccelCmd = float(self.LoC.pid.i) cs.ufAccelCmd = float(self.LoC.pid.f) cs.forceDecel = bool((self.sm['driverMonitoringState'].awarenessStatus < 0.) or - (self.sm['selfdriveState'].state == State.softDisabling) or self.sm["frogpilotCarState"].forceCoast) + (self.sm['selfdriveState'].state == State.softDisabling) or self.sm["starpilotCarState"].forceCoast) lat_tuning = self.CP.lateralTuning.which() if self.CP.steerControlType == car.CarParams.SteerControlType.angle: diff --git a/selfdrive/controls/lib/desire_helper.py b/selfdrive/controls/lib/desire_helper.py index 9dd3ae5f..cc984be9 100644 --- a/selfdrive/controls/lib/desire_helper.py +++ b/selfdrive/controls/lib/desire_helper.py @@ -29,7 +29,7 @@ DESIRES = { }, } -# FrogPilot variables +# StarPilot variables TurnDirection = log.Desire TURN_DESIRES = { @@ -49,7 +49,7 @@ class DesireHelper: self.prev_one_blinker = False self.desire = log.Desire.none - # FrogPilot variables + # StarPilot variables self.lane_change_completed = False self.lane_change_wait_timer = 0.0 @@ -58,12 +58,12 @@ class DesireHelper: def get_lane_change_direction(CS): return LaneChangeDirection.left if CS.leftBlinker else LaneChangeDirection.right - def update(self, carstate, lateral_active, lane_change_prob, frogpilotPlan, frogpilot_toggles): + def update(self, carstate, lateral_active, lane_change_prob, starpilotPlan, starpilot_toggles): v_ego = carstate.vEgo one_blinker = carstate.leftBlinker != carstate.rightBlinker - below_lane_change_speed = v_ego < frogpilot_toggles.minimum_lane_change_speed + below_lane_change_speed = v_ego < starpilot_toggles.minimum_lane_change_speed - if not lateral_active or self.lane_change_timer > LANE_CHANGE_TIME_MAX or not frogpilot_toggles.lane_changes: + if not lateral_active or self.lane_change_timer > LANE_CHANGE_TIME_MAX or not starpilot_toggles.lane_changes: self.lane_change_state = LaneChangeState.off self.lane_change_direction = LaneChangeDirection.none else: @@ -86,15 +86,15 @@ class DesireHelper: blindspot_detected = ((carstate.leftBlindspot and self.lane_change_direction == LaneChangeDirection.left) or (carstate.rightBlindspot and self.lane_change_direction == LaneChangeDirection.right)) - # FrogPilot variables + # StarPilot variables if torque_applied: - self.lane_change_wait_timer = frogpilot_toggles.lane_change_delay + self.lane_change_wait_timer = starpilot_toggles.lane_change_delay else: - torque_applied |= frogpilot_toggles.nudgeless - torque_applied &= self.lane_change_wait_timer >= frogpilot_toggles.lane_change_delay + torque_applied |= starpilot_toggles.nudgeless + torque_applied &= self.lane_change_wait_timer >= starpilot_toggles.lane_change_delay - desired_lane_width = frogpilotPlan.laneWidthLeft if self.lane_change_direction == LaneChangeDirection.left else frogpilotPlan.laneWidthRight - torque_applied &= desired_lane_width >= frogpilot_toggles.lane_detection_width + desired_lane_width = starpilotPlan.laneWidthLeft if self.lane_change_direction == LaneChangeDirection.left else starpilotPlan.laneWidthRight + torque_applied &= desired_lane_width >= starpilot_toggles.lane_detection_width if not one_blinker or below_lane_change_speed or self.lane_change_completed: self.lane_change_state = LaneChangeState.off @@ -102,12 +102,12 @@ class DesireHelper: elif torque_applied and not blindspot_detected: self.lane_change_state = LaneChangeState.laneChangeStarting - # FrogPilot variables - self.lane_change_completed = frogpilot_toggles.one_lane_change + # StarPilot variables + self.lane_change_completed = starpilot_toggles.one_lane_change self.lane_change_wait_timer = 0.0 - # FrogPilot variables + # StarPilot variables self.lane_change_wait_timer += DT_MDL # LaneChangeState.laneChangeStarting @@ -138,7 +138,7 @@ class DesireHelper: self.prev_one_blinker = one_blinker - if lateral_active and one_blinker and below_lane_change_speed and not carstate.standstill and frogpilot_toggles.use_turn_desires: + if lateral_active and one_blinker and below_lane_change_speed and not carstate.standstill and starpilot_toggles.use_turn_desires: self.turn_direction = TurnDirection.turnLeft if carstate.leftBlinker else TurnDirection.turnRight self.desire = TURN_DESIRES[self.turn_direction] else: @@ -155,7 +155,7 @@ class DesireHelper: elif self.desire in (log.Desire.keepLeft, log.Desire.keepRight): self.desire = log.Desire.none - # FrogPilot variables + # StarPilot variables if not one_blinker: self.lane_change_completed = False diff --git a/selfdrive/controls/lib/latcontrol.py b/selfdrive/controls/lib/latcontrol.py index 36764b23..ed6bafe0 100644 --- a/selfdrive/controls/lib/latcontrol.py +++ b/selfdrive/controls/lib/latcontrol.py @@ -17,7 +17,7 @@ class LatControl(ABC): self.steer_max = 1.0 @abstractmethod - def update(self, active: bool, CS, VM, params, steer_limited_by_safety: bool, desired_curvature: float, curvature_limited: bool, lat_delay: float, calibrated_pose: Pose, model_data: capnp._DynamicStructReader, frogpilot_toggles: SimpleNamespace): + def update(self, active: bool, CS, VM, params, steer_limited_by_safety: bool, desired_curvature: float, curvature_limited: bool, lat_delay: float, calibrated_pose: Pose, model_data: capnp._DynamicStructReader, starpilot_toggles: SimpleNamespace): pass def reset(self): diff --git a/selfdrive/controls/lib/latcontrol_angle.py b/selfdrive/controls/lib/latcontrol_angle.py index 00bbba84..6665b7c7 100644 --- a/selfdrive/controls/lib/latcontrol_angle.py +++ b/selfdrive/controls/lib/latcontrol_angle.py @@ -13,7 +13,7 @@ class LatControlAngle(LatControl): self.sat_check_min_speed = 5. self.use_steer_limited_by_safety = CP.brand == "tesla" - def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, frogpilot_toggles): + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, starpilot_toggles): angle_log = log.ControlsState.LateralAngleState.new_message() if not active: diff --git a/selfdrive/controls/lib/latcontrol_pid.py b/selfdrive/controls/lib/latcontrol_pid.py index 522c09cf..85bffee5 100644 --- a/selfdrive/controls/lib/latcontrol_pid.py +++ b/selfdrive/controls/lib/latcontrol_pid.py @@ -14,7 +14,7 @@ class LatControlPID(LatControl): self.ff_factor = CP.lateralTuning.pid.kf self.get_steer_feedforward = CI.get_steer_feedforward_function() - def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, frogpilot_toggles): + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, starpilot_toggles): pid_log = log.ControlsState.LateralPIDState.new_message() pid_log.steeringAngleDeg = float(CS.steeringAngleDeg) pid_log.steeringRateDeg = float(CS.steeringRateDeg) diff --git a/selfdrive/controls/lib/latcontrol_torque.py b/selfdrive/controls/lib/latcontrol_torque.py index 50e22cb2..f4467ed2 100644 --- a/selfdrive/controls/lib/latcontrol_torque.py +++ b/selfdrive/controls/lib/latcontrol_torque.py @@ -115,7 +115,7 @@ class LatControlTorque(LatControl): self.pid.set_limits(self.lateral_accel_from_torque(self.steer_max, self.torque_params), self.lateral_accel_from_torque(-self.steer_max, self.torque_params)) - def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, frogpilot_toggles): + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, starpilot_toggles): pid_log = log.ControlsState.LateralTorqueState.new_message() pid_log.version = VERSION if not active: diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index c15d9f66..a93823a8 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -24,14 +24,14 @@ def apply_deadzone(error, deadzone): def long_control_state_trans(CP, active, long_control_state, v_ego, - should_stop, brake_pressed, cruise_standstill, frogpilot_toggles): + should_stop, brake_pressed, cruise_standstill, starpilot_toggles): # Ignore cruise standstill if car has a gas interceptor cruise_standstill = cruise_standstill and not CP.enableGasInterceptorDEPRECATED stopping_condition = should_stop starting_condition = (not should_stop and not cruise_standstill and not brake_pressed) - started_condition = v_ego > frogpilot_toggles.vEgoStarting + started_condition = v_ego > starpilot_toggles.vEgoStarting if not active: long_control_state = LongCtrlState.off @@ -60,20 +60,20 @@ def long_control_state_trans(CP, active, long_control_state, v_ego, return long_control_state def long_control_state_trans_old_long(CP, active, long_control_state, v_ego, v_target, - v_target_1sec, brake_pressed, cruise_standstill, frogpilot_toggles): + v_target_1sec, brake_pressed, cruise_standstill, starpilot_toggles): accelerating = v_target_1sec > v_target - planned_stop = (v_target < frogpilot_toggles.vEgoStopping and - v_target_1sec < frogpilot_toggles.vEgoStopping and + planned_stop = (v_target < starpilot_toggles.vEgoStopping and + v_target_1sec < starpilot_toggles.vEgoStopping and not accelerating) - stay_stopped = (v_ego < frogpilot_toggles.vEgoStopping and + stay_stopped = (v_ego < starpilot_toggles.vEgoStopping and (brake_pressed or cruise_standstill)) stopping_condition = planned_stop or stay_stopped - starting_condition = (v_target_1sec > frogpilot_toggles.vEgoStarting and + starting_condition = (v_target_1sec > starpilot_toggles.vEgoStarting and accelerating and not cruise_standstill and not brake_pressed) - started_condition = v_ego > frogpilot_toggles.vEgoStarting + started_condition = v_ego > starpilot_toggles.vEgoStarting if not active: long_control_state = LongCtrlState.off @@ -173,27 +173,27 @@ class LongControl: return self.integrator_hold_frames > 0 or sat_pushing_lower or sat_pushing_upper - def update(self, active, CS, a_target, should_stop, accel_limits, frogpilot_toggles): + def update(self, active, CS, a_target, should_stop, accel_limits, starpilot_toggles): """Update longitudinal control. This updates the state machine and runs a PID loop""" self.pid.neg_limit = accel_limits[0] self.pid.pos_limit = accel_limits[1] self.long_control_state = long_control_state_trans(self.CP, active, self.long_control_state, CS.vEgo, should_stop, CS.brakePressed, - CS.cruiseState.standstill, frogpilot_toggles) + CS.cruiseState.standstill, starpilot_toggles) if self.long_control_state == LongCtrlState.off: self.reset() output_accel = 0. elif self.long_control_state == LongCtrlState.stopping: output_accel = self.last_output_accel - if output_accel > frogpilot_toggles.stopAccel: + if output_accel > starpilot_toggles.stopAccel: output_accel = min(output_accel, 0.0) - output_accel -= frogpilot_toggles.stoppingDecelRate * DT_CTRL + output_accel -= starpilot_toggles.stoppingDecelRate * DT_CTRL self.reset() elif self.long_control_state == LongCtrlState.starting: - output_accel = (a_target if frogpilot_toggles.human_acceleration else frogpilot_toggles.startAccel) + output_accel = (a_target if starpilot_toggles.human_acceleration else starpilot_toggles.startAccel) self.reset() else: # LongCtrlState.pid @@ -229,7 +229,7 @@ class LongControl: self.last_a_target = 0.0 self.integrator_hold_frames = 0 - def update_old_long(self, active, CS, long_plan, accel_limits, t_since_plan, frogpilot_toggles): + def update_old_long(self, active, CS, long_plan, accel_limits, t_since_plan, starpilot_toggles): """Update longitudinal control. This updates the state machine and runs a PID loop""" # Interp control trajectory speeds = long_plan.speeds @@ -237,10 +237,10 @@ class LongControl: v_target_now = interp(t_since_plan, CONTROL_N_T_IDX, speeds) a_target_now = interp(t_since_plan, CONTROL_N_T_IDX, long_plan.accels) - v_target = interp(frogpilot_toggles.longitudinalActuatorDelay + t_since_plan, CONTROL_N_T_IDX, speeds) - a_target = 2 * (v_target - v_target_now) / frogpilot_toggles.longitudinalActuatorDelay - a_target_now + v_target = interp(starpilot_toggles.longitudinalActuatorDelay + t_since_plan, CONTROL_N_T_IDX, speeds) + a_target = 2 * (v_target - v_target_now) / starpilot_toggles.longitudinalActuatorDelay - a_target_now - v_target_1sec = interp(frogpilot_toggles.longitudinalActuatorDelay + t_since_plan + 1.0, CONTROL_N_T_IDX, speeds) + v_target_1sec = interp(starpilot_toggles.longitudinalActuatorDelay + t_since_plan + 1.0, CONTROL_N_T_IDX, speeds) else: v_target = 0.0 v_target_now = 0.0 @@ -253,20 +253,20 @@ class LongControl: output_accel = self.last_output_accel self.long_control_state = long_control_state_trans_old_long(self.CP, active, self.long_control_state, CS.vEgo, v_target, v_target_1sec, CS.brakePressed, - CS.cruiseState.standstill, frogpilot_toggles) + CS.cruiseState.standstill, starpilot_toggles) if self.long_control_state == LongCtrlState.off: self.reset_old_long(CS.vEgo) output_accel = 0. elif self.long_control_state == LongCtrlState.stopping: - if output_accel > frogpilot_toggles.stopAccel: + if output_accel > starpilot_toggles.stopAccel: output_accel = min(output_accel, 0.0) - output_accel -= frogpilot_toggles.stoppingDecelRate * DT_CTRL + output_accel -= starpilot_toggles.stoppingDecelRate * DT_CTRL self.reset_old_long(CS.vEgo) elif self.long_control_state == LongCtrlState.starting: - output_accel = frogpilot_toggles.startAccel + output_accel = starpilot_toggles.startAccel self.reset_old_long(CS.vEgo) elif self.long_control_state == LongCtrlState.pid: diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index a02e3a54..33db44bd 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -148,7 +148,7 @@ class LongitudinalPlanner: return 0.0 @staticmethod - def parse_model(model_msg, model_error, v_ego, frogpilot_toggles): + def parse_model(model_msg, model_error, v_ego, starpilot_toggles): if (len(model_msg.position.x) == ModelConstants.IDX_N and len(model_msg.velocity.x) == ModelConstants.IDX_N and len(model_msg.acceleration.x) == ModelConstants.IDX_N): @@ -162,7 +162,7 @@ class LongitudinalPlanner: a = np.zeros(len(T_IDXS_MPC)) j = np.zeros(len(T_IDXS_MPC)) - if frogpilot_toggles.taco_tune: + if starpilot_toggles.taco_tune: max_lat_accel = np.interp(v_ego, [5, 10, 20], [1.5, 2.0, 3.0]) curvatures = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.orientationRate.z) / np.clip(v, 0.3, 100.0) max_v = np.sqrt(max_lat_accel / (np.abs(curvatures) + 1e-3)) - 2.0 @@ -174,8 +174,8 @@ class LongitudinalPlanner: throttle_prob = 1.0 return x, v, a, j, throttle_prob - def update(self, sm, frogpilot_toggles): - self.generation = getattr(frogpilot_toggles, "model_version", None) + def update(self, sm, starpilot_toggles): + self.generation = getattr(starpilot_toggles, "model_version", None) self.mode = 'blended' if sm['selfdriveState'].experimentalMode else 'acc' self.mpc.mode = 'acc' if not self.mlsim: @@ -187,7 +187,7 @@ class LongitudinalPlanner: accel_coast = ACCEL_MAX v_ego = max(sm['carState'].vEgo, sm['carState'].vEgoCluster) - v_cruise = sm['frogpilotPlan'].vCruise + v_cruise = sm['starpilotPlan'].vCruise v_cruise_initialized = sm['carState'].vCruise != V_CRUISE_UNSET long_control_off = sm['controlsState'].longControlState == LongCtrlState.off @@ -202,7 +202,7 @@ class LongitudinalPlanner: prev_accel_constraint = not (reset_state or sm['carState'].standstill) if self.mpc.mode == 'acc': - accel_limits = [sm['frogpilotPlan'].minAcceleration, sm['frogpilotPlan'].maxAcceleration] + accel_limits = [sm['starpilotPlan'].minAcceleration, sm['starpilotPlan'].maxAcceleration] steer_angle_without_offset = sm['carState'].steeringAngleDeg - sm['liveParameters'].angleOffsetDeg accel_limits_turns = limit_accel_in_turns(v_ego, steer_angle_without_offset, accel_limits, self.CP) else: @@ -218,10 +218,10 @@ class LongitudinalPlanner: self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego)) # Compute model v_ego error self.v_model_error = self.get_model_speed_error(sm['modelV2'], v_ego) - x, v, a, j, throttle_prob = self.parse_model(sm['modelV2'], self.v_model_error, v_ego, frogpilot_toggles) + x, v, a, j, throttle_prob = self.parse_model(sm['modelV2'], self.v_model_error, v_ego, starpilot_toggles) # Don't clip at low speeds since throttle_prob doesn't account for creep self.allow_throttle = throttle_prob > ALLOW_THROTTLE_THRESHOLD or v_ego <= MIN_ALLOW_THROTTLE_SPEED - self.allow_throttle &= not sm['frogpilotPlan'].disableThrottle + self.allow_throttle &= not sm['starpilotPlan'].disableThrottle if not self.allow_throttle: clipped_accel_coast = max(accel_coast, accel_limits_turns[0]) @@ -335,9 +335,9 @@ class LongitudinalPlanner: except Exception: pass - self.mpc.set_weights(sm['frogpilotPlan'].accelerationJerk, - sm['frogpilotPlan'].dangerJerk, - sm['frogpilotPlan'].speedJerk, + self.mpc.set_weights(sm['starpilotPlan'].accelerationJerk, + sm['starpilotPlan'].dangerJerk, + sm['starpilotPlan'].speedJerk, prev_accel_constraint, personality=sm['selfdriveState'].personality, v_ego=v_ego, @@ -350,9 +350,9 @@ class LongitudinalPlanner: dec_mpc_mode = self.get_mpc_mode() if not self.mlsim: self.mpc.mode = dec_mpc_mode - tracking_lead = bool(sm['frogpilotPlan'].trackingLead) + tracking_lead = bool(sm['starpilotPlan'].trackingLead) self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, - sm['frogpilotPlan'].dangerFactor, sm['frogpilotPlan'].tFollow, + sm['starpilotPlan'].dangerFactor, sm['starpilotPlan'].tFollow, personality=sm['selfdriveState'].personality, tracking_lead=tracking_lead) self.a_desired_trajectory_full = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.a_solution) @@ -395,17 +395,17 @@ class LongitudinalPlanner: if -0.05 < self.a_desired < 0.05: self.a_desired = 0.0 - classic_model = bool(getattr(frogpilot_toggles, "classic_model", False)) - tinygrad_model = bool(getattr(frogpilot_toggles, "tinygrad_model", False)) + classic_model = bool(getattr(starpilot_toggles, "classic_model", False)) + tinygrad_model = bool(getattr(starpilot_toggles, "tinygrad_model", False)) action_t = self.CP.longitudinalActuatorDelay + DT_MDL if classic_model: output_a_target, output_should_stop = get_accel_from_plan_classic( - self.CP, self.v_desired_trajectory, self.a_desired_trajectory, frogpilot_toggles.vEgoStopping) + self.CP, self.v_desired_trajectory, self.a_desired_trajectory, starpilot_toggles.vEgoStopping) elif tinygrad_model: output_a_target_mpc, output_should_stop_mpc = get_accel_from_plan( self.v_desired_trajectory, self.a_desired_trajectory, - action_t=action_t, vEgoStopping=frogpilot_toggles.vEgoStopping) + action_t=action_t, vEgoStopping=starpilot_toggles.vEgoStopping) output_a_target_e2e = sm['modelV2'].action.desiredAcceleration output_should_stop_e2e = sm['modelV2'].action.shouldStop @@ -418,7 +418,7 @@ class LongitudinalPlanner: else: output_a_target, output_should_stop = get_accel_from_plan( self.v_desired_trajectory, self.a_desired_trajectory, - action_t=action_t, vEgoStopping=frogpilot_toggles.vEgoStopping) + action_t=action_t, vEgoStopping=starpilot_toggles.vEgoStopping) self.output_a_target = float(output_a_target) self.output_should_stop = bool(output_should_stop) @@ -442,7 +442,7 @@ class LongitudinalPlanner: longitudinalPlan.fcw = self.fcw longitudinalPlan.aTarget = float(self.output_a_target) - longitudinalPlan.shouldStop = bool(self.output_should_stop) or sm['frogpilotPlan'].forcingStopLength < 1 + longitudinalPlan.shouldStop = bool(self.output_should_stop) or sm['starpilotPlan'].forcingStopLength < 1 longitudinalPlan.allowBrake = True longitudinalPlan.allowThrottle = bool(self.allow_throttle) diff --git a/selfdrive/controls/plannerd.py b/selfdrive/controls/plannerd.py index e53d8a79..99ab149e 100755 --- a/selfdrive/controls/plannerd.py +++ b/selfdrive/controls/plannerd.py @@ -7,7 +7,7 @@ from openpilot.selfdrive.controls.lib.ldw import LaneDepartureWarning from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner import cereal.messaging as messaging -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles def main(): @@ -24,15 +24,15 @@ def main(): sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'liveParameters', 'radarState', 'modelV2', 'selfdriveState'], poll='modelV2') - # FrogPilot variables - sm = sm.extend(['frogpilotCarState', 'frogpilotPlan']) + # StarPilot variables + sm = sm.extend(['starpilotCarState', 'starpilotPlan']) - frogpilot_toggles = get_frogpilot_toggles() + starpilot_toggles = get_starpilot_toggles() while True: sm.update() if sm.updated['modelV2']: - longitudinal_planner.update(sm, frogpilot_toggles) + longitudinal_planner.update(sm, starpilot_toggles) longitudinal_planner.publish(sm, pm) ldw.update(sm.frame, sm['modelV2'], sm['carState'], sm['carControl']) @@ -42,8 +42,8 @@ def main(): msg.driverAssistance.rightLaneDeparture = ldw.right pm.send('driverAssistance', msg) - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + starpilot_toggles = get_starpilot_toggles(sm) if __name__ == "__main__": diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index f55aff3d..73a393a6 100644 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -14,7 +14,7 @@ from openpilot.common.swaglog import cloudlog from openpilot.common.simple_kalman import KF1D from openpilot.selfdrive.controls.lib.desire_helper import LaneChangeDirection, LaneChangeState -from openpilot.frogpilot.common.frogpilot_variables import THRESHOLD, get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import THRESHOLD, get_starpilot_toggles # Default lead acceleration decay set to 50% at 1s @@ -59,7 +59,7 @@ class Track: self.K_K = kalman_params.K self.kf = KF1D([[v_lead], [0.0]], self.K_A, self.K_C, self.K_K) - # FrogPilot variables + # StarPilot variables self.leadTrackID = 0 self.radarfulFilter = FirstOrderFilter(0, 0.5, self.K_A[0][1]) @@ -143,8 +143,8 @@ def laplacian_pdf(x: float, mu: float, b: float): return math.exp(-abs(x-mu)/b) -def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, model_data: capnp._DynamicStructReader, tracks: dict[int, Track], frogpilot_toggles: SimpleNamespace): - if model_data.meta.laneChangeState == LaneChangeState.laneChangeStarting and getattr(frogpilot_toggles, "human_lane_changes", False): +def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, model_data: capnp._DynamicStructReader, tracks: dict[int, Track], starpilot_toggles: SimpleNamespace): + if model_data.meta.laneChangeState == LaneChangeState.laneChangeStarting and getattr(starpilot_toggles, "human_lane_changes", False): direction = model_data.meta.laneChangeDirection if direction == LaneChangeDirection.left: tracks = {k: v for k, v in tracks.items() if v.yRel > 0} @@ -192,13 +192,13 @@ def get_RadarState_from_vision(lead_msg: capnp._DynamicStructReader, v_ego: floa def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capnp._DynamicStructReader, model_v_ego: float, model_data: capnp._DynamicStructReader, standstill: bool, - frogpilot_plan: capnp._DynamicStructReader, frogpilot_toggles: SimpleNamespace, + starpilot_plan: capnp._DynamicStructReader, starpilot_toggles: SimpleNamespace, low_speed_override: bool = True) -> dict[str, Any]: - lead_detection_probability = float(getattr(frogpilot_toggles, "lead_detection_probability", 0.35)) + lead_detection_probability = float(getattr(starpilot_toggles, "lead_detection_probability", 0.35)) # Determine leads, this is where the essential logic happens if len(tracks) > 0 and ready and lead_msg.prob > lead_detection_probability: - track = match_vision_to_track(v_ego, lead_msg, model_data, tracks, frogpilot_toggles) + track = match_vision_to_track(v_ego, lead_msg, model_data, tracks, starpilot_toggles) else: track = None @@ -223,12 +223,12 @@ def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capn closest_track = min(far_lead_tracks, key=lambda c: c.dRel) lead_dict = closest_track.get_RadarState() - # FrogPilot variables + # StarPilot variables for track in tracks.values(): track.leadTrackID = lead_dict.get('radarTrackId', -1) if 'dRel' in lead_dict: - lead_dict['dRel'] -= frogpilot_plan.increasedStoppedDistance + lead_dict['dRel'] -= starpilot_plan.increasedStoppedDistance return lead_dict @@ -260,9 +260,9 @@ class RadarD: self.ready = False - # FrogPilot variables - self.frogpilot_radar_state = custom.FrogPilotRadarState.new_message() - self.frogpilot_toggles = get_frogpilot_toggles() + # StarPilot variables + self.starpilot_radar_state = custom.StarPilotRadarState.new_message() + self.starpilot_toggles = get_starpilot_toggles() def update(self, sm: messaging.SubMaster, rr: car.RadarData): self.ready = sm.seen['modelV2'] @@ -297,7 +297,7 @@ class RadarD: self.radar_state.radarErrors = rr.errors self.radar_state.carStateMonoTime = sm.logMonoTime['carState'] - self.frogpilot_radar_state = custom.FrogPilotRadarState.new_message() + self.starpilot_radar_state = custom.StarPilotRadarState.new_message() if len(sm['modelV2'].velocity.x): model_v_ego = sm['modelV2'].velocity.x[0] @@ -307,16 +307,16 @@ class RadarD: leads_v3 = sm['modelV2'].leadsV3 if len(leads_v3) > 1: self.radar_state.leadOne = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[0], model_v_ego, sm['modelV2'], - sm['carState'].standstill, sm['frogpilotPlan'], self.frogpilot_toggles, low_speed_override=True) + sm['carState'].standstill, sm['starpilotPlan'], self.starpilot_toggles, low_speed_override=True) self.radar_state.leadTwo = get_lead(self.v_ego, self.ready, self.tracks, leads_v3[1], model_v_ego, sm['modelV2'], - sm['carState'].standstill, sm['frogpilotPlan'], self.frogpilot_toggles, low_speed_override=False) + sm['carState'].standstill, sm['starpilotPlan'], self.starpilot_toggles, low_speed_override=False) - # FrogPilot variables - if self.ready and (self.frogpilot_toggles.adjacent_lead_tracking or self.frogpilot_toggles.human_lane_changes): - self.frogpilot_radar_state.leadLeft = get_adjacent_lead(self.tracks, sm['carState'].standstill, sm['modelV2'], left=True) - self.frogpilot_radar_state.leadRight = get_adjacent_lead(self.tracks, sm['carState'].standstill, sm['modelV2'], left=False) + # StarPilot variables + if self.ready and (self.starpilot_toggles.adjacent_lead_tracking or self.starpilot_toggles.human_lane_changes): + self.starpilot_radar_state.leadLeft = get_adjacent_lead(self.tracks, sm['carState'].standstill, sm['modelV2'], left=True) + self.starpilot_radar_state.leadRight = get_adjacent_lead(self.tracks, sm['carState'].standstill, sm['modelV2'], left=False) - self.frogpilot_toggles = get_frogpilot_toggles(sm) + self.starpilot_toggles = get_starpilot_toggles(sm) def publish(self, pm: messaging.PubMaster): assert self.radar_state is not None @@ -326,11 +326,11 @@ class RadarD: radar_msg.radarState = self.radar_state pm.send("radarState", radar_msg) - # FrogPilot variables - frogpilot_radar_msg = messaging.new_message("frogpilotRadarState") - frogpilot_radar_msg.valid = self.radar_state_valid - frogpilot_radar_msg.frogpilotRadarState = self.frogpilot_radar_state - pm.send("frogpilotRadarState", frogpilot_radar_msg) + # StarPilot variables + starpilot_radar_msg = messaging.new_message("starpilotRadarState") + starpilot_radar_msg.valid = self.radar_state_valid + starpilot_radar_msg.starpilotRadarState = self.starpilot_radar_state + pm.send("starpilotRadarState", starpilot_radar_msg) # fuses camera and radar data for best lead detection @@ -344,14 +344,14 @@ def main() -> None: # *** setup messaging sm = messaging.SubMaster(['modelV2', 'carState', 'liveTracks'], poll='modelV2', - ignore_valid=['frogpilotPlan']) + ignore_valid=['starpilotPlan']) pm = messaging.PubMaster(['radarState']) RD = RadarD(CP.radarDelay) - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) - pm = pm.extend(['frogpilotRadarState']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) + pm = pm.extend(['starpilotRadarState']) while 1: sm.update() diff --git a/selfdrive/controls/tests/test_latcontrol.py b/selfdrive/controls/tests/test_latcontrol.py index 67519059..eb82c54f 100644 --- a/selfdrive/controls/tests/test_latcontrol.py +++ b/selfdrive/controls/tests/test_latcontrol.py @@ -31,17 +31,17 @@ class TestLatControl: CS.steeringPressed = False params = log.LiveParametersData.new_message() - frogpilot_toggles = SimpleNamespace() + starpilot_toggles = SimpleNamespace() # Saturate for curvature limited and controller limited for _ in range(1000): - _, _, lac_log = controller.update(True, CS, VM, params, False, 0, True, 0.2, None, None, frogpilot_toggles) + _, _, lac_log = controller.update(True, CS, VM, params, False, 0, True, 0.2, None, None, starpilot_toggles) assert lac_log.saturated for _ in range(1000): - _, _, lac_log = controller.update(True, CS, VM, params, False, 0, False, 0.2, None, None, frogpilot_toggles) + _, _, lac_log = controller.update(True, CS, VM, params, False, 0, False, 0.2, None, None, starpilot_toggles) assert not lac_log.saturated for _ in range(1000): - _, _, lac_log = controller.update(True, CS, VM, params, False, 1, False, 0.2, None, None, frogpilot_toggles) + _, _, lac_log = controller.update(True, CS, VM, params, False, 1, False, 0.2, None, None, starpilot_toggles) assert lac_log.saturated diff --git a/selfdrive/locationd/lagd.py b/selfdrive/locationd/lagd.py index f4b4572f..b84c27af 100755 --- a/selfdrive/locationd/lagd.py +++ b/selfdrive/locationd/lagd.py @@ -13,7 +13,7 @@ from openpilot.common.realtime import config_realtime_process from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose, fft_next_good_size, parabolic_peak_interp -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles BLOCK_SIZE = 100 BLOCK_NUM = 50 @@ -216,8 +216,8 @@ class LateralLagEstimator: else: liveDelay.status = log.LiveDelayData.Status.unestimated - if self.frogpilot_toggles.use_custom_steerActuatorDelay: - liveDelay.lateralDelay = self.frogpilot_toggles.steerActuatorDelay + if self.starpilot_toggles.use_custom_steerActuatorDelay: + liveDelay.lateralDelay = self.starpilot_toggles.steerActuatorDelay elif liveDelay.status == log.LiveDelayData.Status.estimated: liveDelay.lateralDelay = valid_mean_lag else: @@ -378,10 +378,10 @@ def main(): lag, valid_blocks = initial_lag_params lag_learner.reset(lag, valid_blocks) - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) - lag_learner.frogpilot_toggles = get_frogpilot_toggles() + lag_learner.starpilot_toggles = get_starpilot_toggles() while True: sm.update() @@ -402,5 +402,5 @@ def main(): if sm.frame % 1200 == 0: # cache every 60 seconds params.put_nonblocking("LiveDelay", lag_msg_dat) - # FrogPilot variables - lag_learner.frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + lag_learner.starpilot_toggles = get_starpilot_toggles(sm) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index dbdb9d77..2a29bc64 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -12,7 +12,7 @@ from openpilot.selfdrive.locationd.models.constants import GENERATED_DIR from openpilot.selfdrive.locationd.helpers import PoseCalibrator, Pose from openpilot.common.swaglog import cloudlog -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles MAX_ANGLE_OFFSET_DELTA = 20 * DT_MDL # Max 20 deg/s ROLL_MAX_DELTA = np.radians(20.0) * DT_MDL # 20deg in 1 second is well within curvature limits @@ -59,7 +59,7 @@ class VehicleParamsLearner: self.reset(None) - # FrogPilot variables + # StarPilot variables self.CP = CP def reset(self, t: float | None): @@ -166,7 +166,7 @@ class VehicleParamsLearner: liveParameters = msg.liveParameters liveParameters.posenetValid = True liveParameters.sensorValid = sensors_valid - liveParameters.steerRatio = float(x[States.STEER_RATIO].item() if not self.frogpilot_toggles.use_custom_steerRatio else self.frogpilot_toggles.steerRatio) + liveParameters.steerRatio = float(x[States.STEER_RATIO].item() if not self.starpilot_toggles.use_custom_steerRatio else self.starpilot_toggles.steerRatio) liveParameters.stiffnessFactor = float(x[States.STIFFNESS].item()) liveParameters.roll = float(self.roll) liveParameters.angleOffsetAverageDeg = float(self.avg_angle_offset) @@ -192,7 +192,7 @@ class VehicleParamsLearner: liveParameters.debugFilterState.value = x.tolist() liveParameters.debugFilterState.std = P.tolist() - # FrogPilot variables + # StarPilot variables if self.CP.carFingerprint == "RAM_HD": liveParameters.valid = True @@ -285,10 +285,10 @@ def main(): steer_ratio, stiffness_factor, angle_offset_deg, pInitial = retrieve_initial_vehicle_params(params, CP, REPLAY, DEBUG) learner = VehicleParamsLearner(CP, steer_ratio, stiffness_factor, np.radians(angle_offset_deg), pInitial) - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) - learner.frogpilot_toggles = get_frogpilot_toggles() + learner.starpilot_toggles = get_starpilot_toggles() while True: sm.update() @@ -307,8 +307,8 @@ def main(): pm.send('liveParameters', msg_dat) - # FrogPilot variables - learner.frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + learner.starpilot_toggles = get_starpilot_toggles(sm) if __name__ == "__main__": diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index a020fc53..d14d959f 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -12,7 +12,7 @@ from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.locationd.helpers import PointBuckets, ParameterEstimator, PoseCalibrator, Pose -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles HISTORY = 5 # secs POINTS_PER_BUCKET = 1500 @@ -232,9 +232,9 @@ class TorqueEstimator(ParameterEstimator): if with_points: liveTorqueParameters.points = self.filtered_points.get_points()[:, [0, 2]].tolist() - liveTorqueParameters.latAccelFactorFiltered = float(self.filtered_params['latAccelFactor'].x if not self.frogpilot_toggles.use_custom_latAccelFactor else self.frogpilot_toggles.latAccelFactor) + liveTorqueParameters.latAccelFactorFiltered = float(self.filtered_params['latAccelFactor'].x if not self.starpilot_toggles.use_custom_latAccelFactor else self.starpilot_toggles.latAccelFactor) liveTorqueParameters.latAccelOffsetFiltered = float(self.filtered_params['latAccelOffset'].x) - liveTorqueParameters.frictionCoefficientFiltered = float(self.filtered_params['frictionCoefficient'].x if not self.frogpilot_toggles.use_custom_friction else self.frogpilot_toggles.friction) + liveTorqueParameters.frictionCoefficientFiltered = float(self.filtered_params['frictionCoefficient'].x if not self.starpilot_toggles.use_custom_friction else self.starpilot_toggles.friction) liveTorqueParameters.totalBucketPoints = len(self.filtered_points) liveTorqueParameters.calPerc = self.filtered_points.get_valid_percent() liveTorqueParameters.decay = self.decay @@ -253,15 +253,15 @@ def main(demo=False): params = Params() estimator = TorqueEstimator(messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams)) - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) - frogpilot_toggles = get_frogpilot_toggles() + starpilot_toggles = get_starpilot_toggles() - if not frogpilot_toggles.liveValid: + if not starpilot_toggles.liveValid: estimator = TorqueEstimator(messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams), decimated=True) - estimator.frogpilot_toggles = frogpilot_toggles + estimator.starpilot_toggles = starpilot_toggles while True: sm.update() @@ -280,8 +280,8 @@ def main(demo=False): msg = estimator.get_msg(valid=sm.all_checks(), with_points=True) params.put_nonblocking("LiveTorqueParameters", msg.to_bytes()) - # FrogPilot variables - estimator.frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + estimator.starpilot_toggles = get_starpilot_toggles(sm) if __name__ == "__main__": diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 978b2aee..414b1e75 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -31,7 +31,7 @@ from openpilot.selfdrive.modeld.constants import ModelConstants, Plan from openpilot.selfdrive.modeld.models.commonmodel_pyx import DrivingModelFrame, CLContext from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address -from openpilot.frogpilot.common.frogpilot_variables import MODELS_PATH, get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import MODELS_PATH, get_starpilot_toggles PROCESS_NAME = "selfdrive.modeld.modeld" @@ -258,8 +258,8 @@ class ModelState: def main(demo=False): cloudlog.warning("modeld init") - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles() + # StarPilot variables + starpilot_toggles = get_starpilot_toggles() if not USBGPU: # USB GPU currently saturates a core so can't do this yet, @@ -327,14 +327,14 @@ def main(demo=False): # TODO this needs more thought, use .2s extra for now to estimate other delays # TODO Move smooth seconds to action function - long_delay = frogpilot_toggles.longitudinalActuatorDelay + LONG_SMOOTH_SECONDS + long_delay = starpilot_toggles.longitudinalActuatorDelay + LONG_SMOOTH_SECONDS prev_action = log.ModelDataV2.Action() DH = DesireHelper() - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) - pm = pm.extend(['frogpilotModelV2']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) + pm = pm.extend(['starpilotModelV2']) while True: # Keep receiving frames until we are at least 1 frame ahead of previous extra frame @@ -429,7 +429,7 @@ def main(demo=False): l_lane_change_prob = desire_state[log.Desire.laneChangeLeft] r_lane_change_prob = desire_state[log.Desire.laneChangeRight] lane_change_prob = l_lane_change_prob + r_lane_change_prob - DH.update(sm['carState'], sm['carControl'].latActive, lane_change_prob, sm['frogpilotPlan'], frogpilot_toggles) + DH.update(sm['carState'], sm['carControl'].latActive, lane_change_prob, sm['starpilotPlan'], starpilot_toggles) modelv2_send.modelV2.meta.laneChangeState = DH.lane_change_state modelv2_send.modelV2.meta.laneChangeDirection = DH.lane_change_direction drivingdata_send.drivingModelData.meta.laneChangeState = DH.lane_change_state @@ -440,15 +440,15 @@ def main(demo=False): pm.send('drivingModelData', drivingdata_send) pm.send('cameraOdometry', posenet_send) - # FrogPilot variables - frogpilot_modelv2_send = messaging.new_message('frogpilotModelV2') - frogpilot_modelv2_send.frogpilotModelV2.turnDirection = DH.turn_direction + # StarPilot variables + starpilot_modelv2_send = messaging.new_message('starpilotModelV2') + starpilot_modelv2_send.starpilotModelV2.turnDirection = DH.turn_direction - pm.send('frogpilotModelV2', frogpilot_modelv2_send) + pm.send('starpilotModelV2', starpilot_modelv2_send) last_vipc_frame_id = meta_main.frame_id - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + starpilot_toggles = get_starpilot_toggles(sm) if __name__ == "__main__": diff --git a/selfdrive/modeld/models/commonmodel_pyx.so b/selfdrive/modeld/models/commonmodel_pyx.so index 12372095873d49fe2b589fecf703ec84e21c1281..cfc53bba9c253556793d9a2a7871f7c8fb8700cb 100755 GIT binary patch delta 70 zcmaE`PU^ursSP(6Mf@K8O}bXqaH_|V*{{HUsx<%mMfuHd7~9`4f-n;hGjD&x$a2|) WrMM)qsQs`R3lOtzKWxS}Hvs^ML>`;~ delta 70 zcmaE`PU^ursSP(6MNTD7tB{^FC1;-4?KdY)CNi&f-uJor4P*NoMi6EKV&?5{7+Efx Xu%s2`r?($AV*z5;?T5|S<|Y6Drnnz& diff --git a/selfdrive/monitoring/dmonitoringd.py b/selfdrive/monitoring/dmonitoringd.py index d2a6163a..10bfde1a 100644 --- a/selfdrive/monitoring/dmonitoringd.py +++ b/selfdrive/monitoring/dmonitoringd.py @@ -18,8 +18,8 @@ def dmonitoringd_thread(): DM = DriverMonitoring(rhd_saved=params.get_bool("IsRhdDetected"), always_on=params.get_bool("AlwaysOnDM")) demo_mode=False - # FrogPilot variables - sm = sm.extend(['frogpilotCarState']) + # StarPilot variables + sm = sm.extend(['starpilotCarState']) driver_view_enabled = params.get_bool("IsDriverViewEnabled") @@ -35,7 +35,7 @@ def dmonitoringd_thread(): DM.run_step(sm, demo=demo_mode) elif valid: DM.run_step(sm, demo=demo_mode) - # FrogPilot variables + # StarPilot variables elif driver_view_enabled: DM.face_detected = sm['driverStateV2'].leftDriverData.faceProb > DM.settings._FACE_THRESHOLD or sm['driverStateV2'].rightDriverData.faceProb > DM.settings._FACE_THRESHOLD diff --git a/selfdrive/monitoring/helpers.py b/selfdrive/monitoring/helpers.py index ca569627..3f9307c9 100644 --- a/selfdrive/monitoring/helpers.py +++ b/selfdrive/monitoring/helpers.py @@ -432,7 +432,7 @@ class DriverMonitoring: rpyCalib = [0., 0., 0.] else: highway_speed = sm['carState'].vEgo - enabled = sm['selfdriveState'].enabled or sm['frogpilotCarState'].alwaysOnLateralEnabled + enabled = sm['selfdriveState'].enabled or sm['starpilotCarState'].alwaysOnLateralEnabled wrong_gear = sm['carState'].gearShifter not in (car.CarState.GearShifter.drive, car.CarState.GearShifter.low) standstill = sm['carState'].standstill driver_engaged = sm['carState'].steeringPressed or sm['carState'].gasPressed diff --git a/selfdrive/pandad/panda_safety.cc b/selfdrive/pandad/panda_safety.cc index 83bff602..f7893887 100644 --- a/selfdrive/pandad/panda_safety.cc +++ b/selfdrive/pandad/panda_safety.cc @@ -65,15 +65,15 @@ void PandaSafety::setSafetyMode(const std::string ¶ms_string) { auto safety_configs = car_params.getSafetyConfigs(); uint16_t alternative_experience = car_params.getAlternativeExperience(); - // FrogPilot variables - std::string frogpilot_params_string = params_.get("FrogPilotCarParams"); + // StarPilot variables + std::string starpilot_params_string = params_.get("StarPilotCarParams"); - AlignedBuffer frogpilot_aligned_buf; - capnp::FlatArrayMessageReader frogpilot_cmsg(frogpilot_aligned_buf.align(frogpilot_params_string.data(), frogpilot_params_string.size())); - cereal::FrogPilotCarParams::Reader frogpilot_car_params = frogpilot_cmsg.getRoot(); + AlignedBuffer starpilot_aligned_buf; + capnp::FlatArrayMessageReader starpilot_cmsg(starpilot_aligned_buf.align(starpilot_params_string.data(), starpilot_params_string.size())); + cereal::StarPilotCarParams::Reader starpilot_car_params = starpilot_cmsg.getRoot(); - auto frogpilot_safety_configs = frogpilot_car_params.getSafetyConfigs(); - alternative_experience |= frogpilot_car_params.getAlternativeExperience(); + auto starpilot_safety_configs = starpilot_car_params.getSafetyConfigs(); + alternative_experience |= starpilot_car_params.getAlternativeExperience(); for (int i = 0; i < pandas_.size(); ++i) { // Default to SILENT safety model if not specified @@ -84,9 +84,9 @@ void PandaSafety::setSafetyMode(const std::string ¶ms_string) { safety_param = safety_configs[i].getSafetyParam(); } - // FrogPilot variables - if (i < frogpilot_safety_configs.size()) { - safety_param |= frogpilot_safety_configs[i].getSafetyParam(); + // StarPilot variables + if (i < starpilot_safety_configs.size()) { + safety_param |= starpilot_safety_configs[i].getSafetyParam(); } LOGW("Panda %d: setting safety model: %d, param: %d, alternative experience: %d", i, (int)safety_model, safety_param, alternative_experience); diff --git a/selfdrive/pandad/pandad b/selfdrive/pandad/pandad index ec96de12a6b63e33b251748157f21ad5fc70a55f..c448510ca743bfbeee41e72cb9cbe5550e994f00 100755 GIT binary patch delta 321 zcmaFxLi@oB?F}hRA~~mB4?XEQXvh>MC~PqA;Dj0Ws+!FeOzjm+j6e*cnSq!Eh*^P{ zZF>b1yLDH6aYViF0C+bADb)QGN~svRFW3QDSZ}icoM#Vo54O#3i*XGdUGa z&^JFNH7Cpnp~^q6C_gd9wJbHS1j)1jnViHtgrcCtl*A&0N!$H;*{fMufC5F^&rV`L zDJ}+L27p}aSdbZ#pPib=01}zLW)-`nDqPMbKQBEe)iVVw2UZP~0@?~v(Ee%_I}mdK MG3WMItGLQM0nY(^P5=M^ delta 321 zcmaFxLi@oB?F}hRA}%3DA#L1}OL!c-mnN<5cd{yf@6}wv)Ly~F2*exRUiv=VWCFT~R2nClUmZTy?TvE$2lT*DK>X`zT1FHrZSq$d3zgoo(#2i4( Lx&75Dt};&mLvVVk diff --git a/selfdrive/pandad/pandad.cc b/selfdrive/pandad/pandad.cc index 70b80ffa..c96fbb36 100644 --- a/selfdrive/pandad/pandad.cc +++ b/selfdrive/pandad/pandad.cc @@ -43,7 +43,7 @@ ExitHandler do_exit; -// FrogPilot variables +// StarPilot variables static uint64_t last_door_lock_command_time = 0; bool check_all_connected(const std::vector &pandas) { @@ -111,7 +111,7 @@ void can_send_thread(std::vector pandas, bool fake_send) { LOGE("sendcan too old to send: %" PRIu64 ", %" PRIu64, nanos_since_boot(), event.getLogMonoTime()); } - // FrogPilot variables + // StarPilot variables for (const cereal::CanData::Reader &can : event.getSendcan()) { if (can.getAddress() == 0x750) { last_door_lock_command_time = nanos_since_boot(); diff --git a/selfdrive/selfdrived/events.py b/selfdrive/selfdrived/events.py index b9558c8a..e3315984 100644 --- a/selfdrive/selfdrived/events.py +++ b/selfdrive/selfdrived/events.py @@ -24,10 +24,10 @@ VisualAlert = car.CarControl.HUDControl.VisualAlert AudibleAlert = car.CarControl.HUDControl.AudibleAlert EventName = log.OnroadEvent.EventName -# FrogPilot variables -FrogPilotAlertStatus = custom.FrogPilotSelfdriveState.AlertStatus -FrogPilotAudibleAlert = custom.FrogPilotCarControl.HUDControl.AudibleAlert -FrogPilotEventName = custom.FrogPilotOnroadEvent.EventName +# StarPilot variables +StarPilotAlertStatus = custom.StarPilotSelfdriveState.AlertStatus +StarPilotAudibleAlert = custom.StarPilotCarControl.HUDControl.AudibleAlert +StarPilotEventName = custom.StarPilotOnroadEvent.EventName # Alert priorities @@ -57,18 +57,18 @@ class ET: # get event name from enum EVENT_NAME = {v: k for k, v in EventName.schema.enumerants.items()} -# FrogPilot variables -FROGPILOT_EVENT_NAME = {v: k for k, v in FrogPilotEventName.schema.enumerants.items()} +# StarPilot variables +STARPILOT_EVENT_NAME = {v: k for k, v in StarPilotEventName.schema.enumerants.items()} class Events: - def __init__(self, frogpilot=False): + def __init__(self, starpilot=False): self.events: list[int] = [] self.static_events: list[int] = [] - self.event_counters = dict.fromkeys((FROGPILOT_EVENTS if frogpilot else EVENTS).keys(), 0) + self.event_counters = dict.fromkeys((STARPILOT_EVENTS if starpilot else EVENTS).keys(), 0) - # FrogPilot variables - self.frogpilot = frogpilot + # StarPilot variables + self.starpilot = starpilot @property def names(self) -> list[int]: @@ -87,7 +87,7 @@ class Events: self.events = self.static_events.copy() def contains(self, event_type: str) -> bool: - return any(event_type in (FROGPILOT_EVENTS if self.frogpilot else EVENTS).get(e, {}) for e in self.events) + return any(event_type in (STARPILOT_EVENTS if self.starpilot else EVENTS).get(e, {}) for e in self.events) def create_alerts(self, event_types: list[str], callback_args=None): if callback_args is None: @@ -95,15 +95,15 @@ class Events: ret = [] for e in self.events: - types = (FROGPILOT_EVENTS if self.frogpilot else EVENTS)[e].keys() + types = (STARPILOT_EVENTS if self.starpilot else EVENTS)[e].keys() for et in event_types: if et in types: - alert = (FROGPILOT_EVENTS if self.frogpilot else EVENTS)[e][et] + alert = (STARPILOT_EVENTS if self.starpilot else EVENTS)[e][et] if not isinstance(alert, Alert): alert = alert(*callback_args) if DT_CTRL * (self.event_counters[e] + 1) >= alert.creation_delay: - alert.alert_type = f"{(FROGPILOT_EVENT_NAME if self.frogpilot else EVENT_NAME)[e]}/{et}" + alert.alert_type = f"{(STARPILOT_EVENT_NAME if self.starpilot else EVENT_NAME)[e]}/{et}" alert.event_type = et ret.append(alert) return ret @@ -115,9 +115,9 @@ class Events: def to_msg(self): ret = [] for event_name in self.events: - event = (custom.FrogPilotOnroadEvent if self.frogpilot else log.OnroadEvent).new_message() + event = (custom.StarPilotOnroadEvent if self.starpilot else log.OnroadEvent).new_message() event.name = event_name - for event_type in (FROGPILOT_EVENTS if self.frogpilot else EVENTS).get(event_name, {}): + for event_type in (STARPILOT_EVENTS if self.starpilot else EVENTS).get(event_name, {}): setattr(event, event_type, True) ret.append(event) return ret @@ -236,31 +236,31 @@ AlertCallbackType = Callable[[car.CarParams, car.CarState, messaging.SubMaster, def soft_disable_alert(alert_text_2: str) -> AlertCallbackType: - def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: if soft_disable_time < int(0.5 / DT_CTRL): return ImmediateDisableAlert(alert_text_2) return SoftDisableAlert(alert_text_2) return func def user_soft_disable_alert(alert_text_2: str) -> AlertCallbackType: - def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: + def func(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: if soft_disable_time < int(0.5 / DT_CTRL): return ImmediateDisableAlert(alert_text_2) return UserSoftDisableAlert(alert_text_2) return func -def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: branch = get_short_branch() # Ensure get_short_branch is cached to avoid lags on startup if "REPLAY" in os.environ: branch = "replay" return StartupAlert("WARNING: This branch is not tested", branch, alert_status=AlertStatus.userPrompt) -def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def below_engage_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: return NoEntryAlert(f"Drive above {get_display_speed(CP.minEnableSpeed, metric)} to engage") -def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: return Alert( f"Steer Unavailable Under {get_display_speed(CP.minSteerSpeed, metric)}", "", @@ -268,7 +268,7 @@ def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.S Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 1.5) -def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: first_word = 'Recalibrating' if sm['liveCalibration'].calStatus == log.LiveCalibrationData.Status.recalibrating else 'Calibrating' return Alert( f"{first_word}: {sm['liveCalibration'].calPerc:.0f}%", @@ -277,7 +277,7 @@ def calibration_incomplete_alert(CP: car.CarParams, CS: car.CarState, sm: messag Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2) -def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: duration = FEEDBACK_MAX_DURATION - ((sm['audioFeedback'].blockNum + 1) * SAMPLE_BUFFER / SAMPLE_RATE) return NormalPermanentAlert( "Recording Audio Feedback", @@ -287,37 +287,37 @@ def audio_feedback_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM # *** debug alerts *** -def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def out_of_space_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: full_perc = round(100. - sm['deviceState'].freeSpacePercent) return NormalPermanentAlert("Out of Storage", f"{full_perc}% full") -def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def posenet_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan err = CS.vEgo - mdl msg = f"Speed Error: {err:.1f} m/s" return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid") -def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def process_not_running_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning] msg = ', '.join(not_running) return NoEntryAlert(msg, alert_text_1="Process Not Running") -def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: bs = [s for s in sm.data.keys() if not sm.all_checks([s, ])] msg = ', '.join(bs[:4]) # can't fit too many on one line return NoEntryAlert(msg, alert_text_1="Communication Issue Between Processes") -def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState') bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])] return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams)) -def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: rpy = sm['liveCalibration'].rpyCalib yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan) pitch = math.degrees(rpy[1] if len(rpy) == 3 else math.nan) @@ -325,7 +325,7 @@ def calibration_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging return NormalPermanentAlert("Calibration Invalid", angles) -def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: if not sm['liveParameters'].angleOffsetValid: angle_offset_deg = sm['liveParameters'].angleOffsetDeg title = "Steering misalignment detected" @@ -343,28 +343,28 @@ def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.Sub return NoEntryAlert(alert_text_1=title, alert_text_2=text) -def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def overheat_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: cpu = max(sm['deviceState'].cpuTempC, default=0.) gpu = max(sm['deviceState'].gpuTempC, default=0.) temp = max((cpu, gpu, sm['deviceState'].memoryTempC)) return NormalPermanentAlert("System Overheated", f"{temp:.0f} °C") -def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def low_memory_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: return NormalPermanentAlert("Low Memory", f"{sm['deviceState'].memoryUsagePercent}% used") -def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def high_cpu_usage_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: x = max(sm['deviceState'].cpuUsagePercent, default=0.) return NormalPermanentAlert("High CPU Usage", f"{x}% used") -def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: return NormalPermanentAlert("Driving Model Lagging", f"{sm['modelV2'].frameDropPerc:.1f}% frames dropped") -def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: - if frogpilot_toggles.has_cc_long: +def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: + if starpilot_toggles.has_cc_long: text = "Enable Cruise Control to Engage" elif CP.brand == "honda": text = "Enable Main Switch to Engage" @@ -373,14 +373,14 @@ def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM return NoEntryAlert(text) -def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: gb = sm['carControl'].actuators.accel / 4. steer = sm['carControl'].actuators.torque vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%" return NormalPermanentAlert("Joystick Mode", vals) -def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: ad = sm['alertDebug'] audible_alert = AudibleAlert.prompt if 'Active' in ad.alertText1 else AudibleAlert.none alert_status = AlertStatus.userPrompt if 'Active' in ad.alertText1 else AlertStatus.normal @@ -390,12 +390,12 @@ def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messagi Priority.LOW, VisualAlert.none, audible_alert, 0.2) -def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def personality_changed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: personality = str(personality).title() return NormalPermanentAlert(f"Driving Personality: {personality}", duration=1.5) -def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: text = "Toggle stock LKAS on or off to engage" if CP.brand == "tesla": text = "Switch to Traffic-Aware Cruise Control to engage" @@ -406,23 +406,23 @@ def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messagin return NormalPermanentAlert("Invalid LKAS setting", text) -# FrogPilot variables -def custom_startup_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: - return StartupAlert(frogpilot_toggles.startup_alert_top, frogpilot_toggles.startup_alert_bottom, alert_status=FrogPilotAlertStatus.frogpilot) +# StarPilot variables +def custom_startup_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: + return StartupAlert(starpilot_toggles.startup_alert_top, starpilot_toggles.startup_alert_bottom, alert_status=StarPilotAlertStatus.starpilot) -def forcing_stop_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: - model_length = sm["frogpilotPlan"].forcingStopLength +def forcing_stop_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: + model_length = sm["starpilotPlan"].forcingStopLength model_length_msg = f"{model_length:.1f} meters" if metric else f"{model_length * CV.METER_TO_FOOT:.1f} feet" return Alert( f"Forcing the car to stop in {model_length_msg}", "Press the gas pedal or 'Resume' button to override", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, + StarPilotAlertStatus.starpilot, AlertSize.mid, Priority.MID, VisualAlert.none, AudibleAlert.prompt, 1.) -def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: holiday_messages = { "new_years": "Happy New Year! 🎉", "valentines": "Happy Valentine's Day! ❤️", @@ -440,13 +440,13 @@ def holiday_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, } return Alert( - holiday_messages.get(frogpilot_toggles.current_holiday_theme, ""), + holiday_messages.get(starpilot_toggles.current_holiday_theme, ""), "", AlertStatus.normal, AlertSize.small, - Priority.LOWEST, VisualAlert.none, FrogPilotAudibleAlert.startup, 5.) + Priority.LOWEST, VisualAlert.none, StarPilotAudibleAlert.startup, 5.) -def nnff_loaded_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: +def nnff_loaded_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: model_name = Params().get("NNFFModelName") if model_name is None: return Alert( @@ -458,12 +458,12 @@ def nnff_loaded_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMast return Alert( "NNFF Torque Controller loaded with:", model_name, - FrogPilotAlertStatus.frogpilot, AlertSize.mid, + StarPilotAlertStatus.starpilot, AlertSize.mid, Priority.LOW, VisualAlert.none, AudibleAlert.engage, 5.0) -def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, frogpilot_toggles: SimpleNamespace) -> Alert: - lane_width = sm["frogpilotPlan"].laneWidthLeft if sm["modelV2"].meta.laneChangeDirection == LaneChangeDirection.left else sm["frogpilotPlan"].laneWidthRight +def no_lane_available_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality, starpilot_toggles: SimpleNamespace) -> Alert: + lane_width = sm["starpilotPlan"].laneWidthLeft if sm["modelV2"].meta.laneChangeDirection == LaneChangeDirection.left else sm["starpilotPlan"].laneWidthRight lane_width_msg = f"{lane_width:.1f} Meters" if metric else f"{lane_width * CV.METER_TO_FOOT:.1f} Feet" return Alert( @@ -1104,9 +1104,9 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, } -# FrogPilot variables -FROGPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { - FrogPilotEventName.blockUser: { +# StarPilot variables +STARPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { + StarPilotEventName.blockUser: { ET.PERMANENT: Alert( "Don't use the 'Development' branch!", "Forcing you into 'Dashcam Mode' for your safety...", @@ -1114,35 +1114,35 @@ FROGPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { Priority.HIGHEST, VisualAlert.none, AudibleAlert.warningImmediate, 1.), }, - FrogPilotEventName.customStartupAlert: { + StarPilotEventName.customStartupAlert: { ET.PERMANENT: custom_startup_alert, }, - FrogPilotEventName.forcingStop: { + StarPilotEventName.forcingStop: { ET.WARNING: forcing_stop_alert, }, - FrogPilotEventName.goatSteerSaturated: { + StarPilotEventName.goatSteerSaturated: { ET.WARNING: Alert( "JESUS TAKE THE WHEEL!!", "Turn Exceeds Steering Limit", AlertStatus.userPrompt, AlertSize.mid, - Priority.LOW, VisualAlert.steerRequired, FrogPilotAudibleAlert.goat, 2.), + Priority.LOW, VisualAlert.steerRequired, StarPilotAudibleAlert.goat, 2.), }, - FrogPilotEventName.greenLight: { + StarPilotEventName.greenLight: { ET.PERMANENT: Alert( "Light Turned Green", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, + StarPilotAlertStatus.starpilot, AlertSize.small, Priority.MID, VisualAlert.none, AudibleAlert.prompt, 3.), }, - FrogPilotEventName.holidayActive: { + StarPilotEventName.holidayActive: { ET.PERMANENT: holiday_alert, }, - FrogPilotEventName.laneChangeBlockedLoud: { + StarPilotEventName.laneChangeBlockedLoud: { ET.WARNING: Alert( "Car Detected in Blindspot", "", @@ -1150,61 +1150,61 @@ FROGPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { Priority.LOW, VisualAlert.none, AudibleAlert.warningSoft, .1), }, - FrogPilotEventName.leadDeparting: { + StarPilotEventName.leadDeparting: { ET.PERMANENT: Alert( "Lead Departed", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, + StarPilotAlertStatus.starpilot, AlertSize.small, Priority.MID, VisualAlert.none, AudibleAlert.prompt, 3.), }, - FrogPilotEventName.nnffLoaded: { + StarPilotEventName.nnffLoaded: { ET.PERMANENT: nnff_loaded_alert, }, - FrogPilotEventName.noLaneAvailable: { + StarPilotEventName.noLaneAvailable: { ET.WARNING: no_lane_available_alert, }, - FrogPilotEventName.openpilotCrashed: { + StarPilotEventName.openpilotCrashed: { ET.IMMEDIATE_DISABLE: Alert( "openpilot crashed", - "Please post the 'Error Log' in the FrogPilot Discord!", + "Please post the 'Error Log' in the StarPilot Discord!", AlertStatus.critical, AlertSize.mid, Priority.HIGHEST, VisualAlert.none, AudibleAlert.prompt, .1), ET.NO_ENTRY: Alert( "openpilot crashed", - "Please post the 'Error Log' in the FrogPilot Discord!", + "Please post the 'Error Log' in the StarPilot Discord!", AlertStatus.critical, AlertSize.mid, Priority.HIGHEST, VisualAlert.none, AudibleAlert.prompt, .1), }, - FrogPilotEventName.speedLimitChanged: { + StarPilotEventName.speedLimitChanged: { ET.PERMANENT: Alert( "Speed limit changed", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, + StarPilotAlertStatus.starpilot, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 3.), }, - FrogPilotEventName.trafficModeActive: { + StarPilotEventName.trafficModeActive: { ET.WARNING: Alert( "Traffic Mode enabled", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, + StarPilotAlertStatus.starpilot, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 3.), }, - FrogPilotEventName.trafficModeInactive: { + StarPilotEventName.trafficModeInactive: { ET.WARNING: Alert( "Traffic Mode Disabled", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, + StarPilotAlertStatus.starpilot, AlertSize.small, Priority.LOW, VisualAlert.none, AudibleAlert.prompt, 3.), }, - FrogPilotEventName.turningLeft: { + StarPilotEventName.turningLeft: { ET.WARNING: Alert( "Turning Left", "", @@ -1212,7 +1212,7 @@ FROGPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1), }, - FrogPilotEventName.turningRight: { + StarPilotEventName.turningRight: { ET.WARNING: Alert( "Turning Right", "", @@ -1221,106 +1221,106 @@ FROGPILOT_EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { }, # Random Events - FrogPilotEventName.accel30: { + StarPilotEventName.accel30: { ET.WARNING: Alert( "UwU u went a bit fast there!", "(⁄ ⁄•⁄ω⁄•⁄ ⁄)", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, - Priority.LOW, VisualAlert.none, FrogPilotAudibleAlert.uwu, 4.), + StarPilotAlertStatus.starpilot, AlertSize.mid, + Priority.LOW, VisualAlert.none, StarPilotAudibleAlert.uwu, 4.), }, - FrogPilotEventName.accel35: { + StarPilotEventName.accel35: { ET.WARNING: Alert( "I ain't giving you no tree-fiddy", "You damn Loch Ness Monsta!", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, - Priority.LOW, VisualAlert.none, FrogPilotAudibleAlert.nessie, 4.), + StarPilotAlertStatus.starpilot, AlertSize.mid, + Priority.LOW, VisualAlert.none, StarPilotAudibleAlert.nessie, 4.), }, - FrogPilotEventName.accel40: { + StarPilotEventName.accel40: { ET.WARNING: Alert( "Great Scott!", "🚗💨", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, - Priority.LOW, VisualAlert.none, FrogPilotAudibleAlert.doc, 4.), + StarPilotAlertStatus.starpilot, AlertSize.mid, + Priority.LOW, VisualAlert.none, StarPilotAudibleAlert.doc, 4.), }, - FrogPilotEventName.dejaVuCurve: { + StarPilotEventName.dejaVuCurve: { ET.PERMANENT: Alert( "♬♪ Deja vu! ᕕ(⌐■_■)ᕗ ♪♬", "🏎️", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, - Priority.LOW, VisualAlert.none, FrogPilotAudibleAlert.dejaVu, 4.), + StarPilotAlertStatus.starpilot, AlertSize.mid, + Priority.LOW, VisualAlert.none, StarPilotAudibleAlert.dejaVu, 4.), }, - FrogPilotEventName.firefoxSteerSaturated: { + StarPilotEventName.firefoxSteerSaturated: { ET.WARNING: Alert( "IE Has Stopped Responding...", "Turn Exceeds Steering Limit", AlertStatus.userPrompt, AlertSize.mid, - Priority.LOW, VisualAlert.steerRequired, FrogPilotAudibleAlert.firefox, 4.), + Priority.LOW, VisualAlert.steerRequired, StarPilotAudibleAlert.firefox, 4.), }, - FrogPilotEventName.hal9000: { + StarPilotEventName.hal9000: { ET.WARNING: Alert( "I'm sorry Dave", "I'm afraid I can't do that...", AlertStatus.normal, AlertSize.mid, - Priority.HIGH, VisualAlert.none, FrogPilotAudibleAlert.hal9000, 4.), + Priority.HIGH, VisualAlert.none, StarPilotAudibleAlert.hal9000, 4.), }, - FrogPilotEventName.openpilotCrashedRandomEvent: { + StarPilotEventName.openpilotCrashedRandomEvent: { ET.IMMEDIATE_DISABLE: Alert( "openpilot crashed 💩", - "Please post the 'Error Log' in the FrogPilot Discord!", + "Please post the 'Error Log' in the StarPilot Discord!", AlertStatus.normal, AlertSize.mid, - Priority.HIGHEST, VisualAlert.none, FrogPilotAudibleAlert.fart, 10.), + Priority.HIGHEST, VisualAlert.none, StarPilotAudibleAlert.fart, 10.), ET.NO_ENTRY: Alert( "openpilot crashed 💩", - "Please post the 'Error Log' in the FrogPilot Discord!", + "Please post the 'Error Log' in the StarPilot Discord!", AlertStatus.normal, AlertSize.mid, - Priority.HIGHEST, VisualAlert.none, FrogPilotAudibleAlert.fart, 10.), + Priority.HIGHEST, VisualAlert.none, StarPilotAudibleAlert.fart, 10.), }, - FrogPilotEventName.thisIsFineSteerSaturated: { + StarPilotEventName.thisIsFineSteerSaturated: { ET.WARNING: Alert( "This is fine ☕", "Turn Exceeds Steering Limit", AlertStatus.userPrompt, AlertSize.mid, - Priority.LOW, VisualAlert.steerRequired, FrogPilotAudibleAlert.thisIsFine, 2.), + Priority.LOW, VisualAlert.steerRequired, StarPilotAudibleAlert.thisIsFine, 2.), }, - FrogPilotEventName.toBeContinued: { + StarPilotEventName.toBeContinued: { ET.PERMANENT: Alert( "To be continued...", "⬅️", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, - Priority.MID, VisualAlert.none, FrogPilotAudibleAlert.continued, 7.), + StarPilotAlertStatus.starpilot, AlertSize.mid, + Priority.MID, VisualAlert.none, StarPilotAudibleAlert.continued, 7.), }, - FrogPilotEventName.vCruise69: { + StarPilotEventName.vCruise69: { ET.WARNING: Alert( "Lol 69", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, - Priority.LOW, VisualAlert.none, FrogPilotAudibleAlert.noice, 2.), + StarPilotAlertStatus.starpilot, AlertSize.small, + Priority.LOW, VisualAlert.none, StarPilotAudibleAlert.noice, 2.), }, - FrogPilotEventName.yourFrogTriedToKillMe: { + StarPilotEventName.yourFrogTriedToKillMe: { ET.PERMANENT: Alert( "Your Frog tried to kill me...", "👺", - FrogPilotAlertStatus.frogpilot, AlertSize.mid, - Priority.MID, VisualAlert.none, FrogPilotAudibleAlert.angry, 5.), + StarPilotAlertStatus.starpilot, AlertSize.mid, + Priority.MID, VisualAlert.none, StarPilotAudibleAlert.angry, 5.), }, - FrogPilotEventName.youveGotMail: { + StarPilotEventName.youveGotMail: { ET.WARNING: Alert( "You've got mail! 📧", "", - FrogPilotAlertStatus.frogpilot, AlertSize.small, - Priority.LOW, VisualAlert.none, FrogPilotAudibleAlert.mail, 3.), + StarPilotAlertStatus.starpilot, AlertSize.small, + Priority.LOW, VisualAlert.none, StarPilotAudibleAlert.mail, 3.), }, } diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index 0698ae15..0c818bf0 100644 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -27,8 +27,8 @@ from openpilot.selfdrive.selfdrived.alertmanager import AlertManager, set_offroa from openpilot.system.version import get_build_metadata from openpilot.system.hardware import HARDWARE -from openpilot.frogpilot.common.frogpilot_utilities import contains_event_type -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_utilities import contains_event_type +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles REPLAY = "REPLAY" in os.environ SIMULATION = "SIMULATION" in os.environ @@ -45,8 +45,8 @@ EventName = log.OnroadEvent.EventName ButtonType = car.CarState.ButtonEvent.Type SafetyModel = car.CarParams.SafetyModel -# FrogPilot variables -FrogPilotEventName = custom.FrogPilotOnroadEvent.EventName +# StarPilot variables +StarPilotEventName = custom.StarPilotOnroadEvent.EventName IGNORED_SAFETY_MODES = (SafetyModel.silent, SafetyModel.noOutput) @@ -132,7 +132,7 @@ class SelfdriveD: self.rk = Ratekeeper(100, print_delay_threshold=None) # Determine startup event - self.startup_event = FrogPilotEventName.customStartupAlert + self.startup_event = StarPilotEventName.customStartupAlert if HARDWARE.get_device_type() == 'mici': self.startup_event = None if not car_recognized: @@ -148,34 +148,34 @@ class SelfdriveD: elif self.CP.passive: self.events.add(EventName.dashcamMode, static=True) - # FrogPilot variables - self.sm = self.sm.extend(['frogpilotCarState', 'frogpilotPlan']) - self.pm = self.pm.extend(['frogpilotOnroadEvents', 'frogpilotSelfdriveState']) + # StarPilot variables + self.sm = self.sm.extend(['starpilotCarState', 'starpilotPlan']) + self.pm = self.pm.extend(['starpilotOnroadEvents', 'starpilotSelfdriveState']) - self.frogpilot_toggles = get_frogpilot_toggles() + self.starpilot_toggles = get_starpilot_toggles() - self.frogpilot_AM = AlertManager() - self.frogpilot_events = Events(frogpilot=True) + self.starpilot_AM = AlertManager() + self.starpilot_events = Events(starpilot=True) self.distance_pressed_previously = False self.display_timer = 0 - self.frogpilot_events_prev = [] + self.starpilot_events_prev = [] self.has_menu = self.CP.brand == "gm" and self.CP.carFingerprint not in CC_ONLY_CAR - self.FPCP = messaging.log_from_bytes(self.params.get("FrogPilotCarParams", block=True), custom.FrogPilotCarParams) + self.FPCP = messaging.log_from_bytes(self.params.get("StarPilotCarParams", block=True), custom.StarPilotCarParams) - if self.frogpilot_toggles.block_user: - self.startup_event = FrogPilotEventName.blockUser + if self.starpilot_toggles.block_user: + self.startup_event = StarPilotEventName.blockUser sentry.capture_block() def update_events(self, CS): """Compute onroadEvents from carState""" self.events.clear() - self.frogpilot_events.clear() + self.starpilot_events.clear() if self.sm['controlsState'].lateralControlState.which() == 'debugState': self.events.add(EventName.joystickDebug) @@ -187,8 +187,8 @@ class SelfdriveD: # Add startup event if self.startup_event is not None: - if self.startup_event in (FrogPilotEventName.blockUser, FrogPilotEventName.customStartupAlert): - self.frogpilot_events.add(self.startup_event) + if self.startup_event in (StarPilotEventName.blockUser, StarPilotEventName.customStartupAlert): + self.starpilot_events.add(self.startup_event) else: self.events.add(self.startup_event) self.startup_event = None @@ -294,8 +294,8 @@ class SelfdriveD: direction = self.sm['modelV2'].meta.laneChangeDirection if (CS.leftBlindspot and direction == LaneChangeDirection.left) or \ (CS.rightBlindspot and direction == LaneChangeDirection.right): - if self.frogpilot_toggles.loud_blindspot_alert: - self.frogpilot_events.add(FrogPilotEventName.laneChangeBlockedLoud) + if self.starpilot_toggles.loud_blindspot_alert: + self.starpilot_events.add(StarPilotEventName.laneChangeBlockedLoud) else: self.events.add(EventName.laneChangeBlocked) else: @@ -304,12 +304,12 @@ class SelfdriveD: # "No Lane Available" when the configured width threshold is not met. if direction == LaneChangeDirection.left: self.events.add(EventName.preLaneChangeLeft) - if self.sm['frogpilotPlan'].laneWidthLeft < self.frogpilot_toggles.lane_detection_width: - self.frogpilot_events.add(FrogPilotEventName.noLaneAvailable) + if self.sm['starpilotPlan'].laneWidthLeft < self.starpilot_toggles.lane_detection_width: + self.starpilot_events.add(StarPilotEventName.noLaneAvailable) elif direction == LaneChangeDirection.right: self.events.add(EventName.preLaneChangeRight) - if self.sm['frogpilotPlan'].laneWidthRight < self.frogpilot_toggles.lane_detection_width: - self.frogpilot_events.add(FrogPilotEventName.noLaneAvailable) + if self.sm['starpilotPlan'].laneWidthRight < self.starpilot_toggles.lane_detection_width: + self.starpilot_events.add(StarPilotEventName.noLaneAvailable) elif self.sm['modelV2'].meta.laneChangeState in (LaneChangeState.laneChangeStarting, LaneChangeState.laneChangeFinishing): self.events.add(EventName.laneChange) @@ -360,13 +360,13 @@ class SelfdriveD: self.events.add(EventName.usbError) if CS.canTimeout: self.events.add(EventName.canBusMissing) - elif not CS.canValid and not self.frogpilot_toggles.force_onroad: + elif not CS.canValid and not self.starpilot_toggles.force_onroad: self.events.add(EventName.canError) # generic catch-all. ideally, a more specific event should be added above instead - has_disable_events = contains_event_type(self.events, self.frogpilot_events, ET.NO_ENTRY) and \ - (contains_event_type(self.events, self.frogpilot_events, ET.SOFT_DISABLE) or - contains_event_type(self.events, self.frogpilot_events, ET.IMMEDIATE_DISABLE)) + has_disable_events = contains_event_type(self.events, self.starpilot_events, ET.NO_ENTRY) and \ + (contains_event_type(self.events, self.starpilot_events, ET.SOFT_DISABLE) or + contains_event_type(self.events, self.starpilot_events, ET.IMMEDIATE_DISABLE)) no_system_errors = (not has_disable_events) or (len(self.events) == num_events) if not self.sm.all_checks() and no_system_errors: if not self.sm.all_alive(): @@ -421,8 +421,8 @@ class SelfdriveD: commanded_torque_at_max = abs(lac.output) > 0.99 # TODO: lac.saturated includes speed and other checks, should be pulled out if undershooting and turning and (lac.saturated or commanded_torque_at_max): - if self.frogpilot_toggles.goat_scream_alert: - self.frogpilot_events.add(FrogPilotEventName.goatSteerSaturated) + if self.starpilot_toggles.goat_scream_alert: + self.starpilot_events.add(StarPilotEventName.goatSteerSaturated) else: self.events.add(EventName.steerSaturated) @@ -450,14 +450,14 @@ class SelfdriveD: if self.CP.openpilotLongitudinalControl: distance_pressed = False - if self.frogpilot_toggles.personality_profile_via_distance: + if self.starpilot_toggles.personality_profile_via_distance: distance_pressed |= any(not be.pressed and be.type == ButtonType.gapAdjustCruise for be in CS.buttonEvents) - distance_pressed &= not (self.sm['frogpilotCarState'].distanceLongPressed or self.sm['frogpilotCarState'].distanceVeryLongPressed) - if self.frogpilot_toggles.personality_profile_via_distance_long: - distance_pressed |= self.sm['frogpilotCarState'].distanceLongPressed - if self.frogpilot_toggles.personality_profile_via_distance_very_long: - distance_pressed |= self.sm['frogpilotCarState'].distanceVeryLongPressed - if self.frogpilot_toggles.personality_profile_via_lkas: + distance_pressed &= not (self.sm['starpilotCarState'].distanceLongPressed or self.sm['starpilotCarState'].distanceVeryLongPressed) + if self.starpilot_toggles.personality_profile_via_distance_long: + distance_pressed |= self.sm['starpilotCarState'].distanceLongPressed + if self.starpilot_toggles.personality_profile_via_distance_very_long: + distance_pressed |= self.sm['starpilotCarState'].distanceVeryLongPressed + if self.starpilot_toggles.personality_profile_via_lkas: distance_pressed |= any(not be.pressed and be.type == ButtonType.lkas for be in CS.buttonEvents) if not distance_pressed and self.distance_pressed_previously: @@ -471,13 +471,13 @@ class SelfdriveD: self.display_timer -= 1 - # FrogPilot variables - self.frogpilot_events.add_from_msg(self.sm['frogpilotPlan'].frogpilotEvents) + # StarPilot variables + self.starpilot_events.add_from_msg(self.sm['starpilotPlan'].starpilotEvents) - if self.frogpilot_toggles.conditional_experimental_mode: - self.experimental_mode = self.sm['frogpilotPlan'].experimentalMode + if self.starpilot_toggles.conditional_experimental_mode: + self.experimental_mode = self.sm['starpilotPlan'].experimentalMode else: - self.experimental_mode |= self.sm['frogpilotPlan'].experimentalMode + self.experimental_mode |= self.sm['starpilotPlan'].experimentalMode def data_sample(self): _car_state = messaging.recv_one(self.car_state_sock) @@ -536,16 +536,16 @@ class SelfdriveD: pers = LONGITUDINAL_PERSONALITY_MAP[self.personality] alerts = self.events.create_alerts(self.state_machine.current_alert_types, [self.CP, CS, self.sm, self.is_metric, self.state_machine.soft_disable_timer, pers, - self.frogpilot_toggles]) + self.starpilot_toggles]) self.AM.add_many(self.sm.frame, alerts) self.AM.process_alerts(self.sm.frame, clear_event_types) - # FrogPilot variables - frogpilot_alerts = self.frogpilot_events.create_alerts(self.state_machine.current_alert_types, [self.CP, CS, self.sm, self.is_metric, + # StarPilot variables + starpilot_alerts = self.starpilot_events.create_alerts(self.state_machine.current_alert_types, [self.CP, CS, self.sm, self.is_metric, self.state_machine.soft_disable_timer, pers, - self.frogpilot_toggles]) - self.frogpilot_AM.add_many(self.sm.frame, frogpilot_alerts) - self.frogpilot_AM.process_alerts(self.sm.frame, clear_event_types) + self.starpilot_toggles]) + self.starpilot_AM.add_many(self.sm.frame, starpilot_alerts) + self.starpilot_AM.process_alerts(self.sm.frame, clear_event_types) def publish_selfdriveState(self, CS): # selfdriveState @@ -555,7 +555,7 @@ class SelfdriveD: ss.enabled = self.enabled ss.active = self.active ss.state = self.state_machine.state - ss.engageable = not contains_event_type(self.events, self.frogpilot_events, ET.NO_ENTRY) + ss.engageable = not contains_event_type(self.events, self.starpilot_events, ET.NO_ENTRY) ss.experimentalMode = self.experimental_mode ss.personality = self.personality @@ -577,47 +577,47 @@ class SelfdriveD: self.pm.send('onroadEvents', ce_send) self.events_prev = self.events.names.copy() - # FrogPilot variables - fpss_msg = messaging.new_message('frogpilotSelfdriveState') + # StarPilot variables + fpss_msg = messaging.new_message('starpilotSelfdriveState') fpss_msg.valid = True - fpss = fpss_msg.frogpilotSelfdriveState + fpss = fpss_msg.starpilotSelfdriveState - fpss.alertText1 = self.frogpilot_AM.current_alert.alert_text_1 - fpss.alertText2 = self.frogpilot_AM.current_alert.alert_text_2 - fpss.alertSize = self.frogpilot_AM.current_alert.alert_size - fpss.alertStatus = self.frogpilot_AM.current_alert.alert_status - fpss.alertType = self.frogpilot_AM.current_alert.alert_type - fpss.alertSound = self.frogpilot_AM.current_alert.audible_alert + fpss.alertText1 = self.starpilot_AM.current_alert.alert_text_1 + fpss.alertText2 = self.starpilot_AM.current_alert.alert_text_2 + fpss.alertSize = self.starpilot_AM.current_alert.alert_size + fpss.alertStatus = self.starpilot_AM.current_alert.alert_status + fpss.alertType = self.starpilot_AM.current_alert.alert_type + fpss.alertSound = self.starpilot_AM.current_alert.audible_alert - self.pm.send('frogpilotSelfdriveState', fpss_msg) + self.pm.send('starpilotSelfdriveState', fpss_msg) - if (self.sm.frame % int(1. / DT_CTRL) == 0) or (self.frogpilot_events.names != self.frogpilot_events_prev): - fpce_send = messaging.new_message('frogpilotOnroadEvents', len(self.frogpilot_events)) + if (self.sm.frame % int(1. / DT_CTRL) == 0) or (self.starpilot_events.names != self.starpilot_events_prev): + fpce_send = messaging.new_message('starpilotOnroadEvents', len(self.starpilot_events)) fpce_send.valid = True - fpce_send.frogpilotOnroadEvents = self.frogpilot_events.to_msg() - self.pm.send('frogpilotOnroadEvents', fpce_send) - self.frogpilot_events_prev = self.frogpilot_events.names.copy() + fpce_send.starpilotOnroadEvents = self.starpilot_events.to_msg() + self.pm.send('starpilotOnroadEvents', fpce_send) + self.starpilot_events_prev = self.starpilot_events.names.copy() def step(self): CS = self.data_sample() self.update_events(CS) if not self.CP.passive and self.initialized: - self.enabled, self.active = self.state_machine.update(self.events, self.frogpilot_events, self.sm['frogpilotCarState'].alwaysOnLateralEnabled) + self.enabled, self.active = self.state_machine.update(self.events, self.starpilot_events, self.sm['starpilotCarState'].alwaysOnLateralEnabled) self.update_alerts(CS) self.publish_selfdriveState(CS) self.CS_prev = CS - # FrogPilot variables - self.frogpilot_toggles = get_frogpilot_toggles(self.sm) + # StarPilot variables + self.starpilot_toggles = get_starpilot_toggles(self.sm) def params_thread(self, evt): while not evt.is_set(): self.is_metric = self.params.get_bool("IsMetric") self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") - if not self.frogpilot_toggles.conditional_experimental_mode: + if not self.starpilot_toggles.conditional_experimental_mode: self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl self.personality = self.params.get("LongitudinalPersonality", return_default=True) time.sleep(0.1) diff --git a/selfdrive/selfdrived/state.py b/selfdrive/selfdrived/state.py index 244ebc26..d05d9a5b 100644 --- a/selfdrive/selfdrived/state.py +++ b/selfdrive/selfdrived/state.py @@ -2,7 +2,7 @@ from cereal import log from openpilot.selfdrive.selfdrived.events import Events, ET from openpilot.common.realtime import DT_CTRL -from openpilot.frogpilot.common.frogpilot_utilities import contains_event_type +from openpilot.starpilot.common.starpilot_utilities import contains_event_type State = log.SelfdriveState.OpenpilotState @@ -16,7 +16,7 @@ class StateMachine: self.state = State.disabled self.soft_disable_timer = 0 - def update(self, events: Events, frogpilot_events: Events, alwaysOnLateralEnabled: bool): + def update(self, events: Events, starpilot_events: Events, alwaysOnLateralEnabled: bool): # decrement the soft disable timer at every step, as it's reset on # entrance in SOFT_DISABLING state self.soft_disable_timer = max(0, self.soft_disable_timer - 1) @@ -26,29 +26,29 @@ class StateMachine: # ENABLED, SOFT DISABLING, PRE ENABLING, OVERRIDING if self.state != State.disabled: # user and immediate disable always have priority in a non-disabled state - if contains_event_type(events, frogpilot_events, ET.USER_DISABLE): + if contains_event_type(events, starpilot_events, ET.USER_DISABLE): self.state = State.disabled self.current_alert_types.append(ET.USER_DISABLE) - elif contains_event_type(events, frogpilot_events, ET.IMMEDIATE_DISABLE): + elif contains_event_type(events, starpilot_events, ET.IMMEDIATE_DISABLE): self.state = State.disabled self.current_alert_types.append(ET.IMMEDIATE_DISABLE) else: # ENABLED if self.state == State.enabled: - if contains_event_type(events, frogpilot_events, ET.SOFT_DISABLE): + if contains_event_type(events, starpilot_events, ET.SOFT_DISABLE): self.state = State.softDisabling self.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) self.current_alert_types.append(ET.SOFT_DISABLE) - elif contains_event_type(events, frogpilot_events, ET.OVERRIDE_LATERAL) or contains_event_type(events, frogpilot_events, ET.OVERRIDE_LONGITUDINAL): + elif contains_event_type(events, starpilot_events, ET.OVERRIDE_LATERAL) or contains_event_type(events, starpilot_events, ET.OVERRIDE_LONGITUDINAL): self.state = State.overriding self.current_alert_types += [ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL] # SOFT DISABLING elif self.state == State.softDisabling: - if not contains_event_type(events, frogpilot_events, ET.SOFT_DISABLE): + if not contains_event_type(events, starpilot_events, ET.SOFT_DISABLE): # no more soft disabling condition, so go back to ENABLED self.state = State.enabled @@ -60,32 +60,32 @@ class StateMachine: # PRE ENABLING elif self.state == State.preEnabled: - if not contains_event_type(events, frogpilot_events, ET.PRE_ENABLE): + if not contains_event_type(events, starpilot_events, ET.PRE_ENABLE): self.state = State.enabled else: self.current_alert_types.append(ET.PRE_ENABLE) # OVERRIDING elif self.state == State.overriding: - if contains_event_type(events, frogpilot_events, ET.SOFT_DISABLE): + if contains_event_type(events, starpilot_events, ET.SOFT_DISABLE): self.state = State.softDisabling self.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) self.current_alert_types.append(ET.SOFT_DISABLE) - elif not (contains_event_type(events, frogpilot_events, ET.OVERRIDE_LATERAL) or contains_event_type(events, frogpilot_events, ET.OVERRIDE_LONGITUDINAL)): + elif not (contains_event_type(events, starpilot_events, ET.OVERRIDE_LATERAL) or contains_event_type(events, starpilot_events, ET.OVERRIDE_LONGITUDINAL)): self.state = State.enabled else: self.current_alert_types += [ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL] # DISABLED elif self.state == State.disabled: - if contains_event_type(events, frogpilot_events, ET.ENABLE): - if contains_event_type(events, frogpilot_events, ET.NO_ENTRY): + if contains_event_type(events, starpilot_events, ET.ENABLE): + if contains_event_type(events, starpilot_events, ET.NO_ENTRY): self.current_alert_types.append(ET.NO_ENTRY) else: - if contains_event_type(events, frogpilot_events, ET.PRE_ENABLE): + if contains_event_type(events, starpilot_events, ET.PRE_ENABLE): self.state = State.preEnabled - elif contains_event_type(events, frogpilot_events, ET.OVERRIDE_LATERAL) or contains_event_type(events, frogpilot_events, ET.OVERRIDE_LONGITUDINAL): + elif contains_event_type(events, starpilot_events, ET.OVERRIDE_LATERAL) or contains_event_type(events, starpilot_events, ET.OVERRIDE_LONGITUDINAL): self.state = State.overriding else: self.state = State.enabled diff --git a/selfdrive/test/longitudinal_maneuvers/plant.py b/selfdrive/test/longitudinal_maneuvers/plant.py index 19027b6e..ddef99f7 100755 --- a/selfdrive/test/longitudinal_maneuvers/plant.py +++ b/selfdrive/test/longitudinal_maneuvers/plant.py @@ -54,7 +54,7 @@ class Plant: from opendbc.car.honda.interface import CarInterface self.planner = LongitudinalPlanner(CarInterface.get_non_essential_params(CAR.HONDA_CIVIC), init_v=self.speed) - self.frogpilot_toggles = SimpleNamespace( + self.starpilot_toggles = SimpleNamespace( taco_tune=False, model_version=None, stop_distance=6.0, @@ -136,7 +136,7 @@ class Plant: car_control.carControl.orientationNED = [0., float(pitch), 0.] # ******** get controlsState messages for plotting *** - frogpilot_plan = SimpleNamespace( + starpilot_plan = SimpleNamespace( vCruise=float(v_cruise), minAcceleration=float(ACCEL_MIN), maxAcceleration=float(ACCEL_MAX), @@ -159,8 +159,8 @@ class Plant: 'selfdriveState': ss.selfdriveState, 'liveParameters': lp.liveParameters, 'modelV2': model.modelV2, - 'frogpilotPlan': frogpilot_plan} - self.planner.update(sm, self.frogpilot_toggles) + 'starpilotPlan': starpilot_plan} + self.planner.update(sm, self.starpilot_toggles) self.acceleration = self.planner.output_a_target self.speed = self.speed + self.acceleration * self.ts self.should_stop = self.planner.output_should_stop diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index fed650d3..ef807752 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -4,7 +4,7 @@ Import('env', 'qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformat base_libs = [common, messaging, visionipc, transformations, 'm', 'OpenCL', 'ssl', 'crypto', 'pthread'] + qt_env["LIBS"] -# FrogPilot variables +# StarPilot variables base_libs += ['avcodec', 'avformat', 'avutil', 'swresample', 'yuv', 'OmxCore'] if arch == 'larch64': @@ -26,9 +26,9 @@ widgets_src = ["qt/widgets/input.cc", "qt/widgets/wifi.cc", "qt/prime_state.cc", "qt/widgets/scrollview.cc", "qt/widgets/cameraview.cc", "#third_party/qrcode/QrCode.cc", "qt/request_repeater.cc", "qt/qt_window.cc", "qt/network/networking.cc", "qt/network/wifi_manager.cc"] -# FrogPilot variables -frogpilot_widgets_src = ["../../frogpilot/ui/qt/widgets/frogpilot_controls.cc"] -widgets_src += frogpilot_widgets_src +# StarPilot variables +starpilot_widgets_src = ["../../starpilot/ui/qt/widgets/starpilot_controls.cc"] +widgets_src += starpilot_widgets_src widgets = qt_env.Library("qt_widgets", widgets_src, LIBS=base_libs) Export('widgets') @@ -41,24 +41,24 @@ qt_src = ["main.cc", "ui.cc", "qt/sidebar.cc", "qt/body.cc", "qt/onroad/onroad_home.cc", "qt/onroad/annotated_camera.cc", "qt/onroad/model.cc", "qt/onroad/buttons.cc", "qt/onroad/alerts.cc", "qt/onroad/driver_monitoring.cc", "qt/onroad/hud.cc"] -# FrogPilot variables -qt_env['CPPPATH'] += ["../../frogpilot/ui/screenrecorder/openmax/include/"] +# StarPilot variables +qt_env['CPPPATH'] += ["../../starpilot/ui/screenrecorder/openmax/include/"] -frogpilot_src = ["../../frogpilot/ui/frogpilot_ui.cc", "../../frogpilot/ui/qt/offroad/data_settings.cc", - "../../frogpilot/ui/qt/offroad/device_settings.cc", "../../frogpilot/ui/qt/offroad/frogpilot_settings.cc", - "../../frogpilot/ui/qt/offroad/expandable_multi_option_dialog.cc", - "../../frogpilot/ui/qt/offroad/lateral_settings.cc", "../../frogpilot/ui/qt/offroad/longitudinal_settings.cc", - "../../frogpilot/ui/qt/offroad/maps_settings.cc", "../../frogpilot/ui/qt/offroad/model_settings.cc", - "../../frogpilot/ui/qt/offroad/navigation_settings.cc", "../../frogpilot/ui/qt/offroad/sounds_settings.cc", - "../../frogpilot/ui/qt/offroad/theme_settings.cc", "../../frogpilot/ui/qt/offroad/utilities.cc", - "../../frogpilot/ui/qt/offroad/vehicle_settings.cc", "../../frogpilot/ui/qt/offroad/visual_settings.cc", - "../../frogpilot/ui/qt/offroad/wheel_settings.cc", "../../frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc", - "../../frogpilot/ui/qt/onroad/frogpilot_buttons.cc", "../../frogpilot/ui/qt/onroad/frogpilot_onroad.cc", - "../../frogpilot/ui/qt/widgets/developer_sidebar.cc", "../../frogpilot/ui/qt/widgets/drive_stats.cc", - "../../frogpilot/ui/qt/widgets/drive_summary.cc", - "../../frogpilot/ui/qt/widgets/navigation_functions.cc", - "../../frogpilot/ui/screenrecorder/omx_encoder.cc", "../../frogpilot/ui/screenrecorder/screenrecorder.cc"] -qt_src += frogpilot_src +starpilot_src = ["../../starpilot/ui/starpilot_ui.cc", "../../starpilot/ui/qt/offroad/data_settings.cc", + "../../starpilot/ui/qt/offroad/device_settings.cc", "../../starpilot/ui/qt/offroad/starpilot_settings.cc", + "../../starpilot/ui/qt/offroad/expandable_multi_option_dialog.cc", + "../../starpilot/ui/qt/offroad/lateral_settings.cc", "../../starpilot/ui/qt/offroad/longitudinal_settings.cc", + "../../starpilot/ui/qt/offroad/maps_settings.cc", "../../starpilot/ui/qt/offroad/model_settings.cc", + "../../starpilot/ui/qt/offroad/navigation_settings.cc", "../../starpilot/ui/qt/offroad/sounds_settings.cc", + "../../starpilot/ui/qt/offroad/theme_settings.cc", "../../starpilot/ui/qt/offroad/utilities.cc", + "../../starpilot/ui/qt/offroad/vehicle_settings.cc", "../../starpilot/ui/qt/offroad/visual_settings.cc", + "../../starpilot/ui/qt/offroad/wheel_settings.cc", "../../starpilot/ui/qt/onroad/starpilot_annotated_camera.cc", + "../../starpilot/ui/qt/onroad/starpilot_buttons.cc", "../../starpilot/ui/qt/onroad/starpilot_onroad.cc", + "../../starpilot/ui/qt/widgets/developer_sidebar.cc", "../../starpilot/ui/qt/widgets/drive_stats.cc", + "../../starpilot/ui/qt/widgets/drive_summary.cc", + "../../starpilot/ui/qt/widgets/navigation_functions.cc", + "../../starpilot/ui/screenrecorder/omx_encoder.cc", "../../starpilot/ui/screenrecorder/screenrecorder.cc"] +qt_src += starpilot_src # build translation files with open(File("translations/languages.json").abspath) as f: diff --git a/selfdrive/ui/layouts/settings/settings.py b/selfdrive/ui/layouts/settings/settings.py index 9c6fec8b..0f5ec198 100644 --- a/selfdrive/ui/layouts/settings/settings.py +++ b/selfdrive/ui/layouts/settings/settings.py @@ -56,7 +56,7 @@ class SettingsLayout(Widget): self._current_panel = PanelType.DEVICE # Panel depth tracking for hierarchical back navigation - # 0 = top level (settings main), 1+ = sub-panels (FrogPilot categories) + # 0 = top level (settings main), 1+ = sub-panels (StarPilot categories) self._panel_depth = 0 # Panel configuration diff --git a/selfdrive/ui/layouts/settings/starpilot/data.py b/selfdrive/ui/layouts/settings/starpilot/data.py index 965bcd46..ab342151 100644 --- a/selfdrive/ui/layouts/settings/starpilot/data.py +++ b/selfdrive/ui/layouts/settings/starpilot/data.py @@ -14,6 +14,14 @@ from openpilot.system.ui.widgets.selection_dialog import SelectionDialog from openpilot.system.ui.widgets.input_dialog import InputDialog from openpilot.selfdrive.ui.layouts.settings.starpilot.panel import StarPilotPanel +LEGACY_STARPILOT_PARAM_RENAMES = { + "FrogPilotApiToken": "StarPilotApiToken", + "FrogPilotCarParams": "StarPilotCarParams", + "FrogPilotCarParamsPersistent": "StarPilotCarParamsPersistent", + "FrogPilotDongleId": "StarPilotDongleId", + "FrogPilotStats": "StarPilotStats", +} + class StarPilotDataLayout(StarPilotPanel): def __init__(self): @@ -190,7 +198,16 @@ class StarPilotToggleBackupsLayout(StarPilotPanel): def on_confirm(r2): if r2 == DialogResult.CONFIRM: src = Path(f"/data/toggle_backups/{val}") + params_dir = Path("/data/params/d") + for old_key, new_key in LEGACY_STARPILOT_PARAM_RENAMES.items(): + if (src / old_key).exists(): + (params_dir / new_key).unlink(missing_ok=True) shutil.copytree(str(src), "/data/params/d", dirs_exist_ok=True) + for old_key, new_key in LEGACY_STARPILOT_PARAM_RENAMES.items(): + old_path = params_dir / old_key + new_path = params_dir / new_key + if old_path.exists(): + old_path.replace(new_path) gui_app.set_modal_overlay(alert_dialog(tr("Toggles restored."))) self._rebuild_grid() diff --git a/selfdrive/ui/layouts/settings/starpilot/driving_model.py b/selfdrive/ui/layouts/settings/starpilot/driving_model.py index a7fa793f..45c1b662 100644 --- a/selfdrive/ui/layouts/settings/starpilot/driving_model.py +++ b/selfdrive/ui/layouts/settings/starpilot/driving_model.py @@ -5,7 +5,7 @@ import threading from pathlib import Path from openpilot.selfdrive.ui.ui_state import ui_state -from openpilot.frogpilot.assets.model_manager import ModelManager +from openpilot.starpilot.assets.model_manager import ModelManager from openpilot.system.hardware import HARDWARE, PC from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.multilang import tr, tr_noop @@ -19,9 +19,9 @@ class StarPilotDrivingModelLayout(StarPilotPanel): super().__init__() if PC: - self._model_dir = Path(os.path.expanduser("~/.comma/frogpilot/data/models")) + self._model_dir = Path(os.path.expanduser("~/.comma/starpilot/data/models")) else: - self._model_dir = Path("/data/frogpilot/models") + self._model_dir = Path("/data/starpilot/models") self._model_dir.mkdir(parents=True, exist_ok=True) self._available_models = [] diff --git a/selfdrive/ui/layouts/settings/starpilot/sounds.py b/selfdrive/ui/layouts/settings/starpilot/sounds.py index 258129b5..e92cdf49 100644 --- a/selfdrive/ui/layouts/settings/starpilot/sounds.py +++ b/selfdrive/ui/layouts/settings/starpilot/sounds.py @@ -3,7 +3,7 @@ import subprocess from pathlib import Path from openpilot.common.basedir import BASEDIR -from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH +from openpilot.starpilot.common.starpilot_variables import ACTIVE_THEME_PATH from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.lib.multilang import tr, tr_noop from openpilot.system.ui.widgets import DialogResult diff --git a/selfdrive/ui/layouts/settings/starpilot/themes.py b/selfdrive/ui/layouts/settings/starpilot/themes.py index e570de01..c76d42ba 100644 --- a/selfdrive/ui/layouts/settings/starpilot/themes.py +++ b/selfdrive/ui/layouts/settings/starpilot/themes.py @@ -11,7 +11,7 @@ from openpilot.system.ui.widgets.selection_dialog import SelectionDialog from openpilot.selfdrive.ui.layouts.settings.starpilot.panel import StarPilotPanel if HARDWARE.get_device_type() == "pc": - THEME_SAVE_PATH = Path(Paths.comma_home()) / "frogpilot" / "data" / "themes" + THEME_SAVE_PATH = Path(Paths.comma_home()) / "starpilot" / "data" / "themes" else: THEME_SAVE_PATH = Path("/data/themes") @@ -142,12 +142,12 @@ class StarPilotThemesLayout(StarPilotPanel): self._rebuild_grid() def _on_startup_alert(self): - options = ["Stock", "FrogPilot", "Clear"] + options = ["Stock", "StarPilot", "Clear"] current_top = self._params.get("StartupMessageTop", encoding='utf-8') or "" if current_top == "Be ready to take over at any time": current = "Stock" elif current_top == "Hop in and buckle up!": - current = "FrogPilot" + current = "StarPilot" else: current = "Clear" @@ -156,7 +156,7 @@ class StarPilotThemesLayout(StarPilotPanel): if val == "Stock": self._params.put("StartupMessageTop", "Be ready to take over at any time") self._params.put("StartupMessageBottom", "Always keep hands on wheel and eyes on road") - elif val == "FrogPilot": + elif val == "StarPilot": self._params.put("StartupMessageTop", "Hop in and buckle up!") self._params.put("StartupMessageBottom", "Human-tested, frog-approved") else: diff --git a/selfdrive/ui/layouts/settings/starpilot/utilities.py b/selfdrive/ui/layouts/settings/starpilot/utilities.py index 22b5a64a..b156421d 100644 --- a/selfdrive/ui/layouts/settings/starpilot/utilities.py +++ b/selfdrive/ui/layouts/settings/starpilot/utilities.py @@ -12,7 +12,7 @@ from openpilot.selfdrive.ui.layouts.settings.starpilot.panel import StarPilotPan EXCLUDED_KEYS = { "AvailableModels", "AvailableModelNames", - "FrogPilotStats", + "StarPilotStats", "GithubSshKeys", "GithubUsername", "MapBoxRequests", @@ -54,13 +54,6 @@ class StarPilotUtilitiesLayout(StarPilotPanel): "on_click": self._on_force_drive_state, "color": "#FA6800", }, - { - "title": tr_noop("The Pond"), - "type": "value", - "get_value": lambda: tr("Paired") if self._params.get_bool("PondPaired") else tr("Not paired"), - "on_click": self._on_pond_clicked, - "color": "#FA6800", - }, {"title": tr_noop("Report Issue"), "type": "hub", "on_click": self._on_report_issue, "color": "#FA6800"}, {"title": tr_noop("Reset to Defaults"), "type": "hub", "on_click": self._on_reset_defaults, "color": "#FA6800"}, {"title": tr_noop("Reset to Stock"), "type": "hub", "on_click": self._on_reset_stock, "color": "#FA6800"}, @@ -101,20 +94,6 @@ class StarPilotUtilitiesLayout(StarPilotPanel): current = self._get_force_drive_state() gui_app.set_modal_overlay(SelectionDialog(tr("Force Drive State"), options, current, on_close=on_select)) - def _on_pond_clicked(self): - paired = self._params.get_bool("PondPaired") - if paired: - - def on_unpair(res): - if res == DialogResult.CONFIRM: - self._params.put_bool("PondPaired", False) - gui_app.set_modal_overlay(alert_dialog(tr("Unpaired from The Pond."))) - self._rebuild_grid() - - gui_app.set_modal_overlay(ConfirmDialog(tr("Unpair from The Pond?"), tr("Unpair"), on_close=on_unpair)) - else: - gui_app.set_modal_overlay(alert_dialog(tr("Visit frogpilot.com/the_pond to pair your device."))) - def _on_report_issue(self): def on_category(res, val): if res != DialogResult.CONFIRM: diff --git a/selfdrive/ui/lib/starpilot_state.py b/selfdrive/ui/lib/starpilot_state.py index 3e46bf84..0b907432 100644 --- a/selfdrive/ui/lib/starpilot_state.py +++ b/selfdrive/ui/lib/starpilot_state.py @@ -110,7 +110,7 @@ class StarPilotState: # Read starpilot_toggles from params memory or scene try: - starpilot_toggles = json.loads(self.params.get("FrogPilotToggles", encoding="utf-8") or "{}") + starpilot_toggles = json.loads(self.params.get("StarPilotToggles", encoding="utf-8") or "{}") except: starpilot_toggles = {} @@ -171,11 +171,11 @@ class StarPilotState: elif PC: self._apply_desktop_fallback(starpilot_toggles) - # 2. Parse FrogPilotCarParamsPersistent - fpcp_bytes = self.params.get("FrogPilotCarParamsPersistent") + # 2. Parse StarPilotCarParamsPersistent + fpcp_bytes = self.params.get("StarPilotCarParamsPersistent") if fpcp_bytes is not None: try: - FPCP = messaging.log_from_bytes(fpcp_bytes, custom.FrogPilotCarParams) + FPCP = messaging.log_from_bytes(fpcp_bytes, custom.StarPilotCarParams) self.car_state.canUsePedal = FPCP.canUsePedal self.car_state.canUseSDSU = FPCP.canUseSDSU self.car_state.openpilotLongitudinalControlDisabled = FPCP.openpilotLongitudinalControlDisabled diff --git a/selfdrive/ui/mici/layouts/home.py b/selfdrive/ui/mici/layouts/home.py index 44654356..83c0dd14 100644 --- a/selfdrive/ui/mici/layouts/home.py +++ b/selfdrive/ui/mici/layouts/home.py @@ -7,7 +7,7 @@ from collections.abc import Callable from openpilot.system.ui.widgets.label import gui_label, MiciLabel, UnifiedLabel from openpilot.system.ui.widgets import Widget from openpilot.system.ui.lib.application import gui_app, FontWeight, DEFAULT_TEXT_COLOR, MousePos -from openpilot.frogpilot.common.frogpilot_variables import MODELS_PATH +from openpilot.starpilot.common.starpilot_variables import MODELS_PATH from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.system.ui.text import wrap_text from openpilot.system.version import training_version, RELEASE_BRANCHES diff --git a/selfdrive/ui/mici/layouts/settings/device.py b/selfdrive/ui/mici/layouts/settings/device.py index 33a21d16..a774560f 100644 --- a/selfdrive/ui/mici/layouts/settings/device.py +++ b/selfdrive/ui/mici/layouts/settings/device.py @@ -227,7 +227,7 @@ class GalaxyBigButton(BigButton): def __init__(self): super().__init__("galaxy", "", gui_app.starpilot_texture("../system/the_pond/assets/images/main_logo.png", 64, 64)) - self._galaxy_dir = Path(Paths.comma_home()) / "frogpilot" / "data" / "galaxy" if PC else Path("/data/galaxy") + self._galaxy_dir = Path(Paths.comma_home()) / "starpilot" / "data" / "galaxy" if PC else Path("/data/galaxy") self._auth_path = self._galaxy_dir / "glxyauth" self._session_path = self._galaxy_dir / "glxysession" self._slug_path = self._galaxy_dir / "glxyslug" diff --git a/selfdrive/ui/mici/layouts/settings/driving_model.py b/selfdrive/ui/mici/layouts/settings/driving_model.py index eae6cdd2..eab57a22 100644 --- a/selfdrive/ui/mici/layouts/settings/driving_model.py +++ b/selfdrive/ui/mici/layouts/settings/driving_model.py @@ -7,13 +7,13 @@ from dataclasses import dataclass from collections.abc import Callable from openpilot.common.params import Params -from openpilot.frogpilot.assets.model_manager import ( +from openpilot.starpilot.assets.model_manager import ( CANCEL_DOWNLOAD_PARAM, DOWNLOAD_PROGRESS_PARAM, ModelManager, TINYGRAD_VERSIONS, ) -from openpilot.frogpilot.common.frogpilot_variables import MODELS_PATH +from openpilot.starpilot.common.starpilot_variables import MODELS_PATH from openpilot.selfdrive.ui.mici.widgets.button import BigButton from openpilot.selfdrive.ui.mici.widgets.dialog import BigDialog, BigDialogBase, BigMultiOptionDialog from openpilot.selfdrive.ui.ui_state import ui_state diff --git a/selfdrive/ui/moc_ui.cc b/selfdrive/ui/moc_ui.cc index 08c7432e..72421f5f 100644 --- a/selfdrive/ui/moc_ui.cc +++ b/selfdrive/ui/moc_ui.cc @@ -35,7 +35,7 @@ QT_MOC_LITERAL(0, 0, 7), // "UIState" QT_MOC_LITERAL(1, 8, 8), // "uiUpdate" QT_MOC_LITERAL(2, 17, 0), // "" QT_MOC_LITERAL(3, 18, 1), // "s" -QT_MOC_LITERAL(4, 20, 16), // "FrogPilotUIState" +QT_MOC_LITERAL(4, 20, 16), // "StarPilotUIState" QT_MOC_LITERAL(5, 37, 2), // "fs" QT_MOC_LITERAL(6, 40, 17), // "offroadTransition" QT_MOC_LITERAL(7, 58, 7), // "offroad" @@ -44,7 +44,7 @@ QT_MOC_LITERAL(9, 81, 7), // "engaged" QT_MOC_LITERAL(10, 89, 6) // "update" }, - "UIState\0uiUpdate\0\0s\0FrogPilotUIState\0" + "UIState\0uiUpdate\0\0s\0StarPilotUIState\0" "fs\0offroadTransition\0offroad\0" "engagedChanged\0engaged\0update" }; @@ -88,7 +88,7 @@ void UIState::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, voi auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { - case 0: _t->uiUpdate((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const FrogPilotUIState(*)>(_a[2]))); break; + case 0: _t->uiUpdate((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const StarPilotUIState(*)>(_a[2]))); break; case 1: _t->offroadTransition((*reinterpret_cast< bool(*)>(_a[1]))); break; case 2: _t->engagedChanged((*reinterpret_cast< bool(*)>(_a[1]))); break; case 3: _t->update(); break; @@ -97,7 +97,7 @@ void UIState::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, voi } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (UIState::*)(const UIState & , const FrogPilotUIState & ); + using _t = void (UIState::*)(const UIState & , const StarPilotUIState & ); if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&UIState::uiUpdate)) { *result = 0; return; @@ -161,7 +161,7 @@ int UIState::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void UIState::uiUpdate(const UIState & _t1, const FrogPilotUIState & _t2) +void UIState::uiUpdate(const UIState & _t1, const StarPilotUIState & _t2) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); @@ -202,14 +202,14 @@ QT_MOC_LITERAL(7, 82, 14), // "timeout_onroad" QT_MOC_LITERAL(8, 97, 6), // "update" QT_MOC_LITERAL(9, 104, 7), // "UIState" QT_MOC_LITERAL(10, 112, 1), // "s" -QT_MOC_LITERAL(11, 114, 16), // "FrogPilotUIState" +QT_MOC_LITERAL(11, 114, 16), // "StarPilotUIState" QT_MOC_LITERAL(12, 131, 2) // "fs" }, "Device\0displayPowerChanged\0\0on\0" "interactiveTimeout\0resetInteractiveTimeout\0" "timeout\0timeout_onroad\0update\0UIState\0" - "s\0FrogPilotUIState\0fs" + "s\0StarPilotUIState\0fs" }; #undef QT_MOC_LITERAL @@ -260,7 +260,7 @@ void Device::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void case 2: _t->resetInteractiveTimeout((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; case 3: _t->resetInteractiveTimeout((*reinterpret_cast< int(*)>(_a[1]))); break; case 4: _t->resetInteractiveTimeout(); break; - case 5: _t->update((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const FrogPilotUIState(*)>(_a[2]))); break; + case 5: _t->update((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const StarPilotUIState(*)>(_a[2]))); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { diff --git a/selfdrive/ui/qt/api.h b/selfdrive/ui/qt/api.h index e4dcc102..2b7d70f1 100644 --- a/selfdrive/ui/qt/api.h +++ b/selfdrive/ui/qt/api.h @@ -7,7 +7,7 @@ #include "common/util.h" -#include "frogpilot/ui/qt/widgets/frogpilot_controls.h" +#include "starpilot/ui/qt/widgets/starpilot_controls.h" namespace CommaApi { diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index d7d6722e..3aaea468 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -9,8 +9,8 @@ #include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/widgets/prime.h" -#include "frogpilot/ui/qt/widgets/drive_stats.h" -#include "frogpilot/ui/qt/widgets/drive_summary.h" +#include "starpilot/ui/qt/widgets/drive_stats.h" +#include "starpilot/ui/qt/widgets/drive_summary.h" // HomeWindow: the container for the offroad and onroad UIs @@ -46,7 +46,7 @@ HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) { QObject::connect(uiState(), &UIState::offroadTransition, this, &HomeWindow::offroadTransition); QObject::connect(uiState(), &UIState::offroadTransition, sidebar, &Sidebar::offroadTransition); - // FrogPilot variables + // StarPilot variables developer_sidebar = new DeveloperSidebar(this); main_layout->addWidget(developer_sidebar); developer_sidebar->setVisible(false); @@ -56,7 +56,7 @@ void HomeWindow::showSidebar(bool show) { sidebar->setVisible(show); } -void HomeWindow::updateState(const UIState &s, const FrogPilotUIState &fs) { +void HomeWindow::updateState(const UIState &s, const StarPilotUIState &fs) { const SubMaster &sm = *(s.sm); // switch to the generic robot UI @@ -65,38 +65,38 @@ void HomeWindow::updateState(const UIState &s, const FrogPilotUIState &fs) { slayout->setCurrentWidget(body); } - // FrogPilot variables - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - const QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + const QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; if (s.scene.started) { - if (frogpilot_scene.driver_camera_timer >= UI_FREQ / 2) { + if (starpilot_scene.driver_camera_timer >= UI_FREQ / 2) { showDriverView(true, true); } else { if (driver_view->isVisible()) { - sidebar->setVisible(params.getBool("Sidebar") || frogpilot_toggles.value("debug_mode").toBool()); + sidebar->setVisible(params.getBool("Sidebar") || starpilot_toggles.value("debug_mode").toBool()); slayout->setCurrentWidget(onroad); } - developer_sidebar->setVisible(frogpilot_toggles.value("developer_sidebar").toBool()); + developer_sidebar->setVisible(starpilot_toggles.value("developer_sidebar").toBool()); - frogpilotUIState()->frogpilot_scene.sidebars_open = developer_sidebar->isVisible() && sidebar->isVisible(); + starpilotUIState()->starpilot_scene.sidebars_open = developer_sidebar->isVisible() && sidebar->isVisible(); } } } void HomeWindow::offroadTransition(bool offroad) { - // FrogPilot variables - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; body->setEnabled(false); - sidebar->setVisible(offroad || params.getBool("SidebarOpen") || frogpilot_toggles.value("debug_mode").toBool()); + sidebar->setVisible(offroad || params.getBool("SidebarOpen") || starpilot_toggles.value("debug_mode").toBool()); if (offroad) { slayout->setCurrentWidget(home); - // FrogPilot variables + // StarPilot variables developer_sidebar->setVisible(false); } else { slayout->setCurrentWidget(onroad); @@ -114,7 +114,7 @@ void HomeWindow::showDriverView(bool show, bool started) { } sidebar->setVisible(show == false); - // FrogPilot variables + // StarPilot variables developer_sidebar->setVisible(false); } @@ -123,7 +123,7 @@ void HomeWindow::mousePressEvent(QMouseEvent* e) { if ((onroad->isVisible() || body->isVisible()) && (!sidebar->isVisible() || e->x() > sidebar->width())) { sidebar->setVisible(!sidebar->isVisible()); - // FrogPilot variables + // StarPilot variables params.putBool("SidebarOpen", sidebar->isVisible()); } } @@ -152,7 +152,7 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { header_layout->setContentsMargins(0, 0, 0, 0); header_layout->setSpacing(16); - // FrogPilot variables + // StarPilot variables date = new ElidedLabel(); header_layout->addWidget(date, 0, Qt::AlignHCenter | Qt::AlignLeft); @@ -189,10 +189,10 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { left_stack->setContentsMargins(0, 0, 0, 0); left_stack->addWidget(new DriveStats()); - FrogPilotDriveSummary *drive_summary = new FrogPilotDriveSummary(this); + StarPilotDriveSummary *drive_summary = new StarPilotDriveSummary(this); left_stack->addWidget(drive_summary); - QObject::connect(drive_summary, &FrogPilotDriveSummary::panelClosed, [left_stack]() { + QObject::connect(drive_summary, &StarPilotDriveSummary::panelClosed, [left_stack]() { left_stack->setCurrentIndex(0); }); QObject::connect(uiState(), &UIState::offroadTransition, [left_stack](bool offroad) { @@ -224,16 +224,16 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { right_widget->addWidget(default_right); - FrogPilotDriveSummary *random_events_summary = new FrogPilotDriveSummary(this, true); + StarPilotDriveSummary *random_events_summary = new StarPilotDriveSummary(this, true); right_widget->addWidget(random_events_summary); right_widget->setCurrentIndex(0); - QObject::connect(random_events_summary, &FrogPilotDriveSummary::panelClosed, [=]() { + QObject::connect(random_events_summary, &StarPilotDriveSummary::panelClosed, [=]() { right_widget->setCurrentIndex(0); }); QObject::connect(uiState(), &UIState::offroadTransition, [right_widget](bool offroad) { static bool previouslyOnroad = false; - if (offroad && previouslyOnroad && frogpilotUIState()->frogpilot_scene.frogpilot_toggles.value("random_events").toBool()) { + if (offroad && previouslyOnroad && starpilotUIState()->starpilot_scene.starpilot_toggles.value("random_events").toBool()) { right_widget->setCurrentIndex(1); } previouslyOnroad = !offroad; @@ -306,10 +306,10 @@ void OffroadHome::refresh() { alert_notif->setText(QString::number(alerts) + (alerts > 1 ? tr(" ALERTS") : tr(" ALERT"))); } - // FrogPilot variables - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; date->setText(QLocale(uiState()->language.mid(5)).toString(QDateTime::currentDateTime(), "dddd, MMMM d")); date->setVisible(util::system_time_valid()); @@ -318,5 +318,5 @@ void OffroadHome::refresh() { if (!versionText.startsWith("v", Qt::CaseInsensitive)) { versionText.prepend("v"); } - version->setText(getBrand() + " - " + versionText + " - " + cleanModelName(frogpilot_toggles.value("model_name").toString())); + version->setText(getBrand() + " - " + versionText + " - " + cleanModelName(starpilot_toggles.value("model_name").toString())); } diff --git a/selfdrive/ui/qt/home.h b/selfdrive/ui/qt/home.h index 79549c6d..b88a189d 100644 --- a/selfdrive/ui/qt/home.h +++ b/selfdrive/ui/qt/home.h @@ -16,7 +16,7 @@ #include "selfdrive/ui/qt/widgets/offroad_alerts.h" #include "selfdrive/ui/ui.h" -#include "frogpilot/ui/qt/widgets/developer_sidebar.h" +#include "starpilot/ui/qt/widgets/developer_sidebar.h" class OffroadHome : public QFrame { Q_OBJECT @@ -42,7 +42,7 @@ private: QPushButton* alert_notif; QPushButton* update_notif; - // FrogPilot variables + // StarPilot variables ElidedLabel* date; }; @@ -73,11 +73,11 @@ private: DriverViewWindow *driver_view; QStackedLayout *slayout; - // FrogPilot variables + // StarPilot variables DeveloperSidebar *developer_sidebar; Params params; private slots: - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); }; diff --git a/selfdrive/ui/qt/moc_home.cc b/selfdrive/ui/qt/moc_home.cc index 725f6049..a2580d77 100644 --- a/selfdrive/ui/qt/moc_home.cc +++ b/selfdrive/ui/qt/moc_home.cc @@ -163,14 +163,14 @@ QT_MOC_LITERAL(11, 105, 11), // "showSidebar" QT_MOC_LITERAL(12, 117, 11), // "updateState" QT_MOC_LITERAL(13, 129, 7), // "UIState" QT_MOC_LITERAL(14, 137, 1), // "s" -QT_MOC_LITERAL(15, 139, 16), // "FrogPilotUIState" +QT_MOC_LITERAL(15, 139, 16), // "StarPilotUIState" QT_MOC_LITERAL(16, 156, 2) // "fs" }, "HomeWindow\0openSettings\0\0index\0param\0" "closeSettings\0offroadTransition\0offroad\0" "showDriverView\0show\0started\0showSidebar\0" - "updateState\0UIState\0s\0FrogPilotUIState\0" + "updateState\0UIState\0s\0StarPilotUIState\0" "fs" }; #undef QT_MOC_LITERAL @@ -231,7 +231,7 @@ void HomeWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, case 5: _t->showDriverView((*reinterpret_cast< bool(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break; case 6: _t->showDriverView((*reinterpret_cast< bool(*)>(_a[1]))); break; case 7: _t->showSidebar((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 8: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const FrogPilotUIState(*)>(_a[2]))); break; + case 8: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const StarPilotUIState(*)>(_a[2]))); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { diff --git a/selfdrive/ui/qt/moc_sidebar.cc b/selfdrive/ui/qt/moc_sidebar.cc index 387d6d01..8531d4b5 100644 --- a/selfdrive/ui/qt/moc_sidebar.cc +++ b/selfdrive/ui/qt/moc_sidebar.cc @@ -42,7 +42,7 @@ QT_MOC_LITERAL(7, 65, 7), // "offroad" QT_MOC_LITERAL(8, 73, 11), // "updateState" QT_MOC_LITERAL(9, 85, 7), // "UIState" QT_MOC_LITERAL(10, 93, 1), // "s" -QT_MOC_LITERAL(11, 95, 16), // "FrogPilotUIState" +QT_MOC_LITERAL(11, 95, 16), // "StarPilotUIState" QT_MOC_LITERAL(12, 112, 2), // "fs" QT_MOC_LITERAL(13, 115, 13), // "connectStatus" QT_MOC_LITERAL(14, 129, 10), // "ItemStatus" @@ -58,7 +58,7 @@ QT_MOC_LITERAL(22, 222, 13) // "storageStatus" }, "Sidebar\0openSettings\0\0index\0param\0" "valueChanged\0offroadTransition\0offroad\0" - "updateState\0UIState\0s\0FrogPilotUIState\0" + "updateState\0UIState\0s\0StarPilotUIState\0" "fs\0connectStatus\0ItemStatus\0pandaStatus\0" "tempStatus\0netType\0netStrength\0" "recordingAudio\0chipStatus\0memoryStatus\0" @@ -135,7 +135,7 @@ void Sidebar::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, voi case 2: _t->openSettings(); break; case 3: _t->valueChanged(); break; case 4: _t->offroadTransition((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 5: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const FrogPilotUIState(*)>(_a[2]))); break; + case 5: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const StarPilotUIState(*)>(_a[2]))); break; default: ; } } else if (_c == QMetaObject::IndexOfMethod) { diff --git a/selfdrive/ui/qt/network/wifi_manager.h b/selfdrive/ui/qt/network/wifi_manager.h index a0fdfa4e..f0c533d6 100644 --- a/selfdrive/ui/qt/network/wifi_manager.h +++ b/selfdrive/ui/qt/network/wifi_manager.h @@ -69,7 +69,7 @@ public: void changeTetheringPassword(const QString &newPassword); QString getTetheringPassword(); - // FrogPilot variables + // StarPilot variables QString getIp4Address(); private: diff --git a/selfdrive/ui/qt/offroad/developer_panel.cc b/selfdrive/ui/qt/offroad/developer_panel.cc index 1545deec..c81adad5 100644 --- a/selfdrive/ui/qt/offroad/developer_panel.cc +++ b/selfdrive/ui/qt/offroad/developer_panel.cc @@ -11,7 +11,7 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { mainListLayout->setContentsMargins(50, 25, 50, 25); mainListLayout->setSpacing(20); - FrogPilotListWidget *mainList = new FrogPilotListWidget(mainWidget); + StarPilotListWidget *mainList = new StarPilotListWidget(mainWidget); mainListLayout->addWidget(mainList); adbToggle = new ParamControl("AdbEnabled", tr("Enable ADB"), @@ -61,7 +61,7 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { // Toggles should be not available to change in onroad state QObject::connect(uiState(), &UIState::offroadTransition, this, &DeveloperPanel::updateToggles); - // FrogPilot variables + // StarPilot variables QJsonObject shownDescriptions = QJsonDocument::fromJson(QString::fromStdString(params.get("ShownToggleDescriptions")).toUtf8()).object(); QString className = this->metaObject()->className(); @@ -71,11 +71,11 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { std::vector keys = params.allKeys(); for (const std::string &key : keys) { - frogpilotToggleLevels[QString::fromStdString(key)] = params.getTuningLevel(key); + starpilotToggleLevels[QString::fromStdString(key)] = params.getTuningLevel(key); } - developerUIToggle = new FrogPilotManageControl("DeveloperUI", tr("Developer UI"), tr("Detailed information about openpilot's internal operations."), ""); - QObject::connect(developerUIToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + developerUIToggle = new StarPilotManageControl("DeveloperUI", tr("Developer UI"), tr("Detailed information about openpilot's internal operations."), ""); + QObject::connect(developerUIToggle, &StarPilotManageControl::manageButtonClicked, [this]() { mainLayout->setCurrentWidget(developerUIPanel); emit openSubPanel(); }); @@ -83,22 +83,22 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { mainLayout->addWidget(mainWidget); - FrogPilotListWidget *developerUIList = new FrogPilotListWidget(this); + StarPilotListWidget *developerUIList = new StarPilotListWidget(this); developerUIList->setContentsMargins(50, 25, 50, 25); developerUIPanel = new ScrollView(developerUIList, this); mainLayout->addWidget(developerUIPanel); - FrogPilotListWidget *developerMetricList = new FrogPilotListWidget(this); + StarPilotListWidget *developerMetricList = new StarPilotListWidget(this); developerMetricList->setContentsMargins(50, 25, 50, 25); developerMetricPanel = new ScrollView(developerMetricList, this); mainLayout->addWidget(developerMetricPanel); - FrogPilotListWidget *developerSidebarList = new FrogPilotListWidget(this); + StarPilotListWidget *developerSidebarList = new StarPilotListWidget(this); developerSidebarList->setContentsMargins(50, 25, 50, 25); developerSidebarPanel = new ScrollView(developerSidebarList, this); mainLayout->addWidget(developerSidebarPanel); - FrogPilotListWidget *developerWidgetList = new FrogPilotListWidget(this); + StarPilotListWidget *developerWidgetList = new StarPilotListWidget(this); developerWidgetList->setContentsMargins(50, 25, 50, 25); developerWidgetPanel = new ScrollView(developerWidgetList, this); mainLayout->addWidget(developerWidgetPanel); @@ -132,8 +132,8 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { AbstractControl *developerToggle; if (param == "DeveloperMetrics") { - FrogPilotManageControl *developerMetricsToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(developerMetricsToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + StarPilotManageControl *developerMetricsToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(developerMetricsToggle, &StarPilotManageControl::manageButtonClicked, [this]() { mainLayout->setCurrentWidget(developerMetricPanel); emit openSubSubPanel(); }); @@ -141,22 +141,22 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { } else if (param == "BorderMetrics") { std::vector borderToggles{"BlindSpotMetrics", "ShowSteering", "SignalMetrics"}; std::vector borderToggleNames{tr("Blind Spot"), tr("Steering Torque"), tr("Turn Signal")}; - borderMetricsButton = new FrogPilotButtonToggleControl(param, title, desc, icon, borderToggles, borderToggleNames); + borderMetricsButton = new StarPilotButtonToggleControl(param, title, desc, icon, borderToggles, borderToggleNames); developerToggle = borderMetricsButton; } else if (param == "NumericalTemp") { std::vector temperatureToggles{"Fahrenheit"}; std::vector temperatureToggleNames{tr("Fahrenheit")}; - developerToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, temperatureToggles, temperatureToggleNames); + developerToggle = new StarPilotButtonToggleControl(param, title, desc, icon, temperatureToggles, temperatureToggleNames); } else if (param == "SidebarMetrics") { sidebarMetricsToggles = {"ShowCPU", "ShowGPU", "ShowIP", "ShowMemoryUsage", "ShowStorageLeft", "ShowStorageUsed"}; std::vector sidebarMetricsToggleNames{tr("CPU"), tr("GPU"), tr("IP"), tr("RAM"), tr("SSD Left"), tr("SSD Used")}; - sidebarMetricsToggle = new FrogPilotButtonsControl(title, desc, icon, sidebarMetricsToggleNames, true, false, 150); + sidebarMetricsToggle = new StarPilotButtonsControl(title, desc, icon, sidebarMetricsToggleNames, true, false, 150); for (int i = 0; i < sidebarMetricsToggles.size(); ++i) { if (params.getBool(sidebarMetricsToggles[i].toStdString())) { sidebarMetricsToggle->setCheckedButton(i); } } - QObject::connect(sidebarMetricsToggle, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + QObject::connect(sidebarMetricsToggle, &StarPilotButtonsControl::buttonClicked, [this](int id) { params.putBool(sidebarMetricsToggles[id].toStdString(), !params.getBool(sidebarMetricsToggles[id].toStdString())); if (id == 0) { @@ -183,8 +183,8 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { }); developerToggle = sidebarMetricsToggle; } else if (param == "DeveloperSidebar") { - FrogPilotManageControl *developerSidebarToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(developerSidebarToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + StarPilotManageControl *developerSidebarToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(developerSidebarToggle, &StarPilotManageControl::manageButtonClicked, [this]() { mainLayout->setCurrentWidget(developerSidebarPanel); emit openSubSubPanel(); }); @@ -226,8 +226,8 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { metricToggle->setValue(developerSidebarMetricOptions.value(params.getInt(param.toStdString()), tr("None"))); developerToggle = metricToggle; } else if (param == "DeveloperWidgets") { - FrogPilotManageControl *developerWidgetsToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(developerWidgetsToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + StarPilotManageControl *developerWidgetsToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(developerWidgetsToggle, &StarPilotManageControl::manageButtonClicked, [this]() { mainLayout->setCurrentWidget(developerWidgetPanel); emit openSubSubPanel(); }); @@ -235,7 +235,7 @@ DeveloperPanel::DeveloperPanel(SettingsWindow *parent) : QFrame(parent) { } else if (param == "ShowStoppingPoint") { std::vector stoppingPointToggles{"ShowStoppingPointMetrics"}; std::vector stoppingPointToggleNames{tr("Show Distance")}; - developerToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, stoppingPointToggles, stoppingPointToggleNames); + developerToggle = new StarPilotButtonToggleControl(param, title, desc, icon, stoppingPointToggles, stoppingPointToggleNames); } else { developerToggle = new ParamControl(param, title, desc, icon); } @@ -272,7 +272,7 @@ void DeveloperPanel::updateToggles(bool _offroad) { btn->setEnabled(_offroad); } - // FrogPilot variables + // StarPilot variables for (auto &[key, toggle] : toggles) { if (toggle == btn) { btn->setEnabled(true); @@ -305,7 +305,7 @@ void DeveloperPanel::updateToggles(bool _offroad) { longManeuverToggle->setEnabled(hasLongitudinalControl(CP) && _offroad); - // FrogPilot variables + // StarPilot variables hasOpenpilotLongitudinal = hasLongitudinalControl(CP); hasRadar = !CP.getRadarUnavailable(); @@ -318,7 +318,7 @@ void DeveloperPanel::updateToggles(bool _offroad) { offroad = _offroad; - // FrogPilot variables + // StarPilot variables tuningLevel = params.getInt("TuningLevel"); for (auto &[key, toggle] : toggles) { @@ -332,7 +332,7 @@ void DeveloperPanel::updateToggles(bool _offroad) { continue; } - bool setVisible = tuningLevel >= frogpilotToggleLevels[key].toDouble(); + bool setVisible = tuningLevel >= starpilotToggleLevels[key].toDouble(); if (key == "AdjacentLeadsUI") { setVisible &= hasRadar && !(params.getBool("AdvancedCustomUI") && params.getBool("HideLeadMarker")); @@ -363,7 +363,7 @@ void DeveloperPanel::updateToggles(bool _offroad) { borderMetricsButton->setVisibleButton(0, hasBSM); - developerUIToggle->setVisible(tuningLevel >= frogpilotToggleLevels["DeveloperUI"].toDouble()); + developerUIToggle->setVisible(tuningLevel >= starpilotToggleLevels["DeveloperUI"].toDouble()); openDescriptions(forceOpenDescriptions, toggles); @@ -373,7 +373,7 @@ void DeveloperPanel::updateToggles(bool _offroad) { void DeveloperPanel::showEvent(QShowEvent *event) { updateToggles(offroad); - // FrogPilot variables + // StarPilot variables for (int i = 0; i < sidebarMetricsToggles.size(); ++i) { if (params.getBool(sidebarMetricsToggles[i].toStdString())) { sidebarMetricsToggle->setCheckedButton(i); diff --git a/selfdrive/ui/qt/offroad/developer_panel.h b/selfdrive/ui/qt/offroad/developer_panel.h index be202203..db903f32 100644 --- a/selfdrive/ui/qt/offroad/developer_panel.h +++ b/selfdrive/ui/qt/offroad/developer_panel.h @@ -2,7 +2,7 @@ #include "selfdrive/ui/qt/offroad/settings.h" -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" class DeveloperPanel : public QFrame { Q_OBJECT @@ -10,7 +10,7 @@ public: explicit DeveloperPanel(SettingsWindow *parent); void showEvent(QShowEvent *event) override; -// FrogPilot variables +// StarPilot variables signals: void openSubPanel(); void openSubSubPanel(); @@ -24,7 +24,7 @@ private: bool is_release; bool offroad = false; - // FrogPilot variables + // StarPilot variables bool forceOpenDescriptions = false; bool hasBSM = true; bool hasOpenpilotLongitudinal = true; @@ -36,13 +36,13 @@ private: std::vector sidebarMetricsToggles; - FrogPilotButtonsControl *sidebarMetricsToggle; + StarPilotButtonsControl *sidebarMetricsToggle; - FrogPilotButtonToggleControl *borderMetricsButton; + StarPilotButtonToggleControl *borderMetricsButton; - FrogPilotManageControl *developerUIToggle; + StarPilotManageControl *developerUIToggle; - QJsonObject frogpilotToggleLevels; + QJsonObject starpilotToggleLevels; QSet developerMetricKeys = {"AdjacentPathMetrics", "BorderMetrics", "FPSCounter", "LeadInfo", "NumericalTemp", "SidebarMetrics", "UseSI"}; QSet developerSidebarKeys = {"DeveloperSidebarMetric1", "DeveloperSidebarMetric2", "DeveloperSidebarMetric3", "DeveloperSidebarMetric4", "DeveloperSidebarMetric5", "DeveloperSidebarMetric6", "DeveloperSidebarMetric7"}; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 65568e71..36441d6e 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -22,7 +22,7 @@ #include "selfdrive/ui/qt/offroad/developer_panel.h" #include "selfdrive/ui/qt/offroad/firehose.h" -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { // param, title, desc, icon, restart needed @@ -128,7 +128,7 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { toggles["ExperimentalMode"]->setActiveIcon("../assets/icons/experimental.svg"); toggles["ExperimentalMode"]->setConfirmation(true, true); - // FrogPilot variables + // StarPilot variables connect(toggles["IsMetric"], &ToggleControl::toggleFlipped, [=](bool isMetric) { updateMetric(isMetric); }); @@ -215,18 +215,18 @@ void TogglesPanel::updateToggles() { experimental_mode_toggle->setDescription(e2e_description); } - // FrogPilot variables - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; auto disengage_on_accelerator_toggle = toggles["DisengageOnAccelerator"]; - disengage_on_accelerator_toggle->setVisible(!frogpilot_toggles.value("always_on_lateral").toBool()); + disengage_on_accelerator_toggle->setVisible(!starpilot_toggles.value("always_on_lateral").toBool()); auto driver_camera_toggle = toggles["RecordFront"]; - driver_camera_toggle->setVisible(!frogpilot_toggles.value("no_logging").toBool()); - experimental_mode_toggle->setVisible(!frogpilot_toggles.value("conditional_experimental_mode").toBool()); + driver_camera_toggle->setVisible(!starpilot_toggles.value("no_logging").toBool()); + experimental_mode_toggle->setVisible(!starpilot_toggles.value("conditional_experimental_mode").toBool()); auto record_audio_toggle = toggles["RecordAudio"]; - record_audio_toggle->setVisible(!frogpilot_toggles.value("no_logging").toBool()); + record_audio_toggle->setVisible(!starpilot_toggles.value("no_logging").toBool()); } GalaxyQRPopup::GalaxyQRPopup(const QString &url, QWidget *parent) : DialogBase(parent) { @@ -279,7 +279,7 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { }); addItem(pair_device); - const std::string galaxy_dir = Hardware::PC() ? (Path::comma_home() + "/frogpilot/data/galaxy") : "/data/galaxy"; + const std::string galaxy_dir = Hardware::PC() ? (Path::comma_home() + "/starpilot/data/galaxy") : "/data/galaxy"; const std::string galaxy_auth_path = galaxy_dir + "/glxyauth"; const std::string galaxy_session_path = galaxy_dir + "/glxysession"; const std::string galaxy_slug_path = galaxy_dir + "/glxyslug"; @@ -566,7 +566,7 @@ void SettingsWindow::showEvent(QShowEvent *event) { setCurrentPanel(0); } -// FrogPilot variables +// StarPilot variables void SettingsWindow::hideEvent(QHideEvent *event) { closePanel(); closeSubPanel(); @@ -576,7 +576,7 @@ void SettingsWindow::hideEvent(QHideEvent *event) { subSubPanelOpen = false; subSubSubPanelOpen = false; - updateFrogPilotToggles(); + updateStarPilotToggles(); } void SettingsWindow::setCurrentPanel(int index, const QString ¶m) { @@ -627,7 +627,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { sidebar_layout->addSpacing(10); sidebar_layout->addWidget(close_btn, 0, Qt::AlignRight); QObject::connect(close_btn, &QPushButton::clicked, [this]() { - // FrogPilot variables + // StarPilot variables if (subSubSubPanelOpen) { closeSubSubSubPanel(); subSubSubPanelOpen = false; @@ -657,15 +657,15 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { auto networking = new Networking(this); QObject::connect(uiState()->prime_state, &PrimeState::changed, networking, &Networking::setPrimeType); - // FrogPilot variables + // StarPilot variables QObject::connect(toggles, &TogglesPanel::updateMetric, this, &SettingsWindow::updateMetric); - FrogPilotSettingsWindow *frogpilotSettingsWindow = new FrogPilotSettingsWindow(this); - QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openPanel, [this]() {panelOpen=true;}); - QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openSubPanel, [this]() {subPanelOpen=true;}); - QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openSubSubPanel, [this]() {subSubPanelOpen=true;}); - QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::openSubSubSubPanel, [this]() {subSubSubPanelOpen=true;}); - QObject::connect(frogpilotSettingsWindow, &FrogPilotSettingsWindow::tuningLevelChanged, this, &SettingsWindow::updateDeveloperToggle); + StarPilotSettingsWindow *starpilotSettingsWindow = new StarPilotSettingsWindow(this); + QObject::connect(starpilotSettingsWindow, &StarPilotSettingsWindow::openPanel, [this]() {panelOpen=true;}); + QObject::connect(starpilotSettingsWindow, &StarPilotSettingsWindow::openSubPanel, [this]() {subPanelOpen=true;}); + QObject::connect(starpilotSettingsWindow, &StarPilotSettingsWindow::openSubSubPanel, [this]() {subSubPanelOpen=true;}); + QObject::connect(starpilotSettingsWindow, &StarPilotSettingsWindow::openSubSubSubPanel, [this]() {subSubSubPanelOpen=true;}); + QObject::connect(starpilotSettingsWindow, &StarPilotSettingsWindow::tuningLevelChanged, this, &SettingsWindow::updateDeveloperToggle); DeveloperPanel *developerPanel = new DeveloperPanel(this); QObject::connect(developerPanel, &DeveloperPanel::openSubPanel, [this]() {subPanelOpen=true;}); @@ -677,7 +677,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { {tr("Toggles"), toggles}, {tr("Software"), new SoftwarePanel(this)}, {tr("Developer"), developerPanel}, - {tr("StarPilot"), frogpilotSettingsWindow}, + {tr("StarPilot"), starpilotSettingsWindow}, }; nav_btns = new QButtonGroup(this); @@ -711,45 +711,45 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { panel_widget->addWidget(panel_frame); QObject::connect(btn, &QPushButton::clicked, [=, w = panel_frame]() { - // FrogPilot variables - if (w->widget() == frogpilotSettingsWindow) { + // StarPilot variables + if (w->widget() == starpilotSettingsWindow) { bool tuningLevelConfirmed = params.getBool("TuningLevelConfirmed"); if (!tuningLevelConfirmed) { - int frogpilotHours = QJsonDocument::fromJson(QString::fromStdString(params.get("FrogPilotStats")).toUtf8()).object().value("FrogPilotSeconds").toInt() / (60 * 60); + int starpilotHours = QJsonDocument::fromJson(QString::fromStdString(params.get("StarPilotStats")).toUtf8()).object().value("StarPilotSeconds").toInt() / (60 * 60); int openpilotHours = params.getInt("KonikMinutes") / 60 + params.getInt("openpilotMinutes") / 60; - if (frogpilotHours < 1 && openpilotHours < 100) { + if (starpilotHours < 1 && openpilotHours < 100) { if (openpilotHours < 10) { - if (ConfirmationDialog::alert(tr("Welcome to FrogPilot! Since you're new to openpilot, the \"Minimal\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { + if (ConfirmationDialog::alert(tr("Welcome to StarPilot! Since you're new to openpilot, the \"Minimal\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { params.putBool("TuningLevelConfirmed", true); params.putInt("TuningLevel", 0); } } else { - if (ConfirmationDialog::alert(tr("Welcome to FrogPilot! Since you're new to FrogPilot, the \"Minimal\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { + if (ConfirmationDialog::alert(tr("Welcome to StarPilot! Since you're new to StarPilot, the \"Minimal\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { params.putBool("TuningLevelConfirmed", true); params.putInt("TuningLevel", 0); } } - } else if (frogpilotHours < 50 && openpilotHours < 100) { - if (ConfirmationDialog::alert(tr("Since you're fairly new to FrogPilot, the \"Minimal\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { + } else if (starpilotHours < 50 && openpilotHours < 100) { + if (ConfirmationDialog::alert(tr("Since you're fairly new to StarPilot, the \"Minimal\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { params.putBool("TuningLevelConfirmed", true); params.putInt("TuningLevel", 0); } - } else if (frogpilotHours < 100) { + } else if (starpilotHours < 100) { if (openpilotHours >= 100) { if (ConfirmationDialog::alert(tr("Since you're experienced with openpilot, the \"Standard\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { params.putBool("TuningLevelConfirmed", true); params.putInt("TuningLevel", 1); } } else { - if (ConfirmationDialog::alert(tr("Since you're experienced with FrogPilot, the \"Standard\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { + if (ConfirmationDialog::alert(tr("Since you're experienced with StarPilot, the \"Standard\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { params.putBool("TuningLevelConfirmed", true); params.putInt("TuningLevel", 1); } } - } else if (frogpilotHours >= 100) { - if (ConfirmationDialog::alert(tr("Since you're very experienced with FrogPilot, the \"Advanced\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { + } else if (starpilotHours >= 100) { + if (ConfirmationDialog::alert(tr("Since you're very experienced with StarPilot, the \"Advanced\" toggle preset has been applied, but you can change this at any time via the \"Tuning Level\" button!"), this, true)) { params.putBool("TuningLevelConfirmed", true); params.putInt("TuningLevel", 2); } @@ -801,11 +801,11 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { } )"); - // FrogPilot variables + // StarPilot variables updateDeveloperToggle(params.getInt("TuningLevel")); } -// FrogPilot variables +// StarPilot variables void SettingsWindow::updateDeveloperToggle(int tuningLevel) { for (QAbstractButton *btn : nav_btns->buttons()) { if (btn->text() == tr("Developer")) { diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 252b5062..247f247d 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -26,7 +26,7 @@ public: protected: void showEvent(QShowEvent *event) override; - // FrogPilot variables + // StarPilot variables void hideEvent(QHideEvent *event) override; signals: @@ -36,7 +36,7 @@ signals: void expandToggleDescription(const QString ¶m); void scrollToToggle(const QString ¶m); - // FrogPilot variables + // StarPilot variables void closePanel(); void closeSubPanel(); void closeSubSubPanel(); @@ -50,7 +50,7 @@ private: QButtonGroup *nav_btns; QStackedWidget *panel_widget; - // FrogPilot variables + // StarPilot variables void updateDeveloperToggle(int tuningLevel); bool panelOpen; @@ -104,7 +104,7 @@ public: void showEvent(QShowEvent *event) override; signals: - // FrogPilot variables + // StarPilot variables void updateMetric(bool metric, bool bootRun=false); public slots: diff --git a/selfdrive/ui/qt/offroad/software_settings.cc b/selfdrive/ui/qt/offroad/software_settings.cc index 221726f8..d3188c17 100644 --- a/selfdrive/ui/qt/offroad/software_settings.cc +++ b/selfdrive/ui/qt/offroad/software_settings.cc @@ -30,8 +30,8 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { addItem(versionLbl); // automatic updates toggle - ParamControl *automaticUpdatesToggle = new ParamControl("AutomaticUpdates", tr("Automatically Update FrogPilot"), - tr("Automatically update FrogPilot when the vehicle is parked with an active internet connection."), ""); + ParamControl *automaticUpdatesToggle = new ParamControl("AutomaticUpdates", tr("Automatically Update StarPilot"), + tr("Automatically update StarPilot when the vehicle is parked with an active internet connection."), ""); automaticUpdatesToggle->setVisible(true); addItem(automaticUpdatesToggle); @@ -44,7 +44,7 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { } else { std::system("pkill -SIGHUP -f system.updated.updated"); } - frogpilotUIState()->params_memory.putBool("ManualUpdateInitiated", true); + starpilotUIState()->params_memory.putBool("ManualUpdateInitiated", true); }); addItem(downloadBtn); @@ -63,11 +63,11 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { QStringList branches = QString::fromStdString(params.get("UpdaterAvailableBranches")).split(","); if (!isFrogsGoMoo()) { for (int i = branches.size() - 1; i >= 0; --i) { - if (branches[i].startsWith("FrogPilot-Development", Qt::CaseInsensitive)) { + if (branches[i].startsWith("StarPilot-Development", Qt::CaseInsensitive)) { branches.removeAt(i); } } - branches.removeAll("FrogPilot-Vetting"); + branches.removeAll("StarPilot-Vetting"); branches.removeAll("MAKE-PRS-HERE"); } for (QString b : {current.c_str(), "devel-staging", "devel", "nightly", "nightly-dev", "master"}) { @@ -85,11 +85,11 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { targetBranchBtn->setValue(QString::fromStdString(params.get("UpdaterTargetBranch"))); checkForUpdates(); - // FrogPilot variables + // StarPilot variables if (selection != cur) { - if (FrogPilotConfirmationDialog::yesorno(tr("This branch must be downloaded before switching. Would you like to download it now?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("This branch must be downloaded before switching. Would you like to download it now?"), this)) { std::system("pkill -SIGHUP -f system.updated.updated"); - frogpilotUIState()->params_memory.putBool("ManualUpdateInitiated", true); + starpilotUIState()->params_memory.putBool("ManualUpdateInitiated", true); } } } @@ -100,8 +100,8 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { auto uninstallBtn = new ButtonControl(tr("Uninstall %1").arg(getBrand()), tr("UNINSTALL")); connect(uninstallBtn, &ButtonControl::clicked, [&]() { if (ConfirmationDialog::confirm(tr("Are you sure you want to uninstall?"), tr("Uninstall"), this)) { - if (FrogPilotConfirmationDialog::yesorno(tr("Do you want to perform a full factory reset? All saved assets and settings will be permanently deleted!"), this)) { - if (FrogPilotConfirmationDialog::yesorno(tr("This is a complete factory reset and cannot be undone. Are you absolutely sure you want to continue?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Do you want to perform a full factory reset? All saved assets and settings will be permanently deleted!"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("This is a complete factory reset and cannot be undone. Are you absolutely sure you want to continue?"), this)) { Params().clearAll(ParamKeyFlag::ALL); } } @@ -137,21 +137,21 @@ void SoftwarePanel::showEvent(QShowEvent *event) { updateLabels(); - // FrogPilot variables - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + // StarPilot variables + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; - if (frogpilot_scene.online && params.get("UpdaterState") == "idle") { + if (starpilot_scene.online && params.get("UpdaterState") == "idle") { checkForUpdates(); } } void SoftwarePanel::updateLabels() { - // FrogPilot variables - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + // StarPilot variables + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; - bool parked = frogpilot_scene.parked || isFrogsGoMoo(); + bool parked = starpilot_scene.parked || isFrogsGoMoo(); // add these back in case the files got removed fs_watch->addParam("LastUpdateTime"); @@ -160,8 +160,8 @@ void SoftwarePanel::updateLabels() { fs_watch->addParam("UpdateAvailable"); if (!isVisible()) { - // FrogPilot variables - frogpilot_scene.downloading_update = false; + // StarPilot variables + starpilot_scene.downloading_update = false; return; } @@ -176,8 +176,8 @@ void SoftwarePanel::updateLabels() { downloadBtn->setEnabled(false); downloadBtn->setValue(updater_state); - // FrogPilot variables - frogpilot_scene.downloading_update = true; + // StarPilot variables + starpilot_scene.downloading_update = true; } else { if (failed) { downloadBtn->setText(tr("CHECK")); @@ -196,8 +196,8 @@ void SoftwarePanel::updateLabels() { } downloadBtn->setEnabled(true); - // FrogPilot variables - frogpilot_scene.downloading_update = false; + // StarPilot variables + starpilot_scene.downloading_update = false; } targetBranchBtn->setValue(QString::fromStdString(params.get("UpdaterTargetBranch"))); diff --git a/selfdrive/ui/qt/onroad/alerts.cc b/selfdrive/ui/qt/onroad/alerts.cc index 4886ee80..2db57494 100644 --- a/selfdrive/ui/qt/onroad/alerts.cc +++ b/selfdrive/ui/qt/onroad/alerts.cc @@ -5,10 +5,10 @@ #include "selfdrive/ui/qt/util.h" -void OnroadAlerts::updateState(const UIState &s, const FrogPilotUIState &fs) { +void OnroadAlerts::updateState(const UIState &s, const StarPilotUIState &fs) { Alert a = getAlert(*(s.sm), *(fs.sm), s.scene.started_frame); if (!alert.equal(a)) { - if (alert.status == cereal::SelfdriveState::AlertStatus::NORMAL && frogpilot_toggles.value("hide_alerts").toBool()) { + if (alert.status == cereal::SelfdriveState::AlertStatus::NORMAL && starpilot_toggles.value("hide_alerts").toBool()) { clear(); } else { alert = a; @@ -16,15 +16,15 @@ void OnroadAlerts::updateState(const UIState &s, const FrogPilotUIState &fs) { } } - // FrogPilot variables - sidebarsOpen = fs.frogpilot_scene.sidebars_open; + // StarPilot variables + sidebarsOpen = fs.starpilot_scene.sidebars_open; } void OnroadAlerts::clear() { alert = {}; update(); - // FrogPilot variables + // StarPilot variables alertHeight = 0; } @@ -32,21 +32,21 @@ OnroadAlerts::Alert OnroadAlerts::getAlert(const SubMaster &sm, const SubMaster const cereal::SelfdriveState::Reader &ss = sm["selfdriveState"].getSelfdriveState(); const uint64_t selfdrive_frame = sm.rcv_frame("selfdriveState"); - // FrogPilot variables - const cereal::FrogPilotSelfdriveState::Reader &fpss = fpsm["frogpilotSelfdriveState"].getFrogpilotSelfdriveState(); + // StarPilot variables + const cereal::StarPilotSelfdriveState::Reader &fpss = fpsm["starpilotSelfdriveState"].getStarpilotSelfdriveState(); Alert a = {}; static QString crash_log_path = "/data/error_logs/error.txt"; if (QFile::exists(crash_log_path)) { - if (frogpilot_toggles.value("random_events").toBool()) { + if (starpilot_toggles.value("random_events").toBool()) { a = {tr("openpilot crashed 💩"), - tr("Please post the \"Error Log\" in the FrogPilot Discord!"), + tr("Please post the \"Error Log\" in the StarPilot Discord!"), "openpilotCrashedRandomEvent", cereal::SelfdriveState::AlertSize::MID, cereal::SelfdriveState::AlertStatus::CRITICAL}; } else { a = {tr("openpilot crashed"), - tr("Please post the \"Error Log\" in the FrogPilot Discord!"), + tr("Please post the \"Error Log\" in the StarPilot Discord!"), "openpilotCrashed", cereal::SelfdriveState::AlertSize::MID, cereal::SelfdriveState::AlertStatus::CRITICAL}; @@ -56,14 +56,14 @@ OnroadAlerts::Alert OnroadAlerts::getAlert(const SubMaster &sm, const SubMaster a = {ss.getAlertText1().cStr(), ss.getAlertText2().cStr(), ss.getAlertType().cStr(), ss.getAlertSize(), ss.getAlertStatus()}; - // FrogPilot variables + // StarPilot variables if (a.size == cereal::SelfdriveState::AlertSize::NONE) { a = {fpss.getAlertText1().cStr(), fpss.getAlertText2().cStr(), fpss.getAlertType().cStr(), static_cast(fpss.getAlertSize()), static_cast(fpss.getAlertStatus())}; } } - if (!sm.updated("selfdriveState") && (sm.frame - started_frame) > 5 * UI_FREQ && !frogpilot_toggles.value("force_onroad").toBool()) { + if (!sm.updated("selfdriveState") && (sm.frame - started_frame) > 5 * UI_FREQ && !starpilot_toggles.value("force_onroad").toBool()) { const int SELFDRIVE_STATE_TIMEOUT = 5; const int ss_missing = (nanos_since_boot() - sm.rcv_time("selfdriveState")) / 1e9; @@ -91,7 +91,7 @@ OnroadAlerts::Alert OnroadAlerts::getAlert(const SubMaster &sm, const SubMaster void OnroadAlerts::paintEvent(QPaintEvent *event) { if (alert.size == cereal::SelfdriveState::AlertSize::NONE) { - // FrogPilot variables + // StarPilot variables alertHeight = 0; return; } @@ -100,7 +100,7 @@ void OnroadAlerts::paintEvent(QPaintEvent *event) { {cereal::SelfdriveState::AlertSize::MID, 420}, {cereal::SelfdriveState::AlertSize::FULL, height()}, }; - // FrogPilot variables + // StarPilot variables alertHeight = alert_heights[alert.size]; int h = alertHeight; @@ -110,7 +110,7 @@ void OnroadAlerts::paintEvent(QPaintEvent *event) { margin = 0; radius = 0; } - // FrogPilot variables + // StarPilot variables alertHeight -= margin; QRect r = QRect(0 + margin, height() - h + margin, width() - margin*2, h - margin*2); @@ -119,7 +119,7 @@ void OnroadAlerts::paintEvent(QPaintEvent *event) { // draw background + gradient p.setPen(Qt::NoPen); p.setCompositionMode(QPainter::CompositionMode_SourceOver); - p.setBrush(QBrush(frogpilot_alert_colors[static_cast(alert.status)])); + p.setBrush(QBrush(starpilot_alert_colors[static_cast(alert.status)])); p.drawRoundedRect(r, radius, radius); QLinearGradient g(0, r.y(), 0, r.bottom()); diff --git a/selfdrive/ui/qt/onroad/alerts.h b/selfdrive/ui/qt/onroad/alerts.h index d65aaf80..a83e1503 100644 --- a/selfdrive/ui/qt/onroad/alerts.h +++ b/selfdrive/ui/qt/onroad/alerts.h @@ -9,13 +9,13 @@ class OnroadAlerts : public QWidget { public: OnroadAlerts(QWidget *parent = 0) : QWidget(parent) {} - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); void clear(); - // FrogPilot variables + // StarPilot variables int alertHeight; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; protected: struct Alert { @@ -42,13 +42,13 @@ protected: QColor bg; Alert alert = {}; - // FrogPilot variables + // StarPilot variables bool sidebarsOpen; - const QMap frogpilot_alert_colors = { - {cereal::FrogPilotSelfdriveState::AlertStatus::NORMAL, QColor(0x15, 0x15, 0x15, 0xf1)}, - {cereal::FrogPilotSelfdriveState::AlertStatus::USER_PROMPT, QColor(0xDA, 0x6F, 0x25, 0xf1)}, - {cereal::FrogPilotSelfdriveState::AlertStatus::CRITICAL, QColor(0xC9, 0x22, 0x31, 0xf1)}, - {cereal::FrogPilotSelfdriveState::AlertStatus::FROGPILOT, QColor(0x17, 0x86, 0x44, 0xf1)}, + const QMap starpilot_alert_colors = { + {cereal::StarPilotSelfdriveState::AlertStatus::NORMAL, QColor(0x15, 0x15, 0x15, 0xf1)}, + {cereal::StarPilotSelfdriveState::AlertStatus::USER_PROMPT, QColor(0xDA, 0x6F, 0x25, 0xf1)}, + {cereal::StarPilotSelfdriveState::AlertStatus::CRITICAL, QColor(0xC9, 0x22, 0x31, 0xf1)}, + {cereal::StarPilotSelfdriveState::AlertStatus::STARPILOT, QColor(0x17, 0x86, 0x44, 0xf1)}, }; }; diff --git a/selfdrive/ui/qt/onroad/annotated_camera.cc b/selfdrive/ui/qt/onroad/annotated_camera.cc index ab5a1fc8..1ff00fdc 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.cc +++ b/selfdrive/ui/qt/onroad/annotated_camera.cc @@ -20,7 +20,7 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget *par experimental_btn = new ExperimentalButton(this); main_layout->addWidget(experimental_btn, 0, Qt::AlignTop | Qt::AlignRight); - // FrogPilot variables + // StarPilot variables personality_btn = new DrivingPersonalityButton(this); personality_btn->setVisible(false); @@ -28,29 +28,29 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget *par screen_recorder->setVisible(false); } -void AnnotatedCameraWidget::updateState(const UIState &s, const FrogPilotUIState &fs) { +void AnnotatedCameraWidget::updateState(const UIState &s, const StarPilotUIState &fs) { // update engageability/experimental mode button experimental_btn->updateState(s, fs); dmon.updateState(s); - // FrogPilot variables + // StarPilot variables const SubMaster &sm = *(s.sm); const cereal::CarState::Reader &carState = sm["carState"].getCarState(); - frogpilot_nvg->experimentalButtonPosition = QPoint(experimental_btn->x(), experimental_btn->y()); + starpilot_nvg->experimentalButtonPosition = QPoint(experimental_btn->x(), experimental_btn->y()); - bool onroad_distance_btn_enabled = frogpilot_nvg->dmIconPosition != QPoint(0, 0) && !frogpilot_nvg->hideBottomIcons && frogpilot_toggles.value("onroad_distance_button").toBool(); + bool onroad_distance_btn_enabled = starpilot_nvg->dmIconPosition != QPoint(0, 0) && !starpilot_nvg->hideBottomIcons && starpilot_toggles.value("onroad_distance_button").toBool(); personality_btn->setVisible(onroad_distance_btn_enabled); if (onroad_distance_btn_enabled) { - personality_btn->move(frogpilot_nvg->rightHandDM ? width() - UI_BORDER_SIZE - personality_btn->width() - (UI_BORDER_SIZE / 2) : UI_BORDER_SIZE, frogpilot_nvg->dmIconPosition.y() - personality_btn->height() / 2); + personality_btn->move(starpilot_nvg->rightHandDM ? width() - UI_BORDER_SIZE - personality_btn->width() - (UI_BORDER_SIZE / 2) : UI_BORDER_SIZE, starpilot_nvg->dmIconPosition.y() - personality_btn->height() / 2); personality_btn->updateState(s, fs); } dmon.onroad_distance_btn_enabled = onroad_distance_btn_enabled; screen_recorder->move(experimental_btn->x() - UI_BORDER_SIZE - btn_size, experimental_btn->y()); - screen_recorder->setVisible(frogpilot_nvg->standstillDuration == 0 && !(frogpilot_nvg->signalStyle == "static" && carState.getRightBlinker()) && frogpilot_toggles.value("screen_recorder").toBool()); + screen_recorder->setVisible(starpilot_nvg->standstillDuration == 0 && !(starpilot_nvg->signalStyle == "static" && carState.getRightBlinker()) && starpilot_toggles.value("screen_recorder").toBool()); } void AnnotatedCameraWidget::initializeGL() { @@ -149,10 +149,10 @@ void AnnotatedCameraWidget::paintEvent(QPaintEvent *event) { } else if (v_ego > 15) { wide_cam_requested = false; } - wide_cam_requested = wide_cam_requested && sm["selfdriveState"].getSelfdriveState().getExperimentalMode() && frogpilot_toggles.value("camera_view").toInt() == 0; + wide_cam_requested = wide_cam_requested && sm["selfdriveState"].getSelfdriveState().getExperimentalMode() && starpilot_toggles.value("camera_view").toInt() == 0; } - CameraWidget::setStreamType(frogpilot_toggles.value("camera_view").toInt() == 1 ? VISION_STREAM_DRIVER : - frogpilot_toggles.value("camera_view").toInt() == 3 || wide_cam_requested ? VISION_STREAM_WIDE_ROAD : + CameraWidget::setStreamType(starpilot_toggles.value("camera_view").toInt() == 1 ? VISION_STREAM_DRIVER : + starpilot_toggles.value("camera_view").toInt() == 3 || wide_cam_requested ? VISION_STREAM_WIDE_ROAD : VISION_STREAM_ROAD); CameraWidget::setFrameId(sm["modelV2"].getModelV2().getFrameId()); @@ -164,26 +164,26 @@ void AnnotatedCameraWidget::paintEvent(QPaintEvent *event) { painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::NoPen); - // FrogPilot variables - dmon.frogpilot_nvg = frogpilot_nvg; - hud.frogpilot_nvg = frogpilot_nvg; - model.frogpilot_nvg = frogpilot_nvg; + // StarPilot variables + dmon.starpilot_nvg = starpilot_nvg; + hud.starpilot_nvg = starpilot_nvg; + model.starpilot_nvg = starpilot_nvg; - experimental_btn->frogpilot_scene = frogpilot_scene; - model.frogpilot_scene = frogpilot_scene; + experimental_btn->starpilot_scene = starpilot_scene; + model.starpilot_scene = starpilot_scene; - dmon.frogpilot_toggles = frogpilot_toggles; - experimental_btn->frogpilot_toggles = frogpilot_toggles; - hud.frogpilot_toggles = frogpilot_toggles; - model.frogpilot_toggles = frogpilot_toggles; + dmon.starpilot_toggles = starpilot_toggles; + experimental_btn->starpilot_toggles = starpilot_toggles; + hud.starpilot_toggles = starpilot_toggles; + model.starpilot_toggles = starpilot_toggles; model.draw(painter, rect()); dmon.draw(painter, rect()); hud.updateState(*s); hud.draw(painter, rect()); - // FrogPilot variables - frogpilot_nvg->paintFrogPilotWidgets(painter, *s); + // StarPilot variables + starpilot_nvg->paintStarPilotWidgets(painter, *s); double cur_draw_t = millis_since_boot(); double dt = cur_draw_t - prev_draw_t; diff --git a/selfdrive/ui/qt/onroad/annotated_camera.h b/selfdrive/ui/qt/onroad/annotated_camera.h index 03e38c78..9dc49e65 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.h +++ b/selfdrive/ui/qt/onroad/annotated_camera.h @@ -8,24 +8,24 @@ #include "selfdrive/ui/qt/onroad/model.h" #include "selfdrive/ui/qt/widgets/cameraview.h" -#include "frogpilot/ui/qt/onroad/frogpilot_buttons.h" -#include "frogpilot/ui/screenrecorder/screenrecorder.h" +#include "starpilot/ui/qt/onroad/starpilot_buttons.h" +#include "starpilot/ui/screenrecorder/screenrecorder.h" class AnnotatedCameraWidget : public CameraWidget { Q_OBJECT public: explicit AnnotatedCameraWidget(VisionStreamType type, QWidget* parent = 0); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); - // FrogPilot variables + // StarPilot variables double fps; - FrogPilotAnnotatedCameraWidget *frogpilot_nvg; + StarPilotAnnotatedCameraWidget *starpilot_nvg; - FrogPilotUIScene frogpilot_scene; + StarPilotUIScene starpilot_scene; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; private: QVBoxLayout *main_layout; @@ -38,7 +38,7 @@ private: int skip_frame_count = 0; bool wide_cam_requested = false; - // FrogPilot variables + // StarPilot variables void paintEvent(QPaintEvent *event) override; DrivingPersonalityButton *personality_btn; diff --git a/selfdrive/ui/qt/onroad/buttons.cc b/selfdrive/ui/qt/onroad/buttons.cc index 5bcf52f0..2e0cf248 100644 --- a/selfdrive/ui/qt/onroad/buttons.cc +++ b/selfdrive/ui/qt/onroad/buttons.cc @@ -27,17 +27,17 @@ ExperimentalButton::ExperimentalButton(QWidget *parent) : experimental_mode(fals experimental_img = loadPixmap("../assets/icons/experimental.svg", {img_size, img_size}); QObject::connect(this, &QPushButton::clicked, this, &ExperimentalButton::changeMode); - // FrogPilot variables - QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &ExperimentalButton::updateTheme); + // StarPilot variables + QObject::connect(starpilotUIState(), &StarPilotUIState::themeUpdated, this, &ExperimentalButton::updateTheme); } void ExperimentalButton::changeMode() { const auto cp = (*uiState()->sm)["carParams"].getCarParams(); bool can_change = hasLongitudinalControl(cp) && params.getBool("ExperimentalModeConfirmed"); if (can_change) { - // FrogPilot variables - if (frogpilot_toggles.value("conditional_experimental_mode").toBool()) { - int override_value = (frogpilot_scene.conditional_status == 1 || frogpilot_scene.conditional_status == 2) ? 0 : experimental_mode ? 1 : 2; + // StarPilot variables + if (starpilot_toggles.value("conditional_experimental_mode").toBool()) { + int override_value = (starpilot_scene.conditional_status == 1 || starpilot_scene.conditional_status == 2) ? 0 : experimental_mode ? 1 : 2; params_memory.putInt("CEStatus", override_value); } else { params.putBool("ExperimentalMode", !experimental_mode); @@ -45,25 +45,25 @@ void ExperimentalButton::changeMode() { } } -void ExperimentalButton::updateState(const UIState &s, const FrogPilotUIState &fs) { +void ExperimentalButton::updateState(const UIState &s, const StarPilotUIState &fs) { const auto cs = (*s.sm)["selfdriveState"].getSelfdriveState(); - bool eng = cs.getEngageable() || cs.getEnabled() || fs.frogpilot_scene.always_on_lateral_active; + bool eng = cs.getEngageable() || cs.getEnabled() || fs.starpilot_scene.always_on_lateral_active; if ((cs.getExperimentalMode() != experimental_mode) || (eng != engageable)) { engageable = eng; experimental_mode = cs.getExperimentalMode(); update(); } - // FrogPilot variables + // StarPilot variables const cereal::CarState::Reader &carState = (*s.sm)["carState"].getCarState(); updateBackgroundColor(); int current_steering_angle_deg = -carState.getSteeringAngleDeg(); - if (current_steering_angle_deg != steering_angle_deg && frogpilot_toggles.value("rotating_wheel").toBool()) { + if (current_steering_angle_deg != steering_angle_deg && starpilot_toggles.value("rotating_wheel").toBool()) { steering_angle_deg = current_steering_angle_deg; update(); - } else if (!frogpilot_toggles.value("rotating_wheel").toBool()) { + } else if (!starpilot_toggles.value("rotating_wheel").toBool()) { steering_angle_deg = 0; } @@ -78,7 +78,7 @@ void ExperimentalButton::paintEvent(QPaintEvent *event) { p.setClipRegion(QRegion(QRect(0, 0, btn_size, btn_size), QRegion::Ellipse)); p.setRenderHint(QPainter::Antialiasing); - if (frogpilot_toggles.value("wheel_image").toString() == "stock") { + if (starpilot_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, steering_angle_deg); } else if (wheel_gif) { @@ -88,7 +88,7 @@ void ExperimentalButton::paintEvent(QPaintEvent *event) { } } -// FrogPilot variables +// StarPilot variables void ExperimentalButton::showEvent(QShowEvent *event) { updateTheme(); } @@ -96,13 +96,13 @@ void ExperimentalButton::showEvent(QShowEvent *event) { void ExperimentalButton::updateBackgroundColor() { if (isDown() || !engageable) { background_color = QColor(0, 0, 0, 166); - } else if (frogpilot_scene.always_on_lateral_active) { + } else if (starpilot_scene.always_on_lateral_active) { background_color = bg_colors[STATUS_ALWAYS_ON_LATERAL_ACTIVE]; - } else if (frogpilot_scene.conditional_status == 1) { + } else if (starpilot_scene.conditional_status == 1) { background_color = bg_colors[STATUS_CEM_DISABLED]; } else if (experimental_mode) { background_color = bg_colors[STATUS_EXPERIMENTAL_MODE_ENABLED]; - } else if (frogpilot_scene.traffic_mode_enabled) { + } else if (starpilot_scene.traffic_mode_enabled) { background_color = bg_colors[STATUS_TRAFFIC_MODE_ENABLED]; } else { background_color = QColor(0, 0, 0, 166); @@ -110,5 +110,5 @@ void ExperimentalButton::updateBackgroundColor() { } void ExperimentalButton::updateTheme() { - loadImage("../../frogpilot/assets/active_theme/steering_wheel/wheel", wheel_img, wheel_gif, QSize(img_size, img_size), this); + loadImage("../../starpilot/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 abb4de1a..53d52fe8 100644 --- a/selfdrive/ui/qt/onroad/buttons.h +++ b/selfdrive/ui/qt/onroad/buttons.h @@ -12,12 +12,12 @@ class ExperimentalButton : public QPushButton { public: explicit ExperimentalButton(QWidget *parent = 0); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); - // FrogPilot variables - FrogPilotUIScene frogpilot_scene; + // StarPilot variables + StarPilotUIScene starpilot_scene; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; private: void paintEvent(QPaintEvent *event) override; @@ -29,7 +29,7 @@ private: bool experimental_mode; bool engageable; - // FrogPilot variables + // StarPilot variables void showEvent(QShowEvent *event) override; void updateBackgroundColor(); void updateTheme(); diff --git a/selfdrive/ui/qt/onroad/driver_monitoring.cc b/selfdrive/ui/qt/onroad/driver_monitoring.cc index 1f36c100..2110aae9 100644 --- a/selfdrive/ui/qt/onroad/driver_monitoring.cc +++ b/selfdrive/ui/qt/onroad/driver_monitoring.cc @@ -73,7 +73,7 @@ void DriverMonitorRenderer::draw(QPainter &painter, const QRect &surface_rect) { float y = surface_rect.height() - offset; float opacity = is_active ? 0.65f : 0.2f; - // FrogPilot variables + // StarPilot variables if (onroad_distance_btn_enabled) { if (is_rhd) { x -= UI_BORDER_SIZE + (btn_size + UI_BORDER_SIZE) + UI_BORDER_SIZE; @@ -82,7 +82,7 @@ void DriverMonitorRenderer::draw(QPainter &painter, const QRect &surface_rect) { } } - if (frogpilot_toggles.value("road_name_ui").toBool()) { + if (starpilot_toggles.value("road_name_ui").toBool()) { y -= UI_BORDER_SIZE; } @@ -118,10 +118,10 @@ void DriverMonitorRenderer::draw(QPainter &painter, const QRect &surface_rect) { painter.restore(); - // FrogPilot variables - if (frogpilot_nvg) { - frogpilot_nvg->dmIconPosition.setX(x); - frogpilot_nvg->dmIconPosition.setY(y); - frogpilot_nvg->rightHandDM = is_rhd; + // StarPilot variables + if (starpilot_nvg) { + starpilot_nvg->dmIconPosition.setX(x); + starpilot_nvg->dmIconPosition.setY(y); + starpilot_nvg->rightHandDM = is_rhd; } } diff --git a/selfdrive/ui/qt/onroad/driver_monitoring.h b/selfdrive/ui/qt/onroad/driver_monitoring.h index 8ecdbdb5..ef9efef4 100644 --- a/selfdrive/ui/qt/onroad/driver_monitoring.h +++ b/selfdrive/ui/qt/onroad/driver_monitoring.h @@ -4,7 +4,7 @@ #include #include "selfdrive/ui/ui.h" -#include "frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h" +#include "starpilot/ui/qt/onroad/starpilot_annotated_camera.h" class DriverMonitorRenderer { public: @@ -12,12 +12,12 @@ public: void updateState(const UIState &s); void draw(QPainter &painter, const QRect &surface_rect); - // FrogPilot variables - FrogPilotAnnotatedCameraWidget *frogpilot_nvg; + // StarPilot variables + StarPilotAnnotatedCameraWidget *starpilot_nvg; bool onroad_distance_btn_enabled; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; private: float driver_pose_vals[3] = {}; diff --git a/selfdrive/ui/qt/onroad/hud.cc b/selfdrive/ui/qt/onroad/hud.cc index 1e376bc4..dd9f7cca 100644 --- a/selfdrive/ui/qt/onroad/hud.cc +++ b/selfdrive/ui/qt/onroad/hud.cc @@ -28,8 +28,8 @@ void HudRenderer::updateState(const UIState &s) { is_cruise_set = set_speed > 0 && set_speed != SET_SPEED_NA; is_cruise_available = set_speed != -1; - if (is_cruise_set && frogpilot_toggles.value("set_speed_offset").toDouble() > 0) { - set_speed += frogpilot_toggles.value("set_speed_offset").toDouble(); + if (is_cruise_set && starpilot_toggles.value("set_speed_offset").toDouble() > 0) { + set_speed += starpilot_toggles.value("set_speed_offset").toDouble(); } if (is_cruise_set && !is_metric) { @@ -38,7 +38,7 @@ void HudRenderer::updateState(const UIState &s) { // Handle older routes where vEgoCluster is not set v_ego_cluster_seen = v_ego_cluster_seen || car_state.getVEgoCluster() != 0.0; - float v_ego = v_ego_cluster_seen && !frogpilot_toggles.value("use_wheel_speed").toBool() ? car_state.getVEgoCluster() : car_state.getVEgo(); + float v_ego = v_ego_cluster_seen && !starpilot_toggles.value("use_wheel_speed").toBool() ? car_state.getVEgoCluster() : car_state.getVEgo(); speed = std::max(0.0f, v_ego * (is_metric ? MS_TO_KPH : MS_TO_MPH)); } @@ -55,7 +55,7 @@ void HudRenderer::draw(QPainter &p, const QRect &surface_rect) { if (is_cruise_available) { drawSetSpeed(p, surface_rect); } - if (frogpilot_nvg->standstillDuration == 0 && !frogpilot_toggles.value("hide_speed").toBool()) { + if (starpilot_nvg->standstillDuration == 0 && !starpilot_toggles.value("hide_speed").toBool()) { drawCurrentSpeed(p, surface_rect); } @@ -67,17 +67,17 @@ void HudRenderer::drawSetSpeed(QPainter &p, const QRect &surface_rect) { const QSize default_size = {172, 204}; QSize set_speed_size = is_metric ? QSize(200, 204) : default_size; - // FrogPilot variables - if (frogpilot_nvg->speedLimitHeight != 0) { - set_speed_size.rheight() += frogpilot_nvg->speedLimitHeight; - if (frogpilot_toggles.value("speed_limit_vienna").toBool()) { + // StarPilot variables + if (starpilot_nvg->speedLimitHeight != 0) { + set_speed_size.rheight() += starpilot_nvg->speedLimitHeight; + if (starpilot_toggles.value("speed_limit_vienna").toBool()) { set_speed_size.rwidth() = 200; } } QRect set_speed_rect(QPoint(60 + (default_size.width() - set_speed_size.width()) / 2, 45), set_speed_size); - if (!frogpilot_toggles.value("hide_max_speed").toBool()) { + if (!starpilot_toggles.value("hide_max_speed").toBool()) { // Draw set speed box p.setPen(QPen(QColor(255, 255, 255, 75), 6)); p.setBrush(QColor(0, 0, 0, 166)); @@ -109,11 +109,11 @@ void HudRenderer::drawSetSpeed(QPainter &p, const QRect &surface_rect) { p.drawText(set_speed_rect.adjusted(0, 77, 0, 0), Qt::AlignTop | Qt::AlignHCenter, setSpeedStr); } - // FrogPilot variables - frogpilot_nvg->defaultSize = default_size; - frogpilot_nvg->isCruiseSet = is_cruise_set; - frogpilot_nvg->setSpeedRect = set_speed_rect; - frogpilot_nvg->speed = speed; + // StarPilot variables + starpilot_nvg->defaultSize = default_size; + starpilot_nvg->isCruiseSet = is_cruise_set; + starpilot_nvg->setSpeedRect = set_speed_rect; + starpilot_nvg->speed = speed; } void HudRenderer::drawCurrentSpeed(QPainter &p, const QRect &surface_rect) { diff --git a/selfdrive/ui/qt/onroad/hud.h b/selfdrive/ui/qt/onroad/hud.h index b443425b..2086cab9 100644 --- a/selfdrive/ui/qt/onroad/hud.h +++ b/selfdrive/ui/qt/onroad/hud.h @@ -3,7 +3,7 @@ #include #include "selfdrive/ui/ui.h" -#include "frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h" +#include "starpilot/ui/qt/onroad/starpilot_annotated_camera.h" class HudRenderer : public QObject { Q_OBJECT @@ -13,10 +13,10 @@ public: void updateState(const UIState &s); void draw(QPainter &p, const QRect &surface_rect); - // FrogPilot variables - FrogPilotAnnotatedCameraWidget *frogpilot_nvg; + // StarPilot variables + StarPilotAnnotatedCameraWidget *starpilot_nvg; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; private: void drawSetSpeed(QPainter &p, const QRect &surface_rect); diff --git a/selfdrive/ui/qt/onroad/moc_onroad_home.cc b/selfdrive/ui/qt/onroad/moc_onroad_home.cc index 2f239091..5fb75f45 100644 --- a/selfdrive/ui/qt/onroad/moc_onroad_home.cc +++ b/selfdrive/ui/qt/onroad/moc_onroad_home.cc @@ -38,12 +38,12 @@ QT_MOC_LITERAL(3, 32, 7), // "offroad" QT_MOC_LITERAL(4, 40, 11), // "updateState" QT_MOC_LITERAL(5, 52, 7), // "UIState" QT_MOC_LITERAL(6, 60, 1), // "s" -QT_MOC_LITERAL(7, 62, 16), // "FrogPilotUIState" +QT_MOC_LITERAL(7, 62, 16), // "StarPilotUIState" QT_MOC_LITERAL(8, 79, 2) // "fs" }, "OnroadWindow\0offroadTransition\0\0offroad\0" - "updateState\0UIState\0s\0FrogPilotUIState\0" + "updateState\0UIState\0s\0StarPilotUIState\0" "fs" }; #undef QT_MOC_LITERAL @@ -79,7 +79,7 @@ void OnroadWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id Q_UNUSED(_t) switch (_id) { case 0: _t->offroadTransition((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 1: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const FrogPilotUIState(*)>(_a[2]))); break; + case 1: _t->updateState((*reinterpret_cast< const UIState(*)>(_a[1])),(*reinterpret_cast< const StarPilotUIState(*)>(_a[2]))); break; default: ; } } diff --git a/selfdrive/ui/qt/onroad/model.cc b/selfdrive/ui/qt/onroad/model.cc index 54df1438..4c35ce63 100644 --- a/selfdrive/ui/qt/onroad/model.cc +++ b/selfdrive/ui/qt/onroad/model.cc @@ -35,49 +35,49 @@ void ModelRenderer::draw(QPainter &painter, const QRect &surface_rect) { drawLaneLines(painter); drawPath(painter, model, surface_rect.height()); - if ((longitudinal_control || frogpilot_toggles.value("lead_info").toBool()) && sm.alive("radarState") && !frogpilot_toggles.value("hide_lead_marker").toBool()) { + if ((longitudinal_control || starpilot_toggles.value("lead_info").toBool()) && sm.alive("radarState") && !starpilot_toggles.value("hide_lead_marker").toBool()) { update_leads(radar_state, model.getPosition()); const auto &lead_two = radar_state.getLeadTwo(); if (lead_one.getStatus()) { - if (lead_one.getModelProb() >= frogpilot_toggles.value("lead_detection_probability").toDouble()) { - drawLead(painter, lead_one, lead_vertices[0], surface_rect, QColor(frogpilot_toggles.value("lead_marker_color").toString())); + if (lead_one.getModelProb() >= starpilot_toggles.value("lead_detection_probability").toDouble()) { + drawLead(painter, lead_one, lead_vertices[0], surface_rect, QColor(starpilot_toggles.value("lead_marker_color").toString())); } else { - drawLead(painter, lead_one, lead_vertices[0], surface_rect, frogpilot_nvg->whiteColor()); + drawLead(painter, lead_one, lead_vertices[0], surface_rect, starpilot_nvg->whiteColor()); } } else { - // FrogPilot variables - frogpilot_nvg->leadTextRect = QRect(); + // StarPilot variables + starpilot_nvg->leadTextRect = QRect(); } if (lead_two.getStatus() && (std::abs(lead_one.getDRel() - lead_two.getDRel()) > 3.0)) { - drawLead(painter, lead_two, lead_vertices[1], surface_rect, QColor(frogpilot_toggles.value("lead_marker_color").toString())); + drawLead(painter, lead_two, lead_vertices[1], surface_rect, QColor(starpilot_toggles.value("lead_marker_color").toString())); } - // FrogPilot variables - SubMaster &fpsm = *(frogpilotUIState()->sm); - const cereal::FrogPilotRadarState::Reader &frogpilot_radar_state = fpsm["frogpilotRadarState"].getFrogpilotRadarState(); + // StarPilot variables + SubMaster &fpsm = *(starpilotUIState()->sm); + const cereal::StarPilotRadarState::Reader &starpilot_radar_state = fpsm["starpilotRadarState"].getStarpilotRadarState(); - const cereal::FrogPilotRadarState::LeadData::Reader &lead_left = frogpilot_radar_state.getLeadLeft(); - const cereal::FrogPilotRadarState::LeadData::Reader &lead_right = frogpilot_radar_state.getLeadRight(); + const cereal::StarPilotRadarState::LeadData::Reader &lead_left = starpilot_radar_state.getLeadLeft(); + const cereal::StarPilotRadarState::LeadData::Reader &lead_right = starpilot_radar_state.getLeadRight(); - updateAdjacentLeads(frogpilot_radar_state, model.getPosition()); + updateAdjacentLeads(starpilot_radar_state, model.getPosition()); - frogpilot_nvg->adjacentLeadTextRect = QRect(); + starpilot_nvg->adjacentLeadTextRect = QRect(); if (lead_left.getStatus() && lead_right.getStatus() && (lead_left.getDRel() < lead_right.getDRel())) { - drawLead(painter, reinterpret_cast(lead_left), adjacent_lead_vertices[0], surface_rect, frogpilot_nvg->blueColor(), true); - drawLead(painter, reinterpret_cast(lead_right), adjacent_lead_vertices[1], surface_rect, frogpilot_nvg->purpleColor(), true); + drawLead(painter, reinterpret_cast(lead_left), adjacent_lead_vertices[0], surface_rect, starpilot_nvg->blueColor(), true); + drawLead(painter, reinterpret_cast(lead_right), adjacent_lead_vertices[1], surface_rect, starpilot_nvg->purpleColor(), true); } else { if (lead_left.getStatus()) { - drawLead(painter, reinterpret_cast(lead_left), adjacent_lead_vertices[0], surface_rect, frogpilot_nvg->blueColor(), true); + drawLead(painter, reinterpret_cast(lead_left), adjacent_lead_vertices[0], surface_rect, starpilot_nvg->blueColor(), true); } if (lead_right.getStatus()) { - drawLead(painter, reinterpret_cast(lead_right), adjacent_lead_vertices[1], surface_rect, frogpilot_nvg->purpleColor(), true); + drawLead(painter, reinterpret_cast(lead_right), adjacent_lead_vertices[1], surface_rect, starpilot_nvg->purpleColor(), true); } } } - // FrogPilot variables - if (frogpilot_toggles.value("radar_tracks").toBool()) { + // StarPilot variables + if (starpilot_toggles.value("radar_tracks").toBool()) { updateRadarTracks(model.getPosition()); } @@ -104,7 +104,7 @@ void ModelRenderer::update_model(const cereal::ModelDataV2::Reader &model, const int max_idx = get_path_length_idx(lane_lines[0], max_distance); for (int i = 0; i < std::size(lane_line_vertices); i++) { lane_line_probs[i] = line_probs[i]; - mapLineToPolygon(lane_lines[i], (frogpilot_toggles.value("model_ui").toBool() ? frogpilot_toggles.value("lane_line_width").toDouble() : 0.025) * lane_line_probs[i], 0, &lane_line_vertices[i], max_idx); + mapLineToPolygon(lane_lines[i], (starpilot_toggles.value("model_ui").toBool() ? starpilot_toggles.value("lane_line_width").toDouble() : 0.025) * lane_line_probs[i], 0, &lane_line_vertices[i], max_idx); } // update road edges @@ -112,7 +112,7 @@ void ModelRenderer::update_model(const cereal::ModelDataV2::Reader &model, const const auto &edge_stds = model.getRoadEdgeStds(); for (int i = 0; i < std::size(road_edge_vertices); i++) { road_edge_stds[i] = edge_stds[i]; - mapLineToPolygon(road_edges[i], frogpilot_toggles.value("model_ui").toBool() ? frogpilot_toggles.value("road_edge_width").toDouble() : 0.025, 0, &road_edge_vertices[i], max_idx); + mapLineToPolygon(road_edges[i], starpilot_toggles.value("model_ui").toBool() ? starpilot_toggles.value("road_edge_width").toDouble() : 0.025, 0, &road_edge_vertices[i], max_idx); } // update path @@ -121,35 +121,35 @@ void ModelRenderer::update_model(const cereal::ModelDataV2::Reader &model, const max_distance = std::clamp((float)(lead_d - fmin(lead_d * 0.35, 10.)), 0.0f, max_distance); } max_idx = get_path_length_idx(model_position, max_distance); - // FrogPilot variables - float path_width = frogpilot_toggles.value("path_width").toDouble(); - if (frogpilot_toggles.value("dynamic_path_width").toBool()) { + // StarPilot variables + float path_width = starpilot_toggles.value("path_width").toDouble(); + if (starpilot_toggles.value("dynamic_path_width").toBool()) { UIState *s = uiState(); path_width *= s->status == STATUS_ENGAGED ? 1.0f : s->status == STATUS_ALWAYS_ON_LATERAL_ACTIVE ? 0.75f : 0.50f; } - mapLineToPolygon(model_position, frogpilot_toggles.value("model_ui").toBool() ? path_width * (1 - (frogpilot_toggles.value("path_edge_width").toDouble() / 100.0f)) : 0.9, path_offset_z, &track_vertices, max_idx, false); + mapLineToPolygon(model_position, starpilot_toggles.value("model_ui").toBool() ? path_width * (1 - (starpilot_toggles.value("path_edge_width").toDouble() / 100.0f)) : 0.9, path_offset_z, &track_vertices, max_idx, false); - // FrogPilot variables - FrogPilotUIState *fs = frogpilotUIState(); + // StarPilot variables + StarPilotUIState *fs = starpilotUIState(); SubMaster &fpsm = *(fs->sm); - const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan(); + const cereal::StarPilotPlan::Reader &starpilotPlan = fpsm["starpilotPlan"].getStarpilotPlan(); - frogpilot_nvg->track_vertices = track_vertices; + starpilot_nvg->track_vertices = track_vertices; - mapLineToPolygon(model_position, frogpilot_toggles.value("model_ui").toBool() ? path_width : 0, path_offset_z, &frogpilot_nvg->track_edge_vertices, max_idx, false); + mapLineToPolygon(model_position, starpilot_toggles.value("model_ui").toBool() ? path_width : 0, path_offset_z, &starpilot_nvg->track_edge_vertices, max_idx, false); - mapAveragedLineToPolygon(lane_lines[0], lane_lines[1], frogpilotPlan.getLaneWidthLeft() / 2.0f, 0, &frogpilot_nvg->track_adjacent_vertices[0], max_idx, height, false); - mapAveragedLineToPolygon(lane_lines[2], lane_lines[3], frogpilotPlan.getLaneWidthRight() / 2.0f, 0, &frogpilot_nvg->track_adjacent_vertices[1], max_idx, height, false); + mapAveragedLineToPolygon(lane_lines[0], lane_lines[1], starpilotPlan.getLaneWidthLeft() / 2.0f, 0, &starpilot_nvg->track_adjacent_vertices[0], max_idx, height, false); + mapAveragedLineToPolygon(lane_lines[2], lane_lines[3], starpilotPlan.getLaneWidthRight() / 2.0f, 0, &starpilot_nvg->track_adjacent_vertices[1], max_idx, height, false); } void ModelRenderer::drawLaneLines(QPainter &painter) { // lanelines for (int i = 0; i < std::size(lane_line_vertices); ++i) { - if (frogpilot_toggles.value("color_scheme").toString() != "stock") { + if (starpilot_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()); + QColor lane_color = QColor(starpilot_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); } @@ -165,7 +165,7 @@ void ModelRenderer::drawLaneLines(QPainter &painter) { void ModelRenderer::drawPath(QPainter &painter, const cereal::ModelDataV2::Reader &model, int height) { QLinearGradient bg(0, height, 0, 0); - if (experimental_mode || frogpilot_toggles.value("acceleration_path").toBool() || frogpilot_toggles.value("rainbow_path").toBool()) { + if (experimental_mode || starpilot_toggles.value("acceleration_path").toBool() || starpilot_toggles.value("rainbow_path").toBool()) { // The first half of track_vertices are the points for the right side of the path const auto &acceleration = model.getAcceleration().getX(); const int max_len = std::min(track_vertices.length() / 2, acceleration.size()); @@ -178,10 +178,10 @@ 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; - if ((fabs(acceleration[i]) < 0.25 || !frogpilot_toggles.value("acceleration_path").toBool()) && frogpilot_toggles.value("rainbow_path").toBool()) { - frogpilot_nvg->paintRainbowPath(painter, bg, lin_grad_point); - } else if (fabs(acceleration[i]) < 0.25 && frogpilot_toggles.value("color_scheme").toString() != "stock") { - QColor color = QColor(frogpilot_toggles.value("path_color").toString()); + if ((fabs(acceleration[i]) < 0.25 || !starpilot_toggles.value("acceleration_path").toBool()) && starpilot_toggles.value("rainbow_path").toBool()) { + starpilot_nvg->paintRainbowPath(painter, bg, lin_grad_point); + } else if (fabs(acceleration[i]) < 0.25 && starpilot_toggles.value("color_scheme").toString() != "stock") { + QColor color = QColor(starpilot_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 { @@ -207,14 +207,14 @@ void ModelRenderer::drawPath(QPainter &painter, const cereal::ModelDataV2::Reade painter.setBrush(bg); painter.drawPolygon(track_vertices); - // FrogPilot variables - if (frogpilot_toggles.value("adjacent_paths").toBool() || frogpilot_toggles.value("adjacent_path_metrics").toBool()) { - frogpilot_nvg->paintAdjacentPaths(painter); - } else if (frogpilot_toggles.value("blind_spot_path").toBool()) { - frogpilot_nvg->paintBlindSpotPath(painter); + // StarPilot variables + if (starpilot_toggles.value("adjacent_paths").toBool() || starpilot_toggles.value("adjacent_path_metrics").toBool()) { + starpilot_nvg->paintAdjacentPaths(painter); + } else if (starpilot_toggles.value("blind_spot_path").toBool()) { + starpilot_nvg->paintBlindSpotPath(painter); } - frogpilot_nvg->paintPathEdges(painter, height); + starpilot_nvg->paintPathEdges(painter, height); } void ModelRenderer::updatePathGradient(QLinearGradient &bg) { @@ -293,9 +293,9 @@ void ModelRenderer::drawLead(QPainter &painter, const cereal::RadarState::LeadDa painter.setBrush(QColor(marker_color.red(), marker_color.green(), marker_color.blue(), fillAlpha)); painter.drawPolygon(chevron, std::size(chevron)); - // FrogPilot variables - if (frogpilot_toggles.value("lead_info").toBool()) { - frogpilot_nvg->paintLeadMetrics(painter, adjacent, chevron, lead_data); + // StarPilot variables + if (starpilot_toggles.value("lead_info").toBool()) { + starpilot_nvg->paintLeadMetrics(painter, adjacent, chevron, lead_data); } } @@ -329,7 +329,7 @@ void ModelRenderer::mapLineToPolygon(const cereal::XYZTData::Reader &line, float } } -// FrogPilot variables +// StarPilot variables void ModelRenderer::mapAveragedLineToPolygon(const cereal::XYZTData::Reader &line1, const cereal::XYZTData::Reader &line2, float y_off, float z_off, QPolygonF *pvd, int max_idx, float height, bool allow_invert) { const auto line_x1 = line1.getX(), line_y1 = line1.getY(), line_z1 = line1.getZ(); @@ -373,7 +373,7 @@ void ModelRenderer::mapAveragedLineToPolygon(const cereal::XYZTData::Reader &lin } } -void ModelRenderer::updateAdjacentLeads(const cereal::FrogPilotRadarState::Reader &radar_state, const cereal::XYZTData::Reader &line) { +void ModelRenderer::updateAdjacentLeads(const cereal::StarPilotRadarState::Reader &radar_state, const cereal::XYZTData::Reader &line) { for (int i = 0; i < 2; ++i) { const auto &lead_data = (i == 0) ? radar_state.getLeadLeft() : radar_state.getLeadRight(); if (lead_data.getStatus()) { @@ -384,10 +384,10 @@ void ModelRenderer::updateAdjacentLeads(const cereal::FrogPilotRadarState::Reade } void ModelRenderer::updateRadarTracks(const cereal::XYZTData::Reader &line) { - std::vector &radar_tracks = frogpilot_nvg->radar_tracks; + std::vector &radar_tracks = starpilot_nvg->radar_tracks; radar_tracks.clear(); - SubMaster &fpsm = *(frogpilotUIState()->sm); + SubMaster &fpsm = *(starpilotUIState()->sm); capnp::List::Reader radar_points = fpsm["liveTracks"].getLiveTracks().getPoints(); radar_tracks.reserve(radar_points.size()); diff --git a/selfdrive/ui/qt/onroad/model.h b/selfdrive/ui/qt/onroad/model.h index 53afad22..4addb5c8 100644 --- a/selfdrive/ui/qt/onroad/model.h +++ b/selfdrive/ui/qt/onroad/model.h @@ -5,7 +5,7 @@ #include "selfdrive/ui/ui.h" -#include "frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h" +#include "starpilot/ui/qt/onroad/starpilot_annotated_camera.h" class ModelRenderer { public: @@ -13,12 +13,12 @@ public: void setTransform(const Eigen::Matrix3f &transform) { car_space_transform = transform; } void draw(QPainter &painter, const QRect &surface_rect); - // FrogPilot variables - FrogPilotAnnotatedCameraWidget *frogpilot_nvg; + // StarPilot variables + StarPilotAnnotatedCameraWidget *starpilot_nvg; - FrogPilotUIScene frogpilot_scene; + StarPilotUIScene starpilot_scene; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; private: bool mapToScreen(float in_x, float in_y, float in_z, QPointF *out); @@ -46,10 +46,10 @@ private: Eigen::Matrix3f car_space_transform = Eigen::Matrix3f::Zero(); QRectF clip_region; - // FrogPilot variables + // StarPilot variables void mapAveragedLineToPolygon(const cereal::XYZTData::Reader &line1, const cereal::XYZTData::Reader &line2, float y_off, float z_off, QPolygonF *pvd, int max_idx, float height, bool allow_invert = true); - void updateAdjacentLeads(const cereal::FrogPilotRadarState::Reader &radar_state, const cereal::XYZTData::Reader &line); + void updateAdjacentLeads(const cereal::StarPilotRadarState::Reader &radar_state, const cereal::XYZTData::Reader &line); void updateRadarTracks(const cereal::XYZTData::Reader &line); QPointF adjacent_lead_vertices[2] = {}; diff --git a/selfdrive/ui/qt/onroad/onroad_home.cc b/selfdrive/ui/qt/onroad/onroad_home.cc index 0c968616..63d3f548 100644 --- a/selfdrive/ui/qt/onroad/onroad_home.cc +++ b/selfdrive/ui/qt/onroad/onroad_home.cc @@ -38,20 +38,20 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { QObject::connect(uiState(), &UIState::uiUpdate, this, &OnroadWindow::updateState); QObject::connect(uiState(), &UIState::offroadTransition, this, &OnroadWindow::offroadTransition); - // FrogPilot variables - frogpilot_nvg = new FrogPilotAnnotatedCameraWidget(this); - frogpilot_onroad = new FrogPilotOnroadWindow(this); - frogpilot_onroad->setAttribute(Qt::WA_TransparentForMouseEvents, true); + // StarPilot variables + starpilot_nvg = new StarPilotAnnotatedCameraWidget(this); + starpilot_onroad = new StarPilotOnroadWindow(this); + starpilot_onroad->setAttribute(Qt::WA_TransparentForMouseEvents, true); - stacked_layout->addWidget(frogpilot_nvg); - stacked_layout->addWidget(frogpilot_onroad); + stacked_layout->addWidget(starpilot_nvg); + stacked_layout->addWidget(starpilot_onroad); - frogpilot_onroad->raise(); + starpilot_onroad->raise(); - nvg->frogpilot_nvg = frogpilot_nvg; + nvg->starpilot_nvg = starpilot_nvg; } -void OnroadWindow::updateState(const UIState &s, const FrogPilotUIState &fs) { +void OnroadWindow::updateState(const UIState &s, const StarPilotUIState &fs) { if (!s.scene.started) { return; } @@ -66,30 +66,30 @@ void OnroadWindow::updateState(const UIState &s, const FrogPilotUIState &fs) { update(); } - // FrogPilot variables - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - const QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + const QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; - frogpilot_nvg->alertHeight = alerts->alertHeight; + starpilot_nvg->alertHeight = alerts->alertHeight; - frogpilot_onroad->bg = bg; - frogpilot_onroad->fps = nvg->fps; + starpilot_onroad->bg = bg; + starpilot_onroad->fps = nvg->fps; - nvg->frogpilot_nvg = frogpilot_nvg; + nvg->starpilot_nvg = starpilot_nvg; - nvg->frogpilot_scene = frogpilot_scene; - frogpilot_nvg->frogpilot_scene = frogpilot_scene; - frogpilot_onroad->frogpilot_scene = frogpilot_scene; + nvg->starpilot_scene = starpilot_scene; + starpilot_nvg->starpilot_scene = starpilot_scene; + starpilot_onroad->starpilot_scene = starpilot_scene; - alerts->frogpilot_toggles = frogpilot_toggles; - frogpilot_nvg->frogpilot_toggles = frogpilot_toggles; - frogpilot_onroad->frogpilot_toggles = frogpilot_toggles; - nvg->frogpilot_toggles = frogpilot_toggles; + alerts->starpilot_toggles = starpilot_toggles; + starpilot_nvg->starpilot_toggles = starpilot_toggles; + starpilot_onroad->starpilot_toggles = starpilot_toggles; + nvg->starpilot_toggles = starpilot_toggles; - frogpilot_onroad->setGeometry(rect()); + starpilot_onroad->setGeometry(rect()); - frogpilot_nvg->updateState(s, fs); - frogpilot_onroad->updateState(s, fs); + starpilot_nvg->updateState(s, fs); + starpilot_onroad->updateState(s, fs); } void OnroadWindow::offroadTransition(bool offroad) { @@ -101,9 +101,9 @@ void OnroadWindow::paintEvent(QPaintEvent *event) { p.fillRect(rect(), QColor(bg.red(), bg.green(), bg.blue(), 255)); } -// FrogPilot variables +// StarPilot variables void OnroadWindow::mousePressEvent(QMouseEvent* mouseEvent) { - frogpilot_nvg->mousePressEvent(mouseEvent); + starpilot_nvg->mousePressEvent(mouseEvent); if (mouseEvent->isAccepted()) { return; diff --git a/selfdrive/ui/qt/onroad/onroad_home.h b/selfdrive/ui/qt/onroad/onroad_home.h index 484ceaad..94925bf6 100644 --- a/selfdrive/ui/qt/onroad/onroad_home.h +++ b/selfdrive/ui/qt/onroad/onroad_home.h @@ -3,7 +3,7 @@ #include "selfdrive/ui/qt/onroad/alerts.h" #include "selfdrive/ui/qt/onroad/annotated_camera.h" -#include "frogpilot/ui/qt/onroad/frogpilot_onroad.h" +#include "starpilot/ui/qt/onroad/starpilot_onroad.h" class OnroadWindow : public QWidget { Q_OBJECT @@ -18,13 +18,13 @@ private: QColor bg = bg_colors[STATUS_DISENGAGED]; QHBoxLayout* split; - // FrogPilot variables + // StarPilot variables void mousePressEvent(QMouseEvent* mouseEvent); - FrogPilotAnnotatedCameraWidget *frogpilot_nvg; - FrogPilotOnroadWindow *frogpilot_onroad; + StarPilotAnnotatedCameraWidget *starpilot_nvg; + StarPilotOnroadWindow *starpilot_onroad; private slots: void offroadTransition(bool offroad); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); }; diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index 85ac61bb..a8d9ce68 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -44,12 +44,12 @@ 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); + // StarPilot variables + QObject::connect(starpilotUIState(), &StarPilotUIState::themeUpdated, this, &Sidebar::updateTheme); } void Sidebar::mousePressEvent(QMouseEvent *event) { - // FrogPilot variables + // StarPilot variables QPoint pos = event->pos(); static constexpr QRect cpuRect = {30, 496, 240, 126}; @@ -60,22 +60,22 @@ void Sidebar::mousePressEvent(QMouseEvent *event) { static int showMemory = 0; static int showTemp = 0; - FrogPilotUIState *fs = frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + StarPilotUIState *fs = starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs->starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; - if (cpuRect.contains(pos) && frogpilot_toggles.value("developer_ui").toBool()) { + if (cpuRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { showChip = (showChip + 1) % 3; params.putBool("ShowCPU", showChip == 1); params.putBool("ShowGPU", showChip == 2); - } else if (memoryRect.contains(pos) && frogpilot_toggles.value("developer_ui").toBool()) { + } else if (memoryRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { showMemory = (showMemory + 1) % 4; params.putBool("ShowMemoryUsage", showMemory == 1); params.putBool("ShowStorageLeft", showMemory == 2); params.putBool("ShowStorageUsed", showMemory == 3); - } else if (tempRect.contains(pos) && frogpilot_toggles.value("developer_ui").toBool()) { + } else if (tempRect.contains(pos) && starpilot_toggles.value("developer_ui").toBool()) { showTemp = (showTemp + 1) % 3; params.putBool("Fahrenheit", showTemp == 2); @@ -90,7 +90,7 @@ void Sidebar::mousePressEvent(QMouseEvent *event) { if (!(flag_pressed || mic_indicator_pressed || settings_pressed)) { update(); - updateFrogPilotToggles(); + updateStarPilotToggles(); } } @@ -115,16 +115,16 @@ void Sidebar::offroadTransition(bool offroad) { update(); } -void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { +void Sidebar::updateState(const UIState &s, const StarPilotUIState &fs) { if (!isVisible()) return; - // FrogPilot variables - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - const QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + const QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; const SubMaster &fpsm = *(fs.sm); - const cereal::FrogPilotDeviceState::Reader &frogpilotDeviceState = fpsm["frogpilotDeviceState"].getFrogpilotDeviceState(); + const cereal::StarPilotDeviceState::Reader &starpilotDeviceState = fpsm["starpilotDeviceState"].getStarpilotDeviceState(); auto &sm = *(s.sm); @@ -143,28 +143,28 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { ItemStatus connectStatus; auto last_ping = deviceState.getLastAthenaPingTime(); if (desktop_force_online) { - connectStatus = ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(frogpilot_toggles.value("sidebar_color3").toString())}; + connectStatus = ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(starpilot_toggles.value("sidebar_color3").toString())}; } else if (last_ping == 0) { connectStatus = ItemStatus{{tr("CONNECT"), tr("OFFLINE")}, warning_color}; } else { connectStatus = nanos_since_boot() - last_ping < 80e9 - ? ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(frogpilot_toggles.value("sidebar_color3").toString())} + ? ItemStatus{{tr("CONNECT"), tr("ONLINE")}, QColor(starpilot_toggles.value("sidebar_color3").toString())} : ItemStatus{{tr("CONNECT"), tr("ERROR")}, danger_color}; } setProperty("connectStatus", QVariant::fromValue(connectStatus)); int maxTempC = deviceState.getMaxTempC(); - QString max_temp = frogpilot_toggles.value("fahrenheit").toBool() ? QString::number(maxTempC * 9 / 5 + 32) + "°F" : QString::number(maxTempC) + "°C"; - ItemStatus tempStatus = {{tr("TEMP"), frogpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("HIGH")}, danger_color}; + QString max_temp = starpilot_toggles.value("fahrenheit").toBool() ? QString::number(maxTempC * 9 / 5 + 32) + "°F" : QString::number(maxTempC) + "°C"; + ItemStatus tempStatus = {{tr("TEMP"), starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("HIGH")}, danger_color}; auto ts = deviceState.getThermalStatus(); if (ts == cereal::DeviceState::ThermalStatus::GREEN) { - tempStatus = {{tr("TEMP"), frogpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("GOOD")}, QColor(frogpilot_toggles.value("sidebar_color1").toString())}; + tempStatus = {{tr("TEMP"), starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("GOOD")}, QColor(starpilot_toggles.value("sidebar_color1").toString())}; } else if (ts == cereal::DeviceState::ThermalStatus::YELLOW) { - tempStatus = {{tr("TEMP"), frogpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("OK")}, warning_color}; + tempStatus = {{tr("TEMP"), starpilot_toggles.value("numerical_temp").toBool() ? max_temp : tr("OK")}, warning_color}; } setProperty("tempStatus", QVariant::fromValue(tempStatus)); - ItemStatus pandaStatus = {{tr("VEHICLE"), tr("ONLINE")}, QColor(frogpilot_toggles.value("sidebar_color2").toString())}; + ItemStatus pandaStatus = {{tr("VEHICLE"), tr("ONLINE")}, QColor(starpilot_toggles.value("sidebar_color2").toString())}; if (s.scene.pandaType == cereal::PandaState::PandaType::UNKNOWN) { pandaStatus = {{tr("NO"), tr("PANDA")}, danger_color}; } @@ -172,35 +172,35 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { setProperty("recordingAudio", s.scene.recording_audio); - // FrogPilot variables - if (frogpilot_toggles.value("cpu_metrics").toBool() || frogpilot_toggles.value("gpu_metrics").toBool()) { + // StarPilot variables + if (starpilot_toggles.value("cpu_metrics").toBool() || starpilot_toggles.value("gpu_metrics").toBool()) { capnp::List::Reader cpu_loads = deviceState.getCpuUsagePercent(); int cpu_usage = cpu_loads.size() != 0 ? std::accumulate(cpu_loads.begin(), cpu_loads.end(), 0) / cpu_loads.size() : 0; int gpu_usage = deviceState.getGpuUsagePercent(); - int usage = frogpilot_toggles.value("cpu_metrics").toBool() ? cpu_usage : gpu_usage; + int usage = starpilot_toggles.value("cpu_metrics").toBool() ? cpu_usage : gpu_usage; QString chip_usage = QString::number(usage) + "%"; - ItemStatus chipStatus = {{frogpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, QColor(frogpilot_toggles.value("sidebar_color2").toString())}; + ItemStatus chipStatus = {{starpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, QColor(starpilot_toggles.value("sidebar_color2").toString())}; if (usage >= 85) { - chipStatus = {{frogpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, danger_color}; + chipStatus = {{starpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, danger_color}; } else if (usage >= 70) { - chipStatus = {{frogpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, warning_color}; + chipStatus = {{starpilot_toggles.value("gpu_metrics").toBool() ? tr("GPU") : tr("CPU"), chip_usage}, warning_color}; } setProperty("chipStatus", QVariant::fromValue(chipStatus)); } - if (frogpilot_toggles.value("memory_metrics").toBool() || frogpilot_toggles.value("storage_left_metrics").toBool() || frogpilot_toggles.value("storage_used_metrics").toBool()) { + if (starpilot_toggles.value("memory_metrics").toBool() || starpilot_toggles.value("storage_left_metrics").toBool() || starpilot_toggles.value("storage_used_metrics").toBool()) { int free_space = deviceState.getFreeSpacePercent(); int memory_usage = deviceState.getMemoryUsagePercent(); - int storage_left = frogpilotDeviceState.getFreeSpace(); - int storage_used = frogpilotDeviceState.getUsedSpace(); + int storage_left = starpilotDeviceState.getFreeSpace(); + int storage_used = starpilotDeviceState.getUsedSpace(); QString memory = QString::number(memory_usage) + "%"; - QString storage = QString::number(frogpilot_toggles.value("storage_left_metrics").toBool() ? storage_left : storage_used) + tr(" GB"); + QString storage = QString::number(starpilot_toggles.value("storage_left_metrics").toBool() ? storage_left : storage_used) + tr(" GB"); - if (frogpilot_toggles.value("memory_metrics").toBool()) { - ItemStatus memoryStatus = {{tr("MEMORY"), memory}, QColor(frogpilot_toggles.value("sidebar_color3").toString())}; + if (starpilot_toggles.value("memory_metrics").toBool()) { + ItemStatus memoryStatus = {{tr("MEMORY"), memory}, QColor(starpilot_toggles.value("sidebar_color3").toString())}; if (memory_usage >= 85) { memoryStatus = {{tr("MEMORY"), memory}, danger_color}; } else if (memory_usage >= 70) { @@ -208,11 +208,11 @@ void Sidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { } setProperty("memoryStatus", QVariant::fromValue(memoryStatus)); } else { - ItemStatus storageStatus = {{frogpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, QColor(frogpilot_toggles.value("sidebar_color3").toString())}; + ItemStatus storageStatus = {{starpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, QColor(starpilot_toggles.value("sidebar_color3").toString())}; if (free_space < 25 && free_space >= 10) { - storageStatus = {{frogpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, warning_color}; + storageStatus = {{starpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, warning_color}; } else if (10 > free_space) { - storageStatus = {{frogpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, danger_color}; + storageStatus = {{starpilot_toggles.value("storage_left_metrics").toBool() ? tr("LEFT") : tr("USED"), storage}, danger_color}; } setProperty("storageStatus", QVariant::fromValue(storageStatus)); } @@ -241,17 +241,17 @@ void Sidebar::paintEvent(QPaintEvent *event) { } p.setOpacity(1.0); - // FrogPilot variables - FrogPilotUIState *fs = frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + StarPilotUIState *fs = starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs->starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; // network - if (frogpilot_toggles.value("ip_metrics").toBool()) { + if (starpilot_toggles.value("ip_metrics").toBool()) { p.setPen(QColor(0xff, 0xff, 0xff)); p.save(); p.setFont(InterFont(30)); - p.drawText(QRect(50, 196, 225, 27), Qt::AlignLeft | Qt::AlignVCenter, frogpilotUIState()->wifi->getIp4Address()); + p.drawText(QRect(50, 196, 225, 27), Qt::AlignLeft | Qt::AlignVCenter, starpilotUIState()->wifi->getIp4Address()); p.restore(); } else { int x = 58; @@ -275,29 +275,29 @@ void Sidebar::paintEvent(QPaintEvent *event) { // metrics drawMetric(p, temp_status.first, temp_status.second, 338); - if (frogpilot_toggles.value("cpu_metrics").toBool() || frogpilot_toggles.value("gpu_metrics").toBool()) { + if (starpilot_toggles.value("cpu_metrics").toBool() || starpilot_toggles.value("gpu_metrics").toBool()) { drawMetric(p, chip_status.first, chip_status.second, 496); } else { drawMetric(p, panda_status.first, panda_status.second, 496); } - if (frogpilot_toggles.value("memory_metrics").toBool()) { + if (starpilot_toggles.value("memory_metrics").toBool()) { drawMetric(p, memory_status.first, memory_status.second, 654); - } else if (frogpilot_toggles.value("storage_left_metrics").toBool() || frogpilot_toggles.value("storage_used_metrics").toBool()) { + } else if (starpilot_toggles.value("storage_left_metrics").toBool() || starpilot_toggles.value("storage_used_metrics").toBool()) { drawMetric(p, storage_status.first, storage_status.second, 654); } else { drawMetric(p, connect_status.first, connect_status.second, 654); } } -// FrogPilot variables +// StarPilot 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); + loadImage("../../starpilot/assets/active_theme/icons/button_home", home_img, home_gif, home_btn.size(), this); + loadImage("../../starpilot/assets/active_theme/icons/button_flag", flag_img, flag_gif, home_btn.size(), this); + loadImage("../../starpilot/assets/active_theme/icons/button_settings", settings_img, settings_gif, settings_btn.size(), this); // Keep stock icons visible when a theme is partial or missing an icon. if (!home_gif && home_img.isNull()) { diff --git a/selfdrive/ui/qt/sidebar.h b/selfdrive/ui/qt/sidebar.h index 770cf15b..6b57d0e8 100644 --- a/selfdrive/ui/qt/sidebar.h +++ b/selfdrive/ui/qt/sidebar.h @@ -20,7 +20,7 @@ class Sidebar : public QFrame { Q_PROPERTY(int netStrength MEMBER net_strength NOTIFY valueChanged); Q_PROPERTY(bool recordingAudio MEMBER recording_audio NOTIFY valueChanged); - // FrogPilot properties + // StarPilot properties Q_PROPERTY(ItemStatus chipStatus MEMBER chip_status NOTIFY valueChanged) Q_PROPERTY(ItemStatus memoryStatus MEMBER memory_status NOTIFY valueChanged) Q_PROPERTY(ItemStatus storageStatus MEMBER storage_status NOTIFY valueChanged) @@ -34,7 +34,7 @@ signals: public slots: void offroadTransition(bool offroad); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); protected: void paintEvent(QPaintEvent *event) override; @@ -65,14 +65,14 @@ protected: QString net_type; int net_strength = 0; - // FrogPilot variables + // StarPilot variables ItemStatus chip_status, memory_status, storage_status; private: std::unique_ptr pm; Networking *networking = nullptr; - // FrogPilot variables + // StarPilot variables void showEvent(QShowEvent *event); void updateTheme(); diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index 5ccf5ee2..789e9757 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -67,7 +67,7 @@ public slots: signals: void showDescriptionEvent(); - // FrogPilot variables + // StarPilot variables void hideDescriptionEvent(); protected: @@ -135,7 +135,7 @@ public: toggle.update(); } - // FrogPilot variables + // StarPilot variables void forceOn(bool force) { toggle.setEnabled(!force); if (force && !toggle.on) { diff --git a/selfdrive/ui/qt/widgets/input.cc b/selfdrive/ui/qt/widgets/input.cc index 32c6fcef..3cd6c8fa 100644 --- a/selfdrive/ui/qt/widgets/input.cc +++ b/selfdrive/ui/qt/widgets/input.cc @@ -142,7 +142,7 @@ InputDialog::InputDialog(const QString &title, QWidget *parent, const QString &s QObject::connect(k, &Keyboard::emitBackspace, this, [=]() { line->backspace(); - // FrogPilot variables + // StarPilot variables updateMaxLengthSublabel(line->text()); }); QObject::connect(k, &Keyboard::emitKey, this, [=](const QString &key) { @@ -161,7 +161,7 @@ QString InputDialog::getText(const QString &prompt, QWidget *parent, const QStri d.line->setText(defaultText); d.setMinLength(minLength); - // FrogPilot variables + // StarPilot variables d.setMaxLength(maxLength); d.updateMaxLengthSublabel(defaultText); @@ -197,7 +197,7 @@ void InputDialog::setMinLength(int length) { minLength = length; } -// FrogPilot variables +// StarPilot variables void InputDialog::setMaxLength(int length) { maxLength = length; } diff --git a/selfdrive/ui/qt/widgets/input.h b/selfdrive/ui/qt/widgets/input.h index 700e114f..ae567c4c 100644 --- a/selfdrive/ui/qt/widgets/input.h +++ b/selfdrive/ui/qt/widgets/input.h @@ -34,7 +34,7 @@ public: void setMinLength(int length); void show(); - // FrogPilot variables + // StarPilot variables void setMaxLength(int length); private: @@ -46,7 +46,7 @@ private: QVBoxLayout *main_layout; QPushButton *eye_btn; - // FrogPilot variables + // StarPilot variables void updateMaxLengthSublabel(const QString &text); int maxLength; diff --git a/selfdrive/ui/qt/window.cc b/selfdrive/ui/qt/window.cc index 52ab64f8..4693a58c 100644 --- a/selfdrive/ui/qt/window.cc +++ b/selfdrive/ui/qt/window.cc @@ -74,15 +74,15 @@ void MainWindow::closeSettings() { main_layout->setCurrentWidget(homeWindow); if (uiState()->scene.started) { - homeWindow->showSidebar(params.getBool("SidebarOpen") || frogpilotUIState()->frogpilot_scene.frogpilot_toggles.value("debug_mode").toBool()); + homeWindow->showSidebar(params.getBool("SidebarOpen") || starpilotUIState()->starpilot_scene.starpilot_toggles.value("debug_mode").toBool()); } } bool MainWindow::eventFilter(QObject *obj, QEvent *event) { - // FrogPilot variables - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; bool ignore = false; switch (event->type()) { @@ -92,8 +92,8 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) { case QEvent::MouseButtonPress: case QEvent::MouseMove: { // ignore events when device is awakened by resetInteractiveTimeout - ignore = !device()->isAwake() || frogpilot_scene.driver_camera_timer >= UI_FREQ / 2; - device()->resetInteractiveTimeout(frogpilot_toggles.value("screen_timeout").toInt(), frogpilot_toggles.value("screen_timeout_onroad").toInt()); + ignore = !device()->isAwake() || starpilot_scene.driver_camera_timer >= UI_FREQ / 2; + device()->resetInteractiveTimeout(starpilot_toggles.value("screen_timeout").toInt(), starpilot_toggles.value("screen_timeout_onroad").toInt()); break; } default: diff --git a/selfdrive/ui/qt/window.h b/selfdrive/ui/qt/window.h index f1389c29..2b533db1 100644 --- a/selfdrive/ui/qt/window.h +++ b/selfdrive/ui/qt/window.h @@ -23,6 +23,6 @@ private: SettingsWindow *settingsWindow; OnboardingWindow *onboardingWindow; - // FrogPilot variables + // StarPilot variables Params params; }; diff --git a/selfdrive/ui/soundd.py b/selfdrive/ui/soundd.py index e847ba0b..74f5c758 100644 --- a/selfdrive/ui/soundd.py +++ b/selfdrive/ui/soundd.py @@ -16,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 ACTIVE_THEME_PATH, ERROR_LOGS_PATH, RANDOM_EVENTS_PATH, get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import ACTIVE_THEME_PATH, ERROR_LOGS_PATH, RANDOM_EVENTS_PATH, get_starpilot_toggles SAMPLE_RATE = 48000 SAMPLE_BUFFER = 4096 # (approx 100ms) @@ -34,8 +34,8 @@ if HARDWARE.get_device_type() in ("tici", "tizi"): AudibleAlert = car.CarControl.HUDControl.AudibleAlert -# FrogPilot variables -FrogPilotAudibleAlert = custom.FrogPilotCarControl.HUDControl.AudibleAlert +# StarPilot variables +StarPilotAudibleAlert = custom.StarPilotCarControl.HUDControl.AudibleAlert sound_list: dict[int, tuple[str, int | None, float]] = { @@ -51,21 +51,21 @@ sound_list: dict[int, tuple[str, int | None, float]] = { AudibleAlert.warningSoft: ("warning_soft.wav", None, MAX_VOLUME), AudibleAlert.warningImmediate: ("warning_immediate.wav", None, MAX_VOLUME), - # FrogPilot variables - FrogPilotAudibleAlert.angry: ("angry.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.continued: ("continued.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.dejaVu: ("dejaVu.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.doc: ("doc.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.fart: ("fart.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.firefox: ("firefox.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.goat: ("goat.wav", None, MAX_VOLUME), - FrogPilotAudibleAlert.hal9000: ("hal9000.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.mail: ("mail.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.nessie: ("nessie.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.noice: ("noice.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.startup: ("startup.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.thisIsFine: ("this_is_fine.wav", 1, MAX_VOLUME), - FrogPilotAudibleAlert.uwu: ("uwu.wav", 1, MAX_VOLUME), + # StarPilot variables + StarPilotAudibleAlert.angry: ("angry.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.continued: ("continued.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.dejaVu: ("dejaVu.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.doc: ("doc.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.fart: ("fart.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.firefox: ("firefox.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.goat: ("goat.wav", None, MAX_VOLUME), + StarPilotAudibleAlert.hal9000: ("hal9000.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.mail: ("mail.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.nessie: ("nessie.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.noice: ("noice.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.startup: ("startup.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.thisIsFine: ("this_is_fine.wav", 1, MAX_VOLUME), + StarPilotAudibleAlert.uwu: ("uwu.wav", 1, MAX_VOLUME), } if HARDWARE.get_device_type() in ("tici", "tizi"): sound_list.update({ @@ -93,10 +93,10 @@ class Soundd: self.spl_filter_weighted = FirstOrderFilter(0, 2.5, FILTER_DT, initialized=False) - # FrogPilot variables + # StarPilot variables self.params_memory = Params(memory=True) - self.frogpilot_toggles = get_frogpilot_toggles() + self.starpilot_toggles = get_starpilot_toggles() self.openpilot_crashed_played = False @@ -107,7 +107,7 @@ class Soundd: self.error_log = ERROR_LOGS_PATH / "error.txt" self.random_events_directory = RANDOM_EVENTS_PATH / "sounds" - self.update_frogpilot_sounds() + self.update_starpilot_sounds() def load_sounds(self): self.loaded_sounds: dict[int, np.ndarray] = {} @@ -182,10 +182,10 @@ class Soundd: elif sm.updated['selfdriveState']: new_alert = sm['selfdriveState'].alertSound.raw - # FrogPilot variables - new_frogpilot_alert = sm['frogpilotSelfdriveState'].alertSound.raw - if new_alert == AudibleAlert.none and new_frogpilot_alert != FrogPilotAudibleAlert.none: - new_alert = new_frogpilot_alert + # StarPilot variables + new_starpilot_alert = sm['starpilotSelfdriveState'].alertSound.raw + if new_alert == AudibleAlert.none and new_starpilot_alert != StarPilotAudibleAlert.none: + new_alert = new_starpilot_alert self.update_alert(new_alert) elif check_selfdrive_timeout_alert(sm): @@ -212,8 +212,8 @@ class Soundd: sm = messaging.SubMaster(['selfdriveState', 'soundPressure']) - # FrogPilot variables - sm = sm.extend(['frogpilotSelfdriveState', 'frogpilotPlan']) + # StarPilot variables + sm = sm.extend(['starpilotSelfdriveState', 'starpilotPlan']) with self.get_stream(sd) as stream: rk = Ratekeeper(20) @@ -226,11 +226,11 @@ class Soundd: self.spl_filter_weighted.update(sm["soundPressure"].soundPressureWeightedDb) self.current_volume = self.calculate_volume(float(self.spl_filter_weighted.x)) - if self.frogpilot_toggles.alert_volume_controller: + if self.starpilot_toggles.alert_volume_controller: self.auto_volume = self.current_volume self.current_volume = 0.0 - elif self.current_alert in self.volume_map and self.frogpilot_toggles.alert_volume_controller: + elif self.current_alert in self.volume_map and self.starpilot_toggles.alert_volume_controller: self.current_volume = self.volume_map[self.current_alert] if self.current_volume == 1.01: self.current_volume = self.auto_volume @@ -241,43 +241,43 @@ class Soundd: assert stream.active - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(sm) - if frogpilot_toggles != self.frogpilot_toggles: - self.frogpilot_toggles = frogpilot_toggles + # StarPilot variables + starpilot_toggles = get_starpilot_toggles(sm) + if starpilot_toggles != self.starpilot_toggles: + self.starpilot_toggles = starpilot_toggles - stream = self.update_frogpilot_sounds(sd, stream) + stream = self.update_starpilot_sounds(sd, stream) - def update_frogpilot_sounds(self, sd=None, stream=None): + def update_starpilot_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, - AudibleAlert.refuse: self.frogpilot_toggles.refuse_volume / 100.0, + AudibleAlert.engage: self.starpilot_toggles.engage_volume / 100.0, + AudibleAlert.disengage: self.starpilot_toggles.disengage_volume / 100.0, + AudibleAlert.refuse: self.starpilot_toggles.refuse_volume / 100.0, - AudibleAlert.prompt: self.frogpilot_toggles.prompt_volume / 100.0, - AudibleAlert.promptRepeat: self.frogpilot_toggles.prompt_volume / 100.0, - AudibleAlert.promptDistracted: self.frogpilot_toggles.promptDistracted_volume / 100.0, + AudibleAlert.prompt: self.starpilot_toggles.prompt_volume / 100.0, + AudibleAlert.promptRepeat: self.starpilot_toggles.prompt_volume / 100.0, + AudibleAlert.promptDistracted: self.starpilot_toggles.promptDistracted_volume / 100.0, - AudibleAlert.warningSoft: self.frogpilot_toggles.warningSoft_volume / 100.0, - AudibleAlert.warningImmediate: self.frogpilot_toggles.warningImmediate_volume / 100.0, + AudibleAlert.warningSoft: self.starpilot_toggles.warningSoft_volume / 100.0, + AudibleAlert.warningImmediate: self.starpilot_toggles.warningImmediate_volume / 100.0, - FrogPilotAudibleAlert.goat: self.frogpilot_toggles.prompt_volume / 100.0, - FrogPilotAudibleAlert.startup: self.frogpilot_toggles.engage_volume / 100.0 + StarPilotAudibleAlert.goat: self.starpilot_toggles.prompt_volume / 100.0, + StarPilotAudibleAlert.startup: self.starpilot_toggles.engage_volume / 100.0 } for sound in sound_list: if sound not in self.volume_map: self.volume_map[sound] = 1.01 - if self.frogpilot_toggles.sound_pack != "stock": + if self.starpilot_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: + if self.starpilot_toggles.sound_pack != self.previous_sound_pack: self.load_sounds() - self.previous_sound_pack = self.frogpilot_toggles.sound_pack + self.previous_sound_pack = self.starpilot_toggles.sound_pack if stream is not None: stream.close() diff --git a/selfdrive/ui/translations/main_uk.qm b/selfdrive/ui/translations/main_uk.qm index 5b1dc0b3cbe51c481f7732efd363a3e07829c9e2..06fa6b097a82718f2d5dfcd301f9aaf306e13a3b 100644 GIT binary patch delta 30527 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 Ht^EH0kC|BX delta 30875 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 diff --git a/selfdrive/ui/translations/main_uk.ts b/selfdrive/ui/translations/main_uk.ts index 3ee13fd3..2ff25ae0 100644 --- a/selfdrive/ui/translations/main_uk.ts +++ b/selfdrive/ui/translations/main_uk.ts @@ -404,7 +404,7 @@ DriveStats - FROGPILOT + STARPILOT ЖАБОПІЛОТ @@ -459,7 +459,7 @@ - FrogPilotAnnotatedCameraWidget + StarPilotAnnotatedCameraWidget m/s² м/с² @@ -526,7 +526,7 @@ - FrogPilotConfirmationDialog + StarPilotConfirmationDialog Reboot required to take effect. Треба перезавантажити для змін @@ -549,7 +549,7 @@ - FrogPilotDataPanel + StarPilotDataPanel DELETE ВИДАЛ. @@ -599,8 +599,8 @@ Перейменовано! - FrogPilot Backups - Бєкапи FrogPilot + StarPilot Backups + Бєкапи StarPilot BACKUP @@ -695,8 +695,8 @@ Імʼя вже використовується. Виберіть інше імʼя. - <b>Create, delete, or restore FrogPilot backups.</b> - <b>Створити, видалити чи відновити резервні копії FrogPilot.</b> + <b>Create, delete, or restore StarPilot backups.</b> + <b>Створити, видалити чи відновити резервні копії StarPilot.</b> Enter a name for this backup @@ -707,8 +707,8 @@ Стиснути цю резервну копію? Це збереже місце і буде працювати в фоновому режиму але займе трохи більше часу. - Choose a FrogPilot backup to delete - Виберіть резервну копію FrogPilot для видалення + Choose a StarPilot backup to delete + Виберіть резервну копію StarPilot для видалення Delete this backup? @@ -735,12 +735,12 @@ Виберіть резервну копію для видалення - FrogPilot Stats - Статистика FrogPilot + StarPilot Stats + Статистика StarPilot - <b>View your collected FrogPilot stats.</b> - <b>Перегляньте зібрану статистику FrogPilot.</b> + <b>View your collected StarPilot stats.</b> + <b>Перегляньте зібрану статистику StarPilot.</b> RESET @@ -751,8 +751,8 @@ ПЕРЕГЛЯД - Are you sure you want to reset all of your FrogPilot stats? - Ви впевнені, що хочете скинути всі ваші статистики FrogPilot? + Are you sure you want to reset all of your StarPilot stats? + Ви впевнені, що хочете скинути всі ваші статистики StarPilot? Reset @@ -968,7 +968,7 @@ - FrogPilotDevicePanel + StarPilotDevicePanel Device Settings Налаштування пристрою @@ -1147,7 +1147,7 @@ - FrogPilotDriveSummary + StarPilotDriveSummary Random Events Summary Підсумок випадкових подій @@ -1266,7 +1266,7 @@ - FrogPilotLateralPanel + StarPilotLateralPanel Advanced Lateral Tuning Розш. тюнінг кермування @@ -1557,7 +1557,7 @@ - FrogPilotLongitudinalPanel + StarPilotLongitudinalPanel Advanced Longitudinal Tuning Розш. поздовжній тюнінг @@ -2608,14 +2608,14 @@ - FrogPilotManageControl + StarPilotManageControl MANAGE КЕРУВАТИ - FrogPilotMapsPanel + StarPilotMapsPanel Manually Уручну @@ -2806,7 +2806,7 @@ - FrogPilotModelPanel + StarPilotModelPanel Automatically Download New Models Автоматично завантажувати нові моделі @@ -3049,7 +3049,7 @@ - FrogPilotModelReview + StarPilotModelReview Drive Rating Selection Вибір рейтингу поїздки @@ -3116,7 +3116,7 @@ - FrogPilotNavigationPanel + StarPilotNavigationPanel ADD ДОДАТ @@ -3206,8 +3206,8 @@ <b>Інструкції щодо налаштування Mapbox</b> для «Навігації без Prime підписки від comma». - <b>Automatically collect missing or incorrect speed limits while you drive</b> using speeds limits sourced from your dashboard (if supported), Mapbox, and "Navigate on openpilot".<br><br>When you're parked and connected to Wi-Fi, FrogPilot will automatically processes this data into a file to be used with the tool located at "SpeedLimitFiller.frogpilot.com".<br><br>You can download this file from "The Pond" in the "Download Speed Limits" menu.<br><br>Need a step-by-step guide? Visit <b>#speed-limit-filler</b> in the FrogPilot Discord! - <b>Автоматично збирайте відсутні або неправильні обмеження швидкості під час руху</b> за допомогою обмежень швидкості, отриманих з вашої приладової панелі (якщо це підтримується), Mapbox та «Navigate on openpilot».<br><br>Коли ви припаркувалися і підключилися до Wi-Fi, FrogPilot автоматично обробляє ці дані у файл, який можна використовувати за допомогою інструменту, розташованого за адресою «SpeedLimitFiller.frogpilot.com». <br><br>Ви можете завантажити цей файл з «The Pond» у меню «Завантажити обмеження швидкості».<br><br>Потрібна покрокова інструкція? Відвідайте <b>#speed-limit-filler</b> у FrogPilot Discord! + <b>Automatically collect missing or incorrect speed limits while you drive</b> using speeds limits sourced from your dashboard (if supported), Mapbox, and "Navigate on openpilot".<br><br>When you're parked and connected to Wi-Fi, StarPilot will automatically process this data into a file to be used with the "Speed Limit Filler" tool in "The Pond".<br><br>You can download this file from "The Pond" in the "Download Speed Limits" menu.<br><br>Need a step-by-step guide? Visit <b>#speed-limit-filler</b> in the StarPilot Discord! + <b>Автоматично збирайте відсутні або неправильні обмеження швидкості під час руху</b> за допомогою обмежень швидкості, отриманих з вашої приладової панелі (якщо це підтримується), Mapbox та «Navigate on openpilot».<br><br>Коли ви припаркувалися і підключилися до Wi-Fi, StarPilot автоматично обробляє ці дані у файл для використання з інструментом «Speed Limit Filler» у «The Pond».<br><br>Ви можете завантажити цей файл з «The Pond» у меню «Завантажити обмеження швидкості».<br><br>Потрібна покрокова інструкція? Відвідайте <b>#speed-limit-filler</b> у StarPilot Discord! Cancel the speed-limit update? @@ -3279,14 +3279,14 @@ It will reset in %1 hours and %2 minutes. - FrogPilotOnroadWindow + StarPilotOnroadWindow FPS: %1 | Min: %2 | Max: %3 | Avg: %4 КНС: %1 | Мін: %2 | Макс: %3 | Сер.: %4 - FrogPilotSettingsWindow + StarPilotSettingsWindow MANAGE КЕРУВАТИ @@ -3380,8 +3380,8 @@ It will reset in %1 hours and %2 minutes. <b>Налаштуйте гучність сповіщень та увімкніть персоналізовані сповіщення.</b> - <b>Fine-tune custom FrogPilot acceleration, braking, and steering controls.</b> - <b>Точне налаштування користувацьких елементів керування прискоренням, гальмуванням та рульовим керуванням FrogPilot.</b> + <b>Fine-tune custom StarPilot acceleration, braking, and steering controls.</b> + <b>Точне налаштування користувацьких елементів керування прискоренням, гальмуванням та рульовим керуванням StarPilot.</b> <b>Download map data for the "Speed Limit Controller" and configure "Navigate on openpilot" (NOO).</b> @@ -3392,8 +3392,8 @@ It will reset in %1 hours and %2 minutes. Налаштування системи - <b>Manage backups, device settings, screen options, storage, and tools to keep FrogPilot running smoothly.</b> - <b>Керуйте резервними копіями, налаштуваннями пристрою, параметрами екрана, сховищем та інструментами, щоб забезпечити безперебійну роботу FrogPilot.</b> + <b>Manage backups, device settings, screen options, storage, and tools to keep StarPilot running smoothly.</b> + <b>Керуйте резервними копіями, налаштуваннями пристрою, параметрами екрана, сховищем та інструментами, щоб забезпечити безперебійну роботу StarPilot.</b> <b>Customize the look of the driving screen and interface, including themes!</b> @@ -3431,7 +3431,7 @@ Developer - Highly customizable settings for seasoned enthusiasts - FrogPilotSoundsPanel + StarPilotSoundsPanel Disengage Volume Гучність деактивації @@ -3461,8 +3461,8 @@ Developer - Highly customizable settings for seasoned enthusiasts Гучність негайн. сповіщ. - FrogPilot Alerts - Сповіщення FrogPilot + StarPilot Alerts + Сповіщення StarPilot Green Light Alert @@ -3529,8 +3529,8 @@ Developer - Highly customizable settings for seasoned enthusiasts <b>Встановіть гучність для найгучніших попереджень, які вимагають негайної уваги.</b><br><br>Приклади: «НЕГАЙНА ДЕАКТИВАЦІЯ — Водій відволікся», «НЕГАЙНА ДЕАКТИВАЦІЯ — Водій не реагує». - <b>Optional FrogPilot alerts</b> that highlight driving events in a more noticeable way. - <b>Додаткові сповіщення FrogPilot</b>, які більш помітно підкреслюють події під час руху. + <b>Optional StarPilot alerts</b> that highlight driving events in a more noticeable way. + <b>Додаткові сповіщення StarPilot</b>, які більш помітно підкреслюють події під час руху. Goat Scream @@ -3558,7 +3558,7 @@ Developer - Highly customizable settings for seasoned enthusiasts - FrogPilotThemesPanel + StarPilotThemesPanel Color Scheme Колірна гамма @@ -3696,8 +3696,8 @@ Developer - Highly customizable settings for seasoned enthusiasts ШТАТН. - FROGPILOT - FROGPILOT + STARPILOT + STARPILOT CUSTOM @@ -3845,7 +3845,7 @@ Developer - Highly customizable settings for seasoned enthusiasts - FrogPilotUtilitiesPanel + StarPilotUtilitiesPanel Debug Mode Режим зневадження @@ -3967,8 +3967,8 @@ Developer - Highly customizable settings for seasoned enthusiasts Ви впевнені, що хочете скинути всі налаштування, щоб вони відповідали стандартним налаштуванням openpilot? - <b>Use FrogPilot's developer metrics on your next drive</b> to diagnose issues and improve bug reports. - <b>Використовуйте показники розробника FrogPilot під час наступної поїздки</b>, щоб діагностувати проблеми та поліпшити звіти про помилки. + <b>Use StarPilot's developer metrics on your next drive</b> to diagnose issues and improve bug reports. + <b>Використовуйте показники розробника StarPilot під час наступної поїздки</b>, щоб діагностувати проблеми та поліпшити звіти про помилки. <b>Reinstall the Panda firmware</b> to fix connection or reliability issues. @@ -4044,7 +4044,7 @@ Developer - Highly customizable settings for seasoned enthusiasts - FrogPilotVehiclesPanel + StarPilotVehiclesPanel SELECT ВИБІР @@ -4146,8 +4146,8 @@ Developer - Highly customizable settings for seasoned enthusiasts <b>Вимкніть поздовжне керування openpilot</b> і замість цього використовуйте стандартну систему ACC автомобіля. - <b>FrogPilot features for General Motors vehicles.</b> - <b>Функції FrogPilot для автомобілів General Motors.</b> + <b>StarPilot features for General Motors vehicles.</b> + <b>Функції StarPilot для автомобілів General Motors.</b> <b>Experimental GM tune by FrogsGoMoo</b> that attempts to smoothen stopping and takeoff control. Use at your own risk! @@ -4166,8 +4166,8 @@ Developer - Highly customizable settings for seasoned enthusiasts <b>Примусове зупинення та рушання</b> на автомобілі Chevy Volt 2017 року. - <b>FrogPilot features for Genesis, Hyundai, and Kia vehicles.</b> - <b>Функції FrogPilot для авто Genesis, Hyundai та Kia.</b> + <b>StarPilot features for Genesis, Hyundai, and Kia vehicles.</b> + <b>Функції StarPilot для авто Genesis, Hyundai та Kia.</b> <b>comma's new gas and brake control system</b> that improves acceleration and braking but may cause issues on some Genesis/Hyundai/Kia vehicles. @@ -4178,8 +4178,8 @@ Developer - Highly customizable settings for seasoned enthusiasts <b>Хак для підвищення крутного моменту рульового управління з «Taco Bell Run» від comma 2022 року.</b> Призначений для підвищення крутного моменту рульового управління на низьких швидкостях при поворотах вліво і вправо. - <b>FrogPilot features for Lexus and Toyota vehicles.</b> - <b>Функції FrogPilot для авто Lexus і Toyota.</b> + <b>StarPilot features for Lexus and Toyota vehicles.</b> + <b>Функції StarPilot для авто Lexus і Toyota.</b> <b>Automatically lock/unlock doors</b> when shifting in and out of drive. @@ -4290,8 +4290,8 @@ Developer - Highly customizable settings for seasoned enthusiasts Налаштування Acura/Honda - <b>FrogPilot features for Acura and Honda vehicles.</b> - <b>Функції FrogPilot для автомобілів Acura та Honda.</b> + <b>StarPilot features for Acura and Honda vehicles.</b> + <b>Функції StarPilot для автомобілів Acura та Honda.</b> Gentle Following @@ -4322,8 +4322,8 @@ Developer - Highly customizable settings for seasoned enthusiasts Налаштування Subaru - <b>FrogPilot features for Subaru vehicles.</b> - <b>Функції FrogPilot для автомобілів Subaru.</b> + <b>StarPilot features for Subaru vehicles.</b> + <b>Функції StarPilot для автомобілів Subaru.</b> Stop and Go @@ -4335,7 +4335,7 @@ Developer - Highly customizable settings for seasoned enthusiasts - FrogPilotVisualsPanel + StarPilotVisualsPanel Advanced UI Controls Розш. параметри інтерфейсу @@ -4901,8 +4901,8 @@ Developer - Highly customizable settings for seasoned enthusiasts <b>Відобразити всі точки радара</b>, згенеровані радаром автомобіля. - <b>Custom FrogPilot widgets</b> for the driving screen. - <b>Спеціальні віджети FrogPilot</b> для екрану водіння. + <b>Custom StarPilot widgets</b> for the driving screen. + <b>Спеціальні віджети StarPilot</b> для екрану водіння. <b>Color the driving path by planned acceleration and braking.</b> @@ -4969,8 +4969,8 @@ Developer - Highly customizable settings for seasoned enthusiasts <b>Збільште розмір карти</b> для зручнішого читання навігації. - <b>Select the map style</b> for "Navigate on openpilot" (NOO):<br><br><b>Stock openpilot</b>: Default comma.ai style<br><b>FrogPilot</b>: Official FrogPilot map style<br><b>Mapbox Streets</b>: Standard street-focused view<br><b>Mapbox Outdoors</b>: Emphasizes outdoor and terrain features<br><b>Mapbox Light</b>: Minimalist, bright theme<br><b>Mapbox Dark</b>: Minimalist, dark theme<br><b>Mapbox Navigation Day</b>: Optimized for daytime navigation<br><b>Mapbox Navigation Night</b>: Optimized for nighttime navigation<br><b>Mapbox Satellite</b>: Satellite imagery only<br><b>Mapbox Satellite Streets</b>: Hybrid satellite imagery with street labels<br><b>Mapbox Traffic Night</b>: Dark theme emphasizing traffic conditions<br><b>Mike's Personalized Style</b>: Customized hybrid satellite view - <b>Виберіть стиль карти</b> для «Навігація на openpilot» (NOO):<br><br><b>Стандартний openpilot</b>: Стиль comma.ai за замовчуванням<br><b>FrogPilot</b>: Офіційний стиль карти FrogPilot<br><b>Mapbox Streets</b>: Стандартний вигляд з акцентом на вулицях<br><b>Mapbox Outdoors</b>: Акцент на особливостях місцевості та ландшафту<br><b>Mapbox Light</b>: Мінімалістична, світла тема<br><b>Mapbox Dark</b>: Мінімалістична, темна тема<br><b>Mapbox Navigation Day</b>: Оптимізовано для денної навігації<br><b>Mapbox Navigation Night</b>: Оптимізовано для нічної навігації<br><b>Mapbox Satellite</b>: Тільки супутникові знімки<br><b>Mapbox Satellite Streets</b>: Гібридні супутникові знімки з позначками вулиць<br><b>Mapbox Traffic Night</b>: Темна тема, що підкреслює дорожні умови<br><b>Mike's Personalized Style</b>: Індивідуальний гібридний супутниковий вигляд + <b>Select the map style</b> for "Navigate on openpilot" (NOO):<br><br><b>Stock openpilot</b>: Default comma.ai style<br><b>StarPilot</b>: Official StarPilot map style<br><b>Mapbox Streets</b>: Standard street-focused view<br><b>Mapbox Outdoors</b>: Emphasizes outdoor and terrain features<br><b>Mapbox Light</b>: Minimalist, bright theme<br><b>Mapbox Dark</b>: Minimalist, dark theme<br><b>Mapbox Navigation Day</b>: Optimized for daytime navigation<br><b>Mapbox Navigation Night</b>: Optimized for nighttime navigation<br><b>Mapbox Satellite</b>: Satellite imagery only<br><b>Mapbox Satellite Streets</b>: Hybrid satellite imagery with street labels<br><b>Mapbox Traffic Night</b>: Dark theme emphasizing traffic conditions<br><b>Mike's Personalized Style</b>: Customized hybrid satellite view + <b>Виберіть стиль карти</b> для «Навігація на openpilot» (NOO):<br><br><b>Стандартний openpilot</b>: Стиль comma.ai за замовчуванням<br><b>StarPilot</b>: Офіційний стиль карти StarPilot<br><b>Mapbox Streets</b>: Стандартний вигляд з акцентом на вулицях<br><b>Mapbox Outdoors</b>: Акцент на особливостях місцевості та ландшафту<br><b>Mapbox Light</b>: Мінімалістична, світла тема<br><b>Mapbox Dark</b>: Мінімалістична, темна тема<br><b>Mapbox Navigation Day</b>: Оптимізовано для денної навігації<br><b>Mapbox Navigation Night</b>: Оптимізовано для нічної навігації<br><b>Mapbox Satellite</b>: Тільки супутникові знімки<br><b>Mapbox Satellite Streets</b>: Гібридні супутникові знімки з позначками вулиць<br><b>Mapbox Traffic Night</b>: Темна тема, що підкреслює дорожні умови<br><b>Mike's Personalized Style</b>: Індивідуальний гібридний супутниковий вигляд <b>Display the road name at the bottom of the driving screen</b> using data from "OpenStreetMap (OSM)". @@ -5009,7 +5009,7 @@ Developer - Highly customizable settings for seasoned enthusiasts Сховай мапу - FrogPilot + StarPilot ЖабоПілот @@ -5026,7 +5026,7 @@ Developer - Highly customizable settings for seasoned enthusiasts - FrogPilotWheelPanel + StarPilotWheelPanel Distance Button Кнопка відстані @@ -5268,8 +5268,8 @@ Developer - Highly customizable settings for seasoned enthusiasts openpilot завис 💩 - Please post the "Error Log" in the FrogPilot Discord! - Будь ласка, відправте «Журнал помилок» у FrogPilot Discord! + Please post the "Error Log" in the StarPilot Discord! + Будь ласка, відправте «Журнал помилок» у StarPilot Discord! openpilot crashed @@ -5395,7 +5395,7 @@ Developer - Highly customizable settings for seasoned enthusiasts Вихід - FrogPilot + StarPilot ЖабоПілот @@ -5538,32 +5538,32 @@ This may take up to a minute. Програма - FrogPilot + StarPilot ЖабоПілот - Welcome to FrogPilot! Since you're new to openpilot, the "Minimal" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! - Ласкаво просимо до FrogPilot! Оскільки ви новачок в openpilot, було застосовано попереднє налаштування «Мінімальне», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! + Welcome to StarPilot! Since you're new to openpilot, the "Minimal" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! + Ласкаво просимо до StarPilot! Оскільки ви новачок в openpilot, було застосовано попереднє налаштування «Мінімальне», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! - Welcome to FrogPilot! Since you're new to FrogPilot, the "Minimal" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! - Ласкаво просимо до FrogPilot! Оскільки ви новачок у FrogPilot, було застосовано попереднє налаштування «Мінімальне», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! + Welcome to StarPilot! Since you're new to StarPilot, the "Minimal" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! + Ласкаво просимо до StarPilot! Оскільки ви новачок у StarPilot, було застосовано попереднє налаштування «Мінімальне», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! - Since you're fairly new to FrogPilot, the "Minimal" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! - Оскільки ви ще не дуже добре знайомі з FrogPilot, було застосовано попереднє налаштування «Мінімальне», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! + Since you're fairly new to StarPilot, the "Minimal" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! + Оскільки ви ще не дуже добре знайомі з StarPilot, було застосовано попереднє налаштування «Мінімальне», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! Since you're experienced with openpilot, the "Standard" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! Оскільки ви маєте досвід роботи з openpilot, було застосовано попереднє налаштування «Стандарт», але ви можете змінити його в будь-який час за допомогою кнопки «Рівень налаштування»! - Since you're experienced with FrogPilot, the "Standard" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! - Оскільки ви маєте досвід роботи з FrogPilot, було застосовано стандартне попереднє налаштування «Standard», але ви можете змінити його в будь-який час за допомогою кнопки «Tuning Level»! + Since you're experienced with StarPilot, the "Standard" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! + Оскільки ви маєте досвід роботи з StarPilot, було застосовано стандартне попереднє налаштування «Standard», але ви можете змінити його в будь-який час за допомогою кнопки «Tuning Level»! - Since you're very experienced with FrogPilot, the "Advanced" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! - Оскільки ви маєте великий досвід роботи з FrogPilot, було застосовано попереднє налаштування «Advanced», але ви можете змінити його в будь-який час за допомогою кнопки «Tuning Level»! + Since you're very experienced with StarPilot, the "Advanced" toggle preset has been applied, but you can change this at any time via the "Tuning Level" button! + Оскільки ви маєте великий досвід роботи з StarPilot, було застосовано попереднє налаштування «Advanced», але ви можете змінити його в будь-який час за допомогою кнопки «Tuning Level»! @@ -5798,12 +5798,12 @@ This may take up to a minute. Поточна версія - Automatically Update FrogPilot - Автоматично оновлювати FrogPilot + Automatically Update StarPilot + Автоматично оновлювати StarPilot - FrogPilot will automatically update itself and it's assets when you're offroad and have an active internet connection. - FrogPilot автоматично оновлюватиме себе та свої ресурси, коли ви не в дорозі та маєте активне підключення до Інтернету. + StarPilot will automatically update itself and it's assets when you're offroad and have an active internet connection. + StarPilot автоматично оновлюватиме себе та свої ресурси, коли ви не в дорозі та маєте активне підключення до Інтернету. Download diff --git a/selfdrive/ui/ui b/selfdrive/ui/ui index b14740c2c0dd3cac8ab8d9a99df97882a7c509d6..739f7d684080494384661062373a113ff19c7457 100755 GIT binary patch delta 1389837 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≧DDyi0X` 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�G@ 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%0ArV@1Y-iL2w~oxAV7#dNI&ii_z%xQw$EY4Wbn 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

24=)lI9vLe?wwb(ecx*CE*c1oGKu~WxS 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�RK==PS+0V7~-i^KH+N!k`vlQ(09Pi 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 XrJE9b!(&VoSRai+JcO!-Chz|TEUG#j delta 1402561 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

w`Z$axwip7YZn{>(biCL0NX|0 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


e*3HH51bAN?Qa06Wo#Dp9m?j4 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 diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index c617b272..9e70cc04 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -18,7 +18,7 @@ static void update_sockets(UIState *s) { s->sm->update(0); } -static void update_state(UIState *s, FrogPilotUIState *fs) { +static void update_state(UIState *s, StarPilotUIState *fs) { SubMaster &sm = *(s->sm); UIScene &scene = s->scene; @@ -64,21 +64,21 @@ static void update_state(UIState *s, FrogPilotUIState *fs) { auto params = Params(); scene.recording_audio = params.getBool("RecordAudio") && scene.started; - // FrogPilot variables - FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene; + // StarPilot variables + StarPilotUIScene &starpilot_scene = fs->starpilot_scene; if (sm.updated("carState")) { const cereal::CarState::Reader &carState = sm["carState"].getCarState(); - frogpilot_scene.parked = carState.getGearShifter() == cereal::CarState::GearShifter::PARK; - frogpilot_scene.reverse = carState.getGearShifter() == cereal::CarState::GearShifter::REVERSE; - frogpilot_scene.standstill = carState.getStandstill() && !frogpilot_scene.reverse; + starpilot_scene.parked = carState.getGearShifter() == cereal::CarState::GearShifter::PARK; + starpilot_scene.reverse = carState.getGearShifter() == cereal::CarState::GearShifter::REVERSE; + starpilot_scene.standstill = carState.getStandstill() && !starpilot_scene.reverse; } if (scene.started) { - frogpilot_scene.started_timer += 1; + starpilot_scene.started_timer += 1; } - scene.started |= frogpilot_scene.frogpilot_toggles.value("force_onroad").toBool(); - scene.started &= !frogpilot_scene.frogpilot_toggles.value("force_offroad").toBool(); + scene.started |= starpilot_scene.starpilot_toggles.value("force_onroad").toBool(); + scene.started &= !starpilot_scene.starpilot_toggles.value("force_offroad").toBool(); } void ui_update_params(UIState *s) { @@ -86,30 +86,30 @@ void ui_update_params(UIState *s) { s->scene.is_metric = params.getBool("IsMetric"); } -void UIState::updateStatus(FrogPilotUIState *fs) { - // FrogPilot variables - FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; +void UIState::updateStatus(StarPilotUIState *fs) { + // StarPilot variables + StarPilotUIScene &starpilot_scene = fs->starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; if (scene.started && sm->updated("selfdriveState")) { auto ss = (*sm)["selfdriveState"].getSelfdriveState(); auto state = ss.getState(); - // FrogPilot variables + // StarPilot variables const UIStatus previous_status = status; if (state == cereal::SelfdriveState::OpenpilotState::PRE_ENABLED || state == cereal::SelfdriveState::OpenpilotState::OVERRIDING) { status = STATUS_OVERRIDE; - } else if (frogpilot_scene.always_on_lateral_active) { + } else if (starpilot_scene.always_on_lateral_active) { status = STATUS_ALWAYS_ON_LATERAL_ACTIVE; - } else if (frogpilot_scene.traffic_mode_enabled && ss.getEnabled()) { + } else if (starpilot_scene.traffic_mode_enabled && ss.getEnabled()) { status = STATUS_TRAFFIC_MODE_ENABLED; } else { status = ss.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED; } - // FrogPilot variables - frogpilot_scene.wake_up_screen = ss.getAlertStatus() != cereal::SelfdriveState::AlertStatus::NORMAL || (status != previous_status && status != STATUS_OVERRIDE); + // StarPilot variables + starpilot_scene.wake_up_screen = ss.getAlertStatus() != cereal::SelfdriveState::AlertStatus::NORMAL || (status != previous_status && status != STATUS_OVERRIDE); } if (engaged() != engaged_prev) { @@ -126,8 +126,8 @@ void UIState::updateStatus(FrogPilotUIState *fs) { started_prev = scene.started; emit offroadTransition(!scene.started); - // FrogPilot variables - if (frogpilot_toggles.value("tethering_config").toInt() == 2) { + // StarPilot variables + if (starpilot_toggles.value("tethering_config").toInt() == 2) { fs->wifi->setTetheringEnabled(scene.started); } } @@ -150,21 +150,21 @@ UIState::UIState(QObject *parent) : QObject(parent) { void UIState::update() { update_sockets(this); - update_state(this, frogpilotUIState()); - updateStatus(frogpilotUIState()); + update_state(this, starpilotUIState()); + updateStatus(starpilotUIState()); if (sm->frame % UI_FREQ == 0) { watchdog_kick(nanos_since_boot()); } - emit uiUpdate(*this, *frogpilotUIState()); + emit uiUpdate(*this, *starpilotUIState()); - // FrogPilot variables - FrogPilotUIState *fs = frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + // StarPilot variables + StarPilotUIState *fs = starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs->starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; - if (frogpilot_scene.downloading_update || frogpilot_scene.frogpilot_panel_active) { - device()->resetInteractiveTimeout(frogpilot_toggles.value("screen_timeout").toInt(), frogpilot_toggles.value("screen_timeout_onroad").toInt()); + if (starpilot_scene.downloading_update || starpilot_scene.starpilot_panel_active) { + device()->resetInteractiveTimeout(starpilot_toggles.value("screen_timeout").toInt(), starpilot_toggles.value("screen_timeout_onroad").toInt()); } fs->update(); @@ -177,7 +177,7 @@ Device::Device(QObject *parent) : brightness_filter(BACKLIGHT_OFFROAD, BACKLIGHT QObject::connect(uiState(), &UIState::uiUpdate, this, &Device::update); } -void Device::update(const UIState &s, const FrogPilotUIState &fs) { +void Device::update(const UIState &s, const StarPilotUIState &fs) { updateBrightness(s, fs); updateWakefulness(s, fs); } @@ -195,16 +195,16 @@ void Device::resetInteractiveTimeout(int timeout, int timeout_onroad) { if (timeout == -1) { timeout = (ignition_on ? 10 : 30); } else { - // FrogPilot variables + // StarPilot variables timeout = (ignition_on ? timeout_onroad : timeout); } interactive_timeout = timeout * UI_FREQ; } -void Device::updateBrightness(const UIState &s, const FrogPilotUIState &fs) { - // FrogPilot variables - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - const QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; +void Device::updateBrightness(const UIState &s, const StarPilotUIState &fs) { + // StarPilot variables + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + const QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; float clipped_brightness = offroad_brightness; if (s.scene.started && s.scene.light_sensor >= 0) { @@ -224,12 +224,12 @@ void Device::updateBrightness(const UIState &s, const FrogPilotUIState &fs) { int brightness = brightness_filter.update(clipped_brightness); if (!awake) { brightness = 0; - } else if (s.scene.started && !frogpilot_scene.wake_up_screen && interactive_timeout == 0 && frogpilot_toggles.value("standby_mode").toBool()) { + } else if (s.scene.started && !starpilot_scene.wake_up_screen && interactive_timeout == 0 && starpilot_toggles.value("standby_mode").toBool()) { brightness = 0; - } else if (s.scene.started && frogpilot_toggles.value("screen_brightness_onroad").toInt() != 101) { - brightness = interactive_timeout > 0 ? fmax(5, frogpilot_toggles.value("screen_brightness_onroad").toInt()) : frogpilot_toggles.value("screen_brightness_onroad").toInt(); - } else if (frogpilot_toggles.value("screen_brightness").toInt() != 101) { - brightness = frogpilot_toggles.value("screen_brightness").toInt(); + } else if (s.scene.started && starpilot_toggles.value("screen_brightness_onroad").toInt() != 101) { + brightness = interactive_timeout > 0 ? fmax(5, starpilot_toggles.value("screen_brightness_onroad").toInt()) : starpilot_toggles.value("screen_brightness_onroad").toInt(); + } else if (starpilot_toggles.value("screen_brightness").toInt() != 101) { + brightness = starpilot_toggles.value("screen_brightness").toInt(); } if (brightness != last_brightness) { @@ -240,23 +240,23 @@ void Device::updateBrightness(const UIState &s, const FrogPilotUIState &fs) { } } -void Device::updateWakefulness(const UIState &s, const FrogPilotUIState &fs) { - // FrogPilot variables - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - const QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; +void Device::updateWakefulness(const UIState &s, const StarPilotUIState &fs) { + // StarPilot variables + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + const QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; bool ignition_just_turned_off = !s.scene.ignition && ignition_on; ignition_on = s.scene.ignition; - if (ignition_on && frogpilot_toggles.value("standby_mode").toBool()) { - if (frogpilot_scene.wake_up_screen) { - resetInteractiveTimeout(frogpilot_toggles.value("screen_timeout").toInt(), frogpilot_toggles.value("screen_timeout_onroad").toInt()); + if (ignition_on && starpilot_toggles.value("standby_mode").toBool()) { + if (starpilot_scene.wake_up_screen) { + resetInteractiveTimeout(starpilot_toggles.value("screen_timeout").toInt(), starpilot_toggles.value("screen_timeout_onroad").toInt()); } else { resetInteractiveTimeout(0, 0); } } else if (ignition_just_turned_off) { - resetInteractiveTimeout(frogpilot_toggles.value("screen_timeout").toInt(), frogpilot_toggles.value("screen_timeout_onroad").toInt()); - } else if (ignition_on && frogpilot_toggles.value("screen_brightness_onroad").toInt() == 0) { + resetInteractiveTimeout(starpilot_toggles.value("screen_timeout").toInt(), starpilot_toggles.value("screen_timeout_onroad").toInt()); + } else if (ignition_on && starpilot_toggles.value("screen_brightness_onroad").toInt() == 0) { resetInteractiveTimeout(0, 0); } else if (interactive_timeout > 0 && --interactive_timeout == 0) { emit interactiveTimeout(); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 7b17347b..1c9cd7bf 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -15,7 +15,7 @@ #include "system/hardware/hw.h" #include "selfdrive/ui/qt/prime_state.h" -#include "frogpilot/ui/frogpilot_ui.h" +#include "starpilot/ui/starpilot_ui.h" const int UI_BORDER_SIZE = 30; const int UI_HEADER_HEIGHT = 420; @@ -45,7 +45,7 @@ typedef enum UIStatus { STATUS_OVERRIDE, STATUS_ENGAGED, - // FrogPilot variables + // StarPilot variables STATUS_ALWAYS_ON_LATERAL_ACTIVE, STATUS_CEM_DISABLED, STATUS_EXPERIMENTAL_MODE_ENABLED, @@ -57,7 +57,7 @@ const QColor bg_colors [] = { [STATUS_OVERRIDE] = QColor(0x91, 0x9b, 0x95, 0xf1), [STATUS_ENGAGED] = QColor(0x17, 0x86, 0x44, 0xf1), - // FrogPilot variables + // StarPilot variables [STATUS_ALWAYS_ON_LATERAL_ACTIVE] = QColor(0x0a, 0xba, 0xb5, 0xf1), [STATUS_CEM_DISABLED] = QColor(0xff, 0xff, 0x00, 0xf1), [STATUS_EXPERIMENTAL_MODE_ENABLED] = QColor(0xda, 0x6f, 0x25, 0xf1), @@ -81,7 +81,7 @@ class UIState : public QObject { public: UIState(QObject* parent = 0); - void updateStatus(FrogPilotUIState *fs); + void updateStatus(StarPilotUIState *fs); inline bool engaged() const { return scene.started && (*sm)["selfdriveState"].getSelfdriveState().getEnabled(); } @@ -93,7 +93,7 @@ public: PrimeState *prime_state; signals: - void uiUpdate(const UIState &s, const FrogPilotUIState &fs); + void uiUpdate(const UIState &s, const StarPilotUIState &fs); void offroadTransition(bool offroad); void engagedChanged(bool engaged); @@ -129,8 +129,8 @@ private: FirstOrderFilter brightness_filter; QFuture brightness_future; - void updateBrightness(const UIState &s, const FrogPilotUIState &fs); - void updateWakefulness(const UIState &s, const FrogPilotUIState &fs); + void updateBrightness(const UIState &s, const StarPilotUIState &fs); + void updateWakefulness(const UIState &s, const StarPilotUIState &fs); void setAwake(bool on); signals: @@ -139,7 +139,7 @@ signals: public slots: void resetInteractiveTimeout(int timeout = -1, int timeout_onroad = -1); - void update(const UIState &s, const FrogPilotUIState &fs); + void update(const UIState &s, const StarPilotUIState &fs); }; Device *device(); diff --git a/selfdrive/ui/ui_state.py b/selfdrive/ui/ui_state.py index 7df9cd42..b8714e2d 100644 --- a/selfdrive/ui/ui_state.py +++ b/selfdrive/ui/ui_state.py @@ -56,7 +56,7 @@ class UIState: "carControl", "liveParameters", "rawAudioData", - "frogpilotCarState", + "starpilotCarState", ] ) @@ -148,11 +148,11 @@ class UIState: self.is_metric = self.params.get_bool("IsMetric") self.always_on_dm = self.params.get_bool("AlwaysOnDM") - if self.sm.valid.get("frogpilotCarState", False): - frogpilot_car_state = self.sm["frogpilotCarState"] + if self.sm.valid.get("starpilotCarState", False): + starpilot_car_state = self.sm["starpilotCarState"] self.always_on_lateral_active = (not self.sm["selfdriveState"].enabled and - frogpilot_car_state.alwaysOnLateralEnabled) - self.traffic_mode_enabled = frogpilot_car_state.trafficModeEnabled + starpilot_car_state.alwaysOnLateralEnabled) + self.traffic_mode_enabled = starpilot_car_state.trafficModeEnabled else: self.always_on_lateral_active = False self.traffic_mode_enabled = False diff --git a/selfdrive/ui/update_translations.py b/selfdrive/ui/update_translations.py index 8405271e..6294244f 100755 --- a/selfdrive/ui/update_translations.py +++ b/selfdrive/ui/update_translations.py @@ -10,7 +10,7 @@ else: from openpilot.common.basedir import BASEDIR UI_DIR = os.path.join(BASEDIR, "selfdrive", "ui") -FROGPILOT_UI_DIR = os.path.join(BASEDIR, "frogpilot", "ui") +STARPILOT_UI_DIR = os.path.join(BASEDIR, "starpilot", "ui") TRANSLATIONS_DIR = os.path.join(UI_DIR, "translations") LANGUAGES_FILE = os.path.join(TRANSLATIONS_DIR, "languages.json") TRANSLATIONS_INCLUDE_FILE = os.path.join(TRANSLATIONS_DIR, "alerts_generated.h") @@ -82,7 +82,7 @@ def update_translations(vanish: bool = False, translation_files: None | list[str root = tree.getroot() backup = backup_translation_types(root) - args = f"lupdate -locations none -recursive {UI_DIR} {FROGPILOT_UI_DIR} -ts {tr_file} -I {BASEDIR}" + args = f"lupdate -locations none -recursive {UI_DIR} {STARPILOT_UI_DIR} -ts {tr_file} -I {BASEDIR}" if vanish: args += " -no-obsolete" if file in PLURAL_ONLY: diff --git a/frogpilot/assets/active_theme/colors b/starpilot/assets/active_theme/colors similarity index 100% rename from frogpilot/assets/active_theme/colors rename to starpilot/assets/active_theme/colors diff --git a/frogpilot/assets/active_theme/distance_icons b/starpilot/assets/active_theme/distance_icons similarity index 100% rename from frogpilot/assets/active_theme/distance_icons rename to starpilot/assets/active_theme/distance_icons diff --git a/frogpilot/assets/active_theme/icons b/starpilot/assets/active_theme/icons similarity index 100% rename from frogpilot/assets/active_theme/icons rename to starpilot/assets/active_theme/icons diff --git a/frogpilot/assets/active_theme/signals b/starpilot/assets/active_theme/signals similarity index 100% rename from frogpilot/assets/active_theme/signals rename to starpilot/assets/active_theme/signals diff --git a/frogpilot/assets/active_theme/sounds b/starpilot/assets/active_theme/sounds similarity index 100% rename from frogpilot/assets/active_theme/sounds rename to starpilot/assets/active_theme/sounds diff --git a/frogpilot/assets/download_functions.py b/starpilot/assets/download_functions.py similarity index 98% rename from frogpilot/assets/download_functions.py rename to starpilot/assets/download_functions.py index 421ce4e1..47f9dd1e 100644 --- a/frogpilot/assets/download_functions.py +++ b/starpilot/assets/download_functions.py @@ -6,7 +6,7 @@ import tempfile from datetime import datetime from pathlib import Path -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, is_url_pingable +from openpilot.starpilot.common.starpilot_utilities import delete_file, is_url_pingable RESOURCES_REPO = os.getenv("STARPILOT_RESOURCES_REPO", "firestar5683/StarPilot-Resources") GITHUB_URL = f"https://raw.githubusercontent.com/{RESOURCES_REPO}" diff --git a/frogpilot/assets/holiday_themes/april_fools/colors/colors.json b/starpilot/assets/holiday_themes/april_fools/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/colors/colors.json rename to starpilot/assets/holiday_themes/april_fools/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/april_fools/icons/button_flag.png b/starpilot/assets/holiday_themes/april_fools/icons/button_flag.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/icons/button_flag.png rename to starpilot/assets/holiday_themes/april_fools/icons/button_flag.png diff --git a/frogpilot/assets/holiday_themes/april_fools/icons/button_home.gif b/starpilot/assets/holiday_themes/april_fools/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/icons/button_home.gif rename to starpilot/assets/holiday_themes/april_fools/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/april_fools/icons/button_settings.png b/starpilot/assets/holiday_themes/april_fools/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/icons/button_settings.png rename to starpilot/assets/holiday_themes/april_fools/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/traditional_125 b/starpilot/assets/holiday_themes/april_fools/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/traditional_125 rename to starpilot/assets/holiday_themes/april_fools/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/april_fools/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/april_fools/sounds/disengage.wav b/starpilot/assets/holiday_themes/april_fools/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/sounds/disengage.wav rename to starpilot/assets/holiday_themes/april_fools/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/april_fools/sounds/engage.wav b/starpilot/assets/holiday_themes/april_fools/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/sounds/engage.wav rename to starpilot/assets/holiday_themes/april_fools/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/april_fools/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/colors/colors.json b/starpilot/assets/holiday_themes/christmas_week/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/colors/colors.json rename to starpilot/assets/holiday_themes/christmas_week/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/christmas_week/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/christmas_week/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/distance_icons/standard.png b/starpilot/assets/holiday_themes/christmas_week/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/distance_icons/standard.png rename to starpilot/assets/holiday_themes/christmas_week/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.png b/starpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/christmas_week/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/icons/button_flag.gif b/starpilot/assets/holiday_themes/christmas_week/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/icons/button_flag.gif rename to starpilot/assets/holiday_themes/christmas_week/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/christmas_week/icons/button_home.gif b/starpilot/assets/holiday_themes/christmas_week/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/icons/button_home.gif rename to starpilot/assets/holiday_themes/christmas_week/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/christmas_week/icons/button_settings.png b/starpilot/assets/holiday_themes/christmas_week/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/icons/button_settings.png rename to starpilot/assets/holiday_themes/christmas_week/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/traditional_125 b/starpilot/assets/holiday_themes/christmas_week/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/traditional_125 rename to starpilot/assets/holiday_themes/christmas_week/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/christmas_week/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav b/starpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav rename to starpilot/assets/holiday_themes/christmas_week/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/christmas_week/sounds/engage.wav b/starpilot/assets/holiday_themes/christmas_week/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/sounds/engage.wav rename to starpilot/assets/holiday_themes/christmas_week/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/christmas_week/sounds/startup.wav b/starpilot/assets/holiday_themes/christmas_week/sounds/startup.wav similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/sounds/startup.wav rename to starpilot/assets/holiday_themes/christmas_week/sounds/startup.wav diff --git a/frogpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/christmas_week/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json b/starpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json rename to starpilot/assets/holiday_themes/cinco_de_mayo/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png b/starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png b/starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_flag.gif b/starpilot/assets/holiday_themes/cinco_de_mayo/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_flag.gif rename to starpilot/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/starpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif rename to starpilot/assets/holiday_themes/cinco_de_mayo/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png b/starpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_125 b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_125 rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav b/starpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav rename to starpilot/assets/holiday_themes/cinco_de_mayo/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav b/starpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav rename to starpilot/assets/holiday_themes/cinco_de_mayo/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav b/starpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav rename to starpilot/assets/holiday_themes/cinco_de_mayo/sounds/startup.wav diff --git a/frogpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/cinco_de_mayo/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/easter_week/colors/colors.json b/starpilot/assets/holiday_themes/easter_week/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/colors/colors.json rename to starpilot/assets/holiday_themes/easter_week/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/easter_week/icons/button_flag.gif b/starpilot/assets/holiday_themes/easter_week/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/icons/button_flag.gif rename to starpilot/assets/holiday_themes/easter_week/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/easter_week/icons/button_home.gif b/starpilot/assets/holiday_themes/easter_week/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/icons/button_home.gif rename to starpilot/assets/holiday_themes/easter_week/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/easter_week/icons/button_settings.png b/starpilot/assets/holiday_themes/easter_week/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/icons/button_settings.png rename to starpilot/assets/holiday_themes/easter_week/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/traditional_125 b/starpilot/assets/holiday_themes/easter_week/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/traditional_125 rename to starpilot/assets/holiday_themes/easter_week/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/easter_week/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/easter_week/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/easter_week/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/easter_week/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/easter_week/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/easter_week/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/easter_week/sounds/disengage.wav b/starpilot/assets/holiday_themes/easter_week/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/sounds/disengage.wav rename to starpilot/assets/holiday_themes/easter_week/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/easter_week/sounds/engage.wav b/starpilot/assets/holiday_themes/easter_week/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/sounds/engage.wav rename to starpilot/assets/holiday_themes/easter_week/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/easter_week/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/colors/colors.json b/starpilot/assets/holiday_themes/fourth_of_july/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/colors/colors.json rename to starpilot/assets/holiday_themes/fourth_of_july/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/fourth_of_july/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/fourth_of_july/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.png b/starpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.png rename to starpilot/assets/holiday_themes/fourth_of_july/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.png b/starpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/fourth_of_july/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.gif b/starpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.gif rename to starpilot/assets/holiday_themes/fourth_of_july/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_home.gif b/starpilot/assets/holiday_themes/fourth_of_july/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/icons/button_home.gif rename to starpilot/assets/holiday_themes/fourth_of_july/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png b/starpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png rename to starpilot/assets/holiday_themes/fourth_of_july/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/traditional_125 b/starpilot/assets/holiday_themes/fourth_of_july/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/traditional_125 rename to starpilot/assets/holiday_themes/fourth_of_july/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/fourth_of_july/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav b/starpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav rename to starpilot/assets/holiday_themes/fourth_of_july/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav b/starpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav rename to starpilot/assets/holiday_themes/fourth_of_july/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/sounds/startup.wav b/starpilot/assets/holiday_themes/fourth_of_july/sounds/startup.wav similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/sounds/startup.wav rename to starpilot/assets/holiday_themes/fourth_of_july/sounds/startup.wav diff --git a/frogpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/fourth_of_july/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/colors/colors.json b/starpilot/assets/holiday_themes/halloween_week/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/colors/colors.json rename to starpilot/assets/holiday_themes/halloween_week/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/halloween_week/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/halloween_week/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.png b/starpilot/assets/holiday_themes/halloween_week/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/distance_icons/standard.png rename to starpilot/assets/holiday_themes/halloween_week/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.png b/starpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/halloween_week/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif b/starpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif rename to starpilot/assets/holiday_themes/halloween_week/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/halloween_week/icons/button_home.gif b/starpilot/assets/holiday_themes/halloween_week/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/icons/button_home.gif rename to starpilot/assets/holiday_themes/halloween_week/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/halloween_week/icons/button_settings.png b/starpilot/assets/holiday_themes/halloween_week/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/icons/button_settings.png rename to starpilot/assets/holiday_themes/halloween_week/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/traditional_125 b/starpilot/assets/holiday_themes/halloween_week/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/traditional_125 rename to starpilot/assets/holiday_themes/halloween_week/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/halloween_week/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav b/starpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav rename to starpilot/assets/holiday_themes/halloween_week/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/halloween_week/sounds/engage.wav b/starpilot/assets/holiday_themes/halloween_week/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/sounds/engage.wav rename to starpilot/assets/holiday_themes/halloween_week/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/halloween_week/sounds/prompt.wav b/starpilot/assets/holiday_themes/halloween_week/sounds/prompt.wav similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/sounds/prompt.wav rename to starpilot/assets/holiday_themes/halloween_week/sounds/prompt.wav diff --git a/frogpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/halloween_week/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/colors/colors.json b/starpilot/assets/holiday_themes/may_the_fourth/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/colors/colors.json rename to starpilot/assets/holiday_themes/may_the_fourth/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/may_the_fourth/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/may_the_fourth/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png b/starpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png rename to starpilot/assets/holiday_themes/may_the_fourth/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png b/starpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/may_the_fourth/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_flag.gif b/starpilot/assets/holiday_themes/may_the_fourth/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/icons/button_flag.gif rename to starpilot/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/starpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif rename to starpilot/assets/holiday_themes/may_the_fourth/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png b/starpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png rename to starpilot/assets/holiday_themes/may_the_fourth/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/traditional_125 b/starpilot/assets/holiday_themes/may_the_fourth/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/traditional_125 rename to starpilot/assets/holiday_themes/may_the_fourth/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/may_the_fourth/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav b/starpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav rename to starpilot/assets/holiday_themes/may_the_fourth/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav b/starpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav rename to starpilot/assets/holiday_themes/may_the_fourth/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav b/starpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav rename to starpilot/assets/holiday_themes/may_the_fourth/sounds/startup.wav diff --git a/frogpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/may_the_fourth/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/new_years/colors/colors.json b/starpilot/assets/holiday_themes/new_years/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/colors/colors.json rename to starpilot/assets/holiday_themes/new_years/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/new_years/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/new_years/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/new_years/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/new_years/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/new_years/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/new_years/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/new_years/distance_icons/standard.png b/starpilot/assets/holiday_themes/new_years/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/distance_icons/standard.png rename to starpilot/assets/holiday_themes/new_years/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/new_years/distance_icons/traffic.png b/starpilot/assets/holiday_themes/new_years/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/new_years/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/new_years/icons/button_flag.gif b/starpilot/assets/holiday_themes/new_years/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/icons/button_flag.gif rename to starpilot/assets/holiday_themes/new_years/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/new_years/icons/button_home.gif b/starpilot/assets/holiday_themes/new_years/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/icons/button_home.gif rename to starpilot/assets/holiday_themes/new_years/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/new_years/icons/button_settings.png b/starpilot/assets/holiday_themes/new_years/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/icons/button_settings.png rename to starpilot/assets/holiday_themes/new_years/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/traditional_125 b/starpilot/assets/holiday_themes/new_years/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/traditional_125 rename to starpilot/assets/holiday_themes/new_years/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/new_years/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/new_years/sounds/disengage.wav b/starpilot/assets/holiday_themes/new_years/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/sounds/disengage.wav rename to starpilot/assets/holiday_themes/new_years/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/new_years/sounds/engage.wav b/starpilot/assets/holiday_themes/new_years/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/sounds/engage.wav rename to starpilot/assets/holiday_themes/new_years/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/new_years/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/colors/colors.json b/starpilot/assets/holiday_themes/st_patricks_day/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/colors/colors.json rename to starpilot/assets/holiday_themes/st_patricks_day/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/st_patricks_day/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/st_patricks_day/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/st_patricks_day/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/st_patricks_day/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/standard.png b/starpilot/assets/holiday_themes/st_patricks_day/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/standard.png rename to starpilot/assets/holiday_themes/st_patricks_day/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/traffic.png b/starpilot/assets/holiday_themes/st_patricks_day/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/st_patricks_day/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/icons/button_flag.png b/starpilot/assets/holiday_themes/st_patricks_day/icons/button_flag.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/icons/button_flag.png rename to starpilot/assets/holiday_themes/st_patricks_day/icons/button_flag.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/icons/button_home.gif b/starpilot/assets/holiday_themes/st_patricks_day/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/icons/button_home.gif rename to starpilot/assets/holiday_themes/st_patricks_day/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/icons/button_settings.png b/starpilot/assets/holiday_themes/st_patricks_day/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/icons/button_settings.png rename to starpilot/assets/holiday_themes/st_patricks_day/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/traditional_125 b/starpilot/assets/holiday_themes/st_patricks_day/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/traditional_125 rename to starpilot/assets/holiday_themes/st_patricks_day/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/st_patricks_day/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/sounds/disengage.wav b/starpilot/assets/holiday_themes/st_patricks_day/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/sounds/disengage.wav rename to starpilot/assets/holiday_themes/st_patricks_day/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/sounds/engage.wav b/starpilot/assets/holiday_themes/st_patricks_day/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/sounds/engage.wav rename to starpilot/assets/holiday_themes/st_patricks_day/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/st_patricks_day/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/st_patricks_day/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/st_patricks_day/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/st_patricks_day/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/colors/colors.json b/starpilot/assets/holiday_themes/stitch_day/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/colors/colors.json rename to starpilot/assets/holiday_themes/stitch_day/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/stitch_day/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/stitch_day/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/distance_icons/standard.png b/starpilot/assets/holiday_themes/stitch_day/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/distance_icons/standard.png rename to starpilot/assets/holiday_themes/stitch_day/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.png b/starpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/stitch_day/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/icons/button_flag.gif b/starpilot/assets/holiday_themes/stitch_day/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/icons/button_flag.gif rename to starpilot/assets/holiday_themes/stitch_day/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/stitch_day/icons/button_home.gif b/starpilot/assets/holiday_themes/stitch_day/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/icons/button_home.gif rename to starpilot/assets/holiday_themes/stitch_day/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/stitch_day/icons/button_settings.png b/starpilot/assets/holiday_themes/stitch_day/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/icons/button_settings.png rename to starpilot/assets/holiday_themes/stitch_day/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/traditional_125 b/starpilot/assets/holiday_themes/stitch_day/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/traditional_125 rename to starpilot/assets/holiday_themes/stitch_day/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/stitch_day/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav b/starpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav rename to starpilot/assets/holiday_themes/stitch_day/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/stitch_day/sounds/engage.wav b/starpilot/assets/holiday_themes/stitch_day/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/sounds/engage.wav rename to starpilot/assets/holiday_themes/stitch_day/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/stitch_day/sounds/startup.wav b/starpilot/assets/holiday_themes/stitch_day/sounds/startup.wav similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/sounds/startup.wav rename to starpilot/assets/holiday_themes/stitch_day/sounds/startup.wav diff --git a/frogpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.gif b/starpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.gif similarity index 100% rename from frogpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.gif rename to starpilot/assets/holiday_themes/stitch_day/steering_wheel/wheel.gif diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json b/starpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json rename to starpilot/assets/holiday_themes/thanksgiving_week/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.png b/starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.png rename to starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/aggressive.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.png b/starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.png rename to starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/relaxed.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.png b/starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.png rename to starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/standard.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.png b/starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.png rename to starpilot/assets/holiday_themes/thanksgiving_week/distance_icons/traffic.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif b/starpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif rename to starpilot/assets/holiday_themes/thanksgiving_week/icons/button_flag.gif diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif b/starpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif rename to starpilot/assets/holiday_themes/thanksgiving_week/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png b/starpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png rename to starpilot/assets/holiday_themes/thanksgiving_week/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_125 b/starpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_125 rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/thanksgiving_week/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav b/starpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav rename to starpilot/assets/holiday_themes/thanksgiving_week/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav b/starpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav rename to starpilot/assets/holiday_themes/thanksgiving_week/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/thanksgiving_week/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/colors/colors.json b/starpilot/assets/holiday_themes/valentines_day/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/colors/colors.json rename to starpilot/assets/holiday_themes/valentines_day/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/valentines_day/distance_icons/aggressive.gif b/starpilot/assets/holiday_themes/valentines_day/distance_icons/aggressive.gif similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/distance_icons/aggressive.gif rename to starpilot/assets/holiday_themes/valentines_day/distance_icons/aggressive.gif diff --git a/frogpilot/assets/holiday_themes/valentines_day/distance_icons/relaxed.gif b/starpilot/assets/holiday_themes/valentines_day/distance_icons/relaxed.gif similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/distance_icons/relaxed.gif rename to starpilot/assets/holiday_themes/valentines_day/distance_icons/relaxed.gif diff --git a/frogpilot/assets/holiday_themes/valentines_day/distance_icons/standard.gif b/starpilot/assets/holiday_themes/valentines_day/distance_icons/standard.gif similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/distance_icons/standard.gif rename to starpilot/assets/holiday_themes/valentines_day/distance_icons/standard.gif diff --git a/frogpilot/assets/holiday_themes/valentines_day/distance_icons/traffic.gif b/starpilot/assets/holiday_themes/valentines_day/distance_icons/traffic.gif similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/distance_icons/traffic.gif rename to starpilot/assets/holiday_themes/valentines_day/distance_icons/traffic.gif diff --git a/frogpilot/assets/holiday_themes/valentines_day/icons/button_flag.png b/starpilot/assets/holiday_themes/valentines_day/icons/button_flag.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/icons/button_flag.png rename to starpilot/assets/holiday_themes/valentines_day/icons/button_flag.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/icons/button_home.gif b/starpilot/assets/holiday_themes/valentines_day/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/icons/button_home.gif rename to starpilot/assets/holiday_themes/valentines_day/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/valentines_day/icons/button_settings.png b/starpilot/assets/holiday_themes/valentines_day/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/icons/button_settings.png rename to starpilot/assets/holiday_themes/valentines_day/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/traditional_125 b/starpilot/assets/holiday_themes/valentines_day/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/traditional_125 rename to starpilot/assets/holiday_themes/valentines_day/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/valentines_day/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/valentines_day/sounds/disengage.wav b/starpilot/assets/holiday_themes/valentines_day/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/sounds/disengage.wav rename to starpilot/assets/holiday_themes/valentines_day/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/valentines_day/sounds/engage.wav b/starpilot/assets/holiday_themes/valentines_day/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/sounds/engage.wav rename to starpilot/assets/holiday_themes/valentines_day/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/valentines_day/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/valentines_day/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/valentines_day/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/valentines_day/steering_wheel/wheel.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/colors/colors.json b/starpilot/assets/holiday_themes/world_frog_day/colors/colors.json similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/colors/colors.json rename to starpilot/assets/holiday_themes/world_frog_day/colors/colors.json diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif b/starpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif rename to starpilot/assets/holiday_themes/world_frog_day/distance_icons/aggressive.gif diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif b/starpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif rename to starpilot/assets/holiday_themes/world_frog_day/distance_icons/relaxed.gif diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif b/starpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif rename to starpilot/assets/holiday_themes/world_frog_day/distance_icons/standard.gif diff --git a/frogpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif b/starpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif rename to starpilot/assets/holiday_themes/world_frog_day/distance_icons/traffic.gif diff --git a/frogpilot/assets/holiday_themes/world_frog_day/icons/button_flag.gif b/starpilot/assets/holiday_themes/world_frog_day/icons/button_flag.gif similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/icons/button_flag.gif rename to starpilot/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/starpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif rename to starpilot/assets/holiday_themes/world_frog_day/icons/button_home.gif diff --git a/frogpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png b/starpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png rename to starpilot/assets/holiday_themes/world_frog_day/icons/button_settings.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/traditional_125 b/starpilot/assets/holiday_themes/world_frog_day/signals/traditional_125 similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/traditional_125 rename to starpilot/assets/holiday_themes/world_frog_day/signals/traditional_125 diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_1.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_2.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_3.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_4.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_5.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_6.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png b/starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png rename to starpilot/assets/holiday_themes/world_frog_day/signals/turn_signal_blindspot.png diff --git a/frogpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav b/starpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav rename to starpilot/assets/holiday_themes/world_frog_day/sounds/disengage.wav diff --git a/frogpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav b/starpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav rename to starpilot/assets/holiday_themes/world_frog_day/sounds/engage.wav diff --git a/frogpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png b/starpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png rename to starpilot/assets/holiday_themes/world_frog_day/steering_wheel/wheel.png diff --git a/frogpilot/assets/model_manager.py b/starpilot/assets/model_manager.py similarity index 98% rename from frogpilot/assets/model_manager.py rename to starpilot/assets/model_manager.py index 54274701..f41febbc 100644 --- a/frogpilot/assets/model_manager.py +++ b/starpilot/assets/model_manager.py @@ -5,7 +5,7 @@ import urllib.request from pathlib import Path -from openpilot.frogpilot.assets.download_functions import ( +from openpilot.starpilot.assets.download_functions import ( GITLAB_URL, download_file, get_repository_url, @@ -13,8 +13,8 @@ from openpilot.frogpilot.assets.download_functions import ( handle_request_error, verify_download, ) -from openpilot.frogpilot.common.frogpilot_utilities import delete_file -from openpilot.frogpilot.common.frogpilot_variables import MODELS_PATH +from openpilot.starpilot.common.starpilot_utilities import delete_file +from openpilot.starpilot.common.starpilot_variables import MODELS_PATH MANIFEST_CANDIDATES = ("v21",) TINYGRAD_VERSIONS = {"v8", "v9", "v10", "v11", "v12"} diff --git a/frogpilot/assets/nnff_models/ACURA_RDX_3G.json b/starpilot/assets/nnff_models/ACURA_RDX_3G.json similarity index 100% rename from frogpilot/assets/nnff_models/ACURA_RDX_3G.json rename to starpilot/assets/nnff_models/ACURA_RDX_3G.json diff --git a/frogpilot/assets/nnff_models/AUDI_A3_MK3.json b/starpilot/assets/nnff_models/AUDI_A3_MK3.json similarity index 100% rename from frogpilot/assets/nnff_models/AUDI_A3_MK3.json rename to starpilot/assets/nnff_models/AUDI_A3_MK3.json diff --git a/frogpilot/assets/nnff_models/AUDI_Q3_MK2.json b/starpilot/assets/nnff_models/AUDI_Q3_MK2.json similarity index 100% rename from frogpilot/assets/nnff_models/AUDI_Q3_MK2.json rename to starpilot/assets/nnff_models/AUDI_Q3_MK2.json diff --git a/frogpilot/assets/nnff_models/BUICK_LACROSSE.json b/starpilot/assets/nnff_models/BUICK_LACROSSE.json similarity index 100% rename from frogpilot/assets/nnff_models/BUICK_LACROSSE.json rename to starpilot/assets/nnff_models/BUICK_LACROSSE.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_BOLT_EUV.json b/starpilot/assets/nnff_models/CHEVROLET_BOLT_EUV.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_BOLT_EUV.json rename to starpilot/assets/nnff_models/CHEVROLET_BOLT_EUV.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_EQUINOX.json b/starpilot/assets/nnff_models/CHEVROLET_EQUINOX.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_EQUINOX.json rename to starpilot/assets/nnff_models/CHEVROLET_EQUINOX.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_EQUINOX_CC.json b/starpilot/assets/nnff_models/CHEVROLET_EQUINOX_CC.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_EQUINOX_CC.json rename to starpilot/assets/nnff_models/CHEVROLET_EQUINOX_CC.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_SILVERADO.json b/starpilot/assets/nnff_models/CHEVROLET_SILVERADO.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_SILVERADO.json rename to starpilot/assets/nnff_models/CHEVROLET_SILVERADO.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_SUBURBAN.json b/starpilot/assets/nnff_models/CHEVROLET_SUBURBAN.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_SUBURBAN.json rename to starpilot/assets/nnff_models/CHEVROLET_SUBURBAN.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_SUBURBAN_CC.json b/starpilot/assets/nnff_models/CHEVROLET_SUBURBAN_CC.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_SUBURBAN_CC.json rename to starpilot/assets/nnff_models/CHEVROLET_SUBURBAN_CC.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_TRAILBLAZER.json b/starpilot/assets/nnff_models/CHEVROLET_TRAILBLAZER.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_TRAILBLAZER.json rename to starpilot/assets/nnff_models/CHEVROLET_TRAILBLAZER.json diff --git a/frogpilot/assets/nnff_models/CHEVROLET_VOLT.json b/starpilot/assets/nnff_models/CHEVROLET_VOLT.json similarity index 100% rename from frogpilot/assets/nnff_models/CHEVROLET_VOLT.json rename to starpilot/assets/nnff_models/CHEVROLET_VOLT.json diff --git a/frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2017_HYBRID.json b/starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2017_HYBRID.json similarity index 100% rename from frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2017_HYBRID.json rename to starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2017_HYBRID.json diff --git a/frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2018_HYBRID.json b/starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2018_HYBRID.json similarity index 100% rename from frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2018_HYBRID.json rename to starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2018_HYBRID.json diff --git a/frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2019_HYBRID.json b/starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2019_HYBRID.json similarity index 100% rename from frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2019_HYBRID.json rename to starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2019_HYBRID.json diff --git a/frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2020.json b/starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2020.json similarity index 100% rename from frogpilot/assets/nnff_models/CHRYSLER_PACIFICA_2020.json rename to starpilot/assets/nnff_models/CHRYSLER_PACIFICA_2020.json diff --git a/frogpilot/assets/nnff_models/GENESIS_G70.json b/starpilot/assets/nnff_models/GENESIS_G70.json similarity index 100% rename from frogpilot/assets/nnff_models/GENESIS_G70.json rename to starpilot/assets/nnff_models/GENESIS_G70.json diff --git a/frogpilot/assets/nnff_models/GENESIS_GV60_EV_1ST_GEN.json b/starpilot/assets/nnff_models/GENESIS_GV60_EV_1ST_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/GENESIS_GV60_EV_1ST_GEN.json rename to starpilot/assets/nnff_models/GENESIS_GV60_EV_1ST_GEN.json diff --git a/frogpilot/assets/nnff_models/GENESIS_GV70_1ST_GEN.json b/starpilot/assets/nnff_models/GENESIS_GV70_1ST_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/GENESIS_GV70_1ST_GEN.json rename to starpilot/assets/nnff_models/GENESIS_GV70_1ST_GEN.json diff --git a/frogpilot/assets/nnff_models/GMC_ACADIA.json b/starpilot/assets/nnff_models/GMC_ACADIA.json similarity index 100% rename from frogpilot/assets/nnff_models/GMC_ACADIA.json rename to starpilot/assets/nnff_models/GMC_ACADIA.json diff --git a/frogpilot/assets/nnff_models/HONDA_ACCORD.json b/starpilot/assets/nnff_models/HONDA_ACCORD.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_ACCORD.json rename to starpilot/assets/nnff_models/HONDA_ACCORD.json diff --git a/frogpilot/assets/nnff_models/HONDA_CIVIC.json b/starpilot/assets/nnff_models/HONDA_CIVIC.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_CIVIC.json rename to starpilot/assets/nnff_models/HONDA_CIVIC.json diff --git a/frogpilot/assets/nnff_models/HONDA_CIVIC_2022.json b/starpilot/assets/nnff_models/HONDA_CIVIC_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_CIVIC_2022.json rename to starpilot/assets/nnff_models/HONDA_CIVIC_2022.json diff --git a/frogpilot/assets/nnff_models/HONDA_CIVIC_BOSCH.json b/starpilot/assets/nnff_models/HONDA_CIVIC_BOSCH.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_CIVIC_BOSCH.json rename to starpilot/assets/nnff_models/HONDA_CIVIC_BOSCH.json diff --git a/frogpilot/assets/nnff_models/HONDA_CLARITY.json b/starpilot/assets/nnff_models/HONDA_CLARITY.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_CLARITY.json rename to starpilot/assets/nnff_models/HONDA_CLARITY.json diff --git a/frogpilot/assets/nnff_models/HONDA_CRV_5G.json b/starpilot/assets/nnff_models/HONDA_CRV_5G.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_CRV_5G.json rename to starpilot/assets/nnff_models/HONDA_CRV_5G.json diff --git a/frogpilot/assets/nnff_models/HONDA_CRV_HYBRID.json b/starpilot/assets/nnff_models/HONDA_CRV_HYBRID.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_CRV_HYBRID.json rename to starpilot/assets/nnff_models/HONDA_CRV_HYBRID.json diff --git a/frogpilot/assets/nnff_models/HONDA_HRV.json b/starpilot/assets/nnff_models/HONDA_HRV.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_HRV.json rename to starpilot/assets/nnff_models/HONDA_HRV.json diff --git a/frogpilot/assets/nnff_models/HONDA_INSIGHT.json b/starpilot/assets/nnff_models/HONDA_INSIGHT.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_INSIGHT.json rename to starpilot/assets/nnff_models/HONDA_INSIGHT.json diff --git a/frogpilot/assets/nnff_models/HONDA_ODYSSEY.json b/starpilot/assets/nnff_models/HONDA_ODYSSEY.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_ODYSSEY.json rename to starpilot/assets/nnff_models/HONDA_ODYSSEY.json diff --git a/frogpilot/assets/nnff_models/HONDA_PILOT.json b/starpilot/assets/nnff_models/HONDA_PILOT.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_PILOT.json rename to starpilot/assets/nnff_models/HONDA_PILOT.json diff --git a/frogpilot/assets/nnff_models/HONDA_RIDGELINE.json b/starpilot/assets/nnff_models/HONDA_RIDGELINE.json similarity index 100% rename from frogpilot/assets/nnff_models/HONDA_RIDGELINE.json rename to starpilot/assets/nnff_models/HONDA_RIDGELINE.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_ELANTRA_2021.json b/starpilot/assets/nnff_models/HYUNDAI_ELANTRA_2021.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_ELANTRA_2021.json rename to starpilot/assets/nnff_models/HYUNDAI_ELANTRA_2021.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_ELANTRA_HEV_2021.json b/starpilot/assets/nnff_models/HYUNDAI_ELANTRA_HEV_2021.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_ELANTRA_HEV_2021.json rename to starpilot/assets/nnff_models/HYUNDAI_ELANTRA_HEV_2021.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_GENESIS.json b/starpilot/assets/nnff_models/HYUNDAI_GENESIS.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_GENESIS.json rename to starpilot/assets/nnff_models/HYUNDAI_GENESIS.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_IONIQ_5.json b/starpilot/assets/nnff_models/HYUNDAI_IONIQ_5.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_IONIQ_5.json rename to starpilot/assets/nnff_models/HYUNDAI_IONIQ_5.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_IONIQ_EV_LTD.json b/starpilot/assets/nnff_models/HYUNDAI_IONIQ_EV_LTD.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_IONIQ_EV_LTD.json rename to starpilot/assets/nnff_models/HYUNDAI_IONIQ_EV_LTD.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_IONIQ_PHEV.json b/starpilot/assets/nnff_models/HYUNDAI_IONIQ_PHEV.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_IONIQ_PHEV.json rename to starpilot/assets/nnff_models/HYUNDAI_IONIQ_PHEV.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_KONA_EV.json b/starpilot/assets/nnff_models/HYUNDAI_KONA_EV.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_KONA_EV.json rename to starpilot/assets/nnff_models/HYUNDAI_KONA_EV.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_KONA_EV_2022.json b/starpilot/assets/nnff_models/HYUNDAI_KONA_EV_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_KONA_EV_2022.json rename to starpilot/assets/nnff_models/HYUNDAI_KONA_EV_2022.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_KONA_HEV.json b/starpilot/assets/nnff_models/HYUNDAI_KONA_HEV.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_KONA_HEV.json rename to starpilot/assets/nnff_models/HYUNDAI_KONA_HEV.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_PALISADE.json b/starpilot/assets/nnff_models/HYUNDAI_PALISADE.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_PALISADE.json rename to starpilot/assets/nnff_models/HYUNDAI_PALISADE.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE.json b/starpilot/assets/nnff_models/HYUNDAI_SANTA_FE.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE.json rename to starpilot/assets/nnff_models/HYUNDAI_SANTA_FE.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE_2022.json b/starpilot/assets/nnff_models/HYUNDAI_SANTA_FE_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE_2022.json rename to starpilot/assets/nnff_models/HYUNDAI_SANTA_FE_2022.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE_HEV_2022.json b/starpilot/assets/nnff_models/HYUNDAI_SANTA_FE_HEV_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE_HEV_2022.json rename to starpilot/assets/nnff_models/HYUNDAI_SANTA_FE_HEV_2022.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE_PHEV_2022.json b/starpilot/assets/nnff_models/HYUNDAI_SANTA_FE_PHEV_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SANTA_FE_PHEV_2022.json rename to starpilot/assets/nnff_models/HYUNDAI_SANTA_FE_PHEV_2022.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SONATA.json b/starpilot/assets/nnff_models/HYUNDAI_SONATA.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SONATA.json rename to starpilot/assets/nnff_models/HYUNDAI_SONATA.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SONATA_HYBRID.json b/starpilot/assets/nnff_models/HYUNDAI_SONATA_HYBRID.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SONATA_HYBRID.json rename to starpilot/assets/nnff_models/HYUNDAI_SONATA_HYBRID.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_SONATA_LF.json b/starpilot/assets/nnff_models/HYUNDAI_SONATA_LF.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_SONATA_LF.json rename to starpilot/assets/nnff_models/HYUNDAI_SONATA_LF.json diff --git a/frogpilot/assets/nnff_models/HYUNDAI_TUCSON_4TH_GEN.json b/starpilot/assets/nnff_models/HYUNDAI_TUCSON_4TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/HYUNDAI_TUCSON_4TH_GEN.json rename to starpilot/assets/nnff_models/HYUNDAI_TUCSON_4TH_GEN.json diff --git a/frogpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE.json b/starpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE.json similarity index 100% rename from frogpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE.json rename to starpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE.json diff --git a/frogpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE_2019.json b/starpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE_2019.json similarity index 100% rename from frogpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE_2019.json rename to starpilot/assets/nnff_models/JEEP_GRAND_CHEROKEE_2019.json diff --git a/frogpilot/assets/nnff_models/KIA_CEED.json b/starpilot/assets/nnff_models/KIA_CEED.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_CEED.json rename to starpilot/assets/nnff_models/KIA_CEED.json diff --git a/frogpilot/assets/nnff_models/KIA_EV6.json b/starpilot/assets/nnff_models/KIA_EV6.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_EV6.json rename to starpilot/assets/nnff_models/KIA_EV6.json diff --git a/frogpilot/assets/nnff_models/KIA_K5_2021.json b/starpilot/assets/nnff_models/KIA_K5_2021.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_K5_2021.json rename to starpilot/assets/nnff_models/KIA_K5_2021.json diff --git a/frogpilot/assets/nnff_models/KIA_NIRO_EV.json b/starpilot/assets/nnff_models/KIA_NIRO_EV.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_NIRO_EV.json rename to starpilot/assets/nnff_models/KIA_NIRO_EV.json diff --git a/frogpilot/assets/nnff_models/KIA_NIRO_HEV_2021.json b/starpilot/assets/nnff_models/KIA_NIRO_HEV_2021.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_NIRO_HEV_2021.json rename to starpilot/assets/nnff_models/KIA_NIRO_HEV_2021.json diff --git a/frogpilot/assets/nnff_models/KIA_NIRO_HEV_2ND_GEN.json b/starpilot/assets/nnff_models/KIA_NIRO_HEV_2ND_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_NIRO_HEV_2ND_GEN.json rename to starpilot/assets/nnff_models/KIA_NIRO_HEV_2ND_GEN.json diff --git a/frogpilot/assets/nnff_models/KIA_NIRO_PHEV_2022.json b/starpilot/assets/nnff_models/KIA_NIRO_PHEV_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_NIRO_PHEV_2022.json rename to starpilot/assets/nnff_models/KIA_NIRO_PHEV_2022.json diff --git a/frogpilot/assets/nnff_models/KIA_OPTIMA_G4_FL.json b/starpilot/assets/nnff_models/KIA_OPTIMA_G4_FL.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_OPTIMA_G4_FL.json rename to starpilot/assets/nnff_models/KIA_OPTIMA_G4_FL.json diff --git a/frogpilot/assets/nnff_models/KIA_SELTOS.json b/starpilot/assets/nnff_models/KIA_SELTOS.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_SELTOS.json rename to starpilot/assets/nnff_models/KIA_SELTOS.json diff --git a/frogpilot/assets/nnff_models/KIA_SORENTO.json b/starpilot/assets/nnff_models/KIA_SORENTO.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_SORENTO.json rename to starpilot/assets/nnff_models/KIA_SORENTO.json diff --git a/frogpilot/assets/nnff_models/KIA_SORENTO_4TH_GEN.json b/starpilot/assets/nnff_models/KIA_SORENTO_4TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_SORENTO_4TH_GEN.json rename to starpilot/assets/nnff_models/KIA_SORENTO_4TH_GEN.json diff --git a/frogpilot/assets/nnff_models/KIA_SORENTO_HEV_4TH_GEN.json b/starpilot/assets/nnff_models/KIA_SORENTO_HEV_4TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_SORENTO_HEV_4TH_GEN.json rename to starpilot/assets/nnff_models/KIA_SORENTO_HEV_4TH_GEN.json diff --git a/frogpilot/assets/nnff_models/KIA_SPORTAGE_5TH_GEN.json b/starpilot/assets/nnff_models/KIA_SPORTAGE_5TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_SPORTAGE_5TH_GEN.json rename to starpilot/assets/nnff_models/KIA_SPORTAGE_5TH_GEN.json diff --git a/frogpilot/assets/nnff_models/KIA_STINGER.json b/starpilot/assets/nnff_models/KIA_STINGER.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_STINGER.json rename to starpilot/assets/nnff_models/KIA_STINGER.json diff --git a/frogpilot/assets/nnff_models/KIA_STINGER_2022.json b/starpilot/assets/nnff_models/KIA_STINGER_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/KIA_STINGER_2022.json rename to starpilot/assets/nnff_models/KIA_STINGER_2022.json diff --git a/frogpilot/assets/nnff_models/LEXUS_ES_TSS2.json b/starpilot/assets/nnff_models/LEXUS_ES_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/LEXUS_ES_TSS2.json rename to starpilot/assets/nnff_models/LEXUS_ES_TSS2.json diff --git a/frogpilot/assets/nnff_models/LEXUS_IS.json b/starpilot/assets/nnff_models/LEXUS_IS.json similarity index 100% rename from frogpilot/assets/nnff_models/LEXUS_IS.json rename to starpilot/assets/nnff_models/LEXUS_IS.json diff --git a/frogpilot/assets/nnff_models/LEXUS_NX.json b/starpilot/assets/nnff_models/LEXUS_NX.json similarity index 100% rename from frogpilot/assets/nnff_models/LEXUS_NX.json rename to starpilot/assets/nnff_models/LEXUS_NX.json diff --git a/frogpilot/assets/nnff_models/LEXUS_NX_TSS2.json b/starpilot/assets/nnff_models/LEXUS_NX_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/LEXUS_NX_TSS2.json rename to starpilot/assets/nnff_models/LEXUS_NX_TSS2.json diff --git a/frogpilot/assets/nnff_models/LEXUS_RX.json b/starpilot/assets/nnff_models/LEXUS_RX.json similarity index 100% rename from frogpilot/assets/nnff_models/LEXUS_RX.json rename to starpilot/assets/nnff_models/LEXUS_RX.json diff --git a/frogpilot/assets/nnff_models/LEXUS_RX_TSS2.json b/starpilot/assets/nnff_models/LEXUS_RX_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/LEXUS_RX_TSS2.json rename to starpilot/assets/nnff_models/LEXUS_RX_TSS2.json diff --git a/frogpilot/assets/nnff_models/MAZDA_3.json b/starpilot/assets/nnff_models/MAZDA_3.json similarity index 100% rename from frogpilot/assets/nnff_models/MAZDA_3.json rename to starpilot/assets/nnff_models/MAZDA_3.json diff --git a/frogpilot/assets/nnff_models/MAZDA_CX5_2022.json b/starpilot/assets/nnff_models/MAZDA_CX5_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/MAZDA_CX5_2022.json rename to starpilot/assets/nnff_models/MAZDA_CX5_2022.json diff --git a/frogpilot/assets/nnff_models/MAZDA_CX9.json b/starpilot/assets/nnff_models/MAZDA_CX9.json similarity index 100% rename from frogpilot/assets/nnff_models/MAZDA_CX9.json rename to starpilot/assets/nnff_models/MAZDA_CX9.json diff --git a/frogpilot/assets/nnff_models/MAZDA_CX9_2021.json b/starpilot/assets/nnff_models/MAZDA_CX9_2021.json similarity index 100% rename from frogpilot/assets/nnff_models/MAZDA_CX9_2021.json rename to starpilot/assets/nnff_models/MAZDA_CX9_2021.json diff --git a/frogpilot/assets/nnff_models/RAM_1500_5TH_GEN.json b/starpilot/assets/nnff_models/RAM_1500_5TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/RAM_1500_5TH_GEN.json rename to starpilot/assets/nnff_models/RAM_1500_5TH_GEN.json diff --git a/frogpilot/assets/nnff_models/RAM_HD_5TH_GEN.json b/starpilot/assets/nnff_models/RAM_HD_5TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/RAM_HD_5TH_GEN.json rename to starpilot/assets/nnff_models/RAM_HD_5TH_GEN.json diff --git a/frogpilot/assets/nnff_models/SKODA_KAROQ_MK1.json b/starpilot/assets/nnff_models/SKODA_KAROQ_MK1.json similarity index 100% rename from frogpilot/assets/nnff_models/SKODA_KAROQ_MK1.json rename to starpilot/assets/nnff_models/SKODA_KAROQ_MK1.json diff --git a/frogpilot/assets/nnff_models/SKODA_KODIAQ_MK1.json b/starpilot/assets/nnff_models/SKODA_KODIAQ_MK1.json similarity index 100% rename from frogpilot/assets/nnff_models/SKODA_KODIAQ_MK1.json rename to starpilot/assets/nnff_models/SKODA_KODIAQ_MK1.json diff --git a/frogpilot/assets/nnff_models/SKODA_OCTAVIA_MK3.json b/starpilot/assets/nnff_models/SKODA_OCTAVIA_MK3.json similarity index 100% rename from frogpilot/assets/nnff_models/SKODA_OCTAVIA_MK3.json rename to starpilot/assets/nnff_models/SKODA_OCTAVIA_MK3.json diff --git a/frogpilot/assets/nnff_models/SKODA_SUPERB_MK3.json b/starpilot/assets/nnff_models/SKODA_SUPERB_MK3.json similarity index 100% rename from frogpilot/assets/nnff_models/SKODA_SUPERB_MK3.json rename to starpilot/assets/nnff_models/SKODA_SUPERB_MK3.json diff --git a/frogpilot/assets/nnff_models/SUBARU_ASCENT.json b/starpilot/assets/nnff_models/SUBARU_ASCENT.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_ASCENT.json rename to starpilot/assets/nnff_models/SUBARU_ASCENT.json diff --git a/frogpilot/assets/nnff_models/SUBARU_FORESTER.json b/starpilot/assets/nnff_models/SUBARU_FORESTER.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_FORESTER.json rename to starpilot/assets/nnff_models/SUBARU_FORESTER.json diff --git a/frogpilot/assets/nnff_models/SUBARU_IMPREZA.json b/starpilot/assets/nnff_models/SUBARU_IMPREZA.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_IMPREZA.json rename to starpilot/assets/nnff_models/SUBARU_IMPREZA.json diff --git a/frogpilot/assets/nnff_models/SUBARU_IMPREZA_2020.json b/starpilot/assets/nnff_models/SUBARU_IMPREZA_2020.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_IMPREZA_2020.json rename to starpilot/assets/nnff_models/SUBARU_IMPREZA_2020.json diff --git a/frogpilot/assets/nnff_models/SUBARU_LEGACY.json b/starpilot/assets/nnff_models/SUBARU_LEGACY.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_LEGACY.json rename to starpilot/assets/nnff_models/SUBARU_LEGACY.json diff --git a/frogpilot/assets/nnff_models/SUBARU_LEGACY_PREGLOBAL.json b/starpilot/assets/nnff_models/SUBARU_LEGACY_PREGLOBAL.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_LEGACY_PREGLOBAL.json rename to starpilot/assets/nnff_models/SUBARU_LEGACY_PREGLOBAL.json diff --git a/frogpilot/assets/nnff_models/SUBARU_OUTBACK.json b/starpilot/assets/nnff_models/SUBARU_OUTBACK.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_OUTBACK.json rename to starpilot/assets/nnff_models/SUBARU_OUTBACK.json diff --git a/frogpilot/assets/nnff_models/SUBARU_OUTBACK_PREGLOBAL.json b/starpilot/assets/nnff_models/SUBARU_OUTBACK_PREGLOBAL.json similarity index 100% rename from frogpilot/assets/nnff_models/SUBARU_OUTBACK_PREGLOBAL.json rename to starpilot/assets/nnff_models/SUBARU_OUTBACK_PREGLOBAL.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_AVALON.json b/starpilot/assets/nnff_models/TOYOTA_AVALON.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_AVALON.json rename to starpilot/assets/nnff_models/TOYOTA_AVALON.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_AVALON_2019.json b/starpilot/assets/nnff_models/TOYOTA_AVALON_2019.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_AVALON_2019.json rename to starpilot/assets/nnff_models/TOYOTA_AVALON_2019.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_AVALON_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_AVALON_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_AVALON_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_AVALON_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_CAMRY.json b/starpilot/assets/nnff_models/TOYOTA_CAMRY.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_CAMRY.json rename to starpilot/assets/nnff_models/TOYOTA_CAMRY.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_CAMRY_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_CAMRY_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_CAMRY_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_CAMRY_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_CHR.json b/starpilot/assets/nnff_models/TOYOTA_CHR.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_CHR.json rename to starpilot/assets/nnff_models/TOYOTA_CHR.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_CHR_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_CHR_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_CHR_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_CHR_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_COROLLA.json b/starpilot/assets/nnff_models/TOYOTA_COROLLA.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_COROLLA.json rename to starpilot/assets/nnff_models/TOYOTA_COROLLA.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_COROLLA_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_COROLLA_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_COROLLA_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_COROLLA_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_HIGHLANDER.json b/starpilot/assets/nnff_models/TOYOTA_HIGHLANDER.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_HIGHLANDER.json rename to starpilot/assets/nnff_models/TOYOTA_HIGHLANDER.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_HIGHLANDER_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_HIGHLANDER_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_HIGHLANDER_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_HIGHLANDER_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_MIRAI.json b/starpilot/assets/nnff_models/TOYOTA_MIRAI.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_MIRAI.json rename to starpilot/assets/nnff_models/TOYOTA_MIRAI.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_PRIUS.json b/starpilot/assets/nnff_models/TOYOTA_PRIUS.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_PRIUS.json rename to starpilot/assets/nnff_models/TOYOTA_PRIUS.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_PRIUS_2017_b'8965B47070x00x00x00x00x00x00'.json b/starpilot/assets/nnff_models/TOYOTA_PRIUS_2017_b'8965B47070x00x00x00x00x00x00'.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_PRIUS_2017_b'8965B47070x00x00x00x00x00x00'.json rename to starpilot/assets/nnff_models/TOYOTA_PRIUS_2017_b'8965B47070x00x00x00x00x00x00'.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_PRIUS_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_PRIUS_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_PRIUS_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_PRIUS_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_PRIUS_V.json b/starpilot/assets/nnff_models/TOYOTA_PRIUS_V.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_PRIUS_V.json rename to starpilot/assets/nnff_models/TOYOTA_PRIUS_V.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_RAV4.json b/starpilot/assets/nnff_models/TOYOTA_RAV4.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_RAV4.json rename to starpilot/assets/nnff_models/TOYOTA_RAV4.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_RAV4H.json b/starpilot/assets/nnff_models/TOYOTA_RAV4H.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_RAV4H.json rename to starpilot/assets/nnff_models/TOYOTA_RAV4H.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_RAV4_PRIME.json b/starpilot/assets/nnff_models/TOYOTA_RAV4_PRIME.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_RAV4_PRIME.json rename to starpilot/assets/nnff_models/TOYOTA_RAV4_PRIME.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_RAV4_TSS2.json b/starpilot/assets/nnff_models/TOYOTA_RAV4_TSS2.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_RAV4_TSS2.json rename to starpilot/assets/nnff_models/TOYOTA_RAV4_TSS2.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_RAV4_TSS2_2022.json b/starpilot/assets/nnff_models/TOYOTA_RAV4_TSS2_2022.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_RAV4_TSS2_2022.json rename to starpilot/assets/nnff_models/TOYOTA_RAV4_TSS2_2022.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_SIENNA.json b/starpilot/assets/nnff_models/TOYOTA_SIENNA.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_SIENNA.json rename to starpilot/assets/nnff_models/TOYOTA_SIENNA.json diff --git a/frogpilot/assets/nnff_models/TOYOTA_SIENNA_4TH_GEN.json b/starpilot/assets/nnff_models/TOYOTA_SIENNA_4TH_GEN.json similarity index 100% rename from frogpilot/assets/nnff_models/TOYOTA_SIENNA_4TH_GEN.json rename to starpilot/assets/nnff_models/TOYOTA_SIENNA_4TH_GEN.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_ARTEON_MK1.json b/starpilot/assets/nnff_models/VOLKSWAGEN_ARTEON_MK1.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_ARTEON_MK1.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_ARTEON_MK1.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_ATLAS_MK1.json b/starpilot/assets/nnff_models/VOLKSWAGEN_ATLAS_MK1.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_ATLAS_MK1.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_ATLAS_MK1.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_GOLF_MK7.json b/starpilot/assets/nnff_models/VOLKSWAGEN_GOLF_MK7.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_GOLF_MK7.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_GOLF_MK7.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_JETTA_MK7.json b/starpilot/assets/nnff_models/VOLKSWAGEN_JETTA_MK7.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_JETTA_MK7.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_JETTA_MK7.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_MK8.json b/starpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_MK8.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_MK8.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_MK8.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_NMS.json b/starpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_NMS.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_NMS.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_PASSAT_NMS.json diff --git a/frogpilot/assets/nnff_models/VOLKSWAGEN_TIGUAN_MK2.json b/starpilot/assets/nnff_models/VOLKSWAGEN_TIGUAN_MK2.json similarity index 100% rename from frogpilot/assets/nnff_models/VOLKSWAGEN_TIGUAN_MK2.json rename to starpilot/assets/nnff_models/VOLKSWAGEN_TIGUAN_MK2.json diff --git a/frogpilot/assets/other_images/brake_pedal.png b/starpilot/assets/other_images/brake_pedal.png similarity index 100% rename from frogpilot/assets/other_images/brake_pedal.png rename to starpilot/assets/other_images/brake_pedal.png diff --git a/frogpilot/assets/other_images/chill_mode_icon.gif b/starpilot/assets/other_images/chill_mode_icon.gif similarity index 100% rename from frogpilot/assets/other_images/chill_mode_icon.gif rename to starpilot/assets/other_images/chill_mode_icon.gif diff --git a/frogpilot/assets/other_images/curve_icon.gif b/starpilot/assets/other_images/curve_icon.gif similarity index 100% rename from frogpilot/assets/other_images/curve_icon.gif rename to starpilot/assets/other_images/curve_icon.gif diff --git a/frogpilot/assets/other_images/curve_speed.png b/starpilot/assets/other_images/curve_speed.png similarity index 100% rename from frogpilot/assets/other_images/curve_speed.png rename to starpilot/assets/other_images/curve_speed.png diff --git a/frogpilot/assets/other_images/dashboard_icon.png b/starpilot/assets/other_images/dashboard_icon.png similarity index 100% rename from frogpilot/assets/other_images/dashboard_icon.png rename to starpilot/assets/other_images/dashboard_icon.png diff --git a/frogpilot/assets/other_images/experimental_mode_icon.gif b/starpilot/assets/other_images/experimental_mode_icon.gif similarity index 100% rename from frogpilot/assets/other_images/experimental_mode_icon.gif rename to starpilot/assets/other_images/experimental_mode_icon.gif diff --git a/frogpilot/assets/other_images/gas_pedal.png b/starpilot/assets/other_images/gas_pedal.png similarity index 100% rename from frogpilot/assets/other_images/gas_pedal.png rename to starpilot/assets/other_images/gas_pedal.png diff --git a/frogpilot/assets/other_images/lead_icon.gif b/starpilot/assets/other_images/lead_icon.gif similarity index 100% rename from frogpilot/assets/other_images/lead_icon.gif rename to starpilot/assets/other_images/lead_icon.gif diff --git a/frogpilot/assets/other_images/light_icon.gif b/starpilot/assets/other_images/light_icon.gif similarity index 100% rename from frogpilot/assets/other_images/light_icon.gif rename to starpilot/assets/other_images/light_icon.gif diff --git a/frogpilot/assets/other_images/mapbox_icon.png b/starpilot/assets/other_images/mapbox_icon.png similarity index 100% rename from frogpilot/assets/other_images/mapbox_icon.png rename to starpilot/assets/other_images/mapbox_icon.png diff --git a/frogpilot/assets/other_images/next_maps_icon.png b/starpilot/assets/other_images/next_maps_icon.png similarity index 100% rename from frogpilot/assets/other_images/next_maps_icon.png rename to starpilot/assets/other_images/next_maps_icon.png diff --git a/frogpilot/assets/other_images/offline_maps_icon.png b/starpilot/assets/other_images/offline_maps_icon.png similarity index 100% rename from frogpilot/assets/other_images/offline_maps_icon.png rename to starpilot/assets/other_images/offline_maps_icon.png diff --git a/frogpilot/assets/other_images/paused_icon.png b/starpilot/assets/other_images/paused_icon.png similarity index 100% rename from frogpilot/assets/other_images/paused_icon.png rename to starpilot/assets/other_images/paused_icon.png diff --git a/frogpilot/assets/other_images/speed_icon.gif b/starpilot/assets/other_images/speed_icon.gif similarity index 100% rename from frogpilot/assets/other_images/speed_icon.gif rename to starpilot/assets/other_images/speed_icon.gif diff --git a/frogpilot/assets/other_images/speed_icon.png b/starpilot/assets/other_images/speed_icon.png similarity index 100% rename from frogpilot/assets/other_images/speed_icon.png rename to starpilot/assets/other_images/speed_icon.png diff --git a/frogpilot/assets/other_images/frogpilot_boot_logo.jpg b/starpilot/assets/other_images/starpilot_boot_logo.jpg similarity index 100% rename from frogpilot/assets/other_images/frogpilot_boot_logo.jpg rename to starpilot/assets/other_images/starpilot_boot_logo.jpg diff --git a/frogpilot/assets/other_images/stock_bg.jpg b/starpilot/assets/other_images/stock_bg.jpg similarity index 100% rename from frogpilot/assets/other_images/stock_bg.jpg rename to starpilot/assets/other_images/stock_bg.jpg diff --git a/frogpilot/assets/other_images/stop_sign.png b/starpilot/assets/other_images/stop_sign.png similarity index 100% rename from frogpilot/assets/other_images/stop_sign.png rename to starpilot/assets/other_images/stop_sign.png diff --git a/frogpilot/assets/other_images/turn_icon.gif b/starpilot/assets/other_images/turn_icon.gif similarity index 100% rename from frogpilot/assets/other_images/turn_icon.gif rename to starpilot/assets/other_images/turn_icon.gif diff --git a/frogpilot/assets/other_images/turn_icon.png b/starpilot/assets/other_images/turn_icon.png similarity index 100% rename from frogpilot/assets/other_images/turn_icon.png rename to starpilot/assets/other_images/turn_icon.png diff --git a/frogpilot/assets/other_images/weather_clear_day.gif b/starpilot/assets/other_images/weather_clear_day.gif similarity index 100% rename from frogpilot/assets/other_images/weather_clear_day.gif rename to starpilot/assets/other_images/weather_clear_day.gif diff --git a/frogpilot/assets/other_images/weather_clear_night.gif b/starpilot/assets/other_images/weather_clear_night.gif similarity index 100% rename from frogpilot/assets/other_images/weather_clear_night.gif rename to starpilot/assets/other_images/weather_clear_night.gif diff --git a/frogpilot/assets/other_images/weather_low_visibility.gif b/starpilot/assets/other_images/weather_low_visibility.gif similarity index 100% rename from frogpilot/assets/other_images/weather_low_visibility.gif rename to starpilot/assets/other_images/weather_low_visibility.gif diff --git a/frogpilot/assets/other_images/weather_rain.gif b/starpilot/assets/other_images/weather_rain.gif similarity index 100% rename from frogpilot/assets/other_images/weather_rain.gif rename to starpilot/assets/other_images/weather_rain.gif diff --git a/frogpilot/assets/other_images/weather_snow.gif b/starpilot/assets/other_images/weather_snow.gif similarity index 100% rename from frogpilot/assets/other_images/weather_snow.gif rename to starpilot/assets/other_images/weather_snow.gif diff --git a/frogpilot/assets/random_events/icons/button_home.gif b/starpilot/assets/random_events/icons/button_home.gif similarity index 100% rename from frogpilot/assets/random_events/icons/button_home.gif rename to starpilot/assets/random_events/icons/button_home.gif diff --git a/frogpilot/assets/random_events/icons/ferg.png b/starpilot/assets/random_events/icons/ferg.png similarity index 100% rename from frogpilot/assets/random_events/icons/ferg.png rename to starpilot/assets/random_events/icons/ferg.png diff --git a/frogpilot/assets/random_events/sounds/angry.wav b/starpilot/assets/random_events/sounds/angry.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/angry.wav rename to starpilot/assets/random_events/sounds/angry.wav diff --git a/frogpilot/assets/random_events/sounds/continued.wav b/starpilot/assets/random_events/sounds/continued.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/continued.wav rename to starpilot/assets/random_events/sounds/continued.wav diff --git a/frogpilot/assets/random_events/sounds/dejaVu.wav b/starpilot/assets/random_events/sounds/dejaVu.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/dejaVu.wav rename to starpilot/assets/random_events/sounds/dejaVu.wav diff --git a/frogpilot/assets/random_events/sounds/doc.wav b/starpilot/assets/random_events/sounds/doc.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/doc.wav rename to starpilot/assets/random_events/sounds/doc.wav diff --git a/frogpilot/assets/random_events/sounds/fart.wav b/starpilot/assets/random_events/sounds/fart.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/fart.wav rename to starpilot/assets/random_events/sounds/fart.wav diff --git a/frogpilot/assets/random_events/sounds/firefox.wav b/starpilot/assets/random_events/sounds/firefox.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/firefox.wav rename to starpilot/assets/random_events/sounds/firefox.wav diff --git a/frogpilot/assets/random_events/sounds/goat.wav b/starpilot/assets/random_events/sounds/goat.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/goat.wav rename to starpilot/assets/random_events/sounds/goat.wav diff --git a/frogpilot/assets/random_events/sounds/hal9000.wav b/starpilot/assets/random_events/sounds/hal9000.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/hal9000.wav rename to starpilot/assets/random_events/sounds/hal9000.wav diff --git a/frogpilot/assets/random_events/sounds/mail.wav b/starpilot/assets/random_events/sounds/mail.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/mail.wav rename to starpilot/assets/random_events/sounds/mail.wav diff --git a/frogpilot/assets/random_events/sounds/nessie.wav b/starpilot/assets/random_events/sounds/nessie.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/nessie.wav rename to starpilot/assets/random_events/sounds/nessie.wav diff --git a/frogpilot/assets/random_events/sounds/noice.wav b/starpilot/assets/random_events/sounds/noice.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/noice.wav rename to starpilot/assets/random_events/sounds/noice.wav diff --git a/frogpilot/assets/random_events/sounds/this_is_fine.wav b/starpilot/assets/random_events/sounds/this_is_fine.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/this_is_fine.wav rename to starpilot/assets/random_events/sounds/this_is_fine.wav diff --git a/frogpilot/assets/random_events/sounds/uwu.wav b/starpilot/assets/random_events/sounds/uwu.wav similarity index 100% rename from frogpilot/assets/random_events/sounds/uwu.wav rename to starpilot/assets/random_events/sounds/uwu.wav diff --git a/frogpilot/assets/random_events/steering_wheels/accel30.gif b/starpilot/assets/random_events/steering_wheels/accel30.gif similarity index 100% rename from frogpilot/assets/random_events/steering_wheels/accel30.gif rename to starpilot/assets/random_events/steering_wheels/accel30.gif diff --git a/frogpilot/assets/random_events/steering_wheels/accel35.gif b/starpilot/assets/random_events/steering_wheels/accel35.gif similarity index 100% rename from frogpilot/assets/random_events/steering_wheels/accel35.gif rename to starpilot/assets/random_events/steering_wheels/accel35.gif diff --git a/frogpilot/assets/random_events/steering_wheels/accel40.gif b/starpilot/assets/random_events/steering_wheels/accel40.gif similarity index 100% rename from frogpilot/assets/random_events/steering_wheels/accel40.gif rename to starpilot/assets/random_events/steering_wheels/accel40.gif diff --git a/frogpilot/assets/random_events/steering_wheels/firefoxSteerSaturated.gif b/starpilot/assets/random_events/steering_wheels/firefoxSteerSaturated.gif similarity index 100% rename from frogpilot/assets/random_events/steering_wheels/firefoxSteerSaturated.gif rename to starpilot/assets/random_events/steering_wheels/firefoxSteerSaturated.gif diff --git a/frogpilot/assets/random_events/steering_wheels/goatSteerSaturated.gif b/starpilot/assets/random_events/steering_wheels/goatSteerSaturated.gif similarity index 100% rename from frogpilot/assets/random_events/steering_wheels/goatSteerSaturated.gif rename to starpilot/assets/random_events/steering_wheels/goatSteerSaturated.gif diff --git a/frogpilot/assets/random_events/steering_wheels/thisIsFineSteerSaturated.gif b/starpilot/assets/random_events/steering_wheels/thisIsFineSteerSaturated.gif similarity index 100% rename from frogpilot/assets/random_events/steering_wheels/thisIsFineSteerSaturated.gif rename to starpilot/assets/random_events/steering_wheels/thisIsFineSteerSaturated.gif diff --git a/frogpilot/assets/stock_theme/colors/colors.json b/starpilot/assets/stock_theme/colors/colors.json similarity index 100% rename from frogpilot/assets/stock_theme/colors/colors.json rename to starpilot/assets/stock_theme/colors/colors.json diff --git a/frogpilot/assets/stock_theme/distance_icons/aggressive.png b/starpilot/assets/stock_theme/distance_icons/aggressive.png similarity index 100% rename from frogpilot/assets/stock_theme/distance_icons/aggressive.png rename to starpilot/assets/stock_theme/distance_icons/aggressive.png diff --git a/frogpilot/assets/stock_theme/distance_icons/relaxed.png b/starpilot/assets/stock_theme/distance_icons/relaxed.png similarity index 100% rename from frogpilot/assets/stock_theme/distance_icons/relaxed.png rename to starpilot/assets/stock_theme/distance_icons/relaxed.png diff --git a/frogpilot/assets/stock_theme/distance_icons/standard.png b/starpilot/assets/stock_theme/distance_icons/standard.png similarity index 100% rename from frogpilot/assets/stock_theme/distance_icons/standard.png rename to starpilot/assets/stock_theme/distance_icons/standard.png diff --git a/frogpilot/assets/stock_theme/distance_icons/traffic.png b/starpilot/assets/stock_theme/distance_icons/traffic.png similarity index 100% rename from frogpilot/assets/stock_theme/distance_icons/traffic.png rename to starpilot/assets/stock_theme/distance_icons/traffic.png diff --git a/frogpilot/assets/stock_theme/icons b/starpilot/assets/stock_theme/icons similarity index 100% rename from frogpilot/assets/stock_theme/icons rename to starpilot/assets/stock_theme/icons diff --git a/frogpilot/assets/stock_theme/sounds b/starpilot/assets/stock_theme/sounds similarity index 100% rename from frogpilot/assets/stock_theme/sounds rename to starpilot/assets/stock_theme/sounds diff --git a/frogpilot/assets/stock_theme/steering_wheel/wheel.png b/starpilot/assets/stock_theme/steering_wheel/wheel.png similarity index 100% rename from frogpilot/assets/stock_theme/steering_wheel/wheel.png rename to starpilot/assets/stock_theme/steering_wheel/wheel.png diff --git a/frogpilot/assets/theme_manager.py b/starpilot/assets/theme_manager.py similarity index 93% rename from frogpilot/assets/theme_manager.py rename to starpilot/assets/theme_manager.py index 2b78c6aa..674e63b9 100644 --- a/frogpilot/assets/theme_manager.py +++ b/starpilot/assets/theme_manager.py @@ -10,9 +10,9 @@ from dateutil import easter from pathlib import Path from urllib.parse import quote_plus -from openpilot.frogpilot.common.frogpilot_download_utilities import GITLAB_URL, download_file, get_repository_url, handle_error, verify_download -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, extract_zip, load_json_file, update_json_file -from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH, RANDOM_EVENTS_PATH, RESOURCES_REPO, THEME_SAVE_PATH +from openpilot.starpilot.common.starpilot_download_utilities import GITLAB_URL, download_file, get_repository_url, handle_error, verify_download +from openpilot.starpilot.common.starpilot_utilities import delete_file, extract_zip, load_json_file, update_json_file +from openpilot.starpilot.common.starpilot_variables import ACTIVE_THEME_PATH, RANDOM_EVENTS_PATH, RESOURCES_REPO, THEME_SAVE_PATH CANCEL_DOWNLOAD_PARAM = "CancelThemeDownload" DOWNLOAD_PROGRESS_PARAM = "ThemeDownloadProgress" @@ -71,7 +71,7 @@ class ThemeManager: self.session.headers.update({ "Accept": "application/vnd.github.v3+json", "Accept-Language": "en", - "User-Agent": "frogpilot-theme-downloader/1.0 (https://github.com/FrogAi/FrogPilot)" + "User-Agent": "starpilot-theme-downloader/1.0 (https://github.com/FrogAi/StarPilot)" }) if boot_run: @@ -105,13 +105,13 @@ class ThemeManager: steering_wheel_save_path.parent.mkdir(parents=True, exist_ok=True) shutil.copy2(steering_wheel_image_path, steering_wheel_save_path) - default_boot_logo_path = Path(__file__).parent / "other_images/frogpilot_boot_logo.jpg" + default_boot_logo_path = Path(__file__).parent / "other_images/starpilot_boot_logo.jpg" boot_logo_save_path = THEME_SAVE_PATH / "bootlogos/starpilot.jpg" boot_logo_save_path.parent.mkdir(parents=True, exist_ok=True) if default_boot_logo_path.exists() and not boot_logo_save_path.exists(): shutil.copy2(default_boot_logo_path, boot_logo_save_path) - def download_theme(self, theme_component, theme_name, asset_param, frogpilot_toggles): + def download_theme(self, theme_component, theme_name, asset_param, starpilot_toggles): self.downloading_theme = True repo_url = get_repository_url(self.session) @@ -171,16 +171,16 @@ class ThemeManager: self.downloading_theme = False - self.update_themes(frogpilot_toggles) + self.update_themes(starpilot_toggles) return - if self.handle_verification_failure(extension, theme_component, theme_name, asset_param, theme_path, download_path, frogpilot_toggles): + if self.handle_verification_failure(extension, theme_component, theme_name, asset_param, theme_path, download_path, starpilot_toggles): return handle_error(download_path, asset_param, "Download failed...", "Download failed...", self.params_memory, DOWNLOAD_PROGRESS_PARAM) self.downloading_theme = False - def fetch_assets(self, repo_url, frogpilot_toggles): + def fetch_assets(self, repo_url, starpilot_toggles): is_github = "github" in repo_url is_gitlab = "gitlab" in repo_url @@ -239,7 +239,7 @@ class ThemeManager: if local_files and size > 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) + self.download_theme("steering_wheels", theme_name, THEME_COMPONENT_PARAMS["steering_wheels"], starpilot_toggles) elif branch == "Distance-Icons": component_name = "distance_icons" @@ -250,7 +250,7 @@ class ThemeManager: 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) + self.download_theme(component_name, theme_name, THEME_COMPONENT_PARAMS[component_name], starpilot_toggles) branch = "Themes" for item in list_files(branch): @@ -273,7 +273,7 @@ class ThemeManager: local_size = self.theme_sizes.get("boot_logos", {}).get(logo_name) if local_size != expected_size: print(f"boot logo {logo_name} is outdated, redownloading...") - self.download_theme("boot_logos", logo_name, THEME_COMPONENT_PARAMS["boot_logos"], frogpilot_toggles) + self.download_theme("boot_logos", logo_name, THEME_COMPONENT_PARAMS["boot_logos"], starpilot_toggles) continue for key in ("colors", "icons", "signals", "sounds"): @@ -285,7 +285,7 @@ class ThemeManager: 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) + self.download_theme(key, theme_name, THEME_COMPONENT_PARAMS[key], starpilot_toggles) break assets["boot_logos"].sort() @@ -357,7 +357,7 @@ class ThemeManager: "christmas_week": date(year, 12, 25) } - def handle_verification_failure(self, extension, theme_component, theme_name, asset_param, theme_path, download_path, frogpilot_toggles): + def handle_verification_failure(self, extension, theme_component, theme_name, asset_param, theme_path, download_path, starpilot_toggles): if theme_component == "boot_logos": download_link = f"{GITLAB_URL}/Themes/bootlogo" name_candidates = list(dict.fromkeys([theme_name, theme_name.replace("_", "-"), theme_name.replace("-", "_")])) @@ -391,7 +391,7 @@ class ThemeManager: self.downloading_theme = False - self.update_themes(frogpilot_toggles) + self.update_themes(starpilot_toggles) return True return False @@ -456,10 +456,10 @@ class ThemeManager: return random.choice(candidates) if candidates else "stock" - def update_active_theme(self, time_validated, frogpilot_toggles, boot_run=False, randomize_theme=False): - boot_logo = getattr(frogpilot_toggles, "boot_logo", "starpilot") + def update_active_theme(self, time_validated, starpilot_toggles, boot_run=False, randomize_theme=False): + boot_logo = getattr(starpilot_toggles, "boot_logo", "starpilot") - if time_validated and frogpilot_toggles.holiday_themes: + if time_validated and starpilot_toggles.holiday_themes: self.holiday_theme = self.update_holiday() else: self.holiday_theme = "stock" @@ -474,10 +474,10 @@ class ThemeManager: "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: + elif (boot_run or randomize_theme) and starpilot_toggles.random_themes: available_themes = self.get_full_themes() - if frogpilot_toggles.random_themes_holidays: + if starpilot_toggles.random_themes_holidays: available_themes.extend(HOLIDAY_SLUGS.keys()) selected_theme = self.randomize_theme_asset(available_themes) @@ -491,15 +491,15 @@ class ThemeManager: "turn_signal_pack": ("signals", selected_theme.replace("-animated", "")), "wheel_image": ("wheel_image", self.randomize_wheel_image(available_themes, selected_theme.replace("-animated", ""))) } - elif not frogpilot_toggles.random_themes: + elif not starpilot_toggles.random_themes: asset_mappings = { "boot_logo": ("boot_logo", boot_logo), - "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) + "color_scheme": ("colors", starpilot_toggles.color_scheme), + "distance_icons": ("distance_icons", starpilot_toggles.distance_icons), + "icon_pack": ("icons", starpilot_toggles.icon_pack), + "sound_pack": ("sounds", starpilot_toggles.sound_pack), + "turn_signal_pack": ("signals", starpilot_toggles.signal_icons), + "wheel_image": ("wheel_image", starpilot_toggles.wheel_image) } else: return @@ -633,7 +633,7 @@ class ThemeManager: update_json_file(self.theme_sizes_path, self.theme_sizes) - def update_themes(self, frogpilot_toggles, boot_run=False): + def update_themes(self, starpilot_toggles, boot_run=False): if self.downloading_theme: return @@ -642,7 +642,7 @@ class ThemeManager: print("GitHub and GitLab are offline...") return - assets = self.fetch_assets(repo_url, frogpilot_toggles) + assets = self.fetch_assets(repo_url, starpilot_toggles) if not assets: return @@ -680,13 +680,13 @@ class ThemeManager: print(f"Downloadable Wheels: {downloadable_wheels}") if boot_run: - self.validate_themes(downloadable_boot_logos, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels, frogpilot_toggles) + self.validate_themes(downloadable_boot_logos, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels, starpilot_toggles) self.update_theme_params(downloadable_boot_logos, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels) @staticmethod def update_boot_logo(image): - default_boot_logo = Path(__file__).parent / "other_images/frogpilot_boot_logo.jpg" + default_boot_logo = Path(__file__).parent / "other_images/starpilot_boot_logo.jpg" if not default_boot_logo.exists(): return @@ -732,7 +732,7 @@ class ThemeManager: destination_file.symlink_to(source_file) print(f"Linked {destination_file} to {source_file}") - def validate_themes(self, downloadable_boot_logos, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels, frogpilot_toggles): + def validate_themes(self, downloadable_boot_logos, downloadable_colors, downloadable_distance_icons, downloadable_icons, downloadable_signals, downloadable_sounds, downloadable_wheels, starpilot_toggles): downloaded_data = self.params.get("ThemesDownloaded") if isinstance(downloaded_data, (bytes, bytearray)): downloaded_data = downloaded_data.decode("utf-8", "ignore") @@ -750,8 +750,8 @@ class ThemeManager: matching_files = list(boot_logos_path.glob(f"{file_stem}.*")) if not matching_files: print(f"Missing boot logo '{display_name}'. Downloading...") - self.download_theme("boot_logos", file_stem, THEME_COMPONENT_PARAMS["boot_logos"], frogpilot_toggles) - self.update_active_theme(True, frogpilot_toggles) + self.download_theme("boot_logos", file_stem, THEME_COMPONENT_PARAMS["boot_logos"], starpilot_toggles) + self.update_active_theme(True, starpilot_toggles) for display_name, components in downloaded_data.get("themes", {}).items(): raw_name = display_name.lower().replace(" ", "_").replace("(", "").replace(")", "") @@ -761,8 +761,8 @@ class ThemeManager: 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(True, frogpilot_toggles) + self.download_theme(component, theme_folder_name, THEME_COMPONENT_PARAMS.get(component), starpilot_toggles) + self.update_active_theme(True, starpilot_toggles) wheels_path = THEME_SAVE_PATH / "steering_wheels" for display_name in downloaded_data.get("steering_wheels", []): @@ -770,8 +770,8 @@ class ThemeManager: 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(True, frogpilot_toggles) + self.download_theme("steering_wheels", file_stem, THEME_COMPONENT_PARAMS["steering_wheels"], starpilot_toggles) + self.update_active_theme(True, starpilot_toggles) protected_dirs = {THEME_SAVE_PATH / "bootlogos", THEME_SAVE_PATH / "theme_packs", THEME_SAVE_PATH / "steering_wheels"} for dir_path in THEME_SAVE_PATH.glob("**/*"): diff --git a/frogpilot/assets/toggle_icons/icon_advanced_device.png b/starpilot/assets/toggle_icons/icon_advanced_device.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_advanced_device.png rename to starpilot/assets/toggle_icons/icon_advanced_device.png diff --git a/frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png b/starpilot/assets/toggle_icons/icon_advanced_lateral_tune.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png rename to starpilot/assets/toggle_icons/icon_advanced_lateral_tune.png diff --git a/frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png b/starpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png rename to starpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png diff --git a/frogpilot/assets/toggle_icons/icon_always_on_lateral.png b/starpilot/assets/toggle_icons/icon_always_on_lateral.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_always_on_lateral.png rename to starpilot/assets/toggle_icons/icon_always_on_lateral.png diff --git a/frogpilot/assets/toggle_icons/icon_calendar.png b/starpilot/assets/toggle_icons/icon_calendar.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_calendar.png rename to starpilot/assets/toggle_icons/icon_calendar.png diff --git a/frogpilot/assets/toggle_icons/icon_conditional.png b/starpilot/assets/toggle_icons/icon_conditional.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_conditional.png rename to starpilot/assets/toggle_icons/icon_conditional.png diff --git a/frogpilot/assets/toggle_icons/icon_device.png b/starpilot/assets/toggle_icons/icon_device.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_device.png rename to starpilot/assets/toggle_icons/icon_device.png diff --git a/frogpilot/assets/toggle_icons/icon_display.png b/starpilot/assets/toggle_icons/icon_display.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_display.png rename to starpilot/assets/toggle_icons/icon_display.png diff --git a/frogpilot/assets/toggle_icons/icon_frog.png b/starpilot/assets/toggle_icons/icon_frog.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_frog.png rename to starpilot/assets/toggle_icons/icon_frog.png diff --git a/frogpilot/assets/toggle_icons/icon_green_light.png b/starpilot/assets/toggle_icons/icon_green_light.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_green_light.png rename to starpilot/assets/toggle_icons/icon_green_light.png diff --git a/frogpilot/assets/toggle_icons/icon_lane.png b/starpilot/assets/toggle_icons/icon_lane.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_lane.png rename to starpilot/assets/toggle_icons/icon_lane.png diff --git a/frogpilot/assets/toggle_icons/icon_lateral_tune.png b/starpilot/assets/toggle_icons/icon_lateral_tune.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_lateral_tune.png rename to starpilot/assets/toggle_icons/icon_lateral_tune.png diff --git a/frogpilot/assets/toggle_icons/icon_light.png b/starpilot/assets/toggle_icons/icon_light.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_light.png rename to starpilot/assets/toggle_icons/icon_light.png diff --git a/frogpilot/assets/toggle_icons/icon_longitudinal_tune.png b/starpilot/assets/toggle_icons/icon_longitudinal_tune.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_longitudinal_tune.png rename to starpilot/assets/toggle_icons/icon_longitudinal_tune.png diff --git a/frogpilot/assets/toggle_icons/icon_map.png b/starpilot/assets/toggle_icons/icon_map.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_map.png rename to starpilot/assets/toggle_icons/icon_map.png diff --git a/frogpilot/assets/toggle_icons/icon_message.png b/starpilot/assets/toggle_icons/icon_message.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_message.png rename to starpilot/assets/toggle_icons/icon_message.png diff --git a/frogpilot/assets/toggle_icons/icon_mute.png b/starpilot/assets/toggle_icons/icon_mute.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_mute.png rename to starpilot/assets/toggle_icons/icon_mute.png diff --git a/frogpilot/assets/toggle_icons/icon_navigate.png b/starpilot/assets/toggle_icons/icon_navigate.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_navigate.png rename to starpilot/assets/toggle_icons/icon_navigate.png diff --git a/frogpilot/assets/toggle_icons/icon_personality.png b/starpilot/assets/toggle_icons/icon_personality.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_personality.png rename to starpilot/assets/toggle_icons/icon_personality.png diff --git a/frogpilot/assets/toggle_icons/icon_quality_of_life.png b/starpilot/assets/toggle_icons/icon_quality_of_life.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_quality_of_life.png rename to starpilot/assets/toggle_icons/icon_quality_of_life.png diff --git a/frogpilot/assets/toggle_icons/icon_rainbow.png b/starpilot/assets/toggle_icons/icon_rainbow.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_rainbow.png rename to starpilot/assets/toggle_icons/icon_rainbow.png diff --git a/frogpilot/assets/toggle_icons/icon_random.png b/starpilot/assets/toggle_icons/icon_random.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_random.png rename to starpilot/assets/toggle_icons/icon_random.png diff --git a/frogpilot/assets/toggle_icons/icon_random_themes.png b/starpilot/assets/toggle_icons/icon_random_themes.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_random_themes.png rename to starpilot/assets/toggle_icons/icon_random_themes.png diff --git a/frogpilot/assets/toggle_icons/icon_road.png b/starpilot/assets/toggle_icons/icon_road.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_road.png rename to starpilot/assets/toggle_icons/icon_road.png diff --git a/frogpilot/assets/toggle_icons/icon_sound.png b/starpilot/assets/toggle_icons/icon_sound.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_sound.png rename to starpilot/assets/toggle_icons/icon_sound.png diff --git a/frogpilot/assets/toggle_icons/icon_speed_limit.png b/starpilot/assets/toggle_icons/icon_speed_limit.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_speed_limit.png rename to starpilot/assets/toggle_icons/icon_speed_limit.png diff --git a/frogpilot/assets/toggle_icons/icon_speed_map.png b/starpilot/assets/toggle_icons/icon_speed_map.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_speed_map.png rename to starpilot/assets/toggle_icons/icon_speed_map.png diff --git a/frogpilot/assets/toggle_icons/icon_steering.png b/starpilot/assets/toggle_icons/icon_steering.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_steering.png rename to starpilot/assets/toggle_icons/icon_steering.png diff --git a/frogpilot/assets/toggle_icons/icon_system.png b/starpilot/assets/toggle_icons/icon_system.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_system.png rename to starpilot/assets/toggle_icons/icon_system.png diff --git a/frogpilot/assets/toggle_icons/icon_tuning.png b/starpilot/assets/toggle_icons/icon_tuning.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_tuning.png rename to starpilot/assets/toggle_icons/icon_tuning.png diff --git a/frogpilot/assets/toggle_icons/icon_vehicle.png b/starpilot/assets/toggle_icons/icon_vehicle.png similarity index 100% rename from frogpilot/assets/toggle_icons/icon_vehicle.png rename to starpilot/assets/toggle_icons/icon_vehicle.png diff --git a/frogpilot/common/frogpilot_backups.py b/starpilot/common/starpilot_backups.py similarity index 87% rename from frogpilot/common/frogpilot_backups.py rename to starpilot/common/starpilot_backups.py index afae396f..eb1b1e28 100644 --- a/frogpilot/common/frogpilot_backups.py +++ b/starpilot/common/starpilot_backups.py @@ -10,26 +10,26 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params from openpilot.system.hardware.hw import Paths -from openpilot.frogpilot.common.frogpilot_utilities import delete_file -from openpilot.frogpilot.common.frogpilot_variables import EXCLUDED_KEYS, FROGPILOT_BACKUPS, TOGGLE_BACKUPS +from openpilot.starpilot.common.starpilot_utilities import delete_file +from openpilot.starpilot.common.starpilot_variables import EXCLUDED_KEYS, STARPILOT_BACKUPS, TOGGLE_BACKUPS -def backup_frogpilot(build_metadata, params): +def backup_starpilot(build_metadata, params): maximum_backups = 3 - cleanup_backups(FROGPILOT_BACKUPS, maximum_backups) + cleanup_backups(STARPILOT_BACKUPS, maximum_backups) today = datetime.datetime.now().date() - for backup in FROGPILOT_BACKUPS.glob("*_auto.tar.zst"): + for backup in STARPILOT_BACKUPS.glob("*_auto.tar.zst"): if backup.name.endswith(f"_{build_metadata.channel}_auto.tar.zst"): if datetime.datetime.fromtimestamp(backup.stat().st_mtime).date() == today: if not backup.name.startswith(f"{build_metadata.openpilot.git_commit[:6]}_"): delete_file(backup, report=False) - _, _, free = shutil.disk_usage(FROGPILOT_BACKUPS) + _, _, free = shutil.disk_usage(STARPILOT_BACKUPS) minimum_backup_size = params.get("MinimumBackupSize") if free > minimum_backup_size * maximum_backups: - destination = FROGPILOT_BACKUPS / f"{build_metadata.openpilot.git_commit}_{build_metadata.channel}_auto" - create_backup(Path(BASEDIR), destination, "Successfully backed up FrogPilot!", "Failed to backup FrogPilot...", params, minimum_backup_size, compressed=True) + destination = STARPILOT_BACKUPS / f"{build_metadata.openpilot.git_commit}_{build_metadata.channel}_auto" + create_backup(Path(BASEDIR), destination, "Successfully backed up StarPilot!", "Failed to backup StarPilot...", params, minimum_backup_size, compressed=True) def backup_toggles(params, boot_run=False): diff --git a/frogpilot/common/frogpilot_download_utilities.py b/starpilot/common/starpilot_download_utilities.py similarity index 97% rename from frogpilot/common/frogpilot_download_utilities.py rename to starpilot/common/starpilot_download_utilities.py index b14c4014..3300cb48 100644 --- a/frogpilot/common/frogpilot_download_utilities.py +++ b/starpilot/common/starpilot_download_utilities.py @@ -3,8 +3,8 @@ import requests from datetime import datetime, timezone -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, is_url_pingable -from openpilot.frogpilot.common.frogpilot_variables import RESOURCES_REPO +from openpilot.starpilot.common.starpilot_utilities import delete_file, is_url_pingable +from openpilot.starpilot.common.starpilot_variables import RESOURCES_REPO GITHUB_URL = f"https://raw.githubusercontent.com/{RESOURCES_REPO}" GITLAB_URL = f"https://gitlab.com/{RESOURCES_REPO}/-/raw" diff --git a/frogpilot/common/frogpilot_functions.py b/starpilot/common/starpilot_functions.py similarity index 73% rename from frogpilot/common/frogpilot_functions.py rename to starpilot/common/starpilot_functions.py index bc9d514f..56457da3 100644 --- a/frogpilot/common/frogpilot_functions.py +++ b/starpilot/common/starpilot_functions.py @@ -15,46 +15,16 @@ from openpilot.system.athena.registration import register from openpilot.system.hardware import HARDWARE from openpilot.system.version import get_build_metadata -from openpilot.frogpilot.assets.theme_manager import ThemeManager -from openpilot.frogpilot.common.frogpilot_backups import backup_frogpilot -from openpilot.frogpilot.common.frogpilot_utilities import get_frogpilot_api_info, is_FrogsGoMoo, is_url_pingable, run_cmd, use_konik_server -from openpilot.frogpilot.common.frogpilot_variables import ( - ERROR_LOGS_PATH, FROGPILOT_API, FROGS_GO_MOO_PATH, HD_LOGS_PATH, KONIK_LOGS_PATH, MAPS_PATH, THEME_SAVE_PATH, - FrogPilotVariables, get_frogpilot_toggles +from openpilot.starpilot.assets.theme_manager import ThemeManager +from openpilot.starpilot.common.starpilot_backups import backup_starpilot +from openpilot.starpilot.common.starpilot_utilities import get_starpilot_api_info, is_FrogsGoMoo, is_url_pingable, run_cmd, use_konik_server +from openpilot.starpilot.common.starpilot_variables import ( + ERROR_LOGS_PATH, STARPILOT_API, FROGS_GO_MOO_PATH, HD_LOGS_PATH, KONIK_LOGS_PATH, MAPS_PATH, THEME_SAVE_PATH, + StarPilotVariables, get_starpilot_toggles ) -def capture_report(discord_user, report, params, frogpilot_toggles): - if not is_url_pingable(FROGPILOT_API): - return - - api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() - - error_file_path = ERROR_LOGS_PATH / "error.txt" - error_content = "No error log found." - if error_file_path.exists(): - error_content = error_file_path.read_text()[:1000] - - payload = { - "api_token": api_token, - "build_metadata": build_metadata, - "device": device_type, - "discord_user": discord_user, - "error_content": error_content, - "frogpilot_dongle_id": dongle_id, - "frogpilot_toggles": frogpilot_toggles, - "report": report, - } - - try: - response = requests.post(f"{FROGPILOT_API}/discord/report", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=30) - response.raise_for_status() - print("Successfully sent error report!") - except requests.exceptions.RequestException as exception: - print(f"Error sending report: {exception}") - - -def frogpilot_boot_functions(build_metadata, params): +def starpilot_boot_functions(build_metadata, params): params_memory = Params(memory=True) maps_selected = params.get("MapsSelected") @@ -74,8 +44,8 @@ def frogpilot_boot_functions(build_metadata, params): params.put("BuildMetadata", json.dumps(dataclasses.asdict(build_metadata))) - FrogPilotVariables() - ThemeManager(params, params_memory, boot_run=True).update_active_theme(time_validated=system_time_valid(), frogpilot_toggles=get_frogpilot_toggles(), boot_run=True) + StarPilotVariables() + ThemeManager(params, params_memory, boot_run=True).update_active_theme(time_validated=system_time_valid(), starpilot_toggles=get_starpilot_toggles(), boot_run=True) if use_konik_server(): if params.get("KonikDongleId") is not None: @@ -91,12 +61,12 @@ def frogpilot_boot_functions(build_metadata, params): print("Waiting for system time to become valid...") time.sleep(1) - backup_frogpilot(build_metadata, params) + backup_starpilot(build_metadata, params) threading.Thread(target=boot_thread, daemon=True).start() -def install_frogpilot(build_metadata, params): +def install_starpilot(build_metadata, params): paths = [ ERROR_LOGS_PATH, HD_LOGS_PATH, @@ -108,9 +78,9 @@ def install_frogpilot(build_metadata, params): register_device(build_metadata, params) - update_boot_logo(frogpilot=True, selected_logo=params.get("BootLogo")) + update_boot_logo(starpilot=True, selected_logo=params.get("BootLogo")) - if build_metadata.channel == "FrogPilot-Development" and is_FrogsGoMoo(): + if build_metadata.channel == "StarPilot-Development" and is_FrogsGoMoo(): mount_options = run_cmd(["findmnt", "-n", "-o", "OPTIONS", "/persist"], "Successfully retrieved mount options", "Failed to retrieve mount options") run_cmd(["sudo", "mount", "-o", "remount,rw", "/persist"], "Successfully remounted /persist as read-write", "Failed to remount /persist") run_cmd(["sudo", "python3", FROGS_GO_MOO_PATH], "Successfully ran frogsgomoo.py", "Failed to run frogsgomoo.py") @@ -122,53 +92,53 @@ def register_device(build_metadata, params): dongle_id = params.get("DongleId") if isinstance(dongle_id, bytes): dongle_id = dongle_id.decode("utf-8", errors="ignore") - frogpilot_dongle_id = params.get("FrogPilotDongleId") - if isinstance(frogpilot_dongle_id, bytes): - frogpilot_dongle_id = frogpilot_dongle_id.decode("utf-8", errors="ignore") + starpilot_dongle_id = params.get("StarPilotDongleId") + if isinstance(starpilot_dongle_id, bytes): + starpilot_dongle_id = starpilot_dongle_id.decode("utf-8", errors="ignore") # Keep a stable local identifier even if the remote registration endpoint # is unavailable or slow to respond. - if dongle_id and not frogpilot_dongle_id: - params.put("FrogPilotDongleId", dongle_id) + if dongle_id and not starpilot_dongle_id: + params.put("StarPilotDongleId", dongle_id) - while not is_url_pingable(FROGPILOT_API): + while not is_url_pingable(STARPILOT_API): time.sleep(60) payload = { - "api_token": params.get("FrogPilotApiToken"), + "api_token": params.get("StarPilotApiToken"), "build_metadata": dataclasses.asdict(build_metadata), "device": HARDWARE.get_device_type(), "dongle_id": dongle_id, - "frogpilot_dongle_id": params.get("FrogPilotDongleId"), + "starpilot_dongle_id": params.get("StarPilotDongleId"), } try: - response = requests.post(f"{FROGPILOT_API}/register", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=10) + response = requests.post(f"{STARPILOT_API}/register", json=payload, headers={"Content-Type": "application/json", "User-Agent": "starpilot-api/1.0"}, timeout=10) response.raise_for_status() data = response.json() - params.put("FrogPilotApiToken", data.get("api_token", "")) - params.put("FrogPilotDongleId", data.get("frogpilot_dongle_id")) + params.put("StarPilotApiToken", data.get("api_token", "")) + params.put("StarPilotDongleId", data.get("starpilot_dongle_id")) except Exception: pass threading.Thread(target=register_thread, daemon=True).start() -def uninstall_frogpilot(): +def uninstall_starpilot(): update_boot_logo(stock=True) HARDWARE.uninstall() -def update_boot_logo(frogpilot=False, stock=False, selected_logo=None): +def update_boot_logo(starpilot=False, stock=False, selected_logo=None): if HARDWARE.get_device_type() == "pc": return boot_logo_location = Path("/usr/comma/bg.jpg") - if frogpilot: - target_logo = Path(BASEDIR) / "frogpilot/assets/other_images/frogpilot_boot_logo.jpg" + if starpilot: + target_logo = Path(BASEDIR) / "starpilot/assets/other_images/starpilot_boot_logo.jpg" if selected_logo: selected = selected_logo.decode("utf-8", "ignore") if isinstance(selected_logo, (bytes, bytearray)) else str(selected_logo) selected = selected.strip().lower().replace(" ", "_") @@ -177,9 +147,9 @@ def update_boot_logo(frogpilot=False, stock=False, selected_logo=None): if candidates: target_logo = candidates[0] elif stock: - target_logo = Path(BASEDIR) / "frogpilot/assets/other_images/stock_bg.jpg" + target_logo = Path(BASEDIR) / "starpilot/assets/other_images/stock_bg.jpg" else: - print(f'Error: Must specify either "frogpilot=True" or "stock=True"') + print(f'Error: Must specify either "starpilot=True" or "stock=True"') return if not target_logo.is_file(): @@ -187,7 +157,7 @@ def update_boot_logo(frogpilot=False, stock=False, selected_logo=None): return source_logo = target_logo - staged_logo = Path("/tmp/frogpilot_boot_logo.jpg") + staged_logo = Path("/tmp/starpilot_boot_logo.jpg") try: from PIL import Image diff --git a/frogpilot/common/frogpilot_utilities.py b/starpilot/common/starpilot_utilities.py similarity index 94% rename from frogpilot/common/frogpilot_utilities.py rename to starpilot/common/starpilot_utilities.py index 80419ce2..6c4b49ec 100644 --- a/frogpilot/common/frogpilot_utilities.py +++ b/starpilot/common/starpilot_utilities.py @@ -23,7 +23,7 @@ from openpilot.system.hardware import HARDWARE from openpilot.system.version import get_build_metadata from panda import Panda, FW_PATH -from openpilot.frogpilot.common.frogpilot_variables import EARTH_RADIUS, FROGPILOT_API, FROGS_GO_MOO_PATH, KONIK_PATH +from openpilot.starpilot.common.starpilot_variables import EARTH_RADIUS, STARPILOT_API, FROGS_GO_MOO_PATH, KONIK_PATH def capture_exception(exception): @@ -142,8 +142,8 @@ def clean_model_name(name): return name.replace("(Default)", "").strip() -def contains_event_type(events, frogpilot_events, *event_types): - return any(events.contains(event_type) or frogpilot_events.contains(event_type) for event_type in event_types) +def contains_event_type(events, starpilot_events, *event_types): + return any(events.contains(event_type) or starpilot_events.contains(event_type) for event_type in event_types) def delete_file(path, print_error=True, report=True): @@ -201,13 +201,13 @@ def flash_panda(params_memory): params_memory.remove("FlashPanda") -def get_frogpilot_api_info(): +def get_starpilot_api_info(): params = Params() - api_token = params.get("FrogPilotApiToken") + api_token = params.get("StarPilotApiToken") build_metadata = dataclasses.asdict(get_build_metadata()) device_type = HARDWARE.get_device_type() - dongle_id = params.get("FrogPilotDongleId") + dongle_id = params.get("StarPilotDongleId") return api_token, build_metadata, device_type, dongle_id @@ -219,16 +219,16 @@ def get_lock_status(can_parser, can_sock): def get_sentry_dsn(): try: - api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() + api_token, build_metadata, device_type, dongle_id = get_starpilot_api_info() payload = { "api_token": api_token, "build_metadata": build_metadata, "device": device_type, - "frogpilot_dongle_id": dongle_id, + "starpilot_dongle_id": dongle_id, } - response = requests.post(f"{FROGPILOT_API}/sentry", json=payload, headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, timeout=10) + response = requests.post(f"{STARPILOT_API}/sentry", json=payload, headers={"Content-Type": "application/json", "User-Agent": "starpilot-api/1.0"}, timeout=10) response.raise_for_status() return response.json().get("dsn", "") except Exception: @@ -246,7 +246,7 @@ def is_url_pingable(url): if not hasattr(is_url_pingable, "session"): is_url_pingable.session = requests.Session() - is_url_pingable.session.headers.update({"User-Agent": "frogpilot-ping-test/1.0 (https://github.com/FrogAi/FrogPilot)"}) + is_url_pingable.session.headers.update({"User-Agent": "starpilot-ping-test/1.0 (https://github.com/FrogAi/StarPilot)"}) try: response = is_url_pingable.session.head(url, timeout=10, allow_redirects=True) diff --git a/frogpilot/common/frogpilot_variables.py b/starpilot/common/starpilot_variables.py similarity index 95% rename from frogpilot/common/frogpilot_variables.py rename to starpilot/common/starpilot_variables.py index 7260098d..9724e1fb 100644 --- a/frogpilot/common/frogpilot_variables.py +++ b/starpilot/common/starpilot_variables.py @@ -19,7 +19,7 @@ from opendbc.car.hyundai.values import EV_CAR as HYUNDAI_EV_CAR, HyundaiFlags from opendbc.car.interfaces import TORQUE_SUBSTITUTE_PATH, CarInterfaceBase, GearShifter from opendbc.car.mock.values import CAR as MOCK from opendbc.car.subaru.values import SubaruFlags -from opendbc.car.toyota.values import ToyotaFrogPilotFlags +from opendbc.car.toyota.values import ToyotaStarPilotFlags from openpilot.common.basedir import BASEDIR from openpilot.common.constants import CV from openpilot.common.params import Params @@ -43,21 +43,36 @@ THRESHOLD = 1 - 1 / math.e # Requires the condition to be true fo NON_DRIVING_GEARS = [GearShifter.neutral, GearShifter.park, GearShifter.reverse, GearShifter.unknown] -FROGPILOT_API = "https://frogpilot.com/api" +# Temporary fallback until StarPilot hosts its own weather-compatible API. +STARPILOT_API = os.getenv("STARPILOT_API", "https://frogpilot.com/api") LEGACY_CARMODEL_MIGRATIONS = { "CHEVROLET_BOLT_CC_2019_2021": "CHEVROLET_BOLT_CC_2018_2021", } +LEGACY_STARPILOT_PARAM_RENAMES = { + "FrogPilotApiToken": "StarPilotApiToken", + "FrogPilotCarParams": "StarPilotCarParams", + "FrogPilotCarParamsPersistent": "StarPilotCarParamsPersistent", + "FrogPilotDongleId": "StarPilotDongleId", + "FrogPilotStats": "StarPilotStats", +} + +LEGACY_STARPILOT_STATS_KEY_RENAMES = { + "FrogPilotDrives": "StarPilotDrives", + "FrogPilotMeters": "StarPilotMeters", + "FrogPilotSeconds": "StarPilotSeconds", +} + RESOURCES_REPO = os.getenv("STARPILOT_RESOURCES_REPO", "firestar5683/StarPilot-Resources") -ACTIVE_THEME_PATH = Path(BASEDIR) / "frogpilot/assets/active_theme" -METADATAS_PATH = Path(BASEDIR) / "frogpilot/assets/model_metadata" -RANDOM_EVENTS_PATH = Path(BASEDIR) / "frogpilot/assets/random_events" -STOCK_THEME_PATH = Path(BASEDIR) / "frogpilot/assets/stock_theme" +ACTIVE_THEME_PATH = Path(BASEDIR) / "starpilot/assets/active_theme" +METADATAS_PATH = Path(BASEDIR) / "starpilot/assets/model_metadata" +RANDOM_EVENTS_PATH = Path(BASEDIR) / "starpilot/assets/random_events" +STOCK_THEME_PATH = Path(BASEDIR) / "starpilot/assets/stock_theme" THEME_COLORS_PATH = (ACTIVE_THEME_PATH / "colors/colors.json") if HARDWARE.get_device_type() == "pc": - _FP_PC_ROOT = Path(Paths.comma_home()) / "frogpilot" + _FP_PC_ROOT = Path(Paths.comma_home()) / "starpilot" _FP_DATA_ROOT = _FP_PC_ROOT / "data" _FP_CACHE_ROOT = _FP_PC_ROOT / "cache" _FP_PERSIST_ROOT = Path(Paths.persist_root()) @@ -74,7 +89,7 @@ SCREEN_RECORDINGS_PATH = _FP_DATA_ROOT / "media/screen_recordings" VIDEO_CACHE_PATH = _FP_DATA_ROOT / "video_cache" BACKUP_PATH = _FP_CACHE_ROOT / "on_backup" -FROGPILOT_BACKUPS = _FP_DATA_ROOT / "backups" +STARPILOT_BACKUPS = _FP_DATA_ROOT / "backups" TOGGLE_BACKUPS = _FP_DATA_ROOT / "toggle_backups" FROGS_GO_MOO_PATH = _FP_PERSIST_ROOT / "frogsgomoo.py" @@ -87,7 +102,7 @@ KONIK_PATH = _FP_CACHE_ROOT / "use_konik" MAPS_PATH = _FP_DATA_ROOT / "media/0/osm/offline" -NNFF_MODELS_PATH = Path(BASEDIR) / "frogpilot/assets/nnff_models" +NNFF_MODELS_PATH = Path(BASEDIR) / "starpilot/assets/nnff_models" BUTTON_FUNCTIONS = { "NOTHING": 0, @@ -166,7 +181,7 @@ EXCLUDED_KEYS = { "CommunityFavorites", "CurvatureData", "ExperimentalLongitudinalEnabled", - "FrogPilotCarParamsPersistent", + "StarPilotCarParamsPersistent", "KonikMinutes", "LastUpdateTime", "MapBoxRequests", @@ -196,7 +211,7 @@ TUNING_LEVELS = { "DEVELOPER": 3 } -# Shared params handles for modules that import these from frogpilot_variables. +# Shared params handles for modules that import these from starpilot_variables. params = Params(return_defaults=True) params_memory = Params(memory=True) @@ -236,48 +251,48 @@ def normalize_legacy_car_model(car_model): normalized = LEGACY_CARMODEL_MIGRATIONS.get(car_model, car_model) return normalized -def get_frogpilot_toggles(sm=messaging.SubMaster(["frogpilotPlan"])): - toggles = process_frogpilot_toggles(sm["frogpilotPlan"].frogpilotToggles) +def get_starpilot_toggles(sm=messaging.SubMaster(["starpilotPlan"])): + toggles = process_starpilot_toggles(sm["starpilotPlan"].starpilotToggles) # Force drive-state controls must be authoritative from params so they - # apply immediately even if frogpilotPlan publication is temporarily stale. - if not hasattr(get_frogpilot_toggles, "_params"): - get_frogpilot_toggles._params = Params(return_defaults=True) + # apply immediately even if starpilotPlan publication is temporarily stale. + if not hasattr(get_starpilot_toggles, "_params"): + get_starpilot_toggles._params = Params(return_defaults=True) - toggles.force_offroad = get_frogpilot_toggles._params.get_bool("ForceOffroad") - toggles.force_onroad = get_frogpilot_toggles._params.get_bool("ForceOnroad") + toggles.force_offroad = get_starpilot_toggles._params.get_bool("ForceOffroad") + toggles.force_onroad = get_starpilot_toggles._params.get_bool("ForceOnroad") return toggles @cache -def process_frogpilot_toggles(toggles): +def process_starpilot_toggles(toggles): if toggles: return SimpleNamespace(**json.loads(toggles)) - return FrogPilotVariables().frogpilot_toggles + return StarPilotVariables().starpilot_toggles -def update_frogpilot_toggles(): - if not hasattr(update_frogpilot_toggles, "_params_memory"): - update_frogpilot_toggles._params_memory = Params(memory=True) +def update_starpilot_toggles(): + if not hasattr(update_starpilot_toggles, "_params_memory"): + update_starpilot_toggles._params_memory = Params(memory=True) - update_frogpilot_toggles._params_memory.put_bool("FrogPilotTogglesUpdated", True) + update_starpilot_toggles._params_memory.put_bool("StarPilotTogglesUpdated", True) -class FrogPilotVariables: +class StarPilotVariables: def __init__(self): self.params = Params(return_defaults=True) self.params_raw = Params() self.params_memory = Params(memory=True) - self.frogpilot_toggles = SimpleNamespace() - toggle = self.frogpilot_toggles + self.starpilot_toggles = SimpleNamespace() + toggle = self.starpilot_toggles self.default_values = {key.decode(): self.params.get_default_value(key) for key in self.params.all_keys()} self.tuning_levels = {key.decode(): self.params.get_tuning_level(key) for key in self.params.all_keys()} branch = get_build_metadata().channel - self.development_branch = branch == "FrogPilot-Development" - self.release_branch = branch == "FrogPilot" - self.staging_branch = branch == "FrogPilot-Staging" - self.testing_branch = branch == "FrogPilot-Testing" - self.vetting_branch = branch == "FrogPilot-Vetting" + self.development_branch = branch == "StarPilot-Development" + self.release_branch = branch == "StarPilot" + self.staging_branch = branch == "StarPilot-Staging" + self.testing_branch = branch == "StarPilot-Testing" + self.vetting_branch = branch == "StarPilot-Vetting" 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 @@ -325,7 +340,7 @@ class FrogPilotVariables: return "#FFFFFFFF" def get_value(self, key, cast=bool, condition=True, conversion=None, default=None, min=None, max=None): - if not condition or (self.frogpilot_toggles.tuning_level < self.tuning_levels.get(key, 0)): + if not condition or (self.starpilot_toggles.tuning_level < self.tuning_levels.get(key, 0)): if default is not None: value = default elif cast is bool: @@ -392,7 +407,7 @@ class FrogPilotVariables: self.params.put_float(stock_key, live_value) def update(self, holiday_theme="stock", started=False): - toggle = self.frogpilot_toggles + toggle = self.starpilot_toggles toggle.tuning_level = self.params.get("TuningLevel") if self.params.get_bool("TuningLevelConfirmed") else TUNING_LEVELS["ADVANCED"] fallback_platform = GM_CAR.CHEVROLET_BOLT_ACC_2022_2023 if HARDWARE.get_device_type() == "pc" else MOCK.MOCK @@ -411,11 +426,11 @@ class FrogPilotVariables: CarInterfaceBase.configure_torque_tune(car_platform, CP_builder.lateralTuning) CP = CP_builder.as_reader() - fpmsg_bytes = self.params.get("FrogPilotCarParams" if started else "FrogPilotCarParamsPersistent", block=started) + fpmsg_bytes = self.params.get("StarPilotCarParams" if started else "StarPilotCarParamsPersistent", block=started) if fpmsg_bytes: - FPCP = messaging.log_from_bytes(fpmsg_bytes, custom.FrogPilotCarParams) + FPCP = messaging.log_from_bytes(fpmsg_bytes, custom.StarPilotCarParams) else: - FPCP = interfaces[car_platform].get_frogpilot_params(car_platform, gen_empty_fingerprint(), [], CP, toggle) + FPCP = interfaces[car_platform].get_starpilot_params(car_platform, gen_empty_fingerprint(), [], CP, toggle) alpha_longitudinal = CP.alphaLongitudinalAvailable toggle.car_make = CP.brand @@ -427,9 +442,9 @@ class FrogPilotVariables: has_nnff = nnff_supported(toggle.car_model) toggle.has_pedal = CP.enableGasInterceptorDEPRECATED has_radar = not CP.radarUnavailable - toggle.has_sdsu = toggle.car_make == "toyota" and bool(FPCP.flags & ToyotaFrogPilotFlags.SMART_DSU.value) + toggle.has_sdsu = toggle.car_make == "toyota" and bool(FPCP.flags & ToyotaStarPilotFlags.SMART_DSU.value) has_sng = CP.autoResumeSng - toggle.has_zss = toggle.car_make == "toyota" and bool(FPCP.flags & ToyotaFrogPilotFlags.ZSS.value) + toggle.has_zss = toggle.car_make == "toyota" and bool(FPCP.flags & ToyotaStarPilotFlags.ZSS.value) is_angle_car = CP.steerControlType == car.CarParams.SteerControlType.angle latAccelFactor = CP.lateralTuning.torque.latAccelFactor toggle.lkas_allowed_for_aol = toggle.car_make == "hyundai" and bool(CP.flags & HyundaiFlags.CANFD or CP.flags & HyundaiFlags.HAS_LDA_BUTTON) @@ -910,5 +925,5 @@ class FrogPilotVariables: toggle.volt_sng = self.get_value("VoltSNG", condition=toggle.car_model == "CHEVROLET_VOLT") - process_frogpilot_toggles.cache_clear() - self.params_memory.remove("FrogPilotTogglesUpdated") + process_starpilot_toggles.cache_clear() + self.params_memory.remove("StarPilotTogglesUpdated") diff --git a/frogpilot/common/testing_grounds.py b/starpilot/common/testing_grounds.py similarity index 100% rename from frogpilot/common/testing_grounds.py rename to starpilot/common/testing_grounds.py diff --git a/frogpilot/controls/lib/conditional_experimental_mode.py b/starpilot/controls/lib/conditional_experimental_mode.py similarity index 75% rename from frogpilot/controls/lib/conditional_experimental_mode.py rename to starpilot/controls/lib/conditional_experimental_mode.py index 2ce9dfab..2874e69b 100644 --- a/frogpilot/controls/lib/conditional_experimental_mode.py +++ b/starpilot/controls/lib/conditional_experimental_mode.py @@ -6,7 +6,7 @@ from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.realtime import DT_MDL from openpilot.common.constants import CV -from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, THRESHOLD, params_memory +from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, THRESHOLD, params_memory CEStatus = { "OFF": 0, # Off @@ -64,8 +64,8 @@ class ConditionalExperimentalMode: """Get parameter value based on current speed using smooth interpolation between breakpoints [0, 35, 55, 70]""" return interp(speed_mph, [0, 35, 55, 70], param_array) - def __init__(self, FrogPilotPlanner): - self.frogpilot_planner = FrogPilotPlanner + def __init__(self, StarPilotPlanner): + self.starpilot_planner = StarPilotPlanner # Faster filters with hysteresis for better responsiveness self.curvature_filter = FirstOrderFilter(0, self.FILTER_TIME_CURVE, DT_MDL) @@ -80,18 +80,18 @@ class ConditionalExperimentalMode: self.mode_hold_until = 0.0 self.mode_false_since = 0.0 - def update(self, v_ego, sm, frogpilot_toggles): + def update(self, v_ego, sm, starpilot_toggles): now = time.monotonic() - if frogpilot_toggles.experimental_mode_via_press: + if starpilot_toggles.experimental_mode_via_press: self.status_value = params_memory.get_int("CEStatus") else: self.status_value = CEStatus["OFF"] if self.status_value not in (CEStatus["USER_DISABLED"], CEStatus["USER_OVERRIDDEN"]) and not sm["carState"].standstill: - self.update_conditions(v_ego, sm, frogpilot_toggles) + self.update_conditions(v_ego, sm, starpilot_toggles) - triggered = self.check_conditions(v_ego, sm, frogpilot_toggles) + triggered = self.check_conditions(v_ego, sm, starpilot_toggles) if triggered: self.mode_hold_until = now + self.CEM_TRANSITION_GUARD_TIME self.mode_false_since = 0.0 @@ -108,58 +108,58 @@ class ConditionalExperimentalMode: self.mode_hold_until = 0.0 self.mode_false_since = 0.0 self.experimental_mode = (self.status_value == CEStatus["USER_OVERRIDDEN"] or - (sm["carState"].standstill and self.experimental_mode and self.frogpilot_planner.model_stopped)) + (sm["carState"].standstill and self.experimental_mode and self.starpilot_planner.model_stopped)) self.stop_light_detected &= self.status_value not in (CEStatus["USER_DISABLED"], CEStatus["USER_OVERRIDDEN"]) self.stop_light_filter.x = 0 - 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 + def check_conditions(self, v_ego, sm, starpilot_toggles): + below_speed = starpilot_toggles.conditional_limit > v_ego >= 1 and not self.starpilot_planner.starpilot_following.following_lead + below_speed_with_lead = starpilot_toggles.conditional_limit_lead > v_ego >= 1 and self.starpilot_planner.starpilot_following.following_lead if below_speed or below_speed_with_lead: self.status_value = CEStatus["SPEED"] return True - 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 (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and not lane_available: + desired_lane = self.starpilot_planner.lane_width_left if sm["carState"].leftBlinker else self.starpilot_planner.lane_width_right + lane_available = desired_lane >= starpilot_toggles.lane_detection_width or not starpilot_toggles.conditional_signal_lane_detection + if v_ego < starpilot_toggles.conditional_signal and (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and not lane_available: self.status_value = CEStatus["SIGNAL"] 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): + if starpilot_toggles.conditional_curves and self.curve_detected and (starpilot_toggles.conditional_curves_lead or not self.starpilot_planner.starpilot_following.following_lead): self.status_value = CEStatus["CURVATURE"] return True - if frogpilot_toggles.conditional_lead and self.slow_lead_detected and v_ego <= 35.31: + if starpilot_toggles.conditional_lead and self.slow_lead_detected and v_ego <= 35.31: self.status_value = CEStatus["LEAD"] return True - if frogpilot_toggles.conditional_model_stop_time != 0 and self.stop_light_detected: + if starpilot_toggles.conditional_model_stop_time != 0 and self.stop_light_detected: self.status_value = CEStatus["STOP_LIGHT"] return True - if self.frogpilot_planner.frogpilot_vcruise.slc.experimental_mode: + if self.starpilot_planner.starpilot_vcruise.slc.experimental_mode: self.status_value = CEStatus["SPEED_LIMIT"] return True return False - def update_conditions(self, v_ego, sm, frogpilot_toggles): - self.curve_detection(v_ego, frogpilot_toggles) - self.slow_lead(frogpilot_toggles, v_ego) - self.stop_sign_and_light(v_ego, sm, frogpilot_toggles.conditional_model_stop_time) + def update_conditions(self, v_ego, sm, starpilot_toggles): + self.curve_detection(v_ego, starpilot_toggles) + self.slow_lead(starpilot_toggles, v_ego) + self.stop_sign_and_light(v_ego, sm, starpilot_toggles.conditional_model_stop_time) - def curve_detection(self, v_ego, frogpilot_toggles): - self.curvature_filter.update(self.frogpilot_planner.road_curvature_detected or self.frogpilot_planner.driving_in_curve) + def curve_detection(self, v_ego, starpilot_toggles): + self.curvature_filter.update(self.starpilot_planner.road_curvature_detected or self.starpilot_planner.driving_in_curve) self.curve_detected = bool(self.curvature_filter.x >= THRESHOLD and v_ego > CRUISING_SPEED) - def slow_lead(self, frogpilot_toggles, v_ego): - if self.frogpilot_planner.tracking_lead: - slower_lead = frogpilot_toggles.conditional_slower_lead and self.frogpilot_planner.frogpilot_following.slower_lead - stopped_lead = frogpilot_toggles.conditional_stopped_lead and self.frogpilot_planner.lead_one.vLead < 1 + def slow_lead(self, starpilot_toggles, v_ego): + if self.starpilot_planner.tracking_lead: + slower_lead = starpilot_toggles.conditional_slower_lead and self.starpilot_planner.starpilot_following.slower_lead + stopped_lead = starpilot_toggles.conditional_stopped_lead and self.starpilot_planner.lead_one.vLead < 1 lead_threshold = scale_threshold(v_ego) # Adjust threshold based on lead probability for vision-only accuracy - lead_prob = getattr(self.frogpilot_planner.lead_one, 'modelProb', 1.0) + lead_prob = getattr(self.starpilot_planner.lead_one, 'modelProb', 1.0) adjusted_threshold = lead_threshold * (1.0 + 0.2 * (1.0 - lead_prob)) # Higher threshold for lower confidence self.slow_lead_filter.update(slower_lead or stopped_lead) @@ -169,7 +169,7 @@ class ConditionalExperimentalMode: self.slow_lead_detected = False def stop_sign_and_light(self, v_ego, sm, model_time): - if not sm["frogpilotCarState"].trafficModeEnabled: + if not sm["starpilotCarState"].trafficModeEnabled: speed_mph = v_ego * CV.MS_TO_MPH # Convert m/s to mph # Interp for smooth scaling in 35-45 mph @@ -205,10 +205,10 @@ class ConditionalExperimentalMode: if cap_factor > 0: adjusted_model_time = min(adjusted_model_time, self.LIGHT_MAX_TIME * cap_factor + model_time * (1 - cap_factor)) # Gradual cap - model_stopping = self.frogpilot_planner.model_length < v_ego * adjusted_model_time + model_stopping = self.starpilot_planner.model_length < v_ego * adjusted_model_time - self.stop_light_filter.update(self.frogpilot_planner.model_stopped or model_stopping) - self.stop_light_detected = bool(self.stop_light_filter.x >= THRESHOLD**2 and not self.frogpilot_planner.tracking_lead) + self.stop_light_filter.update(self.starpilot_planner.model_stopped or model_stopping) + self.stop_light_detected = bool(self.stop_light_filter.x >= THRESHOLD**2 and not self.starpilot_planner.tracking_lead) else: self.stop_light_filter.x = 0 self.stop_light_detected = False diff --git a/frogpilot/controls/lib/curve_speed_controller.py b/starpilot/controls/lib/curve_speed_controller.py similarity index 76% rename from frogpilot/controls/lib/curve_speed_controller.py rename to starpilot/controls/lib/curve_speed_controller.py index 0c3f1e9a..93195cac 100644 --- a/frogpilot/controls/lib/curve_speed_controller.py +++ b/starpilot/controls/lib/curve_speed_controller.py @@ -5,7 +5,7 @@ import numpy as np from openpilot.common.realtime import DT_MDL -from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, DEFAULT_LATERAL_ACCELERATION, PLANNER_TIME +from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, DEFAULT_LATERAL_ACCELERATION, PLANNER_TIME CALIBRATION_PROGRESS_THRESHOLD = 10 / DT_MDL MAX_CURVATURE = 0.1 @@ -15,15 +15,15 @@ ROUNDING_PRECISION = 3 STEP = 0.001 class CurveSpeedController: - def __init__(self, FrogPilotVCruise): - self.frogpilot_planner = FrogPilotVCruise.frogpilot_planner + def __init__(self, StarPilotVCruise): + self.starpilot_planner = StarPilotVCruise.starpilot_planner self.enable_training = False self.target_set = False self.training_timer = 0 - curvature_data_raw = self.frogpilot_planner.params.get("CurvatureData", encoding="utf-8") + curvature_data_raw = self.starpilot_planner.params.get("CurvatureData", encoding="utf-8") try: self.curvature_data = json.loads(curvature_data_raw or "{}") except (TypeError, ValueError): @@ -44,15 +44,15 @@ class CurveSpeedController: def log_data(self, long_control_active, v_ego, sm): self.enable_training = v_ego > CRUISING_SPEED - self.enable_training &= not self.frogpilot_planner.tracking_lead + self.enable_training &= not self.starpilot_planner.tracking_lead self.enable_training &= not long_control_active if self.enable_training: self.training_timer += DT_MDL - if self.training_timer >= PLANNER_TIME and self.frogpilot_planner.driving_in_curve and not (sm["carState"].leftBlinker or sm["carState"].rightBlinker): - lateral_acceleration = abs(self.frogpilot_planner.lateral_acceleration) - road_curvature = abs(round(self.frogpilot_planner.road_curvature, ROUNDING_PRECISION)) + if self.training_timer >= PLANNER_TIME and self.starpilot_planner.driving_in_curve and not (sm["carState"].leftBlinker or sm["carState"].rightBlinker): + lateral_acceleration = abs(self.starpilot_planner.lateral_acceleration) + road_curvature = abs(round(self.starpilot_planner.road_curvature, ROUNDING_PRECISION)) key = str(road_curvature) if key in self.curvature_data: @@ -83,8 +83,8 @@ class CurveSpeedController: total_weight += self.curvature_weights[key] - self.frogpilot_planner.params.put_nonblocking("CalibrationProgress", float(min((progress / total_weight) * 100, 100.0))) - self.frogpilot_planner.params.put_nonblocking("CurvatureData", self.curvature_data) + self.starpilot_planner.params.put_nonblocking("CalibrationProgress", float(min((progress / total_weight) * 100, 100.0))) + self.starpilot_planner.params.put_nonblocking("CurvatureData", self.curvature_data) self.update_lateral_acceleration() self.training_timer = 0 @@ -99,16 +99,16 @@ class CurveSpeedController: else: self.lateral_acceleration = DEFAULT_LATERAL_ACCELERATION - self.frogpilot_planner.params.put_nonblocking("CalibratedLateralAcceleration", self.lateral_acceleration) + self.starpilot_planner.params.put_nonblocking("CalibratedLateralAcceleration", self.lateral_acceleration) def update_target(self, v_ego): lateral_acceleration = self.lateral_acceleration - if self.frogpilot_planner.frogpilot_weather.weather_id != 0: - lateral_acceleration -= self.lateral_acceleration * self.frogpilot_planner.frogpilot_weather.reduce_lateral_acceleration + if self.starpilot_planner.starpilot_weather.weather_id != 0: + lateral_acceleration -= self.lateral_acceleration * self.starpilot_planner.starpilot_weather.reduce_lateral_acceleration if self.target_set: - csc_speed = (lateral_acceleration / abs(self.frogpilot_planner.road_curvature))**0.5 - decel_rate = (v_ego - csc_speed) / self.frogpilot_planner.time_to_curve + csc_speed = (lateral_acceleration / abs(self.starpilot_planner.road_curvature))**0.5 + decel_rate = (v_ego - csc_speed) / self.starpilot_planner.time_to_curve self.target -= decel_rate * DT_MDL self.target = np.clip(self.target, CRUISING_SPEED, csc_speed) diff --git a/frogpilot/controls/lib/neural_network_feedforward.py b/starpilot/controls/lib/neural_network_feedforward.py similarity index 98% rename from frogpilot/controls/lib/neural_network_feedforward.py rename to starpilot/controls/lib/neural_network_feedforward.py index ff07a7dd..207356da 100644 --- a/frogpilot/controls/lib/neural_network_feedforward.py +++ b/starpilot/controls/lib/neural_network_feedforward.py @@ -17,7 +17,7 @@ from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N from openpilot.selfdrive.controls.lib.latcontrol import LatControl from openpilot.selfdrive.modeld.constants import ModelConstants -from openpilot.frogpilot.common.frogpilot_variables import NNFF_MODELS_PATH, get_nnff_model_files, get_nnff_substitutes +from openpilot.starpilot.common.starpilot_variables import NNFF_MODELS_PATH, get_nnff_model_files, get_nnff_substitutes # At higher speeds (25+mph) we can assume: # Lateral acceleration achieved by a specific car correlates to @@ -224,7 +224,7 @@ class LatControlNNFF(LatControl): self.torque_params.latAccelOffset = latAccelOffset self.torque_params.friction = friction - def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, frogpilot_toggles): + def update(self, active, CS, VM, params, steer_limited_by_safety, desired_curvature, curvature_limited, lat_delay, calibrated_pose, model_data, starpilot_toggles): pid_log = log.ControlsState.LateralTorqueState.new_message() if not active: output_torque = 0.0 @@ -244,7 +244,7 @@ class LatControlNNFF(LatControl): setpoint = desired_lateral_accel + low_speed_factor * desired_curvature measurement = actual_lateral_accel + low_speed_factor * actual_curvature gravity_adjusted_lateral_accel = desired_lateral_accel - roll_compensation - if self.nnff_loaded and frogpilot_toggles.nnff or frogpilot_toggles.nnff_lite: + if self.nnff_loaded and starpilot_toggles.nnff or starpilot_toggles.nnff_lite: actual_curvature_rate = -VM.calc_curvature(math.radians(CS.steeringRateDeg), CS.vEgo, 0.0) actual_lateral_jerk = actual_curvature_rate * CS.vEgo ** 2 @@ -271,7 +271,7 @@ class LatControlNNFF(LatControl): lateral_jerk_measurement = 0 lookahead_lateral_jerk = 0 - if self.nnff_loaded and model_good and frogpilot_toggles.nnff: + if self.nnff_loaded and model_good and starpilot_toggles.nnff: # update past data pitch = 0 roll = params.roll diff --git a/frogpilot/controls/lib/speed_limit_controller.py b/starpilot/controls/lib/speed_limit_controller.py similarity index 81% rename from frogpilot/controls/lib/speed_limit_controller.py rename to starpilot/controls/lib/speed_limit_controller.py index a54c81c7..db2e75f5 100644 --- a/frogpilot/controls/lib/speed_limit_controller.py +++ b/starpilot/controls/lib/speed_limit_controller.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# PFEIFER - SLC - Modified by FrogAi for FrogPilot +# PFEIFER - SLC - Modified by FrogAi for StarPilot import calendar import json import numpy as np @@ -10,7 +10,7 @@ from concurrent.futures import ThreadPoolExecutor from openpilot.common.constants import CV from openpilot.common.realtime import DT_MDL -from openpilot.frogpilot.common.frogpilot_utilities import calculate_bearing_offset, is_url_pingable +from openpilot.starpilot.common.starpilot_utilities import calculate_bearing_offset, is_url_pingable FREE_MAPBOX_REQUESTS = 100_000 @@ -35,9 +35,9 @@ OFFSET_MAP_METRIC = [ ] class SpeedLimitController: - def __init__(self, FrogPilotVCruise): - self.frogpilot_planner = FrogPilotVCruise.frogpilot_planner - self.frogpilot_toggles = None + def __init__(self, StarPilotVCruise): + self.starpilot_planner = StarPilotVCruise.starpilot_planner + self.starpilot_toggles = None self.calling_mapbox = False self.override_slc = False @@ -55,7 +55,7 @@ class SpeedLimitController: self.previous_source = "None" self.source = "None" - mapbox_requests_raw = self.frogpilot_planner.params.get("MapBoxRequests", encoding="utf-8") + mapbox_requests_raw = self.starpilot_planner.params.get("MapBoxRequests", encoding="utf-8") try: self.mapbox_requests = json.loads(mapbox_requests_raw or "{}") except (TypeError, ValueError): @@ -64,29 +64,29 @@ class SpeedLimitController: self.mapbox_requests.setdefault("max_requests", FREE_MAPBOX_REQUESTS - (28 * 100)) self.mapbox_host = "https://api.mapbox.com" - self.mapbox_token = self.frogpilot_planner.params.get("MapboxSecretKey", encoding="utf-8") + self.mapbox_token = self.starpilot_planner.params.get("MapboxSecretKey", encoding="utf-8") - self.previous_target = self.frogpilot_planner.params.get_float("PreviousSpeedLimit") + self.previous_target = self.starpilot_planner.params.get_float("PreviousSpeedLimit") self.executor = ThreadPoolExecutor(max_workers=1) self.session = requests.Session() self.session.headers.update({"Accept-Language": "en"}) - self.session.headers.update({"User-Agent": "frogpilot-mapbox-speed-limit-retriever/1.0 (https://github.com/FrogAi/FrogPilot)"}) + self.session.headers.update({"User-Agent": "starpilot-mapbox-speed-limit-retriever/1.0 (https://github.com/FrogAi/StarPilot)"}) @property def experimental_mode(self): - return self.target == 0 and bool(getattr(self.frogpilot_toggles, "slc_fallback_experimental_mode", False)) + return self.target == 0 and bool(getattr(self.starpilot_toggles, "slc_fallback_experimental_mode", False)) @property def offset(self): - if self.frogpilot_toggles is None: + if self.starpilot_toggles is None: return 0 - offset_map = OFFSET_MAP_METRIC if self.frogpilot_toggles.is_metric else OFFSET_MAP_IMPERIAL - return next((getattr(self.frogpilot_toggles, offset) for low, high, offset in offset_map if low < self.target < high), 0) + offset_map = OFFSET_MAP_METRIC if self.starpilot_toggles.is_metric else OFFSET_MAP_IMPERIAL + return next((getattr(self.starpilot_toggles, offset) for low, high, offset in offset_map if low < self.target < high), 0) def get_mapbox_speed_limit(self, now, time_validated, v_ego, sm): - if not self.frogpilot_planner.gps_valid or not self.mapbox_token or (sm["carState"].steeringAngleDeg - sm["liveParameters"].angleOffsetDeg) >= 45: + if not self.starpilot_planner.gps_valid or not self.mapbox_token or (sm["carState"].steeringAngleDeg - sm["liveParameters"].angleOffsetDeg) >= 45: self.mapbox_limit = 0 self.segment_distance = 0 return @@ -122,11 +122,11 @@ class SpeedLimitController: }) self.mapbox_requests["total_requests"] += 1 - self.frogpilot_planner.params.put_nonblocking("MapBoxRequests", self.mapbox_requests) + self.starpilot_planner.params.put_nonblocking("MapBoxRequests", self.mapbox_requests) - current_bearing = self.frogpilot_planner.gps_position.get("bearing") - current_latitude = self.frogpilot_planner.gps_position.get("latitude") - current_longitude = self.frogpilot_planner.gps_position.get("longitude") + current_bearing = self.starpilot_planner.gps_position.get("bearing") + current_latitude = self.starpilot_planner.gps_position.get("latitude") + current_longitude = self.starpilot_planner.gps_position.get("longitude") future_latitude, future_longitude = calculate_bearing_offset(current_latitude, current_longitude, current_bearing, v_ego) @@ -209,8 +209,8 @@ class SpeedLimitController: 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 self.frogpilot_planner.params_memory.get_bool("SpeedLimitAccepted") - speed_limit_denied = sm["frogpilotCarState"].decelPressed or (self.speed_limit_changed_timer >= 30) + speed_limit_accepted = (sm["starpilotCarState"].accelPressed and sm["carControl"].longActive) or self.starpilot_planner.params_memory.get_bool("SpeedLimitAccepted") + speed_limit_denied = sm["starpilotCarState"].decelPressed or (self.speed_limit_changed_timer >= 30) if speed_limit_accepted: self.overridden_speed = 0 @@ -218,7 +218,7 @@ class SpeedLimitController: self.source = desired_source self.target = desired_target - self.frogpilot_planner.params_memory.remove("SpeedLimitAccepted") + self.starpilot_planner.params_memory.remove("SpeedLimitAccepted") elif speed_limit_denied: self.denied_target = desired_target @@ -226,11 +226,11 @@ class SpeedLimitController: self.previous_source = desired_source self.previous_target = desired_target - elif desired_target < self.target and not self.frogpilot_toggles.speed_limit_confirmation_lower: + elif desired_target < self.target and not self.starpilot_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: + elif desired_target > self.target and not self.starpilot_toggles.speed_limit_confirmation_higher: self.source = desired_source self.target = desired_target @@ -244,7 +244,7 @@ class SpeedLimitController: self.previous_source = self.source self.previous_target = self.target - self.frogpilot_planner.params.put_nonblocking("PreviousSpeedLimit", self.target) + self.starpilot_planner.params.put_nonblocking("PreviousSpeedLimit", self.target) def update_limits(self, dashboard_speed_limit, now, time_validated, v_cruise, v_ego, sm): self.update_map_speed_limit(v_ego, sm) @@ -255,18 +255,18 @@ class SpeedLimitController: } filtered_limits = {source: limit for source, limit in limits.items() if limit >= 1} - if self.frogpilot_toggles.speed_limit_priority_highest: + if self.starpilot_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: + elif self.starpilot_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.starpilot_toggles.speed_limit_priority1, + self.starpilot_toggles.speed_limit_priority2 ]: if priority in filtered_limits: desired_source = priority @@ -281,7 +281,7 @@ class SpeedLimitController: desired_target = 0 if desired_target == 0 or self.target == 0: - if self.mapbox_requests["total_requests"] < self.mapbox_requests["max_requests"] and self.frogpilot_toggles.slc_mapbox_filler: + if self.mapbox_requests["total_requests"] < self.mapbox_requests["max_requests"] and self.starpilot_toggles.slc_mapbox_filler: self.get_mapbox_speed_limit(now, time_validated, v_ego, sm) if self.mapbox_limit >= 1: @@ -289,13 +289,13 @@ class SpeedLimitController: desired_target = self.mapbox_limit if desired_target == 0 or self.target == 0: - if self.denied_target != self.previous_target > 0 and self.frogpilot_toggles.slc_fallback_previous_speed_limit: + if self.denied_target != self.previous_target > 0 and self.starpilot_toggles.slc_fallback_previous_speed_limit: desired_source = self.previous_source desired_target = self.previous_target self.target = desired_target - elif sm["selfdriveState"].enabled and self.frogpilot_toggles.slc_fallback_set_speed: + elif sm["selfdriveState"].enabled and self.starpilot_toggles.slc_fallback_set_speed: desired_source = "None" desired_target = v_cruise else: @@ -316,9 +316,9 @@ class SpeedLimitController: if self.next_speed_limit > 0: if self.map_speed_limit < self.next_speed_limit: - max_lookahead = self.frogpilot_toggles.map_speed_lookahead_higher * v_ego + max_lookahead = self.starpilot_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 + max_lookahead = self.starpilot_toggles.map_speed_lookahead_lower * v_ego else: max_lookahead = 0 @@ -331,11 +331,11 @@ class SpeedLimitController: self.override_slc &= sm["selfdriveState"].enabled if self.override_slc: - if self.frogpilot_toggles.speed_limit_controller_override_manual: + if self.starpilot_toggles.speed_limit_controller_override_manual: if sm["carState"].gasPressed: self.overridden_speed = max(v_ego + v_ego_diff, self.overridden_speed) self.overridden_speed = float(np.clip(self.overridden_speed, self.target + self.offset, v_cruise + v_cruise_diff)) - elif self.frogpilot_toggles.speed_limit_controller_override_set_speed: + elif self.starpilot_toggles.speed_limit_controller_override_set_speed: self.overridden_speed = v_cruise + v_cruise_diff self.source = "None" diff --git a/frogpilot/controls/lib/frogpilot_acceleration.py b/starpilot/controls/lib/starpilot_acceleration.py similarity index 79% rename from frogpilot/controls/lib/frogpilot_acceleration.py rename to starpilot/controls/lib/starpilot_acceleration.py index bcebf682..c3261287 100644 --- a/frogpilot/controls/lib/frogpilot_acceleration.py +++ b/starpilot/controls/lib/starpilot_acceleration.py @@ -4,7 +4,7 @@ import numpy as np from opendbc.car.interfaces import ACCEL_MIN from openpilot.selfdrive.controls.lib.longitudinal_planner import get_max_accel -from openpilot.frogpilot.common.frogpilot_variables import CITY_SPEED_LIMIT +from openpilot.starpilot.common.starpilot_variables import CITY_SPEED_LIMIT def cubic_interp(x, xp, fp): """Cubic interpolation using NumPy's native operations for speed.""" @@ -110,57 +110,57 @@ def get_max_allowed_accel(v_ego, ev_tuning=True, truck_tuning=False): return float(akima_interp(v_ego, A_CRUISE_MAX_BP_CUSTOM, A_CRUISE_MAX_VALS_SPORT_PLUS_TRUCK)) return float(akima_interp(v_ego, [0., 5., 20.], [4.0, 4.0, 2.0])) # ISO 15622:2018 -class FrogPilotAcceleration: - def __init__(self, FrogPilotPlanner): - self.frogpilot_planner = FrogPilotPlanner +class StarPilotAcceleration: + def __init__(self, StarPilotPlanner): + self.starpilot_planner = StarPilotPlanner self.max_accel = 0 self.min_accel = 0 - def update(self, v_ego, sm, frogpilot_toggles): - eco_gear = sm["frogpilotCarState"].ecoGear - sport_gear = sm["frogpilotCarState"].sportGear - ev_tuning = getattr(frogpilot_toggles, "ev_tuning", True) - truck_tuning = getattr(frogpilot_toggles, "truck_tuning", False) + def update(self, v_ego, sm, starpilot_toggles): + eco_gear = sm["starpilotCarState"].ecoGear + sport_gear = sm["starpilotCarState"].sportGear + ev_tuning = getattr(starpilot_toggles, "ev_tuning", True) + truck_tuning = getattr(starpilot_toggles, "truck_tuning", False) - if sm["frogpilotCarState"].trafficModeEnabled: + if sm["starpilotCarState"].trafficModeEnabled: self.max_accel = get_max_accel_standard(v_ego, ev_tuning, truck_tuning) - elif frogpilot_toggles.map_acceleration and (eco_gear or sport_gear): + elif starpilot_toggles.map_acceleration and (eco_gear or sport_gear): if eco_gear: self.max_accel = get_max_accel_eco(v_ego, ev_tuning, truck_tuning) else: - if frogpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["SPORT"]: + if starpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["SPORT"]: self.max_accel = get_max_accel_sport(v_ego, ev_tuning, truck_tuning) else: self.max_accel = get_max_allowed_accel(v_ego, ev_tuning, truck_tuning) else: - if frogpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["ECO"]: + if starpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["ECO"]: self.max_accel = get_max_accel_eco(v_ego, ev_tuning, truck_tuning) - elif frogpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["SPORT"]: + elif starpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["SPORT"]: self.max_accel = get_max_accel_sport(v_ego, ev_tuning, truck_tuning) - elif frogpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["SPORT_PLUS"]: + elif starpilot_toggles.acceleration_profile == ACCELERATION_PROFILES["SPORT_PLUS"]: self.max_accel = get_max_allowed_accel(v_ego, ev_tuning, truck_tuning) else: self.max_accel = get_max_accel_standard(v_ego, ev_tuning, truck_tuning) - if frogpilot_toggles.human_acceleration: - 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 starpilot_toggles.human_acceleration: + self.max_accel = min(get_max_accel_low_speeds(self.max_accel, self.starpilot_planner.v_cruise), self.max_accel) + self.max_accel = min(get_max_accel_ramp_off(self.max_accel, self.starpilot_planner.v_cruise, v_ego), self.max_accel) - if self.frogpilot_planner.frogpilot_weather.weather_id != 0: - self.max_accel -= self.max_accel * self.frogpilot_planner.frogpilot_weather.reduce_acceleration + if self.starpilot_planner.starpilot_weather.weather_id != 0: + self.max_accel -= self.max_accel * self.starpilot_planner.starpilot_weather.reduce_acceleration - if sm["frogpilotCarState"].forceCoast: + if sm["starpilotCarState"].forceCoast: self.min_accel = A_CRUISE_MIN_ECO - elif frogpilot_toggles.map_deceleration and (eco_gear or sport_gear): + elif starpilot_toggles.map_deceleration and (eco_gear or sport_gear): if eco_gear: self.min_accel = A_CRUISE_MIN_ECO else: self.min_accel = A_CRUISE_MIN_SPORT else: - if frogpilot_toggles.deceleration_profile == DECELERATION_PROFILES["ECO"]: + if starpilot_toggles.deceleration_profile == DECELERATION_PROFILES["ECO"]: self.min_accel = A_CRUISE_MIN_ECO - elif frogpilot_toggles.deceleration_profile == DECELERATION_PROFILES["SPORT"]: + elif starpilot_toggles.deceleration_profile == DECELERATION_PROFILES["SPORT"]: self.min_accel = A_CRUISE_MIN_SPORT else: self.min_accel = ACCEL_MIN diff --git a/frogpilot/controls/lib/frogpilot_events.py b/starpilot/controls/lib/starpilot_events.py similarity index 53% rename from frogpilot/controls/lib/frogpilot_events.py rename to starpilot/controls/lib/starpilot_events.py index 2b5f3599..94c48256 100644 --- a/frogpilot/controls/lib/frogpilot_events.py +++ b/starpilot/controls/lib/starpilot_events.py @@ -4,23 +4,23 @@ import random from openpilot.common.constants import ACCELERATION_DUE_TO_GRAVITY, CV from openpilot.common.realtime import DT_MDL from openpilot.selfdrive.controls.lib.desire_helper import TurnDirection -from openpilot.selfdrive.selfdrived.events import ET, EVENT_NAME, FROGPILOT_EVENT_NAME, EventName, FrogPilotEventName, Events +from openpilot.selfdrive.selfdrived.events import ET, EVENT_NAME, STARPILOT_EVENT_NAME, EventName, StarPilotEventName, Events -from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, NON_DRIVING_GEARS +from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, NON_DRIVING_GEARS DEJA_VU_G_FORCE = 0.75 RANDOM_EVENTS_CHANCE = 0.01 * DT_MDL RANDOM_EVENTS_LENGTH = 5 -RANDOM_EVENT_START = FrogPilotEventName.accel30 -RANDOM_EVENT_END = FrogPilotEventName.youveGotMail +RANDOM_EVENT_START = StarPilotEventName.accel30 +RANDOM_EVENT_END = StarPilotEventName.youveGotMail -class FrogPilotEvents: - def __init__(self, FrogPilotPlanner, error_log, ThemeManager): - self.frogpilot_planner = FrogPilotPlanner +class StarPilotEvents: + def __init__(self, StarPilotPlanner, error_log, ThemeManager): + self.starpilot_planner = StarPilotPlanner self.theme_manager = ThemeManager - self.events = Events(frogpilot=True) + self.events = Events(starpilot=True) self.always_on_lateral_enabled_previously = False self.previous_traffic_mode = False @@ -36,11 +36,11 @@ class FrogPilotEvents: self.error_log = error_log - def update(self, long_control_active, v_cruise, sm, frogpilot_toggles): + def update(self, long_control_active, v_cruise, sm, starpilot_toggles): current_alert = sm["selfdriveState"].alertType - current_frogpilot_alert = sm["selfdriveState"].alertType + current_starpilot_alert = sm["selfdriveState"].alertType - alerts_empty = all(sm[state].alertText1 == "" and sm[state].alertText2 == "" for state in ["selfdriveState", "frogpilotSelfdriveState"]) + alerts_empty = all(sm[state].alertText1 == "" and sm[state].alertText2 == "" for state in ["selfdriveState", "starpilotSelfdriveState"]) self.events.clear() @@ -51,78 +51,78 @@ class FrogPilotEvents: else: self.max_acceleration = 0 - if self.frogpilot_planner.frogpilot_vcruise.forcing_stop: - self.events.add(FrogPilotEventName.forcingStop) + if self.starpilot_planner.starpilot_vcruise.forcing_stop: + self.events.add(StarPilotEventName.forcingStop) - if not self.frogpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS: - if not self.frogpilot_planner.model_stopped and self.stopped_for_light and frogpilot_toggles.green_light_alert: - self.events.add(FrogPilotEventName.greenLight) + if not self.starpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS: + if not self.starpilot_planner.model_stopped and self.stopped_for_light and starpilot_toggles.green_light_alert: + self.events.add(StarPilotEventName.greenLight) - self.stopped_for_light = self.frogpilot_planner.frogpilot_cem.stop_light_detected + self.stopped_for_light = self.starpilot_planner.starpilot_cem.stop_light_detected else: self.stopped_for_light = False - if "holidayActive" not in self.played_events and self.startup_seen and alerts_empty and len(self.events) == 0 and frogpilot_toggles.current_holiday_theme != "stock": - self.events.add(FrogPilotEventName.holidayActive) + if "holidayActive" not in self.played_events and self.startup_seen and alerts_empty and len(self.events) == 0 and starpilot_toggles.current_holiday_theme != "stock": + self.events.add(StarPilotEventName.holidayActive) - if self.frogpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS: + if self.starpilot_planner.tracking_lead and sm["carState"].standstill and sm["carState"].gearShifter not in NON_DRIVING_GEARS: if self.tracked_lead_distance == 0: - self.tracked_lead_distance = self.frogpilot_planner.lead_one.dRel + self.tracked_lead_distance = self.starpilot_planner.lead_one.dRel - lead_departing = self.frogpilot_planner.lead_one.dRel - self.tracked_lead_distance >= 1 - lead_departing &= self.frogpilot_planner.lead_one.vLead >= 1 + lead_departing = self.starpilot_planner.lead_one.dRel - self.tracked_lead_distance >= 1 + lead_departing &= self.starpilot_planner.lead_one.vLead >= 1 - if lead_departing and frogpilot_toggles.lead_departing_alert: - self.events.add(FrogPilotEventName.leadDeparting) + if lead_departing and starpilot_toggles.lead_departing_alert: + self.events.add(StarPilotEventName.leadDeparting) else: self.tracked_lead_distance = 0 - if "nnffLoaded" not in self.played_events and self.startup_seen and alerts_empty and len(self.events) == 0 and self.frogpilot_planner.params.get("NNFFModelName") is not None and frogpilot_toggles.nnff: - self.events.add(FrogPilotEventName.nnffLoaded) + if "nnffLoaded" not in self.played_events and self.startup_seen and alerts_empty and len(self.events) == 0 and self.starpilot_planner.params.get("NNFFModelName") is not None and starpilot_toggles.nnff: + self.events.add(StarPilotEventName.nnffLoaded) if self.random_event_playing: self.random_event_timer += DT_MDL if self.random_event_timer >= RANDOM_EVENTS_LENGTH: - self.theme_manager.update_wheel_image(frogpilot_toggles.wheel_image) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.theme_manager.update_wheel_image(starpilot_toggles.wheel_image) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) self.random_event_playing = False self.random_event_timer = 0 - if not self.random_event_playing and frogpilot_toggles.random_events: + if not self.random_event_playing and starpilot_toggles.random_events: if "accel30" not in self.played_events and 3.5 > self.max_acceleration >= 3.0 and acceleration < 1.5: - self.events.add(FrogPilotEventName.accel30) + self.events.add(StarPilotEventName.accel30) self.theme_manager.update_wheel_image("accel30", random_event=True) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) self.max_acceleration = 0 elif "accel35" not in self.played_events and 4.0 > self.max_acceleration >= 3.5 and acceleration < 1.5: - self.events.add(FrogPilotEventName.accel35) + self.events.add(StarPilotEventName.accel35) self.theme_manager.update_wheel_image("accel35", random_event=True) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) self.max_acceleration = 0 elif "accel40" not in self.played_events and self.max_acceleration >= 4.0 and acceleration < 1.5: - self.events.add(FrogPilotEventName.accel40) + self.events.add(StarPilotEventName.accel40) self.theme_manager.update_wheel_image("accel40", random_event=True) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) self.max_acceleration = 0 if "dejaVuCurve" not in self.played_events and sm["carState"].vEgo > CRUISING_SPEED: - if self.frogpilot_planner.lateral_acceleration >= DEJA_VU_G_FORCE * ACCELERATION_DUE_TO_GRAVITY: - self.events.add(FrogPilotEventName.dejaVuCurve) + if self.starpilot_planner.lateral_acceleration >= DEJA_VU_G_FORCE * ACCELERATION_DUE_TO_GRAVITY: + self.events.add(StarPilotEventName.dejaVuCurve) - if "hal9000" not in self.played_events and (ET.NO_ENTRY in current_alert or ET.NO_ENTRY in current_frogpilot_alert): - self.events.add(FrogPilotEventName.hal9000) + if "hal9000" not in self.played_events and (ET.NO_ENTRY in current_alert or ET.NO_ENTRY in current_starpilot_alert): + self.events.add(StarPilotEventName.hal9000) - if f"{EVENT_NAME[EventName.steerSaturated]}/" in current_alert or f"{FROGPILOT_EVENT_NAME[FrogPilotEventName.goatSteerSaturated]}/" in current_frogpilot_alert: + if f"{EVENT_NAME[EventName.steerSaturated]}/" in current_alert or f"{STARPILOT_EVENT_NAME[StarPilotEventName.goatSteerSaturated]}/" in current_starpilot_alert: event_choices = [] if "firefoxSteerSaturated" not in self.played_events: event_choices.append("firefoxSteerSaturated") @@ -135,23 +135,23 @@ class FrogPilotEvents: event_choice = random.choice(event_choices) if event_choice == "firefoxSteerSaturated": - self.events.add(FrogPilotEventName.firefoxSteerSaturated) + self.events.add(StarPilotEventName.firefoxSteerSaturated) self.theme_manager.update_wheel_image("firefoxSteerSaturated", random_event=True) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) elif event_choice == "goatSteerSaturated": - self.events.add(FrogPilotEventName.goatSteerSaturated) + self.events.add(StarPilotEventName.goatSteerSaturated) self.theme_manager.update_wheel_image("goatSteerSaturated", random_event=True) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) elif event_choice == "thisIsFineSteerSaturated": - self.events.add(FrogPilotEventName.thisIsFineSteerSaturated) + self.events.add(StarPilotEventName.thisIsFineSteerSaturated) self.theme_manager.update_wheel_image("thisIsFineSteerSaturated", random_event=True) - self.frogpilot_planner.params_memory.put_bool("UpdateWheelImage", True) + self.starpilot_planner.params_memory.put_bool("UpdateWheelImage", True) - if "vCruise69" not in self.played_events and 70 > max(sm["carState"].vCruise, sm["carState"].vCruiseCluster) * (1 if frogpilot_toggles.is_metric else CV.KPH_TO_MPH) >= 69: - self.events.add(FrogPilotEventName.vCruise69) + if "vCruise69" not in self.played_events and 70 > max(sm["carState"].vCruise, sm["carState"].vCruiseCluster) * (1 if starpilot_toggles.is_metric else CV.KPH_TO_MPH) >= 69: + self.events.add(StarPilotEventName.vCruise69) if f"{EVENT_NAME[EventName.fcw]}/" in current_alert or f"{EVENT_NAME[EventName.stockAeb]}/" in current_alert: event_choices = [] @@ -163,39 +163,39 @@ class FrogPilotEvents: if event_choices: event_choice = random.choice(event_choices) if event_choice == "toBeContinued": - self.events.add(FrogPilotEventName.toBeContinued) + self.events.add(StarPilotEventName.toBeContinued) elif event_choice == "yourFrogTriedToKillMe": - self.events.add(FrogPilotEventName.yourFrogTriedToKillMe) + self.events.add(StarPilotEventName.yourFrogTriedToKillMe) - if "youveGotMail" not in self.played_events and sm["frogpilotCarState"].alwaysOnLateralEnabled and not self.always_on_lateral_enabled_previously: + if "youveGotMail" not in self.played_events and sm["starpilotCarState"].alwaysOnLateralEnabled and not self.always_on_lateral_enabled_previously: if random.random() < RANDOM_EVENTS_CHANCE / DT_MDL: - self.events.add(FrogPilotEventName.youveGotMail) + self.events.add(StarPilotEventName.youveGotMail) - self.always_on_lateral_enabled_previously = sm["frogpilotCarState"].alwaysOnLateralEnabled + self.always_on_lateral_enabled_previously = sm["starpilotCarState"].alwaysOnLateralEnabled self.random_event_playing |= bool({event for event in self.events.names if RANDOM_EVENT_START <= event <= RANDOM_EVENT_END}) if self.error_log.is_file(): - if frogpilot_toggles.random_events: - self.events.add(FrogPilotEventName.openpilotCrashedRandomEvent) + if starpilot_toggles.random_events: + self.events.add(StarPilotEventName.openpilotCrashedRandomEvent) else: - self.events.add(FrogPilotEventName.openpilotCrashed) + self.events.add(StarPilotEventName.openpilotCrashed) - if self.frogpilot_planner.frogpilot_vcruise.slc.speed_limit_changed_timer == DT_MDL and frogpilot_toggles.speed_limit_changed_alert: - self.events.add(FrogPilotEventName.speedLimitChanged) + if self.starpilot_planner.starpilot_vcruise.slc.speed_limit_changed_timer == DT_MDL and starpilot_toggles.speed_limit_changed_alert: + self.events.add(StarPilotEventName.speedLimitChanged) - self.startup_seen |= sm["frogpilotSelfdriveState"].alertText1 == frogpilot_toggles.startup_alert_top and sm["frogpilotSelfdriveState"].alertText2 == frogpilot_toggles.startup_alert_bottom + self.startup_seen |= sm["starpilotSelfdriveState"].alertText1 == starpilot_toggles.startup_alert_top and sm["starpilotSelfdriveState"].alertText2 == starpilot_toggles.startup_alert_bottom - if sm["frogpilotCarState"].trafficModeEnabled != self.previous_traffic_mode: + if sm["starpilotCarState"].trafficModeEnabled != self.previous_traffic_mode: if self.previous_traffic_mode: - self.events.add(FrogPilotEventName.trafficModeInactive) + self.events.add(StarPilotEventName.trafficModeInactive) else: - self.events.add(FrogPilotEventName.trafficModeActive) + self.events.add(StarPilotEventName.trafficModeActive) - self.previous_traffic_mode = sm["frogpilotCarState"].trafficModeEnabled + self.previous_traffic_mode = sm["starpilotCarState"].trafficModeEnabled - if sm["frogpilotModelV2"].turnDirection == TurnDirection.turnLeft: - self.events.add(FrogPilotEventName.turningLeft) - elif sm["frogpilotModelV2"].turnDirection == TurnDirection.turnRight: - self.events.add(FrogPilotEventName.turningRight) + if sm["starpilotModelV2"].turnDirection == TurnDirection.turnLeft: + self.events.add(StarPilotEventName.turningLeft) + elif sm["starpilotModelV2"].turnDirection == TurnDirection.turnRight: + self.events.add(StarPilotEventName.turningRight) - self.played_events.update(FROGPILOT_EVENT_NAME[event] for event in self.events.names) + self.played_events.update(STARPILOT_EVENT_NAME[event] for event in self.events.names) diff --git a/frogpilot/controls/lib/frogpilot_following.py b/starpilot/controls/lib/starpilot_following.py similarity index 56% rename from frogpilot/controls/lib/frogpilot_following.py rename to starpilot/controls/lib/starpilot_following.py index 176a4fe8..c5c45d88 100644 --- a/frogpilot/controls/lib/frogpilot_following.py +++ b/starpilot/controls/lib/starpilot_following.py @@ -4,15 +4,15 @@ import numpy as np from openpilot.common.constants import CV from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import COMFORT_BRAKE, LEAD_DANGER_FACTOR, desired_follow_distance, get_jerk_factor, get_T_FOLLOW -from openpilot.frogpilot.common.frogpilot_variables import CITY_SPEED_LIMIT, MAX_T_FOLLOW +from openpilot.starpilot.common.starpilot_variables import CITY_SPEED_LIMIT, MAX_T_FOLLOW TRAFFIC_MODE_BP = [0., CITY_SPEED_LIMIT] PERSONALITY_BP = [45. * CV.MPH_TO_MS, 70. * CV.MPH_TO_MS] HIGHWAY_DISABLE_THROTTLE_MIN_SPEED = 45. * CV.MPH_TO_MS -class FrogPilotFollowing: - def __init__(self, FrogPilotPlanner): - self.frogpilot_planner = FrogPilotPlanner +class StarPilotFollowing: + def __init__(self, StarPilotPlanner): + self.starpilot_planner = StarPilotPlanner self.disable_throttle = False self.following_lead = False @@ -24,38 +24,38 @@ class FrogPilotFollowing: self.speed_jerk = 0 self.t_follow = 0 - def update(self, long_control_active, v_ego, sm, frogpilot_toggles): - if long_control_active and sm["frogpilotCarState"].trafficModeEnabled: + def update(self, long_control_active, v_ego, sm, starpilot_toggles): + if long_control_active and sm["starpilotCarState"].trafficModeEnabled: if sm["carState"].aEgo >= 0: - self.base_acceleration_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_acceleration) - self.base_speed_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_speed) + self.base_acceleration_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, starpilot_toggles.traffic_mode_jerk_acceleration) + self.base_speed_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, starpilot_toggles.traffic_mode_jerk_speed) else: - self.base_acceleration_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_deceleration) - self.base_speed_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_speed_decrease) + self.base_acceleration_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, starpilot_toggles.traffic_mode_jerk_deceleration) + self.base_speed_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, starpilot_toggles.traffic_mode_jerk_speed_decrease) - self.base_danger_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_jerk_danger) - self.t_follow = np.interp(v_ego, TRAFFIC_MODE_BP, frogpilot_toggles.traffic_mode_follow) + self.base_danger_jerk = np.interp(v_ego, TRAFFIC_MODE_BP, starpilot_toggles.traffic_mode_jerk_danger) + self.t_follow = np.interp(v_ego, TRAFFIC_MODE_BP, starpilot_toggles.traffic_mode_follow) elif long_control_active: 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, sm["selfdriveState"].personality + starpilot_toggles.aggressive_jerk_acceleration, starpilot_toggles.aggressive_jerk_danger, starpilot_toggles.aggressive_jerk_speed, + starpilot_toggles.standard_jerk_acceleration, starpilot_toggles.standard_jerk_danger, starpilot_toggles.standard_jerk_speed, + starpilot_toggles.relaxed_jerk_acceleration, starpilot_toggles.relaxed_jerk_danger, starpilot_toggles.relaxed_jerk_speed, + starpilot_toggles.custom_personalities, sm["selfdriveState"].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, sm["selfdriveState"].personality + starpilot_toggles.aggressive_jerk_deceleration, starpilot_toggles.aggressive_jerk_danger, starpilot_toggles.aggressive_jerk_speed_decrease, + starpilot_toggles.standard_jerk_deceleration, starpilot_toggles.standard_jerk_danger, starpilot_toggles.standard_jerk_speed_decrease, + starpilot_toggles.relaxed_jerk_deceleration, starpilot_toggles.relaxed_jerk_danger, starpilot_toggles.relaxed_jerk_speed_decrease, + starpilot_toggles.custom_personalities, sm["selfdriveState"].personality ) self.t_follow = get_T_FOLLOW( - frogpilot_toggles.aggressive_follow, - frogpilot_toggles.standard_follow, - frogpilot_toggles.relaxed_follow, - frogpilot_toggles.custom_personalities, sm["selfdriveState"].personality + starpilot_toggles.aggressive_follow, + starpilot_toggles.standard_follow, + starpilot_toggles.relaxed_follow, + starpilot_toggles.custom_personalities, sm["selfdriveState"].personality ) if isinstance(self.t_follow, (list, tuple)): self.t_follow = float(np.interp(v_ego, PERSONALITY_BP, self.t_follow)) @@ -72,16 +72,16 @@ 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 self.frogpilot_planner.lead_one.dRel < (self.t_follow * 2) * v_ego + self.following_lead = self.starpilot_planner.tracking_lead and self.starpilot_planner.lead_one.dRel < (self.t_follow * 2) * v_ego self.slower_lead = False - if self.frogpilot_planner.frogpilot_weather.weather_id != 0: - self.t_follow = min(self.t_follow + self.frogpilot_planner.frogpilot_weather.increase_following_distance, MAX_T_FOLLOW) + if self.starpilot_planner.starpilot_weather.weather_id != 0: + self.t_follow = min(self.t_follow + self.starpilot_planner.starpilot_weather.increase_following_distance, MAX_T_FOLLOW) self.disable_throttle = False - if self.frogpilot_planner.tracking_lead and self.frogpilot_planner.lead_one.status: - lead_distance = self.frogpilot_planner.lead_one.dRel - v_lead = self.frogpilot_planner.lead_one.vLead + if self.starpilot_planner.tracking_lead and self.starpilot_planner.lead_one.status: + lead_distance = self.starpilot_planner.lead_one.dRel + v_lead = self.starpilot_planner.lead_one.vLead closing_speed = max(0.0, v_ego - v_lead) desired_gap = float(desired_follow_distance(v_ego, v_lead, self.t_follow)) ttc = lead_distance / max(closing_speed, 1e-3) if closing_speed > 0.1 else 1e6 @@ -94,30 +94,30 @@ class FrogPilotFollowing: coast_window_far and gentle_closing) self.disable_throttle &= ttc > 6.0 and lead_distance > desired_gap + 6.0 - if long_control_active 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)) + if long_control_active and self.starpilot_planner.tracking_lead: + self.update_follow_values(self.starpilot_planner.lead_one.dRel, v_ego, self.starpilot_planner.lead_one.vLead, starpilot_toggles) + self.desired_follow_distance = int(desired_follow_distance(v_ego, self.starpilot_planner.lead_one.vLead, self.t_follow)) else: self.desired_follow_distance = 0 - def update_follow_values(self, lead_distance, v_ego, v_lead, frogpilot_toggles): - if frogpilot_toggles.human_following and v_lead > v_ego: + def update_follow_values(self, lead_distance, v_ego, v_lead, starpilot_toggles): + if starpilot_toggles.human_following and v_lead > v_ego: distance_factor = max(lead_distance - (v_ego * self.t_follow), 1) - from frogpilot.common.frogpilot_variables import get_frogpilot_toggles - fp_toggles = get_frogpilot_toggles() + from starpilot.common.starpilot_variables import get_starpilot_toggles + fp_toggles = get_starpilot_toggles() accelerating_offset = float(np.clip(fp_toggles.stop_distance - v_ego, 1, distance_factor)) self.acceleration_jerk /= accelerating_offset self.speed_jerk /= accelerating_offset self.t_follow /= accelerating_offset - if (frogpilot_toggles.conditional_slower_lead or frogpilot_toggles.human_following) and v_lead < v_ego: + if (starpilot_toggles.conditional_slower_lead or starpilot_toggles.human_following) and v_lead < v_ego: distance_factor = max(lead_distance - (v_lead * self.t_follow), 1) braking_offset = float(np.clip(min(v_ego - v_lead, v_lead) - COMFORT_BRAKE, 1, distance_factor)) - if frogpilot_toggles.human_following: - from frogpilot.common.frogpilot_variables import get_frogpilot_toggles - fp_toggles = get_frogpilot_toggles() + if starpilot_toggles.human_following: + from starpilot.common.starpilot_variables import get_starpilot_toggles + fp_toggles = get_starpilot_toggles() far_lead_offset = max(lead_distance - (v_ego * self.t_follow) - fp_toggles.stop_distance, 0) self.t_follow /= braking_offset + far_lead_offset self.slower_lead = braking_offset > 1 diff --git a/frogpilot/controls/lib/frogpilot_vcruise.py b/starpilot/controls/lib/starpilot_vcruise.py similarity index 70% rename from frogpilot/controls/lib/frogpilot_vcruise.py rename to starpilot/controls/lib/starpilot_vcruise.py index b17260f0..9ea2f642 100644 --- a/frogpilot/controls/lib/frogpilot_vcruise.py +++ b/starpilot/controls/lib/starpilot_vcruise.py @@ -2,16 +2,16 @@ from openpilot.common.constants import CV from openpilot.common.realtime import DT_MDL -from openpilot.frogpilot.common.frogpilot_variables import CRUISING_SPEED, PLANNER_TIME -from openpilot.frogpilot.controls.lib.curve_speed_controller import CurveSpeedController -from openpilot.frogpilot.controls.lib.speed_limit_controller import SpeedLimitController +from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, PLANNER_TIME +from openpilot.starpilot.controls.lib.curve_speed_controller import CurveSpeedController +from openpilot.starpilot.controls.lib.speed_limit_controller import SpeedLimitController OVERRIDE_FORCE_STOP_TIMER = 10 -class FrogPilotVCruise: - def __init__(self, FrogPilotPlanner): - self.frogpilot_planner = FrogPilotPlanner +class StarPilotVCruise: + def __init__(self, StarPilotPlanner): + self.starpilot_planner = StarPilotPlanner self.csc = CurveSpeedController(self) self.slc = SpeedLimitController(self) @@ -23,9 +23,9 @@ class FrogPilotVCruise: self.force_stop_timer = 0.0 self.tracked_model_length = 0.0 - def update(self, long_control_active, now, time_validated, v_cruise, v_ego, sm, frogpilot_toggles): - force_stop = self.frogpilot_planner.frogpilot_cem.stop_light_detected and long_control_active and frogpilot_toggles.force_stops - force_stop &= self.frogpilot_planner.model_stopped + def update(self, long_control_active, now, time_validated, v_cruise, v_ego, sm, starpilot_toggles): + force_stop = self.starpilot_planner.starpilot_cem.stop_light_detected and long_control_active and starpilot_toggles.force_stops + force_stop &= self.starpilot_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 @@ -33,7 +33,7 @@ class FrogPilotVCruise: 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 |= sm["starpilotCarState"].accelPressed self.override_force_stop &= force_stop_enabled if self.override_force_stop: @@ -48,7 +48,7 @@ class FrogPilotVCruise: v_ego_diff = v_ego_cluster - v_ego # FrogsGoMoo's Curve Speed Controller - if long_control_active and v_ego > CRUISING_SPEED and self.frogpilot_planner.road_curvature_detected and frogpilot_toggles.curve_speed_controller: + if long_control_active and v_ego > CRUISING_SPEED and self.starpilot_planner.road_curvature_detected and starpilot_toggles.curve_speed_controller: self.csc.update_target(v_ego) self.csc_controlling_speed = True @@ -63,16 +63,16 @@ class FrogPilotVCruise: self.csc_target = v_cruise # Pfeiferj's Speed Limit Controller - self.slc.frogpilot_toggles = frogpilot_toggles + self.slc.starpilot_toggles = starpilot_toggles - if frogpilot_toggles.speed_limit_controller: - self.slc.update_limits(sm["frogpilotCarState"].dashboardSpeedLimit, now, time_validated, v_cruise, v_ego, sm) + if starpilot_toggles.speed_limit_controller: + self.slc.update_limits(sm["starpilotCarState"].dashboardSpeedLimit, now, time_validated, v_cruise, v_ego, sm) self.slc.update_override(v_cruise, v_cruise_diff, v_ego, v_ego_diff, 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, now, time_validated, v_cruise, v_ego, sm) + elif starpilot_toggles.show_speed_limits: + self.slc.update_limits(sm["starpilotCarState"].dashboardSpeedLimit, now, time_validated, v_cruise, v_ego, sm) self.slc_offset = 0 self.slc_target = self.slc.target @@ -89,10 +89,10 @@ class FrogPilotVCruise: else: self.forcing_stop = False - self.tracked_model_length = self.frogpilot_planner.model_length + self.tracked_model_length = self.starpilot_planner.model_length targets = [self.csc_target, v_cruise] - if frogpilot_toggles.speed_limit_controller: + if starpilot_toggles.speed_limit_controller: targets.append(max(self.slc.overridden_speed, self.slc_target + self.slc_offset) - v_ego_diff) v_cruise = min([target if target >= CRUISING_SPEED else v_cruise for target in targets]) diff --git a/frogpilot/controls/lib/weather_checker.py b/starpilot/controls/lib/weather_checker.py similarity index 76% rename from frogpilot/controls/lib/weather_checker.py rename to starpilot/controls/lib/weather_checker.py index 9305e675..5953efdd 100644 --- a/frogpilot/controls/lib/weather_checker.py +++ b/starpilot/controls/lib/weather_checker.py @@ -4,8 +4,8 @@ import time from concurrent.futures import ThreadPoolExecutor -from openpilot.frogpilot.common.frogpilot_utilities import calculate_distance_to_point, get_frogpilot_api_info, is_url_pingable -from openpilot.frogpilot.common.frogpilot_variables import FROGPILOT_API +from openpilot.starpilot.common.starpilot_utilities import calculate_distance_to_point, get_starpilot_api_info, is_url_pingable +from openpilot.starpilot.common.starpilot_variables import STARPILOT_API CACHE_DISTANCE = 25 MAX_RETRIES = 3 @@ -36,8 +36,8 @@ WEATHER_CATEGORIES = { } class WeatherChecker: - def __init__(self, FrogPilotPlanner): - self.frogpilot_planner = FrogPilotPlanner + def __init__(self, StarPilotPlanner): + self.starpilot_planner = StarPilotPlanner self.is_daytime = False @@ -56,21 +56,21 @@ class WeatherChecker: self.last_updated = None self.requesting = False - self.user_api_key = self.frogpilot_planner.params.get("WeatherToken", encoding="utf-8") + self.user_api_key = self.starpilot_planner.params.get("WeatherToken", encoding="utf-8") if self.user_api_key: self.check_interval = 60 else: self.check_interval = 15 * 60 - self.api_token, self.build_metadata, self.device_type, self.dongle_id = get_frogpilot_api_info() + self.api_token, self.build_metadata, self.device_type, self.dongle_id = get_starpilot_api_info() self.session = requests.Session() - self.session.headers.update({"Accept-Language": "en", "User-Agent": "frogpilot-api/1.0"}) + self.session.headers.update({"Accept-Language": "en", "User-Agent": "starpilot-api/1.0"}) self.executor = ThreadPoolExecutor(max_workers=1) - def update_offsets(self, frogpilot_toggles): + def update_offsets(self, starpilot_toggles): suffix = WEATHER_CATEGORIES["CLEAR"]["suffix"] for category in WEATHER_CATEGORIES.values(): if any(start <= self.weather_id <= end for start, end in category["ranges"]): @@ -78,23 +78,23 @@ class WeatherChecker: break if suffix != WEATHER_CATEGORIES["CLEAR"]["suffix"]: - self.increase_following_distance = getattr(frogpilot_toggles, f"increase_following_distance_{suffix}") - self.increase_stopped_distance = getattr(frogpilot_toggles, f"increase_stopped_distance_{suffix}") - self.reduce_acceleration = getattr(frogpilot_toggles, f"reduce_acceleration_{suffix}") - self.reduce_lateral_acceleration = getattr(frogpilot_toggles, f"reduce_lateral_acceleration_{suffix}") + self.increase_following_distance = getattr(starpilot_toggles, f"increase_following_distance_{suffix}") + self.increase_stopped_distance = getattr(starpilot_toggles, f"increase_stopped_distance_{suffix}") + self.reduce_acceleration = getattr(starpilot_toggles, f"reduce_acceleration_{suffix}") + self.reduce_lateral_acceleration = getattr(starpilot_toggles, f"reduce_lateral_acceleration_{suffix}") else: self.increase_following_distance = 0 self.increase_stopped_distance = 0 self.reduce_acceleration = 0 self.reduce_lateral_acceleration = 0 - def update_weather(self, now, frogpilot_toggles): + def update_weather(self, now, starpilot_toggles): if self.last_gps_position and self.last_updated: distance = calculate_distance_to_point( self.last_gps_position["latitude"], self.last_gps_position["longitude"], - self.frogpilot_planner.gps_position.get("latitude"), - self.frogpilot_planner.gps_position.get("longitude") + self.starpilot_planner.gps_position.get("latitude"), + self.starpilot_planner.gps_position.get("longitude") ) if distance / 1000 > CACHE_DISTANCE: self.hourly_forecast = None @@ -107,7 +107,7 @@ class WeatherChecker: if self.hourly_forecast: current_forecast = min(self.hourly_forecast, key=lambda f: abs(f["dt"] - now.timestamp())) self.weather_id = current_forecast.get("weather", [{}])[0].get("id", 0) - self.update_offsets(frogpilot_toggles) + self.update_offsets(starpilot_toggles) return if self.requesting: @@ -121,7 +121,7 @@ class WeatherChecker: if data: self.last_updated = now self.hourly_forecast = data.get("hourly") - self.last_gps_position = self.frogpilot_planner.gps_position + self.last_gps_position = self.starpilot_planner.gps_position if "current" in data: source_data = data.get("current", {}) @@ -134,10 +134,10 @@ class WeatherChecker: self.sunset = current_data.get("sunset", 0) self.weather_id = source_data.get("weather", [{}])[0].get("id", 0) - self.update_offsets(frogpilot_toggles) + self.update_offsets(starpilot_toggles) def make_request(): - if not is_url_pingable(FROGPILOT_API): + if not is_url_pingable(STARPILOT_API): return None payload = { @@ -145,14 +145,14 @@ class WeatherChecker: "api_token": self.api_token, "build_metadata": self.build_metadata, "device": self.device_type, - "frogpilot_dongle_id": self.dongle_id, - "lat": self.frogpilot_planner.gps_position["latitude"], - "lon": self.frogpilot_planner.gps_position["longitude"], + "starpilot_dongle_id": self.dongle_id, + "lat": self.starpilot_planner.gps_position["latitude"], + "lon": self.starpilot_planner.gps_position["longitude"], } for attempt in range(1, MAX_RETRIES + 1): try: - response = self.session.post(f"{FROGPILOT_API}/weather", json=payload, headers={"Content-Type": "application/json"}, timeout=10) + response = self.session.post(f"{STARPILOT_API}/weather", json=payload, headers={"Content-Type": "application/json"}, timeout=10) response.raise_for_status() data = response.json() diff --git a/frogpilot/controls/frogpilot_card.py b/starpilot/controls/starpilot_card.py similarity index 60% rename from frogpilot/controls/frogpilot_card.py rename to starpilot/controls/starpilot_card.py index f0244a91..0034b088 100644 --- a/frogpilot/controls/frogpilot_card.py +++ b/starpilot/controls/starpilot_card.py @@ -4,11 +4,11 @@ from openpilot.common.params import Params from openpilot.selfdrive.car.cruise import CRUISE_LONG_PRESS, ButtonType from openpilot.selfdrive.selfdrived.events import ET -from openpilot.frogpilot.common.frogpilot_utilities import is_FrogsGoMoo -from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, GearShifter, NON_DRIVING_GEARS -from openpilot.frogpilot.controls.lib.conditional_experimental_mode import CEStatus +from openpilot.starpilot.common.starpilot_utilities import is_FrogsGoMoo +from openpilot.starpilot.common.starpilot_variables import ERROR_LOGS_PATH, GearShifter, NON_DRIVING_GEARS +from openpilot.starpilot.controls.lib.conditional_experimental_mode import CEStatus -class FrogPilotCard: +class StarPilotCard: def __init__(self, CP, FPCP): self.CP = CP @@ -34,20 +34,20 @@ class FrogPilotCard: self.error_log = ERROR_LOGS_PATH / "error.txt" - def handle_button_event(self, key, sm, frogpilot_toggles): - if sm["carControl"].longActive and getattr(frogpilot_toggles, f"experimental_mode_via_{key}"): - self.handle_experimental_mode(sm, frogpilot_toggles) - elif getattr(frogpilot_toggles, f"force_coast_via_{key}"): + def handle_button_event(self, key, sm, starpilot_toggles): + if sm["carControl"].longActive and getattr(starpilot_toggles, f"experimental_mode_via_{key}"): + self.handle_experimental_mode(sm, starpilot_toggles) + elif getattr(starpilot_toggles, f"force_coast_via_{key}"): self.force_coast = not self.force_coast - elif getattr(frogpilot_toggles, f"pause_lateral_via_{key}"): + elif getattr(starpilot_toggles, f"pause_lateral_via_{key}"): self.pause_lateral = not self.pause_lateral - elif getattr(frogpilot_toggles, f"pause_longitudinal_via_{key}"): + elif getattr(starpilot_toggles, f"pause_longitudinal_via_{key}"): self.pause_longitudinal = not self.pause_longitudinal - elif sm["carControl"].longActive and getattr(frogpilot_toggles, f"traffic_mode_via_{key}"): + elif sm["carControl"].longActive and getattr(starpilot_toggles, f"traffic_mode_via_{key}"): self.traffic_mode_enabled = not self.traffic_mode_enabled - def handle_experimental_mode(self, sm, frogpilot_toggles): - if frogpilot_toggles.conditional_experimental_mode: + def handle_experimental_mode(self, sm, starpilot_toggles): + if starpilot_toggles.conditional_experimental_mode: if self.params_memory.get_int("CEStatus") in (CEStatus["USER_DISABLED"], CEStatus["USER_OVERRIDDEN"]): override_value = CEStatus["OFF"] elif sm["selfdriveState"].experimentalMode: @@ -59,61 +59,61 @@ class FrogPilotCard: else: self.params.put_bool_nonblocking("ExperimentalMode", not sm["selfdriveState"].experimentalMode) - def update(self, carState, frogpilotCarState, sm, frogpilot_toggles): + def update(self, carState, starpilotCarState, sm, starpilot_toggles): if self.CP.brand == "hyundai": for be in carState.buttonEvents: - if be.type == ButtonType.lkas and be.pressed and frogpilot_toggles.always_on_lateral_lkas: + if be.type == ButtonType.lkas and be.pressed and starpilot_toggles.always_on_lateral_lkas: self.always_on_lateral_allowed = not self.always_on_lateral_allowed - elif be.type == ButtonType.mainCruise and be.pressed and frogpilot_toggles.always_on_lateral_main: + elif be.type == ButtonType.mainCruise and be.pressed and starpilot_toggles.always_on_lateral_main: self.always_on_lateral_allowed = not self.always_on_lateral_allowed - elif frogpilot_toggles.always_on_lateral_main: + elif starpilot_toggles.always_on_lateral_main: self.always_on_lateral_allowed = carState.cruiseState.available self.always_on_lateral_enabled = self.always_on_lateral_allowed and self.always_on_lateral_set self.always_on_lateral_enabled &= carState.gearShifter not in NON_DRIVING_GEARS - self.always_on_lateral_enabled &= sm["frogpilotPlan"].lateralCheck + self.always_on_lateral_enabled &= sm["starpilotPlan"].lateralCheck self.always_on_lateral_enabled &= sm["liveCalibration"].calPerc >= 1 - self.always_on_lateral_enabled &= (ET.IMMEDIATE_DISABLE not in sm["selfdriveState"].alertType + sm["frogpilotSelfdriveState"].alertType) or self.frogs_go_moo - self.always_on_lateral_enabled &= not (carState.brakePressed and carState.vEgo < frogpilot_toggles.always_on_lateral_pause_speed) or carState.standstill + self.always_on_lateral_enabled &= (ET.IMMEDIATE_DISABLE not in sm["selfdriveState"].alertType + sm["starpilotSelfdriveState"].alertType) or self.frogs_go_moo + self.always_on_lateral_enabled &= not (carState.brakePressed and carState.vEgo < starpilot_toggles.always_on_lateral_pause_speed) or carState.standstill self.always_on_lateral_enabled &= not self.error_log.is_file() or self.frogs_go_moo - if sm.updated["frogpilotPlan"] or any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in carState.buttonEvents): + if sm.updated["starpilotPlan"] or any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in carState.buttonEvents): self.accel_pressed = any(be.type in (ButtonType.accelCruise, ButtonType.resumeCruise) for be in carState.buttonEvents) - if sm.updated["frogpilotPlan"] or any(be.type == ButtonType.decelCruise for be in carState.buttonEvents): + if sm.updated["starpilotPlan"] or any(be.type == ButtonType.decelCruise for be in carState.buttonEvents): self.decel_pressed = any(be.type == ButtonType.decelCruise for be in carState.buttonEvents) - frogpilotCarState.distancePressed |= self.params_memory.get_bool("OnroadDistanceButtonPressed") + starpilotCarState.distancePressed |= self.params_memory.get_bool("OnroadDistanceButtonPressed") - if frogpilotCarState.distancePressed: + if starpilotCarState.distancePressed: self.gap_counter += 1 elif not self.distancePressed_previously: self.gap_counter = 0 - self.distancePressed_previously = frogpilotCarState.distancePressed + self.distancePressed_previously = starpilotCarState.distancePressed - if not frogpilotCarState.distancePressed and 1 <= self.gap_counter < self.long_press_threshold: - self.handle_button_event("distance", sm, frogpilot_toggles) + if not starpilotCarState.distancePressed and 1 <= self.gap_counter < self.long_press_threshold: + self.handle_button_event("distance", sm, starpilot_toggles) elif self.gap_counter == self.long_press_threshold: - self.handle_button_event("distance_long", sm, frogpilot_toggles) + self.handle_button_event("distance_long", sm, starpilot_toggles) elif self.gap_counter == self.very_long_press_threshold: - self.handle_button_event("distance_long", sm, frogpilot_toggles) - self.handle_button_event("distance_very_long", sm, frogpilot_toggles) + self.handle_button_event("distance_long", sm, starpilot_toggles) + self.handle_button_event("distance_very_long", sm, starpilot_toggles) if any(be.pressed and be.type == ButtonType.lkas for be in carState.buttonEvents): - self.handle_button_event("lkas", sm, frogpilot_toggles) + self.handle_button_event("lkas", sm, starpilot_toggles) self.force_coast &= not (carState.brakePressed or carState.gasPressed) - frogpilotCarState.accelPressed = self.accel_pressed - frogpilotCarState.alwaysOnLateralEnabled = self.always_on_lateral_enabled - frogpilotCarState.decelPressed = self.decel_pressed - frogpilotCarState.distanceLongPressed = self.very_long_press_threshold > self.gap_counter >= self.long_press_threshold - frogpilotCarState.distanceVeryLongPressed = self.gap_counter >= self.very_long_press_threshold - frogpilotCarState.forceCoast = self.force_coast - frogpilotCarState.isParked = carState.gearShifter == GearShifter.park - frogpilotCarState.pauseLateral = self.pause_lateral - frogpilotCarState.pauseLongitudinal = self.pause_longitudinal - frogpilotCarState.trafficModeEnabled = self.traffic_mode_enabled + starpilotCarState.accelPressed = self.accel_pressed + starpilotCarState.alwaysOnLateralEnabled = self.always_on_lateral_enabled + starpilotCarState.decelPressed = self.decel_pressed + starpilotCarState.distanceLongPressed = self.very_long_press_threshold > self.gap_counter >= self.long_press_threshold + starpilotCarState.distanceVeryLongPressed = self.gap_counter >= self.very_long_press_threshold + starpilotCarState.forceCoast = self.force_coast + starpilotCarState.isParked = carState.gearShifter == GearShifter.park + starpilotCarState.pauseLateral = self.pause_lateral + starpilotCarState.pauseLongitudinal = self.pause_longitudinal + starpilotCarState.trafficModeEnabled = self.traffic_mode_enabled - return frogpilotCarState + return starpilotCarState diff --git a/starpilot/controls/starpilot_planner.py b/starpilot/controls/starpilot_planner.py new file mode 100644 index 00000000..06b68bd8 --- /dev/null +++ b/starpilot/controls/starpilot_planner.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python3 +import json + +import cereal.messaging as messaging + +from openpilot.common.constants import CV +from openpilot.common.filter_simple import FirstOrderFilter +from openpilot.common.gps import get_gps_location_service +from openpilot.common.params import Params +from openpilot.common.realtime import DT_MDL +from openpilot.selfdrive.car.cruise import V_CRUISE_MAX, V_CRUISE_UNSET +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import A_CHANGE_COST, DANGER_ZONE_COST, J_EGO_COST, STOP_DISTANCE + +from openpilot.starpilot.common.starpilot_utilities import calculate_lane_width, calculate_road_curvature +from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, MINIMUM_LATERAL_ACCELERATION, PLANNER_TIME, THRESHOLD +from openpilot.starpilot.controls.lib.conditional_experimental_mode import ConditionalExperimentalMode +from openpilot.starpilot.controls.lib.starpilot_acceleration import StarPilotAcceleration +from openpilot.starpilot.controls.lib.starpilot_events import StarPilotEvents +from openpilot.starpilot.controls.lib.starpilot_following import StarPilotFollowing +from openpilot.starpilot.controls.lib.starpilot_vcruise import StarPilotVCruise +from openpilot.starpilot.controls.lib.weather_checker import WeatherChecker + + +class StarPilotPlanner: + def __init__(self, error_log, ThemeManager): + self.params = Params(return_defaults=True) + self.params_memory = Params(memory=True) + + self.starpilot_acceleration = StarPilotAcceleration(self) + self.starpilot_cem = ConditionalExperimentalMode(self) + self.starpilot_events = StarPilotEvents(self, error_log, ThemeManager) + self.starpilot_following = StarPilotFollowing(self) + self.starpilot_vcruise = StarPilotVCruise(self) + self.starpilot_weather = WeatherChecker(self) + + self.driving_in_curve = False + self.gps_valid = False + self.lateral_check = False + self.model_stopped = False + self.road_curvature_detected = False + self.tracking_lead = False + + self.lane_width_left = 0 + self.lane_width_right = 0 + self.lateral_acceleration = 0 + self.model_length = 0 + self.road_curvature = 0 + self.time_to_curve = 0 + self.v_cruise = 0 + + self.gps_position = None + + self.gps_location_service = get_gps_location_service(self.params) + + self.tracking_lead_filter = FirstOrderFilter(0, 0.5, DT_MDL) + + def shutdown(self): + self.starpilot_vcruise.slc.executor.shutdown(wait=False, cancel_futures=True) + self.starpilot_weather.executor.shutdown(wait=False, cancel_futures=True) + + def update(self, now, time_validated, sm, starpilot_toggles): + self.lead_one = sm["radarState"].leadOne + + controls_enabled = sm["selfdriveState"].enabled + + v_cruise_kph = min(sm["carState"].vCruise, V_CRUISE_MAX) + if 0 < v_cruise_kph < V_CRUISE_UNSET and starpilot_toggles.set_speed_offset > 0: + v_cruise_kph += starpilot_toggles.set_speed_offset + v_cruise = v_cruise_kph * CV.KPH_TO_MS + v_ego = max(sm["carState"].vEgo, 0) + + if controls_enabled: + self.starpilot_acceleration.update(v_ego, sm, starpilot_toggles) + else: + self.starpilot_acceleration.max_accel = 0 + self.starpilot_acceleration.min_accel = 0 + + if controls_enabled and starpilot_toggles.conditional_experimental_mode: + self.starpilot_cem.update(v_ego, sm, starpilot_toggles) + else: + self.starpilot_cem.curve_detected = False + self.starpilot_cem.stop_sign_and_light(v_ego, sm, PLANNER_TIME - 2) + + self.driving_in_curve = abs(self.lateral_acceleration) >= MINIMUM_LATERAL_ACCELERATION + + self.starpilot_events.update(controls_enabled, v_cruise, sm, starpilot_toggles) + + self.starpilot_following.update(controls_enabled, v_ego, sm, starpilot_toggles) + + gps_location = sm[self.gps_location_service] + self.gps_position = { + "latitude": gps_location.latitude, + "longitude": gps_location.longitude, + "bearing": gps_location.bearingDeg, + } + self.gps_valid = self.gps_position["latitude"] != 0 or self.gps_position["longitude"] != 0 + self.params_memory.put("LastGPSPosition", json.dumps(self.gps_position)) + + if v_ego >= starpilot_toggles.minimum_lane_change_speed: + 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_acceleration = v_ego**2 * sm["controlsState"].curvature + + self.lateral_check = v_ego >= starpilot_toggles.pause_lateral_below_speed + self.lateral_check |= not (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and starpilot_toggles.pause_lateral_below_signal + self.lateral_check |= sm["carState"].standstill + self.lateral_check &= not sm["starpilotCarState"].pauseLateral + + self.model_length = sm["modelV2"].position.x[-1] + + self.model_stopped = self.model_length < CRUISING_SPEED * PLANNER_TIME + self.model_stopped |= self.starpilot_vcruise.forcing_stop + + self.road_curvature, self.time_to_curve = calculate_road_curvature(sm["modelV2"]) + + self.road_curvature_detected = (1 / abs(self.road_curvature))**0.5 < v_ego > CRUISING_SPEED and not (sm["carState"].leftBlinker or sm["carState"].rightBlinker) + + if not sm["carState"].standstill: + self.tracking_lead = self.update_lead_status(starpilot_toggles.stop_distance) + + self.v_cruise = self.starpilot_vcruise.update(controls_enabled, now, time_validated, v_cruise, v_ego, sm, starpilot_toggles) + + if self.gps_valid and time_validated and starpilot_toggles.weather_presets: + self.starpilot_weather.update_weather(now, starpilot_toggles) + else: + self.starpilot_weather.weather_id = 0 + + def update_lead_status(self, stop_distance=STOP_DISTANCE): + following_lead = self.lead_one.status + following_lead &= self.lead_one.dRel < self.model_length + max(float(stop_distance), 4.0) + + self.tracking_lead_filter.update(following_lead) + return self.tracking_lead_filter.x >= THRESHOLD + + def publish(self, theme_updated, sm, pm, starpilot_toggles): + starpilot_plan_send = messaging.new_message("starpilotPlan") + starpilot_plan_send.valid = sm.all_checks(service_list=["carState", "controlsState", "selfdriveState", "radarState"]) + starpilotPlan = starpilot_plan_send.starpilotPlan + + starpilotPlan.accelerationJerk = float(A_CHANGE_COST * self.starpilot_following.acceleration_jerk) + starpilotPlan.dangerFactor = float(self.starpilot_following.danger_factor) + starpilotPlan.dangerJerk = float(DANGER_ZONE_COST * self.starpilot_following.danger_jerk) + starpilotPlan.speedJerk = float(J_EGO_COST * self.starpilot_following.speed_jerk) + starpilotPlan.tFollow = float(self.starpilot_following.t_follow) + + starpilotPlan.cscControllingSpeed = self.starpilot_vcruise.csc_controlling_speed + starpilotPlan.cscSpeed = float(self.starpilot_vcruise.csc_target) + starpilotPlan.cscTraining = self.starpilot_vcruise.csc.enable_training + + starpilotPlan.desiredFollowDistance = int(self.starpilot_following.desired_follow_distance) + starpilotPlan.disableThrottle = self.starpilot_following.disable_throttle + starpilotPlan.trackingLead = self.tracking_lead + + starpilotPlan.experimentalMode = self.starpilot_cem.experimental_mode or self.starpilot_vcruise.slc.experimental_mode + + starpilotPlan.forcingStop = self.starpilot_vcruise.forcing_stop + starpilotPlan.forcingStopLength = self.starpilot_vcruise.tracked_model_length + + starpilotPlan.starpilotEvents = self.starpilot_events.events.to_msg() + + starpilotPlan.starpilotToggles = json.dumps(vars(starpilot_toggles)) + + if sm["starpilotCarState"].trafficModeEnabled: + starpilotPlan.increasedStoppedDistance = 0 + else: + starpilotPlan.increasedStoppedDistance = starpilot_toggles.increase_stopped_distance + if self.starpilot_weather.weather_id != 0: + starpilotPlan.increasedStoppedDistance += self.starpilot_weather.increase_stopped_distance + + starpilotPlan.laneWidthLeft = self.lane_width_left + starpilotPlan.laneWidthRight = self.lane_width_right + + starpilotPlan.lateralCheck = self.lateral_check + + starpilotPlan.maxAcceleration = float(self.starpilot_acceleration.max_accel) + starpilotPlan.minAcceleration = float(self.starpilot_acceleration.min_accel) + + starpilotPlan.redLight = self.starpilot_cem.stop_light_detected + + starpilotPlan.roadCurvature = self.road_curvature + + starpilotPlan.slcMapSpeedLimit = self.starpilot_vcruise.slc.map_speed_limit + starpilotPlan.slcMapboxSpeedLimit = self.starpilot_vcruise.slc.mapbox_limit + starpilotPlan.slcNextSpeedLimit = self.starpilot_vcruise.slc.next_speed_limit + starpilotPlan.slcOverriddenSpeed = self.starpilot_vcruise.slc.overridden_speed + starpilotPlan.slcSpeedLimit = self.starpilot_vcruise.slc_target + starpilotPlan.slcSpeedLimitOffset = self.starpilot_vcruise.slc_offset + starpilotPlan.slcSpeedLimitSource = self.starpilot_vcruise.slc.source + starpilotPlan.speedLimitChanged = self.starpilot_vcruise.slc.speed_limit_changed_timer > DT_MDL + starpilotPlan.unconfirmedSlcSpeedLimit = self.starpilot_vcruise.slc.unconfirmed_speed_limit + + starpilotPlan.themeUpdated = theme_updated + + starpilotPlan.vCruise = float(self.v_cruise) + + starpilotPlan.weatherDaytime = self.starpilot_weather.is_daytime + starpilotPlan.weatherId = self.starpilot_weather.weather_id + + pm.send("starpilotPlan", starpilot_plan_send) diff --git a/frogpilot/navigation/mapd b/starpilot/navigation/mapd similarity index 100% rename from frogpilot/navigation/mapd rename to starpilot/navigation/mapd diff --git a/frogpilot/navigation/mapd_wrapper.py b/starpilot/navigation/mapd_wrapper.py similarity index 98% rename from frogpilot/navigation/mapd_wrapper.py rename to starpilot/navigation/mapd_wrapper.py index f0c24fc3..c2a90173 100644 --- a/frogpilot/navigation/mapd_wrapper.py +++ b/starpilot/navigation/mapd_wrapper.py @@ -12,7 +12,7 @@ from pathlib import Path from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog -MAPD_DIR = Path(BASEDIR) / "frogpilot/navigation" +MAPD_DIR = Path(BASEDIR) / "starpilot/navigation" MAPD_BIN = MAPD_DIR / "mapd" OFFLINE_ROOT = Path("/data/media/0/osm/offline") RESTART_DELAY_S = 0.25 diff --git a/frogpilot/navigation/test_mapd_wrapper.py b/starpilot/navigation/test_mapd_wrapper.py similarity index 91% rename from frogpilot/navigation/test_mapd_wrapper.py rename to starpilot/navigation/test_mapd_wrapper.py index e1c591c6..05e39482 100644 --- a/frogpilot/navigation/test_mapd_wrapper.py +++ b/starpilot/navigation/test_mapd_wrapper.py @@ -3,7 +3,7 @@ import json from pathlib import Path -from openpilot.frogpilot.navigation.mapd_wrapper import CorruptTileMonitor, quarantine_offline_tile +from openpilot.starpilot.navigation.mapd_wrapper import CorruptTileMonitor, quarantine_offline_tile def _loading_line(filename: str) -> str: @@ -32,7 +32,7 @@ def test_quarantine_offline_tile_renames_file(tmp_path, monkeypatch): tile.parent.mkdir(parents=True) tile.write_text("bad") - monkeypatch.setattr("openpilot.frogpilot.navigation.mapd_wrapper.OFFLINE_ROOT", offline_root) + monkeypatch.setattr("openpilot.starpilot.navigation.mapd_wrapper.OFFLINE_ROOT", offline_root) quarantined = quarantine_offline_tile(tile.as_posix()) diff --git a/frogpilot/frogpilot_process.py b/starpilot/starpilot_process.py similarity index 62% rename from frogpilot/frogpilot_process.py rename to starpilot/starpilot_process.py index 8cc2db85..2e25e31e 100644 --- a/frogpilot/frogpilot_process.py +++ b/starpilot/starpilot_process.py @@ -9,21 +9,22 @@ from openpilot.common.api import Api, api_get 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.system.sentry import capture_report from openpilot.system.athena.registration import UNREGISTERED_DONGLE_ID -from openpilot.frogpilot.assets.model_manager import MODEL_DOWNLOAD_ALL_PARAM, MODEL_DOWNLOAD_PARAM, ModelManager -from openpilot.frogpilot.assets.theme_manager import THEME_COMPONENT_PARAMS, ThemeManager -from openpilot.frogpilot.common.frogpilot_functions import capture_report, update_maps, update_openpilot -from openpilot.frogpilot.common.frogpilot_utilities import ThreadManager, flash_panda, is_url_pingable, lock_doors, use_konik_server -from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, FrogPilotVariables -from openpilot.frogpilot.controls.frogpilot_planner import FrogPilotPlanner -from openpilot.frogpilot.system.frogpilot_stats import send_stats -from openpilot.frogpilot.system.frogpilot_tracking import FrogPilotTracking +from openpilot.starpilot.assets.model_manager import MODEL_DOWNLOAD_ALL_PARAM, MODEL_DOWNLOAD_PARAM, ModelManager +from openpilot.starpilot.assets.theme_manager import THEME_COMPONENT_PARAMS, ThemeManager +from openpilot.starpilot.common.starpilot_functions import update_maps, update_openpilot +from openpilot.starpilot.common.starpilot_utilities import ThreadManager, flash_panda, is_url_pingable, lock_doors, use_konik_server +from openpilot.starpilot.common.starpilot_variables import ERROR_LOGS_PATH, StarPilotVariables +from openpilot.starpilot.controls.starpilot_planner import StarPilotPlanner +from openpilot.starpilot.system.starpilot_stats import send_stats +from openpilot.starpilot.system.starpilot_tracking import StarPilotTracking ASSET_CHECK_RATE = (1 / DT_MDL) DRIVE_STATS_SYNC_RATE = 30 -def check_assets(now, model_manager, theme_manager, thread_manager, params, params_memory, frogpilot_toggles): +def check_assets(now, model_manager, theme_manager, thread_manager, params, params_memory, starpilot_toggles): if params_memory.get_bool(MODEL_DOWNLOAD_ALL_PARAM): thread_manager.run_with_lock(model_manager.download_all_models) elif params_memory.get_bool("UpdateTinygrad"): @@ -38,14 +39,14 @@ def check_assets(now, model_manager, theme_manager, thread_manager, params, para 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)) + thread_manager.run_with_lock(theme_manager.download_theme, (asset_type, asset_to_download, asset_param, starpilot_toggles)) if params_memory.get_bool("FlashPanda"): thread_manager.run_with_lock(flash_panda, (params_memory)) report_data = params_memory.get("IssueReported") if report_data: - capture_report(report_data["DiscordUser"], report_data["Issue"], params, vars(frogpilot_toggles)) + capture_report(report_data["DiscordUser"], report_data["Issue"], vars(starpilot_toggles)) params_memory.remove("IssueReported") if params_memory.get_bool("DownloadMaps"): @@ -85,14 +86,14 @@ def sync_drive_stats(params, session): except Exception as exception: print(f"Failed to sync drive stats: {exception}") -def transition_offroad(frogpilot_planner, theme_manager, thread_manager, time_validated, sm, params, frogpilot_toggles): - params.put("LastGPSPosition", json.dumps(frogpilot_planner.gps_position)) +def transition_offroad(starpilot_planner, theme_manager, thread_manager, time_validated, sm, params, starpilot_toggles): + params.put("LastGPSPosition", json.dumps(starpilot_planner.gps_position)) - if frogpilot_toggles.lock_doors_timer != 0: - thread_manager.run_with_lock(lock_doors, (frogpilot_toggles.lock_doors_timer, sm, params), report=False) + if starpilot_toggles.lock_doors_timer != 0: + thread_manager.run_with_lock(lock_doors, (starpilot_toggles.lock_doors_timer, sm, params), report=False) - if frogpilot_toggles.random_themes: - theme_manager.update_active_theme(time_validated, frogpilot_toggles, randomize_theme=True) + if starpilot_toggles.random_themes: + theme_manager.update_active_theme(time_validated, starpilot_toggles, randomize_theme=True) if time_validated: thread_manager.run_with_lock(send_stats) @@ -101,56 +102,56 @@ def transition_onroad(error_log): if error_log.is_file(): error_log.unlink() -def update_checks(now, model_manager, theme_manager, thread_manager, params, params_memory, frogpilot_toggles, boot_run=False): +def update_checks(now, model_manager, theme_manager, thread_manager, params, params_memory, starpilot_toggles, boot_run=False): while not (is_url_pingable("https://github.com") or is_url_pingable("https://gitlab.com")): time.sleep(60) model_manager.update_models(boot_run) - theme_manager.update_themes(frogpilot_toggles, boot_run) + theme_manager.update_themes(starpilot_toggles, boot_run) thread_manager.run_with_lock(update_maps, (now, params, params_memory)) - if frogpilot_toggles.automatic_updates: + if starpilot_toggles.automatic_updates: thread_manager.run_with_lock(update_openpilot, (thread_manager, params)) time.sleep(1) -def update_toggles(frogpilot_variables, started, theme_manager, thread_manager, time_validated, params, frogpilot_toggles): - previous_holiday_themes = frogpilot_toggles.holiday_themes - previous_random_themes = frogpilot_toggles.random_themes +def update_toggles(starpilot_variables, started, theme_manager, thread_manager, time_validated, params, starpilot_toggles): + previous_holiday_themes = starpilot_toggles.holiday_themes + previous_random_themes = starpilot_toggles.random_themes - frogpilot_variables.update(theme_manager.holiday_theme, started) - frogpilot_toggles = frogpilot_variables.frogpilot_toggles + starpilot_variables.update(theme_manager.holiday_theme, started) + starpilot_toggles = starpilot_variables.starpilot_toggles - randomize_theme = frogpilot_toggles.holiday_themes != previous_holiday_themes - randomize_theme |= frogpilot_toggles.random_themes != previous_random_themes + randomize_theme = starpilot_toggles.holiday_themes != previous_holiday_themes + randomize_theme |= starpilot_toggles.random_themes != previous_random_themes theme_manager.theme_updated = False - theme_manager.update_active_theme(time_validated, frogpilot_toggles, randomize_theme=randomize_theme) + theme_manager.update_active_theme(time_validated, starpilot_toggles, randomize_theme=randomize_theme) - return frogpilot_toggles + return starpilot_toggles -def frogpilot_thread(): +def starpilot_thread(): rate_keeper = Ratekeeper(1 / DT_MDL, None) config_realtime_process(5, Priority.CTRL_LOW) - pm = messaging.PubMaster(["frogpilotPlan"]) + pm = messaging.PubMaster(["starpilotPlan"]) sm = messaging.SubMaster(["carControl", "carState", "controlsState", "deviceState", "driverMonitoringState", "gpsLocation", "gpsLocationExternal", "liveParameters", "managerState", "modelV2", - "onroadEvents", "pandaStates", "radarState", "selfdriveState", "frogpilotCarState", - "frogpilotSelfdriveState", "frogpilotModelV2", "frogpilotOnroadEvents", "mapdOut"], + "onroadEvents", "pandaStates", "radarState", "selfdriveState", "starpilotCarState", + "starpilotSelfdriveState", "starpilotModelV2", "starpilotOnroadEvents", "mapdOut"], poll="modelV2") params = Params(return_defaults=True) params_memory = Params(memory=True) - frogpilot_variables = FrogPilotVariables() + starpilot_variables = StarPilotVariables() model_manager = ModelManager(params, params_memory) theme_manager = ThemeManager(params, params_memory) thread_manager = ThreadManager() - frogpilot_toggles = frogpilot_variables.frogpilot_toggles + starpilot_toggles = starpilot_variables.starpilot_toggles drive_stats_session = requests.Session() next_drive_stats_sync = 0.0 @@ -171,28 +172,28 @@ def frogpilot_thread(): started = sm["deviceState"].started if not started and started_previously: - frogpilot_planner.shutdown() + starpilot_planner.shutdown() - frogpilot_toggles = update_toggles(frogpilot_variables, started, theme_manager, thread_manager, time_validated, params, frogpilot_toggles) - transition_offroad(frogpilot_planner, theme_manager, thread_manager, time_validated, sm, params, frogpilot_toggles) + starpilot_toggles = update_toggles(starpilot_variables, started, theme_manager, thread_manager, time_validated, params, starpilot_toggles) + transition_offroad(starpilot_planner, theme_manager, thread_manager, time_validated, sm, params, starpilot_toggles) run_update_checks = True elif started and not started_previously: - frogpilot_planner = FrogPilotPlanner(error_log, theme_manager) - frogpilot_tracking = FrogPilotTracking(frogpilot_planner, frogpilot_toggles) + starpilot_planner = StarPilotPlanner(error_log, theme_manager) + starpilot_tracking = StarPilotTracking(starpilot_planner, starpilot_toggles) transition_onroad(error_log) if started and sm.updated["modelV2"]: - frogpilot_planner.update(now, time_validated, sm, frogpilot_toggles) - frogpilot_planner.publish(theme_manager.theme_updated, sm, pm, frogpilot_toggles) + starpilot_planner.update(now, time_validated, sm, starpilot_toggles) + starpilot_planner.publish(theme_manager.theme_updated, sm, pm, starpilot_toggles) - frogpilot_tracking.update(now, time_validated, sm, frogpilot_toggles) + starpilot_tracking.update(now, time_validated, sm, starpilot_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) + starpilot_plan_send = messaging.new_message("starpilotPlan") + starpilot_plan_send.starpilotPlan.starpilotToggles = json.dumps(vars(starpilot_toggles)) + starpilot_plan_send.starpilotPlan.themeUpdated = theme_manager.theme_updated + pm.send("starpilotPlan", starpilot_plan_send) started_previously = started @@ -205,18 +206,18 @@ def frogpilot_thread(): next_drive_stats_sync = 0.0 if rate_keeper.frame % ASSET_CHECK_RATE == 0: - check_assets(now, model_manager, theme_manager, thread_manager, params, params_memory, frogpilot_toggles) + check_assets(now, model_manager, theme_manager, thread_manager, params, params_memory, starpilot_toggles) - if params_memory.get_bool("FrogPilotTogglesUpdated") or theme_manager.theme_updated: - frogpilot_toggles = update_toggles(frogpilot_variables, started, theme_manager, thread_manager, time_validated, params, frogpilot_toggles) + if params_memory.get_bool("StarPilotTogglesUpdated") or theme_manager.theme_updated: + starpilot_toggles = update_toggles(starpilot_variables, started, theme_manager, thread_manager, time_validated, params, starpilot_toggles) 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 |= now.second == 0 and (now.minute % 60 == 0 or (now.minute % 5 == 0 and starpilot_variables.frogs_go_moo)) run_update_checks &= time_validated if run_update_checks: - theme_manager.update_active_theme(time_validated, frogpilot_toggles) - thread_manager.run_with_lock(update_checks, (now, model_manager, theme_manager, thread_manager, params, params_memory, frogpilot_toggles)) + theme_manager.update_active_theme(time_validated, starpilot_toggles) + thread_manager.run_with_lock(update_checks, (now, model_manager, theme_manager, thread_manager, params, params_memory, starpilot_toggles)) run_update_checks = False elif not time_validated: @@ -224,16 +225,16 @@ def frogpilot_thread(): if not time_validated: continue - theme_manager.update_active_theme(time_validated, frogpilot_toggles) + theme_manager.update_active_theme(time_validated, starpilot_toggles) if not started: thread_manager.run_with_lock(send_stats) - thread_manager.run_with_lock(update_checks, (now, model_manager, theme_manager, thread_manager, params, params_memory, frogpilot_toggles, True)) + thread_manager.run_with_lock(update_checks, (now, model_manager, theme_manager, thread_manager, params, params_memory, starpilot_toggles, True)) rate_keeper.keep_time() def main(): - frogpilot_thread() + starpilot_thread() if __name__ == "__main__": main() diff --git a/frogpilot/system/device_syncd.py b/starpilot/system/device_syncd.py similarity index 83% rename from frogpilot/system/device_syncd.py rename to starpilot/system/device_syncd.py index 967d69a4..42695cb8 100644 --- a/frogpilot/system/device_syncd.py +++ b/starpilot/system/device_syncd.py @@ -8,8 +8,8 @@ from openpilot.common.params import Params, ParamKeyFlag, ParamKeyType from openpilot.common.realtime import Ratekeeper from openpilot.common.time_helpers import system_time_valid -from openpilot.frogpilot.common.frogpilot_utilities import get_frogpilot_api_info, is_url_pingable -from openpilot.frogpilot.common.frogpilot_variables import EXCLUDED_KEYS, FROGPILOT_API, update_frogpilot_toggles +from openpilot.starpilot.common.starpilot_utilities import get_starpilot_api_info, is_url_pingable +from openpilot.starpilot.common.starpilot_variables import EXCLUDED_KEYS, STARPILOT_API, update_starpilot_toggles POND_PRESENCE_INTERVAL_ACTIVE = 60 POND_PRESENCE_INTERVAL_IDLE = 240 @@ -22,24 +22,24 @@ def check_toggles(started, params, sm=None, boot_run=False): if not params.get_bool("PondPaired"): return None - if not is_url_pingable(FROGPILOT_API): + if not is_url_pingable(STARPILOT_API): return None if not boot_run: - if started and not sm["frogpilotCarState"].isParked: + if started and not sm["starpilotCarState"].isParked: return None if sm["deviceState"].screenBrightnessPercent == 0: return None try: - api_token, _, device_type, dongle_id = get_frogpilot_api_info() + api_token, _, device_type, dongle_id = get_starpilot_api_info() if not dongle_id or not api_token: return None response = requests.get( - f"{FROGPILOT_API}/pond/toggles/pending", + f"{STARPILOT_API}/pond/toggles/pending", params={"dongle_id": dongle_id, "api_token": api_token}, - headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, + headers={"Content-Type": "application/json", "User-Agent": "starpilot-api/1.0"}, timeout=10, ) response.raise_for_status() @@ -76,16 +76,16 @@ def check_toggles(started, params, sm=None, boot_run=False): print(f"Skipping remote toggle {key}: {exception}") continue - update_frogpilot_toggles() + update_starpilot_toggles() requests.post( - f"{FROGPILOT_API}/pond/toggles/ack", + f"{STARPILOT_API}/pond/toggles/ack", json={ "api_token": api_token, "device": device_type, - "frogpilot_dongle_id": dongle_id, + "starpilot_dongle_id": dongle_id, }, - headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, + headers={"Content-Type": "application/json", "User-Agent": "starpilot-api/1.0"}, timeout=10, ).raise_for_status() @@ -104,7 +104,7 @@ def ping_pond_presence(interval, parked, started, state_changed): return try: - api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() + api_token, build_metadata, device_type, dongle_id = get_starpilot_api_info() if not dongle_id or not api_token: return @@ -113,15 +113,15 @@ def ping_pond_presence(interval, parked, started, state_changed): "build_metadata": build_metadata, "device": device_type, "dongle_id": dongle_id, - "frogpilot_dongle_id": dongle_id, + "starpilot_dongle_id": dongle_id, "is_onroad": bool(started), "is_parked": bool(parked), } response = requests.post( - f"{FROGPILOT_API}/pond/presence/device", + f"{STARPILOT_API}/pond/presence/device", json=payload, - headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, + headers={"Content-Type": "application/json", "User-Agent": "starpilot-api/1.0"}, timeout=10, ) response.raise_for_status() @@ -132,11 +132,11 @@ def ping_pond_presence(interval, parked, started, state_changed): def upload_toggles(params): - if not is_url_pingable(FROGPILOT_API): + if not is_url_pingable(STARPILOT_API): return False try: - api_token, build_metadata, device_type, dongle_id = get_frogpilot_api_info() + api_token, build_metadata, device_type, dongle_id = get_starpilot_api_info() if not dongle_id or not api_token: return False @@ -164,19 +164,19 @@ def upload_toggles(params): "build_metadata": build_metadata, "device": device_type, "dongle_id": dongle_id, - "frogpilot_dongle_id": dongle_id, + "starpilot_dongle_id": dongle_id, "toggles": toggles, } response = requests.post( - f"{FROGPILOT_API}/pond/toggles/sync", + f"{STARPILOT_API}/pond/toggles/sync", json=payload, - headers={"Content-Type": "application/json", "User-Agent": "frogpilot-api/1.0"}, + headers={"Content-Type": "application/json", "User-Agent": "starpilot-api/1.0"}, timeout=10, ) response.raise_for_status() - print("Successfully uploaded toggles to FrogPilot.com") + print("Successfully uploaded toggles to StarPilot.com") return True except Exception as e: @@ -187,7 +187,7 @@ def upload_toggles(params): def pond_thread(): rate_keeper = Ratekeeper(1, None) - sm = messaging.SubMaster(["deviceState", "frogpilotCarState"]) + sm = messaging.SubMaster(["deviceState", "starpilotCarState"]) params = Params(return_defaults=True) @@ -201,7 +201,7 @@ def pond_thread(): while True: sm.update(0) - parked = sm["frogpilotCarState"].isParked + parked = sm["starpilotCarState"].isParked started = sm["deviceState"].started state_changed = started != previous_started or parked != previous_parked diff --git a/frogpilot/system/environment_variables b/starpilot/system/environment_variables similarity index 100% rename from frogpilot/system/environment_variables rename to starpilot/system/environment_variables diff --git a/frogpilot/system/environment_variables.backup b/starpilot/system/environment_variables.backup similarity index 100% rename from frogpilot/system/environment_variables.backup rename to starpilot/system/environment_variables.backup diff --git a/frogpilot/system/galaxy/bin/frpc_darwin_amd64 b/starpilot/system/galaxy/bin/frpc_darwin_amd64 similarity index 100% rename from frogpilot/system/galaxy/bin/frpc_darwin_amd64 rename to starpilot/system/galaxy/bin/frpc_darwin_amd64 diff --git a/frogpilot/system/galaxy/bin/frpc_darwin_arm64 b/starpilot/system/galaxy/bin/frpc_darwin_arm64 similarity index 100% rename from frogpilot/system/galaxy/bin/frpc_darwin_arm64 rename to starpilot/system/galaxy/bin/frpc_darwin_arm64 diff --git a/frogpilot/system/galaxy/bin/frpc_linux_amd64 b/starpilot/system/galaxy/bin/frpc_linux_amd64 similarity index 100% rename from frogpilot/system/galaxy/bin/frpc_linux_amd64 rename to starpilot/system/galaxy/bin/frpc_linux_amd64 diff --git a/frogpilot/system/galaxy/bin/frpc_linux_arm64 b/starpilot/system/galaxy/bin/frpc_linux_arm64 similarity index 100% rename from frogpilot/system/galaxy/bin/frpc_linux_arm64 rename to starpilot/system/galaxy/bin/frpc_linux_arm64 diff --git a/frogpilot/system/galaxy/galaxy.py b/starpilot/system/galaxy/galaxy.py similarity index 99% rename from frogpilot/system/galaxy/galaxy.py rename to starpilot/system/galaxy/galaxy.py index 8537ccc0..539931ab 100644 --- a/frogpilot/system/galaxy/galaxy.py +++ b/starpilot/system/galaxy/galaxy.py @@ -17,7 +17,7 @@ from openpilot.system.hardware import HARDWARE from openpilot.system.hardware.hw import Paths if HARDWARE.get_device_type() == "pc": - GALAXY_DIR = Path(Paths.comma_home()) / "frogpilot" / "data" / "galaxy" + GALAXY_DIR = Path(Paths.comma_home()) / "starpilot" / "data" / "galaxy" else: GALAXY_DIR = Path("/data/galaxy") FRPC_VERSION = "0.67.0" diff --git a/frogpilot/system/speed_limit_filler.py b/starpilot/system/speed_limit_filler.py similarity index 97% rename from frogpilot/system/speed_limit_filler.py rename to starpilot/system/speed_limit_filler.py index 4fa4882d..b5815b6b 100644 --- a/frogpilot/system/speed_limit_filler.py +++ b/starpilot/system/speed_limit_filler.py @@ -13,7 +13,7 @@ from openpilot.common.constants import CV from openpilot.common.gps import get_gps_location_service from openpilot.common.params import Params -from openpilot.frogpilot.common.frogpilot_utilities import calculate_distance_to_point, calculate_lane_width, is_url_pingable +from openpilot.starpilot.common.starpilot_utilities import calculate_distance_to_point, calculate_lane_width, is_url_pingable NetworkType = log.DeviceState.NetworkType @@ -46,11 +46,11 @@ class MapSpeedLogger: self.session = requests.Session() self.session.headers.update({"Accept-Language": "en"}) - self.session.headers.update({"User-Agent": "frogpilot-map-speed-logger/1.0 (https://github.com/FrogAi/FrogPilot)"}) + self.session.headers.update({"User-Agent": "starpilot-map-speed-logger/1.0 (https://github.com/FrogAi/StarPilot)"}) self.gps_location_service = get_gps_location_service(self.params) - self.sm = messaging.SubMaster(["deviceState", "frogpilotCarState", "frogpilotPlan", self.gps_location_service, "mapdOut", "modelV2"]) + self.sm = messaging.SubMaster(["deviceState", "starpilotCarState", "starpilotPlan", self.gps_location_service, "mapdOut", "modelV2"]) @property def can_make_overpass_request(self): @@ -91,8 +91,8 @@ class MapSpeedLogger: def get_speed_limit_source(self): sources = [ - (self.sm["frogpilotPlan"].slcMapboxSpeedLimit, "Mapbox"), - (self.sm["frogpilotCarState"].dashboardSpeedLimit, "Dashboard") + (self.sm["starpilotPlan"].slcMapboxSpeedLimit, "Mapbox"), + (self.sm["starpilotCarState"].dashboardSpeedLimit, "Dashboard") ] for speed_limit, source in sources: if speed_limit > 0: diff --git a/frogpilot/system/frogpilot_stats.py b/starpilot/system/starpilot_stats.py similarity index 78% rename from frogpilot/system/frogpilot_stats.py rename to starpilot/system/starpilot_stats.py index f1587271..35df7b62 100644 --- a/frogpilot/system/frogpilot_stats.py +++ b/starpilot/system/starpilot_stats.py @@ -18,8 +18,8 @@ except ModuleNotFoundError: from openpilot.system.hardware import HARDWARE from openpilot.system.version import get_build_metadata -from openpilot.frogpilot.common.frogpilot_utilities import clean_model_name, run_cmd -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles, params +from openpilot.starpilot.common.starpilot_utilities import clean_model_name, run_cmd +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles, params BASE_URL = "https://nominatim.openstreetmap.org" MINIMUM_POPULATION = 100_000 @@ -77,7 +77,7 @@ def get_city_center(latitude, longitude): try: with requests.Session() as session: session.headers.update({"Accept-Language": "en"}) - session.headers.update({"User-Agent": "frogpilot-city-center-checker/1.0 (https://github.com/FrogAi/FrogPilot)"}) + session.headers.update({"User-Agent": "starpilot-city-center-checker/1.0 (https://github.com/FrogAi/StarPilot)"}) response = session.get(f"{BASE_URL}/reverse", params={"addressdetails": 1, "extratags": 0, "format": "jsonv2", "lat": latitude, "lon": longitude, "namedetails": 0, "zoom": 14}, timeout=10) response.raise_for_status() @@ -170,19 +170,19 @@ def is_up_to_date(build_metadata): def send_stats(): try: build_metadata = get_build_metadata() - frogpilot_toggles = get_frogpilot_toggles() + starpilot_toggles = get_starpilot_toggles() - frogs_go_moo = getattr(frogpilot_toggles, "frogs_go_moo", getattr(frogpilot_toggles, "frogsgomoo_tweak", False)) + frogs_go_moo = getattr(starpilot_toggles, "frogs_go_moo", getattr(starpilot_toggles, "frogsgomoo_tweak", False)) if frogs_go_moo: return - if frogpilot_toggles.car_make == "mock": + if starpilot_toggles.car_make == "mock": return bucket = "StarPilot" org_ID = "StarPilot" url = "https://stats.firestar.link" - frogpilot_stats = _json_object(params.get("FrogPilotStats")) + starpilot_stats = _json_object(params.get("StarPilotStats")) location = _json_object(params.get("LastGPSPosition")) if not (location.get("latitude") and location.get("longitude")): @@ -192,11 +192,11 @@ def send_stats(): latitude, longitude, city, state, country = get_city_center(original_latitude, original_longitude) theme_sources = [ - frogpilot_toggles.icon_pack.replace("-animated", ""), - frogpilot_toggles.color_scheme, - frogpilot_toggles.distance_icons.replace("-animated", ""), - frogpilot_toggles.signal_icons.replace("-animated", ""), - frogpilot_toggles.sound_pack + starpilot_toggles.icon_pack.replace("-animated", ""), + starpilot_toggles.color_scheme, + starpilot_toggles.distance_icons.replace("-animated", ""), + starpilot_toggles.signal_icons.replace("-animated", ""), + starpilot_toggles.sound_pack ] theme_counter = Counter(theme_sources) @@ -208,46 +208,46 @@ def send_stats(): now = datetime.now(timezone.utc) device_type = HARDWARE.get_device_type() - stats_dongle_id = params.get("FrogPilotDongleId", encoding="utf-8") or params.get("DongleId", encoding="utf-8") or "unknown" + stats_dongle_id = params.get("StarPilotDongleId", encoding="utf-8") or params.get("DongleId", encoding="utf-8") or "unknown" user_point = ( Point("user_stats") - .tag("car_make", "GM" if frogpilot_toggles.car_make == "gm" else frogpilot_toggles.car_make.title()) - .tag("car_model", frogpilot_toggles.car_model) + .tag("car_make", "GM" if starpilot_toggles.car_make == "gm" else starpilot_toggles.car_make.title()) + .tag("car_model", starpilot_toggles.car_model) .tag("city", city) .tag("country", country) .tag("device", device_type) .tag("device_generation", get_device_generation(device_type)) - .tag("driving_model", clean_model_name(frogpilot_toggles.model_name)) + .tag("driving_model", clean_model_name(starpilot_toggles.model_name)) .tag("state", state) .tag("theme", selected_theme.title()) .tag("branch", build_metadata.channel) .tag("dongle_id", stats_dongle_id) - .field("blocked_user", frogpilot_toggles.block_user) - .field("current_months_kilometers", int(frogpilot_stats.get("CurrentMonthsKilometers", 0))) + .field("blocked_user", starpilot_toggles.block_user) + .field("current_months_kilometers", int(starpilot_stats.get("CurrentMonthsKilometers", 0))) .field("event", 1) - .field("frogpilot_drives", int(frogpilot_stats.get("FrogPilotDrives", 0))) - .field("frogpilot_hours", float(frogpilot_stats.get("FrogPilotSeconds", 0)) / (60 * 60)) - .field("frogpilot_miles", float(frogpilot_stats.get("FrogPilotMeters", 0)) * METER_TO_MILE) - .field("goat_scream", frogpilot_toggles.goat_scream_alert) - .field("has_cc_long", frogpilot_toggles.has_cc_long) - .field("has_openpilot_longitudinal", frogpilot_toggles.openpilot_longitudinal) - .field("has_pedal", frogpilot_toggles.has_pedal) - .field("has_sdsu", frogpilot_toggles.has_sdsu) - .field("has_sascm", getattr(frogpilot_toggles, "has_sascm", False)) - .field("has_zss", frogpilot_toggles.has_zss) + .field("starpilot_drives", int(starpilot_stats.get("StarPilotDrives", 0))) + .field("starpilot_hours", float(starpilot_stats.get("StarPilotSeconds", 0)) / (60 * 60)) + .field("starpilot_miles", float(starpilot_stats.get("StarPilotMeters", 0)) * METER_TO_MILE) + .field("goat_scream", starpilot_toggles.goat_scream_alert) + .field("has_cc_long", starpilot_toggles.has_cc_long) + .field("has_openpilot_longitudinal", starpilot_toggles.openpilot_longitudinal) + .field("has_pedal", starpilot_toggles.has_pedal) + .field("has_sdsu", starpilot_toggles.has_sdsu) + .field("has_sascm", getattr(starpilot_toggles, "has_sascm", False)) + .field("has_zss", starpilot_toggles.has_zss) .field("latitude", latitude) .field("longitude", longitude) - .field("rainbow_path", frogpilot_toggles.rainbow_path) - .field("random_events", frogpilot_toggles.random_events) - .field("total_aol_seconds", float(frogpilot_stats.get("AOLTime", 0))) - .field("total_lateral_seconds", float(frogpilot_stats.get("LateralTime", 0))) - .field("total_longitudinal_seconds", float(frogpilot_stats.get("LongitudinalTime", 0))) - .field("total_tracked_seconds", float(frogpilot_stats.get("TrackedTime", 0))) + .field("rainbow_path", starpilot_toggles.rainbow_path) + .field("random_events", starpilot_toggles.random_events) + .field("total_aol_seconds", float(starpilot_stats.get("AOLTime", 0))) + .field("total_lateral_seconds", float(starpilot_stats.get("LateralTime", 0))) + .field("total_longitudinal_seconds", float(starpilot_stats.get("LongitudinalTime", 0))) + .field("total_tracked_seconds", float(starpilot_stats.get("TrackedTime", 0))) .field("tuning_level", params.get_int("TuningLevel") + 1 if params.get_bool("TuningLevelConfirmed") else 0) .field("up_to_date", is_up_to_date(build_metadata)) - .field("using_stock_acc", not (frogpilot_toggles.has_cc_long or frogpilot_toggles.openpilot_longitudinal)) + .field("using_stock_acc", not (starpilot_toggles.has_cc_long or starpilot_toggles.openpilot_longitudinal)) .time(now) ) @@ -256,6 +256,6 @@ def send_stats(): client = InfluxDBClient(org=org_ID, token=org_ID, url=url) client.write_api(write_options=SYNCHRONOUS).write(bucket=bucket, org=org_ID, record=all_points) - print("Successfully sent FrogPilot stats!") + print("Successfully sent StarPilot stats!") except Exception as exception: - print(f"Failed to send FrogPilot stats: {exception}") + print(f"Failed to send StarPilot stats: {exception}") diff --git a/starpilot/system/starpilot_tracking.py b/starpilot/system/starpilot_tracking.py new file mode 100644 index 00000000..8ca630ae --- /dev/null +++ b/starpilot/system/starpilot_tracking.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +from openpilot.common.constants import CV +from openpilot.common.realtime import DT_MDL +from openpilot.selfdrive.car.cruise import V_CRUISE_MAX +from openpilot.selfdrive.selfdrived.events import STARPILOT_EVENT_NAME +from openpilot.selfdrive.selfdrived.selfdrived import LONGITUDINAL_PERSONALITY_MAP, State +from openpilot.selfdrive.selfdrived.state import ACTIVE_STATES +from openpilot.selfdrive.ui.soundd import StarPilotAudibleAlert + +from openpilot.starpilot.common.starpilot_utilities import clean_model_name +from openpilot.starpilot.controls.lib.starpilot_events import RANDOM_EVENT_END, RANDOM_EVENT_START +from openpilot.starpilot.controls.lib.weather_checker import WEATHER_CATEGORIES + +class StarPilotTracking: + def __init__(self, starpilot_planner, starpilot_toggles): + self.params = starpilot_planner.params + + self.starpilot_events = starpilot_planner.starpilot_events + self.starpilot_weather = starpilot_planner.starpilot_weather + + self.starpilot_stats = self.params.get("StarPilotStats") + self.starpilot_stats.pop("CurrentMonthsKilometers", None) + self.starpilot_stats.pop("ResetStats", None) + + self.drive_added = False + self.previously_enabled = False + + self.distance_since_override = 0 + self.tracked_time = 0 + + self.previous_random_events = set() + + self.previous_alert = None + self.previous_sound = StarPilotAudibleAlert.none + self.previous_state = State.disabled + + self.model_name = clean_model_name(starpilot_toggles.model_name) + + def update(self, now, time_validated, sm, starpilot_toggles): + v_cruise = min(sm["carState"].vCruiseCluster, V_CRUISE_MAX) * CV.KPH_TO_MS + v_ego = max(sm["carState"].vEgo, 0) + + distance_driven = v_ego * DT_MDL + self.previously_enabled |= sm["selfdriveState"].enabled or sm["starpilotCarState"].alwaysOnLateralEnabled + self.tracked_time += DT_MDL + + if sm["selfdriveState"].alertType not in (self.previous_alert, ""): + alert_name = sm["selfdriveState"].alertType.split('/')[0] + total_events = self.starpilot_stats.get("TotalEvents", {}) + total_events[alert_name] = total_events.get(alert_name, 0) + 1 + self.starpilot_stats["TotalEvents"] = total_events + self.previous_alert = sm["selfdriveState"].alertType + + if sm["selfdriveState"].enabled: + key = str(round(v_cruise, 2)) + total_cruise_speed_times = self.starpilot_stats.get("CruiseSpeedTimes", {}) + total_cruise_speed_times[key] = total_cruise_speed_times.get(key, 0) + DT_MDL + self.starpilot_stats["CruiseSpeedTimes"] = total_cruise_speed_times + + self.starpilot_stats["CurrentMonthsMeters"] = self.starpilot_stats.get("CurrentMonthsMeters", 0) + distance_driven + + if self.starpilot_weather.sunrise != 0 and self.starpilot_weather.sunset != 0: + if self.starpilot_weather.is_daytime: + self.starpilot_stats["DayTime"] = self.starpilot_stats.get("DayTime", 0) + DT_MDL + else: + self.starpilot_stats["NightTime"] = self.starpilot_stats.get("NightTime", 0) + DT_MDL + + if sm["selfdriveState"].state != self.previous_state: + if sm["selfdriveState"].state in ACTIVE_STATES and self.previous_state not in ACTIVE_STATES: + self.starpilot_stats["Engages"] = self.starpilot_stats.get("Engages", 0) + 1 + if starpilot_toggles.sound_pack == "frog": + self.starpilot_stats["FrogChirps"] = self.starpilot_stats.get("FrogChirps", 0) + 1 + + elif sm["selfdriveState"].state == State.disabled and self.previous_state in ACTIVE_STATES: + self.starpilot_stats["Disengages"] = self.starpilot_stats.get("Disengages", 0) + 1 + if starpilot_toggles.sound_pack == "frog": + self.starpilot_stats["FrogSqueaks"] = self.starpilot_stats.get("FrogSqueaks", 0) + 1 + + if sm["selfdriveState"].state == State.overriding and self.previous_state != State.overriding: + self.starpilot_stats["Overrides"] = self.starpilot_stats.get("Overrides", 0) + 1 + + self.previous_state = sm["selfdriveState"].state + + if sm["selfdriveState"].experimentalMode: + self.starpilot_stats["ExperimentalModeTime"] = self.starpilot_stats.get("ExperimentalModeTime", 0) + DT_MDL + + self.starpilot_stats["StarPilotMeters"] = self.starpilot_stats.get("StarPilotMeters", 0) + distance_driven + + if sm["starpilotSelfdriveState"].alertSound != self.previous_sound: + if sm["starpilotSelfdriveState"].alertSound == StarPilotAudibleAlert.goat: + self.starpilot_stats["GoatScreams"] = self.starpilot_stats.get("GoatScreams", 0) + 1 + + self.previous_sound = sm["starpilotSelfdriveState"].alertSound + + self.starpilot_stats["MaxAcceleration"] = max(self.starpilot_events.max_acceleration, self.starpilot_stats.get("MaxAcceleration", 0)) + + if sm["carControl"].latActive: + self.starpilot_stats["LateralTime"] = self.starpilot_stats.get("LateralTime", 0) + DT_MDL + if sm["carControl"].longActive: + self.starpilot_stats["LongitudinalTime"] = self.starpilot_stats.get("LongitudinalTime", 0) + DT_MDL + + personality_name = LONGITUDINAL_PERSONALITY_MAP.get(sm["selfdriveState"].personality, "Unknown").capitalize() + total_personality_times = self.starpilot_stats.get("PersonalityTimes", {}) + total_personality_times[personality_name] = total_personality_times.get(personality_name, 0) + DT_MDL + self.starpilot_stats["PersonalityTimes"] = total_personality_times + elif sm["starpilotCarState"].alwaysOnLateralEnabled: + self.starpilot_stats["AOLTime"] = self.starpilot_stats.get("AOLTime", 0) + DT_MDL + + if sm["selfdriveState"].state in (State.disabled, State.overriding): + self.distance_since_override = 0 + self.starpilot_stats["OverrideTime"] = self.starpilot_stats.get("OverrideTime", 0) + DT_MDL + else: + self.distance_since_override += distance_driven + self.starpilot_stats["LongestDistanceWithoutOverride"] = max(self.distance_since_override, self.starpilot_stats.get("LongestDistanceWithoutOverride", 0)) + + current_random_events = {event for event in self.starpilot_events.events.names if RANDOM_EVENT_START <= event <= RANDOM_EVENT_END} + if len(current_random_events) > 0: + new_events = current_random_events - self.previous_random_events + if new_events: + total_random_events = self.starpilot_stats.get("RandomEvents", {}) + for event in new_events: + event_name = STARPILOT_EVENT_NAME[event] + total_random_events[event_name] = total_random_events.get(event_name, 0) + 1 + self.starpilot_stats["RandomEvents"] = total_random_events + + self.previous_random_events = current_random_events + + if sm["carState"].standstill: + self.starpilot_stats["StandstillTime"] = self.starpilot_stats.get("StandstillTime", 0) + DT_MDL + if self.starpilot_events.stopped_for_light: + self.starpilot_stats["StopLightTime"] = self.starpilot_stats.get("StopLightTime", 0) + DT_MDL + + weather_api_calls = self.starpilot_stats.get("WeatherAPICalls", {}) + weather_api_calls["2.5"] = weather_api_calls.get("2.5", 0) + self.starpilot_weather.api_25_calls + weather_api_calls["3.0"] = weather_api_calls.get("3.0", 0) + self.starpilot_weather.api_3_calls + self.starpilot_stats["WeatherAPICalls"] = weather_api_calls + + self.starpilot_weather.api_25_calls = 0 + self.starpilot_weather.api_3_calls = 0 + + suffix = "unknown" + for category in WEATHER_CATEGORIES.values(): + if any(start <= self.starpilot_weather.weather_id <= end for start, end in category["ranges"]): + suffix = category["suffix"] + break + + weather_times = self.starpilot_stats.get("WeatherTimes", {}) + weather_times[suffix] = weather_times.get(suffix, 0) + DT_MDL + self.starpilot_stats["WeatherTimes"] = weather_times + + if self.tracked_time >= 60 and sm["carState"].standstill and self.previously_enabled: + if time_validated: + current_month = now.month + if current_month != self.starpilot_stats.get("Month"): + self.starpilot_stats.update({ + "CurrentMonthsMeters": 0, + "Month": current_month + }) + + self.starpilot_stats["StarPilotSeconds"] = self.starpilot_stats.get("StarPilotSeconds", 0) + self.tracked_time + + current_model = self.model_name + total_model_times = self.starpilot_stats.get("ModelTimes", {}) + total_model_times[current_model] = total_model_times.get(current_model, 0) + self.tracked_time + self.starpilot_stats["ModelTimes"] = total_model_times + + self.starpilot_stats["TrackedTime"] = self.starpilot_stats.get("TrackedTime", 0) + self.tracked_time + + self.tracked_time = 0 + + if not self.drive_added: + self.starpilot_stats["StarPilotDrives"] = self.starpilot_stats.get("StarPilotDrives", 0) + 1 + self.drive_added = True + + self.params.put_nonblocking("StarPilotStats", dict(sorted(self.starpilot_stats.items()))) diff --git a/frogpilot/system/the_pond/README.md b/starpilot/system/the_pond/README.md similarity index 100% rename from frogpilot/system/the_pond/README.md rename to starpilot/system/the_pond/README.md diff --git a/frogpilot/system/the_pond/assets/components/home/home.css b/starpilot/system/the_pond/assets/components/home/home.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/home/home.css rename to starpilot/system/the_pond/assets/components/home/home.css diff --git a/frogpilot/system/the_pond/assets/components/home/home.js b/starpilot/system/the_pond/assets/components/home/home.js similarity index 98% rename from frogpilot/system/the_pond/assets/components/home/home.js rename to starpilot/system/the_pond/assets/components/home/home.js index dd59486a..e3ba7cbe 100644 --- a/frogpilot/system/the_pond/assets/components/home/home.js +++ b/starpilot/system/the_pond/assets/components/home/home.js @@ -99,7 +99,7 @@ function renderDiskUsageSection(state) {
${statBlock("All Time", driveStats.all)} ${statBlock("Past Week", driveStats.week)} - ${statBlock("StarPilot", driveStats.frogpilot)} + ${statBlock("StarPilot", driveStats.starpilot)}

Disk Usage

diff --git a/frogpilot/system/the_pond/assets/components/main.css b/starpilot/system/the_pond/assets/components/main.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/main.css rename to starpilot/system/the_pond/assets/components/main.css diff --git a/frogpilot/system/the_pond/assets/components/modal.css b/starpilot/system/the_pond/assets/components/modal.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/modal.css rename to starpilot/system/the_pond/assets/components/modal.css diff --git a/frogpilot/system/the_pond/assets/components/modal.js b/starpilot/system/the_pond/assets/components/modal.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/modal.js rename to starpilot/system/the_pond/assets/components/modal.js diff --git a/frogpilot/system/the_pond/assets/components/navigation/navigation_destination.css b/starpilot/system/the_pond/assets/components/navigation/navigation_destination.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/navigation/navigation_destination.css rename to starpilot/system/the_pond/assets/components/navigation/navigation_destination.css diff --git a/frogpilot/system/the_pond/assets/components/navigation/navigation_destination.js b/starpilot/system/the_pond/assets/components/navigation/navigation_destination.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/navigation/navigation_destination.js rename to starpilot/system/the_pond/assets/components/navigation/navigation_destination.js diff --git a/frogpilot/system/the_pond/assets/components/navigation/navigation_keys.css b/starpilot/system/the_pond/assets/components/navigation/navigation_keys.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/navigation/navigation_keys.css rename to starpilot/system/the_pond/assets/components/navigation/navigation_keys.css diff --git a/frogpilot/system/the_pond/assets/components/navigation/navigation_keys.js b/starpilot/system/the_pond/assets/components/navigation/navigation_keys.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/navigation/navigation_keys.js rename to starpilot/system/the_pond/assets/components/navigation/navigation_keys.js diff --git a/frogpilot/system/the_pond/assets/components/navigation/navigation_utilities.js b/starpilot/system/the_pond/assets/components/navigation/navigation_utilities.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/navigation/navigation_utilities.js rename to starpilot/system/the_pond/assets/components/navigation/navigation_utilities.js diff --git a/frogpilot/system/the_pond/assets/components/recordings/dashcam_routes.css b/starpilot/system/the_pond/assets/components/recordings/dashcam_routes.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/recordings/dashcam_routes.css rename to starpilot/system/the_pond/assets/components/recordings/dashcam_routes.css diff --git a/frogpilot/system/the_pond/assets/components/recordings/dashcam_routes.js b/starpilot/system/the_pond/assets/components/recordings/dashcam_routes.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/recordings/dashcam_routes.js rename to starpilot/system/the_pond/assets/components/recordings/dashcam_routes.js diff --git a/frogpilot/system/the_pond/assets/components/recordings/screen_recordings.css b/starpilot/system/the_pond/assets/components/recordings/screen_recordings.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/recordings/screen_recordings.css rename to starpilot/system/the_pond/assets/components/recordings/screen_recordings.css diff --git a/frogpilot/system/the_pond/assets/components/recordings/screen_recordings.js b/starpilot/system/the_pond/assets/components/recordings/screen_recordings.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/recordings/screen_recordings.js rename to starpilot/system/the_pond/assets/components/recordings/screen_recordings.js diff --git a/frogpilot/system/the_pond/assets/components/router.js b/starpilot/system/the_pond/assets/components/router.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/router.js rename to starpilot/system/the_pond/assets/components/router.js diff --git a/frogpilot/system/the_pond/assets/components/settings.css b/starpilot/system/the_pond/assets/components/settings.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/settings.css rename to starpilot/system/the_pond/assets/components/settings.css diff --git a/frogpilot/system/the_pond/assets/components/settings.js b/starpilot/system/the_pond/assets/components/settings.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/settings.js rename to starpilot/system/the_pond/assets/components/settings.js diff --git a/frogpilot/system/the_pond/assets/components/sidebar.css b/starpilot/system/the_pond/assets/components/sidebar.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/sidebar.css rename to starpilot/system/the_pond/assets/components/sidebar.css diff --git a/frogpilot/system/the_pond/assets/components/sidebar.js b/starpilot/system/the_pond/assets/components/sidebar.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/sidebar.js rename to starpilot/system/the_pond/assets/components/sidebar.js diff --git a/frogpilot/system/the_pond/assets/components/tailscale/tailscale.css b/starpilot/system/the_pond/assets/components/tailscale/tailscale.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tailscale/tailscale.css rename to starpilot/system/the_pond/assets/components/tailscale/tailscale.css diff --git a/frogpilot/system/the_pond/assets/components/tailscale/tailscale.js b/starpilot/system/the_pond/assets/components/tailscale/tailscale.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tailscale/tailscale.js rename to starpilot/system/the_pond/assets/components/tailscale/tailscale.js diff --git a/frogpilot/system/the_pond/assets/components/tools/device_settings.css b/starpilot/system/the_pond/assets/components/tools/device_settings.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/device_settings.css rename to starpilot/system/the_pond/assets/components/tools/device_settings.css diff --git a/frogpilot/system/the_pond/assets/components/tools/device_settings.js b/starpilot/system/the_pond/assets/components/tools/device_settings.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/device_settings.js rename to starpilot/system/the_pond/assets/components/tools/device_settings.js diff --git a/frogpilot/system/the_pond/assets/components/tools/device_settings_layout.json b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json similarity index 99% rename from frogpilot/system/the_pond/assets/components/tools/device_settings_layout.json rename to starpilot/system/the_pond/assets/components/tools/device_settings_layout.json index 5dae5329..025cd007 100644 --- a/frogpilot/system/the_pond/assets/components/tools/device_settings_layout.json +++ b/starpilot/system/the_pond/assets/components/tools/device_settings_layout.json @@ -1331,7 +1331,7 @@ { "key": "CustomUI", "label": "Driving Screen Widgets", - "description": "Custom FrogPilot widgets for the driving screen.", + "description": "Custom StarPilot widgets for the driving screen.", "data_type": "bool", "ui_type": "toggle", "is_parent_toggle": true @@ -1606,8 +1606,8 @@ }, { "key": "CustomAlerts", - "label": "FrogPilot Alerts", - "description": "Optional FrogPilot alerts that highlight driving events in a more noticeable way.", + "label": "StarPilot Alerts", + "description": "Optional StarPilot alerts that highlight driving events in a more noticeable way.", "data_type": "bool", "ui_type": "toggle", "is_parent_toggle": true diff --git a/frogpilot/system/the_pond/assets/components/tools/doors.css b/starpilot/system/the_pond/assets/components/tools/doors.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/doors.css rename to starpilot/system/the_pond/assets/components/tools/doors.css diff --git a/frogpilot/system/the_pond/assets/components/tools/doors.js b/starpilot/system/the_pond/assets/components/tools/doors.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/doors.js rename to starpilot/system/the_pond/assets/components/tools/doors.js diff --git a/frogpilot/system/the_pond/assets/components/tools/error_logs.css b/starpilot/system/the_pond/assets/components/tools/error_logs.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/error_logs.css rename to starpilot/system/the_pond/assets/components/tools/error_logs.css diff --git a/frogpilot/system/the_pond/assets/components/tools/error_logs.js b/starpilot/system/the_pond/assets/components/tools/error_logs.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/error_logs.js rename to starpilot/system/the_pond/assets/components/tools/error_logs.js diff --git a/frogpilot/system/the_pond/assets/components/tools/galaxy.css b/starpilot/system/the_pond/assets/components/tools/galaxy.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/galaxy.css rename to starpilot/system/the_pond/assets/components/tools/galaxy.css diff --git a/frogpilot/system/the_pond/assets/components/tools/galaxy.js b/starpilot/system/the_pond/assets/components/tools/galaxy.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/galaxy.js rename to starpilot/system/the_pond/assets/components/tools/galaxy.js diff --git a/frogpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.css b/starpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.css rename to starpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.css diff --git a/frogpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.js b/starpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.js rename to starpilot/system/the_pond/assets/components/tools/longitudinal_maneuvers.js diff --git a/frogpilot/system/the_pond/assets/components/tools/model_manager.css b/starpilot/system/the_pond/assets/components/tools/model_manager.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/model_manager.css rename to starpilot/system/the_pond/assets/components/tools/model_manager.css diff --git a/frogpilot/system/the_pond/assets/components/tools/model_manager.js b/starpilot/system/the_pond/assets/components/tools/model_manager.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/model_manager.js rename to starpilot/system/the_pond/assets/components/tools/model_manager.js diff --git a/frogpilot/system/the_pond/assets/components/tools/plots.css b/starpilot/system/the_pond/assets/components/tools/plots.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/plots.css rename to starpilot/system/the_pond/assets/components/tools/plots.css diff --git a/frogpilot/system/the_pond/assets/components/tools/plots.js b/starpilot/system/the_pond/assets/components/tools/plots.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/plots.js rename to starpilot/system/the_pond/assets/components/tools/plots.js diff --git a/frogpilot/system/the_pond/assets/components/tools/speed_limits.css b/starpilot/system/the_pond/assets/components/tools/speed_limits.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/speed_limits.css rename to starpilot/system/the_pond/assets/components/tools/speed_limits.css diff --git a/frogpilot/system/the_pond/assets/components/tools/speed_limits.js b/starpilot/system/the_pond/assets/components/tools/speed_limits.js similarity index 94% rename from frogpilot/system/the_pond/assets/components/tools/speed_limits.js rename to starpilot/system/the_pond/assets/components/tools/speed_limits.js index 06630e5f..31272d1e 100644 --- a/frogpilot/system/the_pond/assets/components/tools/speed_limits.js +++ b/starpilot/system/the_pond/assets/components/tools/speed_limits.js @@ -19,7 +19,7 @@ export function SpeedLimits() {

diff --git a/frogpilot/system/the_pond/assets/components/tools/testing_ground.css b/starpilot/system/the_pond/assets/components/tools/testing_ground.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/testing_ground.css rename to starpilot/system/the_pond/assets/components/tools/testing_ground.css diff --git a/frogpilot/system/the_pond/assets/components/tools/testing_ground.js b/starpilot/system/the_pond/assets/components/tools/testing_ground.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/testing_ground.js rename to starpilot/system/the_pond/assets/components/tools/testing_ground.js diff --git a/frogpilot/system/the_pond/assets/components/tools/theme_maker.css b/starpilot/system/the_pond/assets/components/tools/theme_maker.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/theme_maker.css rename to starpilot/system/the_pond/assets/components/tools/theme_maker.css diff --git a/frogpilot/system/the_pond/assets/components/tools/theme_maker.js b/starpilot/system/the_pond/assets/components/tools/theme_maker.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/theme_maker.js rename to starpilot/system/the_pond/assets/components/tools/theme_maker.js diff --git a/frogpilot/system/the_pond/assets/components/tools/tmux.css b/starpilot/system/the_pond/assets/components/tools/tmux.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/tmux.css rename to starpilot/system/the_pond/assets/components/tools/tmux.css diff --git a/frogpilot/system/the_pond/assets/components/tools/tmux.js b/starpilot/system/the_pond/assets/components/tools/tmux.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/tmux.js rename to starpilot/system/the_pond/assets/components/tools/tmux.js diff --git a/frogpilot/system/the_pond/assets/components/tools/toggles.css b/starpilot/system/the_pond/assets/components/tools/toggles.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/toggles.css rename to starpilot/system/the_pond/assets/components/tools/toggles.css diff --git a/frogpilot/system/the_pond/assets/components/tools/toggles.js b/starpilot/system/the_pond/assets/components/tools/toggles.js similarity index 99% rename from frogpilot/system/the_pond/assets/components/tools/toggles.js rename to starpilot/system/the_pond/assets/components/tools/toggles.js index 8050fe6c..351652ab 100644 --- a/frogpilot/system/the_pond/assets/components/tools/toggles.js +++ b/starpilot/system/the_pond/assets/components/tools/toggles.js @@ -104,7 +104,7 @@ export function ToggleControl() { ${() => state.showResetDefaultModal ? Modal({ title: "Reset Toggles", - message: "Are you sure you want to reset all toggles to their default FrogPilot values?", + message: "Are you sure you want to reset all toggles to their default StarPilot values?", onConfirm: resetTogglesToDefault, onCancel: () => { state.showResetDefaultModal = false; }, confirmText: "Reset to Default" diff --git a/frogpilot/system/the_pond/assets/components/tools/troubleshoot.css b/starpilot/system/the_pond/assets/components/tools/troubleshoot.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/troubleshoot.css rename to starpilot/system/the_pond/assets/components/tools/troubleshoot.css diff --git a/frogpilot/system/the_pond/assets/components/tools/troubleshoot.js b/starpilot/system/the_pond/assets/components/tools/troubleshoot.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/troubleshoot.js rename to starpilot/system/the_pond/assets/components/tools/troubleshoot.js diff --git a/frogpilot/system/the_pond/assets/components/tools/tsk_manager.css b/starpilot/system/the_pond/assets/components/tools/tsk_manager.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/tsk_manager.css rename to starpilot/system/the_pond/assets/components/tools/tsk_manager.css diff --git a/frogpilot/system/the_pond/assets/components/tools/tsk_manager.js b/starpilot/system/the_pond/assets/components/tools/tsk_manager.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/tsk_manager.js rename to starpilot/system/the_pond/assets/components/tools/tsk_manager.js diff --git a/frogpilot/system/the_pond/assets/components/tools/update_manager.css b/starpilot/system/the_pond/assets/components/tools/update_manager.css similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/update_manager.css rename to starpilot/system/the_pond/assets/components/tools/update_manager.css diff --git a/frogpilot/system/the_pond/assets/components/tools/update_manager.js b/starpilot/system/the_pond/assets/components/tools/update_manager.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/update_manager.js rename to starpilot/system/the_pond/assets/components/tools/update_manager.js diff --git a/frogpilot/system/the_pond/assets/components/tools/vehicle_features.js b/starpilot/system/the_pond/assets/components/tools/vehicle_features.js similarity index 100% rename from frogpilot/system/the_pond/assets/components/tools/vehicle_features.js rename to starpilot/system/the_pond/assets/components/tools/vehicle_features.js diff --git a/frogpilot/system/the_pond/assets/images/about.txt b/starpilot/system/the_pond/assets/images/about.txt similarity index 100% rename from frogpilot/system/the_pond/assets/images/about.txt rename to starpilot/system/the_pond/assets/images/about.txt diff --git a/frogpilot/system/the_pond/assets/images/android-chrome-192x192.png b/starpilot/system/the_pond/assets/images/android-chrome-192x192.png similarity index 100% rename from frogpilot/system/the_pond/assets/images/android-chrome-192x192.png rename to starpilot/system/the_pond/assets/images/android-chrome-192x192.png diff --git a/frogpilot/system/the_pond/assets/images/android-chrome-512x512.png b/starpilot/system/the_pond/assets/images/android-chrome-512x512.png similarity index 100% rename from frogpilot/system/the_pond/assets/images/android-chrome-512x512.png rename to starpilot/system/the_pond/assets/images/android-chrome-512x512.png diff --git a/frogpilot/system/the_pond/assets/images/apple-touch-icon.png b/starpilot/system/the_pond/assets/images/apple-touch-icon.png similarity index 100% rename from frogpilot/system/the_pond/assets/images/apple-touch-icon.png rename to starpilot/system/the_pond/assets/images/apple-touch-icon.png diff --git a/frogpilot/system/the_pond/assets/images/favicon-16x16.png b/starpilot/system/the_pond/assets/images/favicon-16x16.png similarity index 100% rename from frogpilot/system/the_pond/assets/images/favicon-16x16.png rename to starpilot/system/the_pond/assets/images/favicon-16x16.png diff --git a/frogpilot/system/the_pond/assets/images/favicon-32x32.png b/starpilot/system/the_pond/assets/images/favicon-32x32.png similarity index 100% rename from frogpilot/system/the_pond/assets/images/favicon-32x32.png rename to starpilot/system/the_pond/assets/images/favicon-32x32.png diff --git a/frogpilot/system/the_pond/assets/images/favicon.ico b/starpilot/system/the_pond/assets/images/favicon.ico similarity index 100% rename from frogpilot/system/the_pond/assets/images/favicon.ico rename to starpilot/system/the_pond/assets/images/favicon.ico diff --git a/frogpilot/system/the_pond/assets/images/favicon.svg b/starpilot/system/the_pond/assets/images/favicon.svg similarity index 100% rename from frogpilot/system/the_pond/assets/images/favicon.svg rename to starpilot/system/the_pond/assets/images/favicon.svg diff --git a/frogpilot/system/the_pond/assets/images/main_logo.png b/starpilot/system/the_pond/assets/images/main_logo.png similarity index 100% rename from frogpilot/system/the_pond/assets/images/main_logo.png rename to starpilot/system/the_pond/assets/images/main_logo.png diff --git a/frogpilot/system/the_pond/assets/images/safari-pinned-tab.svg b/starpilot/system/the_pond/assets/images/safari-pinned-tab.svg similarity index 100% rename from frogpilot/system/the_pond/assets/images/safari-pinned-tab.svg rename to starpilot/system/the_pond/assets/images/safari-pinned-tab.svg diff --git a/frogpilot/system/the_pond/assets/images/site.webmanifest b/starpilot/system/the_pond/assets/images/site.webmanifest similarity index 100% rename from frogpilot/system/the_pond/assets/images/site.webmanifest rename to starpilot/system/the_pond/assets/images/site.webmanifest diff --git a/frogpilot/system/the_pond/assets/js/snackbar.js b/starpilot/system/the_pond/assets/js/snackbar.js similarity index 100% rename from frogpilot/system/the_pond/assets/js/snackbar.js rename to starpilot/system/the_pond/assets/js/snackbar.js diff --git a/frogpilot/system/the_pond/assets/js/utils.js b/starpilot/system/the_pond/assets/js/utils.js similarity index 100% rename from frogpilot/system/the_pond/assets/js/utils.js rename to starpilot/system/the_pond/assets/js/utils.js diff --git a/frogpilot/system/the_pond/assets/manifest.json b/starpilot/system/the_pond/assets/manifest.json similarity index 100% rename from frogpilot/system/the_pond/assets/manifest.json rename to starpilot/system/the_pond/assets/manifest.json diff --git a/frogpilot/system/the_pond/assets/vendor/arrow-core.js b/starpilot/system/the_pond/assets/vendor/arrow-core.js similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/arrow-core.js rename to starpilot/system/the_pond/assets/vendor/arrow-core.js diff --git a/frogpilot/system/the_pond/assets/vendor/bootstrap-icons/bootstrap-icons.min.css b/starpilot/system/the_pond/assets/vendor/bootstrap-icons/bootstrap-icons.min.css similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/bootstrap-icons/bootstrap-icons.min.css rename to starpilot/system/the_pond/assets/vendor/bootstrap-icons/bootstrap-icons.min.css diff --git a/frogpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff b/starpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff rename to starpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff diff --git a/frogpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 b/starpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 rename to starpilot/system/the_pond/assets/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 diff --git a/frogpilot/system/the_pond/assets/vendor/font-awesome/css/font-awesome.min.css b/starpilot/system/the_pond/assets/vendor/font-awesome/css/font-awesome.min.css similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/font-awesome/css/font-awesome.min.css rename to starpilot/system/the_pond/assets/vendor/font-awesome/css/font-awesome.min.css diff --git a/frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot b/starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot rename to starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.eot diff --git a/frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg b/starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg rename to starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.svg diff --git a/frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf rename to starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.ttf diff --git a/frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff b/starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff rename to starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff diff --git a/frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 b/starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 rename to starpilot/system/the_pond/assets/vendor/font-awesome/fonts/fontawesome-webfont.woff2 diff --git a/frogpilot/system/the_pond/assets/vendor/fonts/Inter-Bold.ttf b/starpilot/system/the_pond/assets/vendor/fonts/Inter-Bold.ttf similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/fonts/Inter-Bold.ttf rename to starpilot/system/the_pond/assets/vendor/fonts/Inter-Bold.ttf diff --git a/frogpilot/system/the_pond/assets/vendor/fonts/Inter-Regular.ttf b/starpilot/system/the_pond/assets/vendor/fonts/Inter-Regular.ttf similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/fonts/Inter-Regular.ttf rename to starpilot/system/the_pond/assets/vendor/fonts/Inter-Regular.ttf diff --git a/frogpilot/system/the_pond/assets/vendor/fonts/fonts.css b/starpilot/system/the_pond/assets/vendor/fonts/fonts.css similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/fonts/fonts.css rename to starpilot/system/the_pond/assets/vendor/fonts/fonts.css diff --git a/frogpilot/system/the_pond/assets/vendor/fonts/password.ttf b/starpilot/system/the_pond/assets/vendor/fonts/password.ttf similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/fonts/password.ttf rename to starpilot/system/the_pond/assets/vendor/fonts/password.ttf diff --git a/frogpilot/system/the_pond/assets/vendor/remix-router-1.3.1.js b/starpilot/system/the_pond/assets/vendor/remix-router-1.3.1.js similarity index 100% rename from frogpilot/system/the_pond/assets/vendor/remix-router-1.3.1.js rename to starpilot/system/the_pond/assets/vendor/remix-router-1.3.1.js diff --git a/frogpilot/system/the_pond/templates/index.html b/starpilot/system/the_pond/templates/index.html similarity index 100% rename from frogpilot/system/the_pond/templates/index.html rename to starpilot/system/the_pond/templates/index.html diff --git a/frogpilot/system/the_pond/the_pond.py b/starpilot/system/the_pond/the_pond.py similarity index 99% rename from frogpilot/system/the_pond/the_pond.py rename to starpilot/system/the_pond/the_pond.py index 4eb265bc..5107c16b 100644 --- a/frogpilot/system/the_pond/the_pond.py +++ b/starpilot/system/the_pond/the_pond.py @@ -38,11 +38,11 @@ from openpilot.system.loggerd.deleter import PRESERVE_ATTR_NAME, PRESERVE_ATTR_V from openpilot.system.version import get_build_metadata from panda import Panda -from openpilot.frogpilot.assets.theme_manager import HOLIDAY_THEME_PATH, THEME_COMPONENT_PARAMS -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, get_lock_status, run_cmd -from openpilot.frogpilot.common.frogpilot_variables import ACTIVE_THEME_PATH, ERROR_LOGS_PATH, EXCLUDED_KEYS, RESOURCES_REPO, SCREEN_RECORDINGS_PATH, THEME_SAVE_PATH,\ - update_frogpilot_toggles -from openpilot.frogpilot.common.testing_grounds import ( +from openpilot.starpilot.assets.theme_manager import HOLIDAY_THEME_PATH, THEME_COMPONENT_PARAMS +from openpilot.starpilot.common.starpilot_utilities import delete_file, get_lock_status, run_cmd +from openpilot.starpilot.common.starpilot_variables import ACTIVE_THEME_PATH, ERROR_LOGS_PATH, EXCLUDED_KEYS, LEGACY_STARPILOT_PARAM_RENAMES, RESOURCES_REPO, SCREEN_RECORDINGS_PATH, THEME_SAVE_PATH,\ + update_starpilot_toggles +from openpilot.starpilot.common.testing_grounds import ( DEFAULT_TESTING_GROUND_VARIANT as SHARED_DEFAULT_TESTING_GROUND_VARIANT, TESTING_GROUND_VARIANT_LABELS as SHARED_TESTING_GROUND_VARIANT_LABELS, TESTING_GROUND_VARIANTS as SHARED_TESTING_GROUND_VARIANTS, @@ -50,7 +50,7 @@ from openpilot.frogpilot.common.testing_grounds import ( TESTING_GROUNDS_SLOT_DEFINITIONS as SHARED_TESTING_GROUNDS_SLOT_DEFINITIONS, TESTING_GROUNDS_STATE_PATH as SHARED_TESTING_GROUNDS_STATE_PATH, ) -from openpilot.frogpilot.system.the_pond import utilities +from openpilot.starpilot.system.the_pond import utilities DISCORD_WEBHOOK_URL = os.getenv("DISCORD_WEBHOOK_URL") @@ -155,7 +155,7 @@ def _install_pond_web_deps(): return True _POND_WEB_DEPS_ERROR = RuntimeError( - "Missing local Flask deps (expected in frogpilot/third_party or /data/pond_deps)." + "Missing local Flask deps (expected in starpilot/third_party or /data/pond_deps)." ) return False @@ -373,7 +373,7 @@ def _build_default_params(): )) return defaults -frogpilot_default_params = _build_default_params() +starpilot_default_params = _build_default_params() params = ParamsCompat(_params_raw) params_memory = ParamsCompat(_params_memory_raw) @@ -495,7 +495,7 @@ _TESTING_GROUNDS_DEFAULT_VARIANT = SHARED_DEFAULT_TESTING_GROUND_VARIANT _TESTING_GROUNDS_VARIANTS = set(SHARED_TESTING_GROUND_VARIANTS) or {_TESTING_GROUNDS_DEFAULT_VARIANT} _TESTING_GROUNDS_LOCK = threading.Lock() _TESTING_GROUNDS_STATE_PATH = SHARED_TESTING_GROUNDS_STATE_PATH -# Slot labels live in frogpilot/common/testing_grounds.py. +# Slot labels live in starpilot/common/testing_grounds.py. _TESTING_GROUNDS_SLOT_DEFINITIONS = [dict(slot) for slot in SHARED_TESTING_GROUNDS_SLOT_DEFINITIONS] _TESTING_GROUNDS_VARIANT_LABELS_BY_SLOT = { str(slot_id or "").strip(): dict(labels or {}) @@ -1604,10 +1604,10 @@ _cached_default_values = None def _get_param_type_info(): global _cached_allowed_keys, _cached_param_types if _cached_allowed_keys is None: - _cached_allowed_keys = {k for k, _, _, _ in frogpilot_default_params if k not in EXCLUDED_KEYS} + _cached_allowed_keys = {k for k, _, _, _ in starpilot_default_params if k not in EXCLUDED_KEYS} types = {} - for k, default_val, _, _ in frogpilot_default_params: + for k, default_val, _, _ in starpilot_default_params: if k in _cached_allowed_keys: if default_val in ("0", "1", b"0", b"1") or isinstance(default_val, bool): types[k] = bool @@ -1641,7 +1641,7 @@ def _get_default_param_values(): if _cached_default_values is None: _cached_default_values = { key: default_val - for key, default_val, _, _ in frogpilot_default_params + for key, default_val, _, _ in starpilot_default_params if key not in EXCLUDED_KEYS } return _cached_default_values @@ -2006,7 +2006,7 @@ def _reset_troubleshoot_section(section_id): updated_keys.append(key) if updated_keys: - update_frogpilot_toggles() + update_starpilot_toggles() return { "sectionId": section_definition["id"], @@ -2724,7 +2724,7 @@ def setup(app): normalized_make = _normalize_fingerprint_make_key(str_val) stored_make = catalog["make_label_by_key"].get(normalized_make, str_val.strip()) params.put("CarMake", stored_make) - update_frogpilot_toggles() + update_starpilot_toggles() return jsonify({ "message": "Car make updated successfully.", "updated": {"CarMake": stored_make}, @@ -2753,7 +2753,7 @@ def setup(app): params.put("CarMake", make_label) updated["CarMake"] = make_label - update_frogpilot_toggles() + update_starpilot_toggles() return jsonify({ "message": f"Fingerprint set to '{model_label or selected_model}'.", "updated": updated, @@ -2803,7 +2803,7 @@ def setup(app): metered_enabled = str_val.strip() in ("1", "true", "True") gsm_metered_apply_result = _apply_cellular_metered_setting(metered_enabled) - update_frogpilot_toggles() + update_starpilot_toggles() response = {"message": f"Parameter '{key}' updated successfully."} if gsm_metered_apply_result is not None: @@ -2849,7 +2849,7 @@ def setup(app): allowed_keys, types = _get_param_type_info() defaults_lookup = { key: default_val - for key, default_val, _, _ in frogpilot_default_params + for key, default_val, _, _ in starpilot_default_params if key in allowed_keys } @@ -3042,7 +3042,7 @@ def setup(app): return jsonify({"error": "Cannot refresh model manifest while a download is in progress."}), 409 try: - from openpilot.frogpilot.assets.model_manager import ModelManager + from openpilot.starpilot.assets.model_manager import ModelManager # ModelManager expects raw Params semantics (encoding-less get -> str, not legacy bytes). manager = ModelManager(_params_raw, _params_memory_raw) @@ -3541,11 +3541,11 @@ def setup(app): build_metadata = get_build_metadata() short_branch = build_metadata.channel - if short_branch == "FrogPilot-Development": + if short_branch == "StarPilot-Development": env = "Development" elif build_metadata.release_channel: env = "Release" - elif short_branch == "FrogPilot-Testing": + elif short_branch == "StarPilot-Testing": env = "Testing" elif build_metadata.tested_channel: env = "Staging" @@ -4020,7 +4020,7 @@ def setup(app): params.put_bool("PersonalizeOpenpilot", True) params_memory.put_bool("UseActiveTheme", True) - update_frogpilot_toggles() + update_starpilot_toggles() return {"message": "Theme applied successfully!"}, 200 @app.route("/api/themes/asset//") @@ -4645,7 +4645,7 @@ def setup(app): @app.route("/api/toggles/backup", methods=["POST"]) def backup_toggle_values(): toggle_values = {} - for key, _, _, _ in frogpilot_default_params: + for key, _, _, _ in starpilot_default_params: if key in EXCLUDED_KEYS: continue @@ -4671,14 +4671,15 @@ def setup(app): if not request_data or "data" not in request_data: return jsonify({"success": False, "message": "Missing 'data' in request."}), 400 - allowed_keys = {key for key, _, _, _ in frogpilot_default_params if key not in EXCLUDED_KEYS} + allowed_keys = {key for key, _, _, _ in starpilot_default_params if key not in EXCLUDED_KEYS} toggle_values = utilities.decode_parameters(request_data["data"]) for key, value in toggle_values.items(): - if key in allowed_keys: - params.put(key, value) + mapped_key = LEGACY_STARPILOT_PARAM_RENAMES.get(key, key) + if mapped_key in allowed_keys: + params.put(mapped_key, value) - update_frogpilot_toggles() + update_starpilot_toggles() return jsonify({"success": True, "message": "Toggles restored!"}) @app.route("/api/toggles/reset_default", methods=["POST"]) @@ -4693,7 +4694,7 @@ def setup(app): @app.route("/mapbox-help/", methods=["GET"]) def serve_mapbox_help(filename): - return send_from_directory("/data/openpilot/frogpilot/navigation/navigation_training", filename) + return send_from_directory("/data/openpilot/starpilot/navigation/navigation_training", filename) @app.route("/playground", methods=["GET"]) def playground(): diff --git a/frogpilot/system/the_pond/utilities.py b/starpilot/system/the_pond/utilities.py similarity index 98% rename from frogpilot/system/the_pond/utilities.py rename to starpilot/system/the_pond/utilities.py index c57ff296..24cf28be 100644 --- a/frogpilot/system/the_pond/utilities.py +++ b/starpilot/system/the_pond/utilities.py @@ -21,8 +21,8 @@ from openpilot.system.loggerd.deleter import PRESERVE_ATTR_NAME, PRESERVE_ATTR_V from openpilot.system.loggerd.uploader import listdir_by_creation from openpilot.tools.lib.route import SegmentName -from openpilot.frogpilot.common.frogpilot_variables import THEME_SAVE_PATH, VIDEO_CACHE_PATH -from openpilot.frogpilot.assets.theme_manager import HOLIDAY_THEME_PATH +from openpilot.starpilot.common.starpilot_variables import THEME_SAVE_PATH, VIDEO_CACHE_PATH +from openpilot.starpilot.assets.theme_manager import HOLIDAY_THEME_PATH LOG_CANDIDATES = [ "qlog", @@ -526,7 +526,7 @@ def get_disk_usage(): def get_drive_stats(): stats = _decode_json_param(params.get("ApiCache_DriveStats"), {}) - frogpilot_stats = _decode_json_param(params.get("FrogPilotStats"), {}) + starpilot_stats = _decode_json_param(params.get("StarPilotStats"), {}) is_metric = params.get_bool("IsMetric") unit = "kilometers" if is_metric else "miles" @@ -542,10 +542,10 @@ def get_drive_stats(): stats["all"] = process("all") stats["week"] = process("week") - stats["frogpilot"] = { - "distance": frogpilot_stats.get("FrogPilotMeters", 0) * (0.001 if is_metric else METER_TO_MILE), - "hours": frogpilot_stats.get("FrogPilotSeconds", 0) / (60 * 60), - "drives": frogpilot_stats.get("FrogPilotDrives", 0), + stats["starpilot"] = { + "distance": starpilot_stats.get("StarPilotMeters", 0) * (0.001 if is_metric else METER_TO_MILE), + "hours": starpilot_stats.get("StarPilotSeconds", 0) / (60 * 60), + "drives": starpilot_stats.get("StarPilotDrives", 0), "unit": unit } diff --git a/frogpilot/third_party/blinker-1.9.0.dist-info/INSTALLER b/starpilot/third_party/blinker-1.9.0.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/blinker-1.9.0.dist-info/INSTALLER rename to starpilot/third_party/blinker-1.9.0.dist-info/INSTALLER diff --git a/frogpilot/third_party/blinker-1.9.0.dist-info/LICENSE.txt b/starpilot/third_party/blinker-1.9.0.dist-info/LICENSE.txt similarity index 100% rename from frogpilot/third_party/blinker-1.9.0.dist-info/LICENSE.txt rename to starpilot/third_party/blinker-1.9.0.dist-info/LICENSE.txt diff --git a/frogpilot/third_party/blinker-1.9.0.dist-info/METADATA b/starpilot/third_party/blinker-1.9.0.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/blinker-1.9.0.dist-info/METADATA rename to starpilot/third_party/blinker-1.9.0.dist-info/METADATA diff --git a/frogpilot/third_party/blinker-1.9.0.dist-info/RECORD b/starpilot/third_party/blinker-1.9.0.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/blinker-1.9.0.dist-info/RECORD rename to starpilot/third_party/blinker-1.9.0.dist-info/RECORD diff --git a/frogpilot/third_party/blinker-1.9.0.dist-info/REQUESTED b/starpilot/third_party/blinker-1.9.0.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/blinker-1.9.0.dist-info/REQUESTED rename to starpilot/third_party/blinker-1.9.0.dist-info/REQUESTED diff --git a/frogpilot/third_party/blinker-1.9.0.dist-info/WHEEL b/starpilot/third_party/blinker-1.9.0.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/blinker-1.9.0.dist-info/WHEEL rename to starpilot/third_party/blinker-1.9.0.dist-info/WHEEL diff --git a/frogpilot/third_party/blinker/__init__.py b/starpilot/third_party/blinker/__init__.py similarity index 100% rename from frogpilot/third_party/blinker/__init__.py rename to starpilot/third_party/blinker/__init__.py diff --git a/frogpilot/third_party/blinker/_utilities.py b/starpilot/third_party/blinker/_utilities.py similarity index 100% rename from frogpilot/third_party/blinker/_utilities.py rename to starpilot/third_party/blinker/_utilities.py diff --git a/frogpilot/third_party/blinker/base.py b/starpilot/third_party/blinker/base.py similarity index 100% rename from frogpilot/third_party/blinker/base.py rename to starpilot/third_party/blinker/base.py diff --git a/frogpilot/third_party/blinker/py.typed b/starpilot/third_party/blinker/py.typed similarity index 100% rename from frogpilot/third_party/blinker/py.typed rename to starpilot/third_party/blinker/py.typed diff --git a/frogpilot/third_party/certifi/__init__.py b/starpilot/third_party/certifi/__init__.py similarity index 100% rename from frogpilot/third_party/certifi/__init__.py rename to starpilot/third_party/certifi/__init__.py diff --git a/frogpilot/third_party/certifi/__main__.py b/starpilot/third_party/certifi/__main__.py similarity index 100% rename from frogpilot/third_party/certifi/__main__.py rename to starpilot/third_party/certifi/__main__.py diff --git a/frogpilot/third_party/certifi/cacert.pem b/starpilot/third_party/certifi/cacert.pem similarity index 100% rename from frogpilot/third_party/certifi/cacert.pem rename to starpilot/third_party/certifi/cacert.pem diff --git a/frogpilot/third_party/certifi/core.py b/starpilot/third_party/certifi/core.py similarity index 100% rename from frogpilot/third_party/certifi/core.py rename to starpilot/third_party/certifi/core.py diff --git a/frogpilot/third_party/certifi/py.typed b/starpilot/third_party/certifi/py.typed similarity index 100% rename from frogpilot/third_party/certifi/py.typed rename to starpilot/third_party/certifi/py.typed diff --git a/frogpilot/third_party/click-8.3.1.dist-info/INSTALLER b/starpilot/third_party/click-8.3.1.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/click-8.3.1.dist-info/INSTALLER rename to starpilot/third_party/click-8.3.1.dist-info/INSTALLER diff --git a/frogpilot/third_party/click-8.3.1.dist-info/METADATA b/starpilot/third_party/click-8.3.1.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/click-8.3.1.dist-info/METADATA rename to starpilot/third_party/click-8.3.1.dist-info/METADATA diff --git a/frogpilot/third_party/click-8.3.1.dist-info/RECORD b/starpilot/third_party/click-8.3.1.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/click-8.3.1.dist-info/RECORD rename to starpilot/third_party/click-8.3.1.dist-info/RECORD diff --git a/frogpilot/third_party/click-8.3.1.dist-info/REQUESTED b/starpilot/third_party/click-8.3.1.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/click-8.3.1.dist-info/REQUESTED rename to starpilot/third_party/click-8.3.1.dist-info/REQUESTED diff --git a/frogpilot/third_party/click-8.3.1.dist-info/WHEEL b/starpilot/third_party/click-8.3.1.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/click-8.3.1.dist-info/WHEEL rename to starpilot/third_party/click-8.3.1.dist-info/WHEEL diff --git a/frogpilot/third_party/click-8.3.1.dist-info/licenses/LICENSE.txt b/starpilot/third_party/click-8.3.1.dist-info/licenses/LICENSE.txt similarity index 100% rename from frogpilot/third_party/click-8.3.1.dist-info/licenses/LICENSE.txt rename to starpilot/third_party/click-8.3.1.dist-info/licenses/LICENSE.txt diff --git a/frogpilot/third_party/click/__init__.py b/starpilot/third_party/click/__init__.py similarity index 100% rename from frogpilot/third_party/click/__init__.py rename to starpilot/third_party/click/__init__.py diff --git a/frogpilot/third_party/click/_compat.py b/starpilot/third_party/click/_compat.py similarity index 100% rename from frogpilot/third_party/click/_compat.py rename to starpilot/third_party/click/_compat.py diff --git a/frogpilot/third_party/click/_termui_impl.py b/starpilot/third_party/click/_termui_impl.py similarity index 100% rename from frogpilot/third_party/click/_termui_impl.py rename to starpilot/third_party/click/_termui_impl.py diff --git a/frogpilot/third_party/click/_textwrap.py b/starpilot/third_party/click/_textwrap.py similarity index 100% rename from frogpilot/third_party/click/_textwrap.py rename to starpilot/third_party/click/_textwrap.py diff --git a/frogpilot/third_party/click/_utils.py b/starpilot/third_party/click/_utils.py similarity index 100% rename from frogpilot/third_party/click/_utils.py rename to starpilot/third_party/click/_utils.py diff --git a/frogpilot/third_party/click/_winconsole.py b/starpilot/third_party/click/_winconsole.py similarity index 100% rename from frogpilot/third_party/click/_winconsole.py rename to starpilot/third_party/click/_winconsole.py diff --git a/frogpilot/third_party/click/core.py b/starpilot/third_party/click/core.py similarity index 100% rename from frogpilot/third_party/click/core.py rename to starpilot/third_party/click/core.py diff --git a/frogpilot/third_party/click/decorators.py b/starpilot/third_party/click/decorators.py similarity index 100% rename from frogpilot/third_party/click/decorators.py rename to starpilot/third_party/click/decorators.py diff --git a/frogpilot/third_party/click/exceptions.py b/starpilot/third_party/click/exceptions.py similarity index 100% rename from frogpilot/third_party/click/exceptions.py rename to starpilot/third_party/click/exceptions.py diff --git a/frogpilot/third_party/click/formatting.py b/starpilot/third_party/click/formatting.py similarity index 100% rename from frogpilot/third_party/click/formatting.py rename to starpilot/third_party/click/formatting.py diff --git a/frogpilot/third_party/click/globals.py b/starpilot/third_party/click/globals.py similarity index 100% rename from frogpilot/third_party/click/globals.py rename to starpilot/third_party/click/globals.py diff --git a/frogpilot/third_party/click/parser.py b/starpilot/third_party/click/parser.py similarity index 100% rename from frogpilot/third_party/click/parser.py rename to starpilot/third_party/click/parser.py diff --git a/frogpilot/third_party/click/py.typed b/starpilot/third_party/click/py.typed similarity index 100% rename from frogpilot/third_party/click/py.typed rename to starpilot/third_party/click/py.typed diff --git a/frogpilot/third_party/click/shell_completion.py b/starpilot/third_party/click/shell_completion.py similarity index 100% rename from frogpilot/third_party/click/shell_completion.py rename to starpilot/third_party/click/shell_completion.py diff --git a/frogpilot/third_party/click/termui.py b/starpilot/third_party/click/termui.py similarity index 100% rename from frogpilot/third_party/click/termui.py rename to starpilot/third_party/click/termui.py diff --git a/frogpilot/third_party/click/testing.py b/starpilot/third_party/click/testing.py similarity index 100% rename from frogpilot/third_party/click/testing.py rename to starpilot/third_party/click/testing.py diff --git a/frogpilot/third_party/click/types.py b/starpilot/third_party/click/types.py similarity index 100% rename from frogpilot/third_party/click/types.py rename to starpilot/third_party/click/types.py diff --git a/frogpilot/third_party/click/utils.py b/starpilot/third_party/click/utils.py similarity index 100% rename from frogpilot/third_party/click/utils.py rename to starpilot/third_party/click/utils.py diff --git a/frogpilot/third_party/dateutil/__init__.py b/starpilot/third_party/dateutil/__init__.py similarity index 100% rename from frogpilot/third_party/dateutil/__init__.py rename to starpilot/third_party/dateutil/__init__.py diff --git a/frogpilot/third_party/dateutil/_common.py b/starpilot/third_party/dateutil/_common.py similarity index 100% rename from frogpilot/third_party/dateutil/_common.py rename to starpilot/third_party/dateutil/_common.py diff --git a/frogpilot/third_party/dateutil/_version.py b/starpilot/third_party/dateutil/_version.py similarity index 100% rename from frogpilot/third_party/dateutil/_version.py rename to starpilot/third_party/dateutil/_version.py diff --git a/frogpilot/third_party/dateutil/easter.py b/starpilot/third_party/dateutil/easter.py similarity index 100% rename from frogpilot/third_party/dateutil/easter.py rename to starpilot/third_party/dateutil/easter.py diff --git a/frogpilot/third_party/dateutil/parser/__init__.py b/starpilot/third_party/dateutil/parser/__init__.py similarity index 100% rename from frogpilot/third_party/dateutil/parser/__init__.py rename to starpilot/third_party/dateutil/parser/__init__.py diff --git a/frogpilot/third_party/dateutil/parser/_parser.py b/starpilot/third_party/dateutil/parser/_parser.py similarity index 100% rename from frogpilot/third_party/dateutil/parser/_parser.py rename to starpilot/third_party/dateutil/parser/_parser.py diff --git a/frogpilot/third_party/dateutil/parser/isoparser.py b/starpilot/third_party/dateutil/parser/isoparser.py similarity index 100% rename from frogpilot/third_party/dateutil/parser/isoparser.py rename to starpilot/third_party/dateutil/parser/isoparser.py diff --git a/frogpilot/third_party/dateutil/relativedelta.py b/starpilot/third_party/dateutil/relativedelta.py similarity index 100% rename from frogpilot/third_party/dateutil/relativedelta.py rename to starpilot/third_party/dateutil/relativedelta.py diff --git a/frogpilot/third_party/dateutil/rrule.py b/starpilot/third_party/dateutil/rrule.py similarity index 100% rename from frogpilot/third_party/dateutil/rrule.py rename to starpilot/third_party/dateutil/rrule.py diff --git a/frogpilot/third_party/dateutil/tz/__init__.py b/starpilot/third_party/dateutil/tz/__init__.py similarity index 100% rename from frogpilot/third_party/dateutil/tz/__init__.py rename to starpilot/third_party/dateutil/tz/__init__.py diff --git a/frogpilot/third_party/dateutil/tz/_common.py b/starpilot/third_party/dateutil/tz/_common.py similarity index 100% rename from frogpilot/third_party/dateutil/tz/_common.py rename to starpilot/third_party/dateutil/tz/_common.py diff --git a/frogpilot/third_party/dateutil/tz/_factories.py b/starpilot/third_party/dateutil/tz/_factories.py similarity index 100% rename from frogpilot/third_party/dateutil/tz/_factories.py rename to starpilot/third_party/dateutil/tz/_factories.py diff --git a/frogpilot/third_party/dateutil/tz/tz.py b/starpilot/third_party/dateutil/tz/tz.py similarity index 100% rename from frogpilot/third_party/dateutil/tz/tz.py rename to starpilot/third_party/dateutil/tz/tz.py diff --git a/frogpilot/third_party/dateutil/tz/win.py b/starpilot/third_party/dateutil/tz/win.py similarity index 100% rename from frogpilot/third_party/dateutil/tz/win.py rename to starpilot/third_party/dateutil/tz/win.py diff --git a/frogpilot/third_party/dateutil/tzwin.py b/starpilot/third_party/dateutil/tzwin.py similarity index 100% rename from frogpilot/third_party/dateutil/tzwin.py rename to starpilot/third_party/dateutil/tzwin.py diff --git a/frogpilot/third_party/dateutil/utils.py b/starpilot/third_party/dateutil/utils.py similarity index 100% rename from frogpilot/third_party/dateutil/utils.py rename to starpilot/third_party/dateutil/utils.py diff --git a/frogpilot/third_party/dateutil/zoneinfo/__init__.py b/starpilot/third_party/dateutil/zoneinfo/__init__.py similarity index 100% rename from frogpilot/third_party/dateutil/zoneinfo/__init__.py rename to starpilot/third_party/dateutil/zoneinfo/__init__.py diff --git a/frogpilot/third_party/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/starpilot/third_party/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz similarity index 100% rename from frogpilot/third_party/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz rename to starpilot/third_party/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz diff --git a/frogpilot/third_party/dateutil/zoneinfo/rebuild.py b/starpilot/third_party/dateutil/zoneinfo/rebuild.py similarity index 100% rename from frogpilot/third_party/dateutil/zoneinfo/rebuild.py rename to starpilot/third_party/dateutil/zoneinfo/rebuild.py diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/INSTALLER b/starpilot/third_party/flask-3.1.3.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/INSTALLER rename to starpilot/third_party/flask-3.1.3.dist-info/INSTALLER diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/METADATA b/starpilot/third_party/flask-3.1.3.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/METADATA rename to starpilot/third_party/flask-3.1.3.dist-info/METADATA diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/RECORD b/starpilot/third_party/flask-3.1.3.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/RECORD rename to starpilot/third_party/flask-3.1.3.dist-info/RECORD diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/REQUESTED b/starpilot/third_party/flask-3.1.3.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/REQUESTED rename to starpilot/third_party/flask-3.1.3.dist-info/REQUESTED diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/WHEEL b/starpilot/third_party/flask-3.1.3.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/WHEEL rename to starpilot/third_party/flask-3.1.3.dist-info/WHEEL diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/entry_points.txt b/starpilot/third_party/flask-3.1.3.dist-info/entry_points.txt similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/entry_points.txt rename to starpilot/third_party/flask-3.1.3.dist-info/entry_points.txt diff --git a/frogpilot/third_party/flask-3.1.3.dist-info/licenses/LICENSE.txt b/starpilot/third_party/flask-3.1.3.dist-info/licenses/LICENSE.txt similarity index 100% rename from frogpilot/third_party/flask-3.1.3.dist-info/licenses/LICENSE.txt rename to starpilot/third_party/flask-3.1.3.dist-info/licenses/LICENSE.txt diff --git a/frogpilot/third_party/flask/__init__.py b/starpilot/third_party/flask/__init__.py similarity index 100% rename from frogpilot/third_party/flask/__init__.py rename to starpilot/third_party/flask/__init__.py diff --git a/frogpilot/third_party/flask/__main__.py b/starpilot/third_party/flask/__main__.py similarity index 100% rename from frogpilot/third_party/flask/__main__.py rename to starpilot/third_party/flask/__main__.py diff --git a/frogpilot/third_party/flask/app.py b/starpilot/third_party/flask/app.py similarity index 100% rename from frogpilot/third_party/flask/app.py rename to starpilot/third_party/flask/app.py diff --git a/frogpilot/third_party/flask/blueprints.py b/starpilot/third_party/flask/blueprints.py similarity index 100% rename from frogpilot/third_party/flask/blueprints.py rename to starpilot/third_party/flask/blueprints.py diff --git a/frogpilot/third_party/flask/cli.py b/starpilot/third_party/flask/cli.py similarity index 100% rename from frogpilot/third_party/flask/cli.py rename to starpilot/third_party/flask/cli.py diff --git a/frogpilot/third_party/flask/config.py b/starpilot/third_party/flask/config.py similarity index 100% rename from frogpilot/third_party/flask/config.py rename to starpilot/third_party/flask/config.py diff --git a/frogpilot/third_party/flask/ctx.py b/starpilot/third_party/flask/ctx.py similarity index 100% rename from frogpilot/third_party/flask/ctx.py rename to starpilot/third_party/flask/ctx.py diff --git a/frogpilot/third_party/flask/debughelpers.py b/starpilot/third_party/flask/debughelpers.py similarity index 100% rename from frogpilot/third_party/flask/debughelpers.py rename to starpilot/third_party/flask/debughelpers.py diff --git a/frogpilot/third_party/flask/globals.py b/starpilot/third_party/flask/globals.py similarity index 100% rename from frogpilot/third_party/flask/globals.py rename to starpilot/third_party/flask/globals.py diff --git a/frogpilot/third_party/flask/helpers.py b/starpilot/third_party/flask/helpers.py similarity index 100% rename from frogpilot/third_party/flask/helpers.py rename to starpilot/third_party/flask/helpers.py diff --git a/frogpilot/third_party/flask/json/__init__.py b/starpilot/third_party/flask/json/__init__.py similarity index 100% rename from frogpilot/third_party/flask/json/__init__.py rename to starpilot/third_party/flask/json/__init__.py diff --git a/frogpilot/third_party/flask/json/provider.py b/starpilot/third_party/flask/json/provider.py similarity index 100% rename from frogpilot/third_party/flask/json/provider.py rename to starpilot/third_party/flask/json/provider.py diff --git a/frogpilot/third_party/flask/json/tag.py b/starpilot/third_party/flask/json/tag.py similarity index 100% rename from frogpilot/third_party/flask/json/tag.py rename to starpilot/third_party/flask/json/tag.py diff --git a/frogpilot/third_party/flask/logging.py b/starpilot/third_party/flask/logging.py similarity index 100% rename from frogpilot/third_party/flask/logging.py rename to starpilot/third_party/flask/logging.py diff --git a/frogpilot/third_party/flask/py.typed b/starpilot/third_party/flask/py.typed similarity index 100% rename from frogpilot/third_party/flask/py.typed rename to starpilot/third_party/flask/py.typed diff --git a/frogpilot/third_party/flask/sansio/README.md b/starpilot/third_party/flask/sansio/README.md similarity index 100% rename from frogpilot/third_party/flask/sansio/README.md rename to starpilot/third_party/flask/sansio/README.md diff --git a/frogpilot/third_party/flask/sansio/app.py b/starpilot/third_party/flask/sansio/app.py similarity index 100% rename from frogpilot/third_party/flask/sansio/app.py rename to starpilot/third_party/flask/sansio/app.py diff --git a/frogpilot/third_party/flask/sansio/blueprints.py b/starpilot/third_party/flask/sansio/blueprints.py similarity index 100% rename from frogpilot/third_party/flask/sansio/blueprints.py rename to starpilot/third_party/flask/sansio/blueprints.py diff --git a/frogpilot/third_party/flask/sansio/scaffold.py b/starpilot/third_party/flask/sansio/scaffold.py similarity index 100% rename from frogpilot/third_party/flask/sansio/scaffold.py rename to starpilot/third_party/flask/sansio/scaffold.py diff --git a/frogpilot/third_party/flask/sessions.py b/starpilot/third_party/flask/sessions.py similarity index 100% rename from frogpilot/third_party/flask/sessions.py rename to starpilot/third_party/flask/sessions.py diff --git a/frogpilot/third_party/flask/signals.py b/starpilot/third_party/flask/signals.py similarity index 100% rename from frogpilot/third_party/flask/signals.py rename to starpilot/third_party/flask/signals.py diff --git a/frogpilot/third_party/flask/templating.py b/starpilot/third_party/flask/templating.py similarity index 100% rename from frogpilot/third_party/flask/templating.py rename to starpilot/third_party/flask/templating.py diff --git a/frogpilot/third_party/flask/testing.py b/starpilot/third_party/flask/testing.py similarity index 100% rename from frogpilot/third_party/flask/testing.py rename to starpilot/third_party/flask/testing.py diff --git a/frogpilot/third_party/flask/typing.py b/starpilot/third_party/flask/typing.py similarity index 100% rename from frogpilot/third_party/flask/typing.py rename to starpilot/third_party/flask/typing.py diff --git a/frogpilot/third_party/flask/views.py b/starpilot/third_party/flask/views.py similarity index 100% rename from frogpilot/third_party/flask/views.py rename to starpilot/third_party/flask/views.py diff --git a/frogpilot/third_party/flask/wrappers.py b/starpilot/third_party/flask/wrappers.py similarity index 100% rename from frogpilot/third_party/flask/wrappers.py rename to starpilot/third_party/flask/wrappers.py diff --git a/frogpilot/third_party/flatbuffers/__init__.py b/starpilot/third_party/flatbuffers/__init__.py similarity index 100% rename from frogpilot/third_party/flatbuffers/__init__.py rename to starpilot/third_party/flatbuffers/__init__.py diff --git a/frogpilot/third_party/flatbuffers/_version.py b/starpilot/third_party/flatbuffers/_version.py similarity index 100% rename from frogpilot/third_party/flatbuffers/_version.py rename to starpilot/third_party/flatbuffers/_version.py diff --git a/frogpilot/third_party/flatbuffers/builder.py b/starpilot/third_party/flatbuffers/builder.py similarity index 100% rename from frogpilot/third_party/flatbuffers/builder.py rename to starpilot/third_party/flatbuffers/builder.py diff --git a/frogpilot/third_party/flatbuffers/compat.py b/starpilot/third_party/flatbuffers/compat.py similarity index 100% rename from frogpilot/third_party/flatbuffers/compat.py rename to starpilot/third_party/flatbuffers/compat.py diff --git a/frogpilot/third_party/flatbuffers/encode.py b/starpilot/third_party/flatbuffers/encode.py similarity index 100% rename from frogpilot/third_party/flatbuffers/encode.py rename to starpilot/third_party/flatbuffers/encode.py diff --git a/frogpilot/third_party/flatbuffers/number_types.py b/starpilot/third_party/flatbuffers/number_types.py similarity index 100% rename from frogpilot/third_party/flatbuffers/number_types.py rename to starpilot/third_party/flatbuffers/number_types.py diff --git a/frogpilot/third_party/flatbuffers/packer.py b/starpilot/third_party/flatbuffers/packer.py similarity index 100% rename from frogpilot/third_party/flatbuffers/packer.py rename to starpilot/third_party/flatbuffers/packer.py diff --git a/frogpilot/third_party/flatbuffers/table.py b/starpilot/third_party/flatbuffers/table.py similarity index 100% rename from frogpilot/third_party/flatbuffers/table.py rename to starpilot/third_party/flatbuffers/table.py diff --git a/frogpilot/third_party/flatbuffers/util.py b/starpilot/third_party/flatbuffers/util.py similarity index 100% rename from frogpilot/third_party/flatbuffers/util.py rename to starpilot/third_party/flatbuffers/util.py diff --git a/frogpilot/third_party/h3/__init__.py b/starpilot/third_party/h3/__init__.py similarity index 100% rename from frogpilot/third_party/h3/__init__.py rename to starpilot/third_party/h3/__init__.py diff --git a/frogpilot/third_party/h3/_cy/__init__.py b/starpilot/third_party/h3/_cy/__init__.py similarity index 100% rename from frogpilot/third_party/h3/_cy/__init__.py rename to starpilot/third_party/h3/_cy/__init__.py diff --git a/frogpilot/third_party/h3/_cy/cells.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/cells.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/cells.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/cells.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/edges.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/edges.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/edges.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/edges.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/error_system.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/error_system.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/error_system.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/error_system.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/latlng.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/latlng.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/latlng.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/latlng.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/memory.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/memory.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/memory.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/memory.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/to_multipoly.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/to_multipoly.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/to_multipoly.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/to_multipoly.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/util.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/util.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/util.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/util.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_cy/vertex.cpython-312-aarch64-linux-gnu.so b/starpilot/third_party/h3/_cy/vertex.cpython-312-aarch64-linux-gnu.so similarity index 100% rename from frogpilot/third_party/h3/_cy/vertex.cpython-312-aarch64-linux-gnu.so rename to starpilot/third_party/h3/_cy/vertex.cpython-312-aarch64-linux-gnu.so diff --git a/frogpilot/third_party/h3/_h3shape.py b/starpilot/third_party/h3/_h3shape.py similarity index 100% rename from frogpilot/third_party/h3/_h3shape.py rename to starpilot/third_party/h3/_h3shape.py diff --git a/frogpilot/third_party/h3/_version.py b/starpilot/third_party/h3/_version.py similarity index 100% rename from frogpilot/third_party/h3/_version.py rename to starpilot/third_party/h3/_version.py diff --git a/frogpilot/third_party/h3/api/__init__.py b/starpilot/third_party/h3/api/__init__.py similarity index 100% rename from frogpilot/third_party/h3/api/__init__.py rename to starpilot/third_party/h3/api/__init__.py diff --git a/frogpilot/third_party/h3/api/basic_int/__init__.py b/starpilot/third_party/h3/api/basic_int/__init__.py similarity index 100% rename from frogpilot/third_party/h3/api/basic_int/__init__.py rename to starpilot/third_party/h3/api/basic_int/__init__.py diff --git a/frogpilot/third_party/h3/api/basic_int/_convert.py b/starpilot/third_party/h3/api/basic_int/_convert.py similarity index 100% rename from frogpilot/third_party/h3/api/basic_int/_convert.py rename to starpilot/third_party/h3/api/basic_int/_convert.py diff --git a/frogpilot/third_party/h3/api/basic_str/__init__.py b/starpilot/third_party/h3/api/basic_str/__init__.py similarity index 100% rename from frogpilot/third_party/h3/api/basic_str/__init__.py rename to starpilot/third_party/h3/api/basic_str/__init__.py diff --git a/frogpilot/third_party/h3/api/basic_str/_convert.py b/starpilot/third_party/h3/api/basic_str/_convert.py similarity index 100% rename from frogpilot/third_party/h3/api/basic_str/_convert.py rename to starpilot/third_party/h3/api/basic_str/_convert.py diff --git a/frogpilot/third_party/h3/api/memview_int/__init__.py b/starpilot/third_party/h3/api/memview_int/__init__.py similarity index 100% rename from frogpilot/third_party/h3/api/memview_int/__init__.py rename to starpilot/third_party/h3/api/memview_int/__init__.py diff --git a/frogpilot/third_party/h3/api/memview_int/_convert.py b/starpilot/third_party/h3/api/memview_int/_convert.py similarity index 100% rename from frogpilot/third_party/h3/api/memview_int/_convert.py rename to starpilot/third_party/h3/api/memview_int/_convert.py diff --git a/frogpilot/third_party/h3/api/numpy_int/__init__.py b/starpilot/third_party/h3/api/numpy_int/__init__.py similarity index 100% rename from frogpilot/third_party/h3/api/numpy_int/__init__.py rename to starpilot/third_party/h3/api/numpy_int/__init__.py diff --git a/frogpilot/third_party/h3/api/numpy_int/_convert.py b/starpilot/third_party/h3/api/numpy_int/_convert.py similarity index 100% rename from frogpilot/third_party/h3/api/numpy_int/_convert.py rename to starpilot/third_party/h3/api/numpy_int/_convert.py diff --git a/frogpilot/third_party/influxdb_client/__init__.py b/starpilot/third_party/influxdb_client/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/__init__.py rename to starpilot/third_party/influxdb_client/__init__.py diff --git a/frogpilot/third_party/influxdb_client/_async/__init__.py b/starpilot/third_party/influxdb_client/_async/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/_async/__init__.py rename to starpilot/third_party/influxdb_client/_async/__init__.py diff --git a/frogpilot/third_party/influxdb_client/_async/api_client.py b/starpilot/third_party/influxdb_client/_async/api_client.py similarity index 100% rename from frogpilot/third_party/influxdb_client/_async/api_client.py rename to starpilot/third_party/influxdb_client/_async/api_client.py diff --git a/frogpilot/third_party/influxdb_client/_async/rest.py b/starpilot/third_party/influxdb_client/_async/rest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/_async/rest.py rename to starpilot/third_party/influxdb_client/_async/rest.py diff --git a/frogpilot/third_party/influxdb_client/_sync/__init__.py b/starpilot/third_party/influxdb_client/_sync/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/_sync/__init__.py rename to starpilot/third_party/influxdb_client/_sync/__init__.py diff --git a/frogpilot/third_party/influxdb_client/_sync/api_client.py b/starpilot/third_party/influxdb_client/_sync/api_client.py similarity index 100% rename from frogpilot/third_party/influxdb_client/_sync/api_client.py rename to starpilot/third_party/influxdb_client/_sync/api_client.py diff --git a/frogpilot/third_party/influxdb_client/_sync/rest.py b/starpilot/third_party/influxdb_client/_sync/rest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/_sync/rest.py rename to starpilot/third_party/influxdb_client/_sync/rest.py diff --git a/frogpilot/third_party/influxdb_client/client/__init__.py b/starpilot/third_party/influxdb_client/client/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/__init__.py rename to starpilot/third_party/influxdb_client/client/__init__.py diff --git a/frogpilot/third_party/influxdb_client/client/_base.py b/starpilot/third_party/influxdb_client/client/_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/_base.py rename to starpilot/third_party/influxdb_client/client/_base.py diff --git a/frogpilot/third_party/influxdb_client/client/_pages.py b/starpilot/third_party/influxdb_client/client/_pages.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/_pages.py rename to starpilot/third_party/influxdb_client/client/_pages.py diff --git a/frogpilot/third_party/influxdb_client/client/authorizations_api.py b/starpilot/third_party/influxdb_client/client/authorizations_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/authorizations_api.py rename to starpilot/third_party/influxdb_client/client/authorizations_api.py diff --git a/frogpilot/third_party/influxdb_client/client/bucket_api.py b/starpilot/third_party/influxdb_client/client/bucket_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/bucket_api.py rename to starpilot/third_party/influxdb_client/client/bucket_api.py diff --git a/frogpilot/third_party/influxdb_client/client/delete_api.py b/starpilot/third_party/influxdb_client/client/delete_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/delete_api.py rename to starpilot/third_party/influxdb_client/client/delete_api.py diff --git a/frogpilot/third_party/influxdb_client/client/delete_api_async.py b/starpilot/third_party/influxdb_client/client/delete_api_async.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/delete_api_async.py rename to starpilot/third_party/influxdb_client/client/delete_api_async.py diff --git a/frogpilot/third_party/influxdb_client/client/exceptions.py b/starpilot/third_party/influxdb_client/client/exceptions.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/exceptions.py rename to starpilot/third_party/influxdb_client/client/exceptions.py diff --git a/frogpilot/third_party/influxdb_client/client/flux_csv_parser.py b/starpilot/third_party/influxdb_client/client/flux_csv_parser.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/flux_csv_parser.py rename to starpilot/third_party/influxdb_client/client/flux_csv_parser.py diff --git a/frogpilot/third_party/influxdb_client/client/flux_table.py b/starpilot/third_party/influxdb_client/client/flux_table.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/flux_table.py rename to starpilot/third_party/influxdb_client/client/flux_table.py diff --git a/frogpilot/third_party/influxdb_client/client/influxdb_client.py b/starpilot/third_party/influxdb_client/client/influxdb_client.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/influxdb_client.py rename to starpilot/third_party/influxdb_client/client/influxdb_client.py diff --git a/frogpilot/third_party/influxdb_client/client/influxdb_client_async.py b/starpilot/third_party/influxdb_client/client/influxdb_client_async.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/influxdb_client_async.py rename to starpilot/third_party/influxdb_client/client/influxdb_client_async.py diff --git a/frogpilot/third_party/influxdb_client/client/invokable_scripts_api.py b/starpilot/third_party/influxdb_client/client/invokable_scripts_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/invokable_scripts_api.py rename to starpilot/third_party/influxdb_client/client/invokable_scripts_api.py diff --git a/frogpilot/third_party/influxdb_client/client/labels_api.py b/starpilot/third_party/influxdb_client/client/labels_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/labels_api.py rename to starpilot/third_party/influxdb_client/client/labels_api.py diff --git a/frogpilot/third_party/influxdb_client/client/logging_handler.py b/starpilot/third_party/influxdb_client/client/logging_handler.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/logging_handler.py rename to starpilot/third_party/influxdb_client/client/logging_handler.py diff --git a/frogpilot/third_party/influxdb_client/client/organizations_api.py b/starpilot/third_party/influxdb_client/client/organizations_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/organizations_api.py rename to starpilot/third_party/influxdb_client/client/organizations_api.py diff --git a/frogpilot/third_party/influxdb_client/client/query_api.py b/starpilot/third_party/influxdb_client/client/query_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/query_api.py rename to starpilot/third_party/influxdb_client/client/query_api.py diff --git a/frogpilot/third_party/influxdb_client/client/query_api_async.py b/starpilot/third_party/influxdb_client/client/query_api_async.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/query_api_async.py rename to starpilot/third_party/influxdb_client/client/query_api_async.py diff --git a/frogpilot/third_party/influxdb_client/client/tasks_api.py b/starpilot/third_party/influxdb_client/client/tasks_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/tasks_api.py rename to starpilot/third_party/influxdb_client/client/tasks_api.py diff --git a/frogpilot/third_party/influxdb_client/client/users_api.py b/starpilot/third_party/influxdb_client/client/users_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/users_api.py rename to starpilot/third_party/influxdb_client/client/users_api.py diff --git a/frogpilot/third_party/influxdb_client/client/util/__init__.py b/starpilot/third_party/influxdb_client/client/util/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/util/__init__.py rename to starpilot/third_party/influxdb_client/client/util/__init__.py diff --git a/frogpilot/third_party/influxdb_client/client/util/date_utils.py b/starpilot/third_party/influxdb_client/client/util/date_utils.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/util/date_utils.py rename to starpilot/third_party/influxdb_client/client/util/date_utils.py diff --git a/frogpilot/third_party/influxdb_client/client/util/date_utils_pandas.py b/starpilot/third_party/influxdb_client/client/util/date_utils_pandas.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/util/date_utils_pandas.py rename to starpilot/third_party/influxdb_client/client/util/date_utils_pandas.py diff --git a/frogpilot/third_party/influxdb_client/client/util/helpers.py b/starpilot/third_party/influxdb_client/client/util/helpers.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/util/helpers.py rename to starpilot/third_party/influxdb_client/client/util/helpers.py diff --git a/frogpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py b/starpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py rename to starpilot/third_party/influxdb_client/client/util/multiprocessing_helper.py diff --git a/frogpilot/third_party/influxdb_client/client/warnings.py b/starpilot/third_party/influxdb_client/client/warnings.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/warnings.py rename to starpilot/third_party/influxdb_client/client/warnings.py diff --git a/frogpilot/third_party/influxdb_client/client/write/__init__.py b/starpilot/third_party/influxdb_client/client/write/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/write/__init__.py rename to starpilot/third_party/influxdb_client/client/write/__init__.py diff --git a/frogpilot/third_party/influxdb_client/client/write/dataframe_serializer.py b/starpilot/third_party/influxdb_client/client/write/dataframe_serializer.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/write/dataframe_serializer.py rename to starpilot/third_party/influxdb_client/client/write/dataframe_serializer.py diff --git a/frogpilot/third_party/influxdb_client/client/write/point.py b/starpilot/third_party/influxdb_client/client/write/point.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/write/point.py rename to starpilot/third_party/influxdb_client/client/write/point.py diff --git a/frogpilot/third_party/influxdb_client/client/write/retry.py b/starpilot/third_party/influxdb_client/client/write/retry.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/write/retry.py rename to starpilot/third_party/influxdb_client/client/write/retry.py diff --git a/frogpilot/third_party/influxdb_client/client/write_api.py b/starpilot/third_party/influxdb_client/client/write_api.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/write_api.py rename to starpilot/third_party/influxdb_client/client/write_api.py diff --git a/frogpilot/third_party/influxdb_client/client/write_api_async.py b/starpilot/third_party/influxdb_client/client/write_api_async.py similarity index 100% rename from frogpilot/third_party/influxdb_client/client/write_api_async.py rename to starpilot/third_party/influxdb_client/client/write_api_async.py diff --git a/frogpilot/third_party/influxdb_client/configuration.py b/starpilot/third_party/influxdb_client/configuration.py similarity index 100% rename from frogpilot/third_party/influxdb_client/configuration.py rename to starpilot/third_party/influxdb_client/configuration.py diff --git a/frogpilot/third_party/influxdb_client/domain/__init__.py b/starpilot/third_party/influxdb_client/domain/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/__init__.py rename to starpilot/third_party/influxdb_client/domain/__init__.py diff --git a/frogpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py b/starpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py rename to starpilot/third_party/influxdb_client/domain/add_resource_member_request_body.py diff --git a/frogpilot/third_party/influxdb_client/domain/analyze_query_response.py b/starpilot/third_party/influxdb_client/domain/analyze_query_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/analyze_query_response.py rename to starpilot/third_party/influxdb_client/domain/analyze_query_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py b/starpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py rename to starpilot/third_party/influxdb_client/domain/analyze_query_response_errors.py diff --git a/frogpilot/third_party/influxdb_client/domain/array_expression.py b/starpilot/third_party/influxdb_client/domain/array_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/array_expression.py rename to starpilot/third_party/influxdb_client/domain/array_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/ast_response.py b/starpilot/third_party/influxdb_client/domain/ast_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/ast_response.py rename to starpilot/third_party/influxdb_client/domain/ast_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/authorization.py b/starpilot/third_party/influxdb_client/domain/authorization.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/authorization.py rename to starpilot/third_party/influxdb_client/domain/authorization.py diff --git a/frogpilot/third_party/influxdb_client/domain/authorization_post_request.py b/starpilot/third_party/influxdb_client/domain/authorization_post_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/authorization_post_request.py rename to starpilot/third_party/influxdb_client/domain/authorization_post_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/authorization_update_request.py b/starpilot/third_party/influxdb_client/domain/authorization_update_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/authorization_update_request.py rename to starpilot/third_party/influxdb_client/domain/authorization_update_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/authorizations.py b/starpilot/third_party/influxdb_client/domain/authorizations.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/authorizations.py rename to starpilot/third_party/influxdb_client/domain/authorizations.py diff --git a/frogpilot/third_party/influxdb_client/domain/axes.py b/starpilot/third_party/influxdb_client/domain/axes.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/axes.py rename to starpilot/third_party/influxdb_client/domain/axes.py diff --git a/frogpilot/third_party/influxdb_client/domain/axis.py b/starpilot/third_party/influxdb_client/domain/axis.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/axis.py rename to starpilot/third_party/influxdb_client/domain/axis.py diff --git a/frogpilot/third_party/influxdb_client/domain/axis_scale.py b/starpilot/third_party/influxdb_client/domain/axis_scale.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/axis_scale.py rename to starpilot/third_party/influxdb_client/domain/axis_scale.py diff --git a/frogpilot/third_party/influxdb_client/domain/bad_statement.py b/starpilot/third_party/influxdb_client/domain/bad_statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/bad_statement.py rename to starpilot/third_party/influxdb_client/domain/bad_statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/band_view_properties.py b/starpilot/third_party/influxdb_client/domain/band_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/band_view_properties.py rename to starpilot/third_party/influxdb_client/domain/band_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/binary_expression.py b/starpilot/third_party/influxdb_client/domain/binary_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/binary_expression.py rename to starpilot/third_party/influxdb_client/domain/binary_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/block.py b/starpilot/third_party/influxdb_client/domain/block.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/block.py rename to starpilot/third_party/influxdb_client/domain/block.py diff --git a/frogpilot/third_party/influxdb_client/domain/boolean_literal.py b/starpilot/third_party/influxdb_client/domain/boolean_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/boolean_literal.py rename to starpilot/third_party/influxdb_client/domain/boolean_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/bucket.py b/starpilot/third_party/influxdb_client/domain/bucket.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/bucket.py rename to starpilot/third_party/influxdb_client/domain/bucket.py diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_links.py b/starpilot/third_party/influxdb_client/domain/bucket_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/bucket_links.py rename to starpilot/third_party/influxdb_client/domain/bucket_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py b/starpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py rename to starpilot/third_party/influxdb_client/domain/bucket_metadata_manifest.py diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_retention_rules.py b/starpilot/third_party/influxdb_client/domain/bucket_retention_rules.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/bucket_retention_rules.py rename to starpilot/third_party/influxdb_client/domain/bucket_retention_rules.py diff --git a/frogpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py b/starpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py rename to starpilot/third_party/influxdb_client/domain/bucket_shard_mapping.py diff --git a/frogpilot/third_party/influxdb_client/domain/buckets.py b/starpilot/third_party/influxdb_client/domain/buckets.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/buckets.py rename to starpilot/third_party/influxdb_client/domain/buckets.py diff --git a/frogpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py b/starpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py rename to starpilot/third_party/influxdb_client/domain/builder_aggregate_function_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/builder_config.py b/starpilot/third_party/influxdb_client/domain/builder_config.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/builder_config.py rename to starpilot/third_party/influxdb_client/domain/builder_config.py diff --git a/frogpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py b/starpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py rename to starpilot/third_party/influxdb_client/domain/builder_config_aggregate_window.py diff --git a/frogpilot/third_party/influxdb_client/domain/builder_functions_type.py b/starpilot/third_party/influxdb_client/domain/builder_functions_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/builder_functions_type.py rename to starpilot/third_party/influxdb_client/domain/builder_functions_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/builder_tags_type.py b/starpilot/third_party/influxdb_client/domain/builder_tags_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/builder_tags_type.py rename to starpilot/third_party/influxdb_client/domain/builder_tags_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/builtin_statement.py b/starpilot/third_party/influxdb_client/domain/builtin_statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/builtin_statement.py rename to starpilot/third_party/influxdb_client/domain/builtin_statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/call_expression.py b/starpilot/third_party/influxdb_client/domain/call_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/call_expression.py rename to starpilot/third_party/influxdb_client/domain/call_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/cell.py b/starpilot/third_party/influxdb_client/domain/cell.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/cell.py rename to starpilot/third_party/influxdb_client/domain/cell.py diff --git a/frogpilot/third_party/influxdb_client/domain/cell_links.py b/starpilot/third_party/influxdb_client/domain/cell_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/cell_links.py rename to starpilot/third_party/influxdb_client/domain/cell_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/cell_update.py b/starpilot/third_party/influxdb_client/domain/cell_update.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/cell_update.py rename to starpilot/third_party/influxdb_client/domain/cell_update.py diff --git a/frogpilot/third_party/influxdb_client/domain/cell_with_view_properties.py b/starpilot/third_party/influxdb_client/domain/cell_with_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/cell_with_view_properties.py rename to starpilot/third_party/influxdb_client/domain/cell_with_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/check.py b/starpilot/third_party/influxdb_client/domain/check.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check.py rename to starpilot/third_party/influxdb_client/domain/check.py diff --git a/frogpilot/third_party/influxdb_client/domain/check_base.py b/starpilot/third_party/influxdb_client/domain/check_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check_base.py rename to starpilot/third_party/influxdb_client/domain/check_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/check_base_links.py b/starpilot/third_party/influxdb_client/domain/check_base_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check_base_links.py rename to starpilot/third_party/influxdb_client/domain/check_base_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/check_discriminator.py b/starpilot/third_party/influxdb_client/domain/check_discriminator.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check_discriminator.py rename to starpilot/third_party/influxdb_client/domain/check_discriminator.py diff --git a/frogpilot/third_party/influxdb_client/domain/check_patch.py b/starpilot/third_party/influxdb_client/domain/check_patch.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check_patch.py rename to starpilot/third_party/influxdb_client/domain/check_patch.py diff --git a/frogpilot/third_party/influxdb_client/domain/check_status_level.py b/starpilot/third_party/influxdb_client/domain/check_status_level.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check_status_level.py rename to starpilot/third_party/influxdb_client/domain/check_status_level.py diff --git a/frogpilot/third_party/influxdb_client/domain/check_view_properties.py b/starpilot/third_party/influxdb_client/domain/check_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/check_view_properties.py rename to starpilot/third_party/influxdb_client/domain/check_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/checks.py b/starpilot/third_party/influxdb_client/domain/checks.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/checks.py rename to starpilot/third_party/influxdb_client/domain/checks.py diff --git a/frogpilot/third_party/influxdb_client/domain/column_data_type.py b/starpilot/third_party/influxdb_client/domain/column_data_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/column_data_type.py rename to starpilot/third_party/influxdb_client/domain/column_data_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/column_semantic_type.py b/starpilot/third_party/influxdb_client/domain/column_semantic_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/column_semantic_type.py rename to starpilot/third_party/influxdb_client/domain/column_semantic_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/conditional_expression.py b/starpilot/third_party/influxdb_client/domain/conditional_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/conditional_expression.py rename to starpilot/third_party/influxdb_client/domain/conditional_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/config.py b/starpilot/third_party/influxdb_client/domain/config.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/config.py rename to starpilot/third_party/influxdb_client/domain/config.py diff --git a/frogpilot/third_party/influxdb_client/domain/constant_variable_properties.py b/starpilot/third_party/influxdb_client/domain/constant_variable_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/constant_variable_properties.py rename to starpilot/third_party/influxdb_client/domain/constant_variable_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/create_cell.py b/starpilot/third_party/influxdb_client/domain/create_cell.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/create_cell.py rename to starpilot/third_party/influxdb_client/domain/create_cell.py diff --git a/frogpilot/third_party/influxdb_client/domain/create_dashboard_request.py b/starpilot/third_party/influxdb_client/domain/create_dashboard_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/create_dashboard_request.py rename to starpilot/third_party/influxdb_client/domain/create_dashboard_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/custom_check.py b/starpilot/third_party/influxdb_client/domain/custom_check.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/custom_check.py rename to starpilot/third_party/influxdb_client/domain/custom_check.py diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard.py b/starpilot/third_party/influxdb_client/domain/dashboard.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dashboard.py rename to starpilot/third_party/influxdb_client/domain/dashboard.py diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard_color.py b/starpilot/third_party/influxdb_client/domain/dashboard_color.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dashboard_color.py rename to starpilot/third_party/influxdb_client/domain/dashboard_color.py diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard_query.py b/starpilot/third_party/influxdb_client/domain/dashboard_query.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dashboard_query.py rename to starpilot/third_party/influxdb_client/domain/dashboard_query.py diff --git a/frogpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py b/starpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py rename to starpilot/third_party/influxdb_client/domain/dashboard_with_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/dashboards.py b/starpilot/third_party/influxdb_client/domain/dashboards.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dashboards.py rename to starpilot/third_party/influxdb_client/domain/dashboards.py diff --git a/frogpilot/third_party/influxdb_client/domain/date_time_literal.py b/starpilot/third_party/influxdb_client/domain/date_time_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/date_time_literal.py rename to starpilot/third_party/influxdb_client/domain/date_time_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/dbr_ps.py b/starpilot/third_party/influxdb_client/domain/dbr_ps.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dbr_ps.py rename to starpilot/third_party/influxdb_client/domain/dbr_ps.py diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp.py b/starpilot/third_party/influxdb_client/domain/dbrp.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dbrp.py rename to starpilot/third_party/influxdb_client/domain/dbrp.py diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp_create.py b/starpilot/third_party/influxdb_client/domain/dbrp_create.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dbrp_create.py rename to starpilot/third_party/influxdb_client/domain/dbrp_create.py diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp_get.py b/starpilot/third_party/influxdb_client/domain/dbrp_get.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dbrp_get.py rename to starpilot/third_party/influxdb_client/domain/dbrp_get.py diff --git a/frogpilot/third_party/influxdb_client/domain/dbrp_update.py b/starpilot/third_party/influxdb_client/domain/dbrp_update.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dbrp_update.py rename to starpilot/third_party/influxdb_client/domain/dbrp_update.py diff --git a/frogpilot/third_party/influxdb_client/domain/deadman_check.py b/starpilot/third_party/influxdb_client/domain/deadman_check.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/deadman_check.py rename to starpilot/third_party/influxdb_client/domain/deadman_check.py diff --git a/frogpilot/third_party/influxdb_client/domain/decimal_places.py b/starpilot/third_party/influxdb_client/domain/decimal_places.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/decimal_places.py rename to starpilot/third_party/influxdb_client/domain/decimal_places.py diff --git a/frogpilot/third_party/influxdb_client/domain/delete_predicate_request.py b/starpilot/third_party/influxdb_client/domain/delete_predicate_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/delete_predicate_request.py rename to starpilot/third_party/influxdb_client/domain/delete_predicate_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/dialect.py b/starpilot/third_party/influxdb_client/domain/dialect.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dialect.py rename to starpilot/third_party/influxdb_client/domain/dialect.py diff --git a/frogpilot/third_party/influxdb_client/domain/dict_expression.py b/starpilot/third_party/influxdb_client/domain/dict_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dict_expression.py rename to starpilot/third_party/influxdb_client/domain/dict_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/dict_item.py b/starpilot/third_party/influxdb_client/domain/dict_item.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/dict_item.py rename to starpilot/third_party/influxdb_client/domain/dict_item.py diff --git a/frogpilot/third_party/influxdb_client/domain/duration.py b/starpilot/third_party/influxdb_client/domain/duration.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/duration.py rename to starpilot/third_party/influxdb_client/domain/duration.py diff --git a/frogpilot/third_party/influxdb_client/domain/duration_literal.py b/starpilot/third_party/influxdb_client/domain/duration_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/duration_literal.py rename to starpilot/third_party/influxdb_client/domain/duration_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/error.py b/starpilot/third_party/influxdb_client/domain/error.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/error.py rename to starpilot/third_party/influxdb_client/domain/error.py diff --git a/frogpilot/third_party/influxdb_client/domain/expression.py b/starpilot/third_party/influxdb_client/domain/expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/expression.py rename to starpilot/third_party/influxdb_client/domain/expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/expression_statement.py b/starpilot/third_party/influxdb_client/domain/expression_statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/expression_statement.py rename to starpilot/third_party/influxdb_client/domain/expression_statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/field.py b/starpilot/third_party/influxdb_client/domain/field.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/field.py rename to starpilot/third_party/influxdb_client/domain/field.py diff --git a/frogpilot/third_party/influxdb_client/domain/file.py b/starpilot/third_party/influxdb_client/domain/file.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/file.py rename to starpilot/third_party/influxdb_client/domain/file.py diff --git a/frogpilot/third_party/influxdb_client/domain/float_literal.py b/starpilot/third_party/influxdb_client/domain/float_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/float_literal.py rename to starpilot/third_party/influxdb_client/domain/float_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/flux_response.py b/starpilot/third_party/influxdb_client/domain/flux_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/flux_response.py rename to starpilot/third_party/influxdb_client/domain/flux_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/flux_suggestion.py b/starpilot/third_party/influxdb_client/domain/flux_suggestion.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/flux_suggestion.py rename to starpilot/third_party/influxdb_client/domain/flux_suggestion.py diff --git a/frogpilot/third_party/influxdb_client/domain/flux_suggestions.py b/starpilot/third_party/influxdb_client/domain/flux_suggestions.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/flux_suggestions.py rename to starpilot/third_party/influxdb_client/domain/flux_suggestions.py diff --git a/frogpilot/third_party/influxdb_client/domain/function_expression.py b/starpilot/third_party/influxdb_client/domain/function_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/function_expression.py rename to starpilot/third_party/influxdb_client/domain/function_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/gauge_view_properties.py b/starpilot/third_party/influxdb_client/domain/gauge_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/gauge_view_properties.py rename to starpilot/third_party/influxdb_client/domain/gauge_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/greater_threshold.py b/starpilot/third_party/influxdb_client/domain/greater_threshold.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/greater_threshold.py rename to starpilot/third_party/influxdb_client/domain/greater_threshold.py diff --git a/frogpilot/third_party/influxdb_client/domain/health_check.py b/starpilot/third_party/influxdb_client/domain/health_check.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/health_check.py rename to starpilot/third_party/influxdb_client/domain/health_check.py diff --git a/frogpilot/third_party/influxdb_client/domain/heatmap_view_properties.py b/starpilot/third_party/influxdb_client/domain/heatmap_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/heatmap_view_properties.py rename to starpilot/third_party/influxdb_client/domain/heatmap_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/histogram_view_properties.py b/starpilot/third_party/influxdb_client/domain/histogram_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/histogram_view_properties.py rename to starpilot/third_party/influxdb_client/domain/histogram_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/http_notification_endpoint.py b/starpilot/third_party/influxdb_client/domain/http_notification_endpoint.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/http_notification_endpoint.py rename to starpilot/third_party/influxdb_client/domain/http_notification_endpoint.py diff --git a/frogpilot/third_party/influxdb_client/domain/http_notification_rule.py b/starpilot/third_party/influxdb_client/domain/http_notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/http_notification_rule.py rename to starpilot/third_party/influxdb_client/domain/http_notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/http_notification_rule_base.py b/starpilot/third_party/influxdb_client/domain/http_notification_rule_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/http_notification_rule_base.py rename to starpilot/third_party/influxdb_client/domain/http_notification_rule_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/identifier.py b/starpilot/third_party/influxdb_client/domain/identifier.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/identifier.py rename to starpilot/third_party/influxdb_client/domain/identifier.py diff --git a/frogpilot/third_party/influxdb_client/domain/import_declaration.py b/starpilot/third_party/influxdb_client/domain/import_declaration.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/import_declaration.py rename to starpilot/third_party/influxdb_client/domain/import_declaration.py diff --git a/frogpilot/third_party/influxdb_client/domain/index_expression.py b/starpilot/third_party/influxdb_client/domain/index_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/index_expression.py rename to starpilot/third_party/influxdb_client/domain/index_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/integer_literal.py b/starpilot/third_party/influxdb_client/domain/integer_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/integer_literal.py rename to starpilot/third_party/influxdb_client/domain/integer_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/is_onboarding.py b/starpilot/third_party/influxdb_client/domain/is_onboarding.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/is_onboarding.py rename to starpilot/third_party/influxdb_client/domain/is_onboarding.py diff --git a/frogpilot/third_party/influxdb_client/domain/label.py b/starpilot/third_party/influxdb_client/domain/label.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/label.py rename to starpilot/third_party/influxdb_client/domain/label.py diff --git a/frogpilot/third_party/influxdb_client/domain/label_create_request.py b/starpilot/third_party/influxdb_client/domain/label_create_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/label_create_request.py rename to starpilot/third_party/influxdb_client/domain/label_create_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/label_mapping.py b/starpilot/third_party/influxdb_client/domain/label_mapping.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/label_mapping.py rename to starpilot/third_party/influxdb_client/domain/label_mapping.py diff --git a/frogpilot/third_party/influxdb_client/domain/label_response.py b/starpilot/third_party/influxdb_client/domain/label_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/label_response.py rename to starpilot/third_party/influxdb_client/domain/label_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/label_update.py b/starpilot/third_party/influxdb_client/domain/label_update.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/label_update.py rename to starpilot/third_party/influxdb_client/domain/label_update.py diff --git a/frogpilot/third_party/influxdb_client/domain/labels_response.py b/starpilot/third_party/influxdb_client/domain/labels_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/labels_response.py rename to starpilot/third_party/influxdb_client/domain/labels_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/language_request.py b/starpilot/third_party/influxdb_client/domain/language_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/language_request.py rename to starpilot/third_party/influxdb_client/domain/language_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py b/starpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py rename to starpilot/third_party/influxdb_client/domain/legacy_authorization_post_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/lesser_threshold.py b/starpilot/third_party/influxdb_client/domain/lesser_threshold.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/lesser_threshold.py rename to starpilot/third_party/influxdb_client/domain/lesser_threshold.py diff --git a/frogpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py b/starpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py rename to starpilot/third_party/influxdb_client/domain/line_plus_single_stat_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/line_protocol_error.py b/starpilot/third_party/influxdb_client/domain/line_protocol_error.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/line_protocol_error.py rename to starpilot/third_party/influxdb_client/domain/line_protocol_error.py diff --git a/frogpilot/third_party/influxdb_client/domain/line_protocol_length_error.py b/starpilot/third_party/influxdb_client/domain/line_protocol_length_error.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/line_protocol_length_error.py rename to starpilot/third_party/influxdb_client/domain/line_protocol_length_error.py diff --git a/frogpilot/third_party/influxdb_client/domain/links.py b/starpilot/third_party/influxdb_client/domain/links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/links.py rename to starpilot/third_party/influxdb_client/domain/links.py diff --git a/frogpilot/third_party/influxdb_client/domain/list_stacks_response.py b/starpilot/third_party/influxdb_client/domain/list_stacks_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/list_stacks_response.py rename to starpilot/third_party/influxdb_client/domain/list_stacks_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/log_event.py b/starpilot/third_party/influxdb_client/domain/log_event.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/log_event.py rename to starpilot/third_party/influxdb_client/domain/log_event.py diff --git a/frogpilot/third_party/influxdb_client/domain/logical_expression.py b/starpilot/third_party/influxdb_client/domain/logical_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/logical_expression.py rename to starpilot/third_party/influxdb_client/domain/logical_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/logs.py b/starpilot/third_party/influxdb_client/domain/logs.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/logs.py rename to starpilot/third_party/influxdb_client/domain/logs.py diff --git a/frogpilot/third_party/influxdb_client/domain/map_variable_properties.py b/starpilot/third_party/influxdb_client/domain/map_variable_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/map_variable_properties.py rename to starpilot/third_party/influxdb_client/domain/map_variable_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/markdown_view_properties.py b/starpilot/third_party/influxdb_client/domain/markdown_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/markdown_view_properties.py rename to starpilot/third_party/influxdb_client/domain/markdown_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema.py b/starpilot/third_party/influxdb_client/domain/measurement_schema.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/measurement_schema.py rename to starpilot/third_party/influxdb_client/domain/measurement_schema.py diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_column.py b/starpilot/third_party/influxdb_client/domain/measurement_schema_column.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/measurement_schema_column.py rename to starpilot/third_party/influxdb_client/domain/measurement_schema_column.py diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py b/starpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py rename to starpilot/third_party/influxdb_client/domain/measurement_schema_create_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_list.py b/starpilot/third_party/influxdb_client/domain/measurement_schema_list.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/measurement_schema_list.py rename to starpilot/third_party/influxdb_client/domain/measurement_schema_list.py diff --git a/frogpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py b/starpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py rename to starpilot/third_party/influxdb_client/domain/measurement_schema_update_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/member_assignment.py b/starpilot/third_party/influxdb_client/domain/member_assignment.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/member_assignment.py rename to starpilot/third_party/influxdb_client/domain/member_assignment.py diff --git a/frogpilot/third_party/influxdb_client/domain/member_expression.py b/starpilot/third_party/influxdb_client/domain/member_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/member_expression.py rename to starpilot/third_party/influxdb_client/domain/member_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/metadata_backup.py b/starpilot/third_party/influxdb_client/domain/metadata_backup.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/metadata_backup.py rename to starpilot/third_party/influxdb_client/domain/metadata_backup.py diff --git a/frogpilot/third_party/influxdb_client/domain/model_property.py b/starpilot/third_party/influxdb_client/domain/model_property.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/model_property.py rename to starpilot/third_party/influxdb_client/domain/model_property.py diff --git a/frogpilot/third_party/influxdb_client/domain/mosaic_view_properties.py b/starpilot/third_party/influxdb_client/domain/mosaic_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/mosaic_view_properties.py rename to starpilot/third_party/influxdb_client/domain/mosaic_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/node.py b/starpilot/third_party/influxdb_client/domain/node.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/node.py rename to starpilot/third_party/influxdb_client/domain/node.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint.py b/starpilot/third_party/influxdb_client/domain/notification_endpoint.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoint.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoint.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base.py b/starpilot/third_party/influxdb_client/domain/notification_endpoint_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoint_base.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoint_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py b/starpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoint_base_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py b/starpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoint_discriminator.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_type.py b/starpilot/third_party/influxdb_client/domain/notification_endpoint_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoint_type.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoint_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoint_update.py b/starpilot/third_party/influxdb_client/domain/notification_endpoint_update.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoint_update.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoint_update.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_endpoints.py b/starpilot/third_party/influxdb_client/domain/notification_endpoints.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_endpoints.py rename to starpilot/third_party/influxdb_client/domain/notification_endpoints.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule.py b/starpilot/third_party/influxdb_client/domain/notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_rule.py rename to starpilot/third_party/influxdb_client/domain/notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_base.py b/starpilot/third_party/influxdb_client/domain/notification_rule_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_rule_base.py rename to starpilot/third_party/influxdb_client/domain/notification_rule_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_base_links.py b/starpilot/third_party/influxdb_client/domain/notification_rule_base_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_rule_base_links.py rename to starpilot/third_party/influxdb_client/domain/notification_rule_base_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py b/starpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py rename to starpilot/third_party/influxdb_client/domain/notification_rule_discriminator.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rule_update.py b/starpilot/third_party/influxdb_client/domain/notification_rule_update.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_rule_update.py rename to starpilot/third_party/influxdb_client/domain/notification_rule_update.py diff --git a/frogpilot/third_party/influxdb_client/domain/notification_rules.py b/starpilot/third_party/influxdb_client/domain/notification_rules.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/notification_rules.py rename to starpilot/third_party/influxdb_client/domain/notification_rules.py diff --git a/frogpilot/third_party/influxdb_client/domain/object_expression.py b/starpilot/third_party/influxdb_client/domain/object_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/object_expression.py rename to starpilot/third_party/influxdb_client/domain/object_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/onboarding_request.py b/starpilot/third_party/influxdb_client/domain/onboarding_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/onboarding_request.py rename to starpilot/third_party/influxdb_client/domain/onboarding_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/onboarding_response.py b/starpilot/third_party/influxdb_client/domain/onboarding_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/onboarding_response.py rename to starpilot/third_party/influxdb_client/domain/onboarding_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/option_statement.py b/starpilot/third_party/influxdb_client/domain/option_statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/option_statement.py rename to starpilot/third_party/influxdb_client/domain/option_statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/organization.py b/starpilot/third_party/influxdb_client/domain/organization.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/organization.py rename to starpilot/third_party/influxdb_client/domain/organization.py diff --git a/frogpilot/third_party/influxdb_client/domain/organization_links.py b/starpilot/third_party/influxdb_client/domain/organization_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/organization_links.py rename to starpilot/third_party/influxdb_client/domain/organization_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/organizations.py b/starpilot/third_party/influxdb_client/domain/organizations.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/organizations.py rename to starpilot/third_party/influxdb_client/domain/organizations.py diff --git a/frogpilot/third_party/influxdb_client/domain/package.py b/starpilot/third_party/influxdb_client/domain/package.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/package.py rename to starpilot/third_party/influxdb_client/domain/package.py diff --git a/frogpilot/third_party/influxdb_client/domain/package_clause.py b/starpilot/third_party/influxdb_client/domain/package_clause.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/package_clause.py rename to starpilot/third_party/influxdb_client/domain/package_clause.py diff --git a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py b/starpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py rename to starpilot/third_party/influxdb_client/domain/pager_duty_notification_endpoint.py diff --git a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py b/starpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py rename to starpilot/third_party/influxdb_client/domain/pager_duty_notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py b/starpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py rename to starpilot/third_party/influxdb_client/domain/pager_duty_notification_rule_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/paren_expression.py b/starpilot/third_party/influxdb_client/domain/paren_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/paren_expression.py rename to starpilot/third_party/influxdb_client/domain/paren_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/password_reset_body.py b/starpilot/third_party/influxdb_client/domain/password_reset_body.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/password_reset_body.py rename to starpilot/third_party/influxdb_client/domain/password_reset_body.py diff --git a/frogpilot/third_party/influxdb_client/domain/patch_bucket_request.py b/starpilot/third_party/influxdb_client/domain/patch_bucket_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/patch_bucket_request.py rename to starpilot/third_party/influxdb_client/domain/patch_bucket_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/patch_dashboard_request.py b/starpilot/third_party/influxdb_client/domain/patch_dashboard_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/patch_dashboard_request.py rename to starpilot/third_party/influxdb_client/domain/patch_dashboard_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/patch_organization_request.py b/starpilot/third_party/influxdb_client/domain/patch_organization_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/patch_organization_request.py rename to starpilot/third_party/influxdb_client/domain/patch_organization_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/patch_retention_rule.py b/starpilot/third_party/influxdb_client/domain/patch_retention_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/patch_retention_rule.py rename to starpilot/third_party/influxdb_client/domain/patch_retention_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/patch_stack_request.py b/starpilot/third_party/influxdb_client/domain/patch_stack_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/patch_stack_request.py rename to starpilot/third_party/influxdb_client/domain/patch_stack_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py b/starpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py rename to starpilot/third_party/influxdb_client/domain/patch_stack_request_additional_resources.py diff --git a/frogpilot/third_party/influxdb_client/domain/permission.py b/starpilot/third_party/influxdb_client/domain/permission.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/permission.py rename to starpilot/third_party/influxdb_client/domain/permission.py diff --git a/frogpilot/third_party/influxdb_client/domain/permission_resource.py b/starpilot/third_party/influxdb_client/domain/permission_resource.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/permission_resource.py rename to starpilot/third_party/influxdb_client/domain/permission_resource.py diff --git a/frogpilot/third_party/influxdb_client/domain/pipe_expression.py b/starpilot/third_party/influxdb_client/domain/pipe_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/pipe_expression.py rename to starpilot/third_party/influxdb_client/domain/pipe_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/pipe_literal.py b/starpilot/third_party/influxdb_client/domain/pipe_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/pipe_literal.py rename to starpilot/third_party/influxdb_client/domain/pipe_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_bucket_request.py b/starpilot/third_party/influxdb_client/domain/post_bucket_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_bucket_request.py rename to starpilot/third_party/influxdb_client/domain/post_bucket_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_check.py b/starpilot/third_party/influxdb_client/domain/post_check.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_check.py rename to starpilot/third_party/influxdb_client/domain/post_check.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_notification_endpoint.py b/starpilot/third_party/influxdb_client/domain/post_notification_endpoint.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_notification_endpoint.py rename to starpilot/third_party/influxdb_client/domain/post_notification_endpoint.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_notification_rule.py b/starpilot/third_party/influxdb_client/domain/post_notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_notification_rule.py rename to starpilot/third_party/influxdb_client/domain/post_notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_organization_request.py b/starpilot/third_party/influxdb_client/domain/post_organization_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_organization_request.py rename to starpilot/third_party/influxdb_client/domain/post_organization_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_restore_kv_response.py b/starpilot/third_party/influxdb_client/domain/post_restore_kv_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_restore_kv_response.py rename to starpilot/third_party/influxdb_client/domain/post_restore_kv_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/post_stack_request.py b/starpilot/third_party/influxdb_client/domain/post_stack_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/post_stack_request.py rename to starpilot/third_party/influxdb_client/domain/post_stack_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/property_key.py b/starpilot/third_party/influxdb_client/domain/property_key.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/property_key.py rename to starpilot/third_party/influxdb_client/domain/property_key.py diff --git a/frogpilot/third_party/influxdb_client/domain/query.py b/starpilot/third_party/influxdb_client/domain/query.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/query.py rename to starpilot/third_party/influxdb_client/domain/query.py diff --git a/frogpilot/third_party/influxdb_client/domain/query_edit_mode.py b/starpilot/third_party/influxdb_client/domain/query_edit_mode.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/query_edit_mode.py rename to starpilot/third_party/influxdb_client/domain/query_edit_mode.py diff --git a/frogpilot/third_party/influxdb_client/domain/query_variable_properties.py b/starpilot/third_party/influxdb_client/domain/query_variable_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/query_variable_properties.py rename to starpilot/third_party/influxdb_client/domain/query_variable_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/query_variable_properties_values.py b/starpilot/third_party/influxdb_client/domain/query_variable_properties_values.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/query_variable_properties_values.py rename to starpilot/third_party/influxdb_client/domain/query_variable_properties_values.py diff --git a/frogpilot/third_party/influxdb_client/domain/range_threshold.py b/starpilot/third_party/influxdb_client/domain/range_threshold.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/range_threshold.py rename to starpilot/third_party/influxdb_client/domain/range_threshold.py diff --git a/frogpilot/third_party/influxdb_client/domain/ready.py b/starpilot/third_party/influxdb_client/domain/ready.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/ready.py rename to starpilot/third_party/influxdb_client/domain/ready.py diff --git a/frogpilot/third_party/influxdb_client/domain/regexp_literal.py b/starpilot/third_party/influxdb_client/domain/regexp_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/regexp_literal.py rename to starpilot/third_party/influxdb_client/domain/regexp_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connection.py b/starpilot/third_party/influxdb_client/domain/remote_connection.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/remote_connection.py rename to starpilot/third_party/influxdb_client/domain/remote_connection.py diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py b/starpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py rename to starpilot/third_party/influxdb_client/domain/remote_connection_creation_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connection_update_request.py b/starpilot/third_party/influxdb_client/domain/remote_connection_update_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/remote_connection_update_request.py rename to starpilot/third_party/influxdb_client/domain/remote_connection_update_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/remote_connections.py b/starpilot/third_party/influxdb_client/domain/remote_connections.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/remote_connections.py rename to starpilot/third_party/influxdb_client/domain/remote_connections.py diff --git a/frogpilot/third_party/influxdb_client/domain/renamable_field.py b/starpilot/third_party/influxdb_client/domain/renamable_field.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/renamable_field.py rename to starpilot/third_party/influxdb_client/domain/renamable_field.py diff --git a/frogpilot/third_party/influxdb_client/domain/replication.py b/starpilot/third_party/influxdb_client/domain/replication.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/replication.py rename to starpilot/third_party/influxdb_client/domain/replication.py diff --git a/frogpilot/third_party/influxdb_client/domain/replication_creation_request.py b/starpilot/third_party/influxdb_client/domain/replication_creation_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/replication_creation_request.py rename to starpilot/third_party/influxdb_client/domain/replication_creation_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/replication_update_request.py b/starpilot/third_party/influxdb_client/domain/replication_update_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/replication_update_request.py rename to starpilot/third_party/influxdb_client/domain/replication_update_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/replications.py b/starpilot/third_party/influxdb_client/domain/replications.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/replications.py rename to starpilot/third_party/influxdb_client/domain/replications.py diff --git a/frogpilot/third_party/influxdb_client/domain/resource_member.py b/starpilot/third_party/influxdb_client/domain/resource_member.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/resource_member.py rename to starpilot/third_party/influxdb_client/domain/resource_member.py diff --git a/frogpilot/third_party/influxdb_client/domain/resource_members.py b/starpilot/third_party/influxdb_client/domain/resource_members.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/resource_members.py rename to starpilot/third_party/influxdb_client/domain/resource_members.py diff --git a/frogpilot/third_party/influxdb_client/domain/resource_members_links.py b/starpilot/third_party/influxdb_client/domain/resource_members_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/resource_members_links.py rename to starpilot/third_party/influxdb_client/domain/resource_members_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/resource_owner.py b/starpilot/third_party/influxdb_client/domain/resource_owner.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/resource_owner.py rename to starpilot/third_party/influxdb_client/domain/resource_owner.py diff --git a/frogpilot/third_party/influxdb_client/domain/resource_owners.py b/starpilot/third_party/influxdb_client/domain/resource_owners.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/resource_owners.py rename to starpilot/third_party/influxdb_client/domain/resource_owners.py diff --git a/frogpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py b/starpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py rename to starpilot/third_party/influxdb_client/domain/restored_bucket_mappings.py diff --git a/frogpilot/third_party/influxdb_client/domain/retention_policy_manifest.py b/starpilot/third_party/influxdb_client/domain/retention_policy_manifest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/retention_policy_manifest.py rename to starpilot/third_party/influxdb_client/domain/retention_policy_manifest.py diff --git a/frogpilot/third_party/influxdb_client/domain/return_statement.py b/starpilot/third_party/influxdb_client/domain/return_statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/return_statement.py rename to starpilot/third_party/influxdb_client/domain/return_statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/routes.py b/starpilot/third_party/influxdb_client/domain/routes.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/routes.py rename to starpilot/third_party/influxdb_client/domain/routes.py diff --git a/frogpilot/third_party/influxdb_client/domain/routes_external.py b/starpilot/third_party/influxdb_client/domain/routes_external.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/routes_external.py rename to starpilot/third_party/influxdb_client/domain/routes_external.py diff --git a/frogpilot/third_party/influxdb_client/domain/routes_query.py b/starpilot/third_party/influxdb_client/domain/routes_query.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/routes_query.py rename to starpilot/third_party/influxdb_client/domain/routes_query.py diff --git a/frogpilot/third_party/influxdb_client/domain/routes_system.py b/starpilot/third_party/influxdb_client/domain/routes_system.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/routes_system.py rename to starpilot/third_party/influxdb_client/domain/routes_system.py diff --git a/frogpilot/third_party/influxdb_client/domain/rule_status_level.py b/starpilot/third_party/influxdb_client/domain/rule_status_level.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/rule_status_level.py rename to starpilot/third_party/influxdb_client/domain/rule_status_level.py diff --git a/frogpilot/third_party/influxdb_client/domain/run.py b/starpilot/third_party/influxdb_client/domain/run.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/run.py rename to starpilot/third_party/influxdb_client/domain/run.py diff --git a/frogpilot/third_party/influxdb_client/domain/run_links.py b/starpilot/third_party/influxdb_client/domain/run_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/run_links.py rename to starpilot/third_party/influxdb_client/domain/run_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/run_manually.py b/starpilot/third_party/influxdb_client/domain/run_manually.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/run_manually.py rename to starpilot/third_party/influxdb_client/domain/run_manually.py diff --git a/frogpilot/third_party/influxdb_client/domain/runs.py b/starpilot/third_party/influxdb_client/domain/runs.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/runs.py rename to starpilot/third_party/influxdb_client/domain/runs.py diff --git a/frogpilot/third_party/influxdb_client/domain/scatter_view_properties.py b/starpilot/third_party/influxdb_client/domain/scatter_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/scatter_view_properties.py rename to starpilot/third_party/influxdb_client/domain/scatter_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/schema_type.py b/starpilot/third_party/influxdb_client/domain/schema_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/schema_type.py rename to starpilot/third_party/influxdb_client/domain/schema_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/scraper_target_request.py b/starpilot/third_party/influxdb_client/domain/scraper_target_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/scraper_target_request.py rename to starpilot/third_party/influxdb_client/domain/scraper_target_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/scraper_target_response.py b/starpilot/third_party/influxdb_client/domain/scraper_target_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/scraper_target_response.py rename to starpilot/third_party/influxdb_client/domain/scraper_target_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/scraper_target_responses.py b/starpilot/third_party/influxdb_client/domain/scraper_target_responses.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/scraper_target_responses.py rename to starpilot/third_party/influxdb_client/domain/scraper_target_responses.py diff --git a/frogpilot/third_party/influxdb_client/domain/script.py b/starpilot/third_party/influxdb_client/domain/script.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/script.py rename to starpilot/third_party/influxdb_client/domain/script.py diff --git a/frogpilot/third_party/influxdb_client/domain/script_create_request.py b/starpilot/third_party/influxdb_client/domain/script_create_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/script_create_request.py rename to starpilot/third_party/influxdb_client/domain/script_create_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/script_invocation_params.py b/starpilot/third_party/influxdb_client/domain/script_invocation_params.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/script_invocation_params.py rename to starpilot/third_party/influxdb_client/domain/script_invocation_params.py diff --git a/frogpilot/third_party/influxdb_client/domain/script_language.py b/starpilot/third_party/influxdb_client/domain/script_language.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/script_language.py rename to starpilot/third_party/influxdb_client/domain/script_language.py diff --git a/frogpilot/third_party/influxdb_client/domain/script_update_request.py b/starpilot/third_party/influxdb_client/domain/script_update_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/script_update_request.py rename to starpilot/third_party/influxdb_client/domain/script_update_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/scripts.py b/starpilot/third_party/influxdb_client/domain/scripts.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/scripts.py rename to starpilot/third_party/influxdb_client/domain/scripts.py diff --git a/frogpilot/third_party/influxdb_client/domain/secret_keys.py b/starpilot/third_party/influxdb_client/domain/secret_keys.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/secret_keys.py rename to starpilot/third_party/influxdb_client/domain/secret_keys.py diff --git a/frogpilot/third_party/influxdb_client/domain/secret_keys_response.py b/starpilot/third_party/influxdb_client/domain/secret_keys_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/secret_keys_response.py rename to starpilot/third_party/influxdb_client/domain/secret_keys_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/shard_group_manifest.py b/starpilot/third_party/influxdb_client/domain/shard_group_manifest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/shard_group_manifest.py rename to starpilot/third_party/influxdb_client/domain/shard_group_manifest.py diff --git a/frogpilot/third_party/influxdb_client/domain/shard_manifest.py b/starpilot/third_party/influxdb_client/domain/shard_manifest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/shard_manifest.py rename to starpilot/third_party/influxdb_client/domain/shard_manifest.py diff --git a/frogpilot/third_party/influxdb_client/domain/shard_owner.py b/starpilot/third_party/influxdb_client/domain/shard_owner.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/shard_owner.py rename to starpilot/third_party/influxdb_client/domain/shard_owner.py diff --git a/frogpilot/third_party/influxdb_client/domain/simple_table_view_properties.py b/starpilot/third_party/influxdb_client/domain/simple_table_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/simple_table_view_properties.py rename to starpilot/third_party/influxdb_client/domain/simple_table_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/single_stat_view_properties.py b/starpilot/third_party/influxdb_client/domain/single_stat_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/single_stat_view_properties.py rename to starpilot/third_party/influxdb_client/domain/single_stat_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py b/starpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py rename to starpilot/third_party/influxdb_client/domain/slack_notification_endpoint.py diff --git a/frogpilot/third_party/influxdb_client/domain/slack_notification_rule.py b/starpilot/third_party/influxdb_client/domain/slack_notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/slack_notification_rule.py rename to starpilot/third_party/influxdb_client/domain/slack_notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py b/starpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py rename to starpilot/third_party/influxdb_client/domain/slack_notification_rule_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule.py b/starpilot/third_party/influxdb_client/domain/smtp_notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/smtp_notification_rule.py rename to starpilot/third_party/influxdb_client/domain/smtp_notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py b/starpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py rename to starpilot/third_party/influxdb_client/domain/smtp_notification_rule_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/source.py b/starpilot/third_party/influxdb_client/domain/source.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/source.py rename to starpilot/third_party/influxdb_client/domain/source.py diff --git a/frogpilot/third_party/influxdb_client/domain/source_links.py b/starpilot/third_party/influxdb_client/domain/source_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/source_links.py rename to starpilot/third_party/influxdb_client/domain/source_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/sources.py b/starpilot/third_party/influxdb_client/domain/sources.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/sources.py rename to starpilot/third_party/influxdb_client/domain/sources.py diff --git a/frogpilot/third_party/influxdb_client/domain/stack.py b/starpilot/third_party/influxdb_client/domain/stack.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/stack.py rename to starpilot/third_party/influxdb_client/domain/stack.py diff --git a/frogpilot/third_party/influxdb_client/domain/stack_associations.py b/starpilot/third_party/influxdb_client/domain/stack_associations.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/stack_associations.py rename to starpilot/third_party/influxdb_client/domain/stack_associations.py diff --git a/frogpilot/third_party/influxdb_client/domain/stack_events.py b/starpilot/third_party/influxdb_client/domain/stack_events.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/stack_events.py rename to starpilot/third_party/influxdb_client/domain/stack_events.py diff --git a/frogpilot/third_party/influxdb_client/domain/stack_links.py b/starpilot/third_party/influxdb_client/domain/stack_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/stack_links.py rename to starpilot/third_party/influxdb_client/domain/stack_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/stack_resources.py b/starpilot/third_party/influxdb_client/domain/stack_resources.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/stack_resources.py rename to starpilot/third_party/influxdb_client/domain/stack_resources.py diff --git a/frogpilot/third_party/influxdb_client/domain/statement.py b/starpilot/third_party/influxdb_client/domain/statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/statement.py rename to starpilot/third_party/influxdb_client/domain/statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/static_legend.py b/starpilot/third_party/influxdb_client/domain/static_legend.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/static_legend.py rename to starpilot/third_party/influxdb_client/domain/static_legend.py diff --git a/frogpilot/third_party/influxdb_client/domain/status_rule.py b/starpilot/third_party/influxdb_client/domain/status_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/status_rule.py rename to starpilot/third_party/influxdb_client/domain/status_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/string_literal.py b/starpilot/third_party/influxdb_client/domain/string_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/string_literal.py rename to starpilot/third_party/influxdb_client/domain/string_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/subscription_manifest.py b/starpilot/third_party/influxdb_client/domain/subscription_manifest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/subscription_manifest.py rename to starpilot/third_party/influxdb_client/domain/subscription_manifest.py diff --git a/frogpilot/third_party/influxdb_client/domain/table_view_properties.py b/starpilot/third_party/influxdb_client/domain/table_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/table_view_properties.py rename to starpilot/third_party/influxdb_client/domain/table_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py b/starpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py rename to starpilot/third_party/influxdb_client/domain/table_view_properties_table_options.py diff --git a/frogpilot/third_party/influxdb_client/domain/tag_rule.py b/starpilot/third_party/influxdb_client/domain/tag_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/tag_rule.py rename to starpilot/third_party/influxdb_client/domain/tag_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/task.py b/starpilot/third_party/influxdb_client/domain/task.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/task.py rename to starpilot/third_party/influxdb_client/domain/task.py diff --git a/frogpilot/third_party/influxdb_client/domain/task_create_request.py b/starpilot/third_party/influxdb_client/domain/task_create_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/task_create_request.py rename to starpilot/third_party/influxdb_client/domain/task_create_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/task_links.py b/starpilot/third_party/influxdb_client/domain/task_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/task_links.py rename to starpilot/third_party/influxdb_client/domain/task_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/task_status_type.py b/starpilot/third_party/influxdb_client/domain/task_status_type.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/task_status_type.py rename to starpilot/third_party/influxdb_client/domain/task_status_type.py diff --git a/frogpilot/third_party/influxdb_client/domain/task_update_request.py b/starpilot/third_party/influxdb_client/domain/task_update_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/task_update_request.py rename to starpilot/third_party/influxdb_client/domain/task_update_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/tasks.py b/starpilot/third_party/influxdb_client/domain/tasks.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/tasks.py rename to starpilot/third_party/influxdb_client/domain/tasks.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf.py b/starpilot/third_party/influxdb_client/domain/telegraf.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf.py rename to starpilot/third_party/influxdb_client/domain/telegraf.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin.py b/starpilot/third_party/influxdb_client/domain/telegraf_plugin.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf_plugin.py rename to starpilot/third_party/influxdb_client/domain/telegraf_plugin.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py b/starpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py rename to starpilot/third_party/influxdb_client/domain/telegraf_plugin_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py b/starpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py rename to starpilot/third_party/influxdb_client/domain/telegraf_plugin_request_plugins.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_plugins.py b/starpilot/third_party/influxdb_client/domain/telegraf_plugins.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf_plugins.py rename to starpilot/third_party/influxdb_client/domain/telegraf_plugins.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_request.py b/starpilot/third_party/influxdb_client/domain/telegraf_request.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf_request.py rename to starpilot/third_party/influxdb_client/domain/telegraf_request.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py b/starpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py rename to starpilot/third_party/influxdb_client/domain/telegraf_request_metadata.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegrafs.py b/starpilot/third_party/influxdb_client/domain/telegrafs.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegrafs.py rename to starpilot/third_party/influxdb_client/domain/telegrafs.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py b/starpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py rename to starpilot/third_party/influxdb_client/domain/telegram_notification_endpoint.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule.py b/starpilot/third_party/influxdb_client/domain/telegram_notification_rule.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegram_notification_rule.py rename to starpilot/third_party/influxdb_client/domain/telegram_notification_rule.py diff --git a/frogpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py b/starpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py rename to starpilot/third_party/influxdb_client/domain/telegram_notification_rule_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_apply.py b/starpilot/third_party/influxdb_client/domain/template_apply.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_apply.py rename to starpilot/third_party/influxdb_client/domain/template_apply.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_apply_remotes.py b/starpilot/third_party/influxdb_client/domain/template_apply_remotes.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_apply_remotes.py rename to starpilot/third_party/influxdb_client/domain/template_apply_remotes.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_apply_template.py b/starpilot/third_party/influxdb_client/domain/template_apply_template.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_apply_template.py rename to starpilot/third_party/influxdb_client/domain/template_apply_template.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_chart.py b/starpilot/third_party/influxdb_client/domain/template_chart.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_chart.py rename to starpilot/third_party/influxdb_client/domain/template_chart.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id.py b/starpilot/third_party/influxdb_client/domain/template_export_by_id.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_export_by_id.py rename to starpilot/third_party/influxdb_client/domain/template_export_by_id.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py b/starpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py rename to starpilot/third_party/influxdb_client/domain/template_export_by_id_org_ids.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py b/starpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py rename to starpilot/third_party/influxdb_client/domain/template_export_by_id_resource_filters.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py b/starpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py rename to starpilot/third_party/influxdb_client/domain/template_export_by_id_resources.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_name.py b/starpilot/third_party/influxdb_client/domain/template_export_by_name.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_export_by_name.py rename to starpilot/third_party/influxdb_client/domain/template_export_by_name.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py b/starpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py rename to starpilot/third_party/influxdb_client/domain/template_export_by_name_resources.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_kind.py b/starpilot/third_party/influxdb_client/domain/template_kind.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_kind.py rename to starpilot/third_party/influxdb_client/domain/template_kind.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary.py b/starpilot/third_party/influxdb_client/domain/template_summary.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary.py rename to starpilot/third_party/influxdb_client/domain/template_summary.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_buckets.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_buckets_new_old.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_checks.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_dashboards_new_old.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_label_mappings.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_labels.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_labels_new_old.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_notification_endpoints.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_notification_rules_new_old.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_tasks.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_tasks_new_old.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_telegraf_configs.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_variables.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py b/starpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py rename to starpilot/third_party/influxdb_client/domain/template_summary_diff_variables_new_old.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_errors.py b/starpilot/third_party/influxdb_client/domain/template_summary_errors.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_errors.py rename to starpilot/third_party/influxdb_client/domain/template_summary_errors.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_label.py b/starpilot/third_party/influxdb_client/domain/template_summary_label.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_label.py rename to starpilot/third_party/influxdb_client/domain/template_summary_label.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_label_properties.py b/starpilot/third_party/influxdb_client/domain/template_summary_label_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_label_properties.py rename to starpilot/third_party/influxdb_client/domain/template_summary_label_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_buckets.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_dashboards.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_label_mappings.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_notification_rules.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_status_rules.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_tag_rules.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_tasks.py diff --git a/frogpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py b/starpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py rename to starpilot/third_party/influxdb_client/domain/template_summary_summary_variables.py diff --git a/frogpilot/third_party/influxdb_client/domain/test_statement.py b/starpilot/third_party/influxdb_client/domain/test_statement.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/test_statement.py rename to starpilot/third_party/influxdb_client/domain/test_statement.py diff --git a/frogpilot/third_party/influxdb_client/domain/threshold.py b/starpilot/third_party/influxdb_client/domain/threshold.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/threshold.py rename to starpilot/third_party/influxdb_client/domain/threshold.py diff --git a/frogpilot/third_party/influxdb_client/domain/threshold_base.py b/starpilot/third_party/influxdb_client/domain/threshold_base.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/threshold_base.py rename to starpilot/third_party/influxdb_client/domain/threshold_base.py diff --git a/frogpilot/third_party/influxdb_client/domain/threshold_check.py b/starpilot/third_party/influxdb_client/domain/threshold_check.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/threshold_check.py rename to starpilot/third_party/influxdb_client/domain/threshold_check.py diff --git a/frogpilot/third_party/influxdb_client/domain/unary_expression.py b/starpilot/third_party/influxdb_client/domain/unary_expression.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/unary_expression.py rename to starpilot/third_party/influxdb_client/domain/unary_expression.py diff --git a/frogpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py b/starpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py rename to starpilot/third_party/influxdb_client/domain/unsigned_integer_literal.py diff --git a/frogpilot/third_party/influxdb_client/domain/user.py b/starpilot/third_party/influxdb_client/domain/user.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/user.py rename to starpilot/third_party/influxdb_client/domain/user.py diff --git a/frogpilot/third_party/influxdb_client/domain/user_response.py b/starpilot/third_party/influxdb_client/domain/user_response.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/user_response.py rename to starpilot/third_party/influxdb_client/domain/user_response.py diff --git a/frogpilot/third_party/influxdb_client/domain/user_response_links.py b/starpilot/third_party/influxdb_client/domain/user_response_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/user_response_links.py rename to starpilot/third_party/influxdb_client/domain/user_response_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/users.py b/starpilot/third_party/influxdb_client/domain/users.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/users.py rename to starpilot/third_party/influxdb_client/domain/users.py diff --git a/frogpilot/third_party/influxdb_client/domain/variable.py b/starpilot/third_party/influxdb_client/domain/variable.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/variable.py rename to starpilot/third_party/influxdb_client/domain/variable.py diff --git a/frogpilot/third_party/influxdb_client/domain/variable_assignment.py b/starpilot/third_party/influxdb_client/domain/variable_assignment.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/variable_assignment.py rename to starpilot/third_party/influxdb_client/domain/variable_assignment.py diff --git a/frogpilot/third_party/influxdb_client/domain/variable_links.py b/starpilot/third_party/influxdb_client/domain/variable_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/variable_links.py rename to starpilot/third_party/influxdb_client/domain/variable_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/variable_properties.py b/starpilot/third_party/influxdb_client/domain/variable_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/variable_properties.py rename to starpilot/third_party/influxdb_client/domain/variable_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/variables.py b/starpilot/third_party/influxdb_client/domain/variables.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/variables.py rename to starpilot/third_party/influxdb_client/domain/variables.py diff --git a/frogpilot/third_party/influxdb_client/domain/view.py b/starpilot/third_party/influxdb_client/domain/view.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/view.py rename to starpilot/third_party/influxdb_client/domain/view.py diff --git a/frogpilot/third_party/influxdb_client/domain/view_links.py b/starpilot/third_party/influxdb_client/domain/view_links.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/view_links.py rename to starpilot/third_party/influxdb_client/domain/view_links.py diff --git a/frogpilot/third_party/influxdb_client/domain/view_properties.py b/starpilot/third_party/influxdb_client/domain/view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/view_properties.py rename to starpilot/third_party/influxdb_client/domain/view_properties.py diff --git a/frogpilot/third_party/influxdb_client/domain/views.py b/starpilot/third_party/influxdb_client/domain/views.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/views.py rename to starpilot/third_party/influxdb_client/domain/views.py diff --git a/frogpilot/third_party/influxdb_client/domain/write_precision.py b/starpilot/third_party/influxdb_client/domain/write_precision.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/write_precision.py rename to starpilot/third_party/influxdb_client/domain/write_precision.py diff --git a/frogpilot/third_party/influxdb_client/domain/xy_geom.py b/starpilot/third_party/influxdb_client/domain/xy_geom.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/xy_geom.py rename to starpilot/third_party/influxdb_client/domain/xy_geom.py diff --git a/frogpilot/third_party/influxdb_client/domain/xy_view_properties.py b/starpilot/third_party/influxdb_client/domain/xy_view_properties.py similarity index 100% rename from frogpilot/third_party/influxdb_client/domain/xy_view_properties.py rename to starpilot/third_party/influxdb_client/domain/xy_view_properties.py diff --git a/frogpilot/third_party/influxdb_client/extras.py b/starpilot/third_party/influxdb_client/extras.py similarity index 100% rename from frogpilot/third_party/influxdb_client/extras.py rename to starpilot/third_party/influxdb_client/extras.py diff --git a/frogpilot/third_party/influxdb_client/py.typed b/starpilot/third_party/influxdb_client/py.typed similarity index 100% rename from frogpilot/third_party/influxdb_client/py.typed rename to starpilot/third_party/influxdb_client/py.typed diff --git a/frogpilot/third_party/influxdb_client/rest.py b/starpilot/third_party/influxdb_client/rest.py similarity index 100% rename from frogpilot/third_party/influxdb_client/rest.py rename to starpilot/third_party/influxdb_client/rest.py diff --git a/frogpilot/third_party/influxdb_client/service/__init__.py b/starpilot/third_party/influxdb_client/service/__init__.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/__init__.py rename to starpilot/third_party/influxdb_client/service/__init__.py diff --git a/frogpilot/third_party/influxdb_client/service/_base_service.py b/starpilot/third_party/influxdb_client/service/_base_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/_base_service.py rename to starpilot/third_party/influxdb_client/service/_base_service.py diff --git a/frogpilot/third_party/influxdb_client/service/authorizations_service.py b/starpilot/third_party/influxdb_client/service/authorizations_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/authorizations_service.py rename to starpilot/third_party/influxdb_client/service/authorizations_service.py diff --git a/frogpilot/third_party/influxdb_client/service/backup_service.py b/starpilot/third_party/influxdb_client/service/backup_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/backup_service.py rename to starpilot/third_party/influxdb_client/service/backup_service.py diff --git a/frogpilot/third_party/influxdb_client/service/bucket_schemas_service.py b/starpilot/third_party/influxdb_client/service/bucket_schemas_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/bucket_schemas_service.py rename to starpilot/third_party/influxdb_client/service/bucket_schemas_service.py diff --git a/frogpilot/third_party/influxdb_client/service/buckets_service.py b/starpilot/third_party/influxdb_client/service/buckets_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/buckets_service.py rename to starpilot/third_party/influxdb_client/service/buckets_service.py diff --git a/frogpilot/third_party/influxdb_client/service/cells_service.py b/starpilot/third_party/influxdb_client/service/cells_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/cells_service.py rename to starpilot/third_party/influxdb_client/service/cells_service.py diff --git a/frogpilot/third_party/influxdb_client/service/checks_service.py b/starpilot/third_party/influxdb_client/service/checks_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/checks_service.py rename to starpilot/third_party/influxdb_client/service/checks_service.py diff --git a/frogpilot/third_party/influxdb_client/service/config_service.py b/starpilot/third_party/influxdb_client/service/config_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/config_service.py rename to starpilot/third_party/influxdb_client/service/config_service.py diff --git a/frogpilot/third_party/influxdb_client/service/dashboards_service.py b/starpilot/third_party/influxdb_client/service/dashboards_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/dashboards_service.py rename to starpilot/third_party/influxdb_client/service/dashboards_service.py diff --git a/frogpilot/third_party/influxdb_client/service/dbr_ps_service.py b/starpilot/third_party/influxdb_client/service/dbr_ps_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/dbr_ps_service.py rename to starpilot/third_party/influxdb_client/service/dbr_ps_service.py diff --git a/frogpilot/third_party/influxdb_client/service/delete_service.py b/starpilot/third_party/influxdb_client/service/delete_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/delete_service.py rename to starpilot/third_party/influxdb_client/service/delete_service.py diff --git a/frogpilot/third_party/influxdb_client/service/health_service.py b/starpilot/third_party/influxdb_client/service/health_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/health_service.py rename to starpilot/third_party/influxdb_client/service/health_service.py diff --git a/frogpilot/third_party/influxdb_client/service/invokable_scripts_service.py b/starpilot/third_party/influxdb_client/service/invokable_scripts_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/invokable_scripts_service.py rename to starpilot/third_party/influxdb_client/service/invokable_scripts_service.py diff --git a/frogpilot/third_party/influxdb_client/service/labels_service.py b/starpilot/third_party/influxdb_client/service/labels_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/labels_service.py rename to starpilot/third_party/influxdb_client/service/labels_service.py diff --git a/frogpilot/third_party/influxdb_client/service/legacy_authorizations_service.py b/starpilot/third_party/influxdb_client/service/legacy_authorizations_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/legacy_authorizations_service.py rename to starpilot/third_party/influxdb_client/service/legacy_authorizations_service.py diff --git a/frogpilot/third_party/influxdb_client/service/metrics_service.py b/starpilot/third_party/influxdb_client/service/metrics_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/metrics_service.py rename to starpilot/third_party/influxdb_client/service/metrics_service.py diff --git a/frogpilot/third_party/influxdb_client/service/notification_endpoints_service.py b/starpilot/third_party/influxdb_client/service/notification_endpoints_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/notification_endpoints_service.py rename to starpilot/third_party/influxdb_client/service/notification_endpoints_service.py diff --git a/frogpilot/third_party/influxdb_client/service/notification_rules_service.py b/starpilot/third_party/influxdb_client/service/notification_rules_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/notification_rules_service.py rename to starpilot/third_party/influxdb_client/service/notification_rules_service.py diff --git a/frogpilot/third_party/influxdb_client/service/organizations_service.py b/starpilot/third_party/influxdb_client/service/organizations_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/organizations_service.py rename to starpilot/third_party/influxdb_client/service/organizations_service.py diff --git a/frogpilot/third_party/influxdb_client/service/ping_service.py b/starpilot/third_party/influxdb_client/service/ping_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/ping_service.py rename to starpilot/third_party/influxdb_client/service/ping_service.py diff --git a/frogpilot/third_party/influxdb_client/service/query_service.py b/starpilot/third_party/influxdb_client/service/query_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/query_service.py rename to starpilot/third_party/influxdb_client/service/query_service.py diff --git a/frogpilot/third_party/influxdb_client/service/ready_service.py b/starpilot/third_party/influxdb_client/service/ready_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/ready_service.py rename to starpilot/third_party/influxdb_client/service/ready_service.py diff --git a/frogpilot/third_party/influxdb_client/service/remote_connections_service.py b/starpilot/third_party/influxdb_client/service/remote_connections_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/remote_connections_service.py rename to starpilot/third_party/influxdb_client/service/remote_connections_service.py diff --git a/frogpilot/third_party/influxdb_client/service/replications_service.py b/starpilot/third_party/influxdb_client/service/replications_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/replications_service.py rename to starpilot/third_party/influxdb_client/service/replications_service.py diff --git a/frogpilot/third_party/influxdb_client/service/resources_service.py b/starpilot/third_party/influxdb_client/service/resources_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/resources_service.py rename to starpilot/third_party/influxdb_client/service/resources_service.py diff --git a/frogpilot/third_party/influxdb_client/service/restore_service.py b/starpilot/third_party/influxdb_client/service/restore_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/restore_service.py rename to starpilot/third_party/influxdb_client/service/restore_service.py diff --git a/frogpilot/third_party/influxdb_client/service/routes_service.py b/starpilot/third_party/influxdb_client/service/routes_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/routes_service.py rename to starpilot/third_party/influxdb_client/service/routes_service.py diff --git a/frogpilot/third_party/influxdb_client/service/rules_service.py b/starpilot/third_party/influxdb_client/service/rules_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/rules_service.py rename to starpilot/third_party/influxdb_client/service/rules_service.py diff --git a/frogpilot/third_party/influxdb_client/service/scraper_targets_service.py b/starpilot/third_party/influxdb_client/service/scraper_targets_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/scraper_targets_service.py rename to starpilot/third_party/influxdb_client/service/scraper_targets_service.py diff --git a/frogpilot/third_party/influxdb_client/service/secrets_service.py b/starpilot/third_party/influxdb_client/service/secrets_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/secrets_service.py rename to starpilot/third_party/influxdb_client/service/secrets_service.py diff --git a/frogpilot/third_party/influxdb_client/service/setup_service.py b/starpilot/third_party/influxdb_client/service/setup_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/setup_service.py rename to starpilot/third_party/influxdb_client/service/setup_service.py diff --git a/frogpilot/third_party/influxdb_client/service/signin_service.py b/starpilot/third_party/influxdb_client/service/signin_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/signin_service.py rename to starpilot/third_party/influxdb_client/service/signin_service.py diff --git a/frogpilot/third_party/influxdb_client/service/signout_service.py b/starpilot/third_party/influxdb_client/service/signout_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/signout_service.py rename to starpilot/third_party/influxdb_client/service/signout_service.py diff --git a/frogpilot/third_party/influxdb_client/service/sources_service.py b/starpilot/third_party/influxdb_client/service/sources_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/sources_service.py rename to starpilot/third_party/influxdb_client/service/sources_service.py diff --git a/frogpilot/third_party/influxdb_client/service/tasks_service.py b/starpilot/third_party/influxdb_client/service/tasks_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/tasks_service.py rename to starpilot/third_party/influxdb_client/service/tasks_service.py diff --git a/frogpilot/third_party/influxdb_client/service/telegraf_plugins_service.py b/starpilot/third_party/influxdb_client/service/telegraf_plugins_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/telegraf_plugins_service.py rename to starpilot/third_party/influxdb_client/service/telegraf_plugins_service.py diff --git a/frogpilot/third_party/influxdb_client/service/telegrafs_service.py b/starpilot/third_party/influxdb_client/service/telegrafs_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/telegrafs_service.py rename to starpilot/third_party/influxdb_client/service/telegrafs_service.py diff --git a/frogpilot/third_party/influxdb_client/service/templates_service.py b/starpilot/third_party/influxdb_client/service/templates_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/templates_service.py rename to starpilot/third_party/influxdb_client/service/templates_service.py diff --git a/frogpilot/third_party/influxdb_client/service/users_service.py b/starpilot/third_party/influxdb_client/service/users_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/users_service.py rename to starpilot/third_party/influxdb_client/service/users_service.py diff --git a/frogpilot/third_party/influxdb_client/service/variables_service.py b/starpilot/third_party/influxdb_client/service/variables_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/variables_service.py rename to starpilot/third_party/influxdb_client/service/variables_service.py diff --git a/frogpilot/third_party/influxdb_client/service/views_service.py b/starpilot/third_party/influxdb_client/service/views_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/views_service.py rename to starpilot/third_party/influxdb_client/service/views_service.py diff --git a/frogpilot/third_party/influxdb_client/service/write_service.py b/starpilot/third_party/influxdb_client/service/write_service.py similarity index 100% rename from frogpilot/third_party/influxdb_client/service/write_service.py rename to starpilot/third_party/influxdb_client/service/write_service.py diff --git a/frogpilot/third_party/influxdb_client/version.py b/starpilot/third_party/influxdb_client/version.py similarity index 100% rename from frogpilot/third_party/influxdb_client/version.py rename to starpilot/third_party/influxdb_client/version.py diff --git a/frogpilot/third_party/itsdangerous-2.2.0.dist-info/INSTALLER b/starpilot/third_party/itsdangerous-2.2.0.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/itsdangerous-2.2.0.dist-info/INSTALLER rename to starpilot/third_party/itsdangerous-2.2.0.dist-info/INSTALLER diff --git a/frogpilot/third_party/itsdangerous-2.2.0.dist-info/LICENSE.txt b/starpilot/third_party/itsdangerous-2.2.0.dist-info/LICENSE.txt similarity index 100% rename from frogpilot/third_party/itsdangerous-2.2.0.dist-info/LICENSE.txt rename to starpilot/third_party/itsdangerous-2.2.0.dist-info/LICENSE.txt diff --git a/frogpilot/third_party/itsdangerous-2.2.0.dist-info/METADATA b/starpilot/third_party/itsdangerous-2.2.0.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/itsdangerous-2.2.0.dist-info/METADATA rename to starpilot/third_party/itsdangerous-2.2.0.dist-info/METADATA diff --git a/frogpilot/third_party/itsdangerous-2.2.0.dist-info/RECORD b/starpilot/third_party/itsdangerous-2.2.0.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/itsdangerous-2.2.0.dist-info/RECORD rename to starpilot/third_party/itsdangerous-2.2.0.dist-info/RECORD diff --git a/frogpilot/third_party/itsdangerous-2.2.0.dist-info/REQUESTED b/starpilot/third_party/itsdangerous-2.2.0.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/itsdangerous-2.2.0.dist-info/REQUESTED rename to starpilot/third_party/itsdangerous-2.2.0.dist-info/REQUESTED diff --git a/frogpilot/third_party/itsdangerous-2.2.0.dist-info/WHEEL b/starpilot/third_party/itsdangerous-2.2.0.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/itsdangerous-2.2.0.dist-info/WHEEL rename to starpilot/third_party/itsdangerous-2.2.0.dist-info/WHEEL diff --git a/frogpilot/third_party/itsdangerous/__init__.py b/starpilot/third_party/itsdangerous/__init__.py similarity index 100% rename from frogpilot/third_party/itsdangerous/__init__.py rename to starpilot/third_party/itsdangerous/__init__.py diff --git a/frogpilot/third_party/itsdangerous/_json.py b/starpilot/third_party/itsdangerous/_json.py similarity index 100% rename from frogpilot/third_party/itsdangerous/_json.py rename to starpilot/third_party/itsdangerous/_json.py diff --git a/frogpilot/third_party/itsdangerous/encoding.py b/starpilot/third_party/itsdangerous/encoding.py similarity index 100% rename from frogpilot/third_party/itsdangerous/encoding.py rename to starpilot/third_party/itsdangerous/encoding.py diff --git a/frogpilot/third_party/itsdangerous/exc.py b/starpilot/third_party/itsdangerous/exc.py similarity index 100% rename from frogpilot/third_party/itsdangerous/exc.py rename to starpilot/third_party/itsdangerous/exc.py diff --git a/frogpilot/third_party/itsdangerous/py.typed b/starpilot/third_party/itsdangerous/py.typed similarity index 100% rename from frogpilot/third_party/itsdangerous/py.typed rename to starpilot/third_party/itsdangerous/py.typed diff --git a/frogpilot/third_party/itsdangerous/serializer.py b/starpilot/third_party/itsdangerous/serializer.py similarity index 100% rename from frogpilot/third_party/itsdangerous/serializer.py rename to starpilot/third_party/itsdangerous/serializer.py diff --git a/frogpilot/third_party/itsdangerous/signer.py b/starpilot/third_party/itsdangerous/signer.py similarity index 100% rename from frogpilot/third_party/itsdangerous/signer.py rename to starpilot/third_party/itsdangerous/signer.py diff --git a/frogpilot/third_party/itsdangerous/timed.py b/starpilot/third_party/itsdangerous/timed.py similarity index 100% rename from frogpilot/third_party/itsdangerous/timed.py rename to starpilot/third_party/itsdangerous/timed.py diff --git a/frogpilot/third_party/itsdangerous/url_safe.py b/starpilot/third_party/itsdangerous/url_safe.py similarity index 100% rename from frogpilot/third_party/itsdangerous/url_safe.py rename to starpilot/third_party/itsdangerous/url_safe.py diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/INSTALLER b/starpilot/third_party/jinja2-3.1.6.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/INSTALLER rename to starpilot/third_party/jinja2-3.1.6.dist-info/INSTALLER diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/METADATA b/starpilot/third_party/jinja2-3.1.6.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/METADATA rename to starpilot/third_party/jinja2-3.1.6.dist-info/METADATA diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/RECORD b/starpilot/third_party/jinja2-3.1.6.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/RECORD rename to starpilot/third_party/jinja2-3.1.6.dist-info/RECORD diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/REQUESTED b/starpilot/third_party/jinja2-3.1.6.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/REQUESTED rename to starpilot/third_party/jinja2-3.1.6.dist-info/REQUESTED diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/WHEEL b/starpilot/third_party/jinja2-3.1.6.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/WHEEL rename to starpilot/third_party/jinja2-3.1.6.dist-info/WHEEL diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/entry_points.txt b/starpilot/third_party/jinja2-3.1.6.dist-info/entry_points.txt similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/entry_points.txt rename to starpilot/third_party/jinja2-3.1.6.dist-info/entry_points.txt diff --git a/frogpilot/third_party/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/starpilot/third_party/jinja2-3.1.6.dist-info/licenses/LICENSE.txt similarity index 100% rename from frogpilot/third_party/jinja2-3.1.6.dist-info/licenses/LICENSE.txt rename to starpilot/third_party/jinja2-3.1.6.dist-info/licenses/LICENSE.txt diff --git a/frogpilot/third_party/jinja2/__init__.py b/starpilot/third_party/jinja2/__init__.py similarity index 100% rename from frogpilot/third_party/jinja2/__init__.py rename to starpilot/third_party/jinja2/__init__.py diff --git a/frogpilot/third_party/jinja2/_identifier.py b/starpilot/third_party/jinja2/_identifier.py similarity index 100% rename from frogpilot/third_party/jinja2/_identifier.py rename to starpilot/third_party/jinja2/_identifier.py diff --git a/frogpilot/third_party/jinja2/async_utils.py b/starpilot/third_party/jinja2/async_utils.py similarity index 100% rename from frogpilot/third_party/jinja2/async_utils.py rename to starpilot/third_party/jinja2/async_utils.py diff --git a/frogpilot/third_party/jinja2/bccache.py b/starpilot/third_party/jinja2/bccache.py similarity index 100% rename from frogpilot/third_party/jinja2/bccache.py rename to starpilot/third_party/jinja2/bccache.py diff --git a/frogpilot/third_party/jinja2/compiler.py b/starpilot/third_party/jinja2/compiler.py similarity index 100% rename from frogpilot/third_party/jinja2/compiler.py rename to starpilot/third_party/jinja2/compiler.py diff --git a/frogpilot/third_party/jinja2/constants.py b/starpilot/third_party/jinja2/constants.py similarity index 100% rename from frogpilot/third_party/jinja2/constants.py rename to starpilot/third_party/jinja2/constants.py diff --git a/frogpilot/third_party/jinja2/debug.py b/starpilot/third_party/jinja2/debug.py similarity index 100% rename from frogpilot/third_party/jinja2/debug.py rename to starpilot/third_party/jinja2/debug.py diff --git a/frogpilot/third_party/jinja2/defaults.py b/starpilot/third_party/jinja2/defaults.py similarity index 100% rename from frogpilot/third_party/jinja2/defaults.py rename to starpilot/third_party/jinja2/defaults.py diff --git a/frogpilot/third_party/jinja2/environment.py b/starpilot/third_party/jinja2/environment.py similarity index 100% rename from frogpilot/third_party/jinja2/environment.py rename to starpilot/third_party/jinja2/environment.py diff --git a/frogpilot/third_party/jinja2/exceptions.py b/starpilot/third_party/jinja2/exceptions.py similarity index 100% rename from frogpilot/third_party/jinja2/exceptions.py rename to starpilot/third_party/jinja2/exceptions.py diff --git a/frogpilot/third_party/jinja2/ext.py b/starpilot/third_party/jinja2/ext.py similarity index 100% rename from frogpilot/third_party/jinja2/ext.py rename to starpilot/third_party/jinja2/ext.py diff --git a/frogpilot/third_party/jinja2/filters.py b/starpilot/third_party/jinja2/filters.py similarity index 100% rename from frogpilot/third_party/jinja2/filters.py rename to starpilot/third_party/jinja2/filters.py diff --git a/frogpilot/third_party/jinja2/idtracking.py b/starpilot/third_party/jinja2/idtracking.py similarity index 100% rename from frogpilot/third_party/jinja2/idtracking.py rename to starpilot/third_party/jinja2/idtracking.py diff --git a/frogpilot/third_party/jinja2/lexer.py b/starpilot/third_party/jinja2/lexer.py similarity index 100% rename from frogpilot/third_party/jinja2/lexer.py rename to starpilot/third_party/jinja2/lexer.py diff --git a/frogpilot/third_party/jinja2/loaders.py b/starpilot/third_party/jinja2/loaders.py similarity index 100% rename from frogpilot/third_party/jinja2/loaders.py rename to starpilot/third_party/jinja2/loaders.py diff --git a/frogpilot/third_party/jinja2/meta.py b/starpilot/third_party/jinja2/meta.py similarity index 100% rename from frogpilot/third_party/jinja2/meta.py rename to starpilot/third_party/jinja2/meta.py diff --git a/frogpilot/third_party/jinja2/nativetypes.py b/starpilot/third_party/jinja2/nativetypes.py similarity index 100% rename from frogpilot/third_party/jinja2/nativetypes.py rename to starpilot/third_party/jinja2/nativetypes.py diff --git a/frogpilot/third_party/jinja2/nodes.py b/starpilot/third_party/jinja2/nodes.py similarity index 100% rename from frogpilot/third_party/jinja2/nodes.py rename to starpilot/third_party/jinja2/nodes.py diff --git a/frogpilot/third_party/jinja2/optimizer.py b/starpilot/third_party/jinja2/optimizer.py similarity index 100% rename from frogpilot/third_party/jinja2/optimizer.py rename to starpilot/third_party/jinja2/optimizer.py diff --git a/frogpilot/third_party/jinja2/parser.py b/starpilot/third_party/jinja2/parser.py similarity index 100% rename from frogpilot/third_party/jinja2/parser.py rename to starpilot/third_party/jinja2/parser.py diff --git a/frogpilot/third_party/jinja2/py.typed b/starpilot/third_party/jinja2/py.typed similarity index 100% rename from frogpilot/third_party/jinja2/py.typed rename to starpilot/third_party/jinja2/py.typed diff --git a/frogpilot/third_party/jinja2/runtime.py b/starpilot/third_party/jinja2/runtime.py similarity index 100% rename from frogpilot/third_party/jinja2/runtime.py rename to starpilot/third_party/jinja2/runtime.py diff --git a/frogpilot/third_party/jinja2/sandbox.py b/starpilot/third_party/jinja2/sandbox.py similarity index 100% rename from frogpilot/third_party/jinja2/sandbox.py rename to starpilot/third_party/jinja2/sandbox.py diff --git a/frogpilot/third_party/jinja2/tests.py b/starpilot/third_party/jinja2/tests.py similarity index 100% rename from frogpilot/third_party/jinja2/tests.py rename to starpilot/third_party/jinja2/tests.py diff --git a/frogpilot/third_party/jinja2/utils.py b/starpilot/third_party/jinja2/utils.py similarity index 100% rename from frogpilot/third_party/jinja2/utils.py rename to starpilot/third_party/jinja2/utils.py diff --git a/frogpilot/third_party/jinja2/visitor.py b/starpilot/third_party/jinja2/visitor.py similarity index 100% rename from frogpilot/third_party/jinja2/visitor.py rename to starpilot/third_party/jinja2/visitor.py diff --git a/frogpilot/third_party/kaitaistruct.py b/starpilot/third_party/kaitaistruct.py similarity index 100% rename from frogpilot/third_party/kaitaistruct.py rename to starpilot/third_party/kaitaistruct.py diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/INSTALLER b/starpilot/third_party/markupsafe-3.0.3.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/INSTALLER rename to starpilot/third_party/markupsafe-3.0.3.dist-info/INSTALLER diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/METADATA b/starpilot/third_party/markupsafe-3.0.3.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/METADATA rename to starpilot/third_party/markupsafe-3.0.3.dist-info/METADATA diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/RECORD b/starpilot/third_party/markupsafe-3.0.3.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/RECORD rename to starpilot/third_party/markupsafe-3.0.3.dist-info/RECORD diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/REQUESTED b/starpilot/third_party/markupsafe-3.0.3.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/REQUESTED rename to starpilot/third_party/markupsafe-3.0.3.dist-info/REQUESTED diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/WHEEL b/starpilot/third_party/markupsafe-3.0.3.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/WHEEL rename to starpilot/third_party/markupsafe-3.0.3.dist-info/WHEEL diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt b/starpilot/third_party/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt rename to starpilot/third_party/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt diff --git a/frogpilot/third_party/markupsafe-3.0.3.dist-info/top_level.txt b/starpilot/third_party/markupsafe-3.0.3.dist-info/top_level.txt similarity index 100% rename from frogpilot/third_party/markupsafe-3.0.3.dist-info/top_level.txt rename to starpilot/third_party/markupsafe-3.0.3.dist-info/top_level.txt diff --git a/frogpilot/third_party/markupsafe/__init__.py b/starpilot/third_party/markupsafe/__init__.py similarity index 100% rename from frogpilot/third_party/markupsafe/__init__.py rename to starpilot/third_party/markupsafe/__init__.py diff --git a/frogpilot/third_party/markupsafe/_native.py b/starpilot/third_party/markupsafe/_native.py similarity index 100% rename from frogpilot/third_party/markupsafe/_native.py rename to starpilot/third_party/markupsafe/_native.py diff --git a/frogpilot/third_party/markupsafe/_speedups.c b/starpilot/third_party/markupsafe/_speedups.c similarity index 100% rename from frogpilot/third_party/markupsafe/_speedups.c rename to starpilot/third_party/markupsafe/_speedups.c diff --git a/frogpilot/third_party/markupsafe/_speedups.pyi b/starpilot/third_party/markupsafe/_speedups.pyi similarity index 100% rename from frogpilot/third_party/markupsafe/_speedups.pyi rename to starpilot/third_party/markupsafe/_speedups.pyi diff --git a/frogpilot/third_party/markupsafe/py.typed b/starpilot/third_party/markupsafe/py.typed similarity index 100% rename from frogpilot/third_party/markupsafe/py.typed rename to starpilot/third_party/markupsafe/py.typed diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/AUTHORS b/starpilot/third_party/pydub-0.25.1.dist-info/AUTHORS similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/AUTHORS rename to starpilot/third_party/pydub-0.25.1.dist-info/AUTHORS diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/INSTALLER b/starpilot/third_party/pydub-0.25.1.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/INSTALLER rename to starpilot/third_party/pydub-0.25.1.dist-info/INSTALLER diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/LICENSE b/starpilot/third_party/pydub-0.25.1.dist-info/LICENSE similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/LICENSE rename to starpilot/third_party/pydub-0.25.1.dist-info/LICENSE diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/METADATA b/starpilot/third_party/pydub-0.25.1.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/METADATA rename to starpilot/third_party/pydub-0.25.1.dist-info/METADATA diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/RECORD b/starpilot/third_party/pydub-0.25.1.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/RECORD rename to starpilot/third_party/pydub-0.25.1.dist-info/RECORD diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/REQUESTED b/starpilot/third_party/pydub-0.25.1.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/REQUESTED rename to starpilot/third_party/pydub-0.25.1.dist-info/REQUESTED diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/WHEEL b/starpilot/third_party/pydub-0.25.1.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/WHEEL rename to starpilot/third_party/pydub-0.25.1.dist-info/WHEEL diff --git a/frogpilot/third_party/pydub-0.25.1.dist-info/top_level.txt b/starpilot/third_party/pydub-0.25.1.dist-info/top_level.txt similarity index 100% rename from frogpilot/third_party/pydub-0.25.1.dist-info/top_level.txt rename to starpilot/third_party/pydub-0.25.1.dist-info/top_level.txt diff --git a/frogpilot/third_party/pydub/__init__.py b/starpilot/third_party/pydub/__init__.py similarity index 100% rename from frogpilot/third_party/pydub/__init__.py rename to starpilot/third_party/pydub/__init__.py diff --git a/frogpilot/third_party/pydub/audio_segment.py b/starpilot/third_party/pydub/audio_segment.py similarity index 100% rename from frogpilot/third_party/pydub/audio_segment.py rename to starpilot/third_party/pydub/audio_segment.py diff --git a/frogpilot/third_party/pydub/effects.py b/starpilot/third_party/pydub/effects.py similarity index 100% rename from frogpilot/third_party/pydub/effects.py rename to starpilot/third_party/pydub/effects.py diff --git a/frogpilot/third_party/pydub/exceptions.py b/starpilot/third_party/pydub/exceptions.py similarity index 100% rename from frogpilot/third_party/pydub/exceptions.py rename to starpilot/third_party/pydub/exceptions.py diff --git a/frogpilot/third_party/pydub/generators.py b/starpilot/third_party/pydub/generators.py similarity index 100% rename from frogpilot/third_party/pydub/generators.py rename to starpilot/third_party/pydub/generators.py diff --git a/frogpilot/third_party/pydub/logging_utils.py b/starpilot/third_party/pydub/logging_utils.py similarity index 100% rename from frogpilot/third_party/pydub/logging_utils.py rename to starpilot/third_party/pydub/logging_utils.py diff --git a/frogpilot/third_party/pydub/playback.py b/starpilot/third_party/pydub/playback.py similarity index 100% rename from frogpilot/third_party/pydub/playback.py rename to starpilot/third_party/pydub/playback.py diff --git a/frogpilot/third_party/pydub/pyaudioop.py b/starpilot/third_party/pydub/pyaudioop.py similarity index 100% rename from frogpilot/third_party/pydub/pyaudioop.py rename to starpilot/third_party/pydub/pyaudioop.py diff --git a/frogpilot/third_party/pydub/scipy_effects.py b/starpilot/third_party/pydub/scipy_effects.py similarity index 100% rename from frogpilot/third_party/pydub/scipy_effects.py rename to starpilot/third_party/pydub/scipy_effects.py diff --git a/frogpilot/third_party/pydub/silence.py b/starpilot/third_party/pydub/silence.py similarity index 100% rename from frogpilot/third_party/pydub/silence.py rename to starpilot/third_party/pydub/silence.py diff --git a/frogpilot/third_party/pydub/utils.py b/starpilot/third_party/pydub/utils.py similarity index 100% rename from frogpilot/third_party/pydub/utils.py rename to starpilot/third_party/pydub/utils.py diff --git a/frogpilot/third_party/reactivex/__init__.py b/starpilot/third_party/reactivex/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/__init__.py rename to starpilot/third_party/reactivex/__init__.py diff --git a/frogpilot/third_party/reactivex/_version.py b/starpilot/third_party/reactivex/_version.py similarity index 100% rename from frogpilot/third_party/reactivex/_version.py rename to starpilot/third_party/reactivex/_version.py diff --git a/frogpilot/third_party/reactivex/abc/__init__.py b/starpilot/third_party/reactivex/abc/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/__init__.py rename to starpilot/third_party/reactivex/abc/__init__.py diff --git a/frogpilot/third_party/reactivex/abc/disposable.py b/starpilot/third_party/reactivex/abc/disposable.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/disposable.py rename to starpilot/third_party/reactivex/abc/disposable.py diff --git a/frogpilot/third_party/reactivex/abc/observable.py b/starpilot/third_party/reactivex/abc/observable.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/observable.py rename to starpilot/third_party/reactivex/abc/observable.py diff --git a/frogpilot/third_party/reactivex/abc/observer.py b/starpilot/third_party/reactivex/abc/observer.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/observer.py rename to starpilot/third_party/reactivex/abc/observer.py diff --git a/frogpilot/third_party/reactivex/abc/periodicscheduler.py b/starpilot/third_party/reactivex/abc/periodicscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/periodicscheduler.py rename to starpilot/third_party/reactivex/abc/periodicscheduler.py diff --git a/frogpilot/third_party/reactivex/abc/scheduler.py b/starpilot/third_party/reactivex/abc/scheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/scheduler.py rename to starpilot/third_party/reactivex/abc/scheduler.py diff --git a/frogpilot/third_party/reactivex/abc/startable.py b/starpilot/third_party/reactivex/abc/startable.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/startable.py rename to starpilot/third_party/reactivex/abc/startable.py diff --git a/frogpilot/third_party/reactivex/abc/subject.py b/starpilot/third_party/reactivex/abc/subject.py similarity index 100% rename from frogpilot/third_party/reactivex/abc/subject.py rename to starpilot/third_party/reactivex/abc/subject.py diff --git a/frogpilot/third_party/reactivex/disposable/__init__.py b/starpilot/third_party/reactivex/disposable/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/__init__.py rename to starpilot/third_party/reactivex/disposable/__init__.py diff --git a/frogpilot/third_party/reactivex/disposable/booleandisposable.py b/starpilot/third_party/reactivex/disposable/booleandisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/booleandisposable.py rename to starpilot/third_party/reactivex/disposable/booleandisposable.py diff --git a/frogpilot/third_party/reactivex/disposable/compositedisposable.py b/starpilot/third_party/reactivex/disposable/compositedisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/compositedisposable.py rename to starpilot/third_party/reactivex/disposable/compositedisposable.py diff --git a/frogpilot/third_party/reactivex/disposable/disposable.py b/starpilot/third_party/reactivex/disposable/disposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/disposable.py rename to starpilot/third_party/reactivex/disposable/disposable.py diff --git a/frogpilot/third_party/reactivex/disposable/multipleassignmentdisposable.py b/starpilot/third_party/reactivex/disposable/multipleassignmentdisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/multipleassignmentdisposable.py rename to starpilot/third_party/reactivex/disposable/multipleassignmentdisposable.py diff --git a/frogpilot/third_party/reactivex/disposable/refcountdisposable.py b/starpilot/third_party/reactivex/disposable/refcountdisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/refcountdisposable.py rename to starpilot/third_party/reactivex/disposable/refcountdisposable.py diff --git a/frogpilot/third_party/reactivex/disposable/scheduleddisposable.py b/starpilot/third_party/reactivex/disposable/scheduleddisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/scheduleddisposable.py rename to starpilot/third_party/reactivex/disposable/scheduleddisposable.py diff --git a/frogpilot/third_party/reactivex/disposable/serialdisposable.py b/starpilot/third_party/reactivex/disposable/serialdisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/serialdisposable.py rename to starpilot/third_party/reactivex/disposable/serialdisposable.py diff --git a/frogpilot/third_party/reactivex/disposable/singleassignmentdisposable.py b/starpilot/third_party/reactivex/disposable/singleassignmentdisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/disposable/singleassignmentdisposable.py rename to starpilot/third_party/reactivex/disposable/singleassignmentdisposable.py diff --git a/frogpilot/third_party/reactivex/internal/__init__.py b/starpilot/third_party/reactivex/internal/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/__init__.py rename to starpilot/third_party/reactivex/internal/__init__.py diff --git a/frogpilot/third_party/reactivex/internal/basic.py b/starpilot/third_party/reactivex/internal/basic.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/basic.py rename to starpilot/third_party/reactivex/internal/basic.py diff --git a/frogpilot/third_party/reactivex/internal/concurrency.py b/starpilot/third_party/reactivex/internal/concurrency.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/concurrency.py rename to starpilot/third_party/reactivex/internal/concurrency.py diff --git a/frogpilot/third_party/reactivex/internal/constants.py b/starpilot/third_party/reactivex/internal/constants.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/constants.py rename to starpilot/third_party/reactivex/internal/constants.py diff --git a/frogpilot/third_party/reactivex/internal/exceptions.py b/starpilot/third_party/reactivex/internal/exceptions.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/exceptions.py rename to starpilot/third_party/reactivex/internal/exceptions.py diff --git a/frogpilot/third_party/reactivex/internal/priorityqueue.py b/starpilot/third_party/reactivex/internal/priorityqueue.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/priorityqueue.py rename to starpilot/third_party/reactivex/internal/priorityqueue.py diff --git a/frogpilot/third_party/reactivex/internal/utils.py b/starpilot/third_party/reactivex/internal/utils.py similarity index 100% rename from frogpilot/third_party/reactivex/internal/utils.py rename to starpilot/third_party/reactivex/internal/utils.py diff --git a/frogpilot/third_party/reactivex/notification.py b/starpilot/third_party/reactivex/notification.py similarity index 100% rename from frogpilot/third_party/reactivex/notification.py rename to starpilot/third_party/reactivex/notification.py diff --git a/frogpilot/third_party/reactivex/observable/__init__.py b/starpilot/third_party/reactivex/observable/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/__init__.py rename to starpilot/third_party/reactivex/observable/__init__.py diff --git a/frogpilot/third_party/reactivex/observable/amb.py b/starpilot/third_party/reactivex/observable/amb.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/amb.py rename to starpilot/third_party/reactivex/observable/amb.py diff --git a/frogpilot/third_party/reactivex/observable/case.py b/starpilot/third_party/reactivex/observable/case.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/case.py rename to starpilot/third_party/reactivex/observable/case.py diff --git a/frogpilot/third_party/reactivex/observable/catch.py b/starpilot/third_party/reactivex/observable/catch.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/catch.py rename to starpilot/third_party/reactivex/observable/catch.py diff --git a/frogpilot/third_party/reactivex/observable/combinelatest.py b/starpilot/third_party/reactivex/observable/combinelatest.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/combinelatest.py rename to starpilot/third_party/reactivex/observable/combinelatest.py diff --git a/frogpilot/third_party/reactivex/observable/concat.py b/starpilot/third_party/reactivex/observable/concat.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/concat.py rename to starpilot/third_party/reactivex/observable/concat.py diff --git a/frogpilot/third_party/reactivex/observable/connectableobservable.py b/starpilot/third_party/reactivex/observable/connectableobservable.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/connectableobservable.py rename to starpilot/third_party/reactivex/observable/connectableobservable.py diff --git a/frogpilot/third_party/reactivex/observable/defer.py b/starpilot/third_party/reactivex/observable/defer.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/defer.py rename to starpilot/third_party/reactivex/observable/defer.py diff --git a/frogpilot/third_party/reactivex/observable/empty.py b/starpilot/third_party/reactivex/observable/empty.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/empty.py rename to starpilot/third_party/reactivex/observable/empty.py diff --git a/frogpilot/third_party/reactivex/observable/forkjoin.py b/starpilot/third_party/reactivex/observable/forkjoin.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/forkjoin.py rename to starpilot/third_party/reactivex/observable/forkjoin.py diff --git a/frogpilot/third_party/reactivex/observable/fromcallback.py b/starpilot/third_party/reactivex/observable/fromcallback.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/fromcallback.py rename to starpilot/third_party/reactivex/observable/fromcallback.py diff --git a/frogpilot/third_party/reactivex/observable/fromfuture.py b/starpilot/third_party/reactivex/observable/fromfuture.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/fromfuture.py rename to starpilot/third_party/reactivex/observable/fromfuture.py diff --git a/frogpilot/third_party/reactivex/observable/fromiterable.py b/starpilot/third_party/reactivex/observable/fromiterable.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/fromiterable.py rename to starpilot/third_party/reactivex/observable/fromiterable.py diff --git a/frogpilot/third_party/reactivex/observable/generate.py b/starpilot/third_party/reactivex/observable/generate.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/generate.py rename to starpilot/third_party/reactivex/observable/generate.py diff --git a/frogpilot/third_party/reactivex/observable/generatewithrelativetime.py b/starpilot/third_party/reactivex/observable/generatewithrelativetime.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/generatewithrelativetime.py rename to starpilot/third_party/reactivex/observable/generatewithrelativetime.py diff --git a/frogpilot/third_party/reactivex/observable/groupedobservable.py b/starpilot/third_party/reactivex/observable/groupedobservable.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/groupedobservable.py rename to starpilot/third_party/reactivex/observable/groupedobservable.py diff --git a/frogpilot/third_party/reactivex/observable/ifthen.py b/starpilot/third_party/reactivex/observable/ifthen.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/ifthen.py rename to starpilot/third_party/reactivex/observable/ifthen.py diff --git a/frogpilot/third_party/reactivex/observable/interval.py b/starpilot/third_party/reactivex/observable/interval.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/interval.py rename to starpilot/third_party/reactivex/observable/interval.py diff --git a/frogpilot/third_party/reactivex/observable/marbles.py b/starpilot/third_party/reactivex/observable/marbles.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/marbles.py rename to starpilot/third_party/reactivex/observable/marbles.py diff --git a/frogpilot/third_party/reactivex/observable/merge.py b/starpilot/third_party/reactivex/observable/merge.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/merge.py rename to starpilot/third_party/reactivex/observable/merge.py diff --git a/frogpilot/third_party/reactivex/observable/never.py b/starpilot/third_party/reactivex/observable/never.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/never.py rename to starpilot/third_party/reactivex/observable/never.py diff --git a/frogpilot/third_party/reactivex/observable/observable.py b/starpilot/third_party/reactivex/observable/observable.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/observable.py rename to starpilot/third_party/reactivex/observable/observable.py diff --git a/frogpilot/third_party/reactivex/observable/onerrorresumenext.py b/starpilot/third_party/reactivex/observable/onerrorresumenext.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/onerrorresumenext.py rename to starpilot/third_party/reactivex/observable/onerrorresumenext.py diff --git a/frogpilot/third_party/reactivex/observable/range.py b/starpilot/third_party/reactivex/observable/range.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/range.py rename to starpilot/third_party/reactivex/observable/range.py diff --git a/frogpilot/third_party/reactivex/observable/repeat.py b/starpilot/third_party/reactivex/observable/repeat.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/repeat.py rename to starpilot/third_party/reactivex/observable/repeat.py diff --git a/frogpilot/third_party/reactivex/observable/returnvalue.py b/starpilot/third_party/reactivex/observable/returnvalue.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/returnvalue.py rename to starpilot/third_party/reactivex/observable/returnvalue.py diff --git a/frogpilot/third_party/reactivex/observable/start.py b/starpilot/third_party/reactivex/observable/start.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/start.py rename to starpilot/third_party/reactivex/observable/start.py diff --git a/frogpilot/third_party/reactivex/observable/startasync.py b/starpilot/third_party/reactivex/observable/startasync.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/startasync.py rename to starpilot/third_party/reactivex/observable/startasync.py diff --git a/frogpilot/third_party/reactivex/observable/throw.py b/starpilot/third_party/reactivex/observable/throw.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/throw.py rename to starpilot/third_party/reactivex/observable/throw.py diff --git a/frogpilot/third_party/reactivex/observable/timer.py b/starpilot/third_party/reactivex/observable/timer.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/timer.py rename to starpilot/third_party/reactivex/observable/timer.py diff --git a/frogpilot/third_party/reactivex/observable/toasync.py b/starpilot/third_party/reactivex/observable/toasync.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/toasync.py rename to starpilot/third_party/reactivex/observable/toasync.py diff --git a/frogpilot/third_party/reactivex/observable/using.py b/starpilot/third_party/reactivex/observable/using.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/using.py rename to starpilot/third_party/reactivex/observable/using.py diff --git a/frogpilot/third_party/reactivex/observable/withlatestfrom.py b/starpilot/third_party/reactivex/observable/withlatestfrom.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/withlatestfrom.py rename to starpilot/third_party/reactivex/observable/withlatestfrom.py diff --git a/frogpilot/third_party/reactivex/observable/zip.py b/starpilot/third_party/reactivex/observable/zip.py similarity index 100% rename from frogpilot/third_party/reactivex/observable/zip.py rename to starpilot/third_party/reactivex/observable/zip.py diff --git a/frogpilot/third_party/reactivex/observer/__init__.py b/starpilot/third_party/reactivex/observer/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/observer/__init__.py rename to starpilot/third_party/reactivex/observer/__init__.py diff --git a/frogpilot/third_party/reactivex/observer/autodetachobserver.py b/starpilot/third_party/reactivex/observer/autodetachobserver.py similarity index 100% rename from frogpilot/third_party/reactivex/observer/autodetachobserver.py rename to starpilot/third_party/reactivex/observer/autodetachobserver.py diff --git a/frogpilot/third_party/reactivex/observer/observeonobserver.py b/starpilot/third_party/reactivex/observer/observeonobserver.py similarity index 100% rename from frogpilot/third_party/reactivex/observer/observeonobserver.py rename to starpilot/third_party/reactivex/observer/observeonobserver.py diff --git a/frogpilot/third_party/reactivex/observer/observer.py b/starpilot/third_party/reactivex/observer/observer.py similarity index 100% rename from frogpilot/third_party/reactivex/observer/observer.py rename to starpilot/third_party/reactivex/observer/observer.py diff --git a/frogpilot/third_party/reactivex/observer/scheduledobserver.py b/starpilot/third_party/reactivex/observer/scheduledobserver.py similarity index 100% rename from frogpilot/third_party/reactivex/observer/scheduledobserver.py rename to starpilot/third_party/reactivex/observer/scheduledobserver.py diff --git a/frogpilot/third_party/reactivex/operators/__init__.py b/starpilot/third_party/reactivex/operators/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/__init__.py rename to starpilot/third_party/reactivex/operators/__init__.py diff --git a/frogpilot/third_party/reactivex/operators/_all.py b/starpilot/third_party/reactivex/operators/_all.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_all.py rename to starpilot/third_party/reactivex/operators/_all.py diff --git a/frogpilot/third_party/reactivex/operators/_amb.py b/starpilot/third_party/reactivex/operators/_amb.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_amb.py rename to starpilot/third_party/reactivex/operators/_amb.py diff --git a/frogpilot/third_party/reactivex/operators/_asobservable.py b/starpilot/third_party/reactivex/operators/_asobservable.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_asobservable.py rename to starpilot/third_party/reactivex/operators/_asobservable.py diff --git a/frogpilot/third_party/reactivex/operators/_average.py b/starpilot/third_party/reactivex/operators/_average.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_average.py rename to starpilot/third_party/reactivex/operators/_average.py diff --git a/frogpilot/third_party/reactivex/operators/_buffer.py b/starpilot/third_party/reactivex/operators/_buffer.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_buffer.py rename to starpilot/third_party/reactivex/operators/_buffer.py diff --git a/frogpilot/third_party/reactivex/operators/_bufferwithtime.py b/starpilot/third_party/reactivex/operators/_bufferwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_bufferwithtime.py rename to starpilot/third_party/reactivex/operators/_bufferwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_bufferwithtimeorcount.py b/starpilot/third_party/reactivex/operators/_bufferwithtimeorcount.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_bufferwithtimeorcount.py rename to starpilot/third_party/reactivex/operators/_bufferwithtimeorcount.py diff --git a/frogpilot/third_party/reactivex/operators/_catch.py b/starpilot/third_party/reactivex/operators/_catch.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_catch.py rename to starpilot/third_party/reactivex/operators/_catch.py diff --git a/frogpilot/third_party/reactivex/operators/_combinelatest.py b/starpilot/third_party/reactivex/operators/_combinelatest.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_combinelatest.py rename to starpilot/third_party/reactivex/operators/_combinelatest.py diff --git a/frogpilot/third_party/reactivex/operators/_concat.py b/starpilot/third_party/reactivex/operators/_concat.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_concat.py rename to starpilot/third_party/reactivex/operators/_concat.py diff --git a/frogpilot/third_party/reactivex/operators/_contains.py b/starpilot/third_party/reactivex/operators/_contains.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_contains.py rename to starpilot/third_party/reactivex/operators/_contains.py diff --git a/frogpilot/third_party/reactivex/operators/_count.py b/starpilot/third_party/reactivex/operators/_count.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_count.py rename to starpilot/third_party/reactivex/operators/_count.py diff --git a/frogpilot/third_party/reactivex/operators/_debounce.py b/starpilot/third_party/reactivex/operators/_debounce.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_debounce.py rename to starpilot/third_party/reactivex/operators/_debounce.py diff --git a/frogpilot/third_party/reactivex/operators/_defaultifempty.py b/starpilot/third_party/reactivex/operators/_defaultifempty.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_defaultifempty.py rename to starpilot/third_party/reactivex/operators/_defaultifempty.py diff --git a/frogpilot/third_party/reactivex/operators/_delay.py b/starpilot/third_party/reactivex/operators/_delay.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_delay.py rename to starpilot/third_party/reactivex/operators/_delay.py diff --git a/frogpilot/third_party/reactivex/operators/_delaysubscription.py b/starpilot/third_party/reactivex/operators/_delaysubscription.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_delaysubscription.py rename to starpilot/third_party/reactivex/operators/_delaysubscription.py diff --git a/frogpilot/third_party/reactivex/operators/_delaywithmapper.py b/starpilot/third_party/reactivex/operators/_delaywithmapper.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_delaywithmapper.py rename to starpilot/third_party/reactivex/operators/_delaywithmapper.py diff --git a/frogpilot/third_party/reactivex/operators/_dematerialize.py b/starpilot/third_party/reactivex/operators/_dematerialize.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_dematerialize.py rename to starpilot/third_party/reactivex/operators/_dematerialize.py diff --git a/frogpilot/third_party/reactivex/operators/_distinct.py b/starpilot/third_party/reactivex/operators/_distinct.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_distinct.py rename to starpilot/third_party/reactivex/operators/_distinct.py diff --git a/frogpilot/third_party/reactivex/operators/_distinctuntilchanged.py b/starpilot/third_party/reactivex/operators/_distinctuntilchanged.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_distinctuntilchanged.py rename to starpilot/third_party/reactivex/operators/_distinctuntilchanged.py diff --git a/frogpilot/third_party/reactivex/operators/_do.py b/starpilot/third_party/reactivex/operators/_do.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_do.py rename to starpilot/third_party/reactivex/operators/_do.py diff --git a/frogpilot/third_party/reactivex/operators/_dowhile.py b/starpilot/third_party/reactivex/operators/_dowhile.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_dowhile.py rename to starpilot/third_party/reactivex/operators/_dowhile.py diff --git a/frogpilot/third_party/reactivex/operators/_elementatordefault.py b/starpilot/third_party/reactivex/operators/_elementatordefault.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_elementatordefault.py rename to starpilot/third_party/reactivex/operators/_elementatordefault.py diff --git a/frogpilot/third_party/reactivex/operators/_exclusive.py b/starpilot/third_party/reactivex/operators/_exclusive.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_exclusive.py rename to starpilot/third_party/reactivex/operators/_exclusive.py diff --git a/frogpilot/third_party/reactivex/operators/_expand.py b/starpilot/third_party/reactivex/operators/_expand.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_expand.py rename to starpilot/third_party/reactivex/operators/_expand.py diff --git a/frogpilot/third_party/reactivex/operators/_filter.py b/starpilot/third_party/reactivex/operators/_filter.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_filter.py rename to starpilot/third_party/reactivex/operators/_filter.py diff --git a/frogpilot/third_party/reactivex/operators/_finallyaction.py b/starpilot/third_party/reactivex/operators/_finallyaction.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_finallyaction.py rename to starpilot/third_party/reactivex/operators/_finallyaction.py diff --git a/frogpilot/third_party/reactivex/operators/_find.py b/starpilot/third_party/reactivex/operators/_find.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_find.py rename to starpilot/third_party/reactivex/operators/_find.py diff --git a/frogpilot/third_party/reactivex/operators/_first.py b/starpilot/third_party/reactivex/operators/_first.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_first.py rename to starpilot/third_party/reactivex/operators/_first.py diff --git a/frogpilot/third_party/reactivex/operators/_firstordefault.py b/starpilot/third_party/reactivex/operators/_firstordefault.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_firstordefault.py rename to starpilot/third_party/reactivex/operators/_firstordefault.py diff --git a/frogpilot/third_party/reactivex/operators/_flatmap.py b/starpilot/third_party/reactivex/operators/_flatmap.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_flatmap.py rename to starpilot/third_party/reactivex/operators/_flatmap.py diff --git a/frogpilot/third_party/reactivex/operators/_forkjoin.py b/starpilot/third_party/reactivex/operators/_forkjoin.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_forkjoin.py rename to starpilot/third_party/reactivex/operators/_forkjoin.py diff --git a/frogpilot/third_party/reactivex/operators/_groupby.py b/starpilot/third_party/reactivex/operators/_groupby.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_groupby.py rename to starpilot/third_party/reactivex/operators/_groupby.py diff --git a/frogpilot/third_party/reactivex/operators/_groupbyuntil.py b/starpilot/third_party/reactivex/operators/_groupbyuntil.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_groupbyuntil.py rename to starpilot/third_party/reactivex/operators/_groupbyuntil.py diff --git a/frogpilot/third_party/reactivex/operators/_groupjoin.py b/starpilot/third_party/reactivex/operators/_groupjoin.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_groupjoin.py rename to starpilot/third_party/reactivex/operators/_groupjoin.py diff --git a/frogpilot/third_party/reactivex/operators/_ignoreelements.py b/starpilot/third_party/reactivex/operators/_ignoreelements.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_ignoreelements.py rename to starpilot/third_party/reactivex/operators/_ignoreelements.py diff --git a/frogpilot/third_party/reactivex/operators/_isempty.py b/starpilot/third_party/reactivex/operators/_isempty.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_isempty.py rename to starpilot/third_party/reactivex/operators/_isempty.py diff --git a/frogpilot/third_party/reactivex/operators/_join.py b/starpilot/third_party/reactivex/operators/_join.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_join.py rename to starpilot/third_party/reactivex/operators/_join.py diff --git a/frogpilot/third_party/reactivex/operators/_last.py b/starpilot/third_party/reactivex/operators/_last.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_last.py rename to starpilot/third_party/reactivex/operators/_last.py diff --git a/frogpilot/third_party/reactivex/operators/_lastordefault.py b/starpilot/third_party/reactivex/operators/_lastordefault.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_lastordefault.py rename to starpilot/third_party/reactivex/operators/_lastordefault.py diff --git a/frogpilot/third_party/reactivex/operators/_map.py b/starpilot/third_party/reactivex/operators/_map.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_map.py rename to starpilot/third_party/reactivex/operators/_map.py diff --git a/frogpilot/third_party/reactivex/operators/_materialize.py b/starpilot/third_party/reactivex/operators/_materialize.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_materialize.py rename to starpilot/third_party/reactivex/operators/_materialize.py diff --git a/frogpilot/third_party/reactivex/operators/_max.py b/starpilot/third_party/reactivex/operators/_max.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_max.py rename to starpilot/third_party/reactivex/operators/_max.py diff --git a/frogpilot/third_party/reactivex/operators/_maxby.py b/starpilot/third_party/reactivex/operators/_maxby.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_maxby.py rename to starpilot/third_party/reactivex/operators/_maxby.py diff --git a/frogpilot/third_party/reactivex/operators/_merge.py b/starpilot/third_party/reactivex/operators/_merge.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_merge.py rename to starpilot/third_party/reactivex/operators/_merge.py diff --git a/frogpilot/third_party/reactivex/operators/_min.py b/starpilot/third_party/reactivex/operators/_min.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_min.py rename to starpilot/third_party/reactivex/operators/_min.py diff --git a/frogpilot/third_party/reactivex/operators/_minby.py b/starpilot/third_party/reactivex/operators/_minby.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_minby.py rename to starpilot/third_party/reactivex/operators/_minby.py diff --git a/frogpilot/third_party/reactivex/operators/_multicast.py b/starpilot/third_party/reactivex/operators/_multicast.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_multicast.py rename to starpilot/third_party/reactivex/operators/_multicast.py diff --git a/frogpilot/third_party/reactivex/operators/_observeon.py b/starpilot/third_party/reactivex/operators/_observeon.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_observeon.py rename to starpilot/third_party/reactivex/operators/_observeon.py diff --git a/frogpilot/third_party/reactivex/operators/_onerrorresumenext.py b/starpilot/third_party/reactivex/operators/_onerrorresumenext.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_onerrorresumenext.py rename to starpilot/third_party/reactivex/operators/_onerrorresumenext.py diff --git a/frogpilot/third_party/reactivex/operators/_pairwise.py b/starpilot/third_party/reactivex/operators/_pairwise.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_pairwise.py rename to starpilot/third_party/reactivex/operators/_pairwise.py diff --git a/frogpilot/third_party/reactivex/operators/_partition.py b/starpilot/third_party/reactivex/operators/_partition.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_partition.py rename to starpilot/third_party/reactivex/operators/_partition.py diff --git a/frogpilot/third_party/reactivex/operators/_pluck.py b/starpilot/third_party/reactivex/operators/_pluck.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_pluck.py rename to starpilot/third_party/reactivex/operators/_pluck.py diff --git a/frogpilot/third_party/reactivex/operators/_publish.py b/starpilot/third_party/reactivex/operators/_publish.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_publish.py rename to starpilot/third_party/reactivex/operators/_publish.py diff --git a/frogpilot/third_party/reactivex/operators/_publishvalue.py b/starpilot/third_party/reactivex/operators/_publishvalue.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_publishvalue.py rename to starpilot/third_party/reactivex/operators/_publishvalue.py diff --git a/frogpilot/third_party/reactivex/operators/_reduce.py b/starpilot/third_party/reactivex/operators/_reduce.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_reduce.py rename to starpilot/third_party/reactivex/operators/_reduce.py diff --git a/frogpilot/third_party/reactivex/operators/_repeat.py b/starpilot/third_party/reactivex/operators/_repeat.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_repeat.py rename to starpilot/third_party/reactivex/operators/_repeat.py diff --git a/frogpilot/third_party/reactivex/operators/_replay.py b/starpilot/third_party/reactivex/operators/_replay.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_replay.py rename to starpilot/third_party/reactivex/operators/_replay.py diff --git a/frogpilot/third_party/reactivex/operators/_retry.py b/starpilot/third_party/reactivex/operators/_retry.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_retry.py rename to starpilot/third_party/reactivex/operators/_retry.py diff --git a/frogpilot/third_party/reactivex/operators/_sample.py b/starpilot/third_party/reactivex/operators/_sample.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_sample.py rename to starpilot/third_party/reactivex/operators/_sample.py diff --git a/frogpilot/third_party/reactivex/operators/_scan.py b/starpilot/third_party/reactivex/operators/_scan.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_scan.py rename to starpilot/third_party/reactivex/operators/_scan.py diff --git a/frogpilot/third_party/reactivex/operators/_sequenceequal.py b/starpilot/third_party/reactivex/operators/_sequenceequal.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_sequenceequal.py rename to starpilot/third_party/reactivex/operators/_sequenceequal.py diff --git a/frogpilot/third_party/reactivex/operators/_single.py b/starpilot/third_party/reactivex/operators/_single.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_single.py rename to starpilot/third_party/reactivex/operators/_single.py diff --git a/frogpilot/third_party/reactivex/operators/_singleordefault.py b/starpilot/third_party/reactivex/operators/_singleordefault.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_singleordefault.py rename to starpilot/third_party/reactivex/operators/_singleordefault.py diff --git a/frogpilot/third_party/reactivex/operators/_skip.py b/starpilot/third_party/reactivex/operators/_skip.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skip.py rename to starpilot/third_party/reactivex/operators/_skip.py diff --git a/frogpilot/third_party/reactivex/operators/_skiplast.py b/starpilot/third_party/reactivex/operators/_skiplast.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skiplast.py rename to starpilot/third_party/reactivex/operators/_skiplast.py diff --git a/frogpilot/third_party/reactivex/operators/_skiplastwithtime.py b/starpilot/third_party/reactivex/operators/_skiplastwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skiplastwithtime.py rename to starpilot/third_party/reactivex/operators/_skiplastwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_skipuntil.py b/starpilot/third_party/reactivex/operators/_skipuntil.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skipuntil.py rename to starpilot/third_party/reactivex/operators/_skipuntil.py diff --git a/frogpilot/third_party/reactivex/operators/_skipuntilwithtime.py b/starpilot/third_party/reactivex/operators/_skipuntilwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skipuntilwithtime.py rename to starpilot/third_party/reactivex/operators/_skipuntilwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_skipwhile.py b/starpilot/third_party/reactivex/operators/_skipwhile.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skipwhile.py rename to starpilot/third_party/reactivex/operators/_skipwhile.py diff --git a/frogpilot/third_party/reactivex/operators/_skipwithtime.py b/starpilot/third_party/reactivex/operators/_skipwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_skipwithtime.py rename to starpilot/third_party/reactivex/operators/_skipwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_slice.py b/starpilot/third_party/reactivex/operators/_slice.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_slice.py rename to starpilot/third_party/reactivex/operators/_slice.py diff --git a/frogpilot/third_party/reactivex/operators/_some.py b/starpilot/third_party/reactivex/operators/_some.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_some.py rename to starpilot/third_party/reactivex/operators/_some.py diff --git a/frogpilot/third_party/reactivex/operators/_startswith.py b/starpilot/third_party/reactivex/operators/_startswith.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_startswith.py rename to starpilot/third_party/reactivex/operators/_startswith.py diff --git a/frogpilot/third_party/reactivex/operators/_subscribeon.py b/starpilot/third_party/reactivex/operators/_subscribeon.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_subscribeon.py rename to starpilot/third_party/reactivex/operators/_subscribeon.py diff --git a/frogpilot/third_party/reactivex/operators/_sum.py b/starpilot/third_party/reactivex/operators/_sum.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_sum.py rename to starpilot/third_party/reactivex/operators/_sum.py diff --git a/frogpilot/third_party/reactivex/operators/_switchlatest.py b/starpilot/third_party/reactivex/operators/_switchlatest.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_switchlatest.py rename to starpilot/third_party/reactivex/operators/_switchlatest.py diff --git a/frogpilot/third_party/reactivex/operators/_take.py b/starpilot/third_party/reactivex/operators/_take.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_take.py rename to starpilot/third_party/reactivex/operators/_take.py diff --git a/frogpilot/third_party/reactivex/operators/_takelast.py b/starpilot/third_party/reactivex/operators/_takelast.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takelast.py rename to starpilot/third_party/reactivex/operators/_takelast.py diff --git a/frogpilot/third_party/reactivex/operators/_takelastbuffer.py b/starpilot/third_party/reactivex/operators/_takelastbuffer.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takelastbuffer.py rename to starpilot/third_party/reactivex/operators/_takelastbuffer.py diff --git a/frogpilot/third_party/reactivex/operators/_takelastwithtime.py b/starpilot/third_party/reactivex/operators/_takelastwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takelastwithtime.py rename to starpilot/third_party/reactivex/operators/_takelastwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_takeuntil.py b/starpilot/third_party/reactivex/operators/_takeuntil.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takeuntil.py rename to starpilot/third_party/reactivex/operators/_takeuntil.py diff --git a/frogpilot/third_party/reactivex/operators/_takeuntilwithtime.py b/starpilot/third_party/reactivex/operators/_takeuntilwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takeuntilwithtime.py rename to starpilot/third_party/reactivex/operators/_takeuntilwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_takewhile.py b/starpilot/third_party/reactivex/operators/_takewhile.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takewhile.py rename to starpilot/third_party/reactivex/operators/_takewhile.py diff --git a/frogpilot/third_party/reactivex/operators/_takewithtime.py b/starpilot/third_party/reactivex/operators/_takewithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_takewithtime.py rename to starpilot/third_party/reactivex/operators/_takewithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_throttlefirst.py b/starpilot/third_party/reactivex/operators/_throttlefirst.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_throttlefirst.py rename to starpilot/third_party/reactivex/operators/_throttlefirst.py diff --git a/frogpilot/third_party/reactivex/operators/_timeinterval.py b/starpilot/third_party/reactivex/operators/_timeinterval.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_timeinterval.py rename to starpilot/third_party/reactivex/operators/_timeinterval.py diff --git a/frogpilot/third_party/reactivex/operators/_timeout.py b/starpilot/third_party/reactivex/operators/_timeout.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_timeout.py rename to starpilot/third_party/reactivex/operators/_timeout.py diff --git a/frogpilot/third_party/reactivex/operators/_timeoutwithmapper.py b/starpilot/third_party/reactivex/operators/_timeoutwithmapper.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_timeoutwithmapper.py rename to starpilot/third_party/reactivex/operators/_timeoutwithmapper.py diff --git a/frogpilot/third_party/reactivex/operators/_timestamp.py b/starpilot/third_party/reactivex/operators/_timestamp.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_timestamp.py rename to starpilot/third_party/reactivex/operators/_timestamp.py diff --git a/frogpilot/third_party/reactivex/operators/_todict.py b/starpilot/third_party/reactivex/operators/_todict.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_todict.py rename to starpilot/third_party/reactivex/operators/_todict.py diff --git a/frogpilot/third_party/reactivex/operators/_tofuture.py b/starpilot/third_party/reactivex/operators/_tofuture.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_tofuture.py rename to starpilot/third_party/reactivex/operators/_tofuture.py diff --git a/frogpilot/third_party/reactivex/operators/_toiterable.py b/starpilot/third_party/reactivex/operators/_toiterable.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_toiterable.py rename to starpilot/third_party/reactivex/operators/_toiterable.py diff --git a/frogpilot/third_party/reactivex/operators/_tomarbles.py b/starpilot/third_party/reactivex/operators/_tomarbles.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_tomarbles.py rename to starpilot/third_party/reactivex/operators/_tomarbles.py diff --git a/frogpilot/third_party/reactivex/operators/_toset.py b/starpilot/third_party/reactivex/operators/_toset.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_toset.py rename to starpilot/third_party/reactivex/operators/_toset.py diff --git a/frogpilot/third_party/reactivex/operators/_whiledo.py b/starpilot/third_party/reactivex/operators/_whiledo.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_whiledo.py rename to starpilot/third_party/reactivex/operators/_whiledo.py diff --git a/frogpilot/third_party/reactivex/operators/_window.py b/starpilot/third_party/reactivex/operators/_window.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_window.py rename to starpilot/third_party/reactivex/operators/_window.py diff --git a/frogpilot/third_party/reactivex/operators/_windowwithcount.py b/starpilot/third_party/reactivex/operators/_windowwithcount.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_windowwithcount.py rename to starpilot/third_party/reactivex/operators/_windowwithcount.py diff --git a/frogpilot/third_party/reactivex/operators/_windowwithtime.py b/starpilot/third_party/reactivex/operators/_windowwithtime.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_windowwithtime.py rename to starpilot/third_party/reactivex/operators/_windowwithtime.py diff --git a/frogpilot/third_party/reactivex/operators/_windowwithtimeorcount.py b/starpilot/third_party/reactivex/operators/_windowwithtimeorcount.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_windowwithtimeorcount.py rename to starpilot/third_party/reactivex/operators/_windowwithtimeorcount.py diff --git a/frogpilot/third_party/reactivex/operators/_withlatestfrom.py b/starpilot/third_party/reactivex/operators/_withlatestfrom.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_withlatestfrom.py rename to starpilot/third_party/reactivex/operators/_withlatestfrom.py diff --git a/frogpilot/third_party/reactivex/operators/_zip.py b/starpilot/third_party/reactivex/operators/_zip.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/_zip.py rename to starpilot/third_party/reactivex/operators/_zip.py diff --git a/frogpilot/third_party/reactivex/operators/connectable/__init__.py b/starpilot/third_party/reactivex/operators/connectable/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/connectable/__init__.py rename to starpilot/third_party/reactivex/operators/connectable/__init__.py diff --git a/frogpilot/third_party/reactivex/operators/connectable/_refcount.py b/starpilot/third_party/reactivex/operators/connectable/_refcount.py similarity index 100% rename from frogpilot/third_party/reactivex/operators/connectable/_refcount.py rename to starpilot/third_party/reactivex/operators/connectable/_refcount.py diff --git a/frogpilot/third_party/reactivex/pipe.py b/starpilot/third_party/reactivex/pipe.py similarity index 100% rename from frogpilot/third_party/reactivex/pipe.py rename to starpilot/third_party/reactivex/pipe.py diff --git a/frogpilot/third_party/reactivex/py.typed b/starpilot/third_party/reactivex/py.typed similarity index 100% rename from frogpilot/third_party/reactivex/py.typed rename to starpilot/third_party/reactivex/py.typed diff --git a/frogpilot/third_party/reactivex/run.py b/starpilot/third_party/reactivex/run.py similarity index 100% rename from frogpilot/third_party/reactivex/run.py rename to starpilot/third_party/reactivex/run.py diff --git a/frogpilot/third_party/reactivex/scheduler/__init__.py b/starpilot/third_party/reactivex/scheduler/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/__init__.py rename to starpilot/third_party/reactivex/scheduler/__init__.py diff --git a/frogpilot/third_party/reactivex/scheduler/catchscheduler.py b/starpilot/third_party/reactivex/scheduler/catchscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/catchscheduler.py rename to starpilot/third_party/reactivex/scheduler/catchscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/currentthreadscheduler.py b/starpilot/third_party/reactivex/scheduler/currentthreadscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/currentthreadscheduler.py rename to starpilot/third_party/reactivex/scheduler/currentthreadscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/__init__.py b/starpilot/third_party/reactivex/scheduler/eventloop/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/__init__.py rename to starpilot/third_party/reactivex/scheduler/eventloop/__init__.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/asyncioscheduler.py b/starpilot/third_party/reactivex/scheduler/eventloop/asyncioscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/asyncioscheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloop/asyncioscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/asynciothreadsafescheduler.py b/starpilot/third_party/reactivex/scheduler/eventloop/asynciothreadsafescheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/asynciothreadsafescheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloop/asynciothreadsafescheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/eventletscheduler.py b/starpilot/third_party/reactivex/scheduler/eventloop/eventletscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/eventletscheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloop/eventletscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/geventscheduler.py b/starpilot/third_party/reactivex/scheduler/eventloop/geventscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/geventscheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloop/geventscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/ioloopscheduler.py b/starpilot/third_party/reactivex/scheduler/eventloop/ioloopscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/ioloopscheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloop/ioloopscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloop/twistedscheduler.py b/starpilot/third_party/reactivex/scheduler/eventloop/twistedscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloop/twistedscheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloop/twistedscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/eventloopscheduler.py b/starpilot/third_party/reactivex/scheduler/eventloopscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/eventloopscheduler.py rename to starpilot/third_party/reactivex/scheduler/eventloopscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/historicalscheduler.py b/starpilot/third_party/reactivex/scheduler/historicalscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/historicalscheduler.py rename to starpilot/third_party/reactivex/scheduler/historicalscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/immediatescheduler.py b/starpilot/third_party/reactivex/scheduler/immediatescheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/immediatescheduler.py rename to starpilot/third_party/reactivex/scheduler/immediatescheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/mainloop/__init__.py b/starpilot/third_party/reactivex/scheduler/mainloop/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/mainloop/__init__.py rename to starpilot/third_party/reactivex/scheduler/mainloop/__init__.py diff --git a/frogpilot/third_party/reactivex/scheduler/mainloop/gtkscheduler.py b/starpilot/third_party/reactivex/scheduler/mainloop/gtkscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/mainloop/gtkscheduler.py rename to starpilot/third_party/reactivex/scheduler/mainloop/gtkscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/mainloop/pygamescheduler.py b/starpilot/third_party/reactivex/scheduler/mainloop/pygamescheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/mainloop/pygamescheduler.py rename to starpilot/third_party/reactivex/scheduler/mainloop/pygamescheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/mainloop/qtscheduler.py b/starpilot/third_party/reactivex/scheduler/mainloop/qtscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/mainloop/qtscheduler.py rename to starpilot/third_party/reactivex/scheduler/mainloop/qtscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/mainloop/tkinterscheduler.py b/starpilot/third_party/reactivex/scheduler/mainloop/tkinterscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/mainloop/tkinterscheduler.py rename to starpilot/third_party/reactivex/scheduler/mainloop/tkinterscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/mainloop/wxscheduler.py b/starpilot/third_party/reactivex/scheduler/mainloop/wxscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/mainloop/wxscheduler.py rename to starpilot/third_party/reactivex/scheduler/mainloop/wxscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/newthreadscheduler.py b/starpilot/third_party/reactivex/scheduler/newthreadscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/newthreadscheduler.py rename to starpilot/third_party/reactivex/scheduler/newthreadscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/periodicscheduler.py b/starpilot/third_party/reactivex/scheduler/periodicscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/periodicscheduler.py rename to starpilot/third_party/reactivex/scheduler/periodicscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/scheduleditem.py b/starpilot/third_party/reactivex/scheduler/scheduleditem.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/scheduleditem.py rename to starpilot/third_party/reactivex/scheduler/scheduleditem.py diff --git a/frogpilot/third_party/reactivex/scheduler/scheduler.py b/starpilot/third_party/reactivex/scheduler/scheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/scheduler.py rename to starpilot/third_party/reactivex/scheduler/scheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/threadpoolscheduler.py b/starpilot/third_party/reactivex/scheduler/threadpoolscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/threadpoolscheduler.py rename to starpilot/third_party/reactivex/scheduler/threadpoolscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/timeoutscheduler.py b/starpilot/third_party/reactivex/scheduler/timeoutscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/timeoutscheduler.py rename to starpilot/third_party/reactivex/scheduler/timeoutscheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/trampoline.py b/starpilot/third_party/reactivex/scheduler/trampoline.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/trampoline.py rename to starpilot/third_party/reactivex/scheduler/trampoline.py diff --git a/frogpilot/third_party/reactivex/scheduler/trampolinescheduler.py b/starpilot/third_party/reactivex/scheduler/trampolinescheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/trampolinescheduler.py rename to starpilot/third_party/reactivex/scheduler/trampolinescheduler.py diff --git a/frogpilot/third_party/reactivex/scheduler/virtualtimescheduler.py b/starpilot/third_party/reactivex/scheduler/virtualtimescheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/scheduler/virtualtimescheduler.py rename to starpilot/third_party/reactivex/scheduler/virtualtimescheduler.py diff --git a/frogpilot/third_party/reactivex/subject/__init__.py b/starpilot/third_party/reactivex/subject/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/subject/__init__.py rename to starpilot/third_party/reactivex/subject/__init__.py diff --git a/frogpilot/third_party/reactivex/subject/asyncsubject.py b/starpilot/third_party/reactivex/subject/asyncsubject.py similarity index 100% rename from frogpilot/third_party/reactivex/subject/asyncsubject.py rename to starpilot/third_party/reactivex/subject/asyncsubject.py diff --git a/frogpilot/third_party/reactivex/subject/behaviorsubject.py b/starpilot/third_party/reactivex/subject/behaviorsubject.py similarity index 100% rename from frogpilot/third_party/reactivex/subject/behaviorsubject.py rename to starpilot/third_party/reactivex/subject/behaviorsubject.py diff --git a/frogpilot/third_party/reactivex/subject/innersubscription.py b/starpilot/third_party/reactivex/subject/innersubscription.py similarity index 100% rename from frogpilot/third_party/reactivex/subject/innersubscription.py rename to starpilot/third_party/reactivex/subject/innersubscription.py diff --git a/frogpilot/third_party/reactivex/subject/replaysubject.py b/starpilot/third_party/reactivex/subject/replaysubject.py similarity index 100% rename from frogpilot/third_party/reactivex/subject/replaysubject.py rename to starpilot/third_party/reactivex/subject/replaysubject.py diff --git a/frogpilot/third_party/reactivex/subject/subject.py b/starpilot/third_party/reactivex/subject/subject.py similarity index 100% rename from frogpilot/third_party/reactivex/subject/subject.py rename to starpilot/third_party/reactivex/subject/subject.py diff --git a/frogpilot/third_party/reactivex/testing/__init__.py b/starpilot/third_party/reactivex/testing/__init__.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/__init__.py rename to starpilot/third_party/reactivex/testing/__init__.py diff --git a/frogpilot/third_party/reactivex/testing/coldobservable.py b/starpilot/third_party/reactivex/testing/coldobservable.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/coldobservable.py rename to starpilot/third_party/reactivex/testing/coldobservable.py diff --git a/frogpilot/third_party/reactivex/testing/hotobservable.py b/starpilot/third_party/reactivex/testing/hotobservable.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/hotobservable.py rename to starpilot/third_party/reactivex/testing/hotobservable.py diff --git a/frogpilot/third_party/reactivex/testing/marbles.py b/starpilot/third_party/reactivex/testing/marbles.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/marbles.py rename to starpilot/third_party/reactivex/testing/marbles.py diff --git a/frogpilot/third_party/reactivex/testing/mockdisposable.py b/starpilot/third_party/reactivex/testing/mockdisposable.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/mockdisposable.py rename to starpilot/third_party/reactivex/testing/mockdisposable.py diff --git a/frogpilot/third_party/reactivex/testing/mockobserver.py b/starpilot/third_party/reactivex/testing/mockobserver.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/mockobserver.py rename to starpilot/third_party/reactivex/testing/mockobserver.py diff --git a/frogpilot/third_party/reactivex/testing/reactivetest.py b/starpilot/third_party/reactivex/testing/reactivetest.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/reactivetest.py rename to starpilot/third_party/reactivex/testing/reactivetest.py diff --git a/frogpilot/third_party/reactivex/testing/recorded.py b/starpilot/third_party/reactivex/testing/recorded.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/recorded.py rename to starpilot/third_party/reactivex/testing/recorded.py diff --git a/frogpilot/third_party/reactivex/testing/subscription.py b/starpilot/third_party/reactivex/testing/subscription.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/subscription.py rename to starpilot/third_party/reactivex/testing/subscription.py diff --git a/frogpilot/third_party/reactivex/testing/testscheduler.py b/starpilot/third_party/reactivex/testing/testscheduler.py similarity index 100% rename from frogpilot/third_party/reactivex/testing/testscheduler.py rename to starpilot/third_party/reactivex/testing/testscheduler.py diff --git a/frogpilot/third_party/reactivex/typing.py b/starpilot/third_party/reactivex/typing.py similarity index 100% rename from frogpilot/third_party/reactivex/typing.py rename to starpilot/third_party/reactivex/typing.py diff --git a/frogpilot/third_party/six.py b/starpilot/third_party/six.py similarity index 100% rename from frogpilot/third_party/six.py rename to starpilot/third_party/six.py diff --git a/frogpilot/third_party/timezonefinder/__init__.py b/starpilot/third_party/timezonefinder/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/__init__.py rename to starpilot/third_party/timezonefinder/__init__.py diff --git a/frogpilot/third_party/timezonefinder/_numba_replacements.py b/starpilot/third_party/timezonefinder/_numba_replacements.py similarity index 100% rename from frogpilot/third_party/timezonefinder/_numba_replacements.py rename to starpilot/third_party/timezonefinder/_numba_replacements.py diff --git a/frogpilot/third_party/timezonefinder/configs.py b/starpilot/third_party/timezonefinder/configs.py similarity index 100% rename from frogpilot/third_party/timezonefinder/configs.py rename to starpilot/third_party/timezonefinder/configs.py diff --git a/frogpilot/third_party/timezonefinder/coord_accessors.py b/starpilot/third_party/timezonefinder/coord_accessors.py similarity index 100% rename from frogpilot/third_party/timezonefinder/coord_accessors.py rename to starpilot/third_party/timezonefinder/coord_accessors.py diff --git a/frogpilot/third_party/timezonefinder/data/boundaries/coordinates.fbs b/starpilot/third_party/timezonefinder/data/boundaries/coordinates.fbs similarity index 100% rename from frogpilot/third_party/timezonefinder/data/boundaries/coordinates.fbs rename to starpilot/third_party/timezonefinder/data/boundaries/coordinates.fbs diff --git a/frogpilot/third_party/timezonefinder/data/boundaries/xmax.npy b/starpilot/third_party/timezonefinder/data/boundaries/xmax.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/boundaries/xmax.npy rename to starpilot/third_party/timezonefinder/data/boundaries/xmax.npy diff --git a/frogpilot/third_party/timezonefinder/data/boundaries/xmin.npy b/starpilot/third_party/timezonefinder/data/boundaries/xmin.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/boundaries/xmin.npy rename to starpilot/third_party/timezonefinder/data/boundaries/xmin.npy diff --git a/frogpilot/third_party/timezonefinder/data/boundaries/ymax.npy b/starpilot/third_party/timezonefinder/data/boundaries/ymax.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/boundaries/ymax.npy rename to starpilot/third_party/timezonefinder/data/boundaries/ymax.npy diff --git a/frogpilot/third_party/timezonefinder/data/boundaries/ymin.npy b/starpilot/third_party/timezonefinder/data/boundaries/ymin.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/boundaries/ymin.npy rename to starpilot/third_party/timezonefinder/data/boundaries/ymin.npy diff --git a/frogpilot/third_party/timezonefinder/data/hole_registry.json b/starpilot/third_party/timezonefinder/data/hole_registry.json similarity index 100% rename from frogpilot/third_party/timezonefinder/data/hole_registry.json rename to starpilot/third_party/timezonefinder/data/hole_registry.json diff --git a/frogpilot/third_party/timezonefinder/data/holes/coordinates.fbs b/starpilot/third_party/timezonefinder/data/holes/coordinates.fbs similarity index 100% rename from frogpilot/third_party/timezonefinder/data/holes/coordinates.fbs rename to starpilot/third_party/timezonefinder/data/holes/coordinates.fbs diff --git a/frogpilot/third_party/timezonefinder/data/holes/xmax.npy b/starpilot/third_party/timezonefinder/data/holes/xmax.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/holes/xmax.npy rename to starpilot/third_party/timezonefinder/data/holes/xmax.npy diff --git a/frogpilot/third_party/timezonefinder/data/holes/xmin.npy b/starpilot/third_party/timezonefinder/data/holes/xmin.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/holes/xmin.npy rename to starpilot/third_party/timezonefinder/data/holes/xmin.npy diff --git a/frogpilot/third_party/timezonefinder/data/holes/ymax.npy b/starpilot/third_party/timezonefinder/data/holes/ymax.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/holes/ymax.npy rename to starpilot/third_party/timezonefinder/data/holes/ymax.npy diff --git a/frogpilot/third_party/timezonefinder/data/holes/ymin.npy b/starpilot/third_party/timezonefinder/data/holes/ymin.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/holes/ymin.npy rename to starpilot/third_party/timezonefinder/data/holes/ymin.npy diff --git a/frogpilot/third_party/timezonefinder/data/hybrid_shortcuts_uint16.fbs b/starpilot/third_party/timezonefinder/data/hybrid_shortcuts_uint16.fbs similarity index 100% rename from frogpilot/third_party/timezonefinder/data/hybrid_shortcuts_uint16.fbs rename to starpilot/third_party/timezonefinder/data/hybrid_shortcuts_uint16.fbs diff --git a/frogpilot/third_party/timezonefinder/data/timezone_names.txt b/starpilot/third_party/timezonefinder/data/timezone_names.txt similarity index 100% rename from frogpilot/third_party/timezonefinder/data/timezone_names.txt rename to starpilot/third_party/timezonefinder/data/timezone_names.txt diff --git a/frogpilot/third_party/timezonefinder/data/zone_ids.npy b/starpilot/third_party/timezonefinder/data/zone_ids.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/zone_ids.npy rename to starpilot/third_party/timezonefinder/data/zone_ids.npy diff --git a/frogpilot/third_party/timezonefinder/data/zone_positions.npy b/starpilot/third_party/timezonefinder/data/zone_positions.npy similarity index 100% rename from frogpilot/third_party/timezonefinder/data/zone_positions.npy rename to starpilot/third_party/timezonefinder/data/zone_positions.npy diff --git a/frogpilot/third_party/timezonefinder/flatbuf/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/__init__.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/generated/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/__init__.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/polygons/Polygon.py b/starpilot/third_party/timezonefinder/flatbuf/generated/polygons/Polygon.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/polygons/Polygon.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/polygons/Polygon.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/polygons/PolygonCollection.py b/starpilot/third_party/timezonefinder/flatbuf/generated/polygons/PolygonCollection.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/polygons/PolygonCollection.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/polygons/PolygonCollection.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/polygons/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/generated/polygons/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/polygons/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/polygons/__init__.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutCollection.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutCollection.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutCollection.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutCollection.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutEntry.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutEntry.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutEntry.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/HybridShortcutEntry.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/PolygonList.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/PolygonList.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/PolygonList.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/PolygonList.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/ShortcutValue.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/ShortcutValue.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/ShortcutValue.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/ShortcutValue.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/UniqueZone.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/UniqueZone.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/UniqueZone.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/UniqueZone.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint16/__init__.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutCollection.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutCollection.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutCollection.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutCollection.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutEntry.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutEntry.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutEntry.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/HybridShortcutEntry.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/PolygonList.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/PolygonList.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/PolygonList.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/PolygonList.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/ShortcutValue.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/ShortcutValue.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/ShortcutValue.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/ShortcutValue.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/UniqueZone.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/UniqueZone.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/UniqueZone.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/UniqueZone.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/generated/shortcuts_uint8/__init__.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/io/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/io/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/io/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/io/__init__.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/io/hybrid_shortcuts.py b/starpilot/third_party/timezonefinder/flatbuf/io/hybrid_shortcuts.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/io/hybrid_shortcuts.py rename to starpilot/third_party/timezonefinder/flatbuf/io/hybrid_shortcuts.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/io/polygons.py b/starpilot/third_party/timezonefinder/flatbuf/io/polygons.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/io/polygons.py rename to starpilot/third_party/timezonefinder/flatbuf/io/polygons.py diff --git a/frogpilot/third_party/timezonefinder/flatbuf/schemas/__init__.py b/starpilot/third_party/timezonefinder/flatbuf/schemas/__init__.py similarity index 100% rename from frogpilot/third_party/timezonefinder/flatbuf/schemas/__init__.py rename to starpilot/third_party/timezonefinder/flatbuf/schemas/__init__.py diff --git a/frogpilot/third_party/timezonefinder/global_functions.py b/starpilot/third_party/timezonefinder/global_functions.py similarity index 100% rename from frogpilot/third_party/timezonefinder/global_functions.py rename to starpilot/third_party/timezonefinder/global_functions.py diff --git a/frogpilot/third_party/timezonefinder/np_binary_helpers.py b/starpilot/third_party/timezonefinder/np_binary_helpers.py similarity index 100% rename from frogpilot/third_party/timezonefinder/np_binary_helpers.py rename to starpilot/third_party/timezonefinder/np_binary_helpers.py diff --git a/frogpilot/third_party/timezonefinder/polygon_array.py b/starpilot/third_party/timezonefinder/polygon_array.py similarity index 100% rename from frogpilot/third_party/timezonefinder/polygon_array.py rename to starpilot/third_party/timezonefinder/polygon_array.py diff --git a/frogpilot/third_party/timezonefinder/timezonefinder.py b/starpilot/third_party/timezonefinder/timezonefinder.py similarity index 100% rename from frogpilot/third_party/timezonefinder/timezonefinder.py rename to starpilot/third_party/timezonefinder/timezonefinder.py diff --git a/frogpilot/third_party/timezonefinder/utils.py b/starpilot/third_party/timezonefinder/utils.py similarity index 100% rename from frogpilot/third_party/timezonefinder/utils.py rename to starpilot/third_party/timezonefinder/utils.py diff --git a/frogpilot/third_party/timezonefinder/utils_clang.py b/starpilot/third_party/timezonefinder/utils_clang.py similarity index 100% rename from frogpilot/third_party/timezonefinder/utils_clang.py rename to starpilot/third_party/timezonefinder/utils_clang.py diff --git a/frogpilot/third_party/timezonefinder/utils_numba.py b/starpilot/third_party/timezonefinder/utils_numba.py similarity index 100% rename from frogpilot/third_party/timezonefinder/utils_numba.py rename to starpilot/third_party/timezonefinder/utils_numba.py diff --git a/frogpilot/third_party/timezonefinder/zone_names.py b/starpilot/third_party/timezonefinder/zone_names.py similarity index 100% rename from frogpilot/third_party/timezonefinder/zone_names.py rename to starpilot/third_party/timezonefinder/zone_names.py diff --git a/frogpilot/third_party/typing_extensions.py b/starpilot/third_party/typing_extensions.py similarity index 100% rename from frogpilot/third_party/typing_extensions.py rename to starpilot/third_party/typing_extensions.py diff --git a/frogpilot/third_party/urllib3/__init__.py b/starpilot/third_party/urllib3/__init__.py similarity index 100% rename from frogpilot/third_party/urllib3/__init__.py rename to starpilot/third_party/urllib3/__init__.py diff --git a/frogpilot/third_party/urllib3/_base_connection.py b/starpilot/third_party/urllib3/_base_connection.py similarity index 100% rename from frogpilot/third_party/urllib3/_base_connection.py rename to starpilot/third_party/urllib3/_base_connection.py diff --git a/frogpilot/third_party/urllib3/_collections.py b/starpilot/third_party/urllib3/_collections.py similarity index 100% rename from frogpilot/third_party/urllib3/_collections.py rename to starpilot/third_party/urllib3/_collections.py diff --git a/frogpilot/third_party/urllib3/_request_methods.py b/starpilot/third_party/urllib3/_request_methods.py similarity index 100% rename from frogpilot/third_party/urllib3/_request_methods.py rename to starpilot/third_party/urllib3/_request_methods.py diff --git a/frogpilot/third_party/urllib3/_version.py b/starpilot/third_party/urllib3/_version.py similarity index 100% rename from frogpilot/third_party/urllib3/_version.py rename to starpilot/third_party/urllib3/_version.py diff --git a/frogpilot/third_party/urllib3/connection.py b/starpilot/third_party/urllib3/connection.py similarity index 100% rename from frogpilot/third_party/urllib3/connection.py rename to starpilot/third_party/urllib3/connection.py diff --git a/frogpilot/third_party/urllib3/connectionpool.py b/starpilot/third_party/urllib3/connectionpool.py similarity index 100% rename from frogpilot/third_party/urllib3/connectionpool.py rename to starpilot/third_party/urllib3/connectionpool.py diff --git a/frogpilot/third_party/urllib3/contrib/__init__.py b/starpilot/third_party/urllib3/contrib/__init__.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/__init__.py rename to starpilot/third_party/urllib3/contrib/__init__.py diff --git a/frogpilot/third_party/urllib3/contrib/emscripten/__init__.py b/starpilot/third_party/urllib3/contrib/emscripten/__init__.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/emscripten/__init__.py rename to starpilot/third_party/urllib3/contrib/emscripten/__init__.py diff --git a/frogpilot/third_party/urllib3/contrib/emscripten/connection.py b/starpilot/third_party/urllib3/contrib/emscripten/connection.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/emscripten/connection.py rename to starpilot/third_party/urllib3/contrib/emscripten/connection.py diff --git a/frogpilot/third_party/urllib3/contrib/emscripten/emscripten_fetch_worker.js b/starpilot/third_party/urllib3/contrib/emscripten/emscripten_fetch_worker.js similarity index 100% rename from frogpilot/third_party/urllib3/contrib/emscripten/emscripten_fetch_worker.js rename to starpilot/third_party/urllib3/contrib/emscripten/emscripten_fetch_worker.js diff --git a/frogpilot/third_party/urllib3/contrib/emscripten/fetch.py b/starpilot/third_party/urllib3/contrib/emscripten/fetch.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/emscripten/fetch.py rename to starpilot/third_party/urllib3/contrib/emscripten/fetch.py diff --git a/frogpilot/third_party/urllib3/contrib/emscripten/request.py b/starpilot/third_party/urllib3/contrib/emscripten/request.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/emscripten/request.py rename to starpilot/third_party/urllib3/contrib/emscripten/request.py diff --git a/frogpilot/third_party/urllib3/contrib/emscripten/response.py b/starpilot/third_party/urllib3/contrib/emscripten/response.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/emscripten/response.py rename to starpilot/third_party/urllib3/contrib/emscripten/response.py diff --git a/frogpilot/third_party/urllib3/contrib/pyopenssl.py b/starpilot/third_party/urllib3/contrib/pyopenssl.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/pyopenssl.py rename to starpilot/third_party/urllib3/contrib/pyopenssl.py diff --git a/frogpilot/third_party/urllib3/contrib/socks.py b/starpilot/third_party/urllib3/contrib/socks.py similarity index 100% rename from frogpilot/third_party/urllib3/contrib/socks.py rename to starpilot/third_party/urllib3/contrib/socks.py diff --git a/frogpilot/third_party/urllib3/exceptions.py b/starpilot/third_party/urllib3/exceptions.py similarity index 100% rename from frogpilot/third_party/urllib3/exceptions.py rename to starpilot/third_party/urllib3/exceptions.py diff --git a/frogpilot/third_party/urllib3/fields.py b/starpilot/third_party/urllib3/fields.py similarity index 100% rename from frogpilot/third_party/urllib3/fields.py rename to starpilot/third_party/urllib3/fields.py diff --git a/frogpilot/third_party/urllib3/filepost.py b/starpilot/third_party/urllib3/filepost.py similarity index 100% rename from frogpilot/third_party/urllib3/filepost.py rename to starpilot/third_party/urllib3/filepost.py diff --git a/frogpilot/third_party/urllib3/http2/__init__.py b/starpilot/third_party/urllib3/http2/__init__.py similarity index 100% rename from frogpilot/third_party/urllib3/http2/__init__.py rename to starpilot/third_party/urllib3/http2/__init__.py diff --git a/frogpilot/third_party/urllib3/http2/connection.py b/starpilot/third_party/urllib3/http2/connection.py similarity index 100% rename from frogpilot/third_party/urllib3/http2/connection.py rename to starpilot/third_party/urllib3/http2/connection.py diff --git a/frogpilot/third_party/urllib3/http2/probe.py b/starpilot/third_party/urllib3/http2/probe.py similarity index 100% rename from frogpilot/third_party/urllib3/http2/probe.py rename to starpilot/third_party/urllib3/http2/probe.py diff --git a/frogpilot/third_party/urllib3/poolmanager.py b/starpilot/third_party/urllib3/poolmanager.py similarity index 100% rename from frogpilot/third_party/urllib3/poolmanager.py rename to starpilot/third_party/urllib3/poolmanager.py diff --git a/frogpilot/third_party/urllib3/py.typed b/starpilot/third_party/urllib3/py.typed similarity index 100% rename from frogpilot/third_party/urllib3/py.typed rename to starpilot/third_party/urllib3/py.typed diff --git a/frogpilot/third_party/urllib3/response.py b/starpilot/third_party/urllib3/response.py similarity index 100% rename from frogpilot/third_party/urllib3/response.py rename to starpilot/third_party/urllib3/response.py diff --git a/frogpilot/third_party/urllib3/util/__init__.py b/starpilot/third_party/urllib3/util/__init__.py similarity index 100% rename from frogpilot/third_party/urllib3/util/__init__.py rename to starpilot/third_party/urllib3/util/__init__.py diff --git a/frogpilot/third_party/urllib3/util/connection.py b/starpilot/third_party/urllib3/util/connection.py similarity index 100% rename from frogpilot/third_party/urllib3/util/connection.py rename to starpilot/third_party/urllib3/util/connection.py diff --git a/frogpilot/third_party/urllib3/util/proxy.py b/starpilot/third_party/urllib3/util/proxy.py similarity index 100% rename from frogpilot/third_party/urllib3/util/proxy.py rename to starpilot/third_party/urllib3/util/proxy.py diff --git a/frogpilot/third_party/urllib3/util/request.py b/starpilot/third_party/urllib3/util/request.py similarity index 100% rename from frogpilot/third_party/urllib3/util/request.py rename to starpilot/third_party/urllib3/util/request.py diff --git a/frogpilot/third_party/urllib3/util/response.py b/starpilot/third_party/urllib3/util/response.py similarity index 100% rename from frogpilot/third_party/urllib3/util/response.py rename to starpilot/third_party/urllib3/util/response.py diff --git a/frogpilot/third_party/urllib3/util/retry.py b/starpilot/third_party/urllib3/util/retry.py similarity index 100% rename from frogpilot/third_party/urllib3/util/retry.py rename to starpilot/third_party/urllib3/util/retry.py diff --git a/frogpilot/third_party/urllib3/util/ssl_.py b/starpilot/third_party/urllib3/util/ssl_.py similarity index 100% rename from frogpilot/third_party/urllib3/util/ssl_.py rename to starpilot/third_party/urllib3/util/ssl_.py diff --git a/frogpilot/third_party/urllib3/util/ssl_match_hostname.py b/starpilot/third_party/urllib3/util/ssl_match_hostname.py similarity index 100% rename from frogpilot/third_party/urllib3/util/ssl_match_hostname.py rename to starpilot/third_party/urllib3/util/ssl_match_hostname.py diff --git a/frogpilot/third_party/urllib3/util/ssltransport.py b/starpilot/third_party/urllib3/util/ssltransport.py similarity index 100% rename from frogpilot/third_party/urllib3/util/ssltransport.py rename to starpilot/third_party/urllib3/util/ssltransport.py diff --git a/frogpilot/third_party/urllib3/util/timeout.py b/starpilot/third_party/urllib3/util/timeout.py similarity index 100% rename from frogpilot/third_party/urllib3/util/timeout.py rename to starpilot/third_party/urllib3/util/timeout.py diff --git a/frogpilot/third_party/urllib3/util/url.py b/starpilot/third_party/urllib3/util/url.py similarity index 100% rename from frogpilot/third_party/urllib3/util/url.py rename to starpilot/third_party/urllib3/util/url.py diff --git a/frogpilot/third_party/urllib3/util/util.py b/starpilot/third_party/urllib3/util/util.py similarity index 100% rename from frogpilot/third_party/urllib3/util/util.py rename to starpilot/third_party/urllib3/util/util.py diff --git a/frogpilot/third_party/urllib3/util/wait.py b/starpilot/third_party/urllib3/util/wait.py similarity index 100% rename from frogpilot/third_party/urllib3/util/wait.py rename to starpilot/third_party/urllib3/util/wait.py diff --git a/frogpilot/third_party/werkzeug-3.1.3.dist-info/INSTALLER b/starpilot/third_party/werkzeug-3.1.3.dist-info/INSTALLER similarity index 100% rename from frogpilot/third_party/werkzeug-3.1.3.dist-info/INSTALLER rename to starpilot/third_party/werkzeug-3.1.3.dist-info/INSTALLER diff --git a/frogpilot/third_party/werkzeug-3.1.3.dist-info/LICENSE.txt b/starpilot/third_party/werkzeug-3.1.3.dist-info/LICENSE.txt similarity index 100% rename from frogpilot/third_party/werkzeug-3.1.3.dist-info/LICENSE.txt rename to starpilot/third_party/werkzeug-3.1.3.dist-info/LICENSE.txt diff --git a/frogpilot/third_party/werkzeug-3.1.3.dist-info/METADATA b/starpilot/third_party/werkzeug-3.1.3.dist-info/METADATA similarity index 100% rename from frogpilot/third_party/werkzeug-3.1.3.dist-info/METADATA rename to starpilot/third_party/werkzeug-3.1.3.dist-info/METADATA diff --git a/frogpilot/third_party/werkzeug-3.1.3.dist-info/RECORD b/starpilot/third_party/werkzeug-3.1.3.dist-info/RECORD similarity index 100% rename from frogpilot/third_party/werkzeug-3.1.3.dist-info/RECORD rename to starpilot/third_party/werkzeug-3.1.3.dist-info/RECORD diff --git a/frogpilot/third_party/werkzeug-3.1.3.dist-info/REQUESTED b/starpilot/third_party/werkzeug-3.1.3.dist-info/REQUESTED similarity index 100% rename from frogpilot/third_party/werkzeug-3.1.3.dist-info/REQUESTED rename to starpilot/third_party/werkzeug-3.1.3.dist-info/REQUESTED diff --git a/frogpilot/third_party/werkzeug-3.1.3.dist-info/WHEEL b/starpilot/third_party/werkzeug-3.1.3.dist-info/WHEEL similarity index 100% rename from frogpilot/third_party/werkzeug-3.1.3.dist-info/WHEEL rename to starpilot/third_party/werkzeug-3.1.3.dist-info/WHEEL diff --git a/frogpilot/third_party/werkzeug/__init__.py b/starpilot/third_party/werkzeug/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/__init__.py rename to starpilot/third_party/werkzeug/__init__.py diff --git a/frogpilot/third_party/werkzeug/_internal.py b/starpilot/third_party/werkzeug/_internal.py similarity index 100% rename from frogpilot/third_party/werkzeug/_internal.py rename to starpilot/third_party/werkzeug/_internal.py diff --git a/frogpilot/third_party/werkzeug/_reloader.py b/starpilot/third_party/werkzeug/_reloader.py similarity index 100% rename from frogpilot/third_party/werkzeug/_reloader.py rename to starpilot/third_party/werkzeug/_reloader.py diff --git a/frogpilot/third_party/werkzeug/datastructures/__init__.py b/starpilot/third_party/werkzeug/datastructures/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/__init__.py rename to starpilot/third_party/werkzeug/datastructures/__init__.py diff --git a/frogpilot/third_party/werkzeug/datastructures/accept.py b/starpilot/third_party/werkzeug/datastructures/accept.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/accept.py rename to starpilot/third_party/werkzeug/datastructures/accept.py diff --git a/frogpilot/third_party/werkzeug/datastructures/auth.py b/starpilot/third_party/werkzeug/datastructures/auth.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/auth.py rename to starpilot/third_party/werkzeug/datastructures/auth.py diff --git a/frogpilot/third_party/werkzeug/datastructures/cache_control.py b/starpilot/third_party/werkzeug/datastructures/cache_control.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/cache_control.py rename to starpilot/third_party/werkzeug/datastructures/cache_control.py diff --git a/frogpilot/third_party/werkzeug/datastructures/csp.py b/starpilot/third_party/werkzeug/datastructures/csp.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/csp.py rename to starpilot/third_party/werkzeug/datastructures/csp.py diff --git a/frogpilot/third_party/werkzeug/datastructures/etag.py b/starpilot/third_party/werkzeug/datastructures/etag.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/etag.py rename to starpilot/third_party/werkzeug/datastructures/etag.py diff --git a/frogpilot/third_party/werkzeug/datastructures/file_storage.py b/starpilot/third_party/werkzeug/datastructures/file_storage.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/file_storage.py rename to starpilot/third_party/werkzeug/datastructures/file_storage.py diff --git a/frogpilot/third_party/werkzeug/datastructures/headers.py b/starpilot/third_party/werkzeug/datastructures/headers.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/headers.py rename to starpilot/third_party/werkzeug/datastructures/headers.py diff --git a/frogpilot/third_party/werkzeug/datastructures/mixins.py b/starpilot/third_party/werkzeug/datastructures/mixins.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/mixins.py rename to starpilot/third_party/werkzeug/datastructures/mixins.py diff --git a/frogpilot/third_party/werkzeug/datastructures/range.py b/starpilot/third_party/werkzeug/datastructures/range.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/range.py rename to starpilot/third_party/werkzeug/datastructures/range.py diff --git a/frogpilot/third_party/werkzeug/datastructures/structures.py b/starpilot/third_party/werkzeug/datastructures/structures.py similarity index 100% rename from frogpilot/third_party/werkzeug/datastructures/structures.py rename to starpilot/third_party/werkzeug/datastructures/structures.py diff --git a/frogpilot/third_party/werkzeug/debug/__init__.py b/starpilot/third_party/werkzeug/debug/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/debug/__init__.py rename to starpilot/third_party/werkzeug/debug/__init__.py diff --git a/frogpilot/third_party/werkzeug/debug/console.py b/starpilot/third_party/werkzeug/debug/console.py similarity index 100% rename from frogpilot/third_party/werkzeug/debug/console.py rename to starpilot/third_party/werkzeug/debug/console.py diff --git a/frogpilot/third_party/werkzeug/debug/repr.py b/starpilot/third_party/werkzeug/debug/repr.py similarity index 100% rename from frogpilot/third_party/werkzeug/debug/repr.py rename to starpilot/third_party/werkzeug/debug/repr.py diff --git a/frogpilot/third_party/werkzeug/debug/shared/ICON_LICENSE.md b/starpilot/third_party/werkzeug/debug/shared/ICON_LICENSE.md similarity index 100% rename from frogpilot/third_party/werkzeug/debug/shared/ICON_LICENSE.md rename to starpilot/third_party/werkzeug/debug/shared/ICON_LICENSE.md diff --git a/frogpilot/third_party/werkzeug/debug/shared/console.png b/starpilot/third_party/werkzeug/debug/shared/console.png similarity index 100% rename from frogpilot/third_party/werkzeug/debug/shared/console.png rename to starpilot/third_party/werkzeug/debug/shared/console.png diff --git a/frogpilot/third_party/werkzeug/debug/shared/debugger.js b/starpilot/third_party/werkzeug/debug/shared/debugger.js similarity index 100% rename from frogpilot/third_party/werkzeug/debug/shared/debugger.js rename to starpilot/third_party/werkzeug/debug/shared/debugger.js diff --git a/frogpilot/third_party/werkzeug/debug/shared/less.png b/starpilot/third_party/werkzeug/debug/shared/less.png similarity index 100% rename from frogpilot/third_party/werkzeug/debug/shared/less.png rename to starpilot/third_party/werkzeug/debug/shared/less.png diff --git a/frogpilot/third_party/werkzeug/debug/shared/more.png b/starpilot/third_party/werkzeug/debug/shared/more.png similarity index 100% rename from frogpilot/third_party/werkzeug/debug/shared/more.png rename to starpilot/third_party/werkzeug/debug/shared/more.png diff --git a/frogpilot/third_party/werkzeug/debug/shared/style.css b/starpilot/third_party/werkzeug/debug/shared/style.css similarity index 100% rename from frogpilot/third_party/werkzeug/debug/shared/style.css rename to starpilot/third_party/werkzeug/debug/shared/style.css diff --git a/frogpilot/third_party/werkzeug/debug/tbtools.py b/starpilot/third_party/werkzeug/debug/tbtools.py similarity index 100% rename from frogpilot/third_party/werkzeug/debug/tbtools.py rename to starpilot/third_party/werkzeug/debug/tbtools.py diff --git a/frogpilot/third_party/werkzeug/exceptions.py b/starpilot/third_party/werkzeug/exceptions.py similarity index 100% rename from frogpilot/third_party/werkzeug/exceptions.py rename to starpilot/third_party/werkzeug/exceptions.py diff --git a/frogpilot/third_party/werkzeug/formparser.py b/starpilot/third_party/werkzeug/formparser.py similarity index 100% rename from frogpilot/third_party/werkzeug/formparser.py rename to starpilot/third_party/werkzeug/formparser.py diff --git a/frogpilot/third_party/werkzeug/http.py b/starpilot/third_party/werkzeug/http.py similarity index 100% rename from frogpilot/third_party/werkzeug/http.py rename to starpilot/third_party/werkzeug/http.py diff --git a/frogpilot/third_party/werkzeug/local.py b/starpilot/third_party/werkzeug/local.py similarity index 100% rename from frogpilot/third_party/werkzeug/local.py rename to starpilot/third_party/werkzeug/local.py diff --git a/frogpilot/third_party/werkzeug/middleware/__init__.py b/starpilot/third_party/werkzeug/middleware/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/__init__.py rename to starpilot/third_party/werkzeug/middleware/__init__.py diff --git a/frogpilot/third_party/werkzeug/middleware/dispatcher.py b/starpilot/third_party/werkzeug/middleware/dispatcher.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/dispatcher.py rename to starpilot/third_party/werkzeug/middleware/dispatcher.py diff --git a/frogpilot/third_party/werkzeug/middleware/http_proxy.py b/starpilot/third_party/werkzeug/middleware/http_proxy.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/http_proxy.py rename to starpilot/third_party/werkzeug/middleware/http_proxy.py diff --git a/frogpilot/third_party/werkzeug/middleware/lint.py b/starpilot/third_party/werkzeug/middleware/lint.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/lint.py rename to starpilot/third_party/werkzeug/middleware/lint.py diff --git a/frogpilot/third_party/werkzeug/middleware/profiler.py b/starpilot/third_party/werkzeug/middleware/profiler.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/profiler.py rename to starpilot/third_party/werkzeug/middleware/profiler.py diff --git a/frogpilot/third_party/werkzeug/middleware/proxy_fix.py b/starpilot/third_party/werkzeug/middleware/proxy_fix.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/proxy_fix.py rename to starpilot/third_party/werkzeug/middleware/proxy_fix.py diff --git a/frogpilot/third_party/werkzeug/middleware/shared_data.py b/starpilot/third_party/werkzeug/middleware/shared_data.py similarity index 100% rename from frogpilot/third_party/werkzeug/middleware/shared_data.py rename to starpilot/third_party/werkzeug/middleware/shared_data.py diff --git a/frogpilot/third_party/werkzeug/py.typed b/starpilot/third_party/werkzeug/py.typed similarity index 100% rename from frogpilot/third_party/werkzeug/py.typed rename to starpilot/third_party/werkzeug/py.typed diff --git a/frogpilot/third_party/werkzeug/routing/__init__.py b/starpilot/third_party/werkzeug/routing/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/routing/__init__.py rename to starpilot/third_party/werkzeug/routing/__init__.py diff --git a/frogpilot/third_party/werkzeug/routing/converters.py b/starpilot/third_party/werkzeug/routing/converters.py similarity index 100% rename from frogpilot/third_party/werkzeug/routing/converters.py rename to starpilot/third_party/werkzeug/routing/converters.py diff --git a/frogpilot/third_party/werkzeug/routing/exceptions.py b/starpilot/third_party/werkzeug/routing/exceptions.py similarity index 100% rename from frogpilot/third_party/werkzeug/routing/exceptions.py rename to starpilot/third_party/werkzeug/routing/exceptions.py diff --git a/frogpilot/third_party/werkzeug/routing/map.py b/starpilot/third_party/werkzeug/routing/map.py similarity index 100% rename from frogpilot/third_party/werkzeug/routing/map.py rename to starpilot/third_party/werkzeug/routing/map.py diff --git a/frogpilot/third_party/werkzeug/routing/matcher.py b/starpilot/third_party/werkzeug/routing/matcher.py similarity index 100% rename from frogpilot/third_party/werkzeug/routing/matcher.py rename to starpilot/third_party/werkzeug/routing/matcher.py diff --git a/frogpilot/third_party/werkzeug/routing/rules.py b/starpilot/third_party/werkzeug/routing/rules.py similarity index 100% rename from frogpilot/third_party/werkzeug/routing/rules.py rename to starpilot/third_party/werkzeug/routing/rules.py diff --git a/frogpilot/third_party/werkzeug/sansio/__init__.py b/starpilot/third_party/werkzeug/sansio/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/sansio/__init__.py rename to starpilot/third_party/werkzeug/sansio/__init__.py diff --git a/frogpilot/third_party/werkzeug/sansio/http.py b/starpilot/third_party/werkzeug/sansio/http.py similarity index 100% rename from frogpilot/third_party/werkzeug/sansio/http.py rename to starpilot/third_party/werkzeug/sansio/http.py diff --git a/frogpilot/third_party/werkzeug/sansio/multipart.py b/starpilot/third_party/werkzeug/sansio/multipart.py similarity index 100% rename from frogpilot/third_party/werkzeug/sansio/multipart.py rename to starpilot/third_party/werkzeug/sansio/multipart.py diff --git a/frogpilot/third_party/werkzeug/sansio/request.py b/starpilot/third_party/werkzeug/sansio/request.py similarity index 100% rename from frogpilot/third_party/werkzeug/sansio/request.py rename to starpilot/third_party/werkzeug/sansio/request.py diff --git a/frogpilot/third_party/werkzeug/sansio/response.py b/starpilot/third_party/werkzeug/sansio/response.py similarity index 100% rename from frogpilot/third_party/werkzeug/sansio/response.py rename to starpilot/third_party/werkzeug/sansio/response.py diff --git a/frogpilot/third_party/werkzeug/sansio/utils.py b/starpilot/third_party/werkzeug/sansio/utils.py similarity index 100% rename from frogpilot/third_party/werkzeug/sansio/utils.py rename to starpilot/third_party/werkzeug/sansio/utils.py diff --git a/frogpilot/third_party/werkzeug/security.py b/starpilot/third_party/werkzeug/security.py similarity index 100% rename from frogpilot/third_party/werkzeug/security.py rename to starpilot/third_party/werkzeug/security.py diff --git a/frogpilot/third_party/werkzeug/serving.py b/starpilot/third_party/werkzeug/serving.py similarity index 100% rename from frogpilot/third_party/werkzeug/serving.py rename to starpilot/third_party/werkzeug/serving.py diff --git a/frogpilot/third_party/werkzeug/test.py b/starpilot/third_party/werkzeug/test.py similarity index 100% rename from frogpilot/third_party/werkzeug/test.py rename to starpilot/third_party/werkzeug/test.py diff --git a/frogpilot/third_party/werkzeug/testapp.py b/starpilot/third_party/werkzeug/testapp.py similarity index 100% rename from frogpilot/third_party/werkzeug/testapp.py rename to starpilot/third_party/werkzeug/testapp.py diff --git a/frogpilot/third_party/werkzeug/urls.py b/starpilot/third_party/werkzeug/urls.py similarity index 100% rename from frogpilot/third_party/werkzeug/urls.py rename to starpilot/third_party/werkzeug/urls.py diff --git a/frogpilot/third_party/werkzeug/user_agent.py b/starpilot/third_party/werkzeug/user_agent.py similarity index 100% rename from frogpilot/third_party/werkzeug/user_agent.py rename to starpilot/third_party/werkzeug/user_agent.py diff --git a/frogpilot/third_party/werkzeug/utils.py b/starpilot/third_party/werkzeug/utils.py similarity index 100% rename from frogpilot/third_party/werkzeug/utils.py rename to starpilot/third_party/werkzeug/utils.py diff --git a/frogpilot/third_party/werkzeug/wrappers/__init__.py b/starpilot/third_party/werkzeug/wrappers/__init__.py similarity index 100% rename from frogpilot/third_party/werkzeug/wrappers/__init__.py rename to starpilot/third_party/werkzeug/wrappers/__init__.py diff --git a/frogpilot/third_party/werkzeug/wrappers/request.py b/starpilot/third_party/werkzeug/wrappers/request.py similarity index 100% rename from frogpilot/third_party/werkzeug/wrappers/request.py rename to starpilot/third_party/werkzeug/wrappers/request.py diff --git a/frogpilot/third_party/werkzeug/wrappers/response.py b/starpilot/third_party/werkzeug/wrappers/response.py similarity index 100% rename from frogpilot/third_party/werkzeug/wrappers/response.py rename to starpilot/third_party/werkzeug/wrappers/response.py diff --git a/frogpilot/third_party/werkzeug/wsgi.py b/starpilot/third_party/werkzeug/wsgi.py similarity index 100% rename from frogpilot/third_party/werkzeug/wsgi.py rename to starpilot/third_party/werkzeug/wsgi.py diff --git a/frogpilot/tinygrad_modeld/__init__.py b/starpilot/tinygrad_modeld/__init__.py similarity index 100% rename from frogpilot/tinygrad_modeld/__init__.py rename to starpilot/tinygrad_modeld/__init__.py diff --git a/frogpilot/tinygrad_modeld/constants.py b/starpilot/tinygrad_modeld/constants.py similarity index 100% rename from frogpilot/tinygrad_modeld/constants.py rename to starpilot/tinygrad_modeld/constants.py diff --git a/frogpilot/tinygrad_modeld/dmonitoringmodeld.py b/starpilot/tinygrad_modeld/dmonitoringmodeld.py similarity index 99% rename from frogpilot/tinygrad_modeld/dmonitoringmodeld.py rename to starpilot/tinygrad_modeld/dmonitoringmodeld.py index 56b071db..3b767577 100644 --- a/frogpilot/tinygrad_modeld/dmonitoringmodeld.py +++ b/starpilot/tinygrad_modeld/dmonitoringmodeld.py @@ -20,7 +20,7 @@ from openpilot.selfdrive.modeld.parse_model_outputs import sigmoid, safe_exp from openpilot.selfdrive.modeld.models.commonmodel_pyx import CLContext, MonitoringModelFrame from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address -PROCESS_NAME = "frogpilot.tinygrad_modeld.dmonitoringmodeld" +PROCESS_NAME = "starpilot.tinygrad_modeld.dmonitoringmodeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') MODEL_PKL_PATH = Path(__file__).resolve().parents[2] / "selfdrive/modeld/models/dmonitoring_model_tinygrad.pkl" METADATA_PATH = Path(__file__).parent / "models/dmonitoring_model_metadata.pkl" diff --git a/frogpilot/tinygrad_modeld/fill_model_msg.py b/starpilot/tinygrad_modeld/fill_model_msg.py similarity index 99% rename from frogpilot/tinygrad_modeld/fill_model_msg.py rename to starpilot/tinygrad_modeld/fill_model_msg.py index c09d9c33..9db7d54f 100644 --- a/frogpilot/tinygrad_modeld/fill_model_msg.py +++ b/starpilot/tinygrad_modeld/fill_model_msg.py @@ -2,7 +2,7 @@ import os import capnp import numpy as np from cereal import log -from openpilot.frogpilot.tinygrad_modeld.constants import ModelConstants, Plan, Meta +from openpilot.starpilot.tinygrad_modeld.constants import ModelConstants, Plan, Meta from openpilot.selfdrive.controls.lib.drive_helpers import get_curvature_from_plan SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') diff --git a/frogpilot/tinygrad_modeld/get_model_metadata.py b/starpilot/tinygrad_modeld/get_model_metadata.py similarity index 100% rename from frogpilot/tinygrad_modeld/get_model_metadata.py rename to starpilot/tinygrad_modeld/get_model_metadata.py diff --git a/frogpilot/tinygrad_modeld/models/README.md b/starpilot/tinygrad_modeld/models/README.md similarity index 100% rename from frogpilot/tinygrad_modeld/models/README.md rename to starpilot/tinygrad_modeld/models/README.md diff --git a/frogpilot/tinygrad_modeld/models/__init__.py b/starpilot/tinygrad_modeld/models/__init__.py similarity index 100% rename from frogpilot/tinygrad_modeld/models/__init__.py rename to starpilot/tinygrad_modeld/models/__init__.py diff --git a/frogpilot/tinygrad_modeld/models/big_driving_policy.onnx b/starpilot/tinygrad_modeld/models/big_driving_policy.onnx similarity index 100% rename from frogpilot/tinygrad_modeld/models/big_driving_policy.onnx rename to starpilot/tinygrad_modeld/models/big_driving_policy.onnx diff --git a/frogpilot/tinygrad_modeld/models/big_driving_vision.onnx b/starpilot/tinygrad_modeld/models/big_driving_vision.onnx similarity index 100% rename from frogpilot/tinygrad_modeld/models/big_driving_vision.onnx rename to starpilot/tinygrad_modeld/models/big_driving_vision.onnx diff --git a/frogpilot/tinygrad_modeld/models/commonmodel.cc b/starpilot/tinygrad_modeld/models/commonmodel.cc similarity index 100% rename from frogpilot/tinygrad_modeld/models/commonmodel.cc rename to starpilot/tinygrad_modeld/models/commonmodel.cc diff --git a/frogpilot/tinygrad_modeld/models/commonmodel.h b/starpilot/tinygrad_modeld/models/commonmodel.h similarity index 100% rename from frogpilot/tinygrad_modeld/models/commonmodel.h rename to starpilot/tinygrad_modeld/models/commonmodel.h diff --git a/frogpilot/tinygrad_modeld/models/commonmodel.pxd b/starpilot/tinygrad_modeld/models/commonmodel.pxd similarity index 100% rename from frogpilot/tinygrad_modeld/models/commonmodel.pxd rename to starpilot/tinygrad_modeld/models/commonmodel.pxd diff --git a/frogpilot/tinygrad_modeld/models/commonmodel_pyx.cpp b/starpilot/tinygrad_modeld/models/commonmodel_pyx.cpp similarity index 100% rename from frogpilot/tinygrad_modeld/models/commonmodel_pyx.cpp rename to starpilot/tinygrad_modeld/models/commonmodel_pyx.cpp diff --git a/frogpilot/tinygrad_modeld/models/commonmodel_pyx.pxd b/starpilot/tinygrad_modeld/models/commonmodel_pyx.pxd similarity index 100% rename from frogpilot/tinygrad_modeld/models/commonmodel_pyx.pxd rename to starpilot/tinygrad_modeld/models/commonmodel_pyx.pxd diff --git a/frogpilot/tinygrad_modeld/models/commonmodel_pyx.pyx b/starpilot/tinygrad_modeld/models/commonmodel_pyx.pyx similarity index 100% rename from frogpilot/tinygrad_modeld/models/commonmodel_pyx.pyx rename to starpilot/tinygrad_modeld/models/commonmodel_pyx.pyx diff --git a/frogpilot/tinygrad_modeld/models/dm_warp_1344x760_tinygrad.pkl b/starpilot/tinygrad_modeld/models/dm_warp_1344x760_tinygrad.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/dm_warp_1344x760_tinygrad.pkl rename to starpilot/tinygrad_modeld/models/dm_warp_1344x760_tinygrad.pkl diff --git a/frogpilot/tinygrad_modeld/models/dm_warp_1928x1208_tinygrad.pkl b/starpilot/tinygrad_modeld/models/dm_warp_1928x1208_tinygrad.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/dm_warp_1928x1208_tinygrad.pkl rename to starpilot/tinygrad_modeld/models/dm_warp_1928x1208_tinygrad.pkl diff --git a/frogpilot/tinygrad_modeld/models/dmonitoring_model.onnx b/starpilot/tinygrad_modeld/models/dmonitoring_model.onnx similarity index 100% rename from frogpilot/tinygrad_modeld/models/dmonitoring_model.onnx rename to starpilot/tinygrad_modeld/models/dmonitoring_model.onnx diff --git a/frogpilot/tinygrad_modeld/models/dmonitoring_model_metadata.pkl b/starpilot/tinygrad_modeld/models/dmonitoring_model_metadata.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/dmonitoring_model_metadata.pkl rename to starpilot/tinygrad_modeld/models/dmonitoring_model_metadata.pkl diff --git a/frogpilot/tinygrad_modeld/models/driving_policy.onnx b/starpilot/tinygrad_modeld/models/driving_policy.onnx similarity index 100% rename from frogpilot/tinygrad_modeld/models/driving_policy.onnx rename to starpilot/tinygrad_modeld/models/driving_policy.onnx diff --git a/frogpilot/tinygrad_modeld/models/driving_policy_metadata.pkl b/starpilot/tinygrad_modeld/models/driving_policy_metadata.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/driving_policy_metadata.pkl rename to starpilot/tinygrad_modeld/models/driving_policy_metadata.pkl diff --git a/frogpilot/tinygrad_modeld/models/driving_vision.onnx b/starpilot/tinygrad_modeld/models/driving_vision.onnx similarity index 100% rename from frogpilot/tinygrad_modeld/models/driving_vision.onnx rename to starpilot/tinygrad_modeld/models/driving_vision.onnx diff --git a/frogpilot/tinygrad_modeld/models/driving_vision_metadata.pkl b/starpilot/tinygrad_modeld/models/driving_vision_metadata.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/driving_vision_metadata.pkl rename to starpilot/tinygrad_modeld/models/driving_vision_metadata.pkl diff --git a/frogpilot/tinygrad_modeld/models/warp_1344x760_tinygrad.pkl b/starpilot/tinygrad_modeld/models/warp_1344x760_tinygrad.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/warp_1344x760_tinygrad.pkl rename to starpilot/tinygrad_modeld/models/warp_1344x760_tinygrad.pkl diff --git a/frogpilot/tinygrad_modeld/models/warp_1928x1208_tinygrad.pkl b/starpilot/tinygrad_modeld/models/warp_1928x1208_tinygrad.pkl similarity index 100% rename from frogpilot/tinygrad_modeld/models/warp_1928x1208_tinygrad.pkl rename to starpilot/tinygrad_modeld/models/warp_1928x1208_tinygrad.pkl diff --git a/frogpilot/tinygrad_modeld/parse_model_outputs.py b/starpilot/tinygrad_modeld/parse_model_outputs.py similarity index 99% rename from frogpilot/tinygrad_modeld/parse_model_outputs.py rename to starpilot/tinygrad_modeld/parse_model_outputs.py index 15751d09..aa8054b5 100644 --- a/frogpilot/tinygrad_modeld/parse_model_outputs.py +++ b/starpilot/tinygrad_modeld/parse_model_outputs.py @@ -1,5 +1,5 @@ import numpy as np -from openpilot.frogpilot.tinygrad_modeld.constants import ModelConstants +from openpilot.starpilot.tinygrad_modeld.constants import ModelConstants def safe_exp(x, out=None): diff --git a/frogpilot/tinygrad_modeld/runners/tinygrad_helpers.py b/starpilot/tinygrad_modeld/runners/tinygrad_helpers.py similarity index 100% rename from frogpilot/tinygrad_modeld/runners/tinygrad_helpers.py rename to starpilot/tinygrad_modeld/runners/tinygrad_helpers.py diff --git a/frogpilot/tinygrad_modeld/tinygrad_modeld.py b/starpilot/tinygrad_modeld/tinygrad_modeld.py similarity index 96% rename from frogpilot/tinygrad_modeld/tinygrad_modeld.py rename to starpilot/tinygrad_modeld/tinygrad_modeld.py index 12a25776..6454a3e2 100755 --- a/frogpilot/tinygrad_modeld/tinygrad_modeld.py +++ b/starpilot/tinygrad_modeld/tinygrad_modeld.py @@ -23,18 +23,18 @@ from openpilot.system import sentry from opendbc.car.car_helpers import get_demo_car_params from openpilot.selfdrive.controls.lib.desire_helper import DesireHelper from openpilot.selfdrive.controls.lib.drive_helpers import get_accel_from_plan_tomb_raider, smooth_value -from openpilot.frogpilot.tinygrad_modeld.parse_model_outputs import Parser -from openpilot.frogpilot.tinygrad_modeld.fill_model_msg import fill_model_msg, fill_pose_msg, PublishState, get_curvature_from_output -from openpilot.frogpilot.tinygrad_modeld.constants import ModelConstants, Plan +from openpilot.starpilot.tinygrad_modeld.parse_model_outputs import Parser +from openpilot.starpilot.tinygrad_modeld.fill_model_msg import fill_model_msg, fill_pose_msg, PublishState, get_curvature_from_output +from openpilot.starpilot.tinygrad_modeld.constants import ModelConstants, Plan try: from openpilot.selfdrive.modeld.models.commonmodel_pyx import DrivingModelFrame, CLContext except ImportError: - from openpilot.frogpilot.tinygrad_modeld.models.commonmodel_pyx import DrivingModelFrame, CLContext -from openpilot.frogpilot.tinygrad_modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles, MODELS_PATH, params_memory + from openpilot.starpilot.tinygrad_modeld.models.commonmodel_pyx import DrivingModelFrame, CLContext +from openpilot.starpilot.tinygrad_modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles, MODELS_PATH, params_memory -PROCESS_NAME = "frogpilot.tinygrad_modeld.tinygrad_modeld" +PROCESS_NAME = "starpilot.tinygrad_modeld.tinygrad_modeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') BUILTIN_MODEL_KEY = "sc2" @@ -69,10 +69,10 @@ def _canonical_model_id(model_id: str) -> str: def get_action_from_model(model_output: dict[str, np.ndarray], prev_action: log.ModelDataV2.Action, - lat_action_t: float, long_action_t: float, v_ego: float, mlsim: bool, is_v9: bool, frogpilot_toggles) -> log.ModelDataV2.Action: + lat_action_t: float, long_action_t: float, v_ego: float, mlsim: bool, is_v9: bool, starpilot_toggles) -> log.ModelDataV2.Action: plan = model_output['plan'][0] if 'planplus' in model_output: - recovery_power = getattr(frogpilot_toggles, "recovery_power", 1.0) + recovery_power = getattr(starpilot_toggles, "recovery_power", 1.0) plan = plan + recovery_power * model_output['planplus'][0] cloudlog.error(f"planplus applied: shape {model_output['planplus'].shape}, RECOVERY_POWER {recovery_power}") desired_accel, should_stop = get_accel_from_plan_tomb_raider(plan[:,Plan.VELOCITY][:,0], @@ -196,7 +196,7 @@ class ModelState: ) cloudlog.error(f"Missing model artifact {path}, downloading {model_download_id}...") - from openpilot.frogpilot.assets.model_manager import ModelManager + from openpilot.starpilot.assets.model_manager import ModelManager ModelManager(params, params_memory).download_model(model_download_id) if path.is_file(): @@ -451,8 +451,8 @@ def main(demo=False): cloudlog.warning(f"connected extra cam with buffer size: {vipc_client_extra.buffer_len} ({vipc_client_extra.width} x {vipc_client_extra.height})") # messaging - pm = PubMaster(["modelV2", "drivingModelData", "cameraOdometry", "frogpilotModelV2"]) - sm = SubMaster(["deviceState", "carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "carControl", "liveDelay", "frogpilotPlan"]) + pm = PubMaster(["modelV2", "drivingModelData", "cameraOdometry", "starpilotModelV2"]) + sm = SubMaster(["deviceState", "carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "carControl", "liveDelay", "starpilotPlan"]) publish_state = PublishState() params = Params() @@ -484,8 +484,8 @@ def main(demo=False): DH = DesireHelper() - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + starpilot_toggles = get_starpilot_toggles(sm) while True: # Keep receiving frames until we are at least 1 frame ahead of previous extra frame @@ -572,11 +572,11 @@ def main(demo=False): if model_output is not None: modelv2_send = messaging.new_message('modelV2') - frogpilot_modelv2_send = messaging.new_message('frogpilotModelV2') + starpilot_modelv2_send = messaging.new_message('starpilotModelV2') drivingdata_send = messaging.new_message('drivingModelData') posenet_send = messaging.new_message('cameraOdometry') - action = get_action_from_model(model_output, prev_action, lat_delay + DT_MDL, long_delay + DT_MDL, v_ego, model.mlsim, model.is_v9, frogpilot_toggles) + action = get_action_from_model(model_output, prev_action, lat_delay + DT_MDL, long_delay + DT_MDL, v_ego, model.mlsim, model.is_v9, starpilot_toggles) prev_action = action fill_model_msg(drivingdata_send, modelv2_send, model_output, action, publish_state, meta_main.frame_id, meta_extra.frame_id, frame_id, @@ -586,23 +586,23 @@ def main(demo=False): l_lane_change_prob = desire_state[log.Desire.laneChangeLeft] r_lane_change_prob = desire_state[log.Desire.laneChangeRight] lane_change_prob = l_lane_change_prob + r_lane_change_prob - DH.update(sm['carState'], sm['carControl'].latActive, lane_change_prob, sm['frogpilotPlan'], frogpilot_toggles) + DH.update(sm['carState'], sm['carControl'].latActive, lane_change_prob, sm['starpilotPlan'], starpilot_toggles) modelv2_send.modelV2.meta.laneChangeState = DH.lane_change_state modelv2_send.modelV2.meta.laneChangeDirection = DH.lane_change_direction - frogpilot_modelv2_send.frogpilotModelV2.turnDirection = DH.turn_direction + starpilot_modelv2_send.starpilotModelV2.turnDirection = DH.turn_direction drivingdata_send.drivingModelData.meta.laneChangeState = DH.lane_change_state drivingdata_send.drivingModelData.meta.laneChangeDirection = DH.lane_change_direction fill_pose_msg(posenet_send, model_output, meta_main.frame_id, vipc_dropped_frames, meta_main.timestamp_eof, live_calib_seen) pm.send('modelV2', modelv2_send) - pm.send('frogpilotModelV2', frogpilot_modelv2_send) + pm.send('starpilotModelV2', starpilot_modelv2_send) pm.send('drivingModelData', drivingdata_send) pm.send('cameraOdometry', posenet_send) last_vipc_frame_id = meta_main.frame_id - # Update FrogPilot parameters - if sm.updated['frogpilotPlan']: - frogpilot_toggles = get_frogpilot_toggles(sm) + # Update StarPilot parameters + if sm.updated['starpilotPlan']: + starpilot_toggles = get_starpilot_toggles(sm) if __name__ == "__main__": try: diff --git a/frogpilot/tinygrad_modeld/transforms/loadyuv.cc b/starpilot/tinygrad_modeld/transforms/loadyuv.cc similarity index 98% rename from frogpilot/tinygrad_modeld/transforms/loadyuv.cc rename to starpilot/tinygrad_modeld/transforms/loadyuv.cc index 4b03b9f2..1fab0327 100644 --- a/frogpilot/tinygrad_modeld/transforms/loadyuv.cc +++ b/starpilot/tinygrad_modeld/transforms/loadyuv.cc @@ -1,4 +1,4 @@ -#include "frogpilot/tinygrad_modeld/transforms/loadyuv.h" +#include "starpilot/tinygrad_modeld/transforms/loadyuv.h" #include #include diff --git a/frogpilot/tinygrad_modeld/transforms/loadyuv.cl b/starpilot/tinygrad_modeld/transforms/loadyuv.cl similarity index 100% rename from frogpilot/tinygrad_modeld/transforms/loadyuv.cl rename to starpilot/tinygrad_modeld/transforms/loadyuv.cl diff --git a/frogpilot/tinygrad_modeld/transforms/loadyuv.h b/starpilot/tinygrad_modeld/transforms/loadyuv.h similarity index 100% rename from frogpilot/tinygrad_modeld/transforms/loadyuv.h rename to starpilot/tinygrad_modeld/transforms/loadyuv.h diff --git a/frogpilot/tinygrad_modeld/transforms/transform.cc b/starpilot/tinygrad_modeld/transforms/transform.cc similarity index 98% rename from frogpilot/tinygrad_modeld/transforms/transform.cc rename to starpilot/tinygrad_modeld/transforms/transform.cc index a1648bf2..70f0b8b2 100644 --- a/frogpilot/tinygrad_modeld/transforms/transform.cc +++ b/starpilot/tinygrad_modeld/transforms/transform.cc @@ -1,4 +1,4 @@ -#include "frogpilot/tinygrad_modeld/transforms/transform.h" +#include "starpilot/tinygrad_modeld/transforms/transform.h" #include #include diff --git a/frogpilot/tinygrad_modeld/transforms/transform.cl b/starpilot/tinygrad_modeld/transforms/transform.cl similarity index 100% rename from frogpilot/tinygrad_modeld/transforms/transform.cl rename to starpilot/tinygrad_modeld/transforms/transform.cl diff --git a/frogpilot/tinygrad_modeld/transforms/transform.h b/starpilot/tinygrad_modeld/transforms/transform.h similarity index 100% rename from frogpilot/tinygrad_modeld/transforms/transform.h rename to starpilot/tinygrad_modeld/transforms/transform.h diff --git a/frogpilot/tools/compile_models.py b/starpilot/tools/compile_models.py similarity index 86% rename from frogpilot/tools/compile_models.py rename to starpilot/tools/compile_models.py index 1e22cf6a..22829ecd 100644 --- a/frogpilot/tools/compile_models.py +++ b/starpilot/tools/compile_models.py @@ -7,12 +7,12 @@ from pathlib import Path from openpilot.common.basedir import BASEDIR -from openpilot.frogpilot.common.frogpilot_download_utilities import download_file, verify_download -from openpilot.frogpilot.assets.model_manager import CANCEL_DOWNLOAD_PARAM, DOWNLOAD_PROGRESS_PARAM, MODEL_DOWNLOAD_PARAM -from openpilot.frogpilot.common.frogpilot_utilities import delete_file, run_cmd -from openpilot.frogpilot.common.frogpilot_variables import MODELS_PATH, RESOURCES_REPO +from openpilot.starpilot.common.starpilot_download_utilities import download_file, verify_download +from openpilot.starpilot.assets.model_manager import CANCEL_DOWNLOAD_PARAM, DOWNLOAD_PROGRESS_PARAM, MODEL_DOWNLOAD_PARAM +from openpilot.starpilot.common.starpilot_utilities import delete_file, run_cmd +from openpilot.starpilot.common.starpilot_variables import MODELS_PATH, RESOURCES_REPO -METADATA_SCRIPT = Path(BASEDIR) / "frogpilot/tinygrad_modeld/get_model_metadata.py" +METADATA_SCRIPT = Path(BASEDIR) / "starpilot/tinygrad_modeld/get_model_metadata.py" TINYGRAD_REPO_PATH = Path(BASEDIR) / "tinygrad_repo" MODELS_SOURCE = f"https://api.github.com/repos/{RESOURCES_REPO}/contents/uncompiled?ref=Models" @@ -47,7 +47,7 @@ def compile_model(onnx_path): def download_models(): session = requests.Session() session.headers.update({"Accept-Language": "en"}) - session.headers.update({"User-Agent": "frogpilot-model-compiler/1.0 (https://github.com/FrogAi/FrogPilot)"}) + session.headers.update({"User-Agent": "starpilot-model-compiler/1.0 (https://github.com/FrogAi/StarPilot)"}) COMPILED_DIR.mkdir(parents=True, exist_ok=True) UNCOMPILED_DIR.mkdir(parents=True, exist_ok=True) diff --git a/frogpilot/ui/moc_frogpilot_ui.cc b/starpilot/ui/moc_starpilot_ui.cc similarity index 71% rename from frogpilot/ui/moc_frogpilot_ui.cc rename to starpilot/ui/moc_starpilot_ui.cc index 91d34f0f..53bf7845 100644 --- a/frogpilot/ui/moc_frogpilot_ui.cc +++ b/starpilot/ui/moc_starpilot_ui.cc @@ -1,16 +1,16 @@ /**************************************************************************** -** Meta object code from reading C++ file 'frogpilot_ui.h' +** Meta object code from reading C++ file 'starpilot_ui.h' ** ** Created by: The Qt Meta Object Compiler version 67 (Qt 5.12.8) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ -#include "frogpilot_ui.h" +#include "starpilot_ui.h" #include #include #if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'frogpilot_ui.h' doesn't include ." +#error "The header file 'starpilot_ui.h' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 67 #error "This file was generated using the moc from 5.12.8. It" #error "cannot be used with the include files from this version of Qt." @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotUIState_t { +struct qt_meta_stringdata_StarPilotUIState_t { QByteArrayData data[3]; char stringdata0[31]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotUIState_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotUIState_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotUIState_t qt_meta_stringdata_FrogPilotUIState = { +static const qt_meta_stringdata_StarPilotUIState_t qt_meta_stringdata_StarPilotUIState = { { -QT_MOC_LITERAL(0, 0, 16), // "FrogPilotUIState" +QT_MOC_LITERAL(0, 0, 16), // "StarPilotUIState" QT_MOC_LITERAL(1, 17, 12), // "themeUpdated" QT_MOC_LITERAL(2, 30, 0) // "" }, - "FrogPilotUIState\0themeUpdated\0" + "StarPilotUIState\0themeUpdated\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotUIState[] = { +static const uint qt_meta_data_StarPilotUIState[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotUIState[] = { 0 // eod }; -void FrogPilotUIState::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotUIState::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->themeUpdated(); break; @@ -74,8 +74,8 @@ void FrogPilotUIState::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotUIState::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotUIState::themeUpdated)) { + using _t = void (StarPilotUIState::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotUIState::themeUpdated)) { *result = 0; return; } @@ -84,30 +84,30 @@ void FrogPilotUIState::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotUIState::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotUIState::staticMetaObject = { { &QObject::staticMetaObject, - qt_meta_stringdata_FrogPilotUIState.data, - qt_meta_data_FrogPilotUIState, + qt_meta_stringdata_StarPilotUIState.data, + qt_meta_data_StarPilotUIState, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotUIState::metaObject() const +const QMetaObject *StarPilotUIState::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotUIState::qt_metacast(const char *_clname) +void *StarPilotUIState::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotUIState.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotUIState.stringdata0)) return static_cast(this); return QObject::qt_metacast(_clname); } -int FrogPilotUIState::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotUIState::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QObject::qt_metacall(_c, _id, _a); if (_id < 0) @@ -125,7 +125,7 @@ int FrogPilotUIState::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotUIState::themeUpdated() +void StarPilotUIState::themeUpdated() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/data_settings.cc b/starpilot/ui/qt/offroad/data_settings.cc similarity index 87% rename from frogpilot/ui/qt/offroad/data_settings.cc rename to starpilot/ui/qt/offroad/data_settings.cc index aedb240e..3774a928 100644 --- a/frogpilot/ui/qt/offroad/data_settings.cc +++ b/starpilot/ui/qt/offroad/data_settings.cc @@ -1,6 +1,6 @@ #include -#include "frogpilot/ui/qt/offroad/data_settings.h" +#include "starpilot/ui/qt/offroad/data_settings.h" namespace { bool isPathPreserved(const char *path) { @@ -14,17 +14,17 @@ bool isPathPreserved(const char *path) { } } // namespace -FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotDataPanel::StarPilotDataPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *dataLayout = new QStackedLayout(); addItem(dataLayout); - FrogPilotListWidget *dataMainList = new FrogPilotListWidget(this); + StarPilotListWidget *dataMainList = new StarPilotListWidget(this); ScrollView *dataMainPanel = new ScrollView(dataMainList, this); dataLayout->addWidget(dataMainPanel); - FrogPilotListWidget *statsLabelsList = new FrogPilotListWidget(this); + StarPilotListWidget *statsLabelsList = new StarPilotListWidget(this); ScrollView *statsLabelsPanel = new ScrollView(statsLabelsList, this); dataLayout->addWidget(statsLabelsPanel); @@ -97,8 +97,8 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } dataMainList->addItem(deleteErrorLogsButton); - FrogPilotButtonsControl *screenRecordingsButton = new FrogPilotButtonsControl(tr("Screen Recordings"), tr("Delete or rename screen recordings."), "", {tr("DELETE"), tr("DELETE ALL"), tr("RENAME")}); - QObject::connect(screenRecordingsButton, &FrogPilotButtonsControl::buttonClicked, [=](int id) { + StarPilotButtonsControl *screenRecordingsButton = new StarPilotButtonsControl(tr("Screen Recordings"), tr("Delete or rename screen recordings."), "", {tr("DELETE"), tr("DELETE ALL"), tr("RENAME")}); + QObject::connect(screenRecordingsButton, &StarPilotButtonsControl::buttonClicked, [=](int id) { QDir recordingsDir("/data/media/screen_recordings"); QStringList recordingsNames = recordingsDir.entryList(QDir::Files | QDir::NoDotAndDotDot); std::sort(recordingsNames.begin(), recordingsNames.end(), std::greater()); @@ -247,8 +247,8 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } dataMainList->addItem(screenRecordingsButton); - FrogPilotButtonsControl *frogpilotBackupButton = new FrogPilotButtonsControl(tr("FrogPilot Backups"), tr("Create, delete, or restore FrogPilot backups."), "", {tr("BACKUP"), tr("DELETE"), tr("DELETE ALL"), tr("RESTORE")}); - QObject::connect(frogpilotBackupButton, &FrogPilotButtonsControl::buttonClicked, [=](int id) { + StarPilotButtonsControl *starpilotBackupButton = new StarPilotButtonsControl(tr("StarPilot Backups"), tr("Create, delete, or restore StarPilot backups."), "", {tr("BACKUP"), tr("DELETE"), tr("DELETE ALL"), tr("RESTORE")}); + QObject::connect(starpilotBackupButton, &StarPilotButtonsControl::buttonClicked, [=](int id) { QDir backupDir("/data/backups"); QFileInfoList backupList = backupDir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot); @@ -312,25 +312,25 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for std::thread([=]() { parent->keepScreenOn = true; - frogpilotBackupButton->setEnabled(false); - frogpilotBackupButton->setValue(tr("Backing up...")); + starpilotBackupButton->setEnabled(false); + starpilotBackupButton->setValue(tr("Backing up...")); - frogpilotBackupButton->setVisibleButton(1, false); - frogpilotBackupButton->setVisibleButton(2, false); - frogpilotBackupButton->setVisibleButton(3, false); + starpilotBackupButton->setVisibleButton(1, false); + starpilotBackupButton->setVisibleButton(2, false); + starpilotBackupButton->setVisibleButton(3, false); std::system(QString("tar --use-compress-program=zstd -cf %1 %2").arg(backupDir.absoluteFilePath(name + ".tar.zst"), "/data/openpilot").toStdString().c_str()); - frogpilotBackupButton->setValue(tr("Backup created!")); + starpilotBackupButton->setValue(tr("Backup created!")); util::sleep_for(2500); - frogpilotBackupButton->setEnabled(true); - frogpilotBackupButton->setValue(""); + starpilotBackupButton->setEnabled(true); + starpilotBackupButton->setValue(""); - frogpilotBackupButton->setVisibleButton(1, true); - frogpilotBackupButton->setVisibleButton(2, true); - frogpilotBackupButton->setVisibleButton(3, true); + starpilotBackupButton->setVisibleButton(1, true); + starpilotBackupButton->setVisibleButton(2, true); + starpilotBackupButton->setVisibleButton(3, true); parent->keepScreenOn = false; }).detach(); @@ -343,25 +343,25 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for std::thread([=]() { parent->keepScreenOn = true; - frogpilotBackupButton->setEnabled(false); - frogpilotBackupButton->setValue(tr("Deleting...")); + starpilotBackupButton->setEnabled(false); + starpilotBackupButton->setValue(tr("Deleting...")); - frogpilotBackupButton->setVisibleButton(0, false); - frogpilotBackupButton->setVisibleButton(2, false); - frogpilotBackupButton->setVisibleButton(3, false); + starpilotBackupButton->setVisibleButton(0, false); + starpilotBackupButton->setVisibleButton(2, false); + starpilotBackupButton->setVisibleButton(3, false); QFile::remove(backupDir.absoluteFilePath(backupMap[selection])); - frogpilotBackupButton->setValue(tr("Deleted!")); + starpilotBackupButton->setValue(tr("Deleted!")); util::sleep_for(2500); - frogpilotBackupButton->setEnabled(true); - frogpilotBackupButton->setValue(""); + starpilotBackupButton->setEnabled(true); + starpilotBackupButton->setValue(""); - frogpilotBackupButton->setVisibleButton(0, true); - frogpilotBackupButton->setVisibleButton(2, true); - frogpilotBackupButton->setVisibleButton(3, true); + starpilotBackupButton->setVisibleButton(0, true); + starpilotBackupButton->setVisibleButton(2, true); + starpilotBackupButton->setVisibleButton(3, true); parent->keepScreenOn = false; }).detach(); @@ -369,30 +369,30 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } } else if (id == 2) { - if (ConfirmationDialog::confirm(tr("Delete all FrogPilot backups?"), tr("Delete All"), this)) { + if (ConfirmationDialog::confirm(tr("Delete all StarPilot backups?"), tr("Delete All"), this)) { std::thread([=]() mutable { parent->keepScreenOn = true; - frogpilotBackupButton->setEnabled(false); - frogpilotBackupButton->setValue(tr("Deleting...")); + starpilotBackupButton->setEnabled(false); + starpilotBackupButton->setValue(tr("Deleting...")); - frogpilotBackupButton->setVisibleButton(0, false); - frogpilotBackupButton->setVisibleButton(1, false); - frogpilotBackupButton->setVisibleButton(3, false); + starpilotBackupButton->setVisibleButton(0, false); + starpilotBackupButton->setVisibleButton(1, false); + starpilotBackupButton->setVisibleButton(3, false); backupDir.removeRecursively(); backupDir.mkpath("."); - frogpilotBackupButton->setValue(tr("Deleted!")); + starpilotBackupButton->setValue(tr("Deleted!")); util::sleep_for(2500); - frogpilotBackupButton->setEnabled(true); - frogpilotBackupButton->setValue(""); + starpilotBackupButton->setEnabled(true); + starpilotBackupButton->setValue(""); - frogpilotBackupButton->setVisibleButton(0, true); - frogpilotBackupButton->setVisibleButton(1, true); - frogpilotBackupButton->setVisibleButton(3, true); + starpilotBackupButton->setVisibleButton(0, true); + starpilotBackupButton->setVisibleButton(1, true); + starpilotBackupButton->setVisibleButton(3, true); parent->keepScreenOn = false; }).detach(); @@ -401,25 +401,25 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } else if (id == 3) { QString selection = MultiOptionDialog::getSelection(tr("Choose a backup to restore"), friendlyNames, "", this); if (!selection.isEmpty()) { - if (FrogPilotConfirmationDialog::yesorno(tr("Restore this backup? This will overwrite your current installation and reboot the device."), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Restore this backup? This will overwrite your current installation and reboot the device."), this)) { std::thread([=]() { parent->keepScreenOn = true; - frogpilotBackupButton->setEnabled(false); - frogpilotBackupButton->setValue(tr("Restoring...")); + starpilotBackupButton->setEnabled(false); + starpilotBackupButton->setValue(tr("Restoring...")); - frogpilotBackupButton->setVisibleButton(0, false); - frogpilotBackupButton->setVisibleButton(1, false); - frogpilotBackupButton->setVisibleButton(2, false); + starpilotBackupButton->setVisibleButton(0, false); + starpilotBackupButton->setVisibleButton(1, false); + starpilotBackupButton->setVisibleButton(2, false); std::system(QString("rm -rf /data/openpilot/* && tar --use-compress-program=zstd -xf %1 -C /").arg(backupDir.absoluteFilePath(backupMap[selection])).toStdString().c_str()); QFile("/cache/on_backup").open(QIODevice::WriteOnly); - frogpilotBackupButton->setValue(tr("Restored!")); + starpilotBackupButton->setValue(tr("Restored!")); util::sleep_for(2500); - frogpilotBackupButton->setValue(tr("Rebooting...")); + starpilotBackupButton->setValue(tr("Rebooting...")); util::sleep_for(2500); @@ -430,12 +430,12 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } }); if (forceOpenDescriptions) { - frogpilotBackupButton->showDescription(); + starpilotBackupButton->showDescription(); } - dataMainList->addItem(frogpilotBackupButton); + dataMainList->addItem(starpilotBackupButton); - FrogPilotButtonsControl *toggleBackupButton = new FrogPilotButtonsControl(tr("Toggle Backups"), tr("Create, delete, or restore toggle backups."), "", {tr("BACKUP"), tr("DELETE"), tr("DELETE ALL"), tr("RESTORE")}); - QObject::connect(toggleBackupButton, &FrogPilotButtonsControl::buttonClicked, [=](int id) { + StarPilotButtonsControl *toggleBackupButton = new StarPilotButtonsControl(tr("Toggle Backups"), tr("Create, delete, or restore toggle backups."), "", {tr("BACKUP"), tr("DELETE"), tr("DELETE ALL"), tr("RESTORE")}); + QObject::connect(toggleBackupButton, &StarPilotButtonsControl::buttonClicked, [=](int id) { QDir backupDir("/data/toggle_backups"); QStringList backupNames = backupDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); @@ -580,7 +580,7 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } else if (id == 3) { QString selection = MultiOptionDialog::getSelection(tr("Choose a backup to restore"), backupMap.keys(), "", this); if (!selection.isEmpty()) { - if (FrogPilotConfirmationDialog::yesorno(tr("Restore this backup? This will overwrite your current settings!"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Restore this backup? This will overwrite your current settings!"), this)) { std::thread([=]() { parent->keepScreenOn = true; @@ -593,7 +593,7 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for std::system(QString("cp -r %1/* /data/params/d/").arg(backupDir.absoluteFilePath(backupMap[selection])).toStdString().c_str()); - updateFrogPilotToggles(); + updateStarPilotToggles(); toggleBackupButton->setValue(tr("Restored!")); @@ -617,11 +617,11 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } dataMainList->addItem(toggleBackupButton); - FrogPilotButtonsControl *viewStatsButton = new FrogPilotButtonsControl(tr("FrogPilot Stats"), tr("View your collected FrogPilot stats."), "", {tr("RESET"), tr("VIEW")}); - QObject::connect(viewStatsButton, &FrogPilotButtonsControl::buttonClicked, [dataLayout, statsLabelsPanel, this](int id) { + StarPilotButtonsControl *viewStatsButton = new StarPilotButtonsControl(tr("StarPilot Stats"), tr("View your collected StarPilot stats."), "", {tr("RESET"), tr("VIEW")}); + QObject::connect(viewStatsButton, &StarPilotButtonsControl::buttonClicked, [dataLayout, statsLabelsPanel, this](int id) { if (id == 0) { - if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all of your FrogPilot stats?"), tr("Reset"), this)) { - params.remove("FrogPilotStats"); + if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all of your StarPilot stats?"), tr("Reset"), this)) { + params.remove("StarPilotStats"); } } else if (id == 1) { emit openSubPanel(); @@ -633,10 +633,10 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for } dataMainList->addItem(viewStatsButton); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [dataLayout, dataMainPanel] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [dataLayout, dataMainPanel] { dataLayout->setCurrentWidget(dataMainPanel); }); - QObject::connect(parent, &FrogPilotSettingsWindow::updateMetric, [this](bool metric){isMetric = metric;}); + QObject::connect(parent, &StarPilotSettingsWindow::updateMetric, [this](bool metric){isMetric = metric;}); QObject::connect(uiState(), &UIState::offroadTransition, [statsLabelsList, this](bool offroad) { if (offroad) { updateStatsLabels(statsLabelsList); @@ -646,10 +646,10 @@ FrogPilotDataPanel::FrogPilotDataPanel(FrogPilotSettingsWindow *parent, bool for updateStatsLabels(statsLabelsList); } -void FrogPilotDataPanel::updateStatsLabels(FrogPilotListWidget *labelsList) { +void StarPilotDataPanel::updateStatsLabels(StarPilotListWidget *labelsList) { labelsList->clear(); - QJsonObject stats = QJsonDocument::fromJson(QByteArray::fromStdString(params.get("FrogPilotStats"))).object(); + QJsonObject stats = QJsonDocument::fromJson(QByteArray::fromStdString(params.get("StarPilotStats"))).object(); static QMap> keyMap = { {"AEBEvents", {tr("Total Emergency Brake Alerts"), "count"}}, @@ -662,9 +662,9 @@ void FrogPilotDataPanel::updateStatsLabels(FrogPilotListWidget *labelsList) { {"ExperimentalModeTime", {tr("Time Using \"Experimental Mode\""), "timePercent"}}, {"FrogChirps", {tr("Total Frog Chirps"), "count"}}, {"FrogHops", {tr("Total Frog Hops"), "count"}}, - {"FrogPilotDrives", {tr("Total Drives"), "count"}}, - {"FrogPilotMeters", {tr("Total Distance Driven"), "distance"}}, - {"FrogPilotSeconds", {tr("Total Driving Time"), "time"}}, + {"StarPilotDrives", {tr("Total Drives"), "count"}}, + {"StarPilotMeters", {tr("Total Distance Driven"), "distance"}}, + {"StarPilotSeconds", {tr("Total Driving Time"), "time"}}, {"FrogSqueaks", {tr("Total Frog Squeaks"), "count"}}, {"GoatScreams", {tr("Total Goat Screams"), "count"}}, {"LateralTime", {tr("Time Using Lateral Control"), "timePercent"}}, diff --git a/starpilot/ui/qt/offroad/data_settings.h b/starpilot/ui/qt/offroad/data_settings.h new file mode 100644 index 00000000..dc01c17c --- /dev/null +++ b/starpilot/ui/qt/offroad/data_settings.h @@ -0,0 +1,23 @@ +#pragma once + +#include "starpilot/ui/qt/offroad/starpilot_settings.h" + +class StarPilotDataPanel : public StarPilotListWidget { + Q_OBJECT + +public: + explicit StarPilotDataPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); + +signals: + void openSubPanel(); + +private: + void updateStatsLabels(StarPilotListWidget *labelsList); + + bool forceOpenDescriptions; + bool isMetric; + + StarPilotSettingsWindow *parent; + + Params params; +}; diff --git a/frogpilot/ui/qt/offroad/device_settings.cc b/starpilot/ui/qt/offroad/device_settings.cc similarity index 81% rename from frogpilot/ui/qt/offroad/device_settings.cc rename to starpilot/ui/qt/offroad/device_settings.cc index 42d03dbc..c91ed28a 100644 --- a/frogpilot/ui/qt/offroad/device_settings.cc +++ b/starpilot/ui/qt/offroad/device_settings.cc @@ -1,7 +1,7 @@ -#include "frogpilot/ui/screenrecorder/screenrecorder.h" -#include "frogpilot/ui/qt/offroad/device_settings.h" +#include "starpilot/ui/screenrecorder/screenrecorder.h" +#include "starpilot/ui/qt/offroad/device_settings.h" -FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotDevicePanel::StarPilotDevicePanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; ScreenRecorder *screenRecorder = new ScreenRecorder(this); @@ -10,14 +10,14 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool QStackedLayout *deviceLayout = new QStackedLayout(); addItem(deviceLayout); - FrogPilotListWidget *deviceList = new FrogPilotListWidget(this); + StarPilotListWidget *deviceList = new StarPilotListWidget(this); ScrollView *devicePanel = new ScrollView(deviceList, this); deviceLayout->addWidget(devicePanel); - FrogPilotListWidget *deviceManagementList = new FrogPilotListWidget(this); - FrogPilotListWidget *screenList = new FrogPilotListWidget(this); + StarPilotListWidget *deviceManagementList = new StarPilotListWidget(this); + StarPilotListWidget *screenList = new StarPilotListWidget(this); ScrollView *deviceManagementPanel = new ScrollView(deviceManagementList, this); ScrollView *screenPanel = new ScrollView(screenList, this); @@ -26,7 +26,7 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool deviceLayout->addWidget(screenPanel); const std::vector> deviceToggles { - {"DeviceManagement", tr("Device Settings"), tr("Settings that control how the device runs, powers off, and manages driving data."), "../../frogpilot/assets/toggle_icons/icon_device.png"}, + {"DeviceManagement", tr("Device Settings"), tr("Settings that control how the device runs, powers off, and manages driving data."), "../../starpilot/assets/toggle_icons/icon_device.png"}, {"DeviceShutdown", tr("Device Shutdown Timer"), tr("Keep the device on for the set amount of time after a drive before it shuts down automatically."), ""}, {"NoLogging", tr("Disable Logging"), QString("%1

%2").arg(tr("WARNING: This will prevent your drives from being recorded and all data will be unobtainable!")).arg(tr("Prevent the device from saving driving data.")), ""}, {"NoUploads", tr("Disable Uploads"), QString("%1

%2").arg(tr("WARNING: This will prevent your drives from being uploaded to comma connect which will impact debugging and official support from comma!")).arg(tr("Prevent the device from uploading driving data.")), ""}, @@ -35,7 +35,7 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool {"IncreaseThermalLimits", tr("Raise Temperature Limits"), QString("%1

%2").arg(tr("WARNING: Running at higher temperatures may damage your device!")).arg(tr("Allow the device to run at higher temperatures before throttling or shutting down. Use only if you understand the risks!")), ""}, {"UseKonikServer", tr("Use Konik Server"), tr("Upload driving data to \"stable.konik.ai\" instead of \"connect.comma.ai\"."), ""}, - {"ScreenManagement", tr("Screen Settings"), tr("Settings that control screen brightness, screen recording, and timeout duration."), "../../frogpilot/assets/toggle_icons/icon_light.png"}, + {"ScreenManagement", tr("Screen Settings"), tr("Settings that control screen brightness, screen recording, and timeout duration."), "../../starpilot/assets/toggle_icons/icon_light.png"}, {"ScreenBrightness", tr("Screen Brightness (Offroad)"), tr("The screen brightness while not driving."), ""}, {"ScreenBrightnessOnroad", tr("Screen Brightness (Onroad)"), tr("The screen brightness while driving."), ""}, {"ScreenRecorder", tr("Screen Recorder"), tr("Add a button to the driving screen to record the display."), ""}, @@ -48,8 +48,8 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool AbstractControl *deviceToggle; if (param == "DeviceManagement") { - FrogPilotManageControl *deviceManagementToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(deviceManagementToggle, &FrogPilotManageControl::manageButtonClicked, [deviceLayout, deviceManagementPanel]() { + StarPilotManageControl *deviceManagementToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(deviceManagementToggle, &StarPilotManageControl::manageButtonClicked, [deviceLayout, deviceManagementPanel]() { deviceLayout->setCurrentWidget(deviceManagementPanel); }); deviceToggle = deviceManagementToggle; @@ -58,17 +58,17 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool for (int i = 0; i <= 33; ++i) { shutdownLabels[i] = i == 0 ? tr("5 mins") : i <= 3 ? QString::number(i * 15) + tr(" mins") : QString::number(i - 3) + (i == 4 ? tr(" hour") : tr(" hours")); } - deviceToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 33, QString(), shutdownLabels); + deviceToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 33, QString(), shutdownLabels); } else if (param == "NoUploads") { std::vector uploadsToggles{"DisableOnroadUploads"}; std::vector uploadsToggleNames{tr("Disable Onroad Only")}; - deviceToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, uploadsToggles, uploadsToggleNames); + deviceToggle = new StarPilotButtonToggleControl(param, title, desc, icon, uploadsToggles, uploadsToggleNames); } else if (param == "LowVoltageShutdown") { - deviceToggle = new FrogPilotParamValueControl(param, title, desc, icon, 11.8, 12.5, tr(" volts"), std::map(), 0.1); + deviceToggle = new StarPilotParamValueControl(param, title, desc, icon, 11.8, 12.5, tr(" volts"), std::map(), 0.1); } else if (param == "ScreenManagement") { - FrogPilotManageControl *screenToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(screenToggle, &FrogPilotManageControl::manageButtonClicked, [deviceLayout, screenPanel]() { + StarPilotManageControl *screenToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(screenToggle, &StarPilotManageControl::manageButtonClicked, [deviceLayout, screenPanel]() { deviceLayout->setCurrentWidget(screenPanel); }); deviceToggle = screenToggle; @@ -78,11 +78,11 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool for (int i = 0; i <= 101; ++i) { brightnessLabels[i] = i == 0 ? tr("Screen Off") : i == 101 ? tr("Auto") : QString::number(i) + "%"; } - deviceToggle = new FrogPilotParamValueControl(param, title, desc, icon, minBrightness, 101, QString(), brightnessLabels, 1, true); + deviceToggle = new StarPilotParamValueControl(param, title, desc, icon, minBrightness, 101, QString(), brightnessLabels, 1, true); } else if (param == "ScreenRecorder") { std::vector recorderButtonNames{tr("Start Recording"), tr("Stop Recording")}; - FrogPilotButtonControl *recorderToggle = new FrogPilotButtonControl(param, title, desc, icon, recorderButtonNames, true); - QObject::connect(recorderToggle, &FrogPilotButtonControl::buttonClicked, [recorderToggle, screenRecorder](int id) { + StarPilotButtonControl *recorderToggle = new StarPilotButtonControl(param, title, desc, icon, recorderButtonNames, true); + QObject::connect(recorderToggle, &StarPilotButtonControl::buttonClicked, [recorderToggle, screenRecorder](int id) { if (id == 0) { recorderToggle->setCheckedButton(1); @@ -102,7 +102,7 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool recorderToggle->setVisibleButton(1, false); deviceToggle = recorderToggle; } else if (param == "ScreenTimeout" || param == "ScreenTimeoutOnroad") { - deviceToggle = new FrogPilotParamValueControl(param, title, desc, icon, 5, 60, tr(" seconds"), {}, 5); + deviceToggle = new StarPilotParamValueControl(param, title, desc, icon, 5, 60, tr(" seconds"), {}, 5); } else { deviceToggle = new ParamControl(param, title, desc, icon); @@ -120,8 +120,8 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool parentKeys.insert(param); } - if (FrogPilotManageControl *frogPilotManageToggle = qobject_cast(deviceToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + if (StarPilotManageControl *frogPilotManageToggle = qobject_cast(deviceToggle)) { + QObject::connect(frogPilotManageToggle, &StarPilotManageControl::manageButtonClicked, [this]() { emit openSubPanel(); openDescriptions(forceOpenDescriptions, toggles); }); @@ -141,8 +141,8 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool QSet brightnessKeys = {"ScreenBrightness", "ScreenBrightnessOnroad"}; for (const QString &key : brightnessKeys) { - FrogPilotParamValueControl *paramControl = static_cast(toggles[key]); - QObject::connect(paramControl, &FrogPilotParamValueControl::valueChanged, [key, this](int value) { + StarPilotParamValueControl *paramControl = static_cast(toggles[key]); + QObject::connect(paramControl, &StarPilotParamValueControl::valueChanged, [key, this](int value) { if (!started && key == "ScreenBrightness") { Hardware::set_brightness(value); } else if (started && key == "ScreenBrightnessOnroad") { @@ -153,8 +153,8 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool QSet forceUpdateKeys = {"NoUploads"}; for (const QString &key : forceUpdateKeys) { - QObject::connect(static_cast(toggles[key]), &FrogPilotButtonToggleControl::buttonClicked, this, &FrogPilotDevicePanel::updateToggles); - QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &FrogPilotDevicePanel::updateToggles); + QObject::connect(static_cast(toggles[key]), &StarPilotButtonToggleControl::buttonClicked, this, &StarPilotDevicePanel::updateToggles); + QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &StarPilotDevicePanel::updateToggles); } QSet rebootKeys = {"HigherBitrate", "UseKonikServer"}; @@ -181,7 +181,7 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool } } - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } }); @@ -189,18 +189,18 @@ FrogPilotDevicePanel::FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool openDescriptions(forceOpenDescriptions, toggles); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [deviceLayout, devicePanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [deviceLayout, devicePanel, this] { openDescriptions(forceOpenDescriptions, toggles); deviceLayout->setCurrentWidget(devicePanel); }); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotDevicePanel::updateState); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotDevicePanel::updateState); } -void FrogPilotDevicePanel::showEvent(QShowEvent *event) { +void StarPilotDevicePanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotDevicePanel::updateState(const UIState &s) { +void StarPilotDevicePanel::updateState(const UIState &s) { if (!isVisible()) { return; } @@ -208,7 +208,7 @@ void FrogPilotDevicePanel::updateState(const UIState &s) { started = s.scene.started; } -void FrogPilotDevicePanel::updateToggles() { +void StarPilotDevicePanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -220,7 +220,7 @@ void FrogPilotDevicePanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "HigherBitrate") { setVisible &= params.getBool("DeviceManagement") && params.getBool("NoUploads") && !params.getBool("DisableOnroadUploads"); diff --git a/frogpilot/ui/qt/offroad/device_settings.h b/starpilot/ui/qt/offroad/device_settings.h similarity index 76% rename from frogpilot/ui/qt/offroad/device_settings.h rename to starpilot/ui/qt/offroad/device_settings.h index d1577179..569fc9bc 100644 --- a/frogpilot/ui/qt/offroad/device_settings.h +++ b/starpilot/ui/qt/offroad/device_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotDevicePanel : public FrogPilotListWidget { +class StarPilotDevicePanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotDevicePanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotDevicePanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -28,7 +28,7 @@ private: QSet parentKeys; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; Params params; }; diff --git a/frogpilot/ui/qt/offroad/expandable_multi_option_dialog.cc b/starpilot/ui/qt/offroad/expandable_multi_option_dialog.cc similarity index 99% rename from frogpilot/ui/qt/offroad/expandable_multi_option_dialog.cc rename to starpilot/ui/qt/offroad/expandable_multi_option_dialog.cc index d93dc151..573c578c 100644 --- a/frogpilot/ui/qt/offroad/expandable_multi_option_dialog.cc +++ b/starpilot/ui/qt/offroad/expandable_multi_option_dialog.cc @@ -1,4 +1,4 @@ -#include "frogpilot/ui/qt/offroad/expandable_multi_option_dialog.h" +#include "starpilot/ui/qt/offroad/expandable_multi_option_dialog.h" #include #include @@ -130,7 +130,7 @@ ExpandableMultiOptionDialog::ExpandableMultiOptionDialog(const QString &prompt_t width: 50px; } QComboBox::down-arrow { - image: url("../../frogpilot/assets/toggle_icons/icon_dropdown.png"); + image: url("../../starpilot/assets/toggle_icons/icon_dropdown.png"); width: 30px; height: 30px; } diff --git a/frogpilot/ui/qt/offroad/expandable_multi_option_dialog.h b/starpilot/ui/qt/offroad/expandable_multi_option_dialog.h similarity index 100% rename from frogpilot/ui/qt/offroad/expandable_multi_option_dialog.h rename to starpilot/ui/qt/offroad/expandable_multi_option_dialog.h diff --git a/frogpilot/ui/qt/offroad/lateral_settings.cc b/starpilot/ui/qt/offroad/lateral_settings.cc similarity index 80% rename from frogpilot/ui/qt/offroad/lateral_settings.cc rename to starpilot/ui/qt/offroad/lateral_settings.cc index 021f4ddb..946cedc1 100644 --- a/frogpilot/ui/qt/offroad/lateral_settings.cc +++ b/starpilot/ui/qt/offroad/lateral_settings.cc @@ -1,22 +1,22 @@ -#include "frogpilot/ui/qt/offroad/lateral_settings.h" +#include "starpilot/ui/qt/offroad/lateral_settings.h" -FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotLateralPanel::StarPilotLateralPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *lateralLayout = new QStackedLayout(); addItem(lateralLayout); - FrogPilotListWidget *lateralList = new FrogPilotListWidget(this); + StarPilotListWidget *lateralList = new StarPilotListWidget(this); ScrollView *lateralPanel = new ScrollView(lateralList, this); lateralLayout->addWidget(lateralPanel); - FrogPilotListWidget *advancedLateralTuneList = new FrogPilotListWidget(this); - FrogPilotListWidget *aolList = new FrogPilotListWidget(this); - FrogPilotListWidget *laneChangeList = new FrogPilotListWidget(this); - FrogPilotListWidget *lateralTuneList = new FrogPilotListWidget(this); - FrogPilotListWidget *qolList = new FrogPilotListWidget(this); + StarPilotListWidget *advancedLateralTuneList = new StarPilotListWidget(this); + StarPilotListWidget *aolList = new StarPilotListWidget(this); + StarPilotListWidget *laneChangeList = new StarPilotListWidget(this); + StarPilotListWidget *lateralTuneList = new StarPilotListWidget(this); + StarPilotListWidget *qolList = new StarPilotListWidget(this); ScrollView *advancedLateralTunePanel = new ScrollView(advancedLateralTuneList, this); ScrollView *aolPanel = new ScrollView(aolList, this); @@ -31,7 +31,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo lateralLayout->addWidget(qolPanel); const std::vector> lateralToggles { - {"AdvancedLateralTune", tr("Advanced Lateral Tuning"), tr("Advanced steering control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_advanced_lateral_tune.png"}, + {"AdvancedLateralTune", tr("Advanced Lateral Tuning"), tr("Advanced steering control changes to fine-tune how openpilot drives."), "../../starpilot/assets/toggle_icons/icon_advanced_lateral_tune.png"}, {"SteerDelay", parent->steerActuatorDelay != 0 ? QString(tr("Actuator Delay (Default: %1)")).arg(QString::number(parent->steerActuatorDelay, 'f', 2)) : tr("Actuator Delay"), tr("The time between openpilot's steering command and the vehicle's response. Increase if the vehicle reacts late; decrease if it feels jumpy. Auto-learned by default."), ""}, {"SteerFriction", parent->friction != 0 ? QString(tr("Friction (Default: %1)")).arg(QString::number(parent->friction, 'f', 2)) : tr("Friction"), tr("Compensates for steering friction. Increase if the wheel sticks near center; decrease if it jitters. Auto-learned by default."), ""}, {"SteerKP", parent->steerKp != 0 ? QString(tr("Kp Factor (Default: %1)")).arg(QString::number(parent->steerKp, 'f', 2)) : tr("Kp Factor"), tr("How strongly openpilot corrects lane position. Higher is tighter but twitchier; lower is smoother but slower. Auto-learned by default."), ""}, @@ -41,23 +41,23 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo {"ForceAutoTuneOff", tr("Force Auto-Tune Off"), tr("Force-disable openpilot's live auto-tuning for \"Friction\" and \"Lateral Acceleration\" and use the set value instead."), ""}, {"ForceTorqueController", tr("Force Torque Controller"), tr("Use torque-based steering control instead of angle-based control for smoother lane keeping, especially in curves."), ""}, - {"AlwaysOnLateral", tr("Always On Lateral"), tr("openpilot's steering remains active even when the accelerator or brake pedals are pressed."), "../../frogpilot/assets/toggle_icons/icon_always_on_lateral.png"}, + {"AlwaysOnLateral", tr("Always On Lateral"), tr("openpilot's steering remains active even when the accelerator or brake pedals are pressed."), "../../starpilot/assets/toggle_icons/icon_always_on_lateral.png"}, {"AlwaysOnLateralLKAS", tr("Enable With LKAS"), tr("Enable \"Always On Lateral\" whenever \"LKAS\" is on, even when openpilot is not engaged."), ""}, {"PauseAOLOnBrake", tr("Pause on Brake Press Below"), tr("Pause \"Always On Lateral\" below the set speed while the brake pedal is pressed."), ""}, - {"LaneChanges", tr("Lane Changes"), tr("Allow openpilot to change lanes."), "../../frogpilot/assets/toggle_icons/icon_lane.png"}, + {"LaneChanges", tr("Lane Changes"), tr("Allow openpilot to change lanes."), "../../starpilot/assets/toggle_icons/icon_lane.png"}, {"NudgelessLaneChange", tr("Automatic Lane Changes"), tr("When the turn signal is on, openpilot will automatically change lanes. No steering-wheel nudge required!"), ""}, {"LaneChangeTime", tr("Lane Change Delay"), tr("Delay between turn signal activation and the start of an automatic lane change."), ""}, {"MinimumLaneChangeSpeed", tr("Minimum Lane Change Speed"), tr("Lowest speed at which openpilot will change lanes."), ""}, {"LaneDetectionWidth", tr("Minimum Lane Width"), tr("Prevent automatic lane changes into lanes narrower than the set width."), ""}, {"OneLaneChange", tr("One Lane Change Per Signal"), tr("Limit automatic lane changes to one per turn-signal activation."), ""}, - {"LateralTune", tr("Lateral Tuning"), tr("Miscellaneous steering control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_lateral_tune.png"}, + {"LateralTune", tr("Lateral Tuning"), tr("Miscellaneous steering control changes to fine-tune how openpilot drives."), "../../starpilot/assets/toggle_icons/icon_lateral_tune.png"}, {"TurnDesires", tr("Force Turn Desires Below Lane Change Speed"), tr("While driving below the minimum lane change speed with an active turn signal, instruct openpilot to turn left/right."), ""}, {"NNFF", tr("Neural Network Feedforward (NNFF)"), tr("Twilsonco's \"Neural Network FeedForward\" controller. Uses a trained neural network model to predict steering torque based on vehicle speed, roll, and past/future planned path data for smoother, model-based steering."), ""}, {"NNFFLite", tr("Neural Network Feedforward (NNFF) Lite"), tr("A lightweight version of Twilsonco's \"Neural Network FeedForward\" controller. Uses the \"look-ahead\" planned lateral jerk logic from the full model to help smoothen steering adjustments in curves, but does not use the full neural network for torque calculation."), ""}, - {"QOLLateral", tr("Quality of Life"), tr("Steering control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_quality_of_life.png"}, + {"QOLLateral", tr("Quality of Life"), tr("Steering control changes to fine-tune how openpilot drives."), "../../starpilot/assets/toggle_icons/icon_quality_of_life.png"}, {"PauseLateralSpeed", tr("Pause Steering Below"), tr("Pause steering below the set speed."), ""} }; @@ -65,39 +65,39 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo AbstractControl *lateralToggle; if (param == "AdvancedLateralTune") { - FrogPilotManageControl *advancedLateralTuneToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(advancedLateralTuneToggle, &FrogPilotManageControl::manageButtonClicked, [lateralLayout, advancedLateralTunePanel]() { + StarPilotManageControl *advancedLateralTuneToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(advancedLateralTuneToggle, &StarPilotManageControl::manageButtonClicked, [lateralLayout, advancedLateralTunePanel]() { lateralLayout->setCurrentWidget(advancedLateralTunePanel); }); lateralToggle = advancedLateralTuneToggle; } else if (param == "SteerDelay") { std::vector steerDelayButton{"Reset"}; - lateralToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0.01, 1, QString(), std::map(), 0.01, false, {}, steerDelayButton, false, false); + lateralToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 0.01, 1, QString(), std::map(), 0.01, false, {}, steerDelayButton, false, false); } else if (param == "SteerFriction") { std::vector steerFrictionButton{"Reset"}; - lateralToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0, 1, QString(), std::map(), 0.01, false, {}, steerFrictionButton, false, false); + lateralToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 0, 1, QString(), std::map(), 0.01, false, {}, steerFrictionButton, false, false); } else if (param == "SteerKP") { std::vector steerKPButton{"Reset"}; - lateralToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, parent->steerKp * 0.5, parent->steerKp * 1.5, QString(), std::map(), 0.01, false, {}, steerKPButton, false, false); + lateralToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, parent->steerKp * 0.5, parent->steerKp * 1.5, QString(), std::map(), 0.01, false, {}, steerKPButton, false, false); } else if (param == "SteerLatAccel") { std::vector steerLatAccelButton{"Reset"}; - lateralToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, parent->latAccelFactor * 0.5, parent->latAccelFactor * 1.5, QString(), std::map(), 0.01, false, {}, steerLatAccelButton, false, false); + lateralToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, parent->latAccelFactor * 0.5, parent->latAccelFactor * 1.5, QString(), std::map(), 0.01, false, {}, steerLatAccelButton, false, false); } else if (param == "SteerRatio") { std::vector steerRatioButton{"Reset"}; - lateralToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, parent->steerRatio * 0.5, parent->steerRatio * 1.5, QString(), std::map(), 0.01, false, {}, steerRatioButton, false, false); + lateralToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, parent->steerRatio * 0.5, parent->steerRatio * 1.5, QString(), std::map(), 0.01, false, {}, steerRatioButton, false, false); } else if (param == "AlwaysOnLateral") { - FrogPilotManageControl *aolToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(aolToggle, &FrogPilotManageControl::manageButtonClicked, [lateralLayout, aolPanel]() { + StarPilotManageControl *aolToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(aolToggle, &StarPilotManageControl::manageButtonClicked, [lateralLayout, aolPanel]() { lateralLayout->setCurrentWidget(aolPanel); }); lateralToggle = aolToggle; } else if (param == "PauseAOLOnBrake") { - lateralToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, QString(), std::map(), 1, true); + lateralToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 99, QString(), std::map(), 1, true); } else if (param == "LaneChanges") { - FrogPilotManageControl *laneChangeToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(laneChangeToggle, &FrogPilotManageControl::manageButtonClicked, [lateralLayout, laneChangePanel]() { + StarPilotManageControl *laneChangeToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(laneChangeToggle, &StarPilotManageControl::manageButtonClicked, [lateralLayout, laneChangePanel]() { lateralLayout->setCurrentWidget(laneChangePanel); }); lateralToggle = laneChangeToggle; @@ -106,29 +106,29 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo for (float i = 0; i <= 5; i += 0.1) { laneChangeTimeLabels[i] = i == 0 ? tr("Instant") : std::lround(i / 0.1) == 1 / 0.1 ? QString::number(i, 'f', 1) + tr(" second") : QString::number(i, 'f', 1) + tr(" seconds"); } - lateralToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 5, QString(), laneChangeTimeLabels, 0.1); + lateralToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 5, QString(), laneChangeTimeLabels, 0.1); } else if (param == "LaneDetectionWidth") { - lateralToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 15, QString(), std::map(), 0.1, true); + lateralToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 15, QString(), std::map(), 0.1, true); } else if (param == "MinimumLaneChangeSpeed") { - lateralToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, QString(), std::map(), 1, true); + lateralToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 99, QString(), std::map(), 1, true); } else if (param == "LateralTune") { - FrogPilotManageControl *lateralTuneToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(lateralTuneToggle, &FrogPilotManageControl::manageButtonClicked, [lateralLayout, lateralTunePanel]() { + StarPilotManageControl *lateralTuneToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(lateralTuneToggle, &StarPilotManageControl::manageButtonClicked, [lateralLayout, lateralTunePanel]() { lateralLayout->setCurrentWidget(lateralTunePanel); }); lateralToggle = lateralTuneToggle; } else if (param == "QOLLateral") { - FrogPilotManageControl *qolLateralToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(qolLateralToggle, &FrogPilotManageControl::manageButtonClicked, [lateralLayout, qolPanel]() { + StarPilotManageControl *qolLateralToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(qolLateralToggle, &StarPilotManageControl::manageButtonClicked, [lateralLayout, qolPanel]() { lateralLayout->setCurrentWidget(qolPanel); }); lateralToggle = qolLateralToggle; } else if (param == "PauseLateralSpeed") { std::vector pauseLateralToggles{"PauseLateralOnSignal"}; std::vector pauseLateralToggleNames{tr("Turn Signal Only")}; - lateralToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0, 99, QString(), std::map(), 1, true, pauseLateralToggles, pauseLateralToggleNames, true); + lateralToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 0, 99, QString(), std::map(), 1, true, pauseLateralToggles, pauseLateralToggleNames, true); } else { lateralToggle = new ParamControl(param, title, desc, icon); @@ -152,8 +152,8 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo parentKeys.insert(param); } - if (FrogPilotManageControl *frogPilotManageToggle = qobject_cast(lateralToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + if (StarPilotManageControl *frogPilotManageToggle = qobject_cast(lateralToggle)) { + QObject::connect(frogPilotManageToggle, &StarPilotManageControl::manageButtonClicked, [this]() { emit openSubPanel(); openDescriptions(forceOpenDescriptions, toggles); }); @@ -169,7 +169,7 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo QSet forceUpdateKeys = {"ForceAutoTune", "ForceAutoTuneOff", "LateralTune", "NNFF", "NudgelessLaneChange"}; for (const QString &key : forceUpdateKeys) { - QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &FrogPilotLateralPanel::updateToggles); + QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &StarPilotLateralPanel::updateToggles); } QSet rebootKeys = {"AlwaysOnLateral", "ForceTorqueController", "NNFF", "NNFFLite"}; @@ -177,11 +177,11 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, [key, this](bool state) { if (started) { if (key == "AlwaysOnLateral" && state) { - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } } else if (key != "AlwaysOnLateral") { - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } } @@ -189,41 +189,41 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo }); } - steerDelayToggle = static_cast(toggles["SteerDelay"]); - QObject::connect(steerDelayToggle, &FrogPilotParamValueButtonControl::buttonClicked, [parent, this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Reset Actuator Delay to its default value?"), this)) { + steerDelayToggle = static_cast(toggles["SteerDelay"]); + QObject::connect(steerDelayToggle, &StarPilotParamValueButtonControl::buttonClicked, [parent, this]() { + if (StarPilotConfirmationDialog::yesorno(tr("Reset Actuator Delay to its default value?"), this)) { params.putFloat("SteerDelay", parent->steerActuatorDelay); steerDelayToggle->refresh(); } }); - steerFrictionToggle = static_cast(toggles["SteerFriction"]); - QObject::connect(steerFrictionToggle, &FrogPilotParamValueButtonControl::buttonClicked, [parent, this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Reset Friction to its default value?"), this)) { + steerFrictionToggle = static_cast(toggles["SteerFriction"]); + QObject::connect(steerFrictionToggle, &StarPilotParamValueButtonControl::buttonClicked, [parent, this]() { + if (StarPilotConfirmationDialog::yesorno(tr("Reset Friction to its default value?"), this)) { params.putFloat("SteerFriction", parent->friction); steerFrictionToggle->refresh(); } }); - steerKPToggle = static_cast(toggles["SteerKP"]); - QObject::connect(steerKPToggle, &FrogPilotParamValueButtonControl::buttonClicked, [parent, this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Reset Kp Factor to its default value?"), this)) { + steerKPToggle = static_cast(toggles["SteerKP"]); + QObject::connect(steerKPToggle, &StarPilotParamValueButtonControl::buttonClicked, [parent, this]() { + if (StarPilotConfirmationDialog::yesorno(tr("Reset Kp Factor to its default value?"), this)) { params.putFloat("SteerKP", parent->steerKp); steerKPToggle->refresh(); } }); - steerLatAccelToggle = static_cast(toggles["SteerLatAccel"]); - QObject::connect(steerLatAccelToggle, &FrogPilotParamValueButtonControl::buttonClicked, [parent, this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Reset Lateral Accel to its default value?"), this)) { + steerLatAccelToggle = static_cast(toggles["SteerLatAccel"]); + QObject::connect(steerLatAccelToggle, &StarPilotParamValueButtonControl::buttonClicked, [parent, this]() { + if (StarPilotConfirmationDialog::yesorno(tr("Reset Lateral Accel to its default value?"), this)) { params.putFloat("SteerLatAccel", parent->latAccelFactor); steerLatAccelToggle->refresh(); } }); - steerRatioToggle = static_cast(toggles["SteerRatio"]); - QObject::connect(steerRatioToggle, &FrogPilotParamValueButtonControl::buttonClicked, [parent, this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Reset Steer Ratio to its default value?"), this)) { + steerRatioToggle = static_cast(toggles["SteerRatio"]); + QObject::connect(steerRatioToggle, &StarPilotParamValueButtonControl::buttonClicked, [parent, this]() { + if (StarPilotConfirmationDialog::yesorno(tr("Reset Steer Ratio to its default value?"), this)) { params.putFloat("SteerRatio", parent->steerRatio); steerRatioToggle->refresh(); } @@ -231,15 +231,15 @@ FrogPilotLateralPanel::FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bo openDescriptions(forceOpenDescriptions, toggles); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [lateralLayout, lateralPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [lateralLayout, lateralPanel, this] { openDescriptions(forceOpenDescriptions, toggles); lateralLayout->setCurrentWidget(lateralPanel); }); - QObject::connect(parent, &FrogPilotSettingsWindow::updateMetric, this, &FrogPilotLateralPanel::updateMetric); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotLateralPanel::updateState); + QObject::connect(parent, &StarPilotSettingsWindow::updateMetric, this, &StarPilotLateralPanel::updateMetric); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotLateralPanel::updateState); } -void FrogPilotLateralPanel::showEvent(QShowEvent *event) { +void StarPilotLateralPanel::showEvent(QShowEvent *event) { steerDelayToggle->setTitle(QString(tr("Actuator Delay (Default: %1)")).arg(QString::number(parent->steerActuatorDelay, 'f', 2))); steerFrictionToggle->setTitle(QString(tr("Friction (Default: %1)")).arg(QString::number(parent->friction, 'f', 2))); steerKPToggle->setTitle(QString(tr("Kp Factor (Default: %1)")).arg(QString::number(parent->steerKp, 'f', 2))); @@ -252,13 +252,13 @@ void FrogPilotLateralPanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotLateralPanel::updateState(const UIState &s) { +void StarPilotLateralPanel::updateState(const UIState &s) { if (!isVisible()) return; started = s.scene.started; } -void FrogPilotLateralPanel::updateMetric(bool metric, bool bootRun) { +void StarPilotLateralPanel::updateMetric(bool metric, bool bootRun) { static bool previousMetric; if (metric != previousMetric && !bootRun) { double distanceConversion = metric ? FOOT_TO_METER : METER_TO_FOOT; @@ -300,10 +300,10 @@ void FrogPilotLateralPanel::updateMetric(bool metric, bool bootRun) { labelsInitialized = true; } - FrogPilotParamValueControl *laneWidthToggle = static_cast(toggles["LaneDetectionWidth"]); - FrogPilotParamValueControl *minimumLaneChangeSpeedToggle = static_cast(toggles["MinimumLaneChangeSpeed"]); - FrogPilotParamValueControl *pauseAOLOnBrakeToggle = static_cast(toggles["PauseAOLOnBrake"]); - FrogPilotParamValueControl *pauseLateralToggle = static_cast(toggles["PauseLateralSpeed"]); + StarPilotParamValueControl *laneWidthToggle = static_cast(toggles["LaneDetectionWidth"]); + StarPilotParamValueControl *minimumLaneChangeSpeedToggle = static_cast(toggles["MinimumLaneChangeSpeed"]); + StarPilotParamValueControl *pauseAOLOnBrakeToggle = static_cast(toggles["PauseAOLOnBrake"]); + StarPilotParamValueControl *pauseLateralToggle = static_cast(toggles["PauseLateralSpeed"]); if (metric) { laneWidthToggle->updateControl(0, 5, metricDistanceLabels); @@ -320,7 +320,7 @@ void FrogPilotLateralPanel::updateMetric(bool metric, bool bootRun) { } } -void FrogPilotLateralPanel::updateToggles() { +void StarPilotLateralPanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -337,7 +337,7 @@ void FrogPilotLateralPanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "AlwaysOnLateralLKAS") { setVisible &= parent->lkasAllowedForAOL; diff --git a/frogpilot/ui/qt/offroad/lateral_settings.h b/starpilot/ui/qt/offroad/lateral_settings.h similarity index 65% rename from frogpilot/ui/qt/offroad/lateral_settings.h rename to starpilot/ui/qt/offroad/lateral_settings.h index 08117e37..7c4b743f 100644 --- a/frogpilot/ui/qt/offroad/lateral_settings.h +++ b/starpilot/ui/qt/offroad/lateral_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotLateralPanel : public FrogPilotListWidget { +class StarPilotLateralPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotLateralPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotLateralPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -32,13 +32,13 @@ private: QSet parentKeys; - FrogPilotParamValueButtonControl *steerDelayToggle; - FrogPilotParamValueButtonControl *steerFrictionToggle; - FrogPilotParamValueButtonControl *steerLatAccelToggle; - FrogPilotParamValueButtonControl *steerKPToggle; - FrogPilotParamValueButtonControl *steerRatioToggle; + StarPilotParamValueButtonControl *steerDelayToggle; + StarPilotParamValueButtonControl *steerFrictionToggle; + StarPilotParamValueButtonControl *steerLatAccelToggle; + StarPilotParamValueButtonControl *steerKPToggle; + StarPilotParamValueButtonControl *steerRatioToggle; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; Params params; }; diff --git a/frogpilot/ui/qt/offroad/longitudinal_settings.cc b/starpilot/ui/qt/offroad/longitudinal_settings.cc similarity index 84% rename from frogpilot/ui/qt/offroad/longitudinal_settings.cc rename to starpilot/ui/qt/offroad/longitudinal_settings.cc index 79a81e35..3de1e7e8 100644 --- a/frogpilot/ui/qt/offroad/longitudinal_settings.cc +++ b/starpilot/ui/qt/offroad/longitudinal_settings.cc @@ -1,6 +1,6 @@ -#include "frogpilot/ui/qt/offroad/longitudinal_settings.h" +#include "starpilot/ui/qt/offroad/longitudinal_settings.h" -FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotLongitudinalPanel::StarPilotLongitudinalPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; networkManager = new QNetworkAccessManager(this); @@ -8,31 +8,31 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * QStackedLayout *longitudinalLayout = new QStackedLayout(); addItem(longitudinalLayout); - FrogPilotListWidget *longitudinalList = new FrogPilotListWidget(this); + StarPilotListWidget *longitudinalList = new StarPilotListWidget(this); ScrollView *longitudinalPanel = new ScrollView(longitudinalList, this); longitudinalLayout->addWidget(longitudinalPanel); - FrogPilotListWidget *advancedLongitudinalTuneList = new FrogPilotListWidget(this); - FrogPilotListWidget *aggressivePersonalityList = new FrogPilotListWidget(this); - FrogPilotListWidget *conditionalExperimentalList = new FrogPilotListWidget(this); - FrogPilotListWidget *curveSpeedList = new FrogPilotListWidget(this); - FrogPilotListWidget *customDrivingPersonalityList = new FrogPilotListWidget(this); - FrogPilotListWidget *longitudinalTuneList = new FrogPilotListWidget(this); - FrogPilotListWidget *qolList = new FrogPilotListWidget(this); - FrogPilotListWidget *relaxedPersonalityList = new FrogPilotListWidget(this); - FrogPilotListWidget *speedLimitControllerList = new FrogPilotListWidget(this); - FrogPilotListWidget *speedLimitControllerOffsetsList = new FrogPilotListWidget(this); - FrogPilotListWidget *speedLimitControllerQOLList = new FrogPilotListWidget(this); - FrogPilotListWidget *speedLimitControllerVisualList = new FrogPilotListWidget(this); - FrogPilotListWidget *standardPersonalityList = new FrogPilotListWidget(this); - FrogPilotListWidget *trafficPersonalityList = new FrogPilotListWidget(this); - FrogPilotListWidget *weatherList = new FrogPilotListWidget(this); - FrogPilotListWidget *weatherLowVisibilityList = new FrogPilotListWidget(this); - FrogPilotListWidget *weatherRainList = new FrogPilotListWidget(this); - FrogPilotListWidget *weatherRainStormList = new FrogPilotListWidget(this); - FrogPilotListWidget *weatherSnowList = new FrogPilotListWidget(this); + StarPilotListWidget *advancedLongitudinalTuneList = new StarPilotListWidget(this); + StarPilotListWidget *aggressivePersonalityList = new StarPilotListWidget(this); + StarPilotListWidget *conditionalExperimentalList = new StarPilotListWidget(this); + StarPilotListWidget *curveSpeedList = new StarPilotListWidget(this); + StarPilotListWidget *customDrivingPersonalityList = new StarPilotListWidget(this); + StarPilotListWidget *longitudinalTuneList = new StarPilotListWidget(this); + StarPilotListWidget *qolList = new StarPilotListWidget(this); + StarPilotListWidget *relaxedPersonalityList = new StarPilotListWidget(this); + StarPilotListWidget *speedLimitControllerList = new StarPilotListWidget(this); + StarPilotListWidget *speedLimitControllerOffsetsList = new StarPilotListWidget(this); + StarPilotListWidget *speedLimitControllerQOLList = new StarPilotListWidget(this); + StarPilotListWidget *speedLimitControllerVisualList = new StarPilotListWidget(this); + StarPilotListWidget *standardPersonalityList = new StarPilotListWidget(this); + StarPilotListWidget *trafficPersonalityList = new StarPilotListWidget(this); + StarPilotListWidget *weatherList = new StarPilotListWidget(this); + StarPilotListWidget *weatherLowVisibilityList = new StarPilotListWidget(this); + StarPilotListWidget *weatherRainList = new StarPilotListWidget(this); + StarPilotListWidget *weatherRainStormList = new StarPilotListWidget(this); + StarPilotListWidget *weatherSnowList = new StarPilotListWidget(this); ScrollView *advancedLongitudinalTunePanel = new ScrollView(advancedLongitudinalTuneList, this); ScrollView *aggressivePersonalityPanel = new ScrollView(aggressivePersonalityList, this); @@ -75,7 +75,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * longitudinalLayout->addWidget(weatherSnowPanel); const std::vector> longitudinalToggles { - {"AdvancedLongitudinalTune", tr("Advanced Longitudinal Tuning"), tr("Advanced acceleration and braking control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png"}, + {"AdvancedLongitudinalTune", tr("Advanced Longitudinal Tuning"), tr("Advanced acceleration and braking control changes to fine-tune how openpilot drives."), "../../starpilot/assets/toggle_icons/icon_advanced_longitudinal_tune.png"}, {"EVTuning", tr("EV Tuning"), tr("Use acceleration profiles tuned for EVs. Defaults to the vehicle's detected powertrain type but can be overridden if the automatic choice doesn't match."), ""}, {"TruckTuning", tr("Truck Tuning"), tr("Use aggressive acceleration profiles tuned for trucks. Intended for heavy vehicles that need stronger throttle."), ""}, {"LongitudinalActuatorDelay", parent->longitudinalActuatorDelay != 0 ? QString(tr("Actuator Delay (Default: %1)")).arg(QString::number(parent->longitudinalActuatorDelay, 'f', 2)) : tr("Actuator Delay"), tr("The time between openpilot's throttle or brake command and the vehicle's response. Increase if the vehicle feels slow to react; decrease if it feels too eager or overshoots."), ""}, @@ -86,7 +86,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"StoppingDecelRate", parent->stoppingDecelRate != 0 ? QString(tr("Stopping Rate (Default: %1)")).arg(QString::number(parent->stoppingDecelRate, 'f', 2)) : tr("Stopping Rate"), tr("How quickly braking ramps up when stopping. Increase for shorter, firmer stops; decrease for smoother, longer stops."), ""}, {"VEgoStopping", parent->vEgoStopping != 0 ? QString(tr("Stop Speed (Default: %1)")).arg(QString::number(parent->vEgoStopping, 'f', 2)) : tr("Stop Speed"), tr("The speed at which openpilot considers the vehicle stopped. Increase to brake earlier and stop smoothly; decrease to wait longer but risk overshooting."), ""}, - {"ConditionalExperimental", tr("Conditional Experimental Mode"), tr("Automatically switch to \"Experimental Mode\" when set conditions are met. Allows the model to handle challenging situations with smarter decision making."), "../../frogpilot/assets/toggle_icons/icon_conditional.png"}, + {"ConditionalExperimental", tr("Conditional Experimental Mode"), tr("Automatically switch to \"Experimental Mode\" when set conditions are met. Allows the model to handle challenging situations with smarter decision making."), "../../starpilot/assets/toggle_icons/icon_conditional.png"}, {"CESpeed", tr("Below"), tr("Switch to \"Experimental Mode\" when driving below this speed without a lead to help openpilot handle low-speed situations more smoothly."), ""}, {"CECurves", tr("Curve Detected Ahead"), tr("Switch to \"Experimental Mode\" when a curve is detected to allow the model to set an appropriate speed for the curve."), ""}, {"CEStopLights", tr("\"Detected\" Stop Lights/Signs"), tr("Switch to \"Experimental Mode\" whenever the driving model \"detects\" a red light or stop sign.

Disclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!"), ""}, @@ -95,15 +95,15 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"CESignalSpeed", tr("Turn Signal Below"), tr("Switch to \"Experimental Mode\" when using a turn signal below the set speed to allow the model to choose an appropriate speed for smoother left and right turns."), ""}, {"ShowCEMStatus", tr("Status Widget"), tr("Show which condition triggered \"Experimental Mode\" on the driving screen."), ""}, - {"CurveSpeedController", tr("Curve Speed Controller"), tr("Automatically slow down for upcoming curves using data learned from your driving style, adapting to curves as you would."), "../../frogpilot/assets/toggle_icons/icon_speed_map.png"}, + {"CurveSpeedController", tr("Curve Speed Controller"), tr("Automatically slow down for upcoming curves using data learned from your driving style, adapting to curves as you would."), "../../starpilot/assets/toggle_icons/icon_speed_map.png"}, {"CalibratedLateralAcceleration", tr("Calibrated Lateral Acceleration"), tr("The learned lateral acceleration from collected driving data. This sets how fast openpilot will take curves. Higher values allow faster cornering; lower values slow the vehicle for gentler turns."), ""}, {"CalibrationProgress", tr("Calibration Progress"), tr("How much curve data has been collected. This is a progress meter; it is normal for the value to stay low and rarely reach 100%."), ""}, {"ResetCurveData", tr("Reset Curve Data"), tr("Reset collected user data for \"Curve Speed Controller\"."), ""}, {"ShowCSCStatus", tr("Status Widget"), tr("Show the \"Curve Speed Controller\" target speed on the driving screen."), ""}, - {"CustomPersonalities", tr("Driving Personalities"), tr("Customize the \"Driving Personalities\" to better match your driving style."), "../../frogpilot/assets/toggle_icons/icon_personality.png"}, + {"CustomPersonalities", tr("Driving Personalities"), tr("Customize the \"Driving Personalities\" to better match your driving style."), "../../starpilot/assets/toggle_icons/icon_personality.png"}, - {"TrafficPersonalityProfile", tr("Traffic Mode"), tr("Customize the \"Traffic Mode\" personality profile. Designed for stop-and-go driving."), "../../frogpilot/assets/stock_theme/distance_icons/traffic.png"}, + {"TrafficPersonalityProfile", tr("Traffic Mode"), tr("Customize the \"Traffic Mode\" personality profile. Designed for stop-and-go driving."), "../../starpilot/assets/stock_theme/distance_icons/traffic.png"}, {"TrafficFollow", tr("Following Distance"), tr("The minimum following distance to the lead vehicle in \"Traffic Mode\". openpilot blends between this value and the \"Aggressive\" profile as speed increases. Increase for more space; decrease for tighter gaps."), ""}, {"TrafficJerkAcceleration", tr("Acceleration Smoothness"), tr("How smoothly openpilot accelerates in \"Traffic Mode\". Increase for gentler starts; decrease for faster but more abrupt takeoffs."), ""}, {"TrafficJerkDeceleration", tr("Braking Smoothness"), tr("How smoothly openpilot brakes in \"Traffic Mode\". Increase for gentler stops; decrease for quicker but sharper braking."), ""}, @@ -112,7 +112,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"TrafficJerkSpeed", tr("Speed-Up Response"), tr("How smoothly openpilot speeds up in \"Traffic Mode\". Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), ""}, {"ResetTrafficPersonality", tr("Reset to Defaults"), tr("Reset \"Traffic Mode\" settings to defaults."), ""}, - {"AggressivePersonalityProfile", tr("Aggressive"), tr("Customize the \"Aggressive\" personality profile. Designed for assertive driving with tighter gaps."), "../../frogpilot/assets/stock_theme/distance_icons/aggressive.png"}, + {"AggressivePersonalityProfile", tr("Aggressive"), tr("Customize the \"Aggressive\" personality profile. Designed for assertive driving with tighter gaps."), "../../starpilot/assets/stock_theme/distance_icons/aggressive.png"}, {"AggressiveFollow", tr("Following Distance"), tr("How many seconds openpilot follows behind lead vehicles when using the \"Aggressive\" profile. Increase for more space; decrease for tighter gaps.

Default: 1.25 seconds."), ""}, {"AggressiveFollowHigh", tr("High Speed Following Distance"), tr("Following distance for higher speeds in the \"Aggressive\" profile. openpilot smoothly blends from the base value to this value as speed rises."), ""}, {"AggressiveJerkAcceleration", tr("Acceleration Smoothness"), tr("How smoothly openpilot accelerates with the \"Aggressive\" profile. Increase for gentler starts; decrease for faster but more abrupt takeoffs."), ""}, @@ -122,7 +122,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"AggressiveJerkSpeed", tr("Speed-Up Response"), tr("How smoothly openpilot speeds up with the \"Aggressive\" profile. Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), ""}, {"ResetAggressivePersonality", tr("Reset to Defaults"), tr("Reset the \"Aggressive\" profile to defaults."), ""}, - {"StandardPersonalityProfile", tr("Standard"), tr("Customize the \"Standard\" personality profile. Designed for balanced driving with moderate gaps."), "../../frogpilot/assets/stock_theme/distance_icons/standard.png"}, + {"StandardPersonalityProfile", tr("Standard"), tr("Customize the \"Standard\" personality profile. Designed for balanced driving with moderate gaps."), "../../starpilot/assets/stock_theme/distance_icons/standard.png"}, {"StandardFollow", tr("Following Distance"), tr("How many seconds openpilot follows behind lead vehicles when using the \"Standard\" profile. Increase for more space; decrease for tighter gaps.

Default: 1.45 seconds."), ""}, {"StandardFollowHigh", tr("High Speed Following Distance"), tr("Following distance for higher speeds in the \"Standard\" profile. openpilot smoothly blends from the base value to this value as speed rises."), ""}, {"StandardJerkAcceleration", tr("Acceleration Smoothness"), tr("How smoothly openpilot accelerates with the \"Standard\" profile. Increase for gentler starts; decrease for faster but more abrupt takeoffs."), ""}, @@ -132,7 +132,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"StandardJerkSpeed", tr("Speed-Up Response"), tr("How smoothly openpilot speeds up with the \"Standard\" profile. Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), ""}, {"ResetStandardPersonality", tr("Reset to Defaults"), tr("Reset the \"Standard\" profile to defaults."), ""}, - {"RelaxedPersonalityProfile", tr("Relaxed"), tr("Customize the \"Relaxed\" personality profile. Designed for smoother, more comfortable driving with larger gaps."), "../../frogpilot/assets/stock_theme/distance_icons/relaxed.png"}, + {"RelaxedPersonalityProfile", tr("Relaxed"), tr("Customize the \"Relaxed\" personality profile. Designed for smoother, more comfortable driving with larger gaps."), "../../starpilot/assets/stock_theme/distance_icons/relaxed.png"}, {"RelaxedFollow", tr("Following Distance"), tr("How many seconds openpilot follows behind lead vehicles when using the \"Relaxed\" profile. Increase for more space; decrease for tighter gaps.

Default: 1.75 seconds."), ""}, {"RelaxedFollowHigh", tr("High Speed Following Distance"), tr("Following distance for higher speeds in the \"Relaxed\" profile. openpilot smoothly blends from the base value to this value as speed rises."), ""}, {"RelaxedJerkAcceleration", tr("Acceleration Smoothness"), tr("How smoothly openpilot accelerates with the \"Relaxed\" profile. Increase for gentler starts; decrease for faster but more abrupt takeoffs."), ""}, @@ -142,7 +142,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"RelaxedJerkSpeed", tr("Speed-Up Response"), tr("How smoothly openpilot speeds up with the \"Relaxed\" profile. Increase for more gradual acceleration; decrease for quicker but more jolting acceleration."), ""}, {"ResetRelaxedPersonality", tr("Reset to Defaults"), tr("Reset the \"Relaxed\" profile to defaults."), ""}, - {"LongitudinalTune", tr("Longitudinal Tuning"), tr("Acceleration and braking control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_longitudinal_tune.png"}, + {"LongitudinalTune", tr("Longitudinal Tuning"), tr("Acceleration and braking control changes to fine-tune how openpilot drives."), "../../starpilot/assets/toggle_icons/icon_longitudinal_tune.png"}, {"AccelerationProfile", tr("Acceleration Profile"), tr("How quickly openpilot speeds up. \"Eco\" is gentle and efficient, \"Sport\" is firmer and more responsive, and \"Sport+\" accelerates at the maximum rate allowed."), ""}, {"DecelerationProfile", tr("Deceleration Profile"), tr("How firmly openpilot slows down. \"Eco\" favors coasting, \"Sport\" applies stronger braking."), ""}, {"HumanAcceleration", tr("Human-Like Acceleration"), tr("Acceleration that mimics human behavior by easing the throttle at low speeds and adding extra power when taking off from a stop."), ""}, @@ -151,7 +151,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"LeadDetectionThreshold", tr("Lead Detection Sensitivity"), tr("How sensitive openpilot is to detecting vehicles. Higher sensitivity allows quicker detection at longer distances but may react to non-vehicle objects; lower sensitivity is more conservative and reduces false detections."), ""}, {"TacoTune", tr("\"Taco Bell Run\" Turn Speed Hack"), tr("The turn-speed hack from comma's 2022 \"Taco Bell Run\". Designed to slow down for left and right turns."), ""}, - {"QOLLongitudinal", tr("Quality of Life"), tr("Miscellaneous acceleration and braking control changes to fine-tune how openpilot drives."), "../../frogpilot/assets/toggle_icons/icon_quality_of_life.png"}, + {"QOLLongitudinal", tr("Quality of Life"), tr("Miscellaneous acceleration and braking control changes to fine-tune how openpilot drives."), "../../starpilot/assets/toggle_icons/icon_quality_of_life.png"}, {"CustomCruise", tr("Cruise Interval"), tr("How much the set speed increases or decreases for each + or – cruise control button press."), ""}, {"CustomCruiseLong", tr("Cruise Interval (Hold)"), tr("How much the set speed increases or decreases while holding the + or – cruise control buttons."), ""}, {"ForceStops", tr("Force Stop at \"Detected\" Stop Lights/Signs"), tr("Force openpilot to stop whenever the driving model \"detects\" a red light or stop sign.

Disclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!"), ""}, @@ -187,7 +187,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * {"SetWeatherKey", tr("Set Your Own Key"), tr("Set your own \"OpenWeatherMap\" key to increase the weather update rate.

Personal keys grant 1,000 free calls per day, allowing for updates every minute. The default key is shared and only updates every 15 minutes."), ""}, - {"SpeedLimitController", tr("Speed Limit Controller"), tr("Limit openpilot's maximum driving speed to the current speed limit obtained from downloaded maps, Mapbox, or the dashboard for supported vehicles (Ford, Genesis, Hyundai, Kia, Lexus, Toyota)."), "../../frogpilot/assets/toggle_icons/icon_speed_limit.png"}, + {"SpeedLimitController", tr("Speed Limit Controller"), tr("Limit openpilot's maximum driving speed to the current speed limit obtained from downloaded maps, Mapbox, or the dashboard for supported vehicles (Ford, Genesis, Hyundai, Kia, Lexus, Toyota)."), "../../starpilot/assets/toggle_icons/icon_speed_limit.png"}, {"SLCFallback", tr("Fallback Speed"), tr("The speed used by \"Speed Limit Controller\" when no speed limit is found.

- Set Speed: Use the cruise set speed
- Experimental Mode: Estimate the limit using the driving model
- Previous Limit: Keep using the last confirmed limit"), ""}, {"SLCOverride", tr("Override Speed"), tr("The speed used by \"Speed Limit Controller\" after you manually drive faster than the posted limit.

- Set with Gas Pedal: Use the highest speed reached while pressing the gas
- Max Set Speed: Use the cruise set speed

Overrides clear when openpilot disengages."), ""}, {"SLCQOL", tr("Quality of Life"), tr("Miscellaneous \"Speed Limit Controller\" changes to fine-tune how openpilot drives."), ""}, @@ -214,65 +214,65 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * AbstractControl *longitudinalToggle; if (param == "AdvancedLongitudinalTune") { - FrogPilotManageControl *advancedLongitudinalTuneToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(advancedLongitudinalTuneToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, advancedLongitudinalTunePanel]() { + StarPilotManageControl *advancedLongitudinalTuneToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(advancedLongitudinalTuneToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, advancedLongitudinalTunePanel]() { longitudinalLayout->setCurrentWidget(advancedLongitudinalTunePanel); }); longitudinalToggle = advancedLongitudinalTuneToggle; } else if (param == "LongitudinalActuatorDelay") { - longitudinalActuatorDelayToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 1, tr(" seconds"), std::map(), 0.01); + longitudinalActuatorDelayToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 1, tr(" seconds"), std::map(), 0.01); longitudinalToggle = longitudinalActuatorDelayToggle; } else if (param == "MaxDesiredAcceleration") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.1, 4.0, tr(" m/s²"), std::map(), 0.1); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0.1, 4.0, tr(" m/s²"), std::map(), 0.1); } else if (param == "StartAccel") { - startAccelToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 4, tr(" m/s²"), std::map(), 0.01, true); + startAccelToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 4, tr(" m/s²"), std::map(), 0.01, true); longitudinalToggle = startAccelToggle; } else if (param == "VEgoStarting") { - vEgoStartingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.01, 1, tr(" m/s²"), std::map(), 0.01); + vEgoStartingToggle = new StarPilotParamValueControl(param, title, desc, icon, 0.01, 1, tr(" m/s²"), std::map(), 0.01); longitudinalToggle = vEgoStartingToggle; } else if (param == "StopAccel") { - stopAccelToggle = new FrogPilotParamValueControl(param, title, desc, icon, -4, 0, tr(" m/s²"), std::map(), 0.01, true); + stopAccelToggle = new StarPilotParamValueControl(param, title, desc, icon, -4, 0, tr(" m/s²"), std::map(), 0.01, true); longitudinalToggle = stopAccelToggle; } else if (param == "StoppingDecelRate") { - stoppingDecelRateToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.001, 1, tr(" m/s²"), std::map(), 0.001, true); + stoppingDecelRateToggle = new StarPilotParamValueControl(param, title, desc, icon, 0.001, 1, tr(" m/s²"), std::map(), 0.001, true); longitudinalToggle = stoppingDecelRateToggle; } else if (param == "VEgoStopping") { - vEgoStoppingToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.01, 1, tr(" m/s²"), std::map(), 0.01); + vEgoStoppingToggle = new StarPilotParamValueControl(param, title, desc, icon, 0.01, 1, tr(" m/s²"), std::map(), 0.01); longitudinalToggle = vEgoStoppingToggle; } else if (param == "ConditionalExperimental") { - FrogPilotManageControl *conditionalExperimentalToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(conditionalExperimentalToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, conditionalExperimentalPanel]() { + StarPilotManageControl *conditionalExperimentalToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(conditionalExperimentalToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, conditionalExperimentalPanel]() { longitudinalLayout->setCurrentWidget(conditionalExperimentalPanel); }); longitudinalToggle = conditionalExperimentalToggle; } else if (param == "CESpeed") { - FrogPilotParamValueControl *CESpeed = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr(" mph"), std::map(), 1, true, 175); - FrogPilotParamValueControl *CESpeedLead = new FrogPilotParamValueControl("CESpeedLead", tr("With Lead"), tr("Switch to \"Experimental Mode\" when driving below this speed with a lead to help openpilot handle low-speed situations more smoothly."), icon, 0, 99, tr(" mph"), std::map(), 1, true, 175); - FrogPilotDualParamValueControl *conditionalSpeeds = new FrogPilotDualParamValueControl(CESpeed, CESpeedLead); + StarPilotParamValueControl *CESpeed = new StarPilotParamValueControl(param, title, desc, icon, 0, 99, tr(" mph"), std::map(), 1, true, 175); + StarPilotParamValueControl *CESpeedLead = new StarPilotParamValueControl("CESpeedLead", tr("With Lead"), tr("Switch to \"Experimental Mode\" when driving below this speed with a lead to help openpilot handle low-speed situations more smoothly."), icon, 0, 99, tr(" mph"), std::map(), 1, true, 175); + StarPilotDualParamValueControl *conditionalSpeeds = new StarPilotDualParamValueControl(CESpeed, CESpeedLead); longitudinalToggle = reinterpret_cast(conditionalSpeeds); } else if (param == "CECurves") { std::vector curveToggles{"CECurvesLead"}; std::vector curveToggleNames{tr("With Lead")}; - longitudinalToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, curveToggles, curveToggleNames); + longitudinalToggle = new StarPilotButtonToggleControl(param, title, desc, icon, curveToggles, curveToggleNames); } else if (param == "CELead") { std::vector leadToggles{"CESlowerLead", "CEStoppedLead"}; std::vector leadToggleNames{tr("Slower Lead"), tr("Stopped Lead")}; - longitudinalToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, leadToggles, leadToggleNames); + longitudinalToggle = new StarPilotButtonToggleControl(param, title, desc, icon, leadToggles, leadToggleNames); } else if (param == "CEModelStopTime") { std::map stopTimeLabels; for (int i = 0; i <= 10; ++i) { stopTimeLabels[i] = i == 0 ? tr("Off") : i == 1 ? QString::number(i) + tr(" second") : QString::number(i) + tr(" seconds"); } - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 9, QString(), stopTimeLabels); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 9, QString(), stopTimeLabels); } else if (param == "CESignalSpeed") { std::vector ceSignalToggles{"CESignalLaneDetection"}; std::vector ceSignalToggleNames{tr("Not For Detected Lanes")}; - longitudinalToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0, 99, tr(" mph"), std::map(), 1.0, true, ceSignalToggles, ceSignalToggleNames, true); + longitudinalToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 0, 99, tr(" mph"), std::map(), 1.0, true, ceSignalToggles, ceSignalToggleNames, true); } else if (param == "CurveSpeedController") { - FrogPilotManageControl *curveControlToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(curveControlToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, curveSpeedPanel]() { + StarPilotManageControl *curveControlToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(curveControlToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, curveSpeedPanel]() { longitudinalLayout->setCurrentWidget(curveSpeedPanel); }); longitudinalToggle = curveControlToggle; @@ -285,7 +285,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } else if (param == "ResetCurveData") { ButtonControl *resetCurveDataButton = new ButtonControl(title, tr("RESET"), desc); QObject::connect(resetCurveDataButton, &ButtonControl::clicked, [this]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your curvature data?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your curvature data?"), this)) { params.putFloat("CalibratedLateralAcceleration", 2.00); params.remove("CalibrationProgress"); params.remove("CurvatureData"); @@ -297,8 +297,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * longitudinalToggle = resetCurveDataButton; } else if (param == "CustomPersonalities") { - FrogPilotManageControl *customPersonalitiesToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(customPersonalitiesToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, customDrivingPersonalityPanel]() { + StarPilotManageControl *customPersonalitiesToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(customPersonalitiesToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, customDrivingPersonalityPanel]() { longitudinalLayout->setCurrentWidget(customDrivingPersonalityPanel); }); longitudinalToggle = customPersonalitiesToggle; @@ -306,8 +306,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * ButtonControl *resetButton = new ButtonControl(title, tr("RESET"), desc); longitudinalToggle = resetButton; } else if (param == "TrafficPersonalityProfile") { - FrogPilotButtonsControl *trafficPersonalityToggle = new FrogPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); - QObject::connect(trafficPersonalityToggle, &FrogPilotButtonsControl::buttonClicked, [longitudinalLayout, trafficPersonalityPanel, this](int id) { + StarPilotButtonsControl *trafficPersonalityToggle = new StarPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); + QObject::connect(trafficPersonalityToggle, &StarPilotButtonsControl::buttonClicked, [longitudinalLayout, trafficPersonalityPanel, this](int id) { openSubSubPanel(); longitudinalLayout->setCurrentWidget(trafficPersonalityPanel); @@ -316,8 +316,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * }); longitudinalToggle = trafficPersonalityToggle; } else if (param == "AggressivePersonalityProfile") { - FrogPilotButtonsControl *aggressivePersonalityToggle = new FrogPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); - QObject::connect(aggressivePersonalityToggle, &FrogPilotButtonsControl::buttonClicked, [longitudinalLayout, aggressivePersonalityPanel, this](int id) { + StarPilotButtonsControl *aggressivePersonalityToggle = new StarPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); + QObject::connect(aggressivePersonalityToggle, &StarPilotButtonsControl::buttonClicked, [longitudinalLayout, aggressivePersonalityPanel, this](int id) { openSubSubPanel(); longitudinalLayout->setCurrentWidget(aggressivePersonalityPanel); @@ -326,8 +326,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * }); longitudinalToggle = aggressivePersonalityToggle; } else if (param == "StandardPersonalityProfile") { - FrogPilotButtonsControl *standardPersonalityToggle = new FrogPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); - QObject::connect(standardPersonalityToggle, &FrogPilotButtonsControl::buttonClicked, [longitudinalLayout, standardPersonalityPanel, this](int id) { + StarPilotButtonsControl *standardPersonalityToggle = new StarPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); + QObject::connect(standardPersonalityToggle, &StarPilotButtonsControl::buttonClicked, [longitudinalLayout, standardPersonalityPanel, this](int id) { openSubSubPanel(); longitudinalLayout->setCurrentWidget(standardPersonalityPanel); @@ -336,8 +336,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * }); longitudinalToggle = standardPersonalityToggle; } else if (param == "RelaxedPersonalityProfile") { - FrogPilotButtonsControl *relaxedPersonalityToggle = new FrogPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); - QObject::connect(relaxedPersonalityToggle, &FrogPilotButtonsControl::buttonClicked, [longitudinalLayout, relaxedPersonalityPanel, this](int id) { + StarPilotButtonsControl *relaxedPersonalityToggle = new StarPilotButtonsControl(title, desc, icon, {tr("MANAGE")}); + QObject::connect(relaxedPersonalityToggle, &StarPilotButtonsControl::buttonClicked, [longitudinalLayout, relaxedPersonalityPanel, this](int id) { openSubSubPanel(); longitudinalLayout->setCurrentWidget(relaxedPersonalityPanel); @@ -353,17 +353,17 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * followTimeLabels[i] = std::lround(i / 0.01) == 1 / 0.01 ? QString::number(i, 'f', 2) + tr(" second") : QString::number(i, 'f', 2) + tr(" seconds"); } if (param == "TrafficFollow") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0.5, 3, QString(), followTimeLabels, 0.01, true); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0.5, 3, QString(), followTimeLabels, 0.01, true); } else { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 3, QString(), followTimeLabels, 0.01, true); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 1, 3, QString(), followTimeLabels, 0.01, true); } } else { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 25, 200, "%"); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 25, 200, "%"); } } else if (param == "LongitudinalTune") { - FrogPilotManageControl *longitudinalTuneToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(longitudinalTuneToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, longitudinalTunePanel]() { + StarPilotManageControl *longitudinalTuneToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(longitudinalTuneToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, longitudinalTunePanel]() { longitudinalLayout->setCurrentWidget(longitudinalTunePanel); }); longitudinalToggle = longitudinalTuneToggle; @@ -376,29 +376,29 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * ButtonParamControl *decelerationProfileToggle = new ButtonParamControl(param, title, desc, icon, decelerationProfiles); longitudinalToggle = decelerationProfileToggle; } else if (param == "LeadDetectionThreshold") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 25, 50, "%"); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 25, 50, "%"); } else if (param == "QOLLongitudinal") { - FrogPilotManageControl *qolLongitudinalToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(qolLongitudinalToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, qolPanel]() { + StarPilotManageControl *qolLongitudinalToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(qolLongitudinalToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, qolPanel]() { longitudinalLayout->setCurrentWidget(qolPanel); }); longitudinalToggle = qolLongitudinalToggle; } else if (param == "CustomCruise") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, tr(" mph")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 1, 99, tr(" mph")); } else if (param == "CustomCruiseLong") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 1, 99, tr(" mph")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 1, 99, tr(" mph")); } else if (param == "IncreasedStoppedDistance") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet")); } else if (param == "MapGears") { std::vector mapGearsToggles{"MapAcceleration", "MapDeceleration"}; std::vector mapGearsToggleNames{tr("Acceleration"), tr("Deceleration")}; - longitudinalToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, mapGearsToggles, mapGearsToggleNames); + longitudinalToggle = new StarPilotButtonToggleControl(param, title, desc, icon, mapGearsToggles, mapGearsToggleNames); } else if (param == "SetSpeedOffset") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, tr(" mph")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 99, tr(" mph")); } else if (param == "WeatherPresets") { - FrogPilotManageControl *weatherToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(weatherToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, weatherPanel, this]() { + StarPilotManageControl *weatherToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(weatherToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, weatherPanel, this]() { openSubSubPanel(); longitudinalLayout->setCurrentWidget(weatherPanel); @@ -407,11 +407,11 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * }); longitudinalToggle = weatherToggle; } else if (param == "SetWeatherKey") { - weatherKeyControl = new FrogPilotButtonsControl(title, desc, icon, {tr("ADD"), tr("TEST")}); - QObject::connect(weatherKeyControl, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + weatherKeyControl = new StarPilotButtonsControl(title, desc, icon, {tr("ADD"), tr("TEST")}); + QObject::connect(weatherKeyControl, &StarPilotButtonsControl::buttonClicked, [this](int id) { if (id == 0) { if (!params.get("WeatherToken").empty()) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to remove your key?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to remove your key?"), this)) { params.remove("WeatherToken"); weatherKeyControl->setText(0, tr("ADD")); @@ -515,17 +515,17 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * for (float i = 0; i <= 3; i += 0.01) { followTimeLabels[i] = std::lround(i / 0.01) == 1 / 0.01 ? QString::number(i, 'f', 2) + tr(" second") : QString::number(i, 'f', 2) + tr(" seconds"); } - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 3, QString(), followTimeLabels, 0.01, true); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 3, QString(), followTimeLabels, 0.01, true); } else if (param == "IncreasedStoppedDistanceLowVisibility" || param == "IncreasedStoppedDistanceRain" || param == "IncreasedStoppedDistanceRainStorm" || param == "IncreasedStoppedDistanceSnow") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet")); } else if (param == "ReduceAccelerationLowVisibility" || param == "ReduceAccelerationRain" || param == "ReduceAccelerationRainStorm" || param == "ReduceAccelerationSnow") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, "%", std::map(), 1); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 99, "%", std::map(), 1); } else if (param == "ReduceLateralAccelerationLowVisibility" || param == "ReduceLateralAccelerationRain" || param == "ReduceLateralAccelerationRainStorm" || param == "ReduceLateralAccelerationSnow") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 99, "%", std::map(), 1); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 99, "%", std::map(), 1); } else if (param == "SpeedLimitController") { - FrogPilotManageControl *speedLimitControllerToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(speedLimitControllerToggle, &FrogPilotManageControl::manageButtonClicked, [longitudinalLayout, speedLimitControllerPanel]() { + StarPilotManageControl *speedLimitControllerToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(speedLimitControllerToggle, &StarPilotManageControl::manageButtonClicked, [longitudinalLayout, speedLimitControllerPanel]() { longitudinalLayout->setCurrentWidget(speedLimitControllerPanel); }); longitudinalToggle = speedLimitControllerToggle; @@ -604,7 +604,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * }); longitudinalToggle = manageSLCOffsetsButton; } else if (speedLimitControllerOffsetsKeys.contains(param)) { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, -99, 99, tr(" mph")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, -99, 99, tr(" mph")); } else if (param == "SLCQOL") { ButtonControl *manageSLCQOLButton = new ButtonControl(title, tr("MANAGE"), desc); QObject::connect(manageSLCQOLButton, &ButtonControl::clicked, [longitudinalLayout, speedLimitControllerQOLPanel, this]() { @@ -618,9 +618,9 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } else if (param == "SLCConfirmation") { std::vector confirmationToggles{"SLCConfirmationLower", "SLCConfirmationHigher"}; std::vector confirmationToggleNames{tr("Lower Limits"), tr("Higher Limits")}; - longitudinalToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, confirmationToggles, confirmationToggleNames); + longitudinalToggle = new StarPilotButtonToggleControl(param, title, desc, icon, confirmationToggles, confirmationToggleNames); } else if (param == "SLCLookaheadHigher" || param == "SLCLookaheadLower") { - longitudinalToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 30, tr(" seconds")); + longitudinalToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 30, tr(" seconds")); } else if (param == "SLCVisuals") { ButtonControl *manageSLCVisualsButton = new ButtonControl(title, tr("MANAGE"), desc); QObject::connect(manageSLCVisualsButton, &ButtonControl::clicked, [longitudinalLayout, speedLimitControllerVisualPanel, this]() { @@ -682,8 +682,8 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * parentKeys.insert(param); } - if (FrogPilotManageControl *frogPilotManageToggle = qobject_cast(longitudinalToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + if (StarPilotManageControl *frogPilotManageToggle = qobject_cast(longitudinalToggle)) { + QObject::connect(frogPilotManageToggle, &StarPilotManageControl::manageButtonClicked, [this]() { emit openSubPanel(); openDescriptions(forceOpenDescriptions, toggles); }); @@ -699,7 +699,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * QSet forceUpdateKeys = {"HumanAcceleration", "LongitudinalTune"}; for (const QString &key : forceUpdateKeys) { - QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &FrogPilotLongitudinalPanel::updateToggles); + QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &StarPilotLongitudinalPanel::updateToggles); } QObject::connect(static_cast(toggles["EVTuning"]), &ToggleControl::toggleFlipped, this, [this]() { @@ -715,15 +715,15 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * updateToggles(); }); - FrogPilotParamValueControl *trafficFollowToggle = static_cast(toggles["TrafficFollow"]); - FrogPilotParamValueControl *trafficAccelerationToggle = static_cast(toggles["TrafficJerkAcceleration"]); - FrogPilotParamValueControl *trafficDecelerationToggle = static_cast(toggles["TrafficJerkDeceleration"]); - FrogPilotParamValueControl *trafficDangerToggle = static_cast(toggles["TrafficJerkDanger"]); - FrogPilotParamValueControl *trafficSpeedToggle = static_cast(toggles["TrafficJerkSpeed"]); - FrogPilotParamValueControl *trafficSpeedDecreaseToggle = static_cast(toggles["TrafficJerkSpeedDecrease"]); - FrogPilotButtonsControl *trafficResetButton = static_cast(toggles["ResetTrafficPersonality"]); - QObject::connect(trafficResetButton, &FrogPilotButtonsControl::buttonClicked, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for Traffic Mode?"), this)) { + StarPilotParamValueControl *trafficFollowToggle = static_cast(toggles["TrafficFollow"]); + StarPilotParamValueControl *trafficAccelerationToggle = static_cast(toggles["TrafficJerkAcceleration"]); + StarPilotParamValueControl *trafficDecelerationToggle = static_cast(toggles["TrafficJerkDeceleration"]); + StarPilotParamValueControl *trafficDangerToggle = static_cast(toggles["TrafficJerkDanger"]); + StarPilotParamValueControl *trafficSpeedToggle = static_cast(toggles["TrafficJerkSpeed"]); + StarPilotParamValueControl *trafficSpeedDecreaseToggle = static_cast(toggles["TrafficJerkSpeedDecrease"]); + StarPilotButtonsControl *trafficResetButton = static_cast(toggles["ResetTrafficPersonality"]); + QObject::connect(trafficResetButton, &StarPilotButtonsControl::buttonClicked, [=]() { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for Traffic Mode?"), this)) { params.putFloat("TrafficFollow", std::stof(params.getKeyDefaultValue("TrafficFollow").value())); params.putFloat("TrafficJerkAcceleration", std::stof(params.getKeyDefaultValue("TrafficJerkAcceleration").value())); params.putFloat("TrafficJerkDeceleration", std::stof(params.getKeyDefaultValue("TrafficJerkDeceleration").value())); @@ -740,16 +740,16 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } }); - FrogPilotParamValueControl *aggressiveFollowToggle = static_cast(toggles["AggressiveFollow"]); - FrogPilotParamValueControl *aggressiveFollowHighToggle = static_cast(toggles["AggressiveFollowHigh"]); - FrogPilotParamValueControl *aggressiveAccelerationToggle = static_cast(toggles["AggressiveJerkAcceleration"]); - FrogPilotParamValueControl *aggressiveDecelerationToggle = static_cast(toggles["AggressiveJerkDeceleration"]); - FrogPilotParamValueControl *aggressiveDangerToggle = static_cast(toggles["AggressiveJerkDanger"]); - FrogPilotParamValueControl *aggressiveSpeedToggle = static_cast(toggles["AggressiveJerkSpeed"]); - FrogPilotParamValueControl *aggressiveSpeedDecreaseToggle = static_cast(toggles["AggressiveJerkSpeedDecrease"]); - FrogPilotButtonsControl *aggressiveResetButton = static_cast(toggles["ResetAggressivePersonality"]); - QObject::connect(aggressiveResetButton, &FrogPilotButtonsControl::buttonClicked, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the Aggressive personality?"), this)) { + StarPilotParamValueControl *aggressiveFollowToggle = static_cast(toggles["AggressiveFollow"]); + StarPilotParamValueControl *aggressiveFollowHighToggle = static_cast(toggles["AggressiveFollowHigh"]); + StarPilotParamValueControl *aggressiveAccelerationToggle = static_cast(toggles["AggressiveJerkAcceleration"]); + StarPilotParamValueControl *aggressiveDecelerationToggle = static_cast(toggles["AggressiveJerkDeceleration"]); + StarPilotParamValueControl *aggressiveDangerToggle = static_cast(toggles["AggressiveJerkDanger"]); + StarPilotParamValueControl *aggressiveSpeedToggle = static_cast(toggles["AggressiveJerkSpeed"]); + StarPilotParamValueControl *aggressiveSpeedDecreaseToggle = static_cast(toggles["AggressiveJerkSpeedDecrease"]); + StarPilotButtonsControl *aggressiveResetButton = static_cast(toggles["ResetAggressivePersonality"]); + QObject::connect(aggressiveResetButton, &StarPilotButtonsControl::buttonClicked, [=]() { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the Aggressive personality?"), this)) { params.putFloat("AggressiveFollow", std::stof(params.getKeyDefaultValue("AggressiveFollow").value())); params.putFloat("AggressiveFollowHigh", std::stof(params.getKeyDefaultValue("AggressiveFollowHigh").value())); params.putFloat("AggressiveJerkAcceleration", std::stof(params.getKeyDefaultValue("AggressiveJerkAcceleration").value())); @@ -768,16 +768,16 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } }); - FrogPilotParamValueControl *standardFollowToggle = static_cast(toggles["StandardFollow"]); - FrogPilotParamValueControl *standardFollowHighToggle = static_cast(toggles["StandardFollowHigh"]); - FrogPilotParamValueControl *standardAccelerationToggle = static_cast(toggles["StandardJerkAcceleration"]); - FrogPilotParamValueControl *standardDecelerationToggle = static_cast(toggles["StandardJerkDeceleration"]); - FrogPilotParamValueControl *standardDangerToggle = static_cast(toggles["StandardJerkDanger"]); - FrogPilotParamValueControl *standardSpeedToggle = static_cast(toggles["StandardJerkSpeed"]); - FrogPilotParamValueControl *standardSpeedDecreaseToggle = static_cast(toggles["StandardJerkSpeedDecrease"]); - FrogPilotButtonsControl *standardResetButton = static_cast(toggles["ResetStandardPersonality"]); - QObject::connect(standardResetButton, &FrogPilotButtonsControl::buttonClicked, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the Standard personality?"), this)) { + StarPilotParamValueControl *standardFollowToggle = static_cast(toggles["StandardFollow"]); + StarPilotParamValueControl *standardFollowHighToggle = static_cast(toggles["StandardFollowHigh"]); + StarPilotParamValueControl *standardAccelerationToggle = static_cast(toggles["StandardJerkAcceleration"]); + StarPilotParamValueControl *standardDecelerationToggle = static_cast(toggles["StandardJerkDeceleration"]); + StarPilotParamValueControl *standardDangerToggle = static_cast(toggles["StandardJerkDanger"]); + StarPilotParamValueControl *standardSpeedToggle = static_cast(toggles["StandardJerkSpeed"]); + StarPilotParamValueControl *standardSpeedDecreaseToggle = static_cast(toggles["StandardJerkSpeedDecrease"]); + StarPilotButtonsControl *standardResetButton = static_cast(toggles["ResetStandardPersonality"]); + QObject::connect(standardResetButton, &StarPilotButtonsControl::buttonClicked, [=]() { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the Standard personality?"), this)) { params.putFloat("StandardFollow", std::stof(params.getKeyDefaultValue("StandardFollow").value())); params.putFloat("StandardFollowHigh", std::stof(params.getKeyDefaultValue("StandardFollowHigh").value())); params.putFloat("StandardJerkAcceleration", std::stof(params.getKeyDefaultValue("StandardJerkAcceleration").value())); @@ -796,16 +796,16 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * } }); - FrogPilotParamValueControl *relaxedFollowToggle = static_cast(toggles["RelaxedFollow"]); - FrogPilotParamValueControl *relaxedFollowHighToggle = static_cast(toggles["RelaxedFollowHigh"]); - FrogPilotParamValueControl *relaxedAccelerationToggle = static_cast(toggles["RelaxedJerkAcceleration"]); - FrogPilotParamValueControl *relaxedDecelerationToggle = static_cast(toggles["RelaxedJerkDeceleration"]); - FrogPilotParamValueControl *relaxedDangerToggle = static_cast(toggles["RelaxedJerkDanger"]); - FrogPilotParamValueControl *relaxedSpeedToggle = static_cast(toggles["RelaxedJerkSpeed"]); - FrogPilotParamValueControl *relaxedSpeedDecreaseToggle = static_cast(toggles["RelaxedJerkSpeedDecrease"]); - FrogPilotButtonsControl *relaxedResetButton = static_cast(toggles["ResetRelaxedPersonality"]); - QObject::connect(relaxedResetButton, &FrogPilotButtonsControl::buttonClicked, [=]() { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the Relaxed personality?"), this)) { + StarPilotParamValueControl *relaxedFollowToggle = static_cast(toggles["RelaxedFollow"]); + StarPilotParamValueControl *relaxedFollowHighToggle = static_cast(toggles["RelaxedFollowHigh"]); + StarPilotParamValueControl *relaxedAccelerationToggle = static_cast(toggles["RelaxedJerkAcceleration"]); + StarPilotParamValueControl *relaxedDecelerationToggle = static_cast(toggles["RelaxedJerkDeceleration"]); + StarPilotParamValueControl *relaxedDangerToggle = static_cast(toggles["RelaxedJerkDanger"]); + StarPilotParamValueControl *relaxedSpeedToggle = static_cast(toggles["RelaxedJerkSpeed"]); + StarPilotParamValueControl *relaxedSpeedDecreaseToggle = static_cast(toggles["RelaxedJerkSpeedDecrease"]); + StarPilotButtonsControl *relaxedResetButton = static_cast(toggles["ResetRelaxedPersonality"]); + QObject::connect(relaxedResetButton, &StarPilotButtonsControl::buttonClicked, [=]() { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your settings for the Relaxed personality?"), this)) { params.putFloat("RelaxedFollow", std::stof(params.getKeyDefaultValue("RelaxedFollow").value())); params.putFloat("RelaxedFollowHigh", std::stof(params.getKeyDefaultValue("RelaxedFollowHigh").value())); params.putFloat("RelaxedJerkAcceleration", std::stof(params.getKeyDefaultValue("RelaxedJerkAcceleration").value())); @@ -826,11 +826,11 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * openDescriptions(forceOpenDescriptions, toggles); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [longitudinalLayout, longitudinalPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [longitudinalLayout, longitudinalPanel, this] { openDescriptions(forceOpenDescriptions, toggles); longitudinalLayout->setCurrentWidget(longitudinalPanel); }); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubSubPanel, [longitudinalLayout, customDrivingPersonalityPanel, qolPanel, speedLimitControllerPanel, this]() { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubSubPanel, [longitudinalLayout, customDrivingPersonalityPanel, qolPanel, speedLimitControllerPanel, this]() { openDescriptions(forceOpenDescriptions, toggles); if (customPersonalityOpen) { @@ -847,7 +847,7 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * slcOpen = false; } }); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubSubSubPanel, [longitudinalLayout, weatherPanel, this]() { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubSubSubPanel, [longitudinalLayout, weatherPanel, this]() { openDescriptions(forceOpenDescriptions, toggles); if (weatherOpen) { @@ -856,11 +856,11 @@ FrogPilotLongitudinalPanel::FrogPilotLongitudinalPanel(FrogPilotSettingsWindow * weatherOpen = false; } }); - QObject::connect(parent, &FrogPilotSettingsWindow::updateMetric, this, &FrogPilotLongitudinalPanel::updateMetric); + QObject::connect(parent, &StarPilotSettingsWindow::updateMetric, this, &StarPilotLongitudinalPanel::updateMetric); } -void FrogPilotLongitudinalPanel::showEvent(QShowEvent *event) { - FrogPilotUIState &fs = *frogpilotUIState(); +void StarPilotLongitudinalPanel::showEvent(QShowEvent *event) { + StarPilotUIState &fs = *starpilotUIState(); calibratedLateralAccelerationLabel->setText(QString::number(params.getFloat("CalibratedLateralAcceleration"), 'f', 2) + tr(" m/s²")); calibrationProgressLabel->setText(QString::number(params.getFloat("CalibrationProgress"), 'f', 2) + "%"); @@ -874,12 +874,12 @@ void FrogPilotLongitudinalPanel::showEvent(QShowEvent *event) { bool keyExists = !params.get("WeatherToken").empty(); weatherKeyControl->setText(0, keyExists ? tr("REMOVE") : tr("ADD")); - weatherKeyControl->setVisibleButton(1, keyExists && fs.frogpilot_scene.online); + weatherKeyControl->setVisibleButton(1, keyExists && fs.starpilot_scene.online); updateToggles(); } -void FrogPilotLongitudinalPanel::updateMetric(bool metric, bool bootRun) { +void StarPilotLongitudinalPanel::updateMetric(bool metric, bool bootRun) { static bool previousMetric; if (metric != previousMetric && !bootRun) { double distanceConversion = metric ? FOOT_TO_METER : METER_TO_FOOT; @@ -933,23 +933,23 @@ void FrogPilotLongitudinalPanel::updateMetric(bool metric, bool bootRun) { labelsInitialized = true; } - FrogPilotDualParamValueControl *ceSpeedToggle = reinterpret_cast(toggles["CESpeed"]); - FrogPilotParamValueButtonControl *ceSignal = static_cast(toggles["CESignalSpeed"]); - FrogPilotParamValueControl *customCruiseToggle = static_cast(toggles["CustomCruise"]); - FrogPilotParamValueControl *customCruiseLongToggle = static_cast(toggles["CustomCruiseLong"]); - FrogPilotParamValueControl *offset1Toggle = static_cast(toggles["Offset1"]); - FrogPilotParamValueControl *offset2Toggle = static_cast(toggles["Offset2"]); - FrogPilotParamValueControl *offset3Toggle = static_cast(toggles["Offset3"]); - FrogPilotParamValueControl *offset4Toggle = static_cast(toggles["Offset4"]); - FrogPilotParamValueControl *offset5Toggle = static_cast(toggles["Offset5"]); - FrogPilotParamValueControl *offset6Toggle = static_cast(toggles["Offset6"]); - FrogPilotParamValueControl *offset7Toggle = static_cast(toggles["Offset7"]); - FrogPilotParamValueControl *increasedStoppedDistanceToggle = static_cast(toggles["IncreasedStoppedDistance"]); - FrogPilotParamValueControl *increasedStoppedDistanceLowVisibilityToggle = static_cast(toggles["IncreasedStoppedDistanceLowVisibility"]); - FrogPilotParamValueControl *increasedStoppedDistanceRainToggle = static_cast(toggles["IncreasedStoppedDistanceRain"]); - FrogPilotParamValueControl *increasedStoppedDistanceRainStormToggle = static_cast(toggles["IncreasedStoppedDistanceRainStorm"]); - FrogPilotParamValueControl *increasedStoppedDistanceSnowToggle = static_cast(toggles["IncreasedStoppedDistanceSnow"]); - FrogPilotParamValueControl *setSpeedOffsetToggle = static_cast(toggles["SetSpeedOffset"]); + StarPilotDualParamValueControl *ceSpeedToggle = reinterpret_cast(toggles["CESpeed"]); + StarPilotParamValueButtonControl *ceSignal = static_cast(toggles["CESignalSpeed"]); + StarPilotParamValueControl *customCruiseToggle = static_cast(toggles["CustomCruise"]); + StarPilotParamValueControl *customCruiseLongToggle = static_cast(toggles["CustomCruiseLong"]); + StarPilotParamValueControl *offset1Toggle = static_cast(toggles["Offset1"]); + StarPilotParamValueControl *offset2Toggle = static_cast(toggles["Offset2"]); + StarPilotParamValueControl *offset3Toggle = static_cast(toggles["Offset3"]); + StarPilotParamValueControl *offset4Toggle = static_cast(toggles["Offset4"]); + StarPilotParamValueControl *offset5Toggle = static_cast(toggles["Offset5"]); + StarPilotParamValueControl *offset6Toggle = static_cast(toggles["Offset6"]); + StarPilotParamValueControl *offset7Toggle = static_cast(toggles["Offset7"]); + StarPilotParamValueControl *increasedStoppedDistanceToggle = static_cast(toggles["IncreasedStoppedDistance"]); + StarPilotParamValueControl *increasedStoppedDistanceLowVisibilityToggle = static_cast(toggles["IncreasedStoppedDistanceLowVisibility"]); + StarPilotParamValueControl *increasedStoppedDistanceRainToggle = static_cast(toggles["IncreasedStoppedDistanceRain"]); + StarPilotParamValueControl *increasedStoppedDistanceRainStormToggle = static_cast(toggles["IncreasedStoppedDistanceRainStorm"]); + StarPilotParamValueControl *increasedStoppedDistanceSnowToggle = static_cast(toggles["IncreasedStoppedDistanceSnow"]); + StarPilotParamValueControl *setSpeedOffsetToggle = static_cast(toggles["SetSpeedOffset"]); if (metric) { offset1Toggle->setTitle(tr("Speed Offset (0–29 km/h)")); @@ -1024,7 +1024,7 @@ void FrogPilotLongitudinalPanel::updateMetric(bool metric, bool bootRun) { } } -void FrogPilotLongitudinalPanel::updateToggles() { +void StarPilotLongitudinalPanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -1036,10 +1036,10 @@ void FrogPilotLongitudinalPanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "CEStopLights") { - setVisible &= parent->tuningLevel < parent->frogpilotToggleLevels["CEModelStopTime"].toDouble(); + setVisible &= parent->tuningLevel < parent->starpilotToggleLevels["CEModelStopTime"].toDouble(); } else if (key == "CustomCruise" || key == "CustomCruiseLong" || key == "SetSpeedLimit" || key == "SetSpeedOffset") { diff --git a/frogpilot/ui/qt/offroad/longitudinal_settings.h b/starpilot/ui/qt/offroad/longitudinal_settings.h similarity index 87% rename from frogpilot/ui/qt/offroad/longitudinal_settings.h rename to starpilot/ui/qt/offroad/longitudinal_settings.h index 711b94bf..ef5d71c8 100644 --- a/frogpilot/ui/qt/offroad/longitudinal_settings.h +++ b/starpilot/ui/qt/offroad/longitudinal_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotLongitudinalPanel : public FrogPilotListWidget { +class StarPilotLongitudinalPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotLongitudinalPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotLongitudinalPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -50,16 +50,16 @@ private: QSet parentKeys; - FrogPilotButtonsControl *weatherKeyControl; + StarPilotButtonsControl *weatherKeyControl; - FrogPilotParamValueControl *longitudinalActuatorDelayToggle; - FrogPilotParamValueControl *startAccelToggle; - FrogPilotParamValueControl *stopAccelToggle; - FrogPilotParamValueControl *stoppingDecelRateToggle; - FrogPilotParamValueControl *vEgoStartingToggle; - FrogPilotParamValueControl *vEgoStoppingToggle; + StarPilotParamValueControl *longitudinalActuatorDelayToggle; + StarPilotParamValueControl *startAccelToggle; + StarPilotParamValueControl *stopAccelToggle; + StarPilotParamValueControl *stoppingDecelRateToggle; + StarPilotParamValueControl *vEgoStartingToggle; + StarPilotParamValueControl *vEgoStoppingToggle; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; LabelControl *calibratedLateralAccelerationLabel; LabelControl *calibrationProgressLabel; diff --git a/frogpilot/ui/qt/offroad/maps_settings.cc b/starpilot/ui/qt/offroad/maps_settings.cc similarity index 85% rename from frogpilot/ui/qt/offroad/maps_settings.cc rename to starpilot/ui/qt/offroad/maps_settings.cc index 3aeee094..b240d322 100644 --- a/frogpilot/ui/qt/offroad/maps_settings.cc +++ b/starpilot/ui/qt/offroad/maps_settings.cc @@ -1,14 +1,14 @@ #include -#include "frogpilot/ui/qt/offroad/maps_settings.h" +#include "starpilot/ui/qt/offroad/maps_settings.h" -FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotMapsPanel::StarPilotMapsPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *mapsLayout = new QStackedLayout(); addItem(mapsLayout); - FrogPilotListWidget *settingsList = new FrogPilotListWidget(this); + StarPilotListWidget *settingsList = new StarPilotListWidget(this); std::vector scheduleOptions{tr("Manually"), tr("Weekly"), tr("Monthly")}; preferredSchedule = new ButtonParamControl("PreferredSchedule", tr("Automatically Update Maps"), @@ -21,7 +21,7 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for downloadMapsButton = new ButtonControl(tr("Download Maps"), tr("DOWNLOAD"), tr("Manually update your selected map sources so \"Speed Limit Controller\" has the latest speed limit information.")); QObject::connect(downloadMapsButton, &ButtonControl::clicked, [this] { if (downloadMapsButton->text() == tr("CANCEL")) { - if (FrogPilotConfirmationDialog::yesorno(tr("Cancel the download?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Cancel the download?"), this)) { cancelDownload(); } } else { @@ -32,10 +32,10 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for settingsList->addItem(lastMapsDownload = new LabelControl(tr("Last Updated"), params.get("LastMapsUpdate").empty() ? "Never" : QString::fromStdString(params.get("LastMapsUpdate")))); - selectMaps = new FrogPilotButtonsControl(tr("Map Sources"), + selectMaps = new StarPilotButtonsControl(tr("Map Sources"), tr("Select the countries or U.S. states to use with \"Speed Limit Controller\".") , "", {tr("COUNTRIES"), tr("STATES")}); - QObject::connect(selectMaps, &FrogPilotButtonsControl::buttonClicked, [mapsLayout, this](int id) { + QObject::connect(selectMaps, &StarPilotButtonsControl::buttonClicked, [mapsLayout, this](int id) { mapsLayout->setCurrentIndex(id + 1); openSubPanel(); @@ -52,7 +52,7 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for removeMapsButton = new ButtonControl(tr("Remove Maps"), tr("REMOVE"), tr("Delete downloaded map data to free up storage space.")); QObject::connect(removeMapsButton, &ButtonControl::clicked, [this] { - if (FrogPilotConfirmationDialog::yesorno(tr("Delete all downloaded maps?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Delete all downloaded maps?"), this)) { std::thread([this] { mapsSize->setText(tr("0 MB")); @@ -67,7 +67,7 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for ScrollView *settingsPanel = new ScrollView(settingsList, this); mapsLayout->addWidget(settingsPanel); - FrogPilotListWidget *countriesList = new FrogPilotListWidget(this); + StarPilotListWidget *countriesList = new StarPilotListWidget(this); std::vector>> countries = { {tr("Africa"), africaMap}, {tr("Antarctica"), antarcticaMap}, @@ -86,7 +86,7 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for ScrollView *countryMapsPanel = new ScrollView(countriesList, this); mapsLayout->addWidget(countryMapsPanel); - FrogPilotListWidget *statesList = new FrogPilotListWidget(this); + StarPilotListWidget *statesList = new StarPilotListWidget(this); std::vector>> states = { {tr("United States - Midwest"), midwestMap}, {tr("United States - Northeast"), northeastMap}, @@ -103,7 +103,7 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for ScrollView *stateMapsPanel = new ScrollView(statesList, this); mapsLayout->addWidget(stateMapsPanel); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [mapsLayout, settingsPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [mapsLayout, settingsPanel, this] { if (forceOpenDescriptions) { downloadMapsButton->showDescription(); preferredSchedule->showDescription(); @@ -115,10 +115,10 @@ FrogPilotMapsPanel::FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool for mapsLayout->setCurrentWidget(settingsPanel); }); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotMapsPanel::updateState); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotMapsPanel::updateState); } -void FrogPilotMapsPanel::showEvent(QShowEvent *event) { +void StarPilotMapsPanel::showEvent(QShowEvent *event) { if (forceOpenDescriptions) { downloadMapsButton->showDescription(); preferredSchedule->showDescription(); @@ -129,8 +129,8 @@ void FrogPilotMapsPanel::showEvent(QShowEvent *event) { UIState &s = *uiState(); UIScene &scene = s.scene; - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; SubMaster &fpsm = *(fs.sm); const cereal::MapdExtendedOut::Reader &mapdExtendedOut = fpsm["mapdExtendedOut"].getMapdExtendedOut(); @@ -143,7 +143,7 @@ void FrogPilotMapsPanel::showEvent(QShowEvent *event) { hasMapsSelected = !params.get("MapsSelected").empty(); - bool parked = !scene.started || frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !scene.started || starpilot_scene.parked || parent->isFrogsGoMoo; removeMapsButton->setVisible(mapsFolderPath.exists()); @@ -158,18 +158,18 @@ void FrogPilotMapsPanel::showEvent(QShowEvent *event) { updateDownloadLabels(mapDownloadDownloaded, mapDownloadTotal); } else { - downloadMapsButton->setEnabled(!cancellingDownload && hasMapsSelected && frogpilot_scene.online && parked); - downloadMapsButton->setValue(frogpilot_scene.online ? (parked ? "" : tr("Not parked")) : tr("Offline...")); + downloadMapsButton->setEnabled(!cancellingDownload && hasMapsSelected && starpilot_scene.online && parked); + downloadMapsButton->setValue(starpilot_scene.online ? (parked ? "" : tr("Not parked")) : tr("Offline...")); } } -void FrogPilotMapsPanel::updateState(const UIState &s, const FrogPilotUIState &fs) { +void StarPilotMapsPanel::updateState(const UIState &s, const StarPilotUIState &fs) { if (!isVisible()) { return; } - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; const UIScene &scene = s.scene; const SubMaster &fpsm = *(fs.sm); @@ -177,7 +177,7 @@ void FrogPilotMapsPanel::updateState(const UIState &s, const FrogPilotUIState &f const cereal::MapdDownloadProgress::Reader &downloadProgress = mapdExtendedOut.getDownloadProgress(); bool mapDownloadActive = downloadProgress.getActive(); - bool parked = !scene.started || frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !scene.started || starpilot_scene.parked || parent->isFrogsGoMoo; int mapDownloadDownloaded = downloadProgress.getDownloadedFiles(); int mapDownloadTotal = downloadProgress.getTotalFiles(); @@ -187,14 +187,14 @@ void FrogPilotMapsPanel::updateState(const UIState &s, const FrogPilotUIState &f } else if (downloadMapsButton->text() == tr("CANCEL")) { updateDownloadLabels(mapDownloadDownloaded, mapDownloadTotal); } else { - downloadMapsButton->setEnabled(!cancellingDownload && hasMapsSelected && frogpilot_scene.online && parked); - downloadMapsButton->setValue(frogpilot_scene.online ? (parked ? "" : tr("Not parked")) : tr("Offline...")); + downloadMapsButton->setEnabled(!cancellingDownload && hasMapsSelected && starpilot_scene.online && parked); + downloadMapsButton->setValue(starpilot_scene.online ? (parked ? "" : tr("Not parked")) : tr("Offline...")); } parent->keepScreenOn = mapDownloadActive; } -void FrogPilotMapsPanel::cancelDownload() { +void StarPilotMapsPanel::cancelDownload() { cancellingDownload = true; downloadMapsButton->setEnabled(false); @@ -225,7 +225,7 @@ void FrogPilotMapsPanel::cancelDownload() { }); } -void FrogPilotMapsPanel::startDownload() { +void StarPilotMapsPanel::startDownload() { downloadETA->setText(tr("Calculating...")); downloadMapsButton->setText(tr("CANCEL")); downloadStatus->setText(tr("Calculating...")); @@ -244,7 +244,7 @@ void FrogPilotMapsPanel::startDownload() { params_memory.putBool("DownloadMaps", true); } -void FrogPilotMapsPanel::updateDownloadLabels(int downloadedFiles, int totalFiles) { +void StarPilotMapsPanel::updateDownloadLabels(int downloadedFiles, int totalFiles) { if (downloadedFiles == totalFiles && totalFiles != 0) { downloadMapsButton->setText(tr("DOWNLOAD")); lastMapsDownload->setText(formatCurrentDate()); diff --git a/frogpilot/ui/qt/offroad/maps_settings.h b/starpilot/ui/qt/offroad/maps_settings.h similarity index 68% rename from frogpilot/ui/qt/offroad/maps_settings.h rename to starpilot/ui/qt/offroad/maps_settings.h index 2b9dba88..eb12ddbd 100644 --- a/frogpilot/ui/qt/offroad/maps_settings.h +++ b/starpilot/ui/qt/offroad/maps_settings.h @@ -1,13 +1,13 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" -#include "frogpilot/ui/qt/widgets/navigation_functions.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" +#include "starpilot/ui/qt/widgets/navigation_functions.h" -class FrogPilotMapsPanel : public FrogPilotListWidget { +class StarPilotMapsPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotMapsPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotMapsPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -19,7 +19,7 @@ private: void cancelDownload(); void startDownload(); void updateDownloadLabels(int downloadedFiles, int totalFiles); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); bool cancellingDownload; bool forceOpenDescriptions; @@ -30,9 +30,9 @@ private: ButtonParamControl *preferredSchedule; - FrogPilotButtonsControl *selectMaps; + StarPilotButtonsControl *selectMaps; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; LabelControl *downloadETA; LabelControl *downloadStatus; diff --git a/frogpilot/ui/qt/offroad/moc_data_settings.cc b/starpilot/ui/qt/offroad/moc_data_settings.cc similarity index 71% rename from frogpilot/ui/qt/offroad/moc_data_settings.cc rename to starpilot/ui/qt/offroad/moc_data_settings.cc index 3dd0d187..aa212342 100644 --- a/frogpilot/ui/qt/offroad/moc_data_settings.cc +++ b/starpilot/ui/qt/offroad/moc_data_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotDataPanel_t { +struct qt_meta_stringdata_StarPilotDataPanel_t { QByteArrayData data[3]; char stringdata0[33]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotDataPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotDataPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotDataPanel_t qt_meta_stringdata_FrogPilotDataPanel = { +static const qt_meta_stringdata_StarPilotDataPanel_t qt_meta_stringdata_StarPilotDataPanel = { { -QT_MOC_LITERAL(0, 0, 18), // "FrogPilotDataPanel" +QT_MOC_LITERAL(0, 0, 18), // "StarPilotDataPanel" QT_MOC_LITERAL(1, 19, 12), // "openSubPanel" QT_MOC_LITERAL(2, 32, 0) // "" }, - "FrogPilotDataPanel\0openSubPanel\0" + "StarPilotDataPanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotDataPanel[] = { +static const uint qt_meta_data_StarPilotDataPanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotDataPanel[] = { 0 // eod }; -void FrogPilotDataPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotDataPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotDataPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, i } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotDataPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotDataPanel::openSubPanel)) { + using _t = void (StarPilotDataPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotDataPanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotDataPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, i Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotDataPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotDataPanel.data, - qt_meta_data_FrogPilotDataPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotDataPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotDataPanel.data, + qt_meta_data_StarPilotDataPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotDataPanel::metaObject() const +const QMetaObject *StarPilotDataPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotDataPanel::qt_metacast(const char *_clname) +void *StarPilotDataPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotDataPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotDataPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotDataPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotDataPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotDataPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotDataPanel::openSubPanel() +void StarPilotDataPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_device_settings.cc b/starpilot/ui/qt/offroad/moc_device_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_device_settings.cc rename to starpilot/ui/qt/offroad/moc_device_settings.cc index 0e66a1e7..a00bda66 100644 --- a/frogpilot/ui/qt/offroad/moc_device_settings.cc +++ b/starpilot/ui/qt/offroad/moc_device_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotDevicePanel_t { +struct qt_meta_stringdata_StarPilotDevicePanel_t { QByteArrayData data[3]; char stringdata0[35]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotDevicePanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotDevicePanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotDevicePanel_t qt_meta_stringdata_FrogPilotDevicePanel = { +static const qt_meta_stringdata_StarPilotDevicePanel_t qt_meta_stringdata_StarPilotDevicePanel = { { -QT_MOC_LITERAL(0, 0, 20), // "FrogPilotDevicePanel" +QT_MOC_LITERAL(0, 0, 20), // "StarPilotDevicePanel" QT_MOC_LITERAL(1, 21, 12), // "openSubPanel" QT_MOC_LITERAL(2, 34, 0) // "" }, - "FrogPilotDevicePanel\0openSubPanel\0" + "StarPilotDevicePanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotDevicePanel[] = { +static const uint qt_meta_data_StarPilotDevicePanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotDevicePanel[] = { 0 // eod }; -void FrogPilotDevicePanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotDevicePanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotDevicePanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotDevicePanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotDevicePanel::openSubPanel)) { + using _t = void (StarPilotDevicePanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotDevicePanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotDevicePanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotDevicePanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotDevicePanel.data, - qt_meta_data_FrogPilotDevicePanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotDevicePanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotDevicePanel.data, + qt_meta_data_StarPilotDevicePanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotDevicePanel::metaObject() const +const QMetaObject *StarPilotDevicePanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotDevicePanel::qt_metacast(const char *_clname) +void *StarPilotDevicePanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotDevicePanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotDevicePanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotDevicePanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotDevicePanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotDevicePanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotDevicePanel::openSubPanel() +void StarPilotDevicePanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_expandable_multi_option_dialog.cc b/starpilot/ui/qt/offroad/moc_expandable_multi_option_dialog.cc similarity index 100% rename from frogpilot/ui/qt/offroad/moc_expandable_multi_option_dialog.cc rename to starpilot/ui/qt/offroad/moc_expandable_multi_option_dialog.cc diff --git a/frogpilot/ui/qt/offroad/moc_lateral_settings.cc b/starpilot/ui/qt/offroad/moc_lateral_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_lateral_settings.cc rename to starpilot/ui/qt/offroad/moc_lateral_settings.cc index ab36a069..269b02a2 100644 --- a/frogpilot/ui/qt/offroad/moc_lateral_settings.cc +++ b/starpilot/ui/qt/offroad/moc_lateral_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotLateralPanel_t { +struct qt_meta_stringdata_StarPilotLateralPanel_t { QByteArrayData data[3]; char stringdata0[36]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotLateralPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotLateralPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotLateralPanel_t qt_meta_stringdata_FrogPilotLateralPanel = { +static const qt_meta_stringdata_StarPilotLateralPanel_t qt_meta_stringdata_StarPilotLateralPanel = { { -QT_MOC_LITERAL(0, 0, 21), // "FrogPilotLateralPanel" +QT_MOC_LITERAL(0, 0, 21), // "StarPilotLateralPanel" QT_MOC_LITERAL(1, 22, 12), // "openSubPanel" QT_MOC_LITERAL(2, 35, 0) // "" }, - "FrogPilotLateralPanel\0openSubPanel\0" + "StarPilotLateralPanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotLateralPanel[] = { +static const uint qt_meta_data_StarPilotLateralPanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotLateralPanel[] = { 0 // eod }; -void FrogPilotLateralPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotLateralPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotLateralPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotLateralPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotLateralPanel::openSubPanel)) { + using _t = void (StarPilotLateralPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotLateralPanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotLateralPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotLateralPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotLateralPanel.data, - qt_meta_data_FrogPilotLateralPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotLateralPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotLateralPanel.data, + qt_meta_data_StarPilotLateralPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotLateralPanel::metaObject() const +const QMetaObject *StarPilotLateralPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotLateralPanel::qt_metacast(const char *_clname) +void *StarPilotLateralPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotLateralPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotLateralPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotLateralPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotLateralPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotLateralPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotLateralPanel::openSubPanel() +void StarPilotLateralPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_longitudinal_settings.cc b/starpilot/ui/qt/offroad/moc_longitudinal_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_longitudinal_settings.cc rename to starpilot/ui/qt/offroad/moc_longitudinal_settings.cc index de6a54b7..e7529eb1 100644 --- a/frogpilot/ui/qt/offroad/moc_longitudinal_settings.cc +++ b/starpilot/ui/qt/offroad/moc_longitudinal_settings.cc @@ -20,30 +20,30 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotLongitudinalPanel_t { +struct qt_meta_stringdata_StarPilotLongitudinalPanel_t { QByteArrayData data[5]; char stringdata0[76]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotLongitudinalPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotLongitudinalPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotLongitudinalPanel_t qt_meta_stringdata_FrogPilotLongitudinalPanel = { +static const qt_meta_stringdata_StarPilotLongitudinalPanel_t qt_meta_stringdata_StarPilotLongitudinalPanel = { { -QT_MOC_LITERAL(0, 0, 26), // "FrogPilotLongitudinalPanel" +QT_MOC_LITERAL(0, 0, 26), // "StarPilotLongitudinalPanel" QT_MOC_LITERAL(1, 27, 12), // "openSubPanel" QT_MOC_LITERAL(2, 40, 0), // "" QT_MOC_LITERAL(3, 41, 15), // "openSubSubPanel" QT_MOC_LITERAL(4, 57, 18) // "openSubSubSubPanel" }, - "FrogPilotLongitudinalPanel\0openSubPanel\0" + "StarPilotLongitudinalPanel\0openSubPanel\0" "\0openSubSubPanel\0openSubSubSubPanel" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotLongitudinalPanel[] = { +static const uint qt_meta_data_StarPilotLongitudinalPanel[] = { // content: 8, // revision @@ -69,10 +69,10 @@ static const uint qt_meta_data_FrogPilotLongitudinalPanel[] = { 0 // eod }; -void FrogPilotLongitudinalPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotLongitudinalPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -83,22 +83,22 @@ void FrogPilotLongitudinalPanel::qt_static_metacall(QObject *_o, QMetaObject::Ca } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotLongitudinalPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotLongitudinalPanel::openSubPanel)) { + using _t = void (StarPilotLongitudinalPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotLongitudinalPanel::openSubPanel)) { *result = 0; return; } } { - using _t = void (FrogPilotLongitudinalPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotLongitudinalPanel::openSubSubPanel)) { + using _t = void (StarPilotLongitudinalPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotLongitudinalPanel::openSubSubPanel)) { *result = 1; return; } } { - using _t = void (FrogPilotLongitudinalPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotLongitudinalPanel::openSubSubSubPanel)) { + using _t = void (StarPilotLongitudinalPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotLongitudinalPanel::openSubSubSubPanel)) { *result = 2; return; } @@ -107,32 +107,32 @@ void FrogPilotLongitudinalPanel::qt_static_metacall(QObject *_o, QMetaObject::Ca Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotLongitudinalPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotLongitudinalPanel.data, - qt_meta_data_FrogPilotLongitudinalPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotLongitudinalPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotLongitudinalPanel.data, + qt_meta_data_StarPilotLongitudinalPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotLongitudinalPanel::metaObject() const +const QMetaObject *StarPilotLongitudinalPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotLongitudinalPanel::qt_metacast(const char *_clname) +void *StarPilotLongitudinalPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotLongitudinalPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotLongitudinalPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotLongitudinalPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotLongitudinalPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -148,19 +148,19 @@ int FrogPilotLongitudinalPanel::qt_metacall(QMetaObject::Call _c, int _id, void } // SIGNAL 0 -void FrogPilotLongitudinalPanel::openSubPanel() +void StarPilotLongitudinalPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } // SIGNAL 1 -void FrogPilotLongitudinalPanel::openSubSubPanel() +void StarPilotLongitudinalPanel::openSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } // SIGNAL 2 -void FrogPilotLongitudinalPanel::openSubSubSubPanel() +void StarPilotLongitudinalPanel::openSubSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 2, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_maps_settings.cc b/starpilot/ui/qt/offroad/moc_maps_settings.cc similarity index 71% rename from frogpilot/ui/qt/offroad/moc_maps_settings.cc rename to starpilot/ui/qt/offroad/moc_maps_settings.cc index 0986939b..ec40879c 100644 --- a/frogpilot/ui/qt/offroad/moc_maps_settings.cc +++ b/starpilot/ui/qt/offroad/moc_maps_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotMapsPanel_t { +struct qt_meta_stringdata_StarPilotMapsPanel_t { QByteArrayData data[3]; char stringdata0[33]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotMapsPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotMapsPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotMapsPanel_t qt_meta_stringdata_FrogPilotMapsPanel = { +static const qt_meta_stringdata_StarPilotMapsPanel_t qt_meta_stringdata_StarPilotMapsPanel = { { -QT_MOC_LITERAL(0, 0, 18), // "FrogPilotMapsPanel" +QT_MOC_LITERAL(0, 0, 18), // "StarPilotMapsPanel" QT_MOC_LITERAL(1, 19, 12), // "openSubPanel" QT_MOC_LITERAL(2, 32, 0) // "" }, - "FrogPilotMapsPanel\0openSubPanel\0" + "StarPilotMapsPanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotMapsPanel[] = { +static const uint qt_meta_data_StarPilotMapsPanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotMapsPanel[] = { 0 // eod }; -void FrogPilotMapsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotMapsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotMapsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, i } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotMapsPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotMapsPanel::openSubPanel)) { + using _t = void (StarPilotMapsPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotMapsPanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotMapsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, i Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotMapsPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotMapsPanel.data, - qt_meta_data_FrogPilotMapsPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotMapsPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotMapsPanel.data, + qt_meta_data_StarPilotMapsPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotMapsPanel::metaObject() const +const QMetaObject *StarPilotMapsPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotMapsPanel::qt_metacast(const char *_clname) +void *StarPilotMapsPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotMapsPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotMapsPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotMapsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotMapsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotMapsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotMapsPanel::openSubPanel() +void StarPilotMapsPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_model_settings.cc b/starpilot/ui/qt/offroad/moc_model_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_model_settings.cc rename to starpilot/ui/qt/offroad/moc_model_settings.cc index 61036633..aa73fde7 100644 --- a/frogpilot/ui/qt/offroad/moc_model_settings.cc +++ b/starpilot/ui/qt/offroad/moc_model_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotModelPanel_t { +struct qt_meta_stringdata_StarPilotModelPanel_t { QByteArrayData data[3]; char stringdata0[34]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotModelPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotModelPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotModelPanel_t qt_meta_stringdata_FrogPilotModelPanel = { +static const qt_meta_stringdata_StarPilotModelPanel_t qt_meta_stringdata_StarPilotModelPanel = { { -QT_MOC_LITERAL(0, 0, 19), // "FrogPilotModelPanel" +QT_MOC_LITERAL(0, 0, 19), // "StarPilotModelPanel" QT_MOC_LITERAL(1, 20, 12), // "openSubPanel" QT_MOC_LITERAL(2, 33, 0) // "" }, - "FrogPilotModelPanel\0openSubPanel\0" + "StarPilotModelPanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotModelPanel[] = { +static const uint qt_meta_data_StarPilotModelPanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotModelPanel[] = { 0 // eod }; -void FrogPilotModelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotModelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotModelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotModelPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotModelPanel::openSubPanel)) { + using _t = void (StarPilotModelPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotModelPanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotModelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotModelPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotModelPanel.data, - qt_meta_data_FrogPilotModelPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotModelPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotModelPanel.data, + qt_meta_data_StarPilotModelPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotModelPanel::metaObject() const +const QMetaObject *StarPilotModelPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotModelPanel::qt_metacast(const char *_clname) +void *StarPilotModelPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotModelPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotModelPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotModelPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotModelPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotModelPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotModelPanel::openSubPanel() +void StarPilotModelPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_navigation_settings.cc b/starpilot/ui/qt/offroad/moc_navigation_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_navigation_settings.cc rename to starpilot/ui/qt/offroad/moc_navigation_settings.cc index f455d511..42d738dd 100644 --- a/frogpilot/ui/qt/offroad/moc_navigation_settings.cc +++ b/starpilot/ui/qt/offroad/moc_navigation_settings.cc @@ -20,29 +20,29 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotNavigationPanel_t { +struct qt_meta_stringdata_StarPilotNavigationPanel_t { QByteArrayData data[4]; char stringdata0[53]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotNavigationPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotNavigationPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotNavigationPanel_t qt_meta_stringdata_FrogPilotNavigationPanel = { +static const qt_meta_stringdata_StarPilotNavigationPanel_t qt_meta_stringdata_StarPilotNavigationPanel = { { -QT_MOC_LITERAL(0, 0, 24), // "FrogPilotNavigationPanel" +QT_MOC_LITERAL(0, 0, 24), // "StarPilotNavigationPanel" QT_MOC_LITERAL(1, 25, 13), // "closeSubPanel" QT_MOC_LITERAL(2, 39, 0), // "" QT_MOC_LITERAL(3, 40, 12) // "openSubPanel" }, - "FrogPilotNavigationPanel\0closeSubPanel\0" + "StarPilotNavigationPanel\0closeSubPanel\0" "\0openSubPanel" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotNavigationPanel[] = { +static const uint qt_meta_data_StarPilotNavigationPanel[] = { // content: 8, // revision @@ -66,10 +66,10 @@ static const uint qt_meta_data_FrogPilotNavigationPanel[] = { 0 // eod }; -void FrogPilotNavigationPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotNavigationPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->closeSubPanel(); break; @@ -79,15 +79,15 @@ void FrogPilotNavigationPanel::qt_static_metacall(QObject *_o, QMetaObject::Call } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotNavigationPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotNavigationPanel::closeSubPanel)) { + using _t = void (StarPilotNavigationPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotNavigationPanel::closeSubPanel)) { *result = 0; return; } } { - using _t = void (FrogPilotNavigationPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotNavigationPanel::openSubPanel)) { + using _t = void (StarPilotNavigationPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotNavigationPanel::openSubPanel)) { *result = 1; return; } @@ -96,32 +96,32 @@ void FrogPilotNavigationPanel::qt_static_metacall(QObject *_o, QMetaObject::Call Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotNavigationPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotNavigationPanel.data, - qt_meta_data_FrogPilotNavigationPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotNavigationPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotNavigationPanel.data, + qt_meta_data_StarPilotNavigationPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotNavigationPanel::metaObject() const +const QMetaObject *StarPilotNavigationPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotNavigationPanel::qt_metacast(const char *_clname) +void *StarPilotNavigationPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotNavigationPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotNavigationPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotNavigationPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotNavigationPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -137,13 +137,13 @@ int FrogPilotNavigationPanel::qt_metacall(QMetaObject::Call _c, int _id, void ** } // SIGNAL 0 -void FrogPilotNavigationPanel::closeSubPanel() +void StarPilotNavigationPanel::closeSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } // SIGNAL 1 -void FrogPilotNavigationPanel::openSubPanel() +void StarPilotNavigationPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_sounds_settings.cc b/starpilot/ui/qt/offroad/moc_sounds_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_sounds_settings.cc rename to starpilot/ui/qt/offroad/moc_sounds_settings.cc index 1f986a08..0d51e65a 100644 --- a/frogpilot/ui/qt/offroad/moc_sounds_settings.cc +++ b/starpilot/ui/qt/offroad/moc_sounds_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotSoundsPanel_t { +struct qt_meta_stringdata_StarPilotSoundsPanel_t { QByteArrayData data[3]; char stringdata0[35]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotSoundsPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotSoundsPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotSoundsPanel_t qt_meta_stringdata_FrogPilotSoundsPanel = { +static const qt_meta_stringdata_StarPilotSoundsPanel_t qt_meta_stringdata_StarPilotSoundsPanel = { { -QT_MOC_LITERAL(0, 0, 20), // "FrogPilotSoundsPanel" +QT_MOC_LITERAL(0, 0, 20), // "StarPilotSoundsPanel" QT_MOC_LITERAL(1, 21, 12), // "openSubPanel" QT_MOC_LITERAL(2, 34, 0) // "" }, - "FrogPilotSoundsPanel\0openSubPanel\0" + "StarPilotSoundsPanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotSoundsPanel[] = { +static const uint qt_meta_data_StarPilotSoundsPanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotSoundsPanel[] = { 0 // eod }; -void FrogPilotSoundsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotSoundsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotSoundsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotSoundsPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSoundsPanel::openSubPanel)) { + using _t = void (StarPilotSoundsPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSoundsPanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotSoundsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotSoundsPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotSoundsPanel.data, - qt_meta_data_FrogPilotSoundsPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotSoundsPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotSoundsPanel.data, + qt_meta_data_StarPilotSoundsPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotSoundsPanel::metaObject() const +const QMetaObject *StarPilotSoundsPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotSoundsPanel::qt_metacast(const char *_clname) +void *StarPilotSoundsPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotSoundsPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotSoundsPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotSoundsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotSoundsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotSoundsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotSoundsPanel::openSubPanel() +void StarPilotSoundsPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_frogpilot_settings.cc b/starpilot/ui/qt/offroad/moc_starpilot_settings.cc similarity index 73% rename from frogpilot/ui/qt/offroad/moc_frogpilot_settings.cc rename to starpilot/ui/qt/offroad/moc_starpilot_settings.cc index b8513d1f..2b27a8e5 100644 --- a/frogpilot/ui/qt/offroad/moc_frogpilot_settings.cc +++ b/starpilot/ui/qt/offroad/moc_starpilot_settings.cc @@ -1,16 +1,16 @@ /**************************************************************************** -** Meta object code from reading C++ file 'frogpilot_settings.h' +** Meta object code from reading C++ file 'starpilot_settings.h' ** ** Created by: The Qt Meta Object Compiler version 67 (Qt 5.12.8) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ -#include "frogpilot_settings.h" +#include "starpilot_settings.h" #include #include #if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'frogpilot_settings.h' doesn't include ." +#error "The header file 'starpilot_settings.h' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 67 #error "This file was generated using the moc from 5.12.8. It" #error "cannot be used with the include files from this version of Qt." @@ -20,18 +20,18 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotSettingsWindow_t { +struct qt_meta_stringdata_StarPilotSettingsWindow_t { QByteArrayData data[14]; char stringdata0[187]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotSettingsWindow_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotSettingsWindow_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotSettingsWindow_t qt_meta_stringdata_FrogPilotSettingsWindow = { +static const qt_meta_stringdata_StarPilotSettingsWindow_t qt_meta_stringdata_StarPilotSettingsWindow = { { -QT_MOC_LITERAL(0, 0, 23), // "FrogPilotSettingsWindow" +QT_MOC_LITERAL(0, 0, 23), // "StarPilotSettingsWindow" QT_MOC_LITERAL(1, 24, 13), // "closeSubPanel" QT_MOC_LITERAL(2, 38, 0), // "" QT_MOC_LITERAL(3, 39, 16), // "closeSubSubPanel" @@ -47,7 +47,7 @@ QT_MOC_LITERAL(12, 172, 6), // "metric" QT_MOC_LITERAL(13, 179, 7) // "bootRun" }, - "FrogPilotSettingsWindow\0closeSubPanel\0" + "StarPilotSettingsWindow\0closeSubPanel\0" "\0closeSubSubPanel\0closeSubSubSubPanel\0" "openPanel\0openSubPanel\0openSubSubPanel\0" "openSubSubSubPanel\0tuningLevelChanged\0" @@ -55,7 +55,7 @@ QT_MOC_LITERAL(13, 179, 7) // "bootRun" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotSettingsWindow[] = { +static const uint qt_meta_data_StarPilotSettingsWindow[] = { // content: 8, // revision @@ -95,10 +95,10 @@ static const uint qt_meta_data_FrogPilotSettingsWindow[] = { 0 // eod }; -void FrogPilotSettingsWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotSettingsWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->closeSubPanel(); break; @@ -116,64 +116,64 @@ void FrogPilotSettingsWindow::qt_static_metacall(QObject *_o, QMetaObject::Call } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::closeSubPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::closeSubPanel)) { *result = 0; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::closeSubSubPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::closeSubSubPanel)) { *result = 1; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::closeSubSubSubPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::closeSubSubSubPanel)) { *result = 2; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::openPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::openPanel)) { *result = 3; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::openSubPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::openSubPanel)) { *result = 4; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::openSubSubPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::openSubSubPanel)) { *result = 5; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::openSubSubSubPanel)) { + using _t = void (StarPilotSettingsWindow::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::openSubSubSubPanel)) { *result = 6; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(int ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::tuningLevelChanged)) { + using _t = void (StarPilotSettingsWindow::*)(int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::tuningLevelChanged)) { *result = 7; return; } } { - using _t = void (FrogPilotSettingsWindow::*)(bool , bool ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotSettingsWindow::updateMetric)) { + using _t = void (StarPilotSettingsWindow::*)(bool , bool ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotSettingsWindow::updateMetric)) { *result = 8; return; } @@ -181,30 +181,30 @@ void FrogPilotSettingsWindow::qt_static_metacall(QObject *_o, QMetaObject::Call } } -QT_INIT_METAOBJECT const QMetaObject FrogPilotSettingsWindow::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotSettingsWindow::staticMetaObject = { { &QFrame::staticMetaObject, - qt_meta_stringdata_FrogPilotSettingsWindow.data, - qt_meta_data_FrogPilotSettingsWindow, + qt_meta_stringdata_StarPilotSettingsWindow.data, + qt_meta_data_StarPilotSettingsWindow, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotSettingsWindow::metaObject() const +const QMetaObject *StarPilotSettingsWindow::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotSettingsWindow::qt_metacast(const char *_clname) +void *StarPilotSettingsWindow::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotSettingsWindow.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotSettingsWindow.stringdata0)) return static_cast(this); return QFrame::qt_metacast(_clname); } -int FrogPilotSettingsWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotSettingsWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QFrame::qt_metacall(_c, _id, _a); if (_id < 0) @@ -222,56 +222,56 @@ int FrogPilotSettingsWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_ } // SIGNAL 0 -void FrogPilotSettingsWindow::closeSubPanel() +void StarPilotSettingsWindow::closeSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } // SIGNAL 1 -void FrogPilotSettingsWindow::closeSubSubPanel() +void StarPilotSettingsWindow::closeSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } // SIGNAL 2 -void FrogPilotSettingsWindow::closeSubSubSubPanel() +void StarPilotSettingsWindow::closeSubSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 2, nullptr); } // SIGNAL 3 -void FrogPilotSettingsWindow::openPanel() +void StarPilotSettingsWindow::openPanel() { QMetaObject::activate(this, &staticMetaObject, 3, nullptr); } // SIGNAL 4 -void FrogPilotSettingsWindow::openSubPanel() +void StarPilotSettingsWindow::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 4, nullptr); } // SIGNAL 5 -void FrogPilotSettingsWindow::openSubSubPanel() +void StarPilotSettingsWindow::openSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 5, nullptr); } // SIGNAL 6 -void FrogPilotSettingsWindow::openSubSubSubPanel() +void StarPilotSettingsWindow::openSubSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 6, nullptr); } // SIGNAL 7 -void FrogPilotSettingsWindow::tuningLevelChanged(int _t1) +void StarPilotSettingsWindow::tuningLevelChanged(int _t1) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 7, _a); } // SIGNAL 8 -void FrogPilotSettingsWindow::updateMetric(bool _t1, bool _t2) +void StarPilotSettingsWindow::updateMetric(bool _t1, bool _t2) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; QMetaObject::activate(this, &staticMetaObject, 8, _a); diff --git a/frogpilot/ui/qt/offroad/moc_theme_settings.cc b/starpilot/ui/qt/offroad/moc_theme_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_theme_settings.cc rename to starpilot/ui/qt/offroad/moc_theme_settings.cc index 2aed0bbb..f57592f4 100644 --- a/frogpilot/ui/qt/offroad/moc_theme_settings.cc +++ b/starpilot/ui/qt/offroad/moc_theme_settings.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotThemesPanel_t { +struct qt_meta_stringdata_StarPilotThemesPanel_t { QByteArrayData data[3]; char stringdata0[35]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotThemesPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotThemesPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotThemesPanel_t qt_meta_stringdata_FrogPilotThemesPanel = { +static const qt_meta_stringdata_StarPilotThemesPanel_t qt_meta_stringdata_StarPilotThemesPanel = { { -QT_MOC_LITERAL(0, 0, 20), // "FrogPilotThemesPanel" +QT_MOC_LITERAL(0, 0, 20), // "StarPilotThemesPanel" QT_MOC_LITERAL(1, 21, 12), // "openSubPanel" QT_MOC_LITERAL(2, 34, 0) // "" }, - "FrogPilotThemesPanel\0openSubPanel\0" + "StarPilotThemesPanel\0openSubPanel\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotThemesPanel[] = { +static const uint qt_meta_data_StarPilotThemesPanel[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotThemesPanel[] = { 0 // eod }; -void FrogPilotThemesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotThemesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -74,8 +74,8 @@ void FrogPilotThemesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotThemesPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotThemesPanel::openSubPanel)) { + using _t = void (StarPilotThemesPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotThemesPanel::openSubPanel)) { *result = 0; return; } @@ -84,32 +84,32 @@ void FrogPilotThemesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotThemesPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotThemesPanel.data, - qt_meta_data_FrogPilotThemesPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotThemesPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotThemesPanel.data, + qt_meta_data_StarPilotThemesPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotThemesPanel::metaObject() const +const QMetaObject *StarPilotThemesPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotThemesPanel::qt_metacast(const char *_clname) +void *StarPilotThemesPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotThemesPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotThemesPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotThemesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotThemesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -125,7 +125,7 @@ int FrogPilotThemesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotThemesPanel::openSubPanel() +void StarPilotThemesPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_utilities.cc b/starpilot/ui/qt/offroad/moc_utilities.cc similarity index 65% rename from frogpilot/ui/qt/offroad/moc_utilities.cc rename to starpilot/ui/qt/offroad/moc_utilities.cc index f080c00e..c35509e9 100644 --- a/frogpilot/ui/qt/offroad/moc_utilities.cc +++ b/starpilot/ui/qt/offroad/moc_utilities.cc @@ -20,25 +20,25 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotUtilitiesPanel_t { +struct qt_meta_stringdata_StarPilotUtilitiesPanel_t { QByteArrayData data[1]; char stringdata0[24]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotUtilitiesPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotUtilitiesPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotUtilitiesPanel_t qt_meta_stringdata_FrogPilotUtilitiesPanel = { +static const qt_meta_stringdata_StarPilotUtilitiesPanel_t qt_meta_stringdata_StarPilotUtilitiesPanel = { { -QT_MOC_LITERAL(0, 0, 23) // "FrogPilotUtilitiesPanel" +QT_MOC_LITERAL(0, 0, 23) // "StarPilotUtilitiesPanel" }, - "FrogPilotUtilitiesPanel" + "StarPilotUtilitiesPanel" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotUtilitiesPanel[] = { +static const uint qt_meta_data_StarPilotUtilitiesPanel[] = { // content: 8, // revision @@ -54,7 +54,7 @@ static const uint qt_meta_data_FrogPilotUtilitiesPanel[] = { 0 // eod }; -void FrogPilotUtilitiesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotUtilitiesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -62,32 +62,32 @@ void FrogPilotUtilitiesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotUtilitiesPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotUtilitiesPanel.data, - qt_meta_data_FrogPilotUtilitiesPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotUtilitiesPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotUtilitiesPanel.data, + qt_meta_data_StarPilotUtilitiesPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotUtilitiesPanel::metaObject() const +const QMetaObject *StarPilotUtilitiesPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotUtilitiesPanel::qt_metacast(const char *_clname) +void *StarPilotUtilitiesPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotUtilitiesPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotUtilitiesPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotUtilitiesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotUtilitiesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); return _id; } QT_WARNING_POP diff --git a/frogpilot/ui/qt/offroad/moc_vehicle_settings.cc b/starpilot/ui/qt/offroad/moc_vehicle_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_vehicle_settings.cc rename to starpilot/ui/qt/offroad/moc_vehicle_settings.cc index 1e6d39fe..496a53f4 100644 --- a/frogpilot/ui/qt/offroad/moc_vehicle_settings.cc +++ b/starpilot/ui/qt/offroad/moc_vehicle_settings.cc @@ -20,28 +20,28 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotVehiclesPanel_t { +struct qt_meta_stringdata_StarPilotVehiclesPanel_t { QByteArrayData data[3]; char stringdata0[37]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotVehiclesPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotVehiclesPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotVehiclesPanel_t qt_meta_stringdata_FrogPilotVehiclesPanel = { +static const qt_meta_stringdata_StarPilotVehiclesPanel_t qt_meta_stringdata_StarPilotVehiclesPanel = { { -QT_MOC_LITERAL(0, 0, 22), // "FrogPilotVehiclesPanel" +QT_MOC_LITERAL(0, 0, 22), // "StarPilotVehiclesPanel" QT_MOC_LITERAL(1, 23, 12), // "openSubPanel" QT_MOC_LITERAL(2, 36, 0) // "" }, - "FrogPilotVehiclesPanel\0openSubPanel\0" + "StarPilotVehiclesPanel\0openSubPanel\0" "" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotVehiclesPanel[] = { +static const uint qt_meta_data_StarPilotVehiclesPanel[] = { // content: 8, // revision @@ -63,10 +63,10 @@ static const uint qt_meta_data_FrogPilotVehiclesPanel[] = { 0 // eod }; -void FrogPilotVehiclesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotVehiclesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -75,8 +75,8 @@ void FrogPilotVehiclesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _ } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotVehiclesPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotVehiclesPanel::openSubPanel)) { + using _t = void (StarPilotVehiclesPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotVehiclesPanel::openSubPanel)) { *result = 0; return; } @@ -85,32 +85,32 @@ void FrogPilotVehiclesPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _ Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotVehiclesPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotVehiclesPanel.data, - qt_meta_data_FrogPilotVehiclesPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotVehiclesPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotVehiclesPanel.data, + qt_meta_data_StarPilotVehiclesPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotVehiclesPanel::metaObject() const +const QMetaObject *StarPilotVehiclesPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotVehiclesPanel::qt_metacast(const char *_clname) +void *StarPilotVehiclesPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotVehiclesPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotVehiclesPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotVehiclesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotVehiclesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -126,7 +126,7 @@ int FrogPilotVehiclesPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a } // SIGNAL 0 -void FrogPilotVehiclesPanel::openSubPanel() +void StarPilotVehiclesPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_visual_settings.cc b/starpilot/ui/qt/offroad/moc_visual_settings.cc similarity index 70% rename from frogpilot/ui/qt/offroad/moc_visual_settings.cc rename to starpilot/ui/qt/offroad/moc_visual_settings.cc index 90adadcc..b65ed4b1 100644 --- a/frogpilot/ui/qt/offroad/moc_visual_settings.cc +++ b/starpilot/ui/qt/offroad/moc_visual_settings.cc @@ -20,29 +20,29 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotVisualsPanel_t { +struct qt_meta_stringdata_StarPilotVisualsPanel_t { QByteArrayData data[4]; char stringdata0[52]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotVisualsPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotVisualsPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotVisualsPanel_t qt_meta_stringdata_FrogPilotVisualsPanel = { +static const qt_meta_stringdata_StarPilotVisualsPanel_t qt_meta_stringdata_StarPilotVisualsPanel = { { -QT_MOC_LITERAL(0, 0, 21), // "FrogPilotVisualsPanel" +QT_MOC_LITERAL(0, 0, 21), // "StarPilotVisualsPanel" QT_MOC_LITERAL(1, 22, 12), // "openSubPanel" QT_MOC_LITERAL(2, 35, 0), // "" QT_MOC_LITERAL(3, 36, 15) // "openSubSubPanel" }, - "FrogPilotVisualsPanel\0openSubPanel\0\0" + "StarPilotVisualsPanel\0openSubPanel\0\0" "openSubSubPanel" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotVisualsPanel[] = { +static const uint qt_meta_data_StarPilotVisualsPanel[] = { // content: 8, // revision @@ -66,10 +66,10 @@ static const uint qt_meta_data_FrogPilotVisualsPanel[] = { 0 // eod }; -void FrogPilotVisualsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotVisualsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->openSubPanel(); break; @@ -79,15 +79,15 @@ void FrogPilotVisualsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotVisualsPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotVisualsPanel::openSubPanel)) { + using _t = void (StarPilotVisualsPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotVisualsPanel::openSubPanel)) { *result = 0; return; } } { - using _t = void (FrogPilotVisualsPanel::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotVisualsPanel::openSubSubPanel)) { + using _t = void (StarPilotVisualsPanel::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotVisualsPanel::openSubSubPanel)) { *result = 1; return; } @@ -96,32 +96,32 @@ void FrogPilotVisualsPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotVisualsPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotVisualsPanel.data, - qt_meta_data_FrogPilotVisualsPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotVisualsPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotVisualsPanel.data, + qt_meta_data_StarPilotVisualsPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotVisualsPanel::metaObject() const +const QMetaObject *StarPilotVisualsPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotVisualsPanel::qt_metacast(const char *_clname) +void *StarPilotVisualsPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotVisualsPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotVisualsPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotVisualsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotVisualsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -137,13 +137,13 @@ int FrogPilotVisualsPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotVisualsPanel::openSubPanel() +void StarPilotVisualsPanel::openSubPanel() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } // SIGNAL 1 -void FrogPilotVisualsPanel::openSubSubPanel() +void StarPilotVisualsPanel::openSubSubPanel() { QMetaObject::activate(this, &staticMetaObject, 1, nullptr); } diff --git a/frogpilot/ui/qt/offroad/moc_wheel_settings.cc b/starpilot/ui/qt/offroad/moc_wheel_settings.cc similarity index 65% rename from frogpilot/ui/qt/offroad/moc_wheel_settings.cc rename to starpilot/ui/qt/offroad/moc_wheel_settings.cc index cd8d6593..9f76e7b4 100644 --- a/frogpilot/ui/qt/offroad/moc_wheel_settings.cc +++ b/starpilot/ui/qt/offroad/moc_wheel_settings.cc @@ -20,25 +20,25 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotWheelPanel_t { +struct qt_meta_stringdata_StarPilotWheelPanel_t { QByteArrayData data[1]; char stringdata0[20]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotWheelPanel_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotWheelPanel_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotWheelPanel_t qt_meta_stringdata_FrogPilotWheelPanel = { +static const qt_meta_stringdata_StarPilotWheelPanel_t qt_meta_stringdata_StarPilotWheelPanel = { { -QT_MOC_LITERAL(0, 0, 19) // "FrogPilotWheelPanel" +QT_MOC_LITERAL(0, 0, 19) // "StarPilotWheelPanel" }, - "FrogPilotWheelPanel" + "StarPilotWheelPanel" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotWheelPanel[] = { +static const uint qt_meta_data_StarPilotWheelPanel[] = { // content: 8, // revision @@ -54,7 +54,7 @@ static const uint qt_meta_data_FrogPilotWheelPanel[] = { 0 // eod }; -void FrogPilotWheelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotWheelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -62,32 +62,32 @@ void FrogPilotWheelPanel::qt_static_metacall(QObject *_o, QMetaObject::Call _c, Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotWheelPanel::staticMetaObject = { { - &FrogPilotListWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotWheelPanel.data, - qt_meta_data_FrogPilotWheelPanel, +QT_INIT_METAOBJECT const QMetaObject StarPilotWheelPanel::staticMetaObject = { { + &StarPilotListWidget::staticMetaObject, + qt_meta_stringdata_StarPilotWheelPanel.data, + qt_meta_data_StarPilotWheelPanel, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotWheelPanel::metaObject() const +const QMetaObject *StarPilotWheelPanel::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotWheelPanel::qt_metacast(const char *_clname) +void *StarPilotWheelPanel::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotWheelPanel.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotWheelPanel.stringdata0)) return static_cast(this); - return FrogPilotListWidget::qt_metacast(_clname); + return StarPilotListWidget::qt_metacast(_clname); } -int FrogPilotWheelPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotWheelPanel::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotListWidget::qt_metacall(_c, _id, _a); + _id = StarPilotListWidget::qt_metacall(_c, _id, _a); return _id; } QT_WARNING_POP diff --git a/frogpilot/ui/qt/offroad/model_settings.cc b/starpilot/ui/qt/offroad/model_settings.cc similarity index 91% rename from frogpilot/ui/qt/offroad/model_settings.cc rename to starpilot/ui/qt/offroad/model_settings.cc index 1f5a3154..5768139a 100644 --- a/frogpilot/ui/qt/offroad/model_settings.cc +++ b/starpilot/ui/qt/offroad/model_settings.cc @@ -1,5 +1,5 @@ -#include "frogpilot/ui/qt/offroad/model_settings.h" -#include "frogpilot/ui/qt/offroad/expandable_multi_option_dialog.h" +#include "starpilot/ui/qt/offroad/model_settings.h" +#include "starpilot/ui/qt/offroad/expandable_multi_option_dialog.h" #include #include #include @@ -11,7 +11,7 @@ #include "system/hardware/hw.h" -FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : FrogPilotListWidget(parent), +StarPilotModelPanel::StarPilotModelPanel(StarPilotSettingsWindow *parent) : StarPilotListWidget(parent), allModelsDownloaded(false), allModelsDownloading(false), cancellingDownload(false), @@ -25,20 +25,20 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog tuningLevel(0), parent(parent) { if (Hardware::PC()) { - modelDir.setPath(QString::fromStdString(Path::comma_home() + "/frogpilot/data/models/")); + modelDir.setPath(QString::fromStdString(Path::comma_home() + "/starpilot/data/models/")); } modelDir.mkpath("."); QStackedLayout *modelLayout = new QStackedLayout(); addItem(modelLayout); - FrogPilotListWidget *modelList = new FrogPilotListWidget(this); + StarPilotListWidget *modelList = new StarPilotListWidget(this); ScrollView *modelPanel = new ScrollView(modelList, this); modelLayout->addWidget(modelPanel); - FrogPilotListWidget *modelLabelsList = new FrogPilotListWidget(this); + StarPilotListWidget *modelLabelsList = new StarPilotListWidget(this); ScrollView *modelLabelsPanel = new ScrollView(modelLabelsList, this); @@ -56,15 +56,15 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog {"SelectModel", tr("Select Driving Model"), tr("Select the active driving model."), ""}, }; - FrogPilotParamValueButtonControl *recoveryPowerToggle = nullptr; - FrogPilotParamValueButtonControl *stopDistanceToggle = nullptr; + StarPilotParamValueButtonControl *recoveryPowerToggle = nullptr; + StarPilotParamValueButtonControl *stopDistanceToggle = nullptr; for (const auto &[param, title, desc, icon] : modelToggles) { AbstractControl *modelToggle; if (param == "DeleteModel") { - deleteModelButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DELETE ALL")}); - QObject::connect(deleteModelButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + deleteModelButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DELETE ALL")}); + QObject::connect(deleteModelButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QMap deletableModelsMap = getDeletableModelDisplayNames(); noModelsDownloaded = deletableModelsMap.isEmpty(); @@ -145,8 +145,8 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog }); modelToggle = deleteModelButton; } else if (param == "DownloadModel") { - downloadModelButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DOWNLOAD"), tr("DOWNLOAD ALL")}); - QObject::connect(downloadModelButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + downloadModelButton = new StarPilotButtonsControl(title, desc, icon, {tr("DOWNLOAD"), tr("DOWNLOAD ALL")}); + QObject::connect(downloadModelButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { if (id == 0) { if (modelDownloading) { params_memory.putBool("CancelModelDownload", true); @@ -262,8 +262,8 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog }); modelToggle = downloadModelButton; } else if (param == "ManageBlacklistedModels") { - FrogPilotButtonsControl *blacklistBtn = new FrogPilotButtonsControl(title, desc, icon, {tr("ADD"), tr("REMOVE"), tr("REMOVE ALL")}); - QObject::connect(blacklistBtn, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + StarPilotButtonsControl *blacklistBtn = new StarPilotButtonsControl(title, desc, icon, {tr("ADD"), tr("REMOVE"), tr("REMOVE ALL")}); + QObject::connect(blacklistBtn, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList blacklistedModels = QString::fromStdString(params.get("BlacklistedModels")).split(","); blacklistedModels.removeAll(""); @@ -329,17 +329,17 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog } } } else if (id == 2) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to remove all of your blacklisted models?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to remove all of your blacklisted models?"), this)) { params.remove("BlacklistedModels"); } } }); modelToggle = blacklistBtn; } else if (param == "ManageScores") { - FrogPilotButtonsControl *manageScoresBtn = new FrogPilotButtonsControl(title, desc, icon, {tr("RESET"), tr("VIEW")}); - QObject::connect(manageScoresBtn, &FrogPilotButtonsControl::buttonClicked, [this, modelLayout, modelLabelsList, modelLabelsPanel](int id) { + StarPilotButtonsControl *manageScoresBtn = new StarPilotButtonsControl(title, desc, icon, {tr("RESET"), tr("VIEW")}); + QObject::connect(manageScoresBtn, &StarPilotButtonsControl::buttonClicked, [this, modelLayout, modelLabelsList, modelLabelsPanel](int id) { if (id == 0) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to reset all of your model drives and scores?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to reset all of your model drives and scores?"), this)) { params.remove("ModelDrivesAndScores"); } } else if (id == 1) { @@ -444,10 +444,10 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog } } - updateFrogPilotToggles(); + updateStarPilotToggles(); if (started) { - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } } @@ -462,12 +462,12 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog } else if (param == "RecoveryPower") { std::vector recoveryPowerButton{"Reset"}; - modelToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0.5, 2.0, QString(), std::map(), 0.1, false, {}, recoveryPowerButton, false, false); - recoveryPowerToggle = static_cast(modelToggle); + modelToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 0.5, 2.0, QString(), std::map(), 0.1, false, {}, recoveryPowerButton, false, false); + recoveryPowerToggle = static_cast(modelToggle); } else if (param == "StopDistance") { std::vector stopDistanceButton{"Reset"}; - modelToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 4.0, 10.0, QString(), std::map(), 0.1, false, {}, stopDistanceButton, false, false); - stopDistanceToggle = static_cast(modelToggle); + modelToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 4.0, 10.0, QString(), std::map(), 0.1, false, {}, stopDistanceButton, false, false); + stopDistanceToggle = static_cast(modelToggle); } else { modelToggle = new ParamControl(param, title, desc, icon); } @@ -485,7 +485,7 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog updateToggles(); if (state && !allModelsDownloaded) { - if (FrogPilotConfirmationDialog::yesorno(tr("The \"Model Randomizer\" only works with downloaded models. Do you want to download all the driving models?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("The \"Model Randomizer\" only works with downloaded models. Do you want to download all the driving models?"), this)) { params_memory.putBool("DownloadAllModels", true); params_memory.put("ModelDownloadProgress", "Downloading..."); @@ -497,30 +497,30 @@ FrogPilotModelPanel::FrogPilotModelPanel(FrogPilotSettingsWindow *parent) : Frog }); if (recoveryPowerToggle) { - QObject::connect(recoveryPowerToggle, &FrogPilotParamValueButtonControl::buttonClicked, [this, recoveryPowerToggle]() { + QObject::connect(recoveryPowerToggle, &StarPilotParamValueButtonControl::buttonClicked, [this, recoveryPowerToggle]() { if (ConfirmationDialog::confirm(tr("Are you sure you want to reset your Recovery Power to the default of 1.0?"), tr("Reset"), this)) { params.putFloat("RecoveryPower", 1.0); recoveryPowerToggle->refresh(); - updateFrogPilotToggles(); + updateStarPilotToggles(); } }); } if (stopDistanceToggle) { - QObject::connect(stopDistanceToggle, &FrogPilotParamValueButtonControl::buttonClicked, [this, stopDistanceToggle]() { + QObject::connect(stopDistanceToggle, &StarPilotParamValueButtonControl::buttonClicked, [this, stopDistanceToggle]() { if (ConfirmationDialog::confirm(tr("Are you sure you want to reset your Stop Distance to the default of 6 meters?"), tr("Reset"), this)) { params.putFloat("StopDistance", 6.0); stopDistanceToggle->refresh(); - updateFrogPilotToggles(); + updateStarPilotToggles(); } }); } - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [modelLayout, modelPanel] {modelLayout->setCurrentWidget(modelPanel);}); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotModelPanel::updateState); + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [modelLayout, modelPanel] {modelLayout->setCurrentWidget(modelPanel);}); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotModelPanel::updateState); } -bool FrogPilotModelPanel::isModelInstalled(const QString &key) const { +bool StarPilotModelPanel::isModelInstalled(const QString &key) const { if (key.isEmpty()) { return false; } @@ -576,7 +576,7 @@ bool FrogPilotModelPanel::isModelInstalled(const QString &key) const { return foundAny; } -QMap FrogPilotModelPanel::getDeletableModelDisplayNames() { +QMap StarPilotModelPanel::getDeletableModelDisplayNames() { QMap deletable; QString defaultModelKey = QString::fromStdString(params.getKeyDefaultValue("Model").value()); @@ -613,11 +613,11 @@ QMap FrogPilotModelPanel::getDeletableModelDisplayNames() { return deletable; } -void FrogPilotModelPanel::showEvent(QShowEvent *event) { - FrogPilotUIState &fs = *frogpilotUIState(); +void StarPilotModelPanel::showEvent(QShowEvent *event) { + StarPilotUIState &fs = *starpilotUIState(); UIState &s = *uiState(); - frogpilotToggleLevels = parent->frogpilotToggleLevels; + starpilotToggleLevels = parent->starpilotToggleLevels; tuningLevel = parent->tuningLevel; allModelsDownloading = params_memory.getBool("DownloadAllModels"); @@ -702,26 +702,26 @@ void FrogPilotModelPanel::showEvent(QShowEvent *event) { noModelsDownloaded = getDeletableModelDisplayNames().isEmpty(); - bool parked = !s.scene.started || fs.frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !s.scene.started || fs.starpilot_scene.parked || parent->isFrogsGoMoo; deleteModelButton->setEnabled(!(allModelsDownloading || modelDownloading || noModelsDownloaded)); - downloadModelButton->setEnabledButtons(0, !allModelsDownloaded && !allModelsDownloading && !cancellingDownload && fs.frogpilot_scene.online && parked); - downloadModelButton->setEnabledButtons(1, !allModelsDownloaded && !modelDownloading && !cancellingDownload && fs.frogpilot_scene.online && parked); + downloadModelButton->setEnabledButtons(0, !allModelsDownloaded && !allModelsDownloading && !cancellingDownload && fs.starpilot_scene.online && parked); + downloadModelButton->setEnabledButtons(1, !allModelsDownloaded && !modelDownloading && !cancellingDownload && fs.starpilot_scene.online && parked); - downloadModelButton->setValue(fs.frogpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); + downloadModelButton->setValue(fs.starpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); started = s.scene.started; updateToggles(); } -void FrogPilotModelPanel::updateState(const UIState &s, const FrogPilotUIState &fs) { +void StarPilotModelPanel::updateState(const UIState &s, const StarPilotUIState &fs) { if (!isVisible() || finalizingDownload) { return; } - bool parked = !started || fs.frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !started || fs.starpilot_scene.parked || parent->isFrogsGoMoo; if (allModelsDownloading || modelDownloading) { QString progress = QString::fromStdString(params_memory.get("ModelDownloadProgress")); @@ -752,7 +752,7 @@ void FrogPilotModelPanel::updateState(const UIState &s, const FrogPilotUIState & }); } } else { - downloadModelButton->setValue(fs.frogpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); + downloadModelButton->setValue(fs.starpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); } deleteModelButton->setEnabled(!(allModelsDownloading || modelDownloading || noModelsDownloaded)); @@ -760,8 +760,8 @@ void FrogPilotModelPanel::updateState(const UIState &s, const FrogPilotUIState & downloadModelButton->setText(0, modelDownloading ? tr("CANCEL") : tr("DOWNLOAD")); downloadModelButton->setText(1, allModelsDownloading ? tr("CANCEL") : tr("DOWNLOAD ALL")); - downloadModelButton->setEnabledButtons(0, !allModelsDownloaded && !allModelsDownloading && !cancellingDownload && fs.frogpilot_scene.online && parked); - downloadModelButton->setEnabledButtons(1, !allModelsDownloaded && !modelDownloading && !cancellingDownload && fs.frogpilot_scene.online && parked); + downloadModelButton->setEnabledButtons(0, !allModelsDownloaded && !allModelsDownloading && !cancellingDownload && fs.starpilot_scene.online && parked); + downloadModelButton->setEnabledButtons(1, !allModelsDownloaded && !modelDownloading && !cancellingDownload && fs.starpilot_scene.online && parked); downloadModelButton->setVisibleButton(0, !allModelsDownloading); downloadModelButton->setVisibleButton(1, !modelDownloading); @@ -771,7 +771,7 @@ void FrogPilotModelPanel::updateState(const UIState &s, const FrogPilotUIState & parent->keepScreenOn = allModelsDownloading || modelDownloading; } -void FrogPilotModelPanel::updateModelLabels(FrogPilotListWidget *labelsList) { +void StarPilotModelPanel::updateModelLabels(StarPilotListWidget *labelsList) { labelsList->clear(); QJsonObject modelDrivesAndScores = QJsonDocument::fromJson(QString::fromStdString(params.get("ModelDrivesAndScores")).toUtf8()).object(); @@ -793,9 +793,9 @@ void FrogPilotModelPanel::updateModelLabels(FrogPilotListWidget *labelsList) { } } -void FrogPilotModelPanel::updateToggles() { +void StarPilotModelPanel::updateToggles() { for (auto &[key, toggle] : toggles) { - bool setVisible = tuningLevel >= frogpilotToggleLevels[key].toDouble(); + bool setVisible = tuningLevel >= starpilotToggleLevels[key].toDouble(); if (key == "ManageBlacklistedModels" || key == "ManageScores") { setVisible &= params.getBool("ModelRandomizer"); diff --git a/frogpilot/ui/qt/offroad/model_settings.h b/starpilot/ui/qt/offroad/model_settings.h similarity index 66% rename from frogpilot/ui/qt/offroad/model_settings.h rename to starpilot/ui/qt/offroad/model_settings.h index 1eb005fa..7526cd54 100644 --- a/frogpilot/ui/qt/offroad/model_settings.h +++ b/starpilot/ui/qt/offroad/model_settings.h @@ -2,13 +2,13 @@ #include -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotModelPanel : public FrogPilotListWidget { +class StarPilotModelPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotModelPanel(FrogPilotSettingsWindow *parent); + explicit StarPilotModelPanel(StarPilotSettingsWindow *parent); signals: void openSubPanel(); @@ -17,8 +17,8 @@ protected: void showEvent(QShowEvent *event) override; private: - void updateModelLabels(FrogPilotListWidget *labelsList); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateModelLabels(StarPilotListWidget *labelsList); + void updateState(const UIState &s, const StarPilotUIState &fs); void updateToggles(); bool isModelInstalled(const QString &key) const; QMap getDeletableModelDisplayNames(); @@ -40,18 +40,18 @@ private: ButtonControl *selectModelButton; - FrogPilotButtonsControl *deleteModelButton; - FrogPilotButtonsControl *downloadModelButton; - FrogPilotButtonsControl *updateTinygradButton; + StarPilotButtonsControl *deleteModelButton; + StarPilotButtonsControl *downloadModelButton; + StarPilotButtonsControl *updateTinygradButton; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; Params params; Params params_memory{"", true}; QDir modelDir{"/data/models/"}; - QJsonObject frogpilotToggleLevels; + QJsonObject starpilotToggleLevels; QMap modelFileToNameMap; QMap modelFileToNameMapProcessed; diff --git a/frogpilot/ui/qt/offroad/navigation_settings.cc b/starpilot/ui/qt/offroad/navigation_settings.cc similarity index 81% rename from frogpilot/ui/qt/offroad/navigation_settings.cc rename to starpilot/ui/qt/offroad/navigation_settings.cc index 4f787858..cb9c33bb 100644 --- a/frogpilot/ui/qt/offroad/navigation_settings.cc +++ b/starpilot/ui/qt/offroad/navigation_settings.cc @@ -1,6 +1,6 @@ -#include "frogpilot/ui/qt/offroad/navigation_settings.h" +#include "starpilot/ui/qt/offroad/navigation_settings.h" -FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotNavigationPanel::StarPilotNavigationPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; networkManager = new QNetworkAccessManager(this); @@ -8,15 +8,15 @@ FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *pare primelessLayout = new QStackedLayout(); addItem(primelessLayout); - FrogPilotListWidget *settingsList = new FrogPilotListWidget(this); + StarPilotListWidget *settingsList = new StarPilotListWidget(this); ipLabel = new LabelControl(tr("Manage Your Settings At"), tr("Offline...")); settingsList->addItem(ipLabel); - publicMapboxKeyControl = new FrogPilotButtonsControl(tr("Public Mapbox Key"), tr("Manage your Public Mapbox Key."), "", {tr("ADD"), tr("TEST")}); - QObject::connect(publicMapboxKeyControl, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + publicMapboxKeyControl = new StarPilotButtonsControl(tr("Public Mapbox Key"), tr("Manage your Public Mapbox Key."), "", {tr("ADD"), tr("TEST")}); + QObject::connect(publicMapboxKeyControl, &StarPilotButtonsControl::buttonClicked, [this](int id) { if (id == 0) { if (mapboxPublicKeySet) { - if (FrogPilotConfirmationDialog::yesorno(tr("Remove your Public Mapbox Key?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Remove your Public Mapbox Key?"), this)) { params.remove("MapboxPublicKey"); updateButtons(); @@ -58,11 +58,11 @@ FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *pare }); settingsList->addItem(publicMapboxKeyControl); - secretMapboxKeyControl = new FrogPilotButtonsControl(tr("Secret Mapbox Key"), tr("Manage your Secret Mapbox Key."), "", {tr("ADD"), tr("TEST")}); - QObject::connect(secretMapboxKeyControl, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + secretMapboxKeyControl = new StarPilotButtonsControl(tr("Secret Mapbox Key"), tr("Manage your Secret Mapbox Key."), "", {tr("ADD"), tr("TEST")}); + QObject::connect(secretMapboxKeyControl, &StarPilotButtonsControl::buttonClicked, [this](int id) { if (id == 0) { if (mapboxSecretKeySet) { - if (FrogPilotConfirmationDialog::yesorno(tr("Remove your Secret Mapbox Key?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Remove your Secret Mapbox Key?"), this)) { params.remove("MapboxSecretKey"); updateButtons(); @@ -115,17 +115,17 @@ FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *pare settingsList->addItem(setupButton); std::vector filterButtonNames{tr("CANCEL"), tr("Manually Update Speed Limits")}; - updateSpeedLimitsToggle = new FrogPilotButtonControl("SpeedLimitFiller", tr("Speed Limit Filler"), + updateSpeedLimitsToggle = new StarPilotButtonControl("SpeedLimitFiller", tr("Speed Limit Filler"), tr("Automatically collect missing or incorrect speed limits while you drive using speeds limits sourced from your dashboard (if supported), " "Mapbox, and \"Navigate on openpilot\".

" - "When you're parked and connected to Wi-Fi, FrogPilot will automatically processes this data into a file " - "to be used with the tool located at \"SpeedLimitFiller.frogpilot.com\".

" + "When you're parked and connected to Wi-Fi, StarPilot will automatically process this data into a file " + "to be used with the \"Speed Limit Filler\" tool in \"The Pond\".

" "You can download this file from \"The Pond\" in the \"Download Speed Limits\" menu.

" - "Need a step-by-step guide? Visit #speed-limit-filler in the FrogPilot Discord!"), + "Need a step-by-step guide? Visit #speed-limit-filler in the StarPilot Discord!"), "", filterButtonNames); - QObject::connect(updateSpeedLimitsToggle, &FrogPilotButtonControl::buttonClicked, [this](int id) { + QObject::connect(updateSpeedLimitsToggle, &StarPilotButtonControl::buttonClicked, [this](int id) { if (id == 0) { - if (FrogPilotConfirmationDialog::yesorno(tr("Cancel the speed-limit update?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Cancel the speed-limit update?"), this)) { updatingLimits = false; updateSpeedLimitsToggle->setEnabledButton(0, false); @@ -172,7 +172,7 @@ FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *pare updateSpeedLimitsToggle->setVisibleButton(0, true); updateSpeedLimitsToggle->setVisibleButton(1, false); - if (FrogPilotConfirmationDialog::yesorno(tr("This process takes a while. It's recommended to start when you're done driving and connected to stable Wi-Fi. Continue?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("This process takes a while. It's recommended to start when you're done driving and connected to stable Wi-Fi. Continue?"), this)) { updatingLimits = true; updateSpeedLimitsToggle->setValue("Calculating..."); @@ -198,7 +198,7 @@ FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *pare ScrollView *instructionsPanel = new ScrollView(imageLabel, this); primelessLayout->addWidget(instructionsPanel); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [this]() { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [this]() { primelessLayout->setCurrentIndex(0); if (forceOpenDescriptions) { @@ -208,10 +208,10 @@ FrogPilotNavigationPanel::FrogPilotNavigationPanel(FrogPilotSettingsWindow *pare updateSpeedLimitsToggle->showDescription(); } }); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotNavigationPanel::updateState); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotNavigationPanel::updateState); } -void FrogPilotNavigationPanel::showEvent(QShowEvent *event) { +void StarPilotNavigationPanel::showEvent(QShowEvent *event) { if (forceOpenDescriptions) { publicMapboxKeyControl->showDescription(); secretMapboxKeyControl->showDescription(); @@ -221,8 +221,8 @@ void FrogPilotNavigationPanel::showEvent(QShowEvent *event) { UIState &s = *uiState(); - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; QString ipAddress = fs.wifi->getIp4Address(); ipLabel->setText(ipAddress.isEmpty() ? tr("Offline...") : QString("%1:8082").arg(ipAddress)); @@ -231,7 +231,7 @@ void FrogPilotNavigationPanel::showEvent(QShowEvent *event) { updatingLimits = !params_memory.get("UpdateSpeedLimitsStatus").empty() && QString::fromStdString(params_memory.get("UpdateSpeedLimitsStatus")) != "Completed!"; - bool parked = !s.scene.started || frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !s.scene.started || starpilot_scene.parked || parent->isFrogsGoMoo; updateSpeedLimitsToggle->setVisibleButton(0, updatingLimits); updateSpeedLimitsToggle->setVisibleButton(1, !updatingLimits); @@ -239,17 +239,17 @@ void FrogPilotNavigationPanel::showEvent(QShowEvent *event) { if (updatingLimits) { updateSpeedLimitsToggle->setValue(QString::fromStdString(params_memory.get("UpdateSpeedLimitsStatus"))); } else { - updateSpeedLimitsToggle->setEnabledButton(1, frogpilot_scene.online && util::system_time_valid() && parked); - updateSpeedLimitsToggle->setValue(frogpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); - updateSpeedLimitsToggle->setVisible(parent->tuningLevel >= parent->frogpilotToggleLevels["SpeedLimitFiller"].toDouble()); + updateSpeedLimitsToggle->setEnabledButton(1, starpilot_scene.online && util::system_time_valid() && parked); + updateSpeedLimitsToggle->setValue(starpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); + updateSpeedLimitsToggle->setVisible(parent->tuningLevel >= parent->starpilotToggleLevels["SpeedLimitFiller"].toDouble()); } } -void FrogPilotNavigationPanel::hideEvent(QHideEvent *event) { +void StarPilotNavigationPanel::hideEvent(QHideEvent *event) { primelessLayout->setCurrentIndex(0); } -void FrogPilotNavigationPanel::mousePressEvent(QMouseEvent *event) { +void StarPilotNavigationPanel::mousePressEvent(QMouseEvent *event) { if (primelessLayout->currentIndex() == 1) { closeSubPanel(); @@ -264,30 +264,30 @@ void FrogPilotNavigationPanel::mousePressEvent(QMouseEvent *event) { } } -void FrogPilotNavigationPanel::updateButtons() { - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; +void StarPilotNavigationPanel::updateButtons() { + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; mapboxPublicKeySet = QString::fromStdString(params.get("MapboxPublicKey")).startsWith("pk"); mapboxSecretKeySet = QString::fromStdString(params.get("MapboxSecretKey")).startsWith("sk"); publicMapboxKeyControl->setText(0, mapboxPublicKeySet ? tr("REMOVE") : tr("ADD")); - publicMapboxKeyControl->setVisibleButton(1, mapboxPublicKeySet && frogpilot_scene.online); + publicMapboxKeyControl->setVisibleButton(1, mapboxPublicKeySet && starpilot_scene.online); secretMapboxKeyControl->setText(0, mapboxSecretKeySet ? tr("REMOVE") : tr("ADD")); - secretMapboxKeyControl->setVisibleButton(1, mapboxSecretKeySet && frogpilot_scene.online); + secretMapboxKeyControl->setVisibleButton(1, mapboxSecretKeySet && starpilot_scene.online); } -void FrogPilotNavigationPanel::updateState(const UIState &s, const FrogPilotUIState &fs) { +void StarPilotNavigationPanel::updateState(const UIState &s, const StarPilotUIState &fs) { if (!isVisible() || s.sm->frame % (UI_FREQ / 2) != 0) { return; } - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; updateButtons(); updateStep(); - bool parked = !s.scene.started || frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !s.scene.started || starpilot_scene.parked || parent->isFrogsGoMoo; if (updatingLimits) { if (QString::fromStdString(params_memory.get("UpdateSpeedLimitsStatus")) == "Completed!") { @@ -307,19 +307,19 @@ void FrogPilotNavigationPanel::updateState(const UIState &s, const FrogPilotUISt updateSpeedLimitsToggle->setValue(QString::fromStdString(params_memory.get("UpdateSpeedLimitsStatus"))); } } else { - updateSpeedLimitsToggle->setEnabledButton(1, frogpilot_scene.online && util::system_time_valid() && parked); - updateSpeedLimitsToggle->setValue(frogpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); + updateSpeedLimitsToggle->setEnabledButton(1, starpilot_scene.online && util::system_time_valid() && parked); + updateSpeedLimitsToggle->setValue(starpilot_scene.online ? (parked ? "" : "Not parked") : tr("Offline...")); } parent->keepScreenOn = primelessLayout->currentIndex() == 1 || updatingLimits; } -void FrogPilotNavigationPanel::updateStep() { +void StarPilotNavigationPanel::updateStep() { QString currentStep; if (mapboxPublicKeySet) { - currentStep = "../../frogpilot/navigation/navigation_training/public_key_set.png"; + currentStep = "../../starpilot/navigation/navigation_training/public_key_set.png"; } else { - currentStep = "../../frogpilot/navigation/navigation_training/no_keys_set.png"; + currentStep = "../../starpilot/navigation/navigation_training/no_keys_set.png"; } QPixmap pixmap; diff --git a/frogpilot/ui/qt/offroad/navigation_settings.h b/starpilot/ui/qt/offroad/navigation_settings.h similarity index 59% rename from frogpilot/ui/qt/offroad/navigation_settings.h rename to starpilot/ui/qt/offroad/navigation_settings.h index 27638cb1..f08160aa 100644 --- a/frogpilot/ui/qt/offroad/navigation_settings.h +++ b/starpilot/ui/qt/offroad/navigation_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotNavigationPanel : public FrogPilotListWidget { +class StarPilotNavigationPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotNavigationPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotNavigationPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void closeSubPanel(); @@ -19,7 +19,7 @@ protected: private: void mousePressEvent(QMouseEvent *event); void updateButtons(); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); void updateStep(); bool forceOpenDescriptions; @@ -27,13 +27,13 @@ private: bool mapboxSecretKeySet; bool updatingLimits; - FrogPilotButtonsControl *publicMapboxKeyControl; - FrogPilotButtonsControl *secretMapboxKeyControl; + StarPilotButtonsControl *publicMapboxKeyControl; + StarPilotButtonsControl *secretMapboxKeyControl; ButtonControl *setupButton; - FrogPilotButtonControl *updateSpeedLimitsToggle; + StarPilotButtonControl *updateSpeedLimitsToggle; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; LabelControl *ipLabel; diff --git a/frogpilot/ui/qt/offroad/sounds_settings.cc b/starpilot/ui/qt/offroad/sounds_settings.cc similarity index 81% rename from frogpilot/ui/qt/offroad/sounds_settings.cc rename to starpilot/ui/qt/offroad/sounds_settings.cc index 7b5e8b63..da8bfe60 100644 --- a/frogpilot/ui/qt/offroad/sounds_settings.cc +++ b/starpilot/ui/qt/offroad/sounds_settings.cc @@ -1,19 +1,19 @@ -#include "frogpilot/ui/qt/offroad/sounds_settings.h" +#include "starpilot/ui/qt/offroad/sounds_settings.h" -FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotSoundsPanel::StarPilotSoundsPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *soundsLayout = new QStackedLayout(); addItem(soundsLayout); - FrogPilotListWidget *soundsList = new FrogPilotListWidget(this); + StarPilotListWidget *soundsList = new StarPilotListWidget(this); ScrollView *soundsPanel = new ScrollView(soundsList, this); soundsLayout->addWidget(soundsPanel); - FrogPilotListWidget *alertVolumeControlList = new FrogPilotListWidget(this); - FrogPilotListWidget *customAlertsList = new FrogPilotListWidget(this); + StarPilotListWidget *alertVolumeControlList = new StarPilotListWidget(this); + StarPilotListWidget *customAlertsList = new StarPilotListWidget(this); ScrollView *alertVolumeControlPanel = new ScrollView(alertVolumeControlList, this); ScrollView *customAlertsPanel = new ScrollView(customAlertsList, this); @@ -22,7 +22,7 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool soundsLayout->addWidget(customAlertsPanel); const std::vector> soundsToggles { - {"AlertVolumeControl", tr("Alert Volume Controller"), tr("Set how loud each type of openpilot alert is to keep routine prompts from becoming distracting."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, + {"AlertVolumeControl", tr("Alert Volume Controller"), tr("Set how loud each type of openpilot alert is to keep routine prompts from becoming distracting."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, {"DisengageVolume", tr("Disengage Volume"), tr("Set the volume for alerts when openpilot disengages.

Examples include: \"Cruise Fault: Restart the Car\", \"Parking Brake Engaged\", \"Pedal Pressed\"."), ""}, {"EngageVolume", tr("Engage Volume"), tr("Set the volume for the chime when openpilot engages, such as after pressing the \"RESUME\" or \"SET\" steering wheel buttons."), ""}, {"PromptVolume", tr("Prompt Volume"), tr("Set the volume for prompts that need attention.

Examples include: \"Car Detected in Blindspot\", \"Steering Temporarily Unavailable\", \"Turn Exceeds Steering Limit\"."), ""}, @@ -31,7 +31,7 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool {"WarningSoftVolume", tr("Warning Soft Volume"), tr("Set the volume for softer warnings about potential risks.

Examples include: \"BRAKE! Risk of Collision\", \"Steering Temporarily Unavailable\"."), ""}, {"WarningImmediateVolume", tr("Warning Immediate Volume"), tr("Set the volume for the loudest warnings that require urgent attention.

Examples include: \"DISENGAGE IMMEDIATELY — Driver Distracted\", \"DISENGAGE IMMEDIATELY — Driver Unresponsive\"."), ""}, - {"CustomAlerts", tr("FrogPilot Alerts"), tr("Optional FrogPilot alerts that highlight driving events in a more noticeable way."), "../../frogpilot/assets/toggle_icons/icon_green_light.png"}, + {"CustomAlerts", tr("StarPilot Alerts"), tr("Optional StarPilot alerts that highlight driving events in a more noticeable way."), "../../starpilot/assets/toggle_icons/icon_green_light.png"}, {"GoatScream", tr("Goat Scream"), tr("Play the infamous \"Goat Scream\" when the steering controller reaches its limit. Based on the \"Turn Exceeds Steering Limit\" event."), ""}, {"GreenLightAlert", tr("Green Light Alert"), tr("Play an alert when the model predicts a red light has turned green.

Disclaimer: openpilot does not explicitly detect traffic lights. This alert is based on end-to-end model predictions from camera input and may trigger even when the light has not changed."), ""}, {"LeadDepartingAlert", tr("Lead Departing Alert"), tr("Play an alert when the lead vehicle departs from a stop."), ""}, @@ -43,8 +43,8 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool AbstractControl *soundsToggle; if (param == "AlertVolumeControl") { - FrogPilotManageControl *alertVolumeControlToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(alertVolumeControlToggle, &FrogPilotManageControl::manageButtonClicked, [soundsLayout, alertVolumeControlPanel]() { + StarPilotManageControl *alertVolumeControlToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(alertVolumeControlToggle, &StarPilotManageControl::manageButtonClicked, [soundsLayout, alertVolumeControlPanel]() { soundsLayout->setCurrentWidget(alertVolumeControlPanel); }); soundsToggle = alertVolumeControlToggle; @@ -55,14 +55,14 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool } std::vector alertButton{tr("Test")}; if (param == "WarningImmediateVolume" || param == "WarningSoftVolume") { - soundsToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 25, 101, QString(), volumeLabels, 1, true, {}, alertButton, false, false); + soundsToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 25, 101, QString(), volumeLabels, 1, true, {}, alertButton, false, false); } else { - soundsToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 0, 101, QString(), volumeLabels, 1, true, {}, alertButton, false, false); + soundsToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 0, 101, QString(), volumeLabels, 1, true, {}, alertButton, false, false); } } else if (param == "CustomAlerts") { - FrogPilotManageControl *customAlertsToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(customAlertsToggle, &FrogPilotManageControl::manageButtonClicked, [soundsLayout, customAlertsPanel]() { + StarPilotManageControl *customAlertsToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(customAlertsToggle, &StarPilotManageControl::manageButtonClicked, [soundsLayout, customAlertsPanel]() { soundsLayout->setCurrentWidget(customAlertsPanel); }); soundsToggle = customAlertsToggle; @@ -83,8 +83,8 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool parentKeys.insert(param); } - if (FrogPilotManageControl *frogPilotManageToggle = qobject_cast(soundsToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + if (StarPilotManageControl *frogPilotManageToggle = qobject_cast(soundsToggle)) { + QObject::connect(frogPilotManageToggle, &StarPilotManageControl::manageButtonClicked, [this]() { emit openSubPanel(); openDescriptions(forceOpenDescriptions, toggles); }); @@ -99,18 +99,18 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool } for (const QString &key : alertVolumeControlKeys) { - FrogPilotParamValueButtonControl *toggle = static_cast(toggles[key]); - QObject::connect(toggle, &FrogPilotParamValueButtonControl::buttonClicked, [key, toggle, this]() { + StarPilotParamValueButtonControl *toggle = static_cast(toggles[key]); + QObject::connect(toggle, &StarPilotParamValueButtonControl::buttonClicked, [key, toggle, this]() { toggle->updateParam(); testSound(key); }); } - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [soundsLayout, soundsPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [soundsLayout, soundsPanel, this] { openDescriptions(forceOpenDescriptions, toggles); soundsLayout->setCurrentWidget(soundsPanel); }); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotSoundsPanel::updateState); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotSoundsPanel::updateState); for (auto &[key, toggle] : toggles) { if (alertVolumeControlKeys.contains(key)) { @@ -123,11 +123,11 @@ FrogPilotSoundsPanel::FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool updateToggles(); } -void FrogPilotSoundsPanel::showEvent(QShowEvent *event) { +void StarPilotSoundsPanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotSoundsPanel::initializeSoundPlayer() { +void StarPilotSoundsPanel::initializeSoundPlayer() { QString program = R"( import numpy as np import sounddevice as sd @@ -154,7 +154,7 @@ while True: soundPlayerProcess->start("python3", QStringList{"-u", "-c", program}); } -void FrogPilotSoundsPanel::updateState(const UIState &s) { +void StarPilotSoundsPanel::updateState(const UIState &s) { if (!isVisible()) { return; } @@ -162,7 +162,7 @@ void FrogPilotSoundsPanel::updateState(const UIState &s) { started = s.scene.started; } -void FrogPilotSoundsPanel::updateToggles() { +void StarPilotSoundsPanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -174,7 +174,7 @@ void FrogPilotSoundsPanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "LoudBlindspotAlert") { setVisible &= parent->hasBSM; @@ -200,11 +200,11 @@ void FrogPilotSoundsPanel::updateToggles() { update(); } -void FrogPilotSoundsPanel::testSound(const QString &key) { +void StarPilotSoundsPanel::testSound(const QString &key) { QString baseName = QString(key).remove("Volume"); if (started) { - updateFrogPilotToggles(); + updateStarPilotToggles(); util::sleep_for(UI_FREQ); @@ -213,7 +213,7 @@ void FrogPilotSoundsPanel::testSound(const QString &key) { } else { QString snakeCaseAlert = QString(baseName).replace(QRegularExpression("([A-Z])"), "_\\1").toLower().mid(1); QString stockPath = "../../selfdrive/assets/sounds/" + snakeCaseAlert + ".wav"; - QString themePath = "../../frogpilot/assets/active_theme/sounds/" + snakeCaseAlert + ".wav"; + QString themePath = "../../starpilot/assets/active_theme/sounds/" + snakeCaseAlert + ".wav"; float volume = params.getFloat(key.toStdString()) / 100.0f; diff --git a/frogpilot/ui/qt/offroad/sounds_settings.h b/starpilot/ui/qt/offroad/sounds_settings.h similarity index 79% rename from frogpilot/ui/qt/offroad/sounds_settings.h rename to starpilot/ui/qt/offroad/sounds_settings.h index ada6a3ff..b95a2f5a 100644 --- a/frogpilot/ui/qt/offroad/sounds_settings.h +++ b/starpilot/ui/qt/offroad/sounds_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotSoundsPanel : public FrogPilotListWidget { +class StarPilotSoundsPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotSoundsPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotSoundsPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -30,7 +30,7 @@ private: QSet parentKeys; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; Params params; Params params_memory{"", true}; diff --git a/frogpilot/ui/qt/offroad/frogpilot_settings.cc b/starpilot/ui/qt/offroad/starpilot_settings.cc similarity index 66% rename from frogpilot/ui/qt/offroad/frogpilot_settings.cc rename to starpilot/ui/qt/offroad/starpilot_settings.cc index f73b7ac9..ddc0e3db 100644 --- a/frogpilot/ui/qt/offroad/frogpilot_settings.cc +++ b/starpilot/ui/qt/offroad/starpilot_settings.cc @@ -1,17 +1,17 @@ -#include "frogpilot/ui/qt/offroad/data_settings.h" -#include "frogpilot/ui/qt/offroad/device_settings.h" -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" -#include "frogpilot/ui/qt/offroad/lateral_settings.h" -#include "frogpilot/ui/qt/offroad/longitudinal_settings.h" -#include "frogpilot/ui/qt/offroad/maps_settings.h" -#include "frogpilot/ui/qt/offroad/model_settings.h" -#include "frogpilot/ui/qt/offroad/navigation_settings.h" -#include "frogpilot/ui/qt/offroad/sounds_settings.h" -#include "frogpilot/ui/qt/offroad/theme_settings.h" -#include "frogpilot/ui/qt/offroad/utilities.h" -#include "frogpilot/ui/qt/offroad/vehicle_settings.h" -#include "frogpilot/ui/qt/offroad/visual_settings.h" -#include "frogpilot/ui/qt/offroad/wheel_settings.h" +#include "starpilot/ui/qt/offroad/data_settings.h" +#include "starpilot/ui/qt/offroad/device_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" +#include "starpilot/ui/qt/offroad/lateral_settings.h" +#include "starpilot/ui/qt/offroad/longitudinal_settings.h" +#include "starpilot/ui/qt/offroad/maps_settings.h" +#include "starpilot/ui/qt/offroad/model_settings.h" +#include "starpilot/ui/qt/offroad/navigation_settings.h" +#include "starpilot/ui/qt/offroad/sounds_settings.h" +#include "starpilot/ui/qt/offroad/theme_settings.h" +#include "starpilot/ui/qt/offroad/utilities.h" +#include "starpilot/ui/qt/offroad/vehicle_settings.h" +#include "starpilot/ui/qt/offroad/visual_settings.h" +#include "starpilot/ui/qt/offroad/wheel_settings.h" #include "system/hardware/hw.h" bool nnffLogFileExists(const QString &carFingerprint) { @@ -19,7 +19,7 @@ bool nnffLogFileExists(const QString &carFingerprint) { static QMap substitutes; if (models.isEmpty()) { - QFileInfoList fileInfoList = QDir(QStringLiteral("../../frogpilot/assets/nnff_models")).entryInfoList(QDir::Files | QDir::NoDotAndDotDot); + QFileInfoList fileInfoList = QDir(QStringLiteral("../../starpilot/assets/nnff_models")).entryInfoList(QDir::Files | QDir::NoDotAndDotDot); for (const QFileInfo &fileInfo : fileInfoList) { models.append(fileInfo.completeBaseName()); } @@ -63,37 +63,37 @@ bool nnffLogFileExists(const QString &carFingerprint) { return false; } -void FrogPilotSettingsWindow::createPanelButtons(FrogPilotListWidget *list) { - FrogPilotDataPanel *frogpilotDataPanel = new FrogPilotDataPanel(this, !shownDescriptions.value("FrogPilotDataPanel").toBool(false)); - FrogPilotDevicePanel *frogpilotDevicePanel = new FrogPilotDevicePanel(this, !shownDescriptions.value("FrogPilotDevicePanel").toBool(false)); - FrogPilotLateralPanel *frogpilotLateralPanel = new FrogPilotLateralPanel(this, !shownDescriptions.value("FrogPilotLateralPanel").toBool(false)); - FrogPilotLongitudinalPanel *frogpilotLongitudinalPanel = new FrogPilotLongitudinalPanel(this, !shownDescriptions.value("FrogPilotLongitudinalPanel").toBool(false)); - FrogPilotMapsPanel *frogpilotMapsPanel = new FrogPilotMapsPanel(this, !shownDescriptions.value("FrogPilotMapsPanel").toBool(false)); - FrogPilotModelPanel *frogpilotModelPanel = new FrogPilotModelPanel(this); - FrogPilotNavigationPanel *frogpilotNavigationPanel = new FrogPilotNavigationPanel(this, !shownDescriptions.value("FrogPilotNavigationPanel").toBool(false)); - FrogPilotSoundsPanel *frogpilotSoundsPanel = new FrogPilotSoundsPanel(this, !shownDescriptions.value("FrogPilotSoundsPanel").toBool(false)); - FrogPilotThemesPanel *frogpilotThemesPanel = new FrogPilotThemesPanel(this, !shownDescriptions.value("FrogPilotThemesPanel").toBool(false)); - FrogPilotUtilitiesPanel *frogpilotUtilitiesPanel = new FrogPilotUtilitiesPanel(this, !shownDescriptions.value("FrogPilotUtilitiesPanel").toBool(false)); - FrogPilotVehiclesPanel *frogpilotVehiclesPanel = new FrogPilotVehiclesPanel(this, !shownDescriptions.value("FrogPilotVehiclesPanel").toBool(false)); - FrogPilotVisualsPanel *frogpilotVisualsPanel = new FrogPilotVisualsPanel(this, !shownDescriptions.value("FrogPilotVisualsPanel").toBool(false)); - FrogPilotWheelPanel *frogpilotWheelPanel = new FrogPilotWheelPanel(this, !shownDescriptions.value("FrogPilotWheelPanel").toBool(false)); +void StarPilotSettingsWindow::createPanelButtons(StarPilotListWidget *list) { + StarPilotDataPanel *starpilotDataPanel = new StarPilotDataPanel(this, !shownDescriptions.value("StarPilotDataPanel").toBool(false)); + StarPilotDevicePanel *starpilotDevicePanel = new StarPilotDevicePanel(this, !shownDescriptions.value("StarPilotDevicePanel").toBool(false)); + StarPilotLateralPanel *starpilotLateralPanel = new StarPilotLateralPanel(this, !shownDescriptions.value("StarPilotLateralPanel").toBool(false)); + StarPilotLongitudinalPanel *starpilotLongitudinalPanel = new StarPilotLongitudinalPanel(this, !shownDescriptions.value("StarPilotLongitudinalPanel").toBool(false)); + StarPilotMapsPanel *starpilotMapsPanel = new StarPilotMapsPanel(this, !shownDescriptions.value("StarPilotMapsPanel").toBool(false)); + StarPilotModelPanel *starpilotModelPanel = new StarPilotModelPanel(this); + StarPilotNavigationPanel *starpilotNavigationPanel = new StarPilotNavigationPanel(this, !shownDescriptions.value("StarPilotNavigationPanel").toBool(false)); + StarPilotSoundsPanel *starpilotSoundsPanel = new StarPilotSoundsPanel(this, !shownDescriptions.value("StarPilotSoundsPanel").toBool(false)); + StarPilotThemesPanel *starpilotThemesPanel = new StarPilotThemesPanel(this, !shownDescriptions.value("StarPilotThemesPanel").toBool(false)); + StarPilotUtilitiesPanel *starpilotUtilitiesPanel = new StarPilotUtilitiesPanel(this, !shownDescriptions.value("StarPilotUtilitiesPanel").toBool(false)); + StarPilotVehiclesPanel *starpilotVehiclesPanel = new StarPilotVehiclesPanel(this, !shownDescriptions.value("StarPilotVehiclesPanel").toBool(false)); + StarPilotVisualsPanel *starpilotVisualsPanel = new StarPilotVisualsPanel(this, !shownDescriptions.value("StarPilotVisualsPanel").toBool(false)); + StarPilotWheelPanel *starpilotWheelPanel = new StarPilotWheelPanel(this, !shownDescriptions.value("StarPilotWheelPanel").toBool(false)); std::vector>> panelButtons = { - {{tr("MANAGE"), frogpilotSoundsPanel}}, - {{tr("DRIVING MODEL"), frogpilotModelPanel}, {tr("GAS / BRAKE"), frogpilotLongitudinalPanel}, {tr("STEERING"), frogpilotLateralPanel}}, - {{tr("MAP DATA"), frogpilotMapsPanel}, {tr("NAVIGATION"), frogpilotNavigationPanel}}, - {{tr("DATA"), frogpilotDataPanel}, {tr("DEVICE CONTROLS"), frogpilotDevicePanel}, {tr("UTILITIES"), frogpilotUtilitiesPanel}}, - {{tr("APPEARANCE"), frogpilotVisualsPanel}, {tr("THEME"), frogpilotThemesPanel}}, - {{tr("VEHICLE SETTINGS"), frogpilotVehiclesPanel}, {tr("WHEEL CONTROLS"), frogpilotWheelPanel}} + {{tr("MANAGE"), starpilotSoundsPanel}}, + {{tr("DRIVING MODEL"), starpilotModelPanel}, {tr("GAS / BRAKE"), starpilotLongitudinalPanel}, {tr("STEERING"), starpilotLateralPanel}}, + {{tr("MAP DATA"), starpilotMapsPanel}, {tr("NAVIGATION"), starpilotNavigationPanel}}, + {{tr("DATA"), starpilotDataPanel}, {tr("DEVICE CONTROLS"), starpilotDevicePanel}, {tr("UTILITIES"), starpilotUtilitiesPanel}}, + {{tr("APPEARANCE"), starpilotVisualsPanel}, {tr("THEME"), starpilotThemesPanel}}, + {{tr("VEHICLE SETTINGS"), starpilotVehiclesPanel}, {tr("WHEEL CONTROLS"), starpilotWheelPanel}} }; std::vector> panelInfo = { - {tr("Alerts and Sounds"), tr("Adjust alert volumes and enable custom notifications."), "../../frogpilot/assets/toggle_icons/icon_sound.png"}, - {tr("Driving Controls"), tr("Fine-tune custom FrogPilot acceleration, braking, and steering controls."), "../../frogpilot/assets/toggle_icons/icon_steering.png"}, - {tr("Navigation"), tr("Download map data for the \"Speed Limit Controller\"."), "../../frogpilot/assets/toggle_icons/icon_navigate.png"}, - {tr("System Settings"), tr("Manage backups, device settings, screen options, storage, and tools to keep FrogPilot running smoothly."), "../../frogpilot/assets/toggle_icons/icon_system.png"}, - {tr("Theme and Appearance"), tr("Customize the look of the driving screen and interface, including themes!"), "../../frogpilot/assets/toggle_icons/icon_display.png"}, - {tr("Vehicle Settings"), tr("Configure car-specific options and steering wheel button mappings."), "../../frogpilot/assets/toggle_icons/icon_vehicle.png"} + {tr("Alerts and Sounds"), tr("Adjust alert volumes and enable custom notifications."), "../../starpilot/assets/toggle_icons/icon_sound.png"}, + {tr("Driving Controls"), tr("Fine-tune custom StarPilot acceleration, braking, and steering controls."), "../../starpilot/assets/toggle_icons/icon_steering.png"}, + {tr("Navigation"), tr("Download map data for the \"Speed Limit Controller\"."), "../../starpilot/assets/toggle_icons/icon_navigate.png"}, + {tr("System Settings"), tr("Manage backups, device settings, screen options, storage, and tools to keep StarPilot running smoothly."), "../../starpilot/assets/toggle_icons/icon_system.png"}, + {tr("Theme and Appearance"), tr("Customize the look of the driving screen and interface, including themes!"), "../../starpilot/assets/toggle_icons/icon_display.png"}, + {tr("Vehicle Settings"), tr("Configure car-specific options and steering wheel button mappings."), "../../starpilot/assets/toggle_icons/icon_vehicle.png"} }; for (size_t i = 0; i < panelInfo.size(); ++i) { @@ -117,7 +117,7 @@ void FrogPilotSettingsWindow::createPanelButtons(FrogPilotListWidget *list) { widgets.push_back(panelFrame); } - FrogPilotButtonsControl *panelButton = new FrogPilotButtonsControl(title, description, icon, labels); + StarPilotButtonsControl *panelButton = new StarPilotButtonsControl(title, description, icon, labels); if (title == tr("Alerts and Sounds")) soundPanelButtons = panelButton; if (title == tr("Driving Controls")) drivingPanelButtons = panelButton; if (title == tr("Navigation")) navigationPanelButtons = panelButton; @@ -129,7 +129,7 @@ void FrogPilotSettingsWindow::createPanelButtons(FrogPilotListWidget *list) { panelButton->showDescription(); } - QObject::connect(panelButton, &FrogPilotButtonsControl::buttonClicked, [widgets, this](int id) { + QObject::connect(panelButton, &StarPilotButtonsControl::buttonClicked, [widgets, this](int id) { mainLayout->setCurrentWidget(widgets[id]); panelOpen = true; @@ -151,24 +151,24 @@ void FrogPilotSettingsWindow::createPanelButtons(FrogPilotListWidget *list) { list->addItem(panelButton); } - QObject::connect(frogpilotDataPanel, &FrogPilotDataPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotDevicePanel, &FrogPilotDevicePanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotLateralPanel, &FrogPilotLateralPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotLongitudinalPanel, &FrogPilotLongitudinalPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotLongitudinalPanel, &FrogPilotLongitudinalPanel::openSubSubPanel, this, &FrogPilotSettingsWindow::openSubSubPanel); - QObject::connect(frogpilotLongitudinalPanel, &FrogPilotLongitudinalPanel::openSubSubSubPanel, this, &FrogPilotSettingsWindow::openSubSubSubPanel); - QObject::connect(frogpilotMapsPanel, &FrogPilotMapsPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotModelPanel, &FrogPilotModelPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotNavigationPanel, &FrogPilotNavigationPanel::closeSubPanel, this, &FrogPilotSettingsWindow::closeSubPanel); - QObject::connect(frogpilotNavigationPanel, &FrogPilotNavigationPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotSoundsPanel, &FrogPilotSoundsPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotThemesPanel, &FrogPilotThemesPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotVehiclesPanel, &FrogPilotVehiclesPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotVisualsPanel, &FrogPilotVisualsPanel::openSubPanel, this, &FrogPilotSettingsWindow::openSubPanel); - QObject::connect(frogpilotVisualsPanel, &FrogPilotVisualsPanel::openSubSubPanel, this, &FrogPilotSettingsWindow::openSubSubPanel); + QObject::connect(starpilotDataPanel, &StarPilotDataPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotDevicePanel, &StarPilotDevicePanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotLateralPanel, &StarPilotLateralPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotLongitudinalPanel, &StarPilotLongitudinalPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotLongitudinalPanel, &StarPilotLongitudinalPanel::openSubSubPanel, this, &StarPilotSettingsWindow::openSubSubPanel); + QObject::connect(starpilotLongitudinalPanel, &StarPilotLongitudinalPanel::openSubSubSubPanel, this, &StarPilotSettingsWindow::openSubSubSubPanel); + QObject::connect(starpilotMapsPanel, &StarPilotMapsPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotModelPanel, &StarPilotModelPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotNavigationPanel, &StarPilotNavigationPanel::closeSubPanel, this, &StarPilotSettingsWindow::closeSubPanel); + QObject::connect(starpilotNavigationPanel, &StarPilotNavigationPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotSoundsPanel, &StarPilotSoundsPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotThemesPanel, &StarPilotThemesPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotVehiclesPanel, &StarPilotVehiclesPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotVisualsPanel, &StarPilotVisualsPanel::openSubPanel, this, &StarPilotSettingsWindow::openSubPanel); + QObject::connect(starpilotVisualsPanel, &StarPilotVisualsPanel::openSubSubPanel, this, &StarPilotSettingsWindow::openSubSubPanel); } -FrogPilotSettingsWindow::FrogPilotSettingsWindow(SettingsWindow *parent) : QFrame(parent) { +StarPilotSettingsWindow::StarPilotSettingsWindow(SettingsWindow *parent) : QFrame(parent) { shownDescriptions = QJsonDocument::fromJson(QString::fromStdString(params.get("ShownToggleDescriptions")).toUtf8()).object(); QString className = this->metaObject()->className(); @@ -178,27 +178,27 @@ FrogPilotSettingsWindow::FrogPilotSettingsWindow(SettingsWindow *parent) : QFram mainLayout = new QStackedLayout(this); - QWidget *frogpilotWidget = new QWidget(this); - QVBoxLayout *frogpilotLayout = new QVBoxLayout(frogpilotWidget); - frogpilotLayout->setContentsMargins(50, 25, 50, 25); - frogpilotWidget->setLayout(frogpilotLayout); + QWidget *starpilotWidget = new QWidget(this); + QVBoxLayout *starpilotLayout = new QVBoxLayout(starpilotWidget); + starpilotLayout->setContentsMargins(50, 25, 50, 25); + starpilotWidget->setLayout(starpilotLayout); - frogpilotPanel = new ScrollView(frogpilotWidget, this); - mainLayout->addWidget(frogpilotPanel); - frogpilotPanel->setWidget(frogpilotWidget); + starpilotPanel = new ScrollView(starpilotWidget, this); + mainLayout->addWidget(starpilotPanel); + starpilotPanel->setWidget(starpilotWidget); - FrogPilotListWidget *list = new FrogPilotListWidget(this); - frogpilotLayout->addWidget(list); + StarPilotListWidget *list = new StarPilotListWidget(this); + starpilotLayout->addWidget(list); std::vector togglePresets{tr("Minimal"), tr("Standard"), tr("Advanced"), tr("Developer")}; - togglePreset = new FrogPilotButtonsControl(tr("Tuning Level"), + togglePreset = new StarPilotButtonsControl(tr("Tuning Level"), tr("Choose your tuning level. Lower levels keep it simple; higher levels unlock more toggles for finer control.\n\n" "Minimal - Ideal for those who prefer simplicity or ease of use\n" "Standard - Recommended for most users for a balanced experience\n" "Advanced - Fine-tuning for experienced users\n" "Developer - Highly customizable settings for seasoned enthusiasts"), - "../../frogpilot/assets/toggle_icons/icon_tuning.png", togglePresets, true); - QObject::connect(togglePreset, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + "../../starpilot/assets/toggle_icons/icon_tuning.png", togglePresets, true); + QObject::connect(togglePreset, &StarPilotButtonsControl::buttonClicked, [this](int id) { tuningLevel = id; params.putIntNonBlocking("TuningLevel", tuningLevel); @@ -219,19 +219,19 @@ FrogPilotSettingsWindow::FrogPilotSettingsWindow(SettingsWindow *parent) : QFram createPanelButtons(list); - QObject::connect(parent, &SettingsWindow::closePanel, this, &FrogPilotSettingsWindow::closePanel); - QObject::connect(parent, &SettingsWindow::closeSubPanel, this, &FrogPilotSettingsWindow::closeSubPanel); - QObject::connect(parent, &SettingsWindow::closeSubSubPanel, this, &FrogPilotSettingsWindow::closeSubSubPanel); - QObject::connect(parent, &SettingsWindow::closeSubSubSubPanel, this, &FrogPilotSettingsWindow::closeSubSubSubPanel); - QObject::connect(parent, &SettingsWindow::updateMetric, this, &FrogPilotSettingsWindow::updateMetric); - QObject::connect(parent, &SettingsWindow::updateTuningLevel, this, &FrogPilotSettingsWindow::updateTuningLevel); - QObject::connect(uiState(), &UIState::offroadTransition, this, &FrogPilotSettingsWindow::updateVariables); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotSettingsWindow::updateState); + QObject::connect(parent, &SettingsWindow::closePanel, this, &StarPilotSettingsWindow::closePanel); + QObject::connect(parent, &SettingsWindow::closeSubPanel, this, &StarPilotSettingsWindow::closeSubPanel); + QObject::connect(parent, &SettingsWindow::closeSubSubPanel, this, &StarPilotSettingsWindow::closeSubSubPanel); + QObject::connect(parent, &SettingsWindow::closeSubSubSubPanel, this, &StarPilotSettingsWindow::closeSubSubSubPanel); + QObject::connect(parent, &SettingsWindow::updateMetric, this, &StarPilotSettingsWindow::updateMetric); + QObject::connect(parent, &SettingsWindow::updateTuningLevel, this, &StarPilotSettingsWindow::updateTuningLevel); + QObject::connect(uiState(), &UIState::offroadTransition, this, &StarPilotSettingsWindow::updateVariables); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotSettingsWindow::updateState); std::vector keys = params.allKeys(); for (std::vector::const_iterator it = keys.begin(); it != keys.end(); ++it) { const std::string &key = *it; - frogpilotToggleLevels[QString::fromStdString(key)] = params.getTuningLevel(key); + starpilotToggleLevels[QString::fromStdString(key)] = params.getTuningLevel(key); } tuningLevel = params.getInt("TuningLevel"); @@ -240,7 +240,7 @@ FrogPilotSettingsWindow::FrogPilotSettingsWindow(SettingsWindow *parent) : QFram updateVariables(); } -void FrogPilotSettingsWindow::updateTuningLevel() { +void StarPilotSettingsWindow::updateTuningLevel() { tuningLevel = params.getInt("TuningLevel"); togglePreset->setCheckedButton(params.getInt("TuningLevel")); @@ -249,7 +249,7 @@ void FrogPilotSettingsWindow::updateTuningLevel() { emit tuningLevelChanged(tuningLevel); } -void FrogPilotSettingsWindow::showEvent(QShowEvent *event) { +void StarPilotSettingsWindow::showEvent(QShowEvent *event) { static bool alertShown = false; QString className = this->metaObject()->className(); @@ -275,11 +275,11 @@ void FrogPilotSettingsWindow::showEvent(QShowEvent *event) { } } -void FrogPilotSettingsWindow::hideEvent(QHideEvent *event) { +void StarPilotSettingsWindow::hideEvent(QHideEvent *event) { closePanel(); } -void FrogPilotSettingsWindow::closePanel() { +void StarPilotSettingsWindow::closePanel() { if (forceOpenDescriptions) { togglePreset->showDescription(); @@ -291,26 +291,26 @@ void FrogPilotSettingsWindow::closePanel() { vehiclePanelButtons->showDescription(); } - mainLayout->setCurrentWidget(frogpilotPanel); + mainLayout->setCurrentWidget(starpilotPanel); panelOpen = false; } -void FrogPilotSettingsWindow::updateState() { - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; +void StarPilotSettingsWindow::updateState() { + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; - frogpilot_scene.frogpilot_panel_active = panelOpen && keepScreenOn; + starpilot_scene.starpilot_panel_active = panelOpen && keepScreenOn; } -void FrogPilotSettingsWindow::updateVariables() { - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; +void StarPilotSettingsWindow::updateVariables() { + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; auto applyDesktopVehicleFallback = [&]() { - QString fallbackMake = frogpilot_toggles.value("car_make").toString(); - QString fallbackModel = frogpilot_toggles.value("car_model").toString(); + QString fallbackMake = starpilot_toggles.value("car_make").toString(); + QString fallbackModel = starpilot_toggles.value("car_model").toString(); if (fallbackMake.isEmpty()) { fallbackMake = "gm"; } @@ -321,9 +321,9 @@ void FrogPilotSettingsWindow::updateVariables() { carMake = fallbackMake.toStdString(); std::string fallbackFingerprint = fallbackModel.toStdString(); - hasPedal = frogpilot_toggles.value("has_pedal").toBool(true); - hasSDSU = frogpilot_toggles.value("has_sdsu").toBool(); - hasZSS = frogpilot_toggles.value("has_zss").toBool(); + hasPedal = starpilot_toggles.value("has_pedal").toBool(true); + hasSDSU = starpilot_toggles.value("has_sdsu").toBool(); + hasZSS = starpilot_toggles.value("has_zss").toBool(); isBolt = fallbackFingerprint.rfind("CHEVROLET_BOLT", 0) == 0; isGM = carMake == "gm"; isHKG = carMake == "hyundai"; @@ -355,9 +355,9 @@ void FrogPilotSettingsWindow::updateVariables() { hasPCMCruise = CP.getPcmCruise(); hasPedal = CP.getEnableGasInterceptorDEPRECATED(); hasRadar = !CP.getRadarUnavailable(); - hasSDSU = frogpilot_toggles.value("has_sdsu").toBool(); + hasSDSU = starpilot_toggles.value("has_sdsu").toBool(); hasSNG = CP.getAutoResumeSng(); - hasZSS = frogpilot_toggles.value("has_zss").toBool(); + hasZSS = starpilot_toggles.value("has_zss").toBool(); isAngleCar = CP.getSteerControlType() == cereal::CarParams::SteerControlType::ANGLE; isBolt = carFingerprint.rfind("CHEVROLET_BOLT", 0) == 0; isGM = carMake == "gm"; @@ -369,7 +369,7 @@ void FrogPilotSettingsWindow::updateVariables() { isTSK = CP.getSecOcRequired(); isVolt = carFingerprint.rfind("CHEVROLET_VOLT", 0) == 0; latAccelFactor = CP.getLateralTuning().getTorque().getLatAccelFactor(); - lkasAllowedForAOL = frogpilot_toggles.value("lkas_allowed_for_aol").toBool(); + lkasAllowedForAOL = starpilot_toggles.value("lkas_allowed_for_aol").toBool(); longitudinalActuatorDelay = CP.getLongitudinalActuatorDelay(); startAccel = CP.getStartAccel(); steerActuatorDelay = CP.getSteerActuatorDelay(); @@ -476,11 +476,11 @@ void FrogPilotSettingsWindow::updateVariables() { applyDesktopVehicleFallback(); } - std::string frogpilotCarParams = params.get("FrogPilotCarParamsPersistent"); - if (!frogpilotCarParams.empty()) { + std::string starpilotCarParams = params.get("StarPilotCarParamsPersistent"); + if (!starpilotCarParams.empty()) { AlignedBuffer aligned_buf; - capnp::FlatArrayMessageReader fpcmsg(aligned_buf.align(frogpilotCarParams.data(), frogpilotCarParams.size())); - cereal::FrogPilotCarParams::Reader FPCP = fpcmsg.getRoot(); + capnp::FlatArrayMessageReader fpcmsg(aligned_buf.align(starpilotCarParams.data(), starpilotCarParams.size())); + cereal::StarPilotCarParams::Reader FPCP = fpcmsg.getRoot(); canUsePedal = FPCP.getCanUsePedal(); canUseSDSU = FPCP.getCanUseSDSU(); @@ -497,12 +497,12 @@ void FrogPilotSettingsWindow::updateVariables() { hasAutoTune = LTP.getUseParams(); } - drivingPanelButtons->setVisibleButton(0, tuningLevel >= frogpilotToggleLevels.value("DrivingModel").toDouble()); + drivingPanelButtons->setVisibleButton(0, tuningLevel >= starpilotToggleLevels.value("DrivingModel").toDouble()); drivingPanelButtons->setVisibleButton(1, hasOpenpilotLongitudinal); - systemPanelButtons->setVisibleButton(1, tuningLevel >= frogpilotToggleLevels.value("DeviceManagement").toDouble() || tuningLevel >= frogpilotToggleLevels.value("ScreenManagement").toDouble()); + systemPanelButtons->setVisibleButton(1, tuningLevel >= starpilotToggleLevels.value("DeviceManagement").toDouble() || tuningLevel >= starpilotToggleLevels.value("ScreenManagement").toDouble()); - vehiclePanelButtons->setVisibleButton(1, tuningLevel >= frogpilotToggleLevels.value("WheelControls").toDouble()); + vehiclePanelButtons->setVisibleButton(1, tuningLevel >= starpilotToggleLevels.value("WheelControls").toDouble()); update(); } diff --git a/frogpilot/ui/qt/offroad/frogpilot_settings.h b/starpilot/ui/qt/offroad/starpilot_settings.h similarity index 74% rename from frogpilot/ui/qt/offroad/frogpilot_settings.h rename to starpilot/ui/qt/offroad/starpilot_settings.h index a8b5927f..660a2f73 100644 --- a/frogpilot/ui/qt/offroad/frogpilot_settings.h +++ b/starpilot/ui/qt/offroad/starpilot_settings.h @@ -3,16 +3,16 @@ #include "selfdrive/ui/qt/offroad/settings.h" #include "selfdrive/ui/qt/widgets/scrollview.h" -#include "frogpilot/ui/frogpilot_ui.h" -#include "frogpilot/ui/qt/widgets/frogpilot_controls.h" +#include "starpilot/ui/starpilot_ui.h" +#include "starpilot/ui/qt/widgets/starpilot_controls.h" class QNetworkAccessManager; -class FrogPilotSettingsWindow : public QFrame { +class StarPilotSettingsWindow : public QFrame { Q_OBJECT public: - explicit FrogPilotSettingsWindow(SettingsWindow *parent); + explicit StarPilotSettingsWindow(SettingsWindow *parent); void updateVariables(); @@ -60,7 +60,7 @@ public: int tuningLevel; - QJsonObject frogpilotToggleLevels; + QJsonObject starpilotToggleLevels; signals: void closeSubPanel(); @@ -75,7 +75,7 @@ signals: private: void closePanel(); - void createPanelButtons(FrogPilotListWidget *list); + void createPanelButtons(StarPilotListWidget *list); void hideEvent(QHideEvent *event) override; void showEvent(QShowEvent *event) override; void updateState(); @@ -85,13 +85,13 @@ private: std::string carMake; - FrogPilotButtonsControl *drivingPanelButtons; - FrogPilotButtonsControl *navigationPanelButtons; - FrogPilotButtonsControl *soundPanelButtons; - FrogPilotButtonsControl *systemPanelButtons; - FrogPilotButtonsControl *themePanelButtons; - FrogPilotButtonsControl *togglePreset; - FrogPilotButtonsControl *vehiclePanelButtons; + StarPilotButtonsControl *drivingPanelButtons; + StarPilotButtonsControl *navigationPanelButtons; + StarPilotButtonsControl *soundPanelButtons; + StarPilotButtonsControl *systemPanelButtons; + StarPilotButtonsControl *themePanelButtons; + StarPilotButtonsControl *togglePreset; + StarPilotButtonsControl *vehiclePanelButtons; Params params; @@ -99,5 +99,5 @@ private: QStackedLayout *mainLayout; - ScrollView *frogpilotPanel; + ScrollView *starpilotPanel; }; diff --git a/frogpilot/ui/qt/offroad/theme_settings.cc b/starpilot/ui/qt/offroad/theme_settings.cc similarity index 89% rename from frogpilot/ui/qt/offroad/theme_settings.cc rename to starpilot/ui/qt/offroad/theme_settings.cc index 2e406a38..1a9fd93a 100644 --- a/frogpilot/ui/qt/offroad/theme_settings.cc +++ b/starpilot/ui/qt/offroad/theme_settings.cc @@ -1,4 +1,4 @@ -#include "frogpilot/ui/qt/offroad/theme_settings.h" +#include "starpilot/ui/qt/offroad/theme_settings.h" bool isUserCreatedTheme(const QString &themeName) { return themeName.endsWith("-user_created"); @@ -207,26 +207,26 @@ QString storeThemeName(const QString &input, const std::string ¶mKey, Params return getThemeName(paramKey, params); } -FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotThemesPanel::StarPilotThemesPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *themesLayout = new QStackedLayout(); addItem(themesLayout); - FrogPilotListWidget *themesList = new FrogPilotListWidget(this); + StarPilotListWidget *themesList = new StarPilotListWidget(this); ScrollView *themesPanel = new ScrollView(themesList, this); themesLayout->addWidget(themesPanel); - FrogPilotListWidget *customThemesList = new FrogPilotListWidget(this); + StarPilotListWidget *customThemesList = new StarPilotListWidget(this); ScrollView *customThemesPanel = new ScrollView(customThemesList, this); themesLayout->addWidget(customThemesPanel); const std::vector> themeToggles { - {"CustomThemes", tr("Custom Themes"), tr("The overall look and feel of openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), "../../frogpilot/assets/toggle_icons/icon_frog.png"}, + {"CustomThemes", tr("Custom Themes"), tr("The overall look and feel of openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), "../../starpilot/assets/toggle_icons/icon_frog.png"}, {"BootLogo", tr("Boot Logo"), tr("The boot logo shown while the device starts."), ""}, {"ColorScheme", tr("Color Scheme"), tr("The color scheme used throughout openpilot. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), ""}, {"DistanceIconPack", tr("Distance Button"), tr("The distance button icons shown on the driving screen. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), ""}, @@ -236,25 +236,25 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool {"WheelIcon", tr("Steering Wheel"), tr("The steering-wheel icon shown at the top-right of the driving screen. Use the \"Theme Maker\" in \"The Pond\" to create and share your own themes!"), ""}, {"DownloadStatusLabel", tr("Download Status"), "", ""}, - {"HolidayThemes", tr("Holiday Themes"), tr("Themes based on U.S. holidays. Minor holidays last one day; major holidays (Christmas, Easter, Halloween) run for a full week."), "../../frogpilot/assets/toggle_icons/icon_calendar.png"}, - {"RainbowPath", tr("Rainbow Path"), tr("Color the driving path like a Mario Kart–style \"Rainbow Road\"."), "../../frogpilot/assets/toggle_icons/icon_rainbow.png"}, - {"RandomEvents", tr("Random Events"), tr("Occasional on-screen effects triggered by driving conditions. These are purely a visual and don't impact how openpilot drives!"), "../../frogpilot/assets/toggle_icons/icon_random.png"}, - {"RandomThemes", tr("Random Themes"), tr("Pick a random theme between each drive from the themes you have downloaded. Great for variety without changing settings while driving."), "../../frogpilot/assets/toggle_icons/icon_random_themes.png"}, - {"StartupAlert", tr("Startup Alert"), tr("Customize the \"Startup Alert\" message shown at the start of each drive."), "../../frogpilot/assets/toggle_icons/icon_message.png"} + {"HolidayThemes", tr("Holiday Themes"), tr("Themes based on U.S. holidays. Minor holidays last one day; major holidays (Christmas, Easter, Halloween) run for a full week."), "../../starpilot/assets/toggle_icons/icon_calendar.png"}, + {"RainbowPath", tr("Rainbow Path"), tr("Color the driving path like a Mario Kart–style \"Rainbow Road\"."), "../../starpilot/assets/toggle_icons/icon_rainbow.png"}, + {"RandomEvents", tr("Random Events"), tr("Occasional on-screen effects triggered by driving conditions. These are purely a visual and don't impact how openpilot drives!"), "../../starpilot/assets/toggle_icons/icon_random.png"}, + {"RandomThemes", tr("Random Themes"), tr("Pick a random theme between each drive from the themes you have downloaded. Great for variety without changing settings while driving."), "../../starpilot/assets/toggle_icons/icon_random_themes.png"}, + {"StartupAlert", tr("Startup Alert"), tr("Customize the \"Startup Alert\" message shown at the start of each drive."), "../../starpilot/assets/toggle_icons/icon_message.png"} }; for (const auto &[param, title, desc, icon] : themeToggles) { AbstractControl *themeToggle; if (param == "CustomThemes") { - FrogPilotManageControl *personalizeOpenpilotToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(personalizeOpenpilotToggle, &FrogPilotManageControl::manageButtonClicked, [customThemesPanel, themesLayout]() { + StarPilotManageControl *personalizeOpenpilotToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(personalizeOpenpilotToggle, &StarPilotManageControl::manageButtonClicked, [customThemesPanel, themesLayout]() { themesLayout->setCurrentWidget(customThemesPanel); }); themeToggle = personalizeOpenpilotToggle; } else if (param == "BootLogo") { - manageBootLogosButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageBootLogosButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageBootLogosButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageBootLogosButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { // Show all downloaded boot logos, including the currently selected one. QStringList bootLogos = getThemeList(true, QDir(bootLogosDirectory.path()), "", "BootLogo", params); @@ -304,8 +304,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool manageBootLogosButton->setValue(getThemeName(param.toStdString(), params)); themeToggle = manageBootLogosButton; } else if (param == "ColorScheme") { - manageColorSchemeButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageColorSchemeButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageColorSchemeButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageColorSchemeButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList colorSchemes = getThemeList(randomThemes, QDir(themePacksDirectory.path()), "colors", "ColorScheme", params); if (id == 0) { @@ -356,8 +356,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool manageColorSchemeButton->setValue(getThemeName(param.toStdString(), params)); themeToggle = manageColorSchemeButton; } else if (param == "DistanceIconPack") { - manageDistanceIconPackButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageDistanceIconPackButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageDistanceIconPackButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageDistanceIconPackButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList distanceIconPacks = getThemeList(randomThemes, QDir(themePacksDirectory.path()), "distance_icons", "DistanceIconPack", params); if (id == 0) { @@ -408,8 +408,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool manageDistanceIconPackButton->setValue(getThemeName(param.toStdString(), params)); themeToggle = manageDistanceIconPackButton; } else if (param == "IconPack") { - manageIconPackButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageIconPackButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageIconPackButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageIconPackButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList iconPacks = getThemeList(randomThemes, QDir(themePacksDirectory.path()), "icons", "IconPack", params); if (id == 0) { @@ -460,8 +460,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool manageIconPackButton->setValue(getThemeName(param.toStdString(), params)); themeToggle = manageIconPackButton; } else if (param == "SignalAnimation") { - manageSignalAnimationButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageSignalAnimationButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageSignalAnimationButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageSignalAnimationButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList signalAnimations = getThemeList(randomThemes, QDir(themePacksDirectory.path()), "signals", "SignalAnimation", params); if (id == 0) { @@ -512,8 +512,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool manageSignalAnimationButton->setValue(getThemeName(param.toStdString(), params)); themeToggle = manageSignalAnimationButton; } else if (param == "SoundPack") { - manageSoundPackButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageSoundPackButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageSoundPackButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageSoundPackButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList soundPacks = getThemeList(randomThemes, QDir(themePacksDirectory.path()), "sounds", "SoundPack", params); if (id == 0) { @@ -564,8 +564,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool manageSoundPackButton->setValue(getThemeName(param.toStdString(), params)); themeToggle = manageSoundPackButton; } else if (param == "WheelIcon") { - manageWheelIconsButton = new FrogPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); - QObject::connect(manageWheelIconsButton, &FrogPilotButtonsControl::buttonClicked, [this](int id) { + manageWheelIconsButton = new StarPilotButtonsControl(title, desc, icon, {tr("DELETE"), tr("DOWNLOAD"), tr("SELECT")}); + QObject::connect(manageWheelIconsButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { QStringList wheelIcons = getThemeList(randomThemes, QDir(wheelsDirectory.path()), "", "WheelIcon", params); if (id == 0) { @@ -623,10 +623,10 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool } else if (param == "RandomThemes") { std::vector randomThemesToggles{"RandomThemesHolidays"}; std::vector randomThemesToggleNames{tr("Include Holiday Themes")}; - themeToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, randomThemesToggles, randomThemesToggleNames); + themeToggle = new StarPilotButtonToggleControl(param, title, desc, icon, randomThemesToggles, randomThemesToggleNames); } else if (param == "StartupAlert") { - FrogPilotButtonsControl *startupAlertButton = new FrogPilotButtonsControl(title, desc, icon, {tr("STOCK"), tr("FROGPILOT"), tr("CUSTOM"), tr("CLEAR")}, true); + StarPilotButtonsControl *startupAlertButton = new StarPilotButtonsControl(title, desc, icon, {tr("STOCK"), tr("STARPILOT"), tr("CUSTOM"), tr("CLEAR")}, true); QString currentTop = QString::fromStdString(params.get("StartupMessageTop")); QString currentBottom = QString::fromStdString(params.get("StartupMessageBottom")); @@ -634,18 +634,18 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool QString stockTop = "Be ready to take over at any time"; QString stockBottom = "Always keep hands on wheel and eyes on road"; - QString frogpilotTop = "Hop in and buckle up!"; - QString frogpilotBottom = "Human-tested, frog-approved 🐸"; + QString starpilotTop = "Hop in and buckle up!"; + QString starpilotBottom = "Human-tested, frog-approved 🐸"; if (currentTop == stockTop && currentBottom == stockBottom) { startupAlertButton->setCheckedButton(0); - } else if (currentTop == frogpilotTop && currentBottom == frogpilotBottom) { + } else if (currentTop == starpilotTop && currentBottom == starpilotBottom) { startupAlertButton->setCheckedButton(1); } else if (!currentTop.isEmpty() || !currentBottom.isEmpty()) { startupAlertButton->setCheckedButton(2); } - QObject::connect(startupAlertButton, &FrogPilotButtonsControl::buttonClicked, [=](int id) { + QObject::connect(startupAlertButton, &StarPilotButtonsControl::buttonClicked, [=](int id) { int maxLengthTop = 35; int maxLengthBottom = 45; @@ -653,8 +653,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool params.put("StartupMessageTop", stockTop.toStdString()); params.put("StartupMessageBottom", stockBottom.toStdString()); } else if (id == 1) { - params.put("StartupMessageTop", frogpilotTop.toStdString()); - params.put("StartupMessageBottom", frogpilotBottom.toStdString()); + params.put("StartupMessageTop", starpilotTop.toStdString()); + params.put("StartupMessageBottom", starpilotBottom.toStdString()); } else if (id == 2) { QString currentTop = QString::fromStdString(params.get("StartupMessageTop")); QString newTop = InputDialog::getText(tr("Enter the text for the top half"), this, tr("Characters: 0/%1").arg(maxLengthTop), false, 1, currentTop, maxLengthTop).trimmed(); @@ -668,7 +668,7 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool } } } else if (id == 3) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your startup message?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely reset your startup message?"), this)) { params.remove("StartupMessageTop"); params.remove("StartupMessageBottom"); @@ -694,8 +694,8 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool } } - if (FrogPilotManageControl *frogPilotManageToggle = qobject_cast(themeToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + if (StarPilotManageControl *frogPilotManageToggle = qobject_cast(themeToggle)) { + QObject::connect(frogPilotManageToggle, &StarPilotManageControl::manageButtonClicked, [this]() { emit openSubPanel(); openDescriptions(forceOpenDescriptions, toggles); }); @@ -711,7 +711,7 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool openDescriptions(forceOpenDescriptions, toggles); - QObject::connect(static_cast(toggles["CustomThemes"]), &ToggleControl::toggleFlipped, this, &FrogPilotThemesPanel::updateToggles); + QObject::connect(static_cast(toggles["CustomThemes"]), &ToggleControl::toggleFlipped, this, &StarPilotThemesPanel::updateToggles); QObject::connect(static_cast(toggles["RandomThemes"]), &ToggleControl::toggleFlipped, [this](bool state) { if (state) { ConfirmationDialog::alert(tr("\"Random Themes\" only works with downloaded themes, so make sure you download the themes you want it to use!"), this); @@ -756,14 +756,14 @@ FrogPilotThemesPanel::FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool randomThemes = state; }); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [themesLayout, themesPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [themesLayout, themesPanel, this] { openDescriptions(forceOpenDescriptions, toggles); themesLayout->setCurrentWidget(themesPanel); }); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotThemesPanel::updateState); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotThemesPanel::updateState); } -void FrogPilotThemesPanel::showEvent(QShowEvent *event) { +void StarPilotThemesPanel::showEvent(QShowEvent *event) { bootLogosDownloaded = params.get("DownloadableBootLogos").empty(); colorsDownloaded = params.get("DownloadableColors").empty(); distanceIconsDownloaded = params.get("DownloadableDistanceIcons").empty(); @@ -797,12 +797,12 @@ void FrogPilotThemesPanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotThemesPanel::updateState(const UIState &s, const FrogPilotUIState &fs) { +void StarPilotThemesPanel::updateState(const UIState &s, const StarPilotUIState &fs) { if (!isVisible() || finalizingDownload) { return; } - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; if (themeDownloading) { QString progress = QString::fromStdString(params_memory.get("ThemeDownloadProgress")); @@ -858,47 +858,47 @@ void FrogPilotThemesPanel::updateState(const UIState &s, const FrogPilotUIState } } - bool parked = !s.scene.started || frogpilot_scene.parked || parent->isFrogsGoMoo; + bool parked = !s.scene.started || starpilot_scene.parked || parent->isFrogsGoMoo; manageBootLogosButton->setText(1, bootLogoDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageBootLogosButton->setEnabledButtons(0, !themeDownloading); - manageBootLogosButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || bootLogoDownloading) && !cancellingDownload && !finalizingDownload && !bootLogosDownloaded && parked); + manageBootLogosButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || bootLogoDownloading) && !cancellingDownload && !finalizingDownload && !bootLogosDownloaded && parked); manageBootLogosButton->setEnabledButtons(2, !themeDownloading); manageColorSchemeButton->setText(1, colorDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageColorSchemeButton->setEnabledButtons(0, !themeDownloading); - manageColorSchemeButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || colorDownloading) && !cancellingDownload && !finalizingDownload && !colorsDownloaded && parked); + manageColorSchemeButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || colorDownloading) && !cancellingDownload && !finalizingDownload && !colorsDownloaded && parked); manageColorSchemeButton->setEnabledButtons(2, !themeDownloading); manageDistanceIconPackButton->setText(1, distanceIconDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageDistanceIconPackButton->setEnabledButtons(0, !themeDownloading); - manageDistanceIconPackButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || distanceIconDownloading) && !cancellingDownload && !finalizingDownload && !distanceIconsDownloaded && parked); + manageDistanceIconPackButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || distanceIconDownloading) && !cancellingDownload && !finalizingDownload && !distanceIconsDownloaded && parked); manageDistanceIconPackButton->setEnabledButtons(2, !themeDownloading); manageIconPackButton->setText(1, iconDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageIconPackButton->setEnabledButtons(0, !themeDownloading); - manageIconPackButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || iconDownloading) && !cancellingDownload && !finalizingDownload && !iconsDownloaded && parked); + manageIconPackButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || iconDownloading) && !cancellingDownload && !finalizingDownload && !iconsDownloaded && parked); manageIconPackButton->setEnabledButtons(2, !themeDownloading); manageSignalAnimationButton->setText(1, signalDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageSignalAnimationButton->setEnabledButtons(0, !themeDownloading); - manageSignalAnimationButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || signalDownloading) && !cancellingDownload && !finalizingDownload && !signalsDownloaded && parked); + manageSignalAnimationButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || signalDownloading) && !cancellingDownload && !finalizingDownload && !signalsDownloaded && parked); manageSignalAnimationButton->setEnabledButtons(2, !themeDownloading); manageSoundPackButton->setText(1, soundDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageSoundPackButton->setEnabledButtons(0, !themeDownloading); - manageSoundPackButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || soundDownloading) && !cancellingDownload && !finalizingDownload && !soundsDownloaded && parked); + manageSoundPackButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || soundDownloading) && !cancellingDownload && !finalizingDownload && !soundsDownloaded && parked); manageSoundPackButton->setEnabledButtons(2, !themeDownloading); manageWheelIconsButton->setText(1, wheelDownloading ? tr("CANCEL") : tr("DOWNLOAD")); manageWheelIconsButton->setEnabledButtons(0, !themeDownloading); - manageWheelIconsButton->setEnabledButtons(1, frogpilot_scene.online && (!themeDownloading || wheelDownloading) && !cancellingDownload && !finalizingDownload && !wheelsDownloaded && parked); + manageWheelIconsButton->setEnabledButtons(1, starpilot_scene.online && (!themeDownloading || wheelDownloading) && !cancellingDownload && !finalizingDownload && !wheelsDownloaded && parked); manageWheelIconsButton->setEnabledButtons(2, !themeDownloading); parent->keepScreenOn = themeDownloading; } -void FrogPilotThemesPanel::updateToggles() { +void StarPilotThemesPanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -910,7 +910,7 @@ void FrogPilotThemesPanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "DistanceIconPack") { setVisible &= params.getBool("QOLVisuals") && params.getBool("OnroadDistanceButton"); diff --git a/frogpilot/ui/qt/offroad/theme_settings.h b/starpilot/ui/qt/offroad/theme_settings.h similarity index 71% rename from frogpilot/ui/qt/offroad/theme_settings.h rename to starpilot/ui/qt/offroad/theme_settings.h index a1a01df4..966a56b9 100644 --- a/frogpilot/ui/qt/offroad/theme_settings.h +++ b/starpilot/ui/qt/offroad/theme_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotThemesPanel : public FrogPilotListWidget { +class StarPilotThemesPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotThemesPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotThemesPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); protected: void showEvent(QShowEvent *event) override; @@ -15,7 +15,7 @@ signals: void openSubPanel(); private: - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); void updateToggles(); bool bootLogoDownloading = false; @@ -44,15 +44,15 @@ private: QSet parentKeys; - FrogPilotButtonsControl *manageBootLogosButton; - FrogPilotButtonsControl *manageColorSchemeButton; - FrogPilotButtonsControl *manageDistanceIconPackButton; - FrogPilotButtonsControl *manageIconPackButton; - FrogPilotButtonsControl *manageSignalAnimationButton; - FrogPilotButtonsControl *manageSoundPackButton; - FrogPilotButtonsControl *manageWheelIconsButton; + StarPilotButtonsControl *manageBootLogosButton; + StarPilotButtonsControl *manageColorSchemeButton; + StarPilotButtonsControl *manageDistanceIconPackButton; + StarPilotButtonsControl *manageIconPackButton; + StarPilotButtonsControl *manageSignalAnimationButton; + StarPilotButtonsControl *manageSoundPackButton; + StarPilotButtonsControl *manageWheelIconsButton; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; LabelControl *downloadStatusLabel; diff --git a/starpilot/ui/qt/offroad/utilities.cc b/starpilot/ui/qt/offroad/utilities.cc new file mode 100644 index 00000000..e40e3557 --- /dev/null +++ b/starpilot/ui/qt/offroad/utilities.cc @@ -0,0 +1,192 @@ +#include "starpilot/ui/qt/offroad/utilities.h" + +StarPilotUtilitiesPanel::StarPilotUtilitiesPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { + forceOpenDescriptions = forceOpen; + + ParamControl *debugModeToggle = new ParamControl("DebugMode", tr("Debug Mode"), tr("Use all of StarPilot's developer metrics on your next drive to diagnose issues and improve bug reports."), ""); + if (forceOpenDescriptions) { + debugModeToggle->showDescription(); + } + addItem(debugModeToggle); + + ButtonControl *flashPandaButton = new ButtonControl(tr("Flash Panda"), tr("FLASH"), tr("Flash the latest, official firmware onto your Panda device to restore core functionality, fix bugs, or ensure you have the most up-to-date software.")); + QObject::connect(flashPandaButton, &ButtonControl::clicked, [parent, flashPandaButton, this]() { + if (ConfirmationDialog::confirm(tr("Are you sure you want to flash the Panda firmware?"), tr("Flash"), this)) { + std::thread([parent, flashPandaButton, this]() { + parent->keepScreenOn = true; + + flashPandaButton->setEnabled(false); + flashPandaButton->setValue(tr("Flashing...")); + + params_memory.putBool("FlashPanda", true); + while (params_memory.getBool("FlashPanda")) { + util::sleep_for(UI_FREQ); + } + + flashPandaButton->setValue(tr("Flashed!")); + + util::sleep_for(2500); + + flashPandaButton->setValue(tr("Rebooting...")); + + util::sleep_for(2500); + + Hardware::reboot(); + }).detach(); + } + }); + if (forceOpenDescriptions) { + flashPandaButton->showDescription(); + } + addItem(flashPandaButton); + + StarPilotButtonsControl *forceStartedButton = new StarPilotButtonsControl(tr("Force Drive State"), tr("Force openpilot to be offroad or onroad."), "", {tr("OFFROAD"), tr("ONROAD"), tr("OFF")}, true); + QObject::connect(forceStartedButton, &StarPilotButtonsControl::buttonClicked, [this](int id) { + if (id == 0) { + params.putBool("ForceOffroad", true); + params.putBool("ForceOnroad", false); + + updateStarPilotToggles(); + } else if (id == 1) { + params.put("CarParams", params.get("CarParamsPersistent")); + params.put("StarPilotCarParams", params.get("StarPilotCarParamsPersistent")); + + params.putBool("ForceOffroad", false); + params.putBool("ForceOnroad", true); + + updateStarPilotToggles(); + } else if (id == 2) { + params.putBool("ForceOffroad", false); + params.putBool("ForceOnroad", false); + + updateStarPilotToggles(); + } + }); + forceStartedButton->setCheckedButton(2); + if (forceOpenDescriptions) { + forceStartedButton->showDescription(); + } + addItem(forceStartedButton); + + ButtonControl *reportIssueButton = new ButtonControl(tr("Report a Bug or an Issue"), tr("REPORT"), tr("Send a bug report so we can help fix the problem!")); + QObject::connect(reportIssueButton, &ButtonControl::clicked, [this]() { + if (!starpilotUIState()->starpilot_scene.online) { + ConfirmationDialog::alert(tr("Please connect to the internet before sending a report!"), this); + return; + } + + QStringList report_messages = { + tr("Acceleration feels harsh or jerky"), + tr("An alert was unclear and I'm not sure what it meant"), + tr("Braking is too sudden or uncomfortable"), + tr("I'm not sure if this is normal or a bug:"), + tr("My steering wheel buttons aren't working"), + tr("openpilot disengages when I don't expect it"), + tr("openpilot feels sluggish or slow to respond"), + tr("Something else (please describe)") + }; + + if (QFile::exists("/data/error_logs/error.txt")) { + report_messages.prepend(tr("I saw an alert that said \"openpilot crashed\"")); + } + + QString selected_issue = MultiOptionDialog::getSelection(tr("What's going on?"), report_messages, "", this); + if (selected_issue.isEmpty()) { + return; + } + + if (selected_issue.contains("crashed") || selected_issue.contains("not sure") || selected_issue.contains("Something else")) { + QString extra_input = InputDialog::getText(tr("Please describe what's happening"), this, tr("Send Report"), false, 10, "", 300).trimmed(); + if (extra_input.isEmpty()) { + return; + } + selected_issue += " — " + extra_input; + } + + QString discord_user = InputDialog::getText(tr("What's your Discord username?"), this, tr("Send Report"), false, -1, QString::fromStdString(params.get("DiscordUsername"))).trimmed(); + + QJsonObject reportData; + reportData["DiscordUser"] = discord_user; + reportData["Issue"] = selected_issue; + + params.putNonBlocking("DiscordUsername", discord_user.toStdString()); + params_memory.put("IssueReported", QJsonDocument(reportData).toJson(QJsonDocument::Compact).toStdString()); + + ConfirmationDialog::alert(tr("Report Sent! Thanks for letting us know!"), this); + }); + if (forceOpenDescriptions) { + reportIssueButton->showDescription(); + } + addItem(reportIssueButton); + reportIssueButton->setVisible(true); + + ButtonControl *resetTogglesButton = new ButtonControl(tr("Reset Toggles to Default"), tr("RESET"), tr("Reset all toggles to their default values.")); + QObject::connect(resetTogglesButton, &ButtonControl::clicked, [parent, resetTogglesButton, this]() { + if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all toggles to their default values?"), tr("Reset"), this)) { + std::thread([parent, resetTogglesButton, this]() { + parent->keepScreenOn = true; + + resetTogglesButton->setEnabled(false); + resetTogglesButton->setValue(tr("Resetting...")); + + std::vector all_keys = params.allKeys(); + for (const std::string &key : all_keys) { + if (excluded_keys.count(key)) { + continue; + } + std::optional default_value = params.getKeyDefaultValue(key); + if (default_value.has_value()) { + params.put(key, default_value.value()); + } + } + + updateStarPilotToggles(); + + resetTogglesButton->setValue(tr("Reset!")); + + util::sleep_for(2500); + + resetTogglesButton->setValue(""); + }).detach(); + } + }); + if (forceOpenDescriptions) { + resetTogglesButton->showDescription(); + } + addItem(resetTogglesButton); + + ButtonControl *resetTogglesButtonStock = new ButtonControl(tr("Reset Toggles to Stock openpilot"), tr("RESET"), tr("Reset all toggles to match stock openpilot.")); + QObject::connect(resetTogglesButtonStock, &ButtonControl::clicked, [parent, resetTogglesButtonStock, this]() { + if (ConfirmationDialog::confirm(tr("Are you sure you want to reset all toggles to match stock openpilot?"), tr("Reset"), this)) { + std::thread([parent, resetTogglesButtonStock, this]() { + parent->keepScreenOn = true; + + resetTogglesButtonStock->setEnabled(false); + resetTogglesButtonStock->setValue(tr("Resetting...")); + + std::vector all_keys = params.allKeys(); + for (const std::string &key : all_keys) { + if (excluded_keys.count(key)) { + continue; + } + std::optional stock_value = params.getStockValue(key); + if (stock_value.has_value()) { + params.put(key, stock_value.value()); + } + } + + updateStarPilotToggles(); + + resetTogglesButtonStock->setValue(tr("Reset!")); + + util::sleep_for(2500); + + resetTogglesButtonStock->setValue(""); + }).detach(); + } + }); + if (forceOpenDescriptions) { + resetTogglesButtonStock->showDescription(); + } + addItem(resetTogglesButtonStock); +} diff --git a/starpilot/ui/qt/offroad/utilities.h b/starpilot/ui/qt/offroad/utilities.h new file mode 100644 index 00000000..db87e068 --- /dev/null +++ b/starpilot/ui/qt/offroad/utilities.h @@ -0,0 +1,25 @@ +#pragma once + +#include "starpilot/ui/qt/offroad/starpilot_settings.h" + +class StarPilotUtilitiesPanel : public StarPilotListWidget { + Q_OBJECT + +public: + explicit StarPilotUtilitiesPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); + +private: + bool forceOpenDescriptions; + + StarPilotSettingsWindow *parent; + + Params params; + Params params_memory{"", true}; + + std::set excluded_keys = { + "AvailableModels", "AvailableModelNames", "StarPilotStats", + "GithubSshKeys", "GithubUsername", "MapBoxRequests", + "ModelDrivesAndScores", "OverpassRequests", "SpeedLimits", + "SpeedLimitsFiltered", "UpdaterAvailableBranches", + }; +}; diff --git a/frogpilot/ui/qt/offroad/vehicle_settings.cc b/starpilot/ui/qt/offroad/vehicle_settings.cc similarity index 89% rename from frogpilot/ui/qt/offroad/vehicle_settings.cc rename to starpilot/ui/qt/offroad/vehicle_settings.cc index 78c25594..b4ba72bb 100644 --- a/frogpilot/ui/qt/offroad/vehicle_settings.cc +++ b/starpilot/ui/qt/offroad/vehicle_settings.cc @@ -1,6 +1,6 @@ #include -#include "frogpilot/ui/qt/offroad/vehicle_settings.h" +#include "starpilot/ui/qt/offroad/vehicle_settings.h" #include "system/hardware/hw.h" QStringList getCarNames(const QString &carMake, QMap &carModels) { @@ -91,13 +91,13 @@ QStringList getCarNames(const QString &carMake, QMap &carModel return carNames; } -FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotVehiclesPanel::StarPilotVehiclesPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *vehiclesLayout = new QStackedLayout(); addItem(vehiclesLayout); - FrogPilotListWidget *settingsList = new FrogPilotListWidget(this); + StarPilotListWidget *settingsList = new StarPilotListWidget(this); ScrollView *vehiclesPanel = new ScrollView(settingsList, this); @@ -137,9 +137,9 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, disableOpenpilotLong = new ParamControl("DisableOpenpilotLongitudinal", tr("Disable openpilot Longitudinal Control"), tr("Disable openpilot longitudinal and use the car's stock ACC instead."), ""); QObject::connect(disableOpenpilotLong, &ToggleControl::toggleFlipped, [parent, this](bool state) { if (state) { - if (FrogPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely disable openpilot longitudinal control?"), this)) { + if (StarPilotConfirmationDialog::yesorno(tr("Are you sure you want to completely disable openpilot longitudinal control?"), this)) { if (started) { - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } } @@ -154,11 +154,11 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, }); settingsList->addItem(disableOpenpilotLong); - FrogPilotListWidget *gmList = new FrogPilotListWidget(this); - FrogPilotListWidget *hkgList = new FrogPilotListWidget(this); - FrogPilotListWidget *subaruList = new FrogPilotListWidget(this); - FrogPilotListWidget *toyotaList = new FrogPilotListWidget(this); - FrogPilotListWidget *vehicleInfoList = new FrogPilotListWidget(this); + StarPilotListWidget *gmList = new StarPilotListWidget(this); + StarPilotListWidget *hkgList = new StarPilotListWidget(this); + StarPilotListWidget *subaruList = new StarPilotListWidget(this); + StarPilotListWidget *toyotaList = new StarPilotListWidget(this); + StarPilotListWidget *vehicleInfoList = new StarPilotListWidget(this); ScrollView *gmPanel = new ScrollView(gmList, this); ScrollView *hkgPanel = new ScrollView(hkgList, this); @@ -173,20 +173,20 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, vehiclesLayout->addWidget(vehicleInfoPanel); std::vector> vehicleToggles { - {"GMToggles", tr("General Motors Settings"), tr("FrogPilot features for General Motors vehicles."), ""}, + {"GMToggles", tr("General Motors Settings"), tr("StarPilot features for General Motors vehicles."), ""}, {"GMPedalLongitudinal", tr("Use Pedal For Longitudinal"), tr("Use the pedal interceptor for full longitudinal control on supported GM vehicles."), ""}, {"LongPitch", tr("Smooth Pedal Response on Hills"), tr("Smoothen acceleration and braking when driving downhill/uphill."), ""}, {"RemoteStartBootsComma", tr("Remote Start Boots comma"), tr("Use the remote-start GM panda firmware at boot.

Required for GM remote-start startup signal behavior."), ""}, {"RemapCancelToDistance", tr("Remap Cancel To Distance"), tr("On pedal-interceptor Bolts, remap the steering-wheel CANCEL button to distance/personality input."), ""}, {"VoltSNG", tr("Stop-and-Go Hack"), tr("Force stop-and-go on the 2017 Chevy Volt."), ""}, - {"HKGToggles", tr("Hyundai/Kia/Genesis Settings"), tr("FrogPilot features for Genesis, Hyundai, and Kia vehicles."), ""}, + {"HKGToggles", tr("Hyundai/Kia/Genesis Settings"), tr("StarPilot features for Genesis, Hyundai, and Kia vehicles."), ""}, {"TacoTuneHacks", tr("\"Taco Bell Run\" Torque Hack"), tr("The steering torque hack from comma's 2022 \"Taco Bell Run\". Designed to increase steering torque at low speeds for left and right turns."), ""}, - {"SubaruToggles", tr("Subaru Settings"), tr("FrogPilot features for Subaru vehicles."), ""}, + {"SubaruToggles", tr("Subaru Settings"), tr("StarPilot features for Subaru vehicles."), ""}, {"SubaruSNG", tr("Stop and Go"), tr("Stop and go for supported Subaru vehicles."), ""}, - {"ToyotaToggles", tr("Toyota/Lexus Settings"), tr("FrogPilot features for Lexus and Toyota vehicles."), ""}, + {"ToyotaToggles", tr("Toyota/Lexus Settings"), tr("StarPilot features for Lexus and Toyota vehicles."), ""}, {"ToyotaDoors", tr("Automatically Lock/Unlock Doors"), tr("Automatically lock/unlock doors when shifting in and out of drive."), ""}, {"ClusterOffset", tr("Dashboard Speed Offset"), tr("The speed offset openpilot uses to match the speed on the dashboard display."), ""}, {"FrogsGoMoosTweak", tr("FrogsGoMoo's Personal Tweaks"), tr("Personal tweaks by FrogsGoMoo for quicker acceleration and smoother braking."), ""}, @@ -240,17 +240,17 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, } else if (param == "ToyotaDoors") { std::vector lockToggles{"LockDoors", "UnlockDoors"}; std::vector lockToggleNames{tr("Lock"), tr("Unlock")}; - vehicleToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, lockToggles, lockToggleNames); + vehicleToggle = new StarPilotButtonToggleControl(param, title, desc, icon, lockToggles, lockToggleNames); } else if (param == "LockDoorsTimer") { std::map autoLockLabels; for (int i = 0; i <= 300; ++i) { autoLockLabels[i] = i == 0 ? tr("Never") : QString::number(i) + tr(" seconds"); } - vehicleToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 300, QString(), autoLockLabels, 5); + vehicleToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 300, QString(), autoLockLabels, 5); } else if (param == "ClusterOffset") { std::vector clusterOffsetButton{"Reset"}; - FrogPilotParamValueButtonControl *clusterOffsetToggle = new FrogPilotParamValueButtonControl(param, title, desc, icon, 1.000, 1.050, "x", std::map(), 0.001, false, {}, clusterOffsetButton, false, false); - QObject::connect(clusterOffsetToggle, &FrogPilotParamValueButtonControl::buttonClicked, [clusterOffsetToggle, this]() { + StarPilotParamValueButtonControl *clusterOffsetToggle = new StarPilotParamValueButtonControl(param, title, desc, icon, 1.000, 1.050, "x", std::map(), 0.001, false, {}, clusterOffsetButton, false, false); + QObject::connect(clusterOffsetToggle, &StarPilotParamValueButtonControl::buttonClicked, [clusterOffsetToggle, this]() { params.putFloat("ClusterOffset", std::stof(params.getKeyDefaultValue("ClusterOffset").value())); clusterOffsetToggle->refresh(); }); @@ -289,7 +289,7 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, } if (ButtonControl *buttonControl = qobject_cast(vehicleToggle)) { - QObject::connect(buttonControl, &ButtonControl::clicked, this, &FrogPilotVehiclesPanel::openSubPanel); + QObject::connect(buttonControl, &ButtonControl::clicked, this, &StarPilotVehiclesPanel::openSubPanel); } QObject::connect(vehicleToggle, &AbstractControl::hideDescriptionEvent, [this]() { @@ -300,18 +300,18 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, }); } - static_cast(toggles["LockDoorsTimer"])->setWarning("Warning: openpilot can't detect if keys are still inside the car, so ensure you have a spare key to prevent accidental lockouts!"); + static_cast(toggles["LockDoorsTimer"])->setWarning("Warning: openpilot can't detect if keys are still inside the car, so ensure you have a spare key to prevent accidental lockouts!"); QSet rebootKeys = {"RemapCancelToDistance", "TacoTuneHacks"}; for (const QString &key : rebootKeys) { QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, [key, this](bool state) { if (started) { if (key == "TacoTuneHacks" && state) { - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } } else if (key != "TacoTuneHacks") { - if (FrogPilotConfirmationDialog::toggleReboot(this)) { + if (StarPilotConfirmationDialog::toggleReboot(this)) { Hardware::reboot(); } } @@ -322,7 +322,7 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, ParamControl *remoteStartToggle = static_cast(toggles["RemoteStartBootsComma"]); QObject::connect(remoteStartToggle, &ToggleControl::toggleFlipped, [parent, remoteStartToggle, this](bool state) { const QString prompt = tr("Remote Start requires a Panda firmware update. Flash the Panda now?"); - if (!FrogPilotConfirmationDialog::yesorno(prompt, this)) { + if (!StarPilotConfirmationDialog::yesorno(prompt, this)) { params.putBool("RemoteStartBootsComma", !state); remoteStartToggle->refresh(); return; @@ -347,7 +347,7 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, }).detach(); }); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [vehiclesLayout, vehiclesPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [vehiclesLayout, vehiclesPanel, this] { if (forceOpenDescriptions) { openDescriptions(forceOpenDescriptions, toggles); disableOpenpilotLong->showDescription(); @@ -355,10 +355,10 @@ FrogPilotVehiclesPanel::FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, } vehiclesLayout->setCurrentWidget(vehiclesPanel); }); - QObject::connect(uiState(), &UIState::uiUpdate, this, &FrogPilotVehiclesPanel::updateState); + QObject::connect(uiState(), &UIState::uiUpdate, this, &StarPilotVehiclesPanel::updateState); } -void FrogPilotVehiclesPanel::showEvent(QShowEvent *event) { +void StarPilotVehiclesPanel::showEvent(QShowEvent *event) { if (forceOpenDescriptions) { disableOpenpilotLong->showDescription(); forceFingerprint->showDescription(); @@ -380,7 +380,7 @@ void FrogPilotVehiclesPanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotVehiclesPanel::updateState(const UIState &s) { +void StarPilotVehiclesPanel::updateState(const UIState &s) { if (!isVisible()) { return; } @@ -388,7 +388,7 @@ void FrogPilotVehiclesPanel::updateState(const UIState &s) { started = s.scene.started; } -void FrogPilotVehiclesPanel::updateToggles() { +void StarPilotVehiclesPanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -400,7 +400,7 @@ void FrogPilotVehiclesPanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (gmKeys.contains(key)) { setVisible &= parent->isGM; @@ -459,8 +459,8 @@ void FrogPilotVehiclesPanel::updateToggles() { } } - disableOpenpilotLong->setVisible((parent->hasOpenpilotLongitudinal || parent->openpilotLongitudinalControlDisabled) && !parent->hasAlphaLongitudinal && parent->tuningLevel >= parent->frogpilotToggleLevels["DisableOpenpilotLongitudinal"].toBool()); - forceFingerprint->setVisible(parent->tuningLevel >= parent->frogpilotToggleLevels["ForceFingerprint"].toBool()); + disableOpenpilotLong->setVisible((parent->hasOpenpilotLongitudinal || parent->openpilotLongitudinalControlDisabled) && !parent->hasAlphaLongitudinal && parent->tuningLevel >= parent->starpilotToggleLevels["DisableOpenpilotLongitudinal"].toBool()); + forceFingerprint->setVisible(parent->tuningLevel >= parent->starpilotToggleLevels["ForceFingerprint"].toBool()); openDescriptions(forceOpenDescriptions, toggles); diff --git a/frogpilot/ui/qt/offroad/vehicle_settings.h b/starpilot/ui/qt/offroad/vehicle_settings.h similarity index 83% rename from frogpilot/ui/qt/offroad/vehicle_settings.h rename to starpilot/ui/qt/offroad/vehicle_settings.h index 2f584ef9..78bd0c49 100644 --- a/frogpilot/ui/qt/offroad/vehicle_settings.h +++ b/starpilot/ui/qt/offroad/vehicle_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotVehiclesPanel : public FrogPilotListWidget { +class StarPilotVehiclesPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotVehiclesPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotVehiclesPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -32,7 +32,7 @@ private: QSet parentKeys; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; ParamControl *disableOpenpilotLong; ParamControl *forceFingerprint; diff --git a/frogpilot/ui/qt/offroad/visual_settings.cc b/starpilot/ui/qt/offroad/visual_settings.cc similarity index 83% rename from frogpilot/ui/qt/offroad/visual_settings.cc rename to starpilot/ui/qt/offroad/visual_settings.cc index 9b4905ff..a9735084 100644 --- a/frogpilot/ui/qt/offroad/visual_settings.cc +++ b/starpilot/ui/qt/offroad/visual_settings.cc @@ -1,22 +1,22 @@ -#include "frogpilot/ui/qt/offroad/visual_settings.h" +#include "starpilot/ui/qt/offroad/visual_settings.h" -FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotVisualsPanel::StarPilotVisualsPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; QStackedLayout *visualsLayout = new QStackedLayout(); addItem(visualsLayout); - FrogPilotListWidget *visualsList = new FrogPilotListWidget(this); + StarPilotListWidget *visualsList = new StarPilotListWidget(this); ScrollView *visualsPanel = new ScrollView(visualsList, this); visualsLayout->addWidget(visualsPanel); - FrogPilotListWidget *advancedCustomList = new FrogPilotListWidget(this); - FrogPilotListWidget *customUIList = new FrogPilotListWidget(this); - FrogPilotListWidget *modelUIList = new FrogPilotListWidget(this); - FrogPilotListWidget *navigationUIList = new FrogPilotListWidget(this); - FrogPilotListWidget *qualityOfLifeList = new FrogPilotListWidget(this); + StarPilotListWidget *advancedCustomList = new StarPilotListWidget(this); + StarPilotListWidget *customUIList = new StarPilotListWidget(this); + StarPilotListWidget *modelUIList = new StarPilotListWidget(this); + StarPilotListWidget *navigationUIList = new StarPilotListWidget(this); + StarPilotListWidget *qualityOfLifeList = new StarPilotListWidget(this); ScrollView *advancedCustomPanel = new ScrollView(advancedCustomList, this); ScrollView *customUIPanel = new ScrollView(customUIList, this); @@ -31,7 +31,7 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo visualsLayout->addWidget(qualityOfLifePanel); const std::vector> visualToggles { - {"AdvancedCustomUI", tr("Advanced UI Controls"), tr("Advanced visual changes to fine-tune how the driving screen looks."), "../../frogpilot/assets/toggle_icons/icon_advanced_device.png"}, + {"AdvancedCustomUI", tr("Advanced UI Controls"), tr("Advanced visual changes to fine-tune how the driving screen looks."), "../../starpilot/assets/toggle_icons/icon_advanced_device.png"}, {"HideSpeed", tr("Hide Current Speed"), tr("Hide the current speed from the driving screen."), ""}, {"HideLeadMarker", tr("Hide Lead Marker"), tr("Hide the lead-vehicle marker from the driving screen."), ""}, {"HideMaxSpeed", tr("Hide Max Speed"), tr("Hide the max speed from the driving screen."), ""}, @@ -39,7 +39,7 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo {"HideSpeedLimit", tr("Hide Speed Limits"), tr("Hide posted speed limits from the driving screen."), ""}, {"WheelSpeed", tr("Use Wheel Speed"), tr("Use the vehicle's wheel speed instead of the cluster speed. This is purely a visual change and doesn't impact how openpilot drives!"), ""}, - {"CustomUI", tr("Driving Screen Widgets"), tr("Custom FrogPilot widgets for the driving screen."), "../assets/icons/calibration.png"}, + {"CustomUI", tr("Driving Screen Widgets"), tr("Custom StarPilot widgets for the driving screen."), "../assets/icons/calibration.png"}, {"AccelerationPath", tr("Acceleration Path"), tr("Color the driving path by planned acceleration and braking."), ""}, {"AdjacentPath", tr("Adjacent Lanes"), tr("Show the driving paths for the left and right lanes."), ""}, {"BlindSpotPath", tr("Blind Spot Path"), tr("Show a red path when a vehicle is in that lane's blind spot."), ""}, @@ -48,20 +48,20 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo {"PedalsOnUI", tr("Gas / Brake Pedal Indicators"), tr("On-screen gas and brake indicators.

Dynamic: Opacity changes according to how much openpilot is accelerating or braking
Static: Full when active, dim when not"), ""}, {"RotatingWheel", tr("Rotating Steering Wheel"), tr("Rotate the driving screen wheel with the physical steering wheel."), ""}, - {"ModelUI", tr("Model UI"), tr("Model visualizations for the driving path, lane lines, path edges, and road edges."), "../../frogpilot/assets/toggle_icons/icon_road.png"}, + {"ModelUI", tr("Model UI"), tr("Model visualizations for the driving path, lane lines, path edges, and road edges."), "../../starpilot/assets/toggle_icons/icon_road.png"}, {"DynamicPathWidth", tr("Dynamic Path Width"), tr("Change the path width based on engagement.

Fully Engaged: 100%
Always On Lateral: 75%
Disengaged: 50%"), ""}, {"LaneLinesWidth", tr("Lane Lines Width"), tr("Set the lane-line thickness.

Default matches the MUTCD lane-line width standard of 4 inches."), ""}, {"PathEdgeWidth", tr("Path Edges Width"), tr("Set the driving-path edge width that represents different driving modes and statuses.

Default is 20% of the total path width.

Color Guide:

- Light Blue: Always On Lateral
- Green: Default
- Orange: Experimental Mode
- Red: Traffic Mode
- Yellow: Conditional Experimental Mode overridden"), ""}, {"PathWidth", tr("Path Width"), tr("Set the driving-path width.

Default (6.1 feet) matches the width of a 2019 Lexus ES 350."), ""}, {"RoadEdgesWidth", tr("Road Edges Width"), tr("Set the road-edge thickness.

Default matches half of the MUTCD lane-line width standard of 4 inches."), ""}, - {"NavigationUI", tr("Navigation Widgets"), tr("Speed limits, and other navigation widgets."), "../../frogpilot/assets/toggle_icons/icon_map.png"}, + {"NavigationUI", tr("Navigation Widgets"), tr("Speed limits, and other navigation widgets."), "../../starpilot/assets/toggle_icons/icon_map.png"}, {"RoadNameUI", tr("Road Name"), tr("Display the road name at the bottom of the driving screen using data from \"OpenStreetMap (OSM)\"."), ""}, {"ShowSpeedLimits", tr("Show Speed Limits"), tr("Show speed limits in the top-left corner of the driving screen. Uses data from the car's dashboard (if supported) and \"OpenStreetMap (OSM)\"."), ""}, {"SLCMapboxFiller", tr("Show Speed Limits from Mapbox"), tr("Use Mapbox speed-limit data when no other source is available."), ""}, {"UseVienna", tr("Use Vienna-Style Speed Signs"), tr("Show Vienna-style (EU) speed-limit signs instead of MUTCD (US)."), ""}, - {"QOLVisuals", tr("Quality of Life"), tr("Miscellaneous visual changes to fine-tune how the driving screen looks."), "../../frogpilot/assets/toggle_icons/icon_quality_of_life.png"}, + {"QOLVisuals", tr("Quality of Life"), tr("Miscellaneous visual changes to fine-tune how the driving screen looks."), "../../starpilot/assets/toggle_icons/icon_quality_of_life.png"}, {"CameraView", tr("Camera View"), tr("Select the active camera view. This is purely a visual change and doesn't impact how openpilot drives!"), ""}, {"DriverCamera", tr("Show Driver Camera When In Reverse"), tr("Show the driver camera feed when the vehicle is in reverse."), ""}, {"StoppedTimer", tr("Stopped Timer"), tr("Show a timer when stopped in place of the current speed to indicate how long the vehicle has been stopped."), ""} @@ -71,23 +71,23 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo AbstractControl *visualToggle; if (param == "AdvancedCustomUI") { - FrogPilotManageControl *advancedCustomUIToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(advancedCustomUIToggle, &FrogPilotManageControl::manageButtonClicked, [visualsLayout, advancedCustomPanel]() { + StarPilotManageControl *advancedCustomUIToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(advancedCustomUIToggle, &StarPilotManageControl::manageButtonClicked, [visualsLayout, advancedCustomPanel]() { visualsLayout->setCurrentWidget(advancedCustomPanel); }); visualToggle = advancedCustomUIToggle; } else if (param == "CustomUI") { - FrogPilotManageControl *customUIToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(customUIToggle, &FrogPilotManageControl::manageButtonClicked, [visualsLayout, customUIPanel]() { + StarPilotManageControl *customUIToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(customUIToggle, &StarPilotManageControl::manageButtonClicked, [visualsLayout, customUIPanel]() { visualsLayout->setCurrentWidget(customUIPanel); }); visualToggle = customUIToggle; } else if (param == "PedalsOnUI") { std::vector pedalsToggles{"DynamicPedalsOnUI", "StaticPedalsOnUI"}; std::vector pedalsToggleNames{tr("Dynamic"), tr("Static")}; - FrogPilotButtonToggleControl *pedalsToggle = new FrogPilotButtonToggleControl(param, title, desc, icon, pedalsToggles, pedalsToggleNames, true); - QObject::connect(pedalsToggle, &FrogPilotButtonToggleControl::buttonClicked, [this](int id) { + StarPilotButtonToggleControl *pedalsToggle = new StarPilotButtonToggleControl(param, title, desc, icon, pedalsToggles, pedalsToggleNames, true); + QObject::connect(pedalsToggle, &StarPilotButtonToggleControl::buttonClicked, [this](int id) { if (id == 0) { params.putBool("StaticPedalsOnUI", false); } else if (id == 1) { @@ -97,32 +97,32 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo visualToggle = pedalsToggle; } else if (param == "ModelUI") { - FrogPilotManageControl *modelUIToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(modelUIToggle, &FrogPilotManageControl::manageButtonClicked, [visualsLayout, modelUIPanel]() { + StarPilotManageControl *modelUIToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(modelUIToggle, &StarPilotManageControl::manageButtonClicked, [visualsLayout, modelUIPanel]() { visualsLayout->setCurrentWidget(modelUIPanel); }); visualToggle = modelUIToggle; } else if (param == "LaneLinesWidth" || param == "RoadEdgesWidth") { - visualToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 24, tr(" inches")); + visualToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 24, tr(" inches")); } else if (param == "PathEdgeWidth") { std::map pathEdgeLabels; for (int i = 0; i <= 100; ++i) { pathEdgeLabels[i] = i == 0 ? tr("Off") : QString::number(i) + "%"; } - visualToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 100, QString(), pathEdgeLabels); + visualToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 100, QString(), pathEdgeLabels); } else if (param == "PathWidth") { - visualToggle = new FrogPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet"), std::map(), 0.1); + visualToggle = new StarPilotParamValueControl(param, title, desc, icon, 0, 10, tr(" feet"), std::map(), 0.1); } else if (param == "NavigationUI") { - FrogPilotManageControl *navigationUIToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(navigationUIToggle, &FrogPilotManageControl::manageButtonClicked, [visualsLayout, navigationUIPanel]() { + StarPilotManageControl *navigationUIToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(navigationUIToggle, &StarPilotManageControl::manageButtonClicked, [visualsLayout, navigationUIPanel]() { visualsLayout->setCurrentWidget(navigationUIPanel); }); visualToggle = navigationUIToggle; } else if (param == "QOLVisuals") { - FrogPilotManageControl *qolToggle = new FrogPilotManageControl(param, title, desc, icon); - QObject::connect(qolToggle, &FrogPilotManageControl::manageButtonClicked, [visualsLayout, qualityOfLifePanel]() { + StarPilotManageControl *qolToggle = new StarPilotManageControl(param, title, desc, icon); + QObject::connect(qolToggle, &StarPilotManageControl::manageButtonClicked, [visualsLayout, qualityOfLifePanel]() { visualsLayout->setCurrentWidget(qualityOfLifePanel); }); visualToggle = qolToggle; @@ -153,8 +153,8 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo parentKeys.insert(param); } - if (FrogPilotManageControl *frogPilotManageToggle = qobject_cast(visualToggle)) { - QObject::connect(frogPilotManageToggle, &FrogPilotManageControl::manageButtonClicked, [this]() { + if (StarPilotManageControl *frogPilotManageToggle = qobject_cast(visualToggle)) { + QObject::connect(frogPilotManageToggle, &StarPilotManageControl::manageButtonClicked, [this]() { emit openSubPanel(); openDescriptions(forceOpenDescriptions, toggles); }); @@ -170,26 +170,26 @@ FrogPilotVisualsPanel::FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bo QSet forceUpdateKeys = {"HideLeadMarker", "ShowSpeedLimits"}; for (const QString &key : forceUpdateKeys) { - QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &FrogPilotVisualsPanel::updateToggles); + QObject::connect(static_cast(toggles[key]), &ToggleControl::toggleFlipped, this, &StarPilotVisualsPanel::updateToggles); } openDescriptions(forceOpenDescriptions, toggles); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubPanel, [visualsLayout, visualsPanel, this] { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubPanel, [visualsLayout, visualsPanel, this] { openDescriptions(forceOpenDescriptions, toggles); visualsLayout->setCurrentWidget(visualsPanel); }); - QObject::connect(parent, &FrogPilotSettingsWindow::closeSubSubPanel, [this]() { + QObject::connect(parent, &StarPilotSettingsWindow::closeSubSubPanel, [this]() { openDescriptions(forceOpenDescriptions, toggles); }); - QObject::connect(parent, &FrogPilotSettingsWindow::updateMetric, this, &FrogPilotVisualsPanel::updateMetric); + QObject::connect(parent, &StarPilotSettingsWindow::updateMetric, this, &StarPilotVisualsPanel::updateMetric); } -void FrogPilotVisualsPanel::showEvent(QShowEvent *event) { +void StarPilotVisualsPanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotVisualsPanel::updateMetric(bool metric, bool bootRun) { +void StarPilotVisualsPanel::updateMetric(bool metric, bool bootRun) { static bool previousMetric; if (metric != previousMetric && !bootRun) { double distanceConversion = metric ? FOOT_TO_METER : METER_TO_FOOT; @@ -228,9 +228,9 @@ void FrogPilotVisualsPanel::updateMetric(bool metric, bool bootRun) { labelsInitialized = true; } - FrogPilotParamValueControl *laneLinesWidthToggle = static_cast(toggles["LaneLinesWidth"]); - FrogPilotParamValueControl *pathWidthToggle = static_cast(toggles["PathWidth"]); - FrogPilotParamValueControl *roadEdgesWidthToggle = static_cast(toggles["RoadEdgesWidth"]); + StarPilotParamValueControl *laneLinesWidthToggle = static_cast(toggles["LaneLinesWidth"]); + StarPilotParamValueControl *pathWidthToggle = static_cast(toggles["PathWidth"]); + StarPilotParamValueControl *roadEdgesWidthToggle = static_cast(toggles["RoadEdgesWidth"]); if (metric) { laneLinesWidthToggle->setDescription(tr("Set the lane-line thickness.

Default matches the MUTCD lane-line width standard of 10 centimeters.")); @@ -253,7 +253,7 @@ void FrogPilotVisualsPanel::updateMetric(bool metric, bool bootRun) { } } -void FrogPilotVisualsPanel::updateToggles() { +void StarPilotVisualsPanel::updateToggles() { for (auto &[key, toggle] : toggles) { if (parentKeys.contains(key)) { toggle->setVisible(false); @@ -265,7 +265,7 @@ void FrogPilotVisualsPanel::updateToggles() { continue; } - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "AccelerationPath") { setVisible &= parent->hasOpenpilotLongitudinal; diff --git a/frogpilot/ui/qt/offroad/visual_settings.h b/starpilot/ui/qt/offroad/visual_settings.h similarity index 82% rename from frogpilot/ui/qt/offroad/visual_settings.h rename to starpilot/ui/qt/offroad/visual_settings.h index 9ea1d36b..962f3418 100644 --- a/frogpilot/ui/qt/offroad/visual_settings.h +++ b/starpilot/ui/qt/offroad/visual_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotVisualsPanel : public FrogPilotListWidget { +class StarPilotVisualsPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotVisualsPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotVisualsPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); signals: void openSubPanel(); @@ -31,7 +31,7 @@ private: QSet parentKeys; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; Params params; }; diff --git a/frogpilot/ui/qt/offroad/wheel_settings.cc b/starpilot/ui/qt/offroad/wheel_settings.cc similarity index 84% rename from frogpilot/ui/qt/offroad/wheel_settings.cc rename to starpilot/ui/qt/offroad/wheel_settings.cc index c59251f7..0a2f9490 100644 --- a/frogpilot/ui/qt/offroad/wheel_settings.cc +++ b/starpilot/ui/qt/offroad/wheel_settings.cc @@ -1,13 +1,13 @@ -#include "frogpilot/ui/qt/offroad/wheel_settings.h" +#include "starpilot/ui/qt/offroad/wheel_settings.h" -FrogPilotWheelPanel::FrogPilotWheelPanel(FrogPilotSettingsWindow *parent, bool forceOpen) : FrogPilotListWidget(parent), parent(parent) { +StarPilotWheelPanel::StarPilotWheelPanel(StarPilotSettingsWindow *parent, bool forceOpen) : StarPilotListWidget(parent), parent(parent) { forceOpenDescriptions = forceOpen; const std::vector> wheelToggles { - {"DistanceButtonControl", tr("Distance Button"), tr("Action performed when the \"Distance\" button is pressed."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, - {"LongDistanceButtonControl", tr("Distance Button (Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 0.5 seconds."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, - {"VeryLongDistanceButtonControl", tr("Distance Button (Very Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 2.5 seconds."), "../../frogpilot/assets/toggle_icons/icon_mute.png"}, - {"LKASButtonControl", tr("LKAS Button"), tr("Action performed when the \"LKAS\" button is pressed."), "../../frogpilot/assets/toggle_icons/icon_mute.png"} + {"DistanceButtonControl", tr("Distance Button"), tr("Action performed when the \"Distance\" button is pressed."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, + {"LongDistanceButtonControl", tr("Distance Button (Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 0.5 seconds."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, + {"VeryLongDistanceButtonControl", tr("Distance Button (Very Long Press)"), tr("Action performed when the \"Distance\" button is pressed for more than 2.5 seconds."), "../../starpilot/assets/toggle_icons/icon_mute.png"}, + {"LKASButtonControl", tr("LKAS Button"), tr("Action performed when the \"LKAS\" button is pressed."), "../../starpilot/assets/toggle_icons/icon_mute.png"} }; for (const auto &[param, title, desc, icon] : wheelToggles) { @@ -62,13 +62,13 @@ FrogPilotWheelPanel::FrogPilotWheelPanel(FrogPilotSettingsWindow *parent, bool f openDescriptions(forceOpenDescriptions, toggles); } -void FrogPilotWheelPanel::showEvent(QShowEvent *event) { +void StarPilotWheelPanel::showEvent(QShowEvent *event) { updateToggles(); } -void FrogPilotWheelPanel::updateToggles() { +void StarPilotWheelPanel::updateToggles() { for (auto &[key, toggle] : toggles) { - bool setVisible = parent->tuningLevel >= parent->frogpilotToggleLevels[key].toDouble(); + bool setVisible = parent->tuningLevel >= parent->starpilotToggleLevels[key].toDouble(); if (key == "LKASButtonControl") { setVisible &= !parent->isSubaru; diff --git a/frogpilot/ui/qt/offroad/wheel_settings.h b/starpilot/ui/qt/offroad/wheel_settings.h similarity index 54% rename from frogpilot/ui/qt/offroad/wheel_settings.h rename to starpilot/ui/qt/offroad/wheel_settings.h index 458c72bd..a8995bcd 100644 --- a/frogpilot/ui/qt/offroad/wheel_settings.h +++ b/starpilot/ui/qt/offroad/wheel_settings.h @@ -1,12 +1,12 @@ #pragma once -#include "frogpilot/ui/qt/offroad/frogpilot_settings.h" +#include "starpilot/ui/qt/offroad/starpilot_settings.h" -class FrogPilotWheelPanel : public FrogPilotListWidget { +class StarPilotWheelPanel : public StarPilotListWidget { Q_OBJECT public: - explicit FrogPilotWheelPanel(FrogPilotSettingsWindow *parent, bool forceOpen = false); + explicit StarPilotWheelPanel(StarPilotSettingsWindow *parent, bool forceOpen = false); protected: void showEvent(QShowEvent *event) override; @@ -18,7 +18,7 @@ private: std::map toggles; - FrogPilotSettingsWindow *parent; + StarPilotSettingsWindow *parent; Params params; }; diff --git a/frogpilot/ui/qt/onroad/moc_frogpilot_annotated_camera.cc b/starpilot/ui/qt/onroad/moc_starpilot_annotated_camera.cc similarity index 64% rename from frogpilot/ui/qt/onroad/moc_frogpilot_annotated_camera.cc rename to starpilot/ui/qt/onroad/moc_starpilot_annotated_camera.cc index 4571e5dc..f48e0585 100644 --- a/frogpilot/ui/qt/onroad/moc_frogpilot_annotated_camera.cc +++ b/starpilot/ui/qt/onroad/moc_starpilot_annotated_camera.cc @@ -1,16 +1,16 @@ /**************************************************************************** -** Meta object code from reading C++ file 'frogpilot_annotated_camera.h' +** Meta object code from reading C++ file 'starpilot_annotated_camera.h' ** ** Created by: The Qt Meta Object Compiler version 67 (Qt 5.12.8) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ -#include "frogpilot_annotated_camera.h" +#include "starpilot_annotated_camera.h" #include #include #if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'frogpilot_annotated_camera.h' doesn't include ." +#error "The header file 'starpilot_annotated_camera.h' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 67 #error "This file was generated using the moc from 5.12.8. It" #error "cannot be used with the include files from this version of Qt." @@ -20,25 +20,25 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotAnnotatedCameraWidget_t { +struct qt_meta_stringdata_StarPilotAnnotatedCameraWidget_t { QByteArrayData data[1]; char stringdata0[31]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotAnnotatedCameraWidget_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotAnnotatedCameraWidget_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotAnnotatedCameraWidget_t qt_meta_stringdata_FrogPilotAnnotatedCameraWidget = { +static const qt_meta_stringdata_StarPilotAnnotatedCameraWidget_t qt_meta_stringdata_StarPilotAnnotatedCameraWidget = { { -QT_MOC_LITERAL(0, 0, 30) // "FrogPilotAnnotatedCameraWidget" +QT_MOC_LITERAL(0, 0, 30) // "StarPilotAnnotatedCameraWidget" }, - "FrogPilotAnnotatedCameraWidget" + "StarPilotAnnotatedCameraWidget" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotAnnotatedCameraWidget[] = { +static const uint qt_meta_data_StarPilotAnnotatedCameraWidget[] = { // content: 8, // revision @@ -54,7 +54,7 @@ static const uint qt_meta_data_FrogPilotAnnotatedCameraWidget[] = { 0 // eod }; -void FrogPilotAnnotatedCameraWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotAnnotatedCameraWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -62,30 +62,30 @@ void FrogPilotAnnotatedCameraWidget::qt_static_metacall(QObject *_o, QMetaObject Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotAnnotatedCameraWidget::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotAnnotatedCameraWidget::staticMetaObject = { { &QWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotAnnotatedCameraWidget.data, - qt_meta_data_FrogPilotAnnotatedCameraWidget, + qt_meta_stringdata_StarPilotAnnotatedCameraWidget.data, + qt_meta_data_StarPilotAnnotatedCameraWidget, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotAnnotatedCameraWidget::metaObject() const +const QMetaObject *StarPilotAnnotatedCameraWidget::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotAnnotatedCameraWidget::qt_metacast(const char *_clname) +void *StarPilotAnnotatedCameraWidget::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotAnnotatedCameraWidget.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotAnnotatedCameraWidget.stringdata0)) return static_cast(this); return QWidget::qt_metacast(_clname); } -int FrogPilotAnnotatedCameraWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotAnnotatedCameraWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QWidget::qt_metacall(_c, _id, _a); return _id; diff --git a/frogpilot/ui/qt/onroad/moc_frogpilot_buttons.cc b/starpilot/ui/qt/onroad/moc_starpilot_buttons.cc similarity index 94% rename from frogpilot/ui/qt/onroad/moc_frogpilot_buttons.cc rename to starpilot/ui/qt/onroad/moc_starpilot_buttons.cc index bc04f9d9..1ef1dcc5 100644 --- a/frogpilot/ui/qt/onroad/moc_frogpilot_buttons.cc +++ b/starpilot/ui/qt/onroad/moc_starpilot_buttons.cc @@ -1,16 +1,16 @@ /**************************************************************************** -** Meta object code from reading C++ file 'frogpilot_buttons.h' +** Meta object code from reading C++ file 'starpilot_buttons.h' ** ** Created by: The Qt Meta Object Compiler version 67 (Qt 5.12.8) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ -#include "frogpilot_buttons.h" +#include "starpilot_buttons.h" #include #include #if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'frogpilot_buttons.h' doesn't include ." +#error "The header file 'starpilot_buttons.h' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 67 #error "This file was generated using the moc from 5.12.8. It" #error "cannot be used with the include files from this version of Qt." diff --git a/frogpilot/ui/qt/onroad/moc_frogpilot_onroad.cc b/starpilot/ui/qt/onroad/moc_starpilot_onroad.cc similarity index 65% rename from frogpilot/ui/qt/onroad/moc_frogpilot_onroad.cc rename to starpilot/ui/qt/onroad/moc_starpilot_onroad.cc index 7cd7189f..e37db6a1 100644 --- a/frogpilot/ui/qt/onroad/moc_frogpilot_onroad.cc +++ b/starpilot/ui/qt/onroad/moc_starpilot_onroad.cc @@ -1,16 +1,16 @@ /**************************************************************************** -** Meta object code from reading C++ file 'frogpilot_onroad.h' +** Meta object code from reading C++ file 'starpilot_onroad.h' ** ** Created by: The Qt Meta Object Compiler version 67 (Qt 5.12.8) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ -#include "frogpilot_onroad.h" +#include "starpilot_onroad.h" #include #include #if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'frogpilot_onroad.h' doesn't include ." +#error "The header file 'starpilot_onroad.h' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 67 #error "This file was generated using the moc from 5.12.8. It" #error "cannot be used with the include files from this version of Qt." @@ -20,25 +20,25 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotOnroadWindow_t { +struct qt_meta_stringdata_StarPilotOnroadWindow_t { QByteArrayData data[1]; char stringdata0[22]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotOnroadWindow_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotOnroadWindow_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotOnroadWindow_t qt_meta_stringdata_FrogPilotOnroadWindow = { +static const qt_meta_stringdata_StarPilotOnroadWindow_t qt_meta_stringdata_StarPilotOnroadWindow = { { -QT_MOC_LITERAL(0, 0, 21) // "FrogPilotOnroadWindow" +QT_MOC_LITERAL(0, 0, 21) // "StarPilotOnroadWindow" }, - "FrogPilotOnroadWindow" + "StarPilotOnroadWindow" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotOnroadWindow[] = { +static const uint qt_meta_data_StarPilotOnroadWindow[] = { // content: 8, // revision @@ -54,7 +54,7 @@ static const uint qt_meta_data_FrogPilotOnroadWindow[] = { 0 // eod }; -void FrogPilotOnroadWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotOnroadWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -62,30 +62,30 @@ void FrogPilotOnroadWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotOnroadWindow::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotOnroadWindow::staticMetaObject = { { &QWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotOnroadWindow.data, - qt_meta_data_FrogPilotOnroadWindow, + qt_meta_stringdata_StarPilotOnroadWindow.data, + qt_meta_data_StarPilotOnroadWindow, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotOnroadWindow::metaObject() const +const QMetaObject *StarPilotOnroadWindow::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotOnroadWindow::qt_metacast(const char *_clname) +void *StarPilotOnroadWindow::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotOnroadWindow.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotOnroadWindow.stringdata0)) return static_cast(this); return QWidget::qt_metacast(_clname); } -int FrogPilotOnroadWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotOnroadWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QWidget::qt_metacall(_c, _id, _a); return _id; diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc b/starpilot/ui/qt/onroad/starpilot_annotated_camera.cc similarity index 81% rename from frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc rename to starpilot/ui/qt/onroad/starpilot_annotated_camera.cc index afdee9c0..5870ff2f 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.cc +++ b/starpilot/ui/qt/onroad/starpilot_annotated_camera.cc @@ -1,58 +1,58 @@ #include -#include "frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h" +#include "starpilot/ui/qt/onroad/starpilot_annotated_camera.h" -FrogPilotAnnotatedCameraWidget::FrogPilotAnnotatedCameraWidget(QWidget *parent) : QWidget(parent) { +StarPilotAnnotatedCameraWidget::StarPilotAnnotatedCameraWidget(QWidget *parent) : QWidget(parent) { animationTimer = new QTimer(this); QSize iconSize(img_size / 4, img_size / 4); - brakePedalImg = loadPixmap("../../frogpilot/assets/other_images/brake_pedal.png", {btn_size, btn_size}); - curveSpeedIcon = loadPixmap("../../frogpilot/assets/other_images/curve_speed.png", {btn_size, btn_size}); + brakePedalImg = loadPixmap("../../starpilot/assets/other_images/brake_pedal.png", {btn_size, btn_size}); + curveSpeedIcon = loadPixmap("../../starpilot/assets/other_images/curve_speed.png", {btn_size, btn_size}); curveSpeedIconFlipped = curveSpeedIcon.transformed(QTransform().scale(-1, 1)); - dashboardIcon = loadPixmap("../../frogpilot/assets/other_images/dashboard_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - gasPedalImg = loadPixmap("../../frogpilot/assets/other_images/gas_pedal.png", {btn_size, btn_size}); - mapboxIcon = loadPixmap("../../frogpilot/assets/other_images/mapbox_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - mapDataIcon = loadPixmap("../../frogpilot/assets/other_images/offline_maps_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - nextMapsIcon = loadPixmap("../../frogpilot/assets/other_images/next_maps_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - pausedIcon = loadPixmap("../../frogpilot/assets/other_images/paused_icon.png", {widget_size, widget_size}); - speedIcon = loadPixmap("../../frogpilot/assets/other_images/speed_icon.png", {widget_size, widget_size}); - stopSignImg = loadPixmap("../../frogpilot/assets/other_images/stop_sign.png", {btn_size, btn_size}); - turnIcon = loadPixmap("../../frogpilot/assets/other_images/turn_icon.png", {widget_size, widget_size}); + dashboardIcon = loadPixmap("../../starpilot/assets/other_images/dashboard_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + gasPedalImg = loadPixmap("../../starpilot/assets/other_images/gas_pedal.png", {btn_size, btn_size}); + mapboxIcon = loadPixmap("../../starpilot/assets/other_images/mapbox_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + mapDataIcon = loadPixmap("../../starpilot/assets/other_images/offline_maps_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + nextMapsIcon = loadPixmap("../../starpilot/assets/other_images/next_maps_icon.png", {btn_size / 2, btn_size / 2}).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); + pausedIcon = loadPixmap("../../starpilot/assets/other_images/paused_icon.png", {widget_size, widget_size}); + speedIcon = loadPixmap("../../starpilot/assets/other_images/speed_icon.png", {widget_size, widget_size}); + stopSignImg = loadPixmap("../../starpilot/assets/other_images/stop_sign.png", {btn_size, btn_size}); + turnIcon = loadPixmap("../../starpilot/assets/other_images/turn_icon.png", {widget_size, widget_size}); - loadGif("../../frogpilot/assets/other_images/curve_icon.gif", cemCurveIcon, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/lead_icon.gif", cemLeadIcon, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/speed_icon.gif", cemSpeedIcon, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/light_icon.gif", cemStopIcon, QSize(widget_size, widget_size), this); - 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); - loadGif("../../frogpilot/assets/other_images/weather_clear_day.gif", weatherClearDay, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/weather_clear_night.gif", weatherClearNight, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/weather_low_visibility.gif", weatherLowVisibility, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/weather_rain.gif", weatherRain, QSize(widget_size, widget_size), this); - loadGif("../../frogpilot/assets/other_images/weather_snow.gif", weatherSnow, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/curve_icon.gif", cemCurveIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/lead_icon.gif", cemLeadIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/speed_icon.gif", cemSpeedIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/light_icon.gif", cemStopIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/turn_icon.gif", cemTurnIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/chill_mode_icon.gif", chillModeIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/experimental_mode_icon.gif", experimentalModeIcon, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/weather_clear_day.gif", weatherClearDay, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/weather_clear_night.gif", weatherClearNight, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/weather_low_visibility.gif", weatherLowVisibility, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/weather_rain.gif", weatherRain, QSize(widget_size, widget_size), this); + loadGif("../../starpilot/assets/other_images/weather_snow.gif", weatherSnow, 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(starpilotUIState(), &StarPilotUIState::themeUpdated, this, &StarPilotAnnotatedCameraWidget::updateSignals); QObject::connect(uiState(), &UIState::offroadTransition, [this] { standstillTimer.invalidate(); - QJsonObject stats = QJsonDocument::fromJson(QString::fromStdString(params.get("FrogPilotStats")).toUtf8()).object(); + QJsonObject stats = QJsonDocument::fromJson(QString::fromStdString(params.get("StarPilotStats")).toUtf8()).object(); stats["FrogHops"] = stats.value("FrogHops").toInt(0) + frogHopCount; - params.putNonBlocking("FrogPilotStats", QJsonDocument(stats).toJson(QJsonDocument::Compact).toStdString()); + params.putNonBlocking("StarPilotStats", QJsonDocument(stats).toJson(QJsonDocument::Compact).toStdString()); frogHopCount = 0; }); } -void FrogPilotAnnotatedCameraWidget::showEvent(QShowEvent *event) { +void StarPilotAnnotatedCameraWidget::showEvent(QShowEvent *event) { updateSignals(); } -void FrogPilotAnnotatedCameraWidget::updateSignals() { +void StarPilotAnnotatedCameraWidget::updateSignals() { QVector().swap(blindspotImages); QVector().swap(blindspotImagesRight); QVector().swap(signalImages); @@ -60,7 +60,7 @@ void FrogPilotAnnotatedCameraWidget::updateSignals() { bool isGif = false; - QFileInfoList files = QDir("../../frogpilot/assets/active_theme/signals/").entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name); + QFileInfoList files = QDir("../../starpilot/assets/active_theme/signals/").entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::Name); for (const QFileInfo &fileInfo : files) { QString fileName = fileInfo.fileName(); QString filePath = fileInfo.absoluteFilePath(); @@ -126,28 +126,28 @@ void FrogPilotAnnotatedCameraWidget::updateSignals() { } } -void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPilotUIState &fs) { +void StarPilotAnnotatedCameraWidget::updateState(const UIState &s, const StarPilotUIState &fs) { const UIScene &scene = s.scene; const SubMaster &sm = *(s.sm); const SubMaster &fpsm = *(fs.sm); const cereal::CarState::Reader &carState = sm["carState"].getCarState(); - const cereal::FrogPilotCarState::Reader &frogpilotCarState = fpsm["frogpilotCarState"].getFrogpilotCarState(); - const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan(); - const cereal::FrogPilotSelfdriveState::Reader &frogpilotSelfdriveState = fpsm["frogpilotSelfdriveState"].getFrogpilotSelfdriveState(); + const cereal::StarPilotCarState::Reader &starpilotCarState = fpsm["starpilotCarState"].getStarpilotCarState(); + const cereal::StarPilotPlan::Reader &starpilotPlan = fpsm["starpilotPlan"].getStarpilotPlan(); + const cereal::StarPilotSelfdriveState::Reader &starpilotSelfdriveState = fpsm["starpilotSelfdriveState"].getStarpilotSelfdriveState(); const cereal::MapdOut::Reader &mapdOut = fpsm["mapdOut"].getMapdOut(); const cereal::ModelDataV2::Reader &modelV2 = sm["modelV2"].getModelV2(); const cereal::SelfdriveState::Reader &selfdriveState = sm["selfdriveState"].getSelfdriveState(); - if (scene.is_metric || frogpilot_toggles.value("use_si_metrics").toBool()) { + if (scene.is_metric || starpilot_toggles.value("use_si_metrics").toBool()) { leadDistanceUnit = tr(" meters"); - leadSpeedUnit = frogpilot_toggles.value("use_si_metrics").toBool() ? tr(" m/s") : tr(" km/h"); + leadSpeedUnit = starpilot_toggles.value("use_si_metrics").toBool() ? tr(" m/s") : tr(" km/h"); speedUnit = scene.is_metric ? tr("km/h") : tr("mph"); distanceConversion = 1.0f; speedConversion = scene.is_metric ? MS_TO_KPH : MS_TO_MPH; - speedConversionMetrics = frogpilot_toggles.value("use_si_metrics").toBool() ? 1.0f : MS_TO_KPH; + speedConversionMetrics = starpilot_toggles.value("use_si_metrics").toBool() ? 1.0f : MS_TO_KPH; } else { leadDistanceUnit = tr(" feet"); leadSpeedUnit = tr(" mph"); @@ -163,46 +163,46 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil blindspotRight = carState.getRightBlindspot(); blinkerLeft = carState.getLeftBlinker(); blinkerRight = carState.getRightBlinker(); - brakeLights = frogpilotCarState.getBrakeLights(); - cscControllingSpeed = frogpilotPlan.getCscControllingSpeed(); - cscSpeed = frogpilotPlan.getCscSpeed(); - cscTraining = frogpilotPlan.getCscTraining(); - dashboardSpeedLimit = frogpilotCarState.getDashboardSpeedLimit(); - desiredFollowDistance = frogpilotPlan.getDesiredFollowDistance(); + brakeLights = starpilotCarState.getBrakeLights(); + cscControllingSpeed = starpilotPlan.getCscControllingSpeed(); + cscSpeed = starpilotPlan.getCscSpeed(); + cscTraining = starpilotPlan.getCscTraining(); + dashboardSpeedLimit = starpilotCarState.getDashboardSpeedLimit(); + desiredFollowDistance = starpilotPlan.getDesiredFollowDistance(); experimentalMode = selfdriveState.getExperimentalMode(); - forceCoast = frogpilotCarState.getForceCoast(); - laneWidthLeft = frogpilotPlan.getLaneWidthLeft(); - laneWidthRight = frogpilotPlan.getLaneWidthRight(); - lateralPaused = frogpilotCarState.getPauseLateral(); - longitudinalPaused = frogpilotCarState.getPauseLongitudinal(); - mapSpeedLimit = frogpilotPlan.getSlcMapSpeedLimit(); - mapboxSpeedLimit = frogpilotPlan.getSlcMapboxSpeedLimit(); - nextSpeedLimit = frogpilotPlan.getSlcNextSpeedLimit(); - redLight = frogpilotPlan.getRedLight(); - roadCurvature = frogpilotPlan.getRoadCurvature(); + forceCoast = starpilotCarState.getForceCoast(); + laneWidthLeft = starpilotPlan.getLaneWidthLeft(); + laneWidthRight = starpilotPlan.getLaneWidthRight(); + lateralPaused = starpilotCarState.getPauseLateral(); + longitudinalPaused = starpilotCarState.getPauseLongitudinal(); + mapSpeedLimit = starpilotPlan.getSlcMapSpeedLimit(); + mapboxSpeedLimit = starpilotPlan.getSlcMapboxSpeedLimit(); + nextSpeedLimit = starpilotPlan.getSlcNextSpeedLimit(); + redLight = starpilotPlan.getRedLight(); + roadCurvature = starpilotPlan.getRoadCurvature(); roadName = QString::fromStdString(mapdOut.getRoadName()); - slcOverriddenSpeed = frogpilotPlan.getSlcOverriddenSpeed(); - speedLimit = slcOverriddenSpeed != 0 ? slcOverriddenSpeed : frogpilotPlan.getSlcSpeedLimit(); - speedLimitChanged = frogpilotPlan.getSpeedLimitChanged(); - speedLimitSource = frogpilotPlan.getSlcSpeedLimitSource(); + slcOverriddenSpeed = starpilotPlan.getSlcOverriddenSpeed(); + speedLimit = slcOverriddenSpeed != 0 ? slcOverriddenSpeed : starpilotPlan.getSlcSpeedLimit(); + speedLimitChanged = starpilotPlan.getSpeedLimitChanged(); + speedLimitSource = starpilotPlan.getSlcSpeedLimitSource(); stoppingDistance = modelV2.getPosition().getX().size() > 33 - 1 ? modelV2.getPosition().getX()[33 - 1] : 0.0; - unconfirmedSpeedLimit = frogpilotPlan.getUnconfirmedSlcSpeedLimit(); - weatherDaytime = frogpilotPlan.getWeatherDaytime(); - weatherId = frogpilotPlan.getWeatherId(); + unconfirmedSpeedLimit = starpilotPlan.getUnconfirmedSlcSpeedLimit(); + weatherDaytime = starpilotPlan.getWeatherDaytime(); + weatherId = starpilotPlan.getWeatherId(); hideBottomIcons = selfdriveState.getAlertSize() != cereal::SelfdriveState::AlertSize::NONE; - hideBottomIcons |= frogpilotSelfdriveState.getAlertSize() != cereal::FrogPilotSelfdriveState::AlertSize::NONE; + hideBottomIcons |= starpilotSelfdriveState.getAlertSize() != cereal::StarPilotSelfdriveState::AlertSize::NONE; hideBottomIcons |= signalStyle.startsWith("traditional") && (blinkerLeft || blinkerRight); - if (slcOverriddenSpeed == 0 && !frogpilot_toggles.value("show_speed_limit_offset").toBool()) { - speedLimit += frogpilotPlan.getSlcSpeedLimitOffset(); + if (slcOverriddenSpeed == 0 && !starpilot_toggles.value("show_speed_limit_offset").toBool()) { + speedLimit += starpilotPlan.getSlcSpeedLimitOffset(); } speedLimit *= (scene.is_metric ? MS_TO_KPH : MS_TO_MPH); - float speedLimitOffset = frogpilotPlan.getSlcSpeedLimitOffset() * speedConversion; + float speedLimitOffset = starpilotPlan.getSlcSpeedLimitOffset() * speedConversion; speedLimitOffsetStr = (speedLimitOffset != 0) ? QString::number(speedLimitOffset, 'f', 0).prepend((speedLimitOffset > 0) ? "+" : "-") : "–"; static int lastFrameIndex; - if (lastFrameIndex > animationFrameIndex && frogpilot_toggles.value("signal_icons").toString() == "frog") { + if (lastFrameIndex > animationFrameIndex && starpilot_toggles.value("signal_icons").toString() == "frog") { frogHopCount++; } lastFrameIndex = animationFrameIndex; @@ -232,11 +232,11 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil pendingLimitTimer.invalidate(); } - if (frogpilot_scene.standstill && frogpilot_toggles.value("stopped_timer").toBool()) { + if (starpilot_scene.standstill && starpilot_toggles.value("stopped_timer").toBool()) { if (!standstillTimer.isValid()) { standstillTimer.start(); } else { - standstillDuration = frogpilot_scene.started_timer / UI_FREQ < 60 ? 0 : standstillTimer.elapsed() / 1000; + standstillDuration = starpilot_scene.started_timer / UI_FREQ < 60 ? 0 : standstillTimer.elapsed() / 1000; } } else { standstillDuration = 0; @@ -244,7 +244,7 @@ void FrogPilotAnnotatedCameraWidget::updateState(const UIState &s, const FrogPil } } -void FrogPilotAnnotatedCameraWidget::mousePressEvent(QMouseEvent *mouseEvent) { +void StarPilotAnnotatedCameraWidget::mousePressEvent(QMouseEvent *mouseEvent) { if (speedLimitChanged && newSpeedLimitRect.contains(mouseEvent->pos())) { params_memory.putBool("SpeedLimitAccepted", true); mouseEvent->accept(); @@ -254,22 +254,22 @@ void FrogPilotAnnotatedCameraWidget::mousePressEvent(QMouseEvent *mouseEvent) { mouseEvent->ignore(); } -void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState &s) { - if (!hideBottomIcons && frogpilot_toggles.value("cem_status").toBool()) { +void StarPilotAnnotatedCameraWidget::paintStarPilotWidgets(QPainter &p, UIState &s) { + if (!hideBottomIcons && starpilot_toggles.value("cem_status").toBool()) { paintCEMStatus(p); } else { cemStatusPosition.setX(0); cemStatusPosition.setY(0); } - if (!hideBottomIcons && frogpilot_toggles.value("compass").toBool()) { + if (!hideBottomIcons && starpilot_toggles.value("compass").toBool()) { paintCompass(p); } else { compassPosition.setX(0); compassPosition.setY(0); } - if (!speedLimitChanged && !(signalStyle == "static" && blinkerLeft) && frogpilot_toggles.value("csc_status").toBool()) { + if (!speedLimitChanged && !(signalStyle == "static" && blinkerLeft) && starpilot_toggles.value("csc_status").toBool()) { if (cscTraining) { paintCurveSpeedControlTraining(p); } else if (isCruiseSet && cscControllingSpeed) { @@ -288,7 +288,7 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState paintLongitudinalPaused(p); } - if (frogpilot_toggles.value("pedals_on_ui").toBool()) { + if (starpilot_toggles.value("pedals_on_ui").toBool()) { paintPedalIcons(p); } @@ -296,22 +296,22 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState paintPendingSpeedLimit(p); } - if (frogpilot_toggles.value("radar_tracks").toBool()) { + if (starpilot_toggles.value("radar_tracks").toBool()) { paintRadarTracks(p); } - if (frogpilot_toggles.value("road_name_ui").toBool()) { + if (starpilot_toggles.value("road_name_ui").toBool()) { paintRoadName(p); } - bool hideSpeedLimit = !speedLimitChanged && frogpilot_toggles.value("hide_speed_limit").toBool(); - if (!hideSpeedLimit && (frogpilot_toggles.value("show_speed_limits").toBool() || frogpilot_toggles.value("speed_limit_controller").toBool())) { + bool hideSpeedLimit = !speedLimitChanged && starpilot_toggles.value("hide_speed_limit").toBool(); + if (!hideSpeedLimit && (starpilot_toggles.value("show_speed_limits").toBool() || starpilot_toggles.value("speed_limit_controller").toBool())) { paintSpeedLimit(p); } else { speedLimitHeight = 0; } - if (frogpilot_toggles.value("speed_limit_sources").toBool()) { + if (starpilot_toggles.value("speed_limit_sources").toBool()) { paintSpeedLimitSources(p); } @@ -319,7 +319,7 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState paintStandstillTimer(p); } - if (track_vertices.length() >= 1 && redLight && frogpilot_toggles.value("show_stopping_point").toBool()) { + if (track_vertices.length() >= 1 && redLight && starpilot_toggles.value("show_stopping_point").toBool()) { paintStoppingPoint(p); } @@ -332,7 +332,7 @@ void FrogPilotAnnotatedCameraWidget::paintFrogPilotWidgets(QPainter &p, UIState } } -void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p) { std::function paintPath = [&](const QPolygonF &path, bool isLeft, bool isBlindSpot, float laneWidth) { if (laneWidth == 0.0f) { return; @@ -341,12 +341,12 @@ void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p) { p.save(); QLinearGradient gradient(0, height(), 0, 0); - if (isBlindSpot && frogpilot_toggles.value("blind_spot_path").toBool()) { + if (isBlindSpot && starpilot_toggles.value("blind_spot_path").toBool()) { gradient.setColorAt(0.0f, QColor::fromHslF(0.0f, 0.75f, 0.5f, 0.4f)); gradient.setColorAt(0.5f, QColor::fromHslF(0.0f, 0.75f, 0.5f, 0.35f)); gradient.setColorAt(1.0f, QColor::fromHslF(0.0f, 0.75f, 0.5f, 0.0f)); } else { - float ratio = std::clamp(laneWidth / frogpilot_toggles.value("lane_detection_width").toDouble(), 0.0, 1.0); + float ratio = std::clamp(laneWidth / starpilot_toggles.value("lane_detection_width").toDouble(), 0.0, 1.0); float hue = (ratio * ratio) * (120.0f / 360.0f); gradient.setColorAt(0.0f, QColor::fromHslF(hue, 0.75f, 0.5f, 0.4f)); @@ -357,9 +357,9 @@ void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p) { p.setBrush(gradient); p.drawPolygon(path); - if (frogpilot_toggles.value("adjacent_path_metrics").toBool()) { + if (starpilot_toggles.value("adjacent_path_metrics").toBool()) { QString text; - if (isBlindSpot && frogpilot_toggles.value("blind_spot_path").toBool()) { + if (isBlindSpot && starpilot_toggles.value("blind_spot_path").toBool()) { text = tr("Vehicle in blind spot"); } else { text = QString::number(laneWidth * distanceConversion, 'f', 2) + leadDistanceUnit; @@ -389,7 +389,7 @@ void FrogPilotAnnotatedCameraWidget::paintAdjacentPaths(QPainter &p) { paintPath(track_adjacent_vertices[1], false, blindspotRight, laneWidthRight); } -void FrogPilotAnnotatedCameraWidget::paintBlindSpotPath(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintBlindSpotPath(QPainter &p) { p.save(); QLinearGradient bs(0, height(), 0, 0); @@ -408,7 +408,7 @@ void FrogPilotAnnotatedCameraWidget::paintBlindSpotPath(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintCEMStatus(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintCEMStatus(QPainter &p) { if (dmIconPosition == QPoint(0, 0)) { return; } @@ -421,7 +421,7 @@ void FrogPilotAnnotatedCameraWidget::paintCEMStatus(QPainter &p) { QRect cemWidget(cemStatusPosition, QSize(widget_size, widget_size)); p.setBrush(blackColor(166)); - if (frogpilot_scene.conditional_status == 1) { + if (starpilot_scene.conditional_status == 1) { p.setPen(QPen(QColor(bg_colors[STATUS_CEM_DISABLED]), 10)); } else if (experimentalMode) { p.setPen(QPen(QColor(bg_colors[STATUS_EXPERIMENTAL_MODE_ENABLED]), 10)); @@ -432,19 +432,19 @@ void FrogPilotAnnotatedCameraWidget::paintCEMStatus(QPainter &p) { QSharedPointer icon = chillModeIcon; if (experimentalMode) { - if (frogpilot_scene.conditional_status == 1) { + if (starpilot_scene.conditional_status == 1) { icon = chillModeIcon; - } else if (frogpilot_scene.conditional_status == 2) { + } else if (starpilot_scene.conditional_status == 2) { icon = experimentalModeIcon; - } else if (frogpilot_scene.conditional_status == 3) { + } else if (starpilot_scene.conditional_status == 3) { icon = cemCurveIcon; - } else if (frogpilot_scene.conditional_status == 4) { + } else if (starpilot_scene.conditional_status == 4) { icon = cemLeadIcon; - } else if (frogpilot_scene.conditional_status == 5) { + } else if (starpilot_scene.conditional_status == 5) { icon = cemTurnIcon; - } else if (frogpilot_scene.conditional_status == 6 || frogpilot_scene.conditional_status == 7) { + } else if (starpilot_scene.conditional_status == 6 || starpilot_scene.conditional_status == 7) { icon = cemSpeedIcon; - } else if (frogpilot_scene.conditional_status == 8) { + } else if (starpilot_scene.conditional_status == 8) { icon = cemStopIcon; } else { icon = experimentalModeIcon; @@ -455,7 +455,7 @@ void FrogPilotAnnotatedCameraWidget::paintCEMStatus(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintCompass(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintCompass(QPainter &p) { if (dmIconPosition == QPoint(0, 0)) { return; } @@ -541,7 +541,7 @@ void FrogPilotAnnotatedCameraWidget::paintCompass(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControl(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintCurveSpeedControl(QPainter &p) { p.save(); QRect curveSpeedRect(QPoint(setSpeedRect.right() + UI_BORDER_SIZE, setSpeedRect.top()), QSize(defaultSize.width() * 1.25, defaultSize.width() * 1.25)); @@ -564,7 +564,7 @@ void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControl(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControlTraining(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintCurveSpeedControlTraining(QPainter &p) { p.save(); qreal phase = (glowTimer.elapsed() % 2000) / 2000.0 * 2 * M_PI; @@ -599,7 +599,7 @@ void FrogPilotAnnotatedCameraWidget::paintCurveSpeedControlTraining(QPainter &p) p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintLateralPaused(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintLateralPaused(QPainter &p) { if (dmIconPosition == QPoint(0, 0)) { return; } @@ -628,7 +628,7 @@ void FrogPilotAnnotatedCameraWidget::paintLateralPaused(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintLeadMetrics(QPainter &p, bool adjacent, QPointF *chevron, const cereal::RadarState::LeadData::Reader &lead_data) { +void StarPilotAnnotatedCameraWidget::paintLeadMetrics(QPainter &p, bool adjacent, QPointF *chevron, const cereal::RadarState::LeadData::Reader &lead_data) { float leadDistance = lead_data.getDRel() + (adjacent ? std::abs(lead_data.getYRel()) : 0.0f); float leadSpeed = std::max(lead_data.getVLead(), 0.0f); @@ -641,7 +641,7 @@ void FrogPilotAnnotatedCameraWidget::paintLeadMetrics(QPainter &p, bool adjacent textLines.append(QString("%1 %2").arg(distanceString, leadDistanceUnit)); textLines.append(QString("%1 %2").arg(speedString, leadSpeedUnit)); } else { - if (frogpilot_toggles.value("openpilot_longitudinal").toBool()) { + if (starpilot_toggles.value("openpilot_longitudinal").toBool()) { int desiredDistance = std::max(0, qRound(desiredFollowDistance * distanceConversion)); textLines.append(QString("%1 %2 (%3)").arg(distanceString, leadDistanceUnit, tr("Desired: %1").arg(desiredDistance))); } else { @@ -695,7 +695,7 @@ void FrogPilotAnnotatedCameraWidget::paintLeadMetrics(QPainter &p, bool adjacent } } -void FrogPilotAnnotatedCameraWidget::paintLongitudinalPaused(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintLongitudinalPaused(QPainter &p) { if (dmIconPosition == QPoint(0, 0)) { return; } @@ -727,7 +727,7 @@ void FrogPilotAnnotatedCameraWidget::paintLongitudinalPaused(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintPathEdges(QPainter &p, int height) { +void StarPilotAnnotatedCameraWidget::paintPathEdges(QPainter &p, int height) { p.save(); QLinearGradient gradient(0, height, 0, 0); @@ -738,16 +738,16 @@ void FrogPilotAnnotatedCameraWidget::paintPathEdges(QPainter &p, int height) { gradient.setColorAt(1.0f, QColor(baseColor.red(), baseColor.green(), baseColor.blue(), 255.0f * 0.0f)); }; - if (frogpilot_scene.always_on_lateral_active) { + if (starpilot_scene.always_on_lateral_active) { setPathEdgeColors(bg_colors[STATUS_ALWAYS_ON_LATERAL_ACTIVE]); - } else if (frogpilot_scene.conditional_status == 1) { + } else if (starpilot_scene.conditional_status == 1) { setPathEdgeColors(bg_colors[STATUS_CEM_DISABLED]); } else if (experimentalMode) { setPathEdgeColors(bg_colors[STATUS_EXPERIMENTAL_MODE_ENABLED]); - } else if (frogpilot_scene.traffic_mode_enabled) { + } else if (starpilot_scene.traffic_mode_enabled) { setPathEdgeColors(bg_colors[STATUS_TRAFFIC_MODE_ENABLED]); - } else if (frogpilot_toggles.value("color_scheme").toString() != "stock") { - setPathEdgeColors(QColor(frogpilot_toggles.value("path_edges_color").toString())); + } else if (starpilot_toggles.value("color_scheme").toString() != "stock") { + setPathEdgeColors(QColor(starpilot_toggles.value("path_edges_color").toString())); } else { gradient.setColorAt(0.0f, QColor::fromHslF(148.0f / 360.0f, 0.94f, 0.41f, 0.4f)); gradient.setColorAt(0.5f, QColor::fromHslF(112.0f / 360.0f, 1.0f, 0.54f, 0.35f)); @@ -764,17 +764,17 @@ void FrogPilotAnnotatedCameraWidget::paintPathEdges(QPainter &p, int height) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintPedalIcons(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintPedalIcons(QPainter &p) { p.save(); float brakeOpacity = 1.0f; float gasOpacity = 1.0f; - if (frogpilot_toggles.value("dynamic_pedals_on_ui").toBool()) { - brakeOpacity = frogpilot_scene.standstill ? 1.0f : accelerationEgo < -0.25f ? std::max(0.25f, std::abs(accelerationEgo)) : 0.25f; + if (starpilot_toggles.value("dynamic_pedals_on_ui").toBool()) { + brakeOpacity = starpilot_scene.standstill ? 1.0f : accelerationEgo < -0.25f ? std::max(0.25f, std::abs(accelerationEgo)) : 0.25f; gasOpacity = std::max(0.25f, accelerationEgo); - } else if (frogpilot_toggles.value("static_pedals_on_ui").toBool()) { - brakeOpacity = frogpilot_scene.standstill || brakeLights || accelerationEgo < -0.25f ? 1.0f : 0.25f; + } else if (starpilot_toggles.value("static_pedals_on_ui").toBool()) { + brakeOpacity = starpilot_scene.standstill || brakeLights || accelerationEgo < -0.25f ? 1.0f : 0.25f; gasOpacity = accelerationEgo > 0.25 ? 1.0f : 0.25f; } @@ -790,13 +790,13 @@ void FrogPilotAnnotatedCameraWidget::paintPedalIcons(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintPendingSpeedLimit(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintPendingSpeedLimit(QPainter &p) { p.save(); QString newSpeedLimitStr = (unconfirmedSpeedLimit > 1) ? QString::number(std::nearbyint(unconfirmedSpeedLimit * speedConversion)) : "–"; newSpeedLimitRect = speedLimitRect.translated(speedLimitRect.width() + UI_BORDER_SIZE, 0); - if (!frogpilot_toggles.value("speed_limit_vienna").toBool()) { + if (!starpilot_toggles.value("speed_limit_vienna").toBool()) { newSpeedLimitRect.setWidth(newSpeedLimitStr.size() >= 3 ? 200 : 175); p.setBrush(whiteColor()); @@ -825,7 +825,7 @@ void FrogPilotAnnotatedCameraWidget::paintPendingSpeedLimit(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintRainbowPath(QPainter &p, QLinearGradient &bg, float lin_grad_point) { +void StarPilotAnnotatedCameraWidget::paintRainbowPath(QPainter &p, QLinearGradient &bg, float lin_grad_point) { p.save(); static float hueOffset = 0.0f; @@ -846,7 +846,7 @@ void FrogPilotAnnotatedCameraWidget::paintRainbowPath(QPainter &p, QLinearGradie p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintRadarTracks(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintRadarTracks(QPainter &p) { if (radar_tracks.empty()) { return; } @@ -871,7 +871,7 @@ void FrogPilotAnnotatedCameraWidget::paintRadarTracks(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintRoadName(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintRoadName(QPainter &p) { if (roadName.isEmpty()) { return; } @@ -897,7 +897,7 @@ void FrogPilotAnnotatedCameraWidget::paintRoadName(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintSpeedLimit(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintSpeedLimit(QPainter &p) { if (setSpeedRect.isEmpty()) { return; } @@ -906,7 +906,7 @@ void FrogPilotAnnotatedCameraWidget::paintSpeedLimit(QPainter &p) { QString speedLimitStr = (speedLimit > 1) ? QString::number(std::nearbyint(speedLimit)) : "–"; - bool hasUsSpeedLimit = !frogpilot_toggles.value("speed_limit_vienna").toBool(); + bool hasUsSpeedLimit = !starpilot_toggles.value("speed_limit_vienna").toBool(); bool hasEuSpeedLimit = !hasUsSpeedLimit; int euSignSize = 176; @@ -935,7 +935,7 @@ void FrogPilotAnnotatedCameraWidget::paintSpeedLimit(QPainter &p) { p.drawRoundedRect(signRect.adjusted(9, 9, -9, -9), 16, 16); p.setOpacity(slcOverriddenSpeed == 0 ? 1.0 : 0.25); - if (slcOverriddenSpeed == 0 && frogpilot_toggles.value("show_speed_limit_offset").toBool()) { + if (slcOverriddenSpeed == 0 && starpilot_toggles.value("show_speed_limit_offset").toBool()) { p.setFont(InterFont(28, QFont::DemiBold)); p.drawText(signRect.adjusted(0, 22, 0, 0), Qt::AlignTop | Qt::AlignHCenter, tr("LIMIT")); p.setFont(InterFont(70, QFont::Bold)); @@ -960,7 +960,7 @@ void FrogPilotAnnotatedCameraWidget::paintSpeedLimit(QPainter &p) { p.setOpacity(slcOverriddenSpeed == 0 ? 1.0 : 0.25); p.setPen(blackColor()); - if (frogpilot_toggles.value("show_speed_limit_offset").toBool()) { + if (starpilot_toggles.value("show_speed_limit_offset").toBool()) { p.setFont(InterFont((speedLimitStr.size() >= 3) ? 60 : 70, QFont::Bold)); p.drawText(signRect.adjusted(0, -25, 0, 0), Qt::AlignCenter, speedLimitStr); p.setFont(InterFont(40, QFont::DemiBold)); @@ -974,7 +974,7 @@ void FrogPilotAnnotatedCameraWidget::paintSpeedLimit(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintSpeedLimitSources(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintSpeedLimitSources(QPainter &p) { p.save(); std::function drawSource = [&](QRect &rect, QPixmap &icon, const QString &title, double speedLimitValue) { @@ -1037,7 +1037,7 @@ void FrogPilotAnnotatedCameraWidget::paintSpeedLimitSources(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintStandstillTimer(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintStandstillTimer(QPainter &p) { p.save(); float transition = 0.0f; @@ -1083,14 +1083,14 @@ void FrogPilotAnnotatedCameraWidget::paintStandstillTimer(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintStoppingPoint(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintStoppingPoint(QPainter &p) { p.save(); QPointF centerPoint = (track_vertices.first() + track_vertices.last()) / 2.0f; QPointF stopSignPosition = centerPoint - QPointF(stopSignImg.width() / 2.0f, stopSignImg.height()); p.drawPixmap(stopSignPosition, stopSignImg); - if (frogpilot_toggles.value("show_stopping_point_metrics").toBool()) { + if (starpilot_toggles.value("show_stopping_point_metrics").toBool()) { float distance = stoppingDistance * distanceConversion; QString distanceText = QString::number(std::nearbyint(distance)) + leadDistanceUnit; @@ -1111,7 +1111,7 @@ void FrogPilotAnnotatedCameraWidget::paintStoppingPoint(QPainter &p) { p.restore(); } -void FrogPilotAnnotatedCameraWidget::paintTurnSignals(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintTurnSignals(QPainter &p) { int frameIndex = qBound(0, animationFrameIndex, totalFrames - 1); bool blindspotActive = blinkerLeft ? blindspotLeft : blindspotRight; @@ -1140,7 +1140,7 @@ void FrogPilotAnnotatedCameraWidget::paintTurnSignals(QPainter &p) { } } -void FrogPilotAnnotatedCameraWidget::paintWeather(QPainter &p) { +void StarPilotAnnotatedCameraWidget::paintWeather(QPainter &p) { if (weatherId == 0) { return; } diff --git a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h b/starpilot/ui/qt/onroad/starpilot_annotated_camera.h similarity index 93% rename from frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h rename to starpilot/ui/qt/onroad/starpilot_annotated_camera.h index fac5ffe1..77ace88e 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_annotated_camera.h +++ b/starpilot/ui/qt/onroad/starpilot_annotated_camera.h @@ -5,20 +5,20 @@ const int widget_size = img_size + (UI_BORDER_SIZE / 2); -class FrogPilotAnnotatedCameraWidget : public QWidget { +class StarPilotAnnotatedCameraWidget : public QWidget { Q_OBJECT public: - explicit FrogPilotAnnotatedCameraWidget(QWidget *parent = 0); + explicit StarPilotAnnotatedCameraWidget(QWidget *parent = 0); void mousePressEvent(QMouseEvent *mouseEvent) override; void paintAdjacentPaths(QPainter &p); void paintBlindSpotPath(QPainter &p); - void paintFrogPilotWidgets(QPainter &p, UIState &s); + void paintStarPilotWidgets(QPainter &p, UIState &s); void paintLeadMetrics(QPainter &p, bool adjacent, QPointF *chevron, const cereal::RadarState::LeadData::Reader &lead_data); void paintPathEdges(QPainter &p, int height); void paintRainbowPath(QPainter &p, QLinearGradient &bg, float lin_grad_point); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); bool hideBottomIcons; bool isCruiseSet; @@ -32,13 +32,13 @@ public: std::vector radar_tracks; - FrogPilotUIScene frogpilot_scene; + StarPilotUIScene starpilot_scene; QColor blueColor(int alpha = 255) { return QColor(0, 0, 255, alpha); } QColor purpleColor(int alpha = 255) { return QColor(128, 0, 128, alpha); } QColor whiteColor(int alpha = 255) { return QColor(255, 255, 255, alpha); } - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; QPoint dmIconPosition; QPoint experimentalButtonPosition; diff --git a/frogpilot/ui/qt/onroad/frogpilot_buttons.cc b/starpilot/ui/qt/onroad/starpilot_buttons.cc similarity index 81% rename from frogpilot/ui/qt/onroad/frogpilot_buttons.cc rename to starpilot/ui/qt/onroad/starpilot_buttons.cc index c6e49b93..6c799eca 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_buttons.cc +++ b/starpilot/ui/qt/onroad/starpilot_buttons.cc @@ -1,9 +1,9 @@ -#include "frogpilot/ui/qt/onroad/frogpilot_buttons.h" +#include "starpilot/ui/qt/onroad/starpilot_buttons.h" DrivingPersonalityButton::DrivingPersonalityButton(QWidget *parent) : QPushButton(parent) { setFixedSize(btn_size + UI_BORDER_SIZE, btn_size); - QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &DrivingPersonalityButton::updateTheme); + QObject::connect(starpilotUIState(), &StarPilotUIState::themeUpdated, this, &DrivingPersonalityButton::updateTheme); QObject::connect(this, &QPushButton::pressed, [this] {params_memory.putBool("OnroadDistanceButtonPressed", true);}); QObject::connect(this, &QPushButton::released, [this] {params_memory.putBool("OnroadDistanceButtonPressed", false);}); } @@ -26,10 +26,10 @@ void DrivingPersonalityButton::updateTheme() { QPixmap traffic_img, aggressive_img, standard_img, relaxed_img; QSharedPointer traffic_gif, aggressive_gif, standard_gif, relaxed_gif; - loadImage("../../frogpilot/assets/active_theme/distance_icons/traffic", traffic_img, traffic_gif, QSize(btn_size, btn_size), this); - loadImage("../../frogpilot/assets/active_theme/distance_icons/aggressive", aggressive_img, aggressive_gif, QSize(btn_size, btn_size), this); - loadImage("../../frogpilot/assets/active_theme/distance_icons/standard", standard_img, standard_gif, QSize(btn_size, btn_size), this); - loadImage("../../frogpilot/assets/active_theme/distance_icons/relaxed", relaxed_img, relaxed_gif, QSize(btn_size, btn_size), this); + loadImage("../../starpilot/assets/active_theme/distance_icons/traffic", traffic_img, traffic_gif, QSize(btn_size, btn_size), this); + loadImage("../../starpilot/assets/active_theme/distance_icons/aggressive", aggressive_img, aggressive_gif, QSize(btn_size, btn_size), this); + loadImage("../../starpilot/assets/active_theme/distance_icons/standard", standard_img, standard_gif, QSize(btn_size, btn_size), this); + loadImage("../../starpilot/assets/active_theme/distance_icons/relaxed", relaxed_img, relaxed_gif, QSize(btn_size, btn_size), this); icon_map.insert(0, qMakePair(traffic_img, traffic_gif)); icon_map.insert(1, qMakePair(aggressive_img, aggressive_gif)); @@ -39,14 +39,14 @@ void DrivingPersonalityButton::updateTheme() { theme_updated = true; } -void DrivingPersonalityButton::updateState(const UIState &s, const FrogPilotUIState &fs) { +void DrivingPersonalityButton::updateState(const UIState &s, const StarPilotUIState &fs) { const UIScene &scene = s.scene; const SubMaster &fpsm = *(fs.sm); - const cereal::FrogPilotCarState::Reader &frogpilotCarState = fpsm["frogpilotCarState"].getFrogpilotCarState(); + const cereal::StarPilotCarState::Reader &starpilotCarState = fpsm["starpilotCarState"].getStarpilotCarState(); - bool new_traffic_mode_active = frogpilotCarState.getTrafficModeEnabled(); + bool new_traffic_mode_active = starpilotCarState.getTrafficModeEnabled(); int new_personality = static_cast(scene.personality) + 1; diff --git a/frogpilot/ui/qt/onroad/frogpilot_buttons.h b/starpilot/ui/qt/onroad/starpilot_buttons.h similarity index 89% rename from frogpilot/ui/qt/onroad/frogpilot_buttons.h rename to starpilot/ui/qt/onroad/starpilot_buttons.h index 39ca243a..8df57ed5 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_buttons.h +++ b/starpilot/ui/qt/onroad/starpilot_buttons.h @@ -8,7 +8,7 @@ class DrivingPersonalityButton : public QPushButton { public: explicit DrivingPersonalityButton(QWidget *parent = 0); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); private: void paintEvent(QPaintEvent *event) override; diff --git a/frogpilot/ui/qt/onroad/frogpilot_onroad.cc b/starpilot/ui/qt/onroad/starpilot_onroad.cc similarity index 84% rename from frogpilot/ui/qt/onroad/frogpilot_onroad.cc rename to starpilot/ui/qt/onroad/starpilot_onroad.cc index 651c93ba..f8eff29e 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_onroad.cc +++ b/starpilot/ui/qt/onroad/starpilot_onroad.cc @@ -1,18 +1,18 @@ -#include "frogpilot/ui/qt/onroad/frogpilot_onroad.h" +#include "starpilot/ui/qt/onroad/starpilot_onroad.h" -FrogPilotOnroadWindow::FrogPilotOnroadWindow(QWidget *parent) : QWidget(parent) { +StarPilotOnroadWindow::StarPilotOnroadWindow(QWidget *parent) : QWidget(parent) { signalTimer = new QTimer(this); QObject::connect(signalTimer, &QTimer::timeout, [this] { flickerActive = !flickerActive; }); } -void FrogPilotOnroadWindow::resizeEvent(QResizeEvent *event) { +void StarPilotOnroadWindow::resizeEvent(QResizeEvent *event) { rect = QWidget::rect(); marginRegion = QRegion(rect) - QRegion(rect.marginsRemoved(QMargins(UI_BORDER_SIZE, UI_BORDER_SIZE, UI_BORDER_SIZE, UI_BORDER_SIZE))); } -void FrogPilotOnroadWindow::updateState(const UIState &s, const FrogPilotUIState &fs) { +void StarPilotOnroadWindow::updateState(const UIState &s, const StarPilotUIState &fs) { const SubMaster &sm = *(s.sm); const SubMaster &fpsm = *(fs.sm); @@ -25,10 +25,10 @@ void FrogPilotOnroadWindow::updateState(const UIState &s, const FrogPilotUIState turnSignalLeft = carState.getLeftBlinker(); turnSignalRight = carState.getRightBlinker(); - showBlindspot = (blindSpotLeft || blindSpotRight) && frogpilot_toggles.value("blind_spot_metrics").toBool(); - showFPS = frogpilot_toggles.value("show_fps").toBool(); - showSignal = (turnSignalLeft || turnSignalRight) && frogpilot_toggles.value("signal_metrics").toBool(); - showSteering = frogpilot_toggles.value("steering_metrics").toBool(); + showBlindspot = (blindSpotLeft || blindSpotRight) && starpilot_toggles.value("blind_spot_metrics").toBool(); + showFPS = starpilot_toggles.value("show_fps").toBool(); + showSignal = (turnSignalLeft || turnSignalRight) && starpilot_toggles.value("signal_metrics").toBool(); + showSteering = starpilot_toggles.value("steering_metrics").toBool(); if (showSteering) { float absTorque = std::abs(torque); @@ -89,7 +89,7 @@ void FrogPilotOnroadWindow::updateState(const UIState &s, const FrogPilotUIState update(); } -void FrogPilotOnroadWindow::paintEvent(QPaintEvent *event) { +void StarPilotOnroadWindow::paintEvent(QPaintEvent *event) { QPainter p(this); p.setClipRegion(marginRegion); @@ -108,7 +108,7 @@ void FrogPilotOnroadWindow::paintEvent(QPaintEvent *event) { } } -void FrogPilotOnroadWindow::paintFPS(QPainter &p) { +void StarPilotOnroadWindow::paintFPS(QPainter &p) { p.save(); p.setFont(InterFont(28, QFont::DemiBold)); @@ -122,7 +122,7 @@ void FrogPilotOnroadWindow::paintFPS(QPainter &p) { p.restore(); } -void FrogPilotOnroadWindow::paintSteeringTorqueBorder(QPainter &p) { +void StarPilotOnroadWindow::paintSteeringTorqueBorder(QPainter &p) { p.save(); QLinearGradient gradient(rect.topLeft(), rect.bottomLeft()); @@ -143,7 +143,7 @@ void FrogPilotOnroadWindow::paintSteeringTorqueBorder(QPainter &p) { p.restore(); } -void FrogPilotOnroadWindow::paintTurnSignalBorder(QPainter &p) { +void StarPilotOnroadWindow::paintTurnSignalBorder(QPainter &p) { p.save(); p.fillRect(rect.x(), rect.y(), rect.width() / 2, rect.height(), leftBorderColor); diff --git a/frogpilot/ui/qt/onroad/frogpilot_onroad.h b/starpilot/ui/qt/onroad/starpilot_onroad.h similarity index 75% rename from frogpilot/ui/qt/onroad/frogpilot_onroad.h rename to starpilot/ui/qt/onroad/starpilot_onroad.h index 1d3ff49b..16607336 100644 --- a/frogpilot/ui/qt/onroad/frogpilot_onroad.h +++ b/starpilot/ui/qt/onroad/starpilot_onroad.h @@ -2,21 +2,21 @@ #include "selfdrive/ui/qt/onroad/annotated_camera.h" -class FrogPilotOnroadWindow : public QWidget { +class StarPilotOnroadWindow : public QWidget { Q_OBJECT public: - FrogPilotOnroadWindow(QWidget* parent = 0); + StarPilotOnroadWindow(QWidget* parent = 0); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); float fps; - FrogPilotUIScene frogpilot_scene; + StarPilotUIScene starpilot_scene; QColor bg; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; private: void paintEvent(QPaintEvent *event); diff --git a/frogpilot/ui/qt/widgets/developer_sidebar.cc b/starpilot/ui/qt/widgets/developer_sidebar.cc similarity index 85% rename from frogpilot/ui/qt/widgets/developer_sidebar.cc rename to starpilot/ui/qt/widgets/developer_sidebar.cc index 5056f4e3..7fc18913 100644 --- a/frogpilot/ui/qt/widgets/developer_sidebar.cc +++ b/starpilot/ui/qt/widgets/developer_sidebar.cc @@ -1,4 +1,4 @@ -#include "frogpilot/ui/qt/widgets/developer_sidebar.h" +#include "starpilot/ui/qt/widgets/developer_sidebar.h" void DeveloperSidebar::drawMetric(QPainter &p, const QPair &label, QColor c, int y) { const QRect rect = {12, y, 275, 126}; @@ -25,7 +25,7 @@ DeveloperSidebar::DeveloperSidebar(QWidget *parent) : QFrame(parent) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); setFixedWidth(300); - QObject::connect(frogpilotUIState(), &FrogPilotUIState::themeUpdated, this, &DeveloperSidebar::updateToggles); + QObject::connect(starpilotUIState(), &StarPilotUIState::themeUpdated, this, &DeveloperSidebar::updateToggles); QObject::connect(uiState(), &UIState::offroadTransition, this, &DeveloperSidebar::resetVariables); QObject::connect(uiState(), &UIState::uiUpdate, this, &DeveloperSidebar::updateState); } @@ -35,18 +35,18 @@ void DeveloperSidebar::showEvent(QShowEvent *event) { } void DeveloperSidebar::updateToggles() { - FrogPilotUIState &fs = *frogpilotUIState(); - FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; - QJsonObject &frogpilot_toggles = frogpilot_scene.frogpilot_toggles; + StarPilotUIState &fs = *starpilotUIState(); + StarPilotUIScene &starpilot_scene = fs.starpilot_scene; + QJsonObject &starpilot_toggles = starpilot_scene.starpilot_toggles; metricAssignments.clear(); for (int i = 1; i <= 7; ++i) { QString key = QString("developer_sidebar_metric%1").arg(i); - int metricId = frogpilot_toggles.value(key).toInt(); + int metricId = starpilot_toggles.value(key).toInt(); metricAssignments.push_back(metricId); } - metricColor = QColor(frogpilot_toggles.value("sidebar_color1").toString()); + metricColor = QColor(starpilot_toggles.value("sidebar_color1").toString()); } void DeveloperSidebar::resetVariables() { @@ -56,25 +56,25 @@ void DeveloperSidebar::resetVariables() { totalEngagementTime = 0; } -void DeveloperSidebar::updateState(const UIState &s, const FrogPilotUIState &fs) { +void DeveloperSidebar::updateState(const UIState &s, const StarPilotUIState &fs) { if (!isVisible()) { return; } const SubMaster &sm = *(s.sm); - const FrogPilotUIScene &frogpilot_scene = fs.frogpilot_scene; + const StarPilotUIScene &starpilot_scene = fs.starpilot_scene; const SubMaster &fpsm = *(fs.sm); const cereal::CarControl::Reader &carControl = fpsm["carControl"].getCarControl(); const cereal::CarState::Reader &carState = sm["carState"].getCarState(); - const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan(); + const cereal::StarPilotPlan::Reader &starpilotPlan = fpsm["starpilotPlan"].getStarpilotPlan(); const cereal::LiveDelayData::Reader &liveDelay = fpsm["liveDelay"].getLiveDelay(); const cereal::LiveParametersData::Reader &liveParameters = fpsm["liveParameters"].getLiveParameters(); const cereal::LiveTorqueParametersData::Reader &liveTorqueParameters = fpsm["liveTorqueParameters"].getLiveTorqueParameters(); const bool is_metric = s.scene.is_metric; - const bool use_si = frogpilot_scene.frogpilot_toggles.value("use_si_metrics").toBool(); + const bool use_si = starpilot_scene.starpilot_toggles.value("use_si_metrics").toBool(); const QString accelerationUnit = (is_metric || use_si) ? tr(" m/s²") : tr(" ft/s²"); const float accelerationConversion = (is_metric || use_si) ? 1.0f : METER_TO_FOOT; @@ -84,9 +84,9 @@ void DeveloperSidebar::updateState(const UIState &s, const FrogPilotUIState &fs) maxAcceleration = std::max(maxAcceleration, acceleration); } - lateralEngagementTime += carControl.getLatActive() && !frogpilot_scene.reverse && !frogpilot_scene.standstill ? 1 : 0; - longitudinalEngagementTime += carControl.getLongActive() && !frogpilot_scene.reverse && !frogpilot_scene.standstill ? 1 : 0; - totalEngagementTime += !(frogpilot_scene.reverse || frogpilot_scene.standstill) || totalEngagementTime == 0 ? 1 : 0; + lateralEngagementTime += carControl.getLatActive() && !starpilot_scene.reverse && !starpilot_scene.standstill ? 1 : 0; + longitudinalEngagementTime += carControl.getLongActive() && !starpilot_scene.reverse && !starpilot_scene.standstill ? 1 : 0; + totalEngagementTime += !(starpilot_scene.reverse || starpilot_scene.standstill) || totalEngagementTime == 0 ? 1 : 0; static int maxSteerAngle = 0; int currentSteerAngle = fabs(carState.getSteeringAngleDeg()); @@ -117,17 +117,17 @@ void DeveloperSidebar::updateState(const UIState &s, const FrogPilotUIState &fs) } accelerationStatus = ItemStatus(QPair(tr("ACCEL"), QString::number(acceleration, 'f', 2) + accelerationUnit), metricColor); - accelerationJerkStatus = ItemStatus(QPair(tr("ACCEL JERK"), QString::number(frogpilotPlan.getAccelerationJerk())), metricColor); + accelerationJerkStatus = ItemStatus(QPair(tr("ACCEL JERK"), QString::number(starpilotPlan.getAccelerationJerk())), metricColor); actuatorAccelerationStatus = ItemStatus(QPair(tr("ACT ACCEL"), QString::number(carControl.getActuators().getAccel() * accelerationConversion, 'f', 2) + accelerationUnit), metricColor); - dangerFactorStatus = ItemStatus(QPair(tr("DANGER %"), QString::number(frogpilotPlan.getDangerFactor() * 100.0f, 'f', 2) + "%"), metricColor); - dangerJerkStatus = ItemStatus(QPair(tr("DANGER JERK"), QString::number(frogpilotPlan.getDangerJerk())), metricColor); + dangerFactorStatus = ItemStatus(QPair(tr("DANGER %"), QString::number(starpilotPlan.getDangerFactor() * 100.0f, 'f', 2) + "%"), metricColor); + dangerJerkStatus = ItemStatus(QPair(tr("DANGER JERK"), QString::number(starpilotPlan.getDangerJerk())), metricColor); delayStatus = ItemStatus(QPair(tr("STEER DELAY"), QString::number(liveDelay.getLateralDelay(), 'f', 5)), metricColor); frictionStatus = ItemStatus(QPair(tr("FRICTION"), QString::number(liveTorqueParameters.getFrictionCoefficientFiltered(), 'f', 5)), metricColor); latAccelStatus = ItemStatus(QPair(tr("LAT ACCEL"), QString::number(liveTorqueParameters.getLatAccelFactorFiltered(), 'f', 5)), metricColor); lateralEngagementStatus = ItemStatus(QPair(tr("LATERAL %"), QString::number((lateralEngagementTime / totalEngagementTime) * 100.0f, 'f', 2) + "%"), metricColor); longitudinalEngagementStatus = ItemStatus(QPair(tr("LONG %"), QString::number((longitudinalEngagementTime / totalEngagementTime) * 100.0f, 'f', 2) + "%"), metricColor); maxAccelerationStatus = ItemStatus(QPair(tr("MAX ACCEL"), QString::number(maxAcceleration, 'f', 2) + accelerationUnit), metricColor); - speedJerkStatus = ItemStatus(QPair(tr("SPEED JERK"), QString::number(frogpilotPlan.getSpeedJerk())), metricColor); + speedJerkStatus = ItemStatus(QPair(tr("SPEED JERK"), QString::number(starpilotPlan.getSpeedJerk())), metricColor); steerAngleStatus = ItemStatus(QPair(tr("STEER ANGLE"), steerLabel), metricColor); steerRatioStatus = ItemStatus(QPair(tr("STEER RATIO"), QString::number(liveParameters.getSteerRatio(), 'f', 5)), metricColor); stiffnessFactorStatus = ItemStatus(QPair(tr("STEER STIFF"), QString::number(liveParameters.getStiffnessFactor(), 'f', 5)), metricColor); diff --git a/frogpilot/ui/qt/widgets/developer_sidebar.h b/starpilot/ui/qt/widgets/developer_sidebar.h similarity index 94% rename from frogpilot/ui/qt/widgets/developer_sidebar.h rename to starpilot/ui/qt/widgets/developer_sidebar.h index 74d828ea..8d3183c3 100644 --- a/frogpilot/ui/qt/widgets/developer_sidebar.h +++ b/starpilot/ui/qt/widgets/developer_sidebar.h @@ -13,7 +13,7 @@ private: void paintEvent(QPaintEvent *event) override; void resetVariables(); void showEvent(QShowEvent *event); - void updateState(const UIState &s, const FrogPilotUIState &fs); + void updateState(const UIState &s, const StarPilotUIState &fs); void updateToggles(); double lateralEngagementTime; diff --git a/frogpilot/ui/qt/widgets/drive_stats.cc b/starpilot/ui/qt/widgets/drive_stats.cc similarity index 81% rename from frogpilot/ui/qt/widgets/drive_stats.cc rename to starpilot/ui/qt/widgets/drive_stats.cc index f52142ee..aaa5032f 100644 --- a/frogpilot/ui/qt/widgets/drive_stats.cc +++ b/starpilot/ui/qt/widgets/drive_stats.cc @@ -1,6 +1,6 @@ #include "selfdrive/ui/qt/request_repeater.h" -#include "frogpilot/ui/qt/widgets/drive_stats.h" +#include "starpilot/ui/qt/widgets/drive_stats.h" static QLabel *newLabel(const QString &text, const QString &type) { QLabel *label = new QLabel(text); @@ -17,7 +17,7 @@ DriveStats::DriveStats(QWidget *parent) : QFrame(parent) { addStatsLayouts(konik ? tr("ALL TIME (KONIK)") : tr("ALL TIME"), all); addStatsLayouts(konik ? tr("PAST WEEK (KONIK)") : tr("PAST WEEK"), week); - addStatsLayouts(tr("FROGPILOT"), frogPilot, true); + addStatsLayouts(tr("STARPILOT"), frogPilot, true); std::optional dongleId = getDongleId(); if (dongleId.has_value()) { @@ -32,7 +32,7 @@ DriveStats::DriveStats(QWidget *parent) : QFrame(parent) { border-radius: 10px; } - QLabel[type="frogpilot_title"] { font-size: 50px; font-weight: 500; color: #178643; } + QLabel[type="starpilot_title"] { font-size: 50px; font-weight: 500; color: #178643; } QLabel[type="number"] { font-size: 65px; font-weight: 400; } QLabel[type="title"] { font-size: 50px; font-weight: 500; } QLabel[type="unit"] { font-size: 50px; font-weight: 300; color: #A0A0A0; } @@ -45,13 +45,13 @@ void DriveStats::showEvent(QShowEvent *event) { updateStats(); } -void DriveStats::addStatsLayouts(const QString &title, StatsLabels &labels, bool FrogPilot) { +void DriveStats::addStatsLayouts(const QString &title, StatsLabels &labels, bool StarPilot) { QGridLayout *grid_layout = new QGridLayout; grid_layout->setVerticalSpacing(10); grid_layout->setContentsMargins(0, 10, 0, 10); int row = 0; - grid_layout->addWidget(newLabel(title, FrogPilot ? "frogpilot_title" : "title"), row++, 0, 1, 3); + grid_layout->addWidget(newLabel(title, StarPilot ? "starpilot_title" : "title"), row++, 0, 1, 3); grid_layout->addItem(new QSpacerItem(0, 10), row++, 0, 1, 1); grid_layout->addWidget(labels.routes = newLabel("0", "number"), row, 0, Qt::AlignLeft); @@ -88,13 +88,13 @@ void DriveStats::updateStatsForLabel(const QJsonObject &obj, StatsLabels &labels labels.routes->setText(QString::number((int)obj["routes"].toDouble())); } -void DriveStats::updateFrogPilotStatsForLabel(StatsLabels &labels) { - QJsonObject frogpilot_stats = QJsonDocument::fromJson(QByteArray::fromStdString(params.get("FrogPilotStats"))).object(); +void DriveStats::updateStarPilotStatsForLabel(StatsLabels &labels) { + QJsonObject starpilot_stats = QJsonDocument::fromJson(QByteArray::fromStdString(params.get("StarPilotStats"))).object(); - labels.distance->setText(QString::number(int(frogpilot_stats.value("FrogPilotMeters").toDouble() * (isMetric ? 0.001 : METER_TO_MILE)))); + labels.distance->setText(QString::number(int(starpilot_stats.value("StarPilotMeters").toDouble() * (isMetric ? 0.001 : METER_TO_MILE)))); labels.distance_unit->setText(isMetric ? tr("KM") : tr("Miles")); - labels.hours->setText(QString::number(int(frogpilot_stats.value("FrogPilotSeconds").toDouble() / (60 * 60)))); - labels.routes->setText(QString::number(frogpilot_stats.value("FrogPilotDrives").toInt())); + labels.hours->setText(QString::number(int(starpilot_stats.value("StarPilotSeconds").toDouble() / (60 * 60)))); + labels.routes->setText(QString::number(starpilot_stats.value("StarPilotDrives").toInt())); } void DriveStats::updateStats() { @@ -102,7 +102,7 @@ void DriveStats::updateStats() { updateStatsForLabel(json["all"].toObject(), all); updateStatsForLabel(json["week"].toObject(), week); - updateFrogPilotStatsForLabel(frogPilot); + updateStarPilotStatsForLabel(frogPilot); params.putIntNonBlocking(konik ? "KonikMinutes" : "openpilotMinutes", json["all"].toObject()["minutes"].toDouble()); } diff --git a/frogpilot/ui/qt/widgets/drive_stats.h b/starpilot/ui/qt/widgets/drive_stats.h similarity index 88% rename from frogpilot/ui/qt/widgets/drive_stats.h rename to starpilot/ui/qt/widgets/drive_stats.h index d9692998..9daba33a 100644 --- a/frogpilot/ui/qt/widgets/drive_stats.h +++ b/starpilot/ui/qt/widgets/drive_stats.h @@ -16,9 +16,9 @@ public: explicit DriveStats(QWidget *parent = 0); private: - void addStatsLayouts(const QString &title, StatsLabels &labels, bool FrogPilot = false); + void addStatsLayouts(const QString &title, StatsLabels &labels, bool StarPilot = false); void showEvent(QShowEvent *event) override; - void updateFrogPilotStatsForLabel(StatsLabels &labels); + void updateStarPilotStatsForLabel(StatsLabels &labels); void updateStats(); void updateStatsForLabel(const QJsonObject &obj, StatsLabels &labels); diff --git a/frogpilot/ui/qt/widgets/drive_summary.cc b/starpilot/ui/qt/widgets/drive_summary.cc similarity index 93% rename from frogpilot/ui/qt/widgets/drive_summary.cc rename to starpilot/ui/qt/widgets/drive_summary.cc index df6f5e51..c1844f13 100644 --- a/frogpilot/ui/qt/widgets/drive_summary.cc +++ b/starpilot/ui/qt/widgets/drive_summary.cc @@ -1,8 +1,8 @@ #include "selfdrive/ui/qt/widgets/scrollview.h" -#include "frogpilot/ui/qt/widgets/drive_summary.h" +#include "starpilot/ui/qt/widgets/drive_summary.h" -FrogPilotDriveSummary::FrogPilotDriveSummary(QWidget *parent, bool randomEvents) : QFrame(parent), displayRandomEvents(randomEvents) { +StarPilotDriveSummary::StarPilotDriveSummary(QWidget *parent, bool randomEvents) : QFrame(parent), displayRandomEvents(randomEvents) { QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(20, 20, 20, 20); mainLayout->setSpacing(15); @@ -70,19 +70,19 @@ FrogPilotDriveSummary::FrogPilotDriveSummary(QWidget *parent, bool randomEvents) }); QObject::connect(uiState(), &UIState::offroadTransition, [this](bool offroad) { if (!offroad) { - previousStats = QJsonDocument::fromJson(QString::fromStdString(params.get("FrogPilotStats")).toUtf8()).object(); + previousStats = QJsonDocument::fromJson(QString::fromStdString(params.get("StarPilotStats")).toUtf8()).object(); } }); } -void FrogPilotDriveSummary::mousePressEvent(QMouseEvent *e) { +void StarPilotDriveSummary::mousePressEvent(QMouseEvent *e) { emit panelClosed(); } -void FrogPilotDriveSummary::showEvent(QShowEvent *event) { +void StarPilotDriveSummary::showEvent(QShowEvent *event) { bool isMetric = params.getBool("IsMetric"); - QJsonObject currentStats = QJsonDocument::fromJson(QString::fromStdString(params.get("FrogPilotStats")).toUtf8()).object(); + QJsonObject currentStats = QJsonDocument::fromJson(QString::fromStdString(params.get("StarPilotStats")).toUtf8()).object(); if (displayRandomEvents) { QJsonObject currentRandomEvents = currentStats.value("RandomEvents").toObject(); @@ -178,16 +178,16 @@ void FrogPilotDriveSummary::showEvent(QShowEvent *event) { engagementValue->setText(QLocale().toString((trackedTime > 0) ? (engagedTime * 100 / trackedTime) : 0) + "%"); experimentalModeTimeValue->setText(QLocale().toString((trackedTime > 0) ? (experimentalTime * 100 / trackedTime) : 0) + "%"); - frogPilotMetersValue->setText(formatDistance(diffDouble("FrogPilotMeters"))); + frogPilotMetersValue->setText(formatDistance(diffDouble("StarPilotMeters"))); trackedTimeValue->setText(formatTime(trackedTime)); } } -void FrogPilotDriveSummary::hideEvent(QHideEvent *event) { +void StarPilotDriveSummary::hideEvent(QHideEvent *event) { emit panelClosed(); } -QWidget *FrogPilotDriveSummary::createStatBox(const QString &title, QLabel **valueLabel, QWidget *parent) { +QWidget *StarPilotDriveSummary::createStatBox(const QString &title, QLabel **valueLabel, QWidget *parent) { QWidget *box = new QWidget(parent); QVBoxLayout *layout = new QVBoxLayout(box); diff --git a/frogpilot/ui/qt/widgets/drive_summary.h b/starpilot/ui/qt/widgets/drive_summary.h similarity index 86% rename from frogpilot/ui/qt/widgets/drive_summary.h rename to starpilot/ui/qt/widgets/drive_summary.h index bea16c4f..ca0b36e3 100644 --- a/frogpilot/ui/qt/widgets/drive_summary.h +++ b/starpilot/ui/qt/widgets/drive_summary.h @@ -2,11 +2,11 @@ #include "selfdrive/ui/ui.h" -class FrogPilotDriveSummary : public QFrame { +class StarPilotDriveSummary : public QFrame { Q_OBJECT public: - explicit FrogPilotDriveSummary(QWidget *parent = nullptr, bool random_events = false); + explicit StarPilotDriveSummary(QWidget *parent = nullptr, bool random_events = false); signals: void panelClosed(); diff --git a/frogpilot/ui/qt/widgets/moc_developer_sidebar.cc b/starpilot/ui/qt/widgets/moc_developer_sidebar.cc similarity index 100% rename from frogpilot/ui/qt/widgets/moc_developer_sidebar.cc rename to starpilot/ui/qt/widgets/moc_developer_sidebar.cc diff --git a/frogpilot/ui/qt/widgets/moc_drive_stats.cc b/starpilot/ui/qt/widgets/moc_drive_stats.cc similarity index 100% rename from frogpilot/ui/qt/widgets/moc_drive_stats.cc rename to starpilot/ui/qt/widgets/moc_drive_stats.cc diff --git a/frogpilot/ui/qt/widgets/moc_drive_summary.cc b/starpilot/ui/qt/widgets/moc_drive_summary.cc similarity index 74% rename from frogpilot/ui/qt/widgets/moc_drive_summary.cc rename to starpilot/ui/qt/widgets/moc_drive_summary.cc index ea4bb82c..052e9ef3 100644 --- a/frogpilot/ui/qt/widgets/moc_drive_summary.cc +++ b/starpilot/ui/qt/widgets/moc_drive_summary.cc @@ -20,27 +20,27 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotDriveSummary_t { +struct qt_meta_stringdata_StarPilotDriveSummary_t { QByteArrayData data[3]; char stringdata0[35]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotDriveSummary_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotDriveSummary_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotDriveSummary_t qt_meta_stringdata_FrogPilotDriveSummary = { +static const qt_meta_stringdata_StarPilotDriveSummary_t qt_meta_stringdata_StarPilotDriveSummary = { { -QT_MOC_LITERAL(0, 0, 21), // "FrogPilotDriveSummary" +QT_MOC_LITERAL(0, 0, 21), // "StarPilotDriveSummary" QT_MOC_LITERAL(1, 22, 11), // "panelClosed" QT_MOC_LITERAL(2, 34, 0) // "" }, - "FrogPilotDriveSummary\0panelClosed\0" + "StarPilotDriveSummary\0panelClosed\0" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotDriveSummary[] = { +static const uint qt_meta_data_StarPilotDriveSummary[] = { // content: 8, // revision @@ -62,10 +62,10 @@ static const uint qt_meta_data_FrogPilotDriveSummary[] = { 0 // eod }; -void FrogPilotDriveSummary::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotDriveSummary::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->panelClosed(); break; @@ -74,8 +74,8 @@ void FrogPilotDriveSummary::qt_static_metacall(QObject *_o, QMetaObject::Call _c } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotDriveSummary::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotDriveSummary::panelClosed)) { + using _t = void (StarPilotDriveSummary::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotDriveSummary::panelClosed)) { *result = 0; return; } @@ -84,30 +84,30 @@ void FrogPilotDriveSummary::qt_static_metacall(QObject *_o, QMetaObject::Call _c Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotDriveSummary::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotDriveSummary::staticMetaObject = { { &QFrame::staticMetaObject, - qt_meta_stringdata_FrogPilotDriveSummary.data, - qt_meta_data_FrogPilotDriveSummary, + qt_meta_stringdata_StarPilotDriveSummary.data, + qt_meta_data_StarPilotDriveSummary, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotDriveSummary::metaObject() const +const QMetaObject *StarPilotDriveSummary::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotDriveSummary::qt_metacast(const char *_clname) +void *StarPilotDriveSummary::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotDriveSummary.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotDriveSummary.stringdata0)) return static_cast(this); return QFrame::qt_metacast(_clname); } -int FrogPilotDriveSummary::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotDriveSummary::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QFrame::qt_metacall(_c, _id, _a); if (_id < 0) @@ -125,7 +125,7 @@ int FrogPilotDriveSummary::qt_metacall(QMetaObject::Call _c, int _id, void **_a) } // SIGNAL 0 -void FrogPilotDriveSummary::panelClosed() +void StarPilotDriveSummary::panelClosed() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } diff --git a/frogpilot/ui/qt/widgets/moc_navigation_functions.cc b/starpilot/ui/qt/widgets/moc_navigation_functions.cc similarity index 100% rename from frogpilot/ui/qt/widgets/moc_navigation_functions.cc rename to starpilot/ui/qt/widgets/moc_navigation_functions.cc diff --git a/frogpilot/ui/qt/widgets/moc_frogpilot_controls.cc b/starpilot/ui/qt/widgets/moc_starpilot_controls.cc similarity index 64% rename from frogpilot/ui/qt/widgets/moc_frogpilot_controls.cc rename to starpilot/ui/qt/widgets/moc_starpilot_controls.cc index b48e5011..1551ecad 100644 --- a/frogpilot/ui/qt/widgets/moc_frogpilot_controls.cc +++ b/starpilot/ui/qt/widgets/moc_starpilot_controls.cc @@ -1,16 +1,16 @@ /**************************************************************************** -** Meta object code from reading C++ file 'frogpilot_controls.h' +** Meta object code from reading C++ file 'starpilot_controls.h' ** ** Created by: The Qt Meta Object Compiler version 67 (Qt 5.12.8) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ -#include "frogpilot_controls.h" +#include "starpilot_controls.h" #include #include #if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'frogpilot_controls.h' doesn't include ." +#error "The header file 'starpilot_controls.h' doesn't include ." #elif Q_MOC_OUTPUT_REVISION != 67 #error "This file was generated using the moc from 5.12.8. It" #error "cannot be used with the include files from this version of Qt." @@ -20,25 +20,25 @@ QT_BEGIN_MOC_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED -struct qt_meta_stringdata_FrogPilotConfirmationDialog_t { +struct qt_meta_stringdata_StarPilotConfirmationDialog_t { QByteArrayData data[1]; char stringdata0[28]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotConfirmationDialog_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotConfirmationDialog_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotConfirmationDialog_t qt_meta_stringdata_FrogPilotConfirmationDialog = { +static const qt_meta_stringdata_StarPilotConfirmationDialog_t qt_meta_stringdata_StarPilotConfirmationDialog = { { -QT_MOC_LITERAL(0, 0, 27) // "FrogPilotConfirmationDialog" +QT_MOC_LITERAL(0, 0, 27) // "StarPilotConfirmationDialog" }, - "FrogPilotConfirmationDialog" + "StarPilotConfirmationDialog" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotConfirmationDialog[] = { +static const uint qt_meta_data_StarPilotConfirmationDialog[] = { // content: 8, // revision @@ -54,7 +54,7 @@ static const uint qt_meta_data_FrogPilotConfirmationDialog[] = { 0 // eod }; -void FrogPilotConfirmationDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotConfirmationDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -62,53 +62,53 @@ void FrogPilotConfirmationDialog::qt_static_metacall(QObject *_o, QMetaObject::C Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotConfirmationDialog::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotConfirmationDialog::staticMetaObject = { { &ConfirmationDialog::staticMetaObject, - qt_meta_stringdata_FrogPilotConfirmationDialog.data, - qt_meta_data_FrogPilotConfirmationDialog, + qt_meta_stringdata_StarPilotConfirmationDialog.data, + qt_meta_data_StarPilotConfirmationDialog, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotConfirmationDialog::metaObject() const +const QMetaObject *StarPilotConfirmationDialog::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotConfirmationDialog::qt_metacast(const char *_clname) +void *StarPilotConfirmationDialog::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotConfirmationDialog.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotConfirmationDialog.stringdata0)) return static_cast(this); return ConfirmationDialog::qt_metacast(_clname); } -int FrogPilotConfirmationDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotConfirmationDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = ConfirmationDialog::qt_metacall(_c, _id, _a); return _id; } -struct qt_meta_stringdata_FrogPilotListWidget_t { +struct qt_meta_stringdata_StarPilotListWidget_t { QByteArrayData data[1]; char stringdata0[20]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotListWidget_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotListWidget_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotListWidget_t qt_meta_stringdata_FrogPilotListWidget = { +static const qt_meta_stringdata_StarPilotListWidget_t qt_meta_stringdata_StarPilotListWidget = { { -QT_MOC_LITERAL(0, 0, 19) // "FrogPilotListWidget" +QT_MOC_LITERAL(0, 0, 19) // "StarPilotListWidget" }, - "FrogPilotListWidget" + "StarPilotListWidget" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotListWidget[] = { +static const uint qt_meta_data_StarPilotListWidget[] = { // content: 8, // revision @@ -124,7 +124,7 @@ static const uint qt_meta_data_FrogPilotListWidget[] = { 0 // eod }; -void FrogPilotListWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotListWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -132,57 +132,57 @@ void FrogPilotListWidget::qt_static_metacall(QObject *_o, QMetaObject::Call _c, Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotListWidget::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotListWidget::staticMetaObject = { { &QWidget::staticMetaObject, - qt_meta_stringdata_FrogPilotListWidget.data, - qt_meta_data_FrogPilotListWidget, + qt_meta_stringdata_StarPilotListWidget.data, + qt_meta_data_StarPilotListWidget, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotListWidget::metaObject() const +const QMetaObject *StarPilotListWidget::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotListWidget::qt_metacast(const char *_clname) +void *StarPilotListWidget::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotListWidget.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotListWidget.stringdata0)) return static_cast(this); return QWidget::qt_metacast(_clname); } -int FrogPilotListWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotListWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QWidget::qt_metacall(_c, _id, _a); return _id; } -struct qt_meta_stringdata_FrogPilotButtonControl_t { +struct qt_meta_stringdata_StarPilotButtonControl_t { QByteArrayData data[4]; char stringdata0[41]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotButtonControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotButtonControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotButtonControl_t qt_meta_stringdata_FrogPilotButtonControl = { +static const qt_meta_stringdata_StarPilotButtonControl_t qt_meta_stringdata_StarPilotButtonControl = { { -QT_MOC_LITERAL(0, 0, 22), // "FrogPilotButtonControl" +QT_MOC_LITERAL(0, 0, 22), // "StarPilotButtonControl" QT_MOC_LITERAL(1, 23, 13), // "buttonClicked" QT_MOC_LITERAL(2, 37, 0), // "" QT_MOC_LITERAL(3, 38, 2) // "id" }, - "FrogPilotButtonControl\0buttonClicked\0" + "StarPilotButtonControl\0buttonClicked\0" "\0id" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotButtonControl[] = { +static const uint qt_meta_data_StarPilotButtonControl[] = { // content: 8, // revision @@ -204,10 +204,10 @@ static const uint qt_meta_data_FrogPilotButtonControl[] = { 0 // eod }; -void FrogPilotButtonControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotButtonControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->buttonClicked((*reinterpret_cast< int(*)>(_a[1]))); break; @@ -216,8 +216,8 @@ void FrogPilotButtonControl::qt_static_metacall(QObject *_o, QMetaObject::Call _ } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotButtonControl::*)(int ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotButtonControl::buttonClicked)) { + using _t = void (StarPilotButtonControl::*)(int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotButtonControl::buttonClicked)) { *result = 0; return; } @@ -225,30 +225,30 @@ void FrogPilotButtonControl::qt_static_metacall(QObject *_o, QMetaObject::Call _ } } -QT_INIT_METAOBJECT const QMetaObject FrogPilotButtonControl::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotButtonControl::staticMetaObject = { { &ParamControl::staticMetaObject, - qt_meta_stringdata_FrogPilotButtonControl.data, - qt_meta_data_FrogPilotButtonControl, + qt_meta_stringdata_StarPilotButtonControl.data, + qt_meta_data_StarPilotButtonControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotButtonControl::metaObject() const +const QMetaObject *StarPilotButtonControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotButtonControl::qt_metacast(const char *_clname) +void *StarPilotButtonControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotButtonControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotButtonControl.stringdata0)) return static_cast(this); return ParamControl::qt_metacast(_clname); } -int FrogPilotButtonControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotButtonControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = ParamControl::qt_metacall(_c, _id, _a); if (_id < 0) @@ -266,35 +266,35 @@ int FrogPilotButtonControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a } // SIGNAL 0 -void FrogPilotButtonControl::buttonClicked(int _t1) +void StarPilotButtonControl::buttonClicked(int _t1) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); } -struct qt_meta_stringdata_FrogPilotButtonsControl_t { +struct qt_meta_stringdata_StarPilotButtonsControl_t { QByteArrayData data[5]; char stringdata0[64]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotButtonsControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotButtonsControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotButtonsControl_t qt_meta_stringdata_FrogPilotButtonsControl = { +static const qt_meta_stringdata_StarPilotButtonsControl_t qt_meta_stringdata_StarPilotButtonsControl = { { -QT_MOC_LITERAL(0, 0, 23), // "FrogPilotButtonsControl" +QT_MOC_LITERAL(0, 0, 23), // "StarPilotButtonsControl" QT_MOC_LITERAL(1, 24, 13), // "buttonClicked" QT_MOC_LITERAL(2, 38, 0), // "" QT_MOC_LITERAL(3, 39, 2), // "id" QT_MOC_LITERAL(4, 42, 21) // "disabledButtonClicked" }, - "FrogPilotButtonsControl\0buttonClicked\0" + "StarPilotButtonsControl\0buttonClicked\0" "\0id\0disabledButtonClicked" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotButtonsControl[] = { +static const uint qt_meta_data_StarPilotButtonsControl[] = { // content: 8, // revision @@ -318,10 +318,10 @@ static const uint qt_meta_data_FrogPilotButtonsControl[] = { 0 // eod }; -void FrogPilotButtonsControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotButtonsControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->buttonClicked((*reinterpret_cast< int(*)>(_a[1]))); break; @@ -331,15 +331,15 @@ void FrogPilotButtonsControl::qt_static_metacall(QObject *_o, QMetaObject::Call } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotButtonsControl::*)(int ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotButtonsControl::buttonClicked)) { + using _t = void (StarPilotButtonsControl::*)(int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotButtonsControl::buttonClicked)) { *result = 0; return; } } { - using _t = void (FrogPilotButtonsControl::*)(int ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotButtonsControl::disabledButtonClicked)) { + using _t = void (StarPilotButtonsControl::*)(int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotButtonsControl::disabledButtonClicked)) { *result = 1; return; } @@ -347,30 +347,30 @@ void FrogPilotButtonsControl::qt_static_metacall(QObject *_o, QMetaObject::Call } } -QT_INIT_METAOBJECT const QMetaObject FrogPilotButtonsControl::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotButtonsControl::staticMetaObject = { { &AbstractControl::staticMetaObject, - qt_meta_stringdata_FrogPilotButtonsControl.data, - qt_meta_data_FrogPilotButtonsControl, + qt_meta_stringdata_StarPilotButtonsControl.data, + qt_meta_data_StarPilotButtonsControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotButtonsControl::metaObject() const +const QMetaObject *StarPilotButtonsControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotButtonsControl::qt_metacast(const char *_clname) +void *StarPilotButtonsControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotButtonsControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotButtonsControl.stringdata0)) return static_cast(this); return AbstractControl::qt_metacast(_clname); } -int FrogPilotButtonsControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotButtonsControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = AbstractControl::qt_metacall(_c, _id, _a); if (_id < 0) @@ -388,37 +388,37 @@ int FrogPilotButtonsControl::qt_metacall(QMetaObject::Call _c, int _id, void **_ } // SIGNAL 0 -void FrogPilotButtonsControl::buttonClicked(int _t1) +void StarPilotButtonsControl::buttonClicked(int _t1) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); } // SIGNAL 1 -void FrogPilotButtonsControl::disabledButtonClicked(int _t1) +void StarPilotButtonsControl::disabledButtonClicked(int _t1) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 1, _a); } -struct qt_meta_stringdata_FrogPilotButtonToggleControl_t { +struct qt_meta_stringdata_StarPilotButtonToggleControl_t { QByteArrayData data[1]; char stringdata0[29]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotButtonToggleControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotButtonToggleControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotButtonToggleControl_t qt_meta_stringdata_FrogPilotButtonToggleControl = { +static const qt_meta_stringdata_StarPilotButtonToggleControl_t qt_meta_stringdata_StarPilotButtonToggleControl = { { -QT_MOC_LITERAL(0, 0, 28) // "FrogPilotButtonToggleControl" +QT_MOC_LITERAL(0, 0, 28) // "StarPilotButtonToggleControl" }, - "FrogPilotButtonToggleControl" + "StarPilotButtonToggleControl" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotButtonToggleControl[] = { +static const uint qt_meta_data_StarPilotButtonToggleControl[] = { // content: 8, // revision @@ -434,7 +434,7 @@ static const uint qt_meta_data_FrogPilotButtonToggleControl[] = { 0 // eod }; -void FrogPilotButtonToggleControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotButtonToggleControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -442,56 +442,56 @@ void FrogPilotButtonToggleControl::qt_static_metacall(QObject *_o, QMetaObject:: Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotButtonToggleControl::staticMetaObject = { { - &FrogPilotButtonControl::staticMetaObject, - qt_meta_stringdata_FrogPilotButtonToggleControl.data, - qt_meta_data_FrogPilotButtonToggleControl, +QT_INIT_METAOBJECT const QMetaObject StarPilotButtonToggleControl::staticMetaObject = { { + &StarPilotButtonControl::staticMetaObject, + qt_meta_stringdata_StarPilotButtonToggleControl.data, + qt_meta_data_StarPilotButtonToggleControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotButtonToggleControl::metaObject() const +const QMetaObject *StarPilotButtonToggleControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotButtonToggleControl::qt_metacast(const char *_clname) +void *StarPilotButtonToggleControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotButtonToggleControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotButtonToggleControl.stringdata0)) return static_cast(this); - return FrogPilotButtonControl::qt_metacast(_clname); + return StarPilotButtonControl::qt_metacast(_clname); } -int FrogPilotButtonToggleControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotButtonToggleControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotButtonControl::qt_metacall(_c, _id, _a); + _id = StarPilotButtonControl::qt_metacall(_c, _id, _a); return _id; } -struct qt_meta_stringdata_FrogPilotManageControl_t { +struct qt_meta_stringdata_StarPilotManageControl_t { QByteArrayData data[3]; char stringdata0[44]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotManageControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotManageControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotManageControl_t qt_meta_stringdata_FrogPilotManageControl = { +static const qt_meta_stringdata_StarPilotManageControl_t qt_meta_stringdata_StarPilotManageControl = { { -QT_MOC_LITERAL(0, 0, 22), // "FrogPilotManageControl" +QT_MOC_LITERAL(0, 0, 22), // "StarPilotManageControl" QT_MOC_LITERAL(1, 23, 19), // "manageButtonClicked" QT_MOC_LITERAL(2, 43, 0) // "" }, - "FrogPilotManageControl\0manageButtonClicked\0" + "StarPilotManageControl\0manageButtonClicked\0" "" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotManageControl[] = { +static const uint qt_meta_data_StarPilotManageControl[] = { // content: 8, // revision @@ -513,10 +513,10 @@ static const uint qt_meta_data_FrogPilotManageControl[] = { 0 // eod }; -void FrogPilotManageControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotManageControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->manageButtonClicked(); break; @@ -525,8 +525,8 @@ void FrogPilotManageControl::qt_static_metacall(QObject *_o, QMetaObject::Call _ } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotManageControl::*)(); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotManageControl::manageButtonClicked)) { + using _t = void (StarPilotManageControl::*)(); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotManageControl::manageButtonClicked)) { *result = 0; return; } @@ -535,30 +535,30 @@ void FrogPilotManageControl::qt_static_metacall(QObject *_o, QMetaObject::Call _ Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotManageControl::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotManageControl::staticMetaObject = { { &ParamControl::staticMetaObject, - qt_meta_stringdata_FrogPilotManageControl.data, - qt_meta_data_FrogPilotManageControl, + qt_meta_stringdata_StarPilotManageControl.data, + qt_meta_data_StarPilotManageControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotManageControl::metaObject() const +const QMetaObject *StarPilotManageControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotManageControl::qt_metacast(const char *_clname) +void *StarPilotManageControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotManageControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotManageControl.stringdata0)) return static_cast(this); return ParamControl::qt_metacast(_clname); } -int FrogPilotManageControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotManageControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = ParamControl::qt_metacall(_c, _id, _a); if (_id < 0) @@ -576,33 +576,33 @@ int FrogPilotManageControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a } // SIGNAL 0 -void FrogPilotManageControl::manageButtonClicked() +void StarPilotManageControl::manageButtonClicked() { QMetaObject::activate(this, &staticMetaObject, 0, nullptr); } -struct qt_meta_stringdata_FrogPilotParamValueControl_t { +struct qt_meta_stringdata_StarPilotParamValueControl_t { QByteArrayData data[4]; char stringdata0[47]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotParamValueControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotParamValueControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotParamValueControl_t qt_meta_stringdata_FrogPilotParamValueControl = { +static const qt_meta_stringdata_StarPilotParamValueControl_t qt_meta_stringdata_StarPilotParamValueControl = { { -QT_MOC_LITERAL(0, 0, 26), // "FrogPilotParamValueControl" +QT_MOC_LITERAL(0, 0, 26), // "StarPilotParamValueControl" QT_MOC_LITERAL(1, 27, 12), // "valueChanged" QT_MOC_LITERAL(2, 40, 0), // "" QT_MOC_LITERAL(3, 41, 5) // "value" }, - "FrogPilotParamValueControl\0valueChanged\0" + "StarPilotParamValueControl\0valueChanged\0" "\0value" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotParamValueControl[] = { +static const uint qt_meta_data_StarPilotParamValueControl[] = { // content: 8, // revision @@ -624,10 +624,10 @@ static const uint qt_meta_data_FrogPilotParamValueControl[] = { 0 // eod }; -void FrogPilotParamValueControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotParamValueControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->valueChanged((*reinterpret_cast< float(*)>(_a[1]))); break; @@ -636,8 +636,8 @@ void FrogPilotParamValueControl::qt_static_metacall(QObject *_o, QMetaObject::Ca } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotParamValueControl::*)(float ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotParamValueControl::valueChanged)) { + using _t = void (StarPilotParamValueControl::*)(float ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotParamValueControl::valueChanged)) { *result = 0; return; } @@ -645,30 +645,30 @@ void FrogPilotParamValueControl::qt_static_metacall(QObject *_o, QMetaObject::Ca } } -QT_INIT_METAOBJECT const QMetaObject FrogPilotParamValueControl::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotParamValueControl::staticMetaObject = { { &AbstractControl::staticMetaObject, - qt_meta_stringdata_FrogPilotParamValueControl.data, - qt_meta_data_FrogPilotParamValueControl, + qt_meta_stringdata_StarPilotParamValueControl.data, + qt_meta_data_StarPilotParamValueControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotParamValueControl::metaObject() const +const QMetaObject *StarPilotParamValueControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotParamValueControl::qt_metacast(const char *_clname) +void *StarPilotParamValueControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotParamValueControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotParamValueControl.stringdata0)) return static_cast(this); return AbstractControl::qt_metacast(_clname); } -int FrogPilotParamValueControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotParamValueControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = AbstractControl::qt_metacall(_c, _id, _a); if (_id < 0) @@ -686,34 +686,34 @@ int FrogPilotParamValueControl::qt_metacall(QMetaObject::Call _c, int _id, void } // SIGNAL 0 -void FrogPilotParamValueControl::valueChanged(float _t1) +void StarPilotParamValueControl::valueChanged(float _t1) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); } -struct qt_meta_stringdata_FrogPilotParamValueButtonControl_t { +struct qt_meta_stringdata_StarPilotParamValueButtonControl_t { QByteArrayData data[4]; char stringdata0[51]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotParamValueButtonControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotParamValueButtonControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotParamValueButtonControl_t qt_meta_stringdata_FrogPilotParamValueButtonControl = { +static const qt_meta_stringdata_StarPilotParamValueButtonControl_t qt_meta_stringdata_StarPilotParamValueButtonControl = { { -QT_MOC_LITERAL(0, 0, 32), // "FrogPilotParamValueButtonControl" +QT_MOC_LITERAL(0, 0, 32), // "StarPilotParamValueButtonControl" QT_MOC_LITERAL(1, 33, 13), // "buttonClicked" QT_MOC_LITERAL(2, 47, 0), // "" QT_MOC_LITERAL(3, 48, 2) // "id" }, - "FrogPilotParamValueButtonControl\0" + "StarPilotParamValueButtonControl\0" "buttonClicked\0\0id" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotParamValueButtonControl[] = { +static const uint qt_meta_data_StarPilotParamValueButtonControl[] = { // content: 8, // revision @@ -735,10 +735,10 @@ static const uint qt_meta_data_FrogPilotParamValueButtonControl[] = { 0 // eod }; -void FrogPilotParamValueButtonControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotParamValueButtonControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::InvokeMetaMethod) { - auto *_t = static_cast(_o); + auto *_t = static_cast(_o); Q_UNUSED(_t) switch (_id) { case 0: _t->buttonClicked((*reinterpret_cast< int(*)>(_a[1]))); break; @@ -747,8 +747,8 @@ void FrogPilotParamValueButtonControl::qt_static_metacall(QObject *_o, QMetaObje } else if (_c == QMetaObject::IndexOfMethod) { int *result = reinterpret_cast(_a[0]); { - using _t = void (FrogPilotParamValueButtonControl::*)(int ); - if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&FrogPilotParamValueButtonControl::buttonClicked)) { + using _t = void (StarPilotParamValueButtonControl::*)(int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&StarPilotParamValueButtonControl::buttonClicked)) { *result = 0; return; } @@ -756,32 +756,32 @@ void FrogPilotParamValueButtonControl::qt_static_metacall(QObject *_o, QMetaObje } } -QT_INIT_METAOBJECT const QMetaObject FrogPilotParamValueButtonControl::staticMetaObject = { { - &FrogPilotParamValueControl::staticMetaObject, - qt_meta_stringdata_FrogPilotParamValueButtonControl.data, - qt_meta_data_FrogPilotParamValueButtonControl, +QT_INIT_METAOBJECT const QMetaObject StarPilotParamValueButtonControl::staticMetaObject = { { + &StarPilotParamValueControl::staticMetaObject, + qt_meta_stringdata_StarPilotParamValueButtonControl.data, + qt_meta_data_StarPilotParamValueButtonControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotParamValueButtonControl::metaObject() const +const QMetaObject *StarPilotParamValueButtonControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotParamValueButtonControl::qt_metacast(const char *_clname) +void *StarPilotParamValueButtonControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotParamValueButtonControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotParamValueButtonControl.stringdata0)) return static_cast(this); - return FrogPilotParamValueControl::qt_metacast(_clname); + return StarPilotParamValueControl::qt_metacast(_clname); } -int FrogPilotParamValueButtonControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotParamValueButtonControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { - _id = FrogPilotParamValueControl::qt_metacall(_c, _id, _a); + _id = StarPilotParamValueControl::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { @@ -797,30 +797,30 @@ int FrogPilotParamValueButtonControl::qt_metacall(QMetaObject::Call _c, int _id, } // SIGNAL 0 -void FrogPilotParamValueButtonControl::buttonClicked(int _t1) +void StarPilotParamValueButtonControl::buttonClicked(int _t1) { void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)) }; QMetaObject::activate(this, &staticMetaObject, 0, _a); } -struct qt_meta_stringdata_FrogPilotDualParamValueControl_t { +struct qt_meta_stringdata_StarPilotDualParamValueControl_t { QByteArrayData data[1]; char stringdata0[31]; }; #define QT_MOC_LITERAL(idx, ofs, len) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ - qptrdiff(offsetof(qt_meta_stringdata_FrogPilotDualParamValueControl_t, stringdata0) + ofs \ + qptrdiff(offsetof(qt_meta_stringdata_StarPilotDualParamValueControl_t, stringdata0) + ofs \ - idx * sizeof(QByteArrayData)) \ ) -static const qt_meta_stringdata_FrogPilotDualParamValueControl_t qt_meta_stringdata_FrogPilotDualParamValueControl = { +static const qt_meta_stringdata_StarPilotDualParamValueControl_t qt_meta_stringdata_StarPilotDualParamValueControl = { { -QT_MOC_LITERAL(0, 0, 30) // "FrogPilotDualParamValueControl" +QT_MOC_LITERAL(0, 0, 30) // "StarPilotDualParamValueControl" }, - "FrogPilotDualParamValueControl" + "StarPilotDualParamValueControl" }; #undef QT_MOC_LITERAL -static const uint qt_meta_data_FrogPilotDualParamValueControl[] = { +static const uint qt_meta_data_StarPilotDualParamValueControl[] = { // content: 8, // revision @@ -836,7 +836,7 @@ static const uint qt_meta_data_FrogPilotDualParamValueControl[] = { 0 // eod }; -void FrogPilotDualParamValueControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +void StarPilotDualParamValueControl::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { Q_UNUSED(_o); Q_UNUSED(_id); @@ -844,30 +844,30 @@ void FrogPilotDualParamValueControl::qt_static_metacall(QObject *_o, QMetaObject Q_UNUSED(_a); } -QT_INIT_METAOBJECT const QMetaObject FrogPilotDualParamValueControl::staticMetaObject = { { +QT_INIT_METAOBJECT const QMetaObject StarPilotDualParamValueControl::staticMetaObject = { { &QFrame::staticMetaObject, - qt_meta_stringdata_FrogPilotDualParamValueControl.data, - qt_meta_data_FrogPilotDualParamValueControl, + qt_meta_stringdata_StarPilotDualParamValueControl.data, + qt_meta_data_StarPilotDualParamValueControl, qt_static_metacall, nullptr, nullptr } }; -const QMetaObject *FrogPilotDualParamValueControl::metaObject() const +const QMetaObject *StarPilotDualParamValueControl::metaObject() const { return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; } -void *FrogPilotDualParamValueControl::qt_metacast(const char *_clname) +void *StarPilotDualParamValueControl::qt_metacast(const char *_clname) { if (!_clname) return nullptr; - if (!strcmp(_clname, qt_meta_stringdata_FrogPilotDualParamValueControl.stringdata0)) + if (!strcmp(_clname, qt_meta_stringdata_StarPilotDualParamValueControl.stringdata0)) return static_cast(this); return QFrame::qt_metacast(_clname); } -int FrogPilotDualParamValueControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +int StarPilotDualParamValueControl::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QFrame::qt_metacall(_c, _id, _a); return _id; diff --git a/frogpilot/ui/qt/widgets/navigation_functions.cc b/starpilot/ui/qt/widgets/navigation_functions.cc similarity index 97% rename from frogpilot/ui/qt/widgets/navigation_functions.cc rename to starpilot/ui/qt/widgets/navigation_functions.cc index c4252f95..e1744e81 100644 --- a/frogpilot/ui/qt/widgets/navigation_functions.cc +++ b/starpilot/ui/qt/widgets/navigation_functions.cc @@ -1,4 +1,4 @@ -#include "frogpilot/ui/qt/widgets/navigation_functions.h" +#include "starpilot/ui/qt/widgets/navigation_functions.h" MapSelectionControl::MapSelectionControl(const QMap &map, bool isCountry) : selectionType(isCountry ? "nations" : "states") { mapButtons = new QButtonGroup(this); diff --git a/frogpilot/ui/qt/widgets/navigation_functions.h b/starpilot/ui/qt/widgets/navigation_functions.h similarity index 99% rename from frogpilot/ui/qt/widgets/navigation_functions.h rename to starpilot/ui/qt/widgets/navigation_functions.h index ccd28f51..8cfad8e2 100644 --- a/frogpilot/ui/qt/widgets/navigation_functions.h +++ b/starpilot/ui/qt/widgets/navigation_functions.h @@ -4,7 +4,7 @@ #include #include -#include "frogpilot/ui/qt/widgets/frogpilot_controls.h" +#include "starpilot/ui/qt/widgets/starpilot_controls.h" inline QMap midwestMap = { {"IL", "Illinois"}, {"IN", "Indiana"}, {"IA", "Iowa"}, diff --git a/frogpilot/ui/qt/widgets/frogpilot_controls.cc b/starpilot/ui/qt/widgets/starpilot_controls.cc similarity index 92% rename from frogpilot/ui/qt/widgets/frogpilot_controls.cc rename to starpilot/ui/qt/widgets/starpilot_controls.cc index aa0a7ef8..c02e645d 100644 --- a/frogpilot/ui/qt/widgets/frogpilot_controls.cc +++ b/starpilot/ui/qt/widgets/starpilot_controls.cc @@ -1,13 +1,13 @@ #include "selfdrive/ui/ui.h" -#include "frogpilot/ui/frogpilot_ui.h" +#include "starpilot/ui/starpilot_ui.h" -bool FrogPilotConfirmationDialog::toggleReboot(QWidget *parent) { +bool StarPilotConfirmationDialog::toggleReboot(QWidget *parent) { ConfirmationDialog d(tr("Reboot required to take effect."), tr("Reboot Now"), tr("Reboot Later"), false, parent); return d.exec(); } -bool FrogPilotConfirmationDialog::yesorno(const QString &prompt_text, QWidget *parent) { +bool StarPilotConfirmationDialog::yesorno(const QString &prompt_text, QWidget *parent) { ConfirmationDialog d(prompt_text, tr("Yes"), tr("No"), false, parent); return d.exec(); } @@ -123,9 +123,9 @@ void openDescriptions(bool forceOpenDescriptions, std::map &movie, const QSize &size, QWidget *parent); void loadImage(const QString &basePath, QPixmap &pixmap, QSharedPointer &movie, const QSize &size, QWidget *parent); void openDescriptions(bool forceOpenDescriptions, std::map toggles); -void updateFrogPilotToggles(); +void updateStarPilotToggles(); QString cleanModelName(QString modelName); @@ -46,20 +46,20 @@ const QString buttonStyle = R"( } )"; -class FrogPilotConfirmationDialog : public ConfirmationDialog { +class StarPilotConfirmationDialog : public ConfirmationDialog { Q_OBJECT public: - explicit FrogPilotConfirmationDialog(const QString &prompt_text, const QString &confirm_text, + explicit StarPilotConfirmationDialog(const QString &prompt_text, const QString &confirm_text, const QString &cancel_text, const bool rich, QWidget *parent); static bool toggleReboot(QWidget *parent); static bool yesorno(const QString &prompt_text, QWidget *parent); }; -class FrogPilotListWidget : public QWidget { +class StarPilotListWidget : public QWidget { Q_OBJECT public: - explicit FrogPilotListWidget(QWidget *parent = 0) : QWidget(parent), outer_layout(this) { + explicit StarPilotListWidget(QWidget *parent = 0) : QWidget(parent), outer_layout(this) { outer_layout.setMargin(0); outer_layout.setSpacing(0); outer_layout.addLayout(&inner_layout); @@ -114,10 +114,10 @@ private: QVBoxLayout inner_layout; }; -class FrogPilotButtonControl : public ParamControl { +class StarPilotButtonControl : public ParamControl { Q_OBJECT public: - FrogPilotButtonControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, + StarPilotButtonControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, const std::vector &button_texts, bool checkable = false, bool exclusive = false, int minimum_button_width = 225) : ParamControl(param, title, desc, icon) { key = param.toStdString(); @@ -139,7 +139,7 @@ public: emit buttonClicked(id); }); - QObject::connect(this, &ToggleControl::toggleFlipped, this, &FrogPilotButtonControl::refresh); + QObject::connect(this, &ToggleControl::toggleFlipped, this, &StarPilotButtonControl::refresh); refresh(); } @@ -196,10 +196,10 @@ protected: QButtonGroup *button_group; }; -class FrogPilotButtonsControl : public AbstractControl { +class StarPilotButtonsControl : public AbstractControl { Q_OBJECT public: - FrogPilotButtonsControl(const QString &title, const QString &desc, const QString &icon, + StarPilotButtonsControl(const QString &title, const QString &desc, const QString &icon, const std::vector &button_texts, const bool &checkable = false, const bool &exclusive = true, const int minimum_button_width = 225) : AbstractControl(title, desc, icon) { button_group = new QButtonGroup(this); @@ -280,13 +280,13 @@ private: QButtonGroup *button_group; }; -class FrogPilotButtonToggleControl : public FrogPilotButtonControl { +class StarPilotButtonToggleControl : public StarPilotButtonControl { Q_OBJECT public: - FrogPilotButtonToggleControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, + StarPilotButtonToggleControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, const std::vector &button_params, const std::vector &button_texts, bool exclusive = false, int minimum_button_width = 225) - : FrogPilotButtonControl(param, title, desc, icon, button_texts, true, exclusive, minimum_button_width), button_params(button_params) { + : StarPilotButtonControl(param, title, desc, icon, button_texts, true, exclusive, minimum_button_width), button_params(button_params) { for (int i = 0; i < button_texts.size(); i++) { button_group->buttons()[i]->setChecked(params.getBool(button_params[i].toStdString())); @@ -299,7 +299,7 @@ public: } void refresh() override { - FrogPilotButtonControl::refresh(); + StarPilotButtonControl::refresh(); for (int i = 0; i < button_group->buttons().size(); i++) { QAbstractButton *button = button_group->button(i); @@ -311,18 +311,18 @@ private: std::vector button_params; }; -class FrogPilotManageControl : public ParamControl { +class StarPilotManageControl : public ParamControl { Q_OBJECT public: - FrogPilotManageControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon) : ParamControl(param, title, desc, icon) { + StarPilotManageControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon) : ParamControl(param, title, desc, icon) { key = param.toStdString(); manageButton = new ButtonControl("", tr("MANAGE"), "", this); hlayout->insertWidget(hlayout->indexOf(&toggle) - 1, manageButton); - QObject::connect(manageButton, &ButtonControl::clicked, this, &FrogPilotManageControl::manageButtonClicked); - QObject::connect(this, &ToggleControl::toggleFlipped, this, &FrogPilotManageControl::refresh); + QObject::connect(manageButton, &ButtonControl::clicked, this, &StarPilotManageControl::manageButtonClicked); + QObject::connect(this, &ToggleControl::toggleFlipped, this, &StarPilotManageControl::refresh); } void refresh() { @@ -349,10 +349,10 @@ private: Params params; }; -class FrogPilotParamValueControl : public AbstractControl { +class StarPilotParamValueControl : public AbstractControl { Q_OBJECT public: - FrogPilotParamValueControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, + StarPilotParamValueControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, float min_value, float max_value, const QString &label, const std::map &value_labels = {}, float interval = 1.0f, bool fast_increase = false, int label_width = 350) : AbstractControl(title, desc, icon), @@ -373,8 +373,8 @@ public: hlayout->addWidget(&decrement_button); hlayout->addWidget(&increment_button); - QObject::connect(&decrement_button, &QPushButton::pressed, this, &FrogPilotParamValueControl::decrementPressed); - QObject::connect(&increment_button, &QPushButton::pressed, this, &FrogPilotParamValueControl::incrementPressed); + QObject::connect(&decrement_button, &QPushButton::pressed, this, &StarPilotParamValueControl::decrementPressed); + QObject::connect(&increment_button, &QPushButton::pressed, this, &StarPilotParamValueControl::incrementPressed); last_action_timer.start(); } @@ -551,14 +551,14 @@ private: QString warning; }; -class FrogPilotParamValueButtonControl : public FrogPilotParamValueControl { +class StarPilotParamValueButtonControl : public StarPilotParamValueControl { Q_OBJECT public: - FrogPilotParamValueButtonControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, + StarPilotParamValueButtonControl(const QString ¶m, const QString &title, const QString &desc, const QString &icon, float min_value, float max_value, const QString &label, const std::map &value_labels, float interval, bool fast_increase, const std::vector &button_params, const std::vector &button_texts, bool left_button = false, bool checkable = true, int minimum_button_width = 225) - : FrogPilotParamValueControl(param, title, desc, icon, min_value, max_value, label, value_labels, interval, fast_increase, 200), + : StarPilotParamValueControl(param, title, desc, icon, min_value, max_value, label, value_labels, interval, fast_increase, 200), button_params(button_params), checkable(checkable) { button_group = new QButtonGroup(this); button_group->setExclusive(false); @@ -591,12 +591,12 @@ public: button->setChecked(params.getBool(button_params[i].toStdString())); } } - FrogPilotParamValueControl::refresh(); + StarPilotParamValueControl::refresh(); } void showEvent(QShowEvent *event) override { refresh(); - FrogPilotParamValueControl::showEvent(event); + StarPilotParamValueControl::showEvent(event); } public: @@ -619,10 +619,10 @@ private: QButtonGroup *button_group; }; -class FrogPilotDualParamValueControl : public QFrame { +class StarPilotDualParamValueControl : public QFrame { Q_OBJECT public: - FrogPilotDualParamValueControl(FrogPilotParamValueControl *control1, FrogPilotParamValueControl *control2, QWidget *parent = nullptr) : QFrame(parent), control1(control1), control2(control2) { + StarPilotDualParamValueControl(StarPilotParamValueControl *control1, StarPilotParamValueControl *control2, QWidget *parent = nullptr) : QFrame(parent), control1(control1), control2(control2) { QHBoxLayout *hlayout = new QHBoxLayout(this); hlayout->addWidget(control1); hlayout->addWidget(control2); @@ -639,6 +639,6 @@ public: } private: - FrogPilotParamValueControl *control1; - FrogPilotParamValueControl *control2; + StarPilotParamValueControl *control1; + StarPilotParamValueControl *control2; }; diff --git a/frogpilot/ui/screenrecorder/blocking_queue.h b/starpilot/ui/screenrecorder/blocking_queue.h similarity index 100% rename from frogpilot/ui/screenrecorder/blocking_queue.h rename to starpilot/ui/screenrecorder/blocking_queue.h diff --git a/frogpilot/ui/screenrecorder/moc_screenrecorder.cc b/starpilot/ui/screenrecorder/moc_screenrecorder.cc similarity index 100% rename from frogpilot/ui/screenrecorder/moc_screenrecorder.cc rename to starpilot/ui/screenrecorder/moc_screenrecorder.cc diff --git a/frogpilot/ui/screenrecorder/omx_encoder.cc b/starpilot/ui/screenrecorder/omx_encoder.cc similarity index 99% rename from frogpilot/ui/screenrecorder/omx_encoder.cc rename to starpilot/ui/screenrecorder/omx_encoder.cc index 21139186..b0222cc8 100644 --- a/frogpilot/ui/screenrecorder/omx_encoder.cc +++ b/starpilot/ui/screenrecorder/omx_encoder.cc @@ -1,4 +1,4 @@ -#include "frogpilot/ui/screenrecorder/omx_encoder.h" +#include "starpilot/ui/screenrecorder/omx_encoder.h" #if defined(QCOM2) && !defined(__APPLE__) diff --git a/frogpilot/ui/screenrecorder/omx_encoder.h b/starpilot/ui/screenrecorder/omx_encoder.h similarity index 100% rename from frogpilot/ui/screenrecorder/omx_encoder.h rename to starpilot/ui/screenrecorder/omx_encoder.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Audio.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Audio.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Audio.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Audio.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Component.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Component.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Component.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Component.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_ContentPipe.h b/starpilot/ui/screenrecorder/openmax/include/OMX_ContentPipe.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_ContentPipe.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_ContentPipe.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Core.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Core.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Core.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Core.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_CoreExt.h b/starpilot/ui/screenrecorder/openmax/include/OMX_CoreExt.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_CoreExt.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_CoreExt.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_IVCommon.h b/starpilot/ui/screenrecorder/openmax/include/OMX_IVCommon.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_IVCommon.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_IVCommon.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Image.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Image.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Image.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Image.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Index.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Index.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Index.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Index.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_IndexExt.h b/starpilot/ui/screenrecorder/openmax/include/OMX_IndexExt.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_IndexExt.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_IndexExt.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Other.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Other.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Other.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Other.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_QCOMExtns.h b/starpilot/ui/screenrecorder/openmax/include/OMX_QCOMExtns.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_QCOMExtns.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_QCOMExtns.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Skype_VideoExtensions.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Skype_VideoExtensions.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Skype_VideoExtensions.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Skype_VideoExtensions.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Types.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Types.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Types.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Types.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_Video.h b/starpilot/ui/screenrecorder/openmax/include/OMX_Video.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_Video.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_Video.h diff --git a/frogpilot/ui/screenrecorder/openmax/include/OMX_VideoExt.h b/starpilot/ui/screenrecorder/openmax/include/OMX_VideoExt.h similarity index 100% rename from frogpilot/ui/screenrecorder/openmax/include/OMX_VideoExt.h rename to starpilot/ui/screenrecorder/openmax/include/OMX_VideoExt.h diff --git a/frogpilot/ui/screenrecorder/screenrecorder.cc b/starpilot/ui/screenrecorder/screenrecorder.cc similarity index 98% rename from frogpilot/ui/screenrecorder/screenrecorder.cc rename to starpilot/ui/screenrecorder/screenrecorder.cc index b062bf9e..5a47698c 100644 --- a/frogpilot/ui/screenrecorder/screenrecorder.cc +++ b/starpilot/ui/screenrecorder/screenrecorder.cc @@ -2,7 +2,7 @@ #include "selfdrive/ui/qt/util.h" -#include "frogpilot/ui/screenrecorder/screenrecorder.h" +#include "starpilot/ui/screenrecorder/screenrecorder.h" constexpr int BITRATE = 8 * 1024 * 1024; constexpr int MAX_DURATION = 1000 * 60 * 5; diff --git a/frogpilot/ui/screenrecorder/screenrecorder.h b/starpilot/ui/screenrecorder/screenrecorder.h similarity index 100% rename from frogpilot/ui/screenrecorder/screenrecorder.h rename to starpilot/ui/screenrecorder/screenrecorder.h diff --git a/frogpilot/ui/frogpilot_ui.cc b/starpilot/ui/starpilot_ui.cc similarity index 52% rename from frogpilot/ui/frogpilot_ui.cc rename to starpilot/ui/starpilot_ui.cc index 912713fb..65a2218a 100644 --- a/frogpilot/ui/frogpilot_ui.cc +++ b/starpilot/ui/starpilot_ui.cc @@ -1,12 +1,12 @@ -#include "frogpilot/ui/frogpilot_ui.h" +#include "starpilot/ui/starpilot_ui.h" #include #include #include "system/hardware/hw.h" -static void update_state(FrogPilotUIState *fs) { - FrogPilotUIScene &frogpilot_scene = fs->frogpilot_scene; +static void update_state(StarPilotUIState *fs) { + StarPilotUIScene &starpilot_scene = fs->starpilot_scene; SubMaster &fpsm = *(fs->sm); fpsm.update(0); @@ -14,54 +14,54 @@ static void update_state(FrogPilotUIState *fs) { const char *desktop_fake_wifi_env = std::getenv("SP_ALLOW_DESKTOP_FAKE_WIFI"); const bool desktop_force_online = Hardware::PC() && desktop_fake_wifi_env != nullptr && std::string(desktop_fake_wifi_env) != "0"; if (desktop_force_online) { - frogpilot_scene.online = true; + starpilot_scene.online = true; } if (fpsm.updated("deviceState")) { const cereal::DeviceState::Reader &deviceState = fpsm["deviceState"].getDeviceState(); if (!desktop_force_online) { - frogpilot_scene.online = deviceState.getNetworkType() != cereal::DeviceState::NetworkType::NONE; + starpilot_scene.online = deviceState.getNetworkType() != cereal::DeviceState::NetworkType::NONE; } } - if (fpsm.updated("frogpilotCarState")) { - const cereal::FrogPilotCarState::Reader &frogpilotCarState = fpsm["frogpilotCarState"].getFrogpilotCarState(); - frogpilot_scene.always_on_lateral_active = !frogpilot_scene.enabled && frogpilotCarState.getAlwaysOnLateralEnabled(); - frogpilot_scene.traffic_mode_enabled = frogpilotCarState.getTrafficModeEnabled(); + if (fpsm.updated("starpilotCarState")) { + const cereal::StarPilotCarState::Reader &starpilotCarState = fpsm["starpilotCarState"].getStarpilotCarState(); + starpilot_scene.always_on_lateral_active = !starpilot_scene.enabled && starpilotCarState.getAlwaysOnLateralEnabled(); + starpilot_scene.traffic_mode_enabled = starpilotCarState.getTrafficModeEnabled(); } - if (fpsm.updated("frogpilotPlan")) { - const cereal::FrogPilotPlan::Reader &frogpilotPlan = fpsm["frogpilotPlan"].getFrogpilotPlan(); - if (frogpilotPlan.getThemeUpdated()) { + if (fpsm.updated("starpilotPlan")) { + const cereal::StarPilotPlan::Reader &starpilotPlan = fpsm["starpilotPlan"].getStarpilotPlan(); + if (starpilotPlan.getThemeUpdated()) { emit fs->themeUpdated(); } - capnp::Text::Reader toggles = frogpilotPlan.getFrogpilotToggles(); + capnp::Text::Reader toggles = starpilotPlan.getStarpilotToggles(); QByteArray current_toggles(toggles.cStr(), toggles.size()); static QByteArray previous_toggles; if (previous_toggles != current_toggles) { - frogpilot_scene.frogpilot_toggles = QJsonDocument::fromJson(current_toggles).object(); + starpilot_scene.starpilot_toggles = QJsonDocument::fromJson(current_toggles).object(); previous_toggles = current_toggles; } } // Keep force drive-state toggles authoritative from params so UI state - // switches immediately even if frogpilotPlan is delayed. - frogpilot_scene.frogpilot_toggles["force_offroad"] = fs->params.getBool("ForceOffroad"); - frogpilot_scene.frogpilot_toggles["force_onroad"] = fs->params.getBool("ForceOnroad"); + // switches immediately even if starpilotPlan is delayed. + starpilot_scene.starpilot_toggles["force_offroad"] = fs->params.getBool("ForceOffroad"); + starpilot_scene.starpilot_toggles["force_onroad"] = fs->params.getBool("ForceOnroad"); if (fpsm.updated("selfdriveState")) { const cereal::SelfdriveState::Reader &selfdriveState = fpsm["selfdriveState"].getSelfdriveState(); - frogpilot_scene.enabled = selfdriveState.getEnabled(); + starpilot_scene.enabled = selfdriveState.getEnabled(); } } -FrogPilotUIState::FrogPilotUIState(QObject *parent) : QObject(parent) { +StarPilotUIState::StarPilotUIState(QObject *parent) : QObject(parent) { sm = std::make_unique>({ - "carControl", "deviceState", "frogpilotCarState", "frogpilotDeviceState", - "frogpilotPlan", "frogpilotRadarState", "frogpilotSelfdriveState", "liveDelay", + "carControl", "deviceState", "starpilotCarState", "starpilotDeviceState", + "starpilotPlan", "starpilotRadarState", "starpilotSelfdriveState", "liveDelay", "liveParameters", "liveTorqueParameters", "liveTracks", "mapdExtendedOut", "mapdOut", "selfdriveState" }); - // Provide sane local defaults until frogpilotPlan publishes real toggles. - frogpilot_scene.frogpilot_toggles = { + // Provide sane local defaults until starpilotPlan publishes real toggles. + starpilot_scene.starpilot_toggles = { {"debug_mode", false}, {"driver_camera_in_reverse", false}, {"force_offroad", false}, @@ -84,14 +84,14 @@ FrogPilotUIState::FrogPilotUIState(QObject *parent) : QObject(parent) { } } -FrogPilotUIState *frogpilotUIState() { - static FrogPilotUIState frogpilot_ui_state; - return &frogpilot_ui_state; +StarPilotUIState *starpilotUIState() { + static StarPilotUIState starpilot_ui_state; + return &starpilot_ui_state; } -void FrogPilotUIState::update() { +void StarPilotUIState::update() { update_state(this); - frogpilot_scene.conditional_status = frogpilot_scene.enabled ? params_memory.getInt("CEStatus") : 0; - frogpilot_scene.driver_camera_timer = frogpilot_scene.reverse && frogpilot_scene.frogpilot_toggles.value("driver_camera_in_reverse").toBool() ? frogpilot_scene.driver_camera_timer + 1 : 0; + starpilot_scene.conditional_status = starpilot_scene.enabled ? params_memory.getInt("CEStatus") : 0; + starpilot_scene.driver_camera_timer = starpilot_scene.reverse && starpilot_scene.starpilot_toggles.value("driver_camera_in_reverse").toBool() ? starpilot_scene.driver_camera_timer + 1 : 0; } diff --git a/frogpilot/ui/frogpilot_ui.h b/starpilot/ui/starpilot_ui.h similarity index 64% rename from frogpilot/ui/frogpilot_ui.h rename to starpilot/ui/starpilot_ui.h index 9eeb5316..84461240 100644 --- a/frogpilot/ui/frogpilot_ui.h +++ b/starpilot/ui/starpilot_ui.h @@ -3,13 +3,13 @@ #include "cereal/messaging/messaging.h" #include "selfdrive/ui/qt/network/wifi_manager.h" -#include "frogpilot/ui/qt/widgets/frogpilot_controls.h" +#include "starpilot/ui/qt/widgets/starpilot_controls.h" -struct FrogPilotUIScene { +struct StarPilotUIScene { bool always_on_lateral_active; bool downloading_update; bool enabled; - bool frogpilot_panel_active; + bool starpilot_panel_active; bool online; bool parked; bool reverse; @@ -22,20 +22,20 @@ struct FrogPilotUIScene { int driver_camera_timer; int started_timer; - QJsonObject frogpilot_toggles; + QJsonObject starpilot_toggles; }; -class FrogPilotUIState : public QObject { +class StarPilotUIState : public QObject { Q_OBJECT public: - explicit FrogPilotUIState(QObject *parent = nullptr); + explicit StarPilotUIState(QObject *parent = nullptr); void update(); std::unique_ptr sm; - FrogPilotUIScene frogpilot_scene; + StarPilotUIScene starpilot_scene; Params params; Params params_memory{"", true}; @@ -46,4 +46,4 @@ signals: void themeUpdated(); }; -FrogPilotUIState *frogpilotUIState(); +StarPilotUIState *starpilotUIState(); diff --git a/system/athena/athenad.py b/system/athena/athenad.py index a74ede13..9b5f5dcb 100755 --- a/system/athena/athenad.py +++ b/system/athena/athenad.py @@ -40,7 +40,7 @@ from openpilot.common.swaglog import cloudlog from openpilot.system.version import get_build_metadata from openpilot.system.hardware.hw import Paths -from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server +from openpilot.starpilot.common.starpilot_utilities import use_konik_server ATHENA_HOST = os.getenv('ATHENA_HOST', f"wss://athena.{'konik.ai' if use_konik_server() else 'comma.ai'}") diff --git a/system/camerad/camerad b/system/camerad/camerad index 956a56cabada11484e5cabd79f8e5209dc93a1b7..6a2b4012f6837cf96519443b4687720474037bbe 100755 GIT binary patch delta 387 zcmZ3n$Z*9X!wo4+BFkSr-_n?$r2f`Wne|2Sx5sTayKXmEFtt}OF#<7&W(HywAZ7(( zw(S*6>=E1QgG&;N0y1;*OB@R_L-Mmz^BCYF&On*OqQu-{EJ6XPMa7xLC8>EO2uYXx zy!4z@&lH3R(5Mn5-68quKn2C21u2OosVNL@MfvI5{dcnelddlYx}pH&3ZR|N`FSNp z`8f>8Vo-M=3xUi|MJRGfEz3+!MHBSRPf5)QGeW5H&nwDLOmQs(y1N)58X%LCn1|p7 mC8i`6Axzr-;wpQW5DUoe_Oci3K+FNeoIuRAz3c_|rVIdxsF~FO delta 387 zcmZ3n$Z*9X!wo4+B0g7s?Q#9VT(@jv-jRzFc3OPZT%p}u!PH*C#0bP7ni+^$fS47C z*|t|Ou}5sHcPq+I56H~PFL5l$49U+<&0~OzI42ebBo-y+7Gn_#NG&SPEG|jSD?v!Q z|H`EAiLYkUa$i(2M}`tG1vC87u=gN09YNEk^lez diff --git a/system/hardware/hardwared.py b/system/hardware/hardwared.py index 7c5cf1f4..a2d0f45a 100644 --- a/system/hardware/hardwared.py +++ b/system/hardware/hardwared.py @@ -26,7 +26,7 @@ from openpilot.system.hardware.fan_controller import TiciFanController from openpilot.system.version import terms_version, training_version from openpilot.system.athena.registration import UNREGISTERED_DONGLE_ID -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import get_starpilot_toggles ThermalStatus = log.DeviceState.ThermalStatus NetworkType = log.DeviceState.NetworkType @@ -214,11 +214,11 @@ def hardware_thread(end_event, hw_queue) -> None: fan_controller = None - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) - pm = pm.extend(['frogpilotDeviceState']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) + pm = pm.extend(['starpilotDeviceState']) - frogpilot_toggles = get_frogpilot_toggles() + starpilot_toggles = get_starpilot_toggles() while not end_event.is_set(): sm.update(PANDA_STATES_TIMEOUT) @@ -300,8 +300,8 @@ def hardware_thread(end_event, hw_queue) -> None: if fan_controller is not None: msg.deviceState.fanSpeedPercentDesired = fan_controller.update(all_comp_temp, onroad_conditions["ignition"]) - # FrogPilot variables - if frogpilot_toggles.increase_thermal_limits: + # StarPilot variables + if starpilot_toggles.increase_thermal_limits: all_comp_temp -= (THERMAL_BANDS[ThermalStatus.danger].min_temp - THERMAL_BANDS[ThermalStatus.red].min_temp) is_offroad_for_5_min = (started_ts is None) and ((not started_seen) or (off_ts is None) or (time.monotonic() - off_ts > 60 * 5)) @@ -353,9 +353,9 @@ def hardware_thread(end_event, hw_queue) -> None: if started_ts is None: should_start = should_start and all(startup_conditions.values()) - # FrogPilot variables - should_start |= frogpilot_toggles.force_onroad - should_start &= not frogpilot_toggles.force_offroad + # StarPilot variables + should_start |= starpilot_toggles.force_onroad + should_start &= not starpilot_toggles.force_offroad if should_start != should_start_prev or (count == 0): params.put_bool("IsEngaged", False) @@ -412,7 +412,7 @@ def hardware_thread(end_event, hw_queue) -> None: msg.deviceState.somPowerDrawW = som_power_draw # Check if we need to shut down - if power_monitor.should_shutdown(onroad_conditions["ignition"], in_car, off_ts, started_seen, frogpilot_toggles): + if power_monitor.should_shutdown(onroad_conditions["ignition"], in_car, off_ts, started_seen, starpilot_toggles): cloudlog.warning(f"shutting device down, offroad since {off_ts}") params.put_bool("DoShutdown", True) @@ -426,13 +426,13 @@ def hardware_thread(end_event, hw_queue) -> None: msg.deviceState.thermalStatus = thermal_status pm.send("deviceState", msg) - # FrogPilot variables - fpmsg = messaging.new_message('frogpilotDeviceState') + # StarPilot variables + fpmsg = messaging.new_message('starpilotDeviceState') - fpmsg.frogpilotDeviceState.freeSpace = round(get_available_bytes(default=32.0 * (2 ** 30)) / (2 ** 30)) - fpmsg.frogpilotDeviceState.usedSpace = round(get_used_bytes(default=0.0) / (2 ** 30)) + fpmsg.starpilotDeviceState.freeSpace = round(get_available_bytes(default=32.0 * (2 ** 30)) / (2 ** 30)) + fpmsg.starpilotDeviceState.usedSpace = round(get_used_bytes(default=0.0) / (2 ** 30)) - pm.send("frogpilotDeviceState", fpmsg) + pm.send("starpilotDeviceState", fpmsg) # Log to statsd statlog.gauge("free_space_percent", msg.deviceState.freeSpacePercent) @@ -487,8 +487,8 @@ def hardware_thread(end_event, hw_queue) -> None: count += 1 should_start_prev = should_start - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + starpilot_toggles = get_starpilot_toggles(sm) def main(): diff --git a/system/hardware/hw.h b/system/hardware/hw.h index 1154a7ea..f15e2444 100644 --- a/system/hardware/hw.h +++ b/system/hardware/hw.h @@ -32,7 +32,7 @@ namespace Path { return Path::comma_home() + "/media/0/realdata"; } - // FrogPilot variables + // StarPilot variables if (std::filesystem::exists("/cache/use_HD")) { return "/data/media/0/realdata_HD/"; } diff --git a/system/hardware/power_monitoring.py b/system/hardware/power_monitoring.py index 8d500cf0..76f29d59 100644 --- a/system/hardware/power_monitoring.py +++ b/system/hardware/power_monitoring.py @@ -107,16 +107,16 @@ class PowerMonitoring: return int(self.car_battery_capacity_uWh) # See if we need to shutdown - def should_shutdown(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, started_seen: bool, frogpilot_toggles: SimpleNamespace): + def should_shutdown(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, started_seen: bool, starpilot_toggles: SimpleNamespace): if offroad_timestamp is None: return False now = time.monotonic() should_shutdown = False offroad_time = (now - offroad_timestamp) - low_voltage_shutdown = (self.car_voltage_mV < (frogpilot_toggles.low_voltage_shutdown * 1e3) and + low_voltage_shutdown = (self.car_voltage_mV < (starpilot_toggles.low_voltage_shutdown * 1e3) and offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) - should_shutdown |= offroad_time > frogpilot_toggles.device_shutdown_time + should_shutdown |= offroad_time > starpilot_toggles.device_shutdown_time should_shutdown |= low_voltage_shutdown should_shutdown |= (self.car_battery_capacity_uWh <= 0) should_shutdown &= not ignition diff --git a/system/hardware/tici/updater b/system/hardware/tici/updater index f19a6a75..aa75bb08 100755 --- a/system/hardware/tici/updater +++ b/system/hardware/tici/updater @@ -18,7 +18,7 @@ fi # Ensure AGNOS python can import openpilot modules when called directly. REPO_ROOT="$(cd "$DIR/../../.." >/dev/null 2>&1 && pwd)" if [[ -d "$REPO_ROOT" ]]; then - export PYTHONPATH="$REPO_ROOT/frogpilot/third_party:$REPO_ROOT${PYTHONPATH:+:$PYTHONPATH}" + export PYTHONPATH="$REPO_ROOT/starpilot/third_party:$REPO_ROOT${PYTHONPATH:+:$PYTHONPATH}" fi run_headless_swap() { diff --git a/system/loggerd/bootlog b/system/loggerd/bootlog index 69890e088ebd6abc7ff01d7085982d8835f65a02..9297d6d6230fbdd53efc53e7e495218b21d8f4f2 100755 GIT binary patch delta 197 zcmexyO7X`j#SJM;A}1d|Yi3+<nyZ#a3^kf7nA$6t7=ai>GXpWp_6jCe ziHr5YC5c4=nK}6-js=+^`Pr#?3~&)=piE*>Vs0@Op@7t);>_Zb)Vvaeq)UEYdQPfm r3PJ>ER0)#qko;it^I~GIR1v91Ai-^0QO(7~mq#iA4d4MTxn^ScC#ni;6RgOH%Vn5RxwWdFeT+ po+${C;F81=B;6tT=|Ba=p#>?4C8-c)?fh3*ftYPO{}uMki2%@dORN9@ diff --git a/system/loggerd/config.py b/system/loggerd/config.py index bd25cd31..39f5f0dd 100644 --- a/system/loggerd/config.py +++ b/system/loggerd/config.py @@ -29,7 +29,7 @@ def get_available_bytes(default: int) -> int: return available_bytes -# FrogPilot variables +# StarPilot variables def get_used_bytes(default: int) -> int: try: statvfs = os.statvfs(Paths.log_root()) diff --git a/system/loggerd/encoderd b/system/loggerd/encoderd index 92411a51e480fa710059b6154b0237a0c9954973..967ba70135303232549e3a28938fb14f7e583e11 100755 GIT binary patch delta 376 zcmaDb&EUZ_gAFN6A_8k~=`!&Y+_ijFZ)$o=pIJWQ*q7!CruGUZMj!^!%s|Wn#H>Kf z2E^>!E0{Q@O|CC4Nh~VJ%*iitPAqcH&nqd)&tX6o3rH+V%q>O{3NA@3Nkxdbq?TnS zr=kh^=BK3Qgc%`J`R5hoC#JZTrRJ3&nHC_ElbDB46qJ~fScEWX`^sq?ha~EO0!0BJ zCps2nhU90b<}tuUfR2Vb5K|~1wWv6=xCCe+LcL3VUV2WdX9_|DWLq(U8^&CLV3B+96U#;gZiv|F?y^*f~ delta 376 zcmaDb&EUZ_gAFN6B1{+jTIBYgyCNRluyfK1E+;pqGa=0tOzjm+j6e*cnSq!Eh*^P{ z4T#ydS1@r*n_Qn(l%HOZnUi1QoLJT+dqWD7$llWBezSG2OyoH%pE3DEz=l~hmKx0!Ozjm+j6e*cnSq!Eh*^P{ zZF>b1`!$>T;*!Log3O%!66eGs=lr~qqWl~NWU+w6qQu-{6rtdf#FA8mh)Zf&W^yW; zpl^OkYEGCDLY04BQGQ~IYguYu36g06GC7HP2t`4ODTzf0leWLKXXldF1PT-dfSl-9 zkQtJnotno07XdmN>OhdtbeVW|NmaO{OMYH@PO4`LLOD delta 329 zcmeCUr`>T+dqWD7$TNp^Pg*a?zo|0HewZzOO0cmld0le_Q+ovyBM^gVW*}w(Vpbq# z+g`!Me$A#nttdaeATuYw#5u9ZIX|zYC_je*Su7y2C^5GfMJTu=u_P5C;*wgHnVgCy z=$oICniFP(Q01Rjl%JU5T9%quf@E5NOip4RLQzm+N@5Yhr0p;5*}3F3-GELE06EdI zATuOCJ2j61E&_Bk)PW$O=`!)`lB#e?m;Ai+oK(*ggmRG4#b9oGR6IKna{w{t_NaKS Gb^QRcJA4TM diff --git a/system/manager/manager.py b/system/manager/manager.py index 4702d1a3..06a2865f 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -2,6 +2,7 @@ import datetime import json import os +import shutil from pathlib import Path import signal import sys @@ -23,16 +24,24 @@ from openpilot.common.swaglog import cloudlog, add_file_handler from openpilot.system.version import get_build_metadata, terms_version, training_version from openpilot.system.hardware.hw import Paths -from openpilot.frogpilot.common.frogpilot_functions import frogpilot_boot_functions, install_frogpilot, uninstall_frogpilot -from openpilot.frogpilot.common.frogpilot_variables import get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_functions import starpilot_boot_functions, install_starpilot, uninstall_starpilot +from openpilot.starpilot.common.starpilot_variables import ( + LEGACY_STARPILOT_PARAM_RENAMES, + LEGACY_STARPILOT_STATS_KEY_RENAMES, + get_starpilot_toggles, +) LEGACY_BOLT_FP_MIGRATION_FLAG = Path("/data") / "legacy_bolt_fp_migration_v1" STARPILOT_DEFAULTS_PARITY_MIGRATION_FLAG = Path("/data") / "starpilot_defaults_parity_v1" +STARPILOT_PARAM_RENAME_MIGRATION_FLAG = Path("/data") / "starpilot_param_rename_v1" STARPILOT_PARAM_CANONICALIZATION_MIGRATION_FLAG = Path("/data") / "starpilot_param_canonicalization_v1" +STARPILOT_PC_ROOT_MIGRATION_FLAG = Path("/data") / "starpilot_pc_root_v1" LEGACY_CARMODEL_MIGRATIONS = { "CHEVROLET_BOLT_CC_2019_2021": "CHEVROLET_BOLT_CC_2018_2021", } +STARPILOT_STATS_DROP_KEYS = {"CurrentMonthsKilometers", "ResetStats"} +STARPILOT_STATS_MAX_KEYS = {"LongestDistanceWithoutOverride", "MaxAcceleration"} def _to_text(value): @@ -43,6 +52,207 @@ def _to_text(value): return str(value) +def _has_meaningful_param_value(value) -> bool: + if value is None: + return False + if isinstance(value, bool): + return True + if isinstance(value, (bytes, bytearray, str, dict, list, tuple, set)): + return len(value) > 0 + return True + + +def _is_numeric_stat_value(value) -> bool: + return isinstance(value, (int, float)) and not isinstance(value, bool) + + +def _merge_starpilot_stat_values(existing, incoming, key=None): + if existing is None: + return incoming + if incoming is None: + return existing + + if isinstance(existing, dict) and isinstance(incoming, dict): + merged = dict(existing) + for child_key, child_value in incoming.items(): + merged[child_key] = _merge_starpilot_stat_values(merged.get(child_key), child_value, child_key) + return merged + + if key == "Month": + return incoming + + if key in STARPILOT_STATS_MAX_KEYS and _is_numeric_stat_value(existing) and _is_numeric_stat_value(incoming): + return max(existing, incoming) + + if _is_numeric_stat_value(existing) and _is_numeric_stat_value(incoming): + return existing + incoming + + return incoming + + +def _normalize_starpilot_stats_value(value): + if isinstance(value, dict): + normalized = {} + for child_key, child_value in value.items(): + normalized[child_key] = _merge_starpilot_stat_values( + normalized.get(child_key), + _normalize_starpilot_stats_value(child_value), + child_key, + ) + return normalized + return value + + +def _normalize_starpilot_stats(stats): + if not isinstance(stats, dict): + return {} + + normalized = {} + for key, value in stats.items(): + mapped_key = LEGACY_STARPILOT_STATS_KEY_RENAMES.get(key, key) + if mapped_key in STARPILOT_STATS_DROP_KEYS: + continue + + normalized[mapped_key] = _merge_starpilot_stat_values( + normalized.get(mapped_key), + _normalize_starpilot_stats_value(value), + mapped_key, + ) + + return normalized + + +def _load_first_available_param_value(params: Params, params_cache: Params, source_key: str, typed_key: str): + for params_obj in (params, params_cache): + raw_value = _read_raw_param_bytes(params_obj, source_key) + if not raw_value: + continue + + try: + return params.cpp2python(typed_key, raw_value) + except Exception: + cloudlog.exception(f"Failed to decode legacy param {source_key} as {typed_key}") + + return None + + +def migrate_starpilot_param_renames(params: Params, params_cache: Params) -> None: + if STARPILOT_PARAM_RENAME_MIGRATION_FLAG.exists(): + return + + migrated_keys: list[str] = [] + + for old_key, new_key in LEGACY_STARPILOT_PARAM_RENAMES.items(): + if new_key == "StarPilotStats": + continue + + migrated_value = _load_first_available_param_value(params, params_cache, old_key, new_key) + if not _has_meaningful_param_value(migrated_value): + continue + + current_value = params.get(new_key) + if _has_meaningful_param_value(current_value) and not (new_key == "StarPilotDongleId" and current_value != migrated_value): + continue + + try: + if current_value != migrated_value: + params.put(new_key, migrated_value) + params_cache.put(new_key, migrated_value) + migrated_keys.append(f"{old_key}->{new_key}") + except Exception: + cloudlog.exception(f"Failed to migrate legacy param {old_key} to {new_key}") + + old_stats = _normalize_starpilot_stats(_load_first_available_param_value(params, params_cache, "FrogPilotStats", "StarPilotStats")) + new_stats = _normalize_starpilot_stats(_load_first_available_param_value(params, params_cache, "StarPilotStats", "StarPilotStats")) + merged_stats = new_stats if old_stats == new_stats else _merge_starpilot_stat_values(old_stats, new_stats, "StarPilotStats") + + if _has_meaningful_param_value(merged_stats): + current_stats = params.get("StarPilotStats") + if current_stats != merged_stats: + try: + params.put("StarPilotStats", merged_stats) + params_cache.put("StarPilotStats", merged_stats) + migrated_keys.append("FrogPilotStats->StarPilotStats") + except Exception: + cloudlog.exception("Failed to migrate legacy StarPilot stats payload") + + if migrated_keys: + cloudlog.warning(f"Applied legacy StarPilot param rename migration for {migrated_keys}") + + try: + STARPILOT_PARAM_RENAME_MIGRATION_FLAG.parent.mkdir(parents=True, exist_ok=True) + STARPILOT_PARAM_RENAME_MIGRATION_FLAG.write_text(f"{datetime.datetime.now(datetime.UTC).isoformat()}\n") + except Exception: + cloudlog.exception(f"Failed to write migration flag: {STARPILOT_PARAM_RENAME_MIGRATION_FLAG}") + + +def _merge_tree_without_overwrite(source: Path, destination: Path) -> int: + moved_entries = 0 + + if not source.exists(): + return moved_entries + + if not destination.exists(): + destination.parent.mkdir(parents=True, exist_ok=True) + shutil.move(str(source), str(destination)) + return 1 + + for path in sorted(source.rglob("*"), key=lambda p: (len(p.parts), str(p))): + target = destination / path.relative_to(source) + if path.is_dir(): + target.mkdir(parents=True, exist_ok=True) + continue + + target.parent.mkdir(parents=True, exist_ok=True) + if target.exists(): + continue + + shutil.move(str(path), str(target)) + moved_entries += 1 + + for directory in sorted((p for p in source.rglob("*") if p.is_dir()), key=lambda p: len(p.parts), reverse=True): + try: + directory.rmdir() + except OSError: + pass + + try: + source.rmdir() + except OSError: + pass + + return moved_entries + + +def migrate_starpilot_pc_root() -> None: + if HARDWARE.get_device_type() != "pc" or STARPILOT_PC_ROOT_MIGRATION_FLAG.exists(): + return + + old_root = Path(Paths.comma_home()) / "frogpilot" + new_root = Path(Paths.comma_home()) / "starpilot" + + moved_entries = 0 + migration_succeeded = True + if old_root.exists(): + try: + moved_entries = _merge_tree_without_overwrite(old_root, new_root) + except Exception: + migration_succeeded = False + cloudlog.exception(f"Failed to migrate legacy PC StarPilot root from {old_root} to {new_root}") + + if moved_entries: + cloudlog.warning(f"Migrated legacy PC StarPilot root from {old_root} to {new_root}") + + if not migration_succeeded: + return + + try: + STARPILOT_PC_ROOT_MIGRATION_FLAG.parent.mkdir(parents=True, exist_ok=True) + STARPILOT_PC_ROOT_MIGRATION_FLAG.write_text(f"{datetime.datetime.now(datetime.UTC).isoformat()}\n") + except Exception: + cloudlog.exception(f"Failed to write migration flag: {STARPILOT_PC_ROOT_MIGRATION_FLAG}") + + def migrate_legacy_bolt_fingerprint(params: Params) -> None: old_fp, new_fp = next(iter(LEGACY_CARMODEL_MIGRATIONS.items())) carparams_keys = ("CarParams", "CarParamsCache", "CarParamsPersistent", "CarParamsPrevRoute") @@ -51,8 +261,8 @@ def migrate_legacy_bolt_fingerprint(params: Params) -> None: "CarParamsCache", "CarParamsPersistent", "CarParamsPrevRoute", - "FrogPilotCarParams", - "FrogPilotCarParamsPersistent", + "StarPilotCarParams", + "StarPilotCarParamsPersistent", ) car_model = _to_text(params.get("CarModel")) @@ -285,6 +495,15 @@ def manager_init() -> None: build_metadata = get_build_metadata() params = Params() + cache_params_path = "/cache/params" + if HARDWARE.get_device_type() == "pc": + cache_params_path = os.path.join(Paths.comma_home(), "cache", "params") + params_cache = Params(cache_params_path, return_defaults=True) + + # Legacy FrogPilot params are unknown to the renamed schema and would be + # deleted by clear_all() if we do not migrate them first. + migrate_starpilot_param_renames(params, params_cache) + params.clear_all(ParamKeyFlag.CLEAR_ON_MANAGER_START) params.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION) params.clear_all(ParamKeyFlag.CLEAR_ON_OFFROAD_TRANSITION) @@ -292,14 +511,12 @@ def manager_init() -> None: if build_metadata.release_channel: params.clear_all(ParamKeyFlag.DEVELOPMENT_ONLY) + migrate_starpilot_pc_root() + if params.get_bool("RecordFrontLock"): params.put_bool("RecordFront", True) - # FrogPilot variables - cache_params_path = "/cache/params" - if HARDWARE.get_device_type() == "pc": - cache_params_path = os.path.join(Paths.comma_home(), "cache", "params") - params_cache = Params(cache_params_path, return_defaults=True) + # StarPilot variables # Preserve StarPilot's legacy longitudinal toggle when switching branches. migrate_legacy_experimental_longitudinal(params, params_cache) @@ -371,9 +588,9 @@ def manager_init() -> None: for p in managed_processes.values(): p.prepare() - # FrogPilot variables - install_frogpilot(build_metadata, params) - frogpilot_boot_functions(build_metadata, params) + # StarPilot variables + install_starpilot(build_metadata, params) + starpilot_boot_functions(build_metadata, params) def manager_cleanup() -> None: @@ -406,32 +623,32 @@ def manager_thread() -> None: pm = messaging.PubMaster(['managerState']) write_onroad_params(False, params) - ensure_running(managed_processes.values(), False, params=params, CP=sm['carParams'], not_run=ignore, frogpilot_toggles=get_frogpilot_toggles()) + ensure_running(managed_processes.values(), False, params=params, CP=sm['carParams'], not_run=ignore, starpilot_toggles=get_starpilot_toggles()) started_prev = False ignition_prev = False - # FrogPilot variables - sm = sm.extend(['frogpilotPlan']) + # StarPilot variables + sm = sm.extend(['starpilotPlan']) params_memory = Params(memory=True) - frogpilot_toggles = get_frogpilot_toggles() + starpilot_toggles = get_starpilot_toggles() while True: sm.update(1000) started = sm['deviceState'].started - if started and not started_prev and not frogpilot_toggles.force_onroad: + if started and not started_prev and not starpilot_toggles.force_onroad: params.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION) - # FrogPilot variables + # StarPilot variables params_memory.clear_all(ParamKeyFlag.CLEAR_ON_ONROAD_TRANSITION) elif not started and started_prev: params.clear_all(ParamKeyFlag.CLEAR_ON_OFFROAD_TRANSITION) - # FrogPilot variables + # StarPilot variables params_memory.clear_all(ParamKeyFlag.CLEAR_ON_OFFROAD_TRANSITION) ignition = any(ps.ignitionLine or ps.ignitionCan for ps in sm['pandaStates'] if ps.pandaType != log.PandaState.PandaType.unknown) @@ -445,7 +662,7 @@ def manager_thread() -> None: started_prev = started ignition_prev = ignition - ensure_running(managed_processes.values(), started, params=params, CP=sm['carParams'], not_run=ignore, frogpilot_toggles=frogpilot_toggles) + ensure_running(managed_processes.values(), started, params=params, CP=sm['carParams'], not_run=ignore, starpilot_toggles=starpilot_toggles) running = ' '.join("{}{}\u001b[0m".format("\u001b[32m" if p.proc.is_alive() else "\u001b[31m", p.name) for p in managed_processes.values() if p.proc) @@ -476,8 +693,8 @@ def manager_thread() -> None: if shutdown: break - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles(sm) + # StarPilot variables + starpilot_toggles = get_starpilot_toggles(sm) def main() -> None: @@ -499,7 +716,7 @@ def main() -> None: params = Params() if params.get_bool("DoUninstall"): cloudlog.warning("uninstalling") - uninstall_frogpilot() + uninstall_starpilot() elif params.get_bool("DoReboot"): cloudlog.warning("reboot") HARDWARE.reboot() diff --git a/system/manager/process.py b/system/manager/process.py index 3cc754cd..75da2cd9 100644 --- a/system/manager/process.py +++ b/system/manager/process.py @@ -250,7 +250,7 @@ class DaemonProcess(ManagerProcess): self.params = None @staticmethod - def should_run(started, params, CP, frogpilot_toggles): + def should_run(started, params, CP, starpilot_toggles): return True def prepare(self) -> None: @@ -286,7 +286,7 @@ class DaemonProcess(ManagerProcess): def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None, CP: car.CarParams=None, - not_run: list[str] | None=None, frogpilot_toggles: SimpleNamespace=None) -> list[ManagerProcess]: + not_run: list[str] | None=None, starpilot_toggles: SimpleNamespace=None) -> list[ManagerProcess]: if not_run is None: not_run = [] @@ -297,7 +297,7 @@ def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None cloudlog.error(f"Process {p.name} crashed with exitcode {p.proc.exitcode}, restarting") p.stop(retry=False) - if p.enabled and p.name not in not_run and p.should_run(started, params, CP, frogpilot_toggles): + if p.enabled and p.name not in not_run and p.should_run(started, params, CP, starpilot_toggles): running.append(p) else: p.stop(block=False) diff --git a/system/manager/process_config.py b/system/manager/process_config.py index f203cbd5..80295dac 100644 --- a/system/manager/process_config.py +++ b/system/manager/process_config.py @@ -11,50 +11,50 @@ from openpilot.system.manager.process import PythonProcess, NativeProcess, Daemo WEBCAM = os.getenv("USE_WEBCAM") is not None -def driverview(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def driverview(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started or params.get_bool("IsDriverViewEnabled") -def notcar(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def notcar(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and CP.notCar -def iscar(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def iscar(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and not CP.notCar -def logging(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def logging(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: run = (not CP.notCar) or not params.get_bool("DisableLogging") return started and run def ublox_available() -> bool: return os.path.exists('/dev/ttyHS0') and not os.path.exists('/persist/comma/use-quectel-gps') -def ublox(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def ublox(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: use_ublox = ublox_available() if use_ublox != params.get_bool("UbloxAvailable"): params.put_bool("UbloxAvailable", use_ublox) return started and use_ublox -def joystick(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def joystick(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and params.get_bool("JoystickDebugMode") -def not_joystick(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def not_joystick(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and not params.get_bool("JoystickDebugMode") -def long_maneuver(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def long_maneuver(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and params.get_bool("LongitudinalManeuverMode") -def not_long_maneuver(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def not_long_maneuver(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and not params.get_bool("LongitudinalManeuverMode") -def qcomgps(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def qcomgps(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started and not ublox_available() -def always_run(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def always_run(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return True -def only_onroad(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def only_onroad(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return started -def only_offroad(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: +def only_offroad(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: return not started def or_(*fns): @@ -63,15 +63,15 @@ def or_(*fns): def and_(*fns): return lambda *args: operator.and_(*(fn(*args) for fn in fns)) -# FrogPilot variables -def allow_logging(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: - return not frogpilot_toggles.no_logging +# StarPilot variables +def allow_logging(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: + return not starpilot_toggles.no_logging -def allow_uploads(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: - return params.get_bool("AlwaysAllowUploads") or not frogpilot_toggles.no_uploads or frogpilot_toggles.no_onroad_uploads +def allow_uploads(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: + return params.get_bool("AlwaysAllowUploads") or not starpilot_toggles.no_uploads or starpilot_toggles.no_onroad_uploads -def run_speed_limit_filler(started: bool, params: Params, CP: car.CarParams, frogpilot_toggles: SimpleNamespace) -> bool: - return frogpilot_toggles.speed_limit_filler +def run_speed_limit_filler(started: bool, params: Params, CP: car.CarParams, starpilot_toggles: SimpleNamespace) -> bool: + return starpilot_toggles.speed_limit_filler procs = [ DaemonProcess("manage_athenad", "system.athena.manage_athenad", "AthenadPid"), @@ -88,8 +88,8 @@ procs = [ PythonProcess("micd", "system.micd", iscar), PythonProcess("timed", "system.timed", always_run, enabled=not PC), - PythonProcess("modeld", "frogpilot.tinygrad_modeld.tinygrad_modeld", only_onroad), - PythonProcess("dmonitoringmodeld", "frogpilot.tinygrad_modeld.dmonitoringmodeld", driverview, enabled=(WEBCAM or not PC)), + PythonProcess("modeld", "starpilot.tinygrad_modeld.tinygrad_modeld", only_onroad), + PythonProcess("dmonitoringmodeld", "starpilot.tinygrad_modeld.dmonitoringmodeld", driverview, enabled=(WEBCAM or not PC)), PythonProcess("sensord", "system.sensord.sensord", only_onroad, enabled=not PC), PythonProcess("soundd", "selfdrive.ui.soundd", driverview), @@ -126,7 +126,7 @@ procs = [ PythonProcess("joystick", "tools.joystick.joystick_control", and_(joystick, iscar)), ] -# FrogPilot variables +# StarPilot variables device_type = HARDWARE.get_device_type() if device_type in ("tici", "tizi"): procs.append(NativeProcess("ui", "selfdrive/ui", ["./ui"], always_run, watchdog_max_dt=5)) @@ -134,12 +134,12 @@ else: # C4 (mici) runs the Python raylib UI path; keep watchdog parity with C3/C3X. procs.append(PythonProcess("ui", "selfdrive.ui.ui", always_run, watchdog_max_dt=5)) procs += [ - PythonProcess("device_syncd", "frogpilot.system.device_syncd", always_run), - PythonProcess("frogpilot_process", "frogpilot.frogpilot_process", always_run), - PythonProcess("mapd", "frogpilot.navigation.mapd_wrapper", always_run), - PythonProcess("the_pond", "frogpilot.system.the_pond.the_pond", always_run, nice=19), - PythonProcess("galaxy", "frogpilot.system.galaxy.galaxy", always_run, nice=19), - PythonProcess("speed_limit_filler", "frogpilot.system.speed_limit_filler", run_speed_limit_filler), + PythonProcess("device_syncd", "starpilot.system.device_syncd", always_run), + PythonProcess("starpilot_process", "starpilot.starpilot_process", always_run), + PythonProcess("mapd", "starpilot.navigation.mapd_wrapper", always_run), + PythonProcess("the_pond", "starpilot.system.the_pond.the_pond", always_run, nice=19), + PythonProcess("galaxy", "starpilot.system.galaxy.galaxy", always_run, nice=19), + PythonProcess("speed_limit_filler", "starpilot.system.speed_limit_filler", run_speed_limit_filler), ] managed_processes = {p.name: p for p in procs} diff --git a/system/sentry.py b/system/sentry.py index 62240d0d..856d6255 100644 --- a/system/sentry.py +++ b/system/sentry.py @@ -13,7 +13,7 @@ from openpilot.common.swaglog import cloudlog from openpilot.system.hardware.hw import Paths from openpilot.system.version import get_build_metadata, get_version -from openpilot.frogpilot.common.frogpilot_variables import ERROR_LOGS_PATH, params +from openpilot.starpilot.common.starpilot_variables import ERROR_LOGS_PATH, params class SentryProject(Enum): # python project @@ -71,7 +71,7 @@ def capture_exception(*args, crash_log=True, **kwargs) -> None: cloudlog.exception("sentry exception") -def capture_report(discord_user, report, frogpilot_toggles): +def capture_report(discord_user, report, starpilot_toggles): error_file_path = ERROR_LOGS_PATH / "error.txt" error_content = "No error log found." @@ -80,7 +80,7 @@ def capture_report(discord_user, report, frogpilot_toggles): with sentry_sdk.push_scope() as scope: scope.set_context("Error Log", {"content": error_content}) - scope.set_context("Toggle Values", frogpilot_toggles) + scope.set_context("Toggle Values", starpilot_toggles) sentry_sdk.capture_message(f"{discord_user} submitted report: {report}", level="fatal") sentry_sdk.flush() diff --git a/system/timed.py b/system/timed.py index bd098f6d..ba256c9f 100644 --- a/system/timed.py +++ b/system/timed.py @@ -31,7 +31,7 @@ def set_time(new_time): cloudlog.exception("timed.failed_setting_time") -# FrogPilot variables +# StarPilot variables def set_timezone(timezone): valid_timezones = subprocess.check_output("timedatectl list-timezones", shell=True, encoding="utf8").strip().split("\n") if timezone not in valid_timezones: @@ -65,7 +65,7 @@ def main() -> NoReturn: pm = messaging.PubMaster(['clocks']) sm = messaging.SubMaster([gps_location_service]) - # FrogPilot variables + # StarPilot variables tf = TimezoneFinder() if TimezoneFinder is not None else None timezonefinder_logged = False @@ -92,7 +92,7 @@ def main() -> NoReturn: set_time(gps_time) - # FrogPilot variables + # StarPilot variables if tf is not None: timezone = tf.timezone_at(lng=gps.longitude, lat=gps.latitude) if timezone is not None and timezone != last_timezone: diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index 06f10e0d..8cbb8380 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -420,13 +420,13 @@ class GuiApplication: return texture_obj def starpilot_texture(self, asset_path: str, width: int | None = None, height: int | None = None, alpha_premultiply=False, keep_aspect_ratio=True): - """Load a texture from the FrogPilot assets folder.""" + """Load a texture from the StarPilot assets folder.""" cache_key = f"starpilot_{asset_path}_{width}_{height}_{alpha_premultiply}{keep_aspect_ratio}" if cache_key in self._textures: return self._textures[cache_key] - frogpilot_assets = files("openpilot.frogpilot").joinpath("assets") - with as_file(frogpilot_assets.joinpath(asset_path)) as fspath: + starpilot_assets = files("openpilot.starpilot").joinpath("assets") + with as_file(starpilot_assets.joinpath(asset_path)) as fspath: image_obj = self._load_image_from_path(fspath.as_posix(), width, height, alpha_premultiply, keep_aspect_ratio) texture_obj = self._load_texture_from_image(image_obj) self._textures[cache_key] = texture_obj diff --git a/system/ui/spinner.py b/system/ui/spinner.py index a2c4f531..69f13ac5 100755 --- a/system/ui/spinner.py +++ b/system/ui/spinner.py @@ -34,7 +34,7 @@ DARKGRAY = (55, 55, 55, 255) RESET_TAP_COUNT = 8 RESET_TAP_WINDOW_S = 4.0 -# FrogPilot variables +# StarPilot variables GREEN = (23, 134, 68, 242) diff --git a/system/ui/widgets/selection_dialog.py b/system/ui/widgets/selection_dialog.py index f535547f..708fb2df 100644 --- a/system/ui/widgets/selection_dialog.py +++ b/system/ui/widgets/selection_dialog.py @@ -176,7 +176,7 @@ class SelectionDialog(Widget): if isinstance(self._options_raw, dict): series_keys = list(self._options_raw.keys()) - priority_series = ["FrogPilot", "Comma", "Experimental"] + priority_series = ["StarPilot", "Comma", "Experimental"] sorted_series_keys = [] for p in priority_series: if p in series_keys: diff --git a/system/updated/updated.py b/system/updated/updated.py index 1fb9feef..9fbd5780 100644 --- a/system/updated/updated.py +++ b/system/updated/updated.py @@ -22,7 +22,7 @@ from openpilot.selfdrive.selfdrived.alertmanager import set_offroad_alert from openpilot.system.hardware import AGNOS, HARDWARE from openpilot.system.version import get_build_metadata -from openpilot.frogpilot.common.frogpilot_variables import BACKUP_PATH, get_frogpilot_toggles +from openpilot.starpilot.common.starpilot_variables import BACKUP_PATH, get_starpilot_toggles LOCK_FILE = os.getenv("UPDATER_LOCK_FILE", "/tmp/safe_staging_overlay.lock") STAGING_ROOT = os.getenv("UPDATER_STAGING_ROOT", "/data/safe_staging") @@ -413,7 +413,7 @@ class Updater: finalize_update() cloudlog.info("finalize success!") - # FrogPilot variables + # StarPilot variables if os.path.isfile(BACKUP_PATH): os.remove(BACKUP_PATH) @@ -454,15 +454,15 @@ def main() -> None: # Run the update loop first_run = True - # FrogPilot variables + # StarPilot variables params_memory = Params(memory=True) while True: wait_helper.ready_event.clear() - # FrogPilot variables - frogpilot_toggles = get_frogpilot_toggles() - automatic_updates_enabled = getattr(frogpilot_toggles, "automatic_updates", True) + # StarPilot variables + starpilot_toggles = get_starpilot_toggles() + automatic_updates_enabled = getattr(starpilot_toggles, "automatic_updates", True) user_requested_action = wait_helper.user_request != UserRequest.NONE manual_update_requested = params_memory.get_bool("ManualUpdateInitiated") diff --git a/system/version.py b/system/version.py index 2966a2e4..ead7aa1e 100644 --- a/system/version.py +++ b/system/version.py @@ -10,8 +10,8 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.swaglog import cloudlog from openpilot.common.git import get_commit, get_origin, get_branch, get_short_branch, get_commit_date -RELEASE_BRANCHES = ['FrogPilot', 'FrogPilot-Vetting'] -TESTED_BRANCHES = RELEASE_BRANCHES + ['FrogPilot-Staging', 'FrogPilot-Testing'] +RELEASE_BRANCHES = ['StarPilot', 'StarPilot-Vetting'] +TESTED_BRANCHES = RELEASE_BRANCHES + ['StarPilot-Staging', 'StarPilot-Testing'] BUILD_METADATA_FILENAME = "build.json" diff --git a/tools/StarPilot/derive_feasible_params.py b/tools/StarPilot/derive_feasible_params.py index a00117be..9c1fe20b 100755 --- a/tools/StarPilot/derive_feasible_params.py +++ b/tools/StarPilot/derive_feasible_params.py @@ -20,7 +20,7 @@ REPO_ROOT = get_repo_root() PARAMS_CC_PATH = os.path.join(REPO_ROOT, 'common/params.cc') UI_DIRECTORIES = [ os.path.join(REPO_ROOT, 'selfdrive/ui'), - os.path.join(REPO_ROOT, 'frogpilot/ui') + os.path.join(REPO_ROOT, 'starpilot/ui') ] # A curated list of parameters that are known to be strictly readable state metadata @@ -31,8 +31,8 @@ KNOWN_READ_ONLY = { "ClusterOffset", "Compass", "DeveloperSidebarMetric1", "DeveloperSidebarMetric2", "DeveloperSidebarMetric3", "DeveloperSidebarMetric4", "DeveloperSidebarMetric5", "DeveloperSidebarMetric6", "DeveloperSidebarMetric7", "DongleId", - "FrogPilotCarParamsPersistent", "FrogPilotDrives", "FrogPilotKilometers", - "FrogPilotMinutes", "GitBranch", "GitCommit", "GitCommitDate", "GitDiff", + "StarPilotCarParamsPersistent", "StarPilotDrives", "StarPilotKilometers", + "StarPilotMinutes", "GitBranch", "GitCommit", "GitCommitDate", "GitDiff", "GitRemote", "GithubSshKeys", "GithubUsername", "HardwareSerial", "IMEI", "InstallDate", "IsRhdDetected", "KonikMinutes", "LastGPSPosition", "LastMapsUpdate", "LastUpdateTime", "ModelDrivesAndScores", "ModelReleasedDates", diff --git a/tools/StarPilot/feasibleparams.txt b/tools/StarPilot/feasibleparams.txt index 57fdb81d..cb218d9a 100644 --- a/tools/StarPilot/feasibleparams.txt +++ b/tools/StarPilot/feasibleparams.txt @@ -111,7 +111,7 @@ ForceFingerprint ForceMPHDashboard ForceStops ForceTorqueController -FrogPilotStats +StarPilotStats FrogsGoMoosTweak FullMap GMPedalLongitudinal diff --git a/tools/StarPilot/generate_pond_layout.py b/tools/StarPilot/generate_pond_layout.py index cc295fd0..5f312d27 100755 --- a/tools/StarPilot/generate_pond_layout.py +++ b/tools/StarPilot/generate_pond_layout.py @@ -61,7 +61,7 @@ HIDDEN_KEYS = { "ToyotaDoors", } -# Keys that are boolean toggles despite ambiguous defaults in frogpilot_variables.py. +# Keys that are boolean toggles despite ambiguous defaults in starpilot_variables.py. FORCE_BOOL_KEYS = {"EVTuning"} DEVELOPER_SIDEBAR_METRIC_KEYS = { @@ -149,7 +149,7 @@ for cmap in PARENT_KEYS_MAPPING.values(): ALL_PARENT_KEYS.add(parent) def get_variables_data(): - filepath = os.path.join(REPO_ROOT, "frogpilot/common/frogpilot_variables.py") + filepath = os.path.join(REPO_ROOT, "starpilot/common/starpilot_variables.py") excluded = set() defaults = {} if not os.path.exists(filepath): @@ -197,10 +197,10 @@ def get_variables_data(): excluded = ast.literal_eval(node.value) except: pass - elif getattr(target, 'id', '') in ('frogpilot_default_params', 'misc_tuning_levels'): + elif getattr(target, 'id', '') in ('starpilot_default_params', 'misc_tuning_levels'): parse_params_list(node.value) elif isinstance(node, ast.AnnAssign): - if getattr(node.target, 'id', '') in ('frogpilot_default_params', 'misc_tuning_levels'): + if getattr(node.target, 'id', '') in ('starpilot_default_params', 'misc_tuning_levels'): parse_params_list(node.value) return excluded, defaults @@ -208,7 +208,7 @@ def get_variables_data(): EXCLUDED_KEYS, DEFAULT_TYPES = get_variables_data() def get_editable_keys(): - filepath = os.path.join(REPO_ROOT, "frogpilot/common/frogpilot_variables.py") + filepath = os.path.join(REPO_ROOT, "starpilot/common/starpilot_variables.py") editable = set() if not os.path.exists(filepath): return editable @@ -220,11 +220,11 @@ def get_editable_keys(): value_node = None if isinstance(node, ast.Assign): for target in node.targets: - if getattr(target, 'id', '') == 'frogpilot_default_params': + if getattr(target, 'id', '') == 'starpilot_default_params': value_node = node.value break elif isinstance(node, ast.AnnAssign): - if getattr(node.target, 'id', '') == 'frogpilot_default_params': + if getattr(node.target, 'id', '') == 'starpilot_default_params': value_node = node.value if isinstance(value_node, ast.List): @@ -301,7 +301,7 @@ def extract_bracket_block(text, start_idx): return "" def parse_cpp_file(filename): - filepath = os.path.join(REPO_ROOT, "frogpilot/ui/qt/offroad", filename) + filepath = os.path.join(REPO_ROOT, "starpilot/ui/qt/offroad", filename) if not os.path.exists(filepath): return [] with open(filepath, 'r', encoding='utf-8') as f: @@ -322,7 +322,7 @@ def parse_cpp_file(filename): child_to_qsets = {} header_filename = filename.replace(".cc", ".h") - header_filepath = os.path.join(REPO_ROOT, "frogpilot/ui/qt/offroad", header_filename) + header_filepath = os.path.join(REPO_ROOT, "starpilot/ui/qt/offroad", header_filename) full_source = content if os.path.exists(header_filepath): with open(header_filepath, 'r', encoding='utf-8') as fh: @@ -421,7 +421,7 @@ def parse_cpp_file(filename): if snippet_match: assignment = snippet_match.group(1) - if "FrogPilotParamValueControl" in assignment or "FrogPilotParamValueButtonControl" in assignment: + if "StarPilotParamValueControl" in assignment or "StarPilotParamValueButtonControl" in assignment: widget_type = "numeric" if data_type in ("string", "bool", "unknown"): data_type = "float" @@ -491,7 +491,7 @@ def parse_cpp_file(filename): items.append(s) - # Mirror CELead's split sub-toggles from FrogPilotButtonToggleControl. + # Mirror CELead's split sub-toggles from StarPilotButtonToggleControl. if key == "CELead": items.extend([ { @@ -542,7 +542,7 @@ def main(): "icon": cat["icon"], "params": items }) - output_path = os.path.join(REPO_ROOT, "frogpilot/system/the_pond/assets/components/tools/device_settings_layout.json") + output_path = os.path.join(REPO_ROOT, "starpilot/system/the_pond/assets/components/tools/device_settings_layout.json") with open(output_path, 'w', encoding='utf-8') as f: json.dump(layout, f, indent=2) diff --git a/tools/agnos/patch_system_reset_image.py b/tools/agnos/patch_system_reset_image.py index 5ca92e30..51fa82da 100644 --- a/tools/agnos/patch_system_reset_image.py +++ b/tools/agnos/patch_system_reset_image.py @@ -484,7 +484,7 @@ def pick_source_url(system_entry: dict, override: str | None) -> str: def find_default_reference_manifest(primary_manifest_path: Path) -> Path | None: # Expected tree layout for local development: - # /frogpilot/system/hardware/tici/agnos.json + # /starpilot/system/hardware/tici/agnos.json # /openpilot/system/hardware/tici/agnos.json repo_root = primary_manifest_path for _ in range(4): diff --git a/tools/lib/api.py b/tools/lib/api.py index db5f94cd..50fe296e 100644 --- a/tools/lib/api.py +++ b/tools/lib/api.py @@ -1,7 +1,7 @@ import os import requests -from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server +from openpilot.starpilot.common.starpilot_utilities import use_konik_server API_HOST = os.getenv('API_HOST', f"https://api.{'konik.ai' if use_konik_server() else 'commadotai.com'}") diff --git a/tools/lib/auth.py b/tools/lib/auth.py index 2e1de97c..cabdb84e 100755 --- a/tools/lib/auth.py +++ b/tools/lib/auth.py @@ -33,7 +33,7 @@ from urllib.parse import parse_qs, urlencode from openpilot.tools.lib.api import APIError, CommaApi, UnauthorizedError from openpilot.tools.lib.auth_config import set_token, get_token -from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server +from openpilot.starpilot.common.starpilot_utilities import use_konik_server API_HOST = os.getenv('API_HOST', f"https://api.{'konik' if use_konik_server() else 'comma'}.ai") PORT = 3000 diff --git a/tools/scripts/fetch_image_from_route.py b/tools/scripts/fetch_image_from_route.py index 40e4a316..d02f75fd 100755 --- a/tools/scripts/fetch_image_from_route.py +++ b/tools/scripts/fetch_image_from_route.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from openpilot.frogpilot.common.frogpilot_utilities import use_konik_server +from openpilot.starpilot.common.starpilot_utilities import use_konik_server if len(sys.argv) < 4: print(f"{sys.argv[0]} [front|wide|driver]")

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±8;7z|qTtus^v{%W#V# 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