diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index aab16ffbbe..8d6449cb4b 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -107,6 +107,7 @@ jobs:
build_mac:
name: build macOS
+ if: false # temp disable since gcc-arm-embedded install is getting stuck due to checksum mismatch
runs-on: ${{ ((github.repository == 'commaai/openpilot') && ((github.event_name != 'pull_request') || (github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-macos-8x14' || 'macos-latest' }}
steps:
- uses: actions/checkout@v4
diff --git a/selfdrive/ui/layouts/home.py b/selfdrive/ui/layouts/home.py
index cd6ae600ef..c99c8fe12c 100644
--- a/selfdrive/ui/layouts/home.py
+++ b/selfdrive/ui/layouts/home.py
@@ -227,6 +227,6 @@ class HomeLayout(Widget):
self._prev_alerts_present = alerts_present
def _get_version_text(self) -> str:
- brand = "openpilot"
+ brand = "sunnypilot"
description = self.params.get("UpdaterCurrentDescription")
return f"{brand} {description}" if description else brand
diff --git a/selfdrive/ui/layouts/onboarding.py b/selfdrive/ui/layouts/onboarding.py
index 5d61c1c95a..b19cebb266 100644
--- a/selfdrive/ui/layouts/onboarding.py
+++ b/selfdrive/ui/layouts/onboarding.py
@@ -109,8 +109,8 @@ class TermsPage(Widget):
self._on_accept = on_accept
self._on_decline = on_decline
- self._title = Label(tr("Welcome to openpilot"), font_size=90, font_weight=FontWeight.BOLD, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT)
- self._desc = Label(tr("You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."),
+ self._title = Label(tr("Welcome to sunnypilot"), font_size=90, font_weight=FontWeight.BOLD, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT)
+ self._desc = Label(tr("You must accept the Terms and Conditions to use sunnypilot. Read the latest terms at https://comma.ai/terms before continuing."),
font_size=90, font_weight=FontWeight.MEDIUM, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT)
self._decline_btn = Button(tr("Decline"), click_callback=on_decline)
@@ -143,10 +143,10 @@ class TermsPage(Widget):
class DeclinePage(Widget):
def __init__(self, back_callback=None):
super().__init__()
- self._text = Label(tr("You must accept the Terms and Conditions in order to use openpilot."),
+ self._text = Label(tr("You must accept the Terms and Conditions in order to use sunnypilot."),
font_size=90, font_weight=FontWeight.MEDIUM, text_alignment=rl.GuiTextAlignment.TEXT_ALIGN_LEFT)
self._back_btn = Button(tr("Back"), click_callback=back_callback)
- self._uninstall_btn = Button(tr("Decline, uninstall openpilot"), button_style=ButtonStyle.DANGER,
+ self._uninstall_btn = Button(tr("Decline, uninstall sunnypilot"), button_style=ButtonStyle.DANGER,
click_callback=self._on_uninstall_clicked)
def _on_uninstall_clicked(self):
diff --git a/selfdrive/ui/layouts/settings/developer.py b/selfdrive/ui/layouts/settings/developer.py
index f47cd310ca..2ff94aa52d 100644
--- a/selfdrive/ui/layouts/settings/developer.py
+++ b/selfdrive/ui/layouts/settings/developer.py
@@ -23,10 +23,11 @@ DESCRIPTIONS = {
"other than your own. A comma employee will NEVER ask you to add their GitHub username."
),
'alpha_longitudinal': tr_noop(
- "WARNING: openpilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).
" +
- "On this car, openpilot defaults to the car's built-in ACC instead of openpilot's longitudinal control. " +
- "Enable this to switch to openpilot longitudinal control. Enabling Experimental mode is recommended when enabling openpilot longitudinal control alpha. " +
- "Changing this setting will restart openpilot if the car is powered on."
+ "WARNING: sunnypilot longitudinal control is in alpha for this car and will disable Automatic Emergency Braking (AEB).
" +
+ "On this car, sunnypilot defaults to the car's built-in ACC instead of sunnypilot's longitudinal control. " +
+ "Enable this to switch to sunnypilot longitudinal control. " +
+ "Enabling Experimental mode is recommended when enabling sunnypilot longitudinal control alpha. " +
+ "Changing this setting will restart sunnypilot if the car is powered on."
),
}
@@ -71,7 +72,7 @@ class DeveloperLayout(Widget):
)
self._alpha_long_toggle = toggle_item(
- lambda: tr("openpilot Longitudinal Control (Alpha)"),
+ lambda: tr("sunnypilot Longitudinal Control (Alpha)"),
description=lambda: tr(DESCRIPTIONS["alpha_longitudinal"]),
initial_state=self._params.get_bool("AlphaLongitudinalEnabled"),
callback=self._on_alpha_long_enabled,
@@ -148,6 +149,7 @@ class DeveloperLayout(Widget):
self._params.put_bool("ShowDebugInfo", state)
gui_app.set_show_touches(state)
gui_app.set_show_fps(state)
+ gui_app.set_show_mouse_coords(state)
def _on_enable_adb(self, state: bool):
self._params.put_bool("AdbEnabled", state)
diff --git a/selfdrive/ui/layouts/settings/device.py b/selfdrive/ui/layouts/settings/device.py
index 00ae6a188e..078623c882 100644
--- a/selfdrive/ui/layouts/settings/device.py
+++ b/selfdrive/ui/layouts/settings/device.py
@@ -23,8 +23,8 @@ from openpilot.system.ui.widgets.scroller_tici import Scroller
DESCRIPTIONS = {
'pair_device': tr_noop("Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer."),
'driver_camera': tr_noop("Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"),
- 'reset_calibration': tr_noop("openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down."),
- 'review_guide': tr_noop("Review the rules, features, and limitations of openpilot"),
+ 'reset_calibration': tr_noop("sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down."),
+ 'review_guide': tr_noop("Review the rules, features, and limitations of sunnypilot"),
}
@@ -162,8 +162,8 @@ class DeviceLayout(Widget):
cloudlog.exception("invalid LiveTorqueParameters")
desc += "
"
- desc += tr("openpilot is continuously calibrating, resetting is rarely required. " +
- "Resetting calibration will restart openpilot if the car is powered on.")
+ desc += tr("sunnypilot is continuously calibrating, resetting is rarely required. " +
+ "Resetting calibration will restart sunnypilot if the car is powered on.")
self._reset_calib_btn.set_description(desc)
diff --git a/selfdrive/ui/layouts/settings/firehose.py b/selfdrive/ui/layouts/settings/firehose.py
index bbd4aef532..5ab82fd8f5 100644
--- a/selfdrive/ui/layouts/settings/firehose.py
+++ b/selfdrive/ui/layouts/settings/firehose.py
@@ -17,7 +17,7 @@ from openpilot.selfdrive.ui.lib.api_helpers import get_token
TITLE = tr_noop("Firehose Mode")
DESCRIPTION = tr_noop(
- "openpilot learns to drive by watching humans, like you, drive.\n\n"
+ "sunnypilot learns to drive by watching humans, like you, drive.\n\n"
+ "Firehose Mode allows you to maximize your training data uploads to improve "
+ "openpilot's driving models. More data means bigger models, which means better Experimental Mode."
)
diff --git a/selfdrive/ui/layouts/settings/toggles.py b/selfdrive/ui/layouts/settings/toggles.py
index b7f176e24f..cd233aa3ac 100644
--- a/selfdrive/ui/layouts/settings/toggles.py
+++ b/selfdrive/ui/layouts/settings/toggles.py
@@ -17,20 +17,20 @@ PERSONALITY_TO_INT = log.LongitudinalPersonality.schema.enumerants
# Description constants
DESCRIPTIONS = {
"OpenpilotEnabledToggle": tr_noop(
- "Use the openpilot system for adaptive cruise control and lane keep driver assistance. " +
+ "Use the sunnypilot system for adaptive cruise control and lane keep driver assistance. " +
"Your attention is required at all times to use this feature."
),
- "DisengageOnAccelerator": tr_noop("When enabled, pressing the accelerator pedal will disengage openpilot."),
+ "DisengageOnAccelerator": tr_noop("When enabled, pressing the accelerator pedal will disengage sunnypilot."),
"LongitudinalPersonality": tr_noop(
- "Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. " +
- "In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with " +
+ "Standard is recommended. In aggressive mode, sunnypilot will follow lead cars closer and be more aggressive with the gas and brake. " +
+ "In relaxed mode sunnypilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with " +
"your steering wheel distance button."
),
"IsLdwEnabled": tr_noop(
"Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line " +
"without a turn signal activated while driving over 31 mph (50 km/h)."
),
- "AlwaysOnDM": tr_noop("Enable driver monitoring even when openpilot is not engaged."),
+ "AlwaysOnDM": tr_noop("Enable driver monitoring even when sunnypilot is not engaged."),
'RecordFront': tr_noop("Upload data from the driver facing camera and help improve the driver monitoring algorithm."),
"IsMetric": tr_noop("Display speed in km/h instead of mph."),
"RecordAudio": tr_noop("Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect."),
@@ -46,7 +46,7 @@ class TogglesLayout(Widget):
# param, title, desc, icon, needs_restart
self._toggle_defs = {
"OpenpilotEnabledToggle": (
- lambda: tr("Enable openpilot"),
+ lambda: tr("Enable sunnypilot"),
DESCRIPTIONS["OpenpilotEnabledToggle"],
"chffr_wheel.png",
True,
@@ -125,7 +125,7 @@ class TogglesLayout(Widget):
# Make description callable for live translation
additional_desc = ""
if needs_restart and not locked:
- additional_desc = tr("Changing this setting will restart openpilot if the car is powered on.")
+ additional_desc = tr("Changing this setting will restart sunnypilot if the car is powered on.")
toggle.set_description(lambda og_desc=toggle.description, add_desc=additional_desc: tr(og_desc) + (" " + tr(add_desc) if add_desc else ""))
# track for engaged state updates
@@ -158,10 +158,10 @@ class TogglesLayout(Widget):
ui_state.update_params()
e2e_description = tr(
- "openpilot defaults to driving in chill mode. Experimental mode enables alpha-level features that aren't ready for chill mode. " +
+ "sunnypilot defaults to driving in chill mode. Experimental mode enables alpha-level features that aren't ready for chill mode. " +
"Experimental features are listed below:
" +
"
End-to-End Longitudinal Control
" +
- "Let the driving model control the gas and brakes. openpilot will drive as it thinks a human would, including stopping for red lights and stop signs. " +
+ "Let the driving model control the gas and brakes. sunnypilot will drive as it thinks a human would, including stopping for red lights and stop signs. " +
"Since the driving model decides the speed to drive, the set speed will only act as an upper bound. This is an alpha quality feature; " +
"mistakes should be expected.
" +
"New Driving Visualization
" +
@@ -183,13 +183,13 @@ class TogglesLayout(Widget):
unavailable = tr("Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control.")
- long_desc = unavailable + " " + tr("openpilot longitudinal control may come in a future update.")
+ long_desc = unavailable + " " + tr("sunnypilot longitudinal control may come in a future update.")
if ui_state.CP.alphaLongitudinalAvailable:
if self._is_release:
- long_desc = unavailable + " " + tr("An alpha version of openpilot longitudinal control can be tested, along with " +
+ long_desc = unavailable + " " + tr("An alpha version of sunnypilot longitudinal control can be tested, along with " +
"Experimental mode, on non-release branches.")
else:
- long_desc = tr("Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode.")
+ long_desc = tr("Enable the sunnypilot longitudinal control (alpha) toggle to allow Experimental mode.")
self._toggles["ExperimentalMode"].set_description("" + long_desc + "
" + e2e_description)
else:
diff --git a/selfdrive/ui/mici/layouts/home.py b/selfdrive/ui/mici/layouts/home.py
index 014fc0c45f..fd4de9a717 100644
--- a/selfdrive/ui/mici/layouts/home.py
+++ b/selfdrive/ui/mici/layouts/home.py
@@ -45,7 +45,7 @@ class DeviceStatus(Widget):
self._version_text = self._get_version_text()
def _get_version_text(self) -> str:
- brand = "openpilot"
+ brand = "sunnypilot"
description = ui_state.params.get("UpdaterCurrentDescription")
return f"{brand} {description}" if description else brand
@@ -111,7 +111,7 @@ class MiciHomeLayout(Widget):
self._cell_high_txt = gui_app.texture("icons_mici/settings/network/cell_strength_high.png", 55, 35)
self._cell_full_txt = gui_app.texture("icons_mici/settings/network/cell_strength_full.png", 55, 35)
- self._openpilot_label = MiciLabel("openpilot", font_size=96, color=rl.Color(255, 255, 255, int(255 * 0.9)), font_weight=FontWeight.DISPLAY)
+ self._openpilot_label = MiciLabel("sunnypilot", font_size=96, color=rl.Color(255, 255, 255, int(255 * 0.9)), font_weight=FontWeight.DISPLAY)
self._version_label = MiciLabel("", font_size=36, font_weight=FontWeight.ROMAN)
self._large_version_label = MiciLabel("", font_size=64, color=rl.GRAY, font_weight=FontWeight.ROMAN)
self._date_label = MiciLabel("", font_size=36, color=rl.GRAY, font_weight=FontWeight.ROMAN)
diff --git a/selfdrive/ui/mici/layouts/offroad_alerts.py b/selfdrive/ui/mici/layouts/offroad_alerts.py
index 2e9a8bee3c..cdde40d4a6 100644
--- a/selfdrive/ui/mici/layouts/offroad_alerts.py
+++ b/selfdrive/ui/mici/layouts/offroad_alerts.py
@@ -254,7 +254,7 @@ class MiciOffroadAlerts(Widget):
parts = new_desc.split(" / ")
if len(parts) > 3:
version, date = parts[0], parts[3]
- update_alert_data.text = f"update available\n openpilot {version}, {date}. go to comma.ai/blog to read the release notes."
+ update_alert_data.text = f"update available\n sunnypilot {version}, {date}. go to comma.ai/blog to read the release notes."
update_alert_data.visible = True
active_count += 1
diff --git a/selfdrive/ui/mici/layouts/onboarding.py b/selfdrive/ui/mici/layouts/onboarding.py
index afc7bfce17..5f20cf7c78 100644
--- a/selfdrive/ui/mici/layouts/onboarding.py
+++ b/selfdrive/ui/mici/layouts/onboarding.py
@@ -182,7 +182,7 @@ class TrainingGuideAttentionNotice(SetupTermsPage):
def __init__(self, continue_callback):
super().__init__(continue_callback, continue_text="continue")
self._title_header = TermsHeader("driver assistance", gui_app.texture("icons_mici/setup/warning.png", 60, 60))
- self._warning_label = UnifiedLabel("1. openpilot is a driver assistance system.\n\n" +
+ self._warning_label = UnifiedLabel("1. sunnypilot is a driver assistance system.\n\n" +
"2. You must pay attention at all times.\n\n" +
"3. You must be ready to take over at any time.\n\n" +
"4. You are fully responsible for driving the car.", 42,
@@ -239,12 +239,12 @@ class TrainingGuide(Widget):
class DeclinePage(Widget):
def __init__(self, back_callback=None):
super().__init__()
- self._uninstall_slider = SmallSlider("uninstall openpilot", self._on_uninstall)
+ self._uninstall_slider = SmallSlider("uninstall sunnypilot", self._on_uninstall)
self._back_button = SmallButton("back")
self._back_button.set_click_callback(back_callback)
- self._warning_header = TermsHeader("you must accept the\nterms to use openpilot",
+ self._warning_header = TermsHeader("you must accept the\nterms to use sunnypilot",
gui_app.texture("icons_mici/setup/red_warning.png", 66, 60))
def _on_uninstall(self):
@@ -282,7 +282,7 @@ class TermsPage(SetupTermsPage):
info_txt = gui_app.texture("icons_mici/setup/green_info.png", 60, 60)
self._title_header = TermsHeader("terms & conditions", info_txt)
- self._terms_label = UnifiedLabel("You must accept the Terms and Conditions to use openpilot. " +
+ self._terms_label = UnifiedLabel("You must accept the Terms and Conditions to use sunnypilot. " +
"Read the latest terms at https://comma.ai/terms before continuing.", 36,
FontWeight.ROMAN)
diff --git a/selfdrive/ui/mici/layouts/settings/device.py b/selfdrive/ui/mici/layouts/settings/device.py
index b5e0ea838d..1d5e4989ec 100644
--- a/selfdrive/ui/mici/layouts/settings/device.py
+++ b/selfdrive/ui/mici/layouts/settings/device.py
@@ -156,7 +156,7 @@ class UpdateOpenpilotBigButton(BigButton):
self._txt_update_icon = gui_app.texture("icons_mici/settings/device/update.png", 64, 64)
self._txt_reboot_icon = gui_app.texture("icons_mici/settings/device/reboot.png", 64, 64)
self._txt_up_to_date_icon = gui_app.texture("icons_mici/settings/device/up_to_date.png", 64, 64)
- super().__init__("update openpilot", "", self._txt_update_icon)
+ super().__init__("update sunnypilot", "", self._txt_update_icon)
self._waiting_for_updater_t: float | None = None
self._hide_value_t: float | None = None
@@ -193,7 +193,7 @@ class UpdateOpenpilotBigButton(BigButton):
if value:
self.set_text("")
else:
- self.set_text("update openpilot")
+ self.set_text("update sunnypilot")
def _update_state(self):
if ui_state.started:
@@ -294,7 +294,7 @@ class DeviceLayoutMici(NavWidget):
reset_calibration_btn = BigButton("reset calibration", "", "icons_mici/settings/device/lkas.png")
reset_calibration_btn.set_click_callback(lambda: _engaged_confirmation_callback(reset_calibration_callback, "reset"))
- uninstall_openpilot_btn = BigButton("uninstall openpilot", "", "icons_mici/settings/device/uninstall.png")
+ uninstall_openpilot_btn = BigButton("uninstall sunnypilot", "", "icons_mici/settings/device/uninstall.png")
uninstall_openpilot_btn.set_click_callback(lambda: _engaged_confirmation_callback(uninstall_openpilot_callback, "uninstall"))
reboot_btn = BigCircleButton("icons_mici/settings/device/reboot.png", red=False)
diff --git a/selfdrive/ui/mici/layouts/settings/firehose.py b/selfdrive/ui/mici/layouts/settings/firehose.py
index 303d976b07..18731d675e 100644
--- a/selfdrive/ui/mici/layouts/settings/firehose.py
+++ b/selfdrive/ui/mici/layouts/settings/firehose.py
@@ -17,7 +17,7 @@ from openpilot.system.ui.widgets import NavWidget
TITLE = tr_noop("Firehose Mode")
DESCRIPTION = tr_noop(
- "openpilot learns to drive by watching humans, like you, drive.\n\n"
+ "sunnypilot learns to drive by watching humans, like you, drive.\n\n"
+ "Firehose Mode allows you to maximize your training data uploads to improve "
+ "openpilot's driving models. More data means bigger models, which means better Experimental Mode."
)
diff --git a/selfdrive/ui/mici/layouts/settings/toggles.py b/selfdrive/ui/mici/layouts/settings/toggles.py
index 8efb516a42..82a78ce37c 100644
--- a/selfdrive/ui/mici/layouts/settings/toggles.py
+++ b/selfdrive/ui/mici/layouts/settings/toggles.py
@@ -24,7 +24,7 @@ class TogglesLayoutMici(NavWidget):
always_on_dm_toggle = BigParamControl("always-on driver monitor", "AlwaysOnDM")
record_front = BigParamControl("record & upload driver camera", "RecordFront", toggle_callback=restart_needed_callback)
record_mic = BigParamControl("record & upload mic audio", "RecordAudio", toggle_callback=restart_needed_callback)
- enable_openpilot = BigParamControl("enable openpilot", "OpenpilotEnabledToggle", toggle_callback=restart_needed_callback)
+ enable_openpilot = BigParamControl("enable sunnypilot", "OpenpilotEnabledToggle", toggle_callback=restart_needed_callback)
self._scroller = Scroller([
self._personality_toggle,
diff --git a/selfdrive/ui/mici/onroad/alert_renderer.py b/selfdrive/ui/mici/onroad/alert_renderer.py
index eb5555660a..b7f0098073 100644
--- a/selfdrive/ui/mici/onroad/alert_renderer.py
+++ b/selfdrive/ui/mici/onroad/alert_renderer.py
@@ -65,7 +65,7 @@ class Alert:
# Pre-defined alert instances
ALERT_STARTUP_PENDING = Alert(
- text1="openpilot Unavailable",
+ text1="sunnypilot Unavailable",
text2="Waiting to start",
size=AlertSize.mid,
status=AlertStatus.normal,
diff --git a/selfdrive/ui/mici/onroad/augmented_road_view.py b/selfdrive/ui/mici/onroad/augmented_road_view.py
index ab55f392f7..64d57e8958 100644
--- a/selfdrive/ui/mici/onroad/augmented_road_view.py
+++ b/selfdrive/ui/mici/onroad/augmented_road_view.py
@@ -153,7 +153,7 @@ class AugmentedRoadView(CameraView):
self._alert_renderer = AlertRenderer()
self._driver_state_renderer = DriverStateRenderer()
self._confidence_ball = ConfidenceBall()
- self._offroad_label = UnifiedLabel("start the car to\nuse openpilot", 54, FontWeight.DISPLAY,
+ self._offroad_label = UnifiedLabel("start the car to\nuse sunnypilot", 54, FontWeight.DISPLAY,
text_color=rl.Color(255, 255, 255, int(255 * 0.9)),
alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER,
alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE)
@@ -171,7 +171,7 @@ class AugmentedRoadView(CameraView):
if ui_state.panda_type == log.PandaState.PandaType.unknown:
self._offroad_label.set_text("system booting")
else:
- self._offroad_label.set_text("start the car to\nuse openpilot")
+ self._offroad_label.set_text("start the car to\nuse sunnypilot")
def _handle_mouse_release(self, mouse_pos: MousePos):
# Don't trigger click callback if bookmark was triggered
diff --git a/selfdrive/ui/onroad/alert_renderer.py b/selfdrive/ui/onroad/alert_renderer.py
index a81fbfc440..1e5f99cc66 100644
--- a/selfdrive/ui/onroad/alert_renderer.py
+++ b/selfdrive/ui/onroad/alert_renderer.py
@@ -48,7 +48,7 @@ class Alert:
# Pre-defined alert instances
ALERT_STARTUP_PENDING = Alert(
- text1=tr("openpilot Unavailable"),
+ text1=tr("sunnypilot Unavailable"),
text2=tr("Waiting to start"),
size=AlertSize.mid,
status=AlertStatus.normal,
diff --git a/selfdrive/ui/tests/test_ui/raylib_screenshots.py b/selfdrive/ui/tests/test_ui/raylib_screenshots.py
index cd383e4bc3..e64398d227 100755
--- a/selfdrive/ui/tests/test_ui/raylib_screenshots.py
+++ b/selfdrive/ui/tests/test_ui/raylib_screenshots.py
@@ -151,7 +151,7 @@ def setup_experimental_mode_description(click, pm: PubMaster, scroll=None):
def setup_openpilot_long_confirmation_dialog(click, pm: PubMaster, scroll=None):
setup_settings_developer(click, pm, scroll=scroll)
- click(650, 960) # toggle openpilot longitudinal control
+ click(650, 960) # toggle sunnypilot longitudinal control
def setup_settings_sunnylink(click, pm: PubMaster, scroll=None):
diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py
index 7271127838..e4850e9cbc 100644
--- a/system/ui/lib/application.py
+++ b/system/ui/lib/application.py
@@ -227,6 +227,8 @@ class GuiApplication(GuiApplicationExt):
self._render_profiler = None
self._render_profile_start_time = None
+ GuiApplicationExt.__init__(self)
+
@property
def frame(self):
return self._frame
@@ -467,6 +469,9 @@ class GuiApplication(GuiApplicationExt):
if self._show_touches:
self._draw_touch_points()
+ if self._show_mouse_coords:
+ self._draw_mouse_coordinates(gui_app.font(FontWeight.SEMI_BOLD))
+
if self._grid_size > 0:
self._draw_grid()
diff --git a/system/ui/lib/wifi_manager.py b/system/ui/lib/wifi_manager.py
index 28bd58f226..cd809f2699 100644
--- a/system/ui/lib/wifi_manager.py
+++ b/system/ui/lib/wifi_manager.py
@@ -383,7 +383,7 @@ class WifiManager:
'connection': {
'type': ('s', '802-11-wireless'),
'uuid': ('s', str(uuid.uuid4())),
- 'id': ('s', f'openpilot connection {ssid}'),
+ 'id': ('s', f'sunnypilot connection {ssid}'),
'autoconnect-retries': ('i', 0),
},
'802-11-wireless': {
diff --git a/system/ui/mici_setup.py b/system/ui/mici_setup.py
index d7395f9b7a..316e6c4a8b 100755
--- a/system/ui/mici_setup.py
+++ b/system/ui/mici_setup.py
@@ -701,7 +701,7 @@ class Setup(Widget):
except urllib.error.HTTPError as e:
if e.code == 409:
- error_msg = "Incompatible openpilot version"
+ error_msg = "Incompatible sunnypilot version"
self.download_failed(self.download_url, error_msg)
except Exception:
error_msg = "Invalid URL"
diff --git a/system/ui/sunnypilot/lib/application.py b/system/ui/sunnypilot/lib/application.py
index b39bf31e9d..481886e37a 100644
--- a/system/ui/sunnypilot/lib/application.py
+++ b/system/ui/sunnypilot/lib/application.py
@@ -6,10 +6,35 @@ See the LICENSE.md file in the root directory for more details.
"""
import os
+import pyray as rl
+
+SHOW_MOUSE_COORDS = os.getenv("SHOW_MOUSE_COORDS") == "1"
SUNNYPILOT_UI = os.getenv("SUNNYPILOT_UI", "1") == "1"
class GuiApplicationExt:
+ def __init__(self):
+ self._show_mouse_coords = SHOW_MOUSE_COORDS
+
@staticmethod
def sunnypilot_ui() -> bool:
return SUNNYPILOT_UI
+
+ def _draw_mouse_coordinates(self, font):
+ coords_text = f"X:{int(rl.get_mouse_x())}, Y:{int(rl.get_mouse_y())}"
+
+ green_color = rl.Color(0, 159, 47, 255) # Match the green color of FPS counter
+
+ # Calculate text width to position it at the right edge; estimate width based on text length
+ # Each character is approximately 10-12 pixels wide at font size 20
+ estimated_text_width = len(coords_text) * 11
+
+ # Position text at the top right corner, 10px from the top
+ screen_width = self._scaled_width if self._scale != 1.0 else self._width
+ text_pos = rl.Vector2(screen_width - estimated_text_width - 10, 6)
+
+ # Draw the text
+ rl.draw_text_ex(font, coords_text, text_pos, 20, 0, green_color)
+
+ def set_show_mouse_coords(self, show: bool):
+ self._show_mouse_coords = show