|
|
|
@ -13,7 +13,7 @@ from openpilot.system.ui.lib.application import gui_app, FontWeight |
|
|
|
|
from openpilot.system.ui.widgets import Widget |
|
|
|
|
from openpilot.system.ui.widgets.button import Button, ButtonStyle, ButtonRadio |
|
|
|
|
from openpilot.system.ui.widgets.keyboard import Keyboard |
|
|
|
|
from openpilot.system.ui.widgets.label import gui_label, gui_text_box, Label, TextAlignment |
|
|
|
|
from openpilot.system.ui.widgets.label import Label, TextAlignment |
|
|
|
|
from openpilot.system.ui.widgets.network import WifiManagerUI, WifiManagerWrapper |
|
|
|
|
|
|
|
|
|
NetworkType = log.DeviceState.NetworkType |
|
|
|
@ -60,21 +60,38 @@ class Setup(Widget): |
|
|
|
|
self.selected_radio = None |
|
|
|
|
self.warning = gui_app.texture("icons/warning.png", 150, 150) |
|
|
|
|
self.checkmark = gui_app.texture("icons/circled_check.png", 100, 100) |
|
|
|
|
|
|
|
|
|
self._low_voltage_title_label = Label("WARNING: Low Voltage", TITLE_FONT_SIZE, FontWeight.MEDIUM, TextAlignment.LEFT, text_color=rl.Color(255, 89, 79, 255)) |
|
|
|
|
self._low_voltage_body_label = Label("Power your device in a car with a harness or proceed at your own risk.", BODY_FONT_SIZE, |
|
|
|
|
text_alignment=TextAlignment.LEFT) |
|
|
|
|
self._low_voltage_continue_button = Button("Continue", self._low_voltage_continue_button_callback) |
|
|
|
|
self._low_voltage_poweroff_button = Button("Power Off", HARDWARE.shutdown) |
|
|
|
|
|
|
|
|
|
self._getting_started_button = Button("", self._getting_started_button_callback, button_style=ButtonStyle.PRIMARY, border_radius=0) |
|
|
|
|
self._getting_started_title_label = Label("Getting Started", TITLE_FONT_SIZE, FontWeight.BOLD, TextAlignment.LEFT) |
|
|
|
|
self._getting_started_body_label = Label("Before we get on the road, let's finish installation and cover some details.", |
|
|
|
|
BODY_FONT_SIZE, text_alignment=TextAlignment.LEFT) |
|
|
|
|
|
|
|
|
|
self._software_selection_openpilot_button = ButtonRadio("openpilot", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) |
|
|
|
|
self._software_selection_custom_software_button = ButtonRadio("Custom Software", self.checkmark, font_size=BODY_FONT_SIZE, text_padding=80) |
|
|
|
|
self._software_selection_continue_button = Button("Continue", self._software_selection_continue_button_callback, |
|
|
|
|
button_style=ButtonStyle.PRIMARY) |
|
|
|
|
self._software_selection_continue_button.set_enabled(False) |
|
|
|
|
self._software_selection_back_button = Button("Back", self._software_selection_back_button_callback) |
|
|
|
|
self._software_selection_title_label = Label("Choose Software to Use", TITLE_FONT_SIZE, FontWeight.BOLD, TextAlignment.LEFT) |
|
|
|
|
|
|
|
|
|
self._download_failed_reboot_button = Button("Reboot device", HARDWARE.reboot) |
|
|
|
|
self._download_failed_startover_button = Button("Start over", self._download_failed_startover_button_callback, button_style=ButtonStyle.PRIMARY) |
|
|
|
|
self._download_failed_title_label = Label("Download Failed", TITLE_FONT_SIZE, FontWeight.BOLD, TextAlignment.LEFT) |
|
|
|
|
self._download_failed_url_label = Label("", 64, FontWeight.NORMAL, TextAlignment.LEFT) |
|
|
|
|
self._download_failed_body_label = Label("", BODY_FONT_SIZE, text_alignment=TextAlignment.LEFT) |
|
|
|
|
|
|
|
|
|
self._network_setup_back_button = Button("Back", self._network_setup_back_button_callback) |
|
|
|
|
self._network_setup_continue_button = Button("Waiting for internet", self._network_setup_continue_button_callback, |
|
|
|
|
button_style=ButtonStyle.PRIMARY) |
|
|
|
|
self._network_setup_continue_button.set_enabled(False) |
|
|
|
|
self._network_setup_title_label = Label("Connect to Wi-Fi", TITLE_FONT_SIZE, FontWeight.BOLD, TextAlignment.LEFT) |
|
|
|
|
|
|
|
|
|
self._custom_software_warning_continue_button = Button("Continue", self._custom_software_warning_continue_button_callback) |
|
|
|
|
self._custom_software_warning_back_button = Button("Back", self._custom_software_warning_back_button_callback) |
|
|
|
|
self._custom_software_warning_title_label = Label("WARNING: Custom Software", 100, FontWeight.BOLD, TextAlignment.LEFT, text_color=rl.Color(255,89,79,255), |
|
|
|
@ -83,6 +100,7 @@ class Setup(Widget): |
|
|
|
|
+ " and may cause damage to your device and/or vehicle.\n\nIf you'd like to proceed, use https://flash.comma.ai " |
|
|
|
|
+ "to restore your device to a factory state later.", |
|
|
|
|
85, text_alignment=TextAlignment.LEFT, text_padding=60) |
|
|
|
|
self._downloading_body_label = Label("Downloading...", TITLE_FONT_SIZE, FontWeight.MEDIUM) |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
with open("/sys/class/hwmon/hwmon1/in1_input") as f: |
|
|
|
@ -148,27 +166,19 @@ class Setup(Widget): |
|
|
|
|
def render_low_voltage(self, rect: rl.Rectangle): |
|
|
|
|
rl.draw_texture(self.warning, int(rect.x + 150), int(rect.y + 110), rl.WHITE) |
|
|
|
|
|
|
|
|
|
title_rect = rl.Rectangle(rect.x + 150, rect.y + 110 + 150 + 100, rect.width - 500 - 150, TITLE_FONT_SIZE) |
|
|
|
|
gui_label(title_rect, "WARNING: Low Voltage", TITLE_FONT_SIZE, rl.Color(255, 89, 79, 255), FontWeight.MEDIUM) |
|
|
|
|
|
|
|
|
|
body_rect = rl.Rectangle(rect.x + 150, rect.y + 110 + 150 + 100 + TITLE_FONT_SIZE + 25, rect.width - 500 - 150, BODY_FONT_SIZE * 3) |
|
|
|
|
gui_text_box(body_rect, "Power your device in a car with a harness or proceed at your own risk.", BODY_FONT_SIZE) |
|
|
|
|
self._low_voltage_title_label.render(rl.Rectangle(rect.x + 150, rect.y + 110 + 150 + 100, rect.width - 500 - 150, TITLE_FONT_SIZE)) |
|
|
|
|
self._low_voltage_body_label.render(rl.Rectangle(rect.x + 150, rect.y + 110 + 150 + 150, rect.width - 500, BODY_FONT_SIZE * 3)) |
|
|
|
|
|
|
|
|
|
button_width = (rect.width - MARGIN * 3) / 2 |
|
|
|
|
button_y = rect.height - MARGIN - BUTTON_HEIGHT |
|
|
|
|
|
|
|
|
|
self._low_voltage_poweroff_button.render(rl.Rectangle(rect.x + MARGIN, button_y, button_width, BUTTON_HEIGHT)) |
|
|
|
|
self._low_voltage_continue_button.render(rl.Rectangle(rect.x + MARGIN * 2 + button_width, button_y, button_width, BUTTON_HEIGHT)) |
|
|
|
|
|
|
|
|
|
def render_getting_started(self, rect: rl.Rectangle): |
|
|
|
|
title_rect = rl.Rectangle(rect.x + 165, rect.y + 280, rect.width - 265, TITLE_FONT_SIZE) |
|
|
|
|
gui_label(title_rect, "Getting Started", TITLE_FONT_SIZE, font_weight=FontWeight.MEDIUM) |
|
|
|
|
|
|
|
|
|
desc_rect = rl.Rectangle(rect.x + 165, rect.y + 280 + TITLE_FONT_SIZE + 90, rect.width - 500, BODY_FONT_SIZE * 3) |
|
|
|
|
gui_text_box(desc_rect, "Before we get on the road, let's finish installation and cover some details.", BODY_FONT_SIZE) |
|
|
|
|
self._getting_started_title_label.render(rl.Rectangle(rect.x + 165, rect.y + 280, rect.width - 265, TITLE_FONT_SIZE)) |
|
|
|
|
self._getting_started_body_label.render(rl.Rectangle(rect.x + 165, rect.y + 280 + TITLE_FONT_SIZE, rect.width - 500, BODY_FONT_SIZE * 3)) |
|
|
|
|
|
|
|
|
|
btn_rect = rl.Rectangle(rect.width - NEXT_BUTTON_WIDTH, 0, NEXT_BUTTON_WIDTH, rect.height) |
|
|
|
|
|
|
|
|
|
self._getting_started_button.render(btn_rect) |
|
|
|
|
triangle = gui_app.texture("images/button_continue_triangle.png", 54, int(btn_rect.height)) |
|
|
|
|
rl.draw_texture_v(triangle, rl.Vector2(btn_rect.x + btn_rect.width / 2 - triangle.width / 2, btn_rect.height / 2 - triangle.height / 2), rl.WHITE) |
|
|
|
@ -198,8 +208,7 @@ class Setup(Widget): |
|
|
|
|
self.network_check_thread.join() |
|
|
|
|
|
|
|
|
|
def render_network_setup(self, rect: rl.Rectangle): |
|
|
|
|
title_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE) |
|
|
|
|
gui_label(title_rect, "Connect to Wi-Fi", TITLE_FONT_SIZE, font_weight=FontWeight.MEDIUM) |
|
|
|
|
self._network_setup_title_label.render(rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE)) |
|
|
|
|
|
|
|
|
|
wifi_rect = rl.Rectangle(rect.x + MARGIN, rect.y + TITLE_FONT_SIZE + MARGIN + 25, rect.width - MARGIN * 2, |
|
|
|
|
rect.height - TITLE_FONT_SIZE - 25 - BUTTON_HEIGHT - MARGIN * 3) |
|
|
|
@ -220,8 +229,7 @@ class Setup(Widget): |
|
|
|
|
self._network_setup_continue_button.render(rl.Rectangle(rect.x + MARGIN + button_width + BUTTON_SPACING, button_y, button_width, BUTTON_HEIGHT)) |
|
|
|
|
|
|
|
|
|
def render_software_selection(self, rect: rl.Rectangle): |
|
|
|
|
title_rect = rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE) |
|
|
|
|
gui_label(title_rect, "Choose Software to Use", TITLE_FONT_SIZE, font_weight=FontWeight.MEDIUM) |
|
|
|
|
self._software_selection_title_label.render(rl.Rectangle(rect.x + MARGIN, rect.y + MARGIN, rect.width - MARGIN * 2, TITLE_FONT_SIZE)) |
|
|
|
|
|
|
|
|
|
radio_height = 230 |
|
|
|
|
radio_spacing = 30 |
|
|
|
@ -249,19 +257,15 @@ class Setup(Widget): |
|
|
|
|
self._software_selection_continue_button.render(rl.Rectangle(rect.x + MARGIN + button_width + BUTTON_SPACING, button_y, button_width, BUTTON_HEIGHT)) |
|
|
|
|
|
|
|
|
|
def render_downloading(self, rect: rl.Rectangle): |
|
|
|
|
title_rect = rl.Rectangle(rect.x, rect.y + rect.height / 2 - TITLE_FONT_SIZE / 2, rect.width, TITLE_FONT_SIZE) |
|
|
|
|
gui_label(title_rect, "Downloading...", TITLE_FONT_SIZE, font_weight=FontWeight.MEDIUM, alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER) |
|
|
|
|
self._downloading_body_label.render(rl.Rectangle(rect.x, rect.y + rect.height / 2 - TITLE_FONT_SIZE / 2, rect.width, TITLE_FONT_SIZE)) |
|
|
|
|
|
|
|
|
|
def render_download_failed(self, rect: rl.Rectangle): |
|
|
|
|
title_rect = rl.Rectangle(rect.x + 117, rect.y + 185, rect.width - 117, TITLE_FONT_SIZE) |
|
|
|
|
gui_label(title_rect, "Download Failed", TITLE_FONT_SIZE, font_weight=FontWeight.MEDIUM) |
|
|
|
|
|
|
|
|
|
url_rect = rl.Rectangle(rect.x + 117, rect.y + 185 + TITLE_FONT_SIZE + 67, rect.width - 117 - 100, 64) |
|
|
|
|
gui_label(url_rect, self.failed_url, 64, font_weight=FontWeight.NORMAL) |
|
|
|
|
self._download_failed_title_label.render(rl.Rectangle(rect.x + 117, rect.y + 185, rect.width - 117, TITLE_FONT_SIZE)) |
|
|
|
|
self._download_failed_url_label.set_text(self.failed_url) |
|
|
|
|
self._download_failed_url_label.render(rl.Rectangle(rect.x + 117, rect.y + 185 + TITLE_FONT_SIZE + 67, rect.width - 117 - 100, 64)) |
|
|
|
|
|
|
|
|
|
error_rect = rl.Rectangle(rect.x + 117, rect.y + 185 + TITLE_FONT_SIZE + 67 + 64 + 48, |
|
|
|
|
rect.width - 117 - 100, rect.height - 185 + TITLE_FONT_SIZE + 67 + 64 + 48 - BUTTON_HEIGHT - MARGIN * 2) |
|
|
|
|
gui_text_box(error_rect, self.failed_reason, BODY_FONT_SIZE) |
|
|
|
|
self._download_failed_body_label.set_text(self.failed_reason) |
|
|
|
|
self._download_failed_body_label.render(rl.Rectangle(rect.x + 117, rect.y, rect.width - 117 - 100, rect.height)) |
|
|
|
|
|
|
|
|
|
button_width = (rect.width - BUTTON_SPACING - MARGIN * 2) / 2 |
|
|
|
|
button_y = rect.height - BUTTON_HEIGHT - MARGIN |
|
|
|
|