mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-09-11 18:53:47 +08:00
OBDyssey
This commit is contained in:
@@ -5,7 +5,7 @@ from functools import partial
|
||||
|
||||
import pyray as rl
|
||||
|
||||
from openpilot.starpilot.system.bluetooth.protocol import BluetoothDevice, BluetoothStatus
|
||||
from openpilot.starpilot.system.bluetooth.protocol import BluetoothDevice, BluetoothStatus, looks_like_obd_device
|
||||
from openpilot.system.ui.lib.application import FontWeight, MousePos, gui_app
|
||||
from openpilot.system.ui.lib.bluetooth_manager import BluetoothManager
|
||||
from openpilot.system.ui.lib.multilang import tr
|
||||
@@ -23,6 +23,7 @@ HEADER_HEIGHT = 180
|
||||
ITEM_HEIGHT = 160
|
||||
HEADER_PADDING = 40
|
||||
SCAN_BUTTON_WIDTH = 260
|
||||
OBDYSSEY_BUTTON_WIDTH = 260
|
||||
FORGET_BUTTON_WIDTH = 180
|
||||
ACTION_GAP = 35
|
||||
|
||||
@@ -35,6 +36,10 @@ TEXT_DISABLED = rl.Color(150, 150, 150, 255)
|
||||
TEXT_CONNECTED = rl.Color(113, 209, 135, 255)
|
||||
|
||||
|
||||
def is_obd_device(device: BluetoothDevice) -> bool:
|
||||
return (device.serial or looks_like_obd_device(device.name)) and not (device.audio or device.controller)
|
||||
|
||||
|
||||
def device_status_text(device: BluetoothDevice, operation: str, selected_audio: str) -> str:
|
||||
"""Return the concise, state-first label shown below a Bluetooth device name."""
|
||||
if operation:
|
||||
@@ -45,11 +50,15 @@ def device_status_text(device: BluetoothDevice, operation: str, selected_audio:
|
||||
capabilities.append(tr("audio output") if selected_audio.upper() == device.address.upper() else tr("audio"))
|
||||
if device.controller:
|
||||
capabilities.append(tr("controller"))
|
||||
if device.serial or looks_like_obd_device(device.name):
|
||||
capabilities.append(tr("OBD-II"))
|
||||
capability_text = " / ".join(capabilities)
|
||||
|
||||
if device.connected:
|
||||
return tr("Connected") + (f" / {capability_text}" if capability_text else "")
|
||||
if device.paired:
|
||||
if is_obd_device(device):
|
||||
return tr("Paired - tap to open OBDyssey")
|
||||
return tr("Paired - tap to connect")
|
||||
return tr("Tap to pair") + (f" / {capability_text}" if capability_text else "")
|
||||
|
||||
@@ -183,6 +192,7 @@ class BluetoothManagerUI(Widget):
|
||||
self._scroll_panel = GuiScrollPanel()
|
||||
self._power_toggle = Toggle(initial_state=False, callback=self._toggle_power)
|
||||
self._scan_button = Button(tr("Scan"), self._scan, button_style=ButtonStyle.NORMAL, font_size=42)
|
||||
self._obdyssey_button = Button(tr("OBDyssey"), self._open_obdyssey, button_style=ButtonStyle.PRIMARY, font_size=42)
|
||||
self._device_rows: dict[str, BluetoothDeviceRow] = {}
|
||||
self._pending_power: bool | None = None
|
||||
self._scan_pending = False
|
||||
@@ -192,6 +202,10 @@ class BluetoothManagerUI(Widget):
|
||||
self._last_operation_error = ""
|
||||
self._keyboard = Keyboard(max_text_size=32, min_text_size=1, password_mode=False)
|
||||
|
||||
def _open_obdyssey(self, address: str = ""):
|
||||
from openpilot.system.ui.widgets.obdyssey import OBDysseyScreen
|
||||
gui_app.push_widget(OBDysseyScreen(adapter_address=address))
|
||||
|
||||
def show_event(self):
|
||||
super().show_event()
|
||||
self._manager.set_active(True)
|
||||
@@ -264,6 +278,8 @@ class BluetoothManagerUI(Widget):
|
||||
return
|
||||
if not device.paired:
|
||||
self._manager.pair(device.address)
|
||||
elif is_obd_device(device):
|
||||
self._open_obdyssey(device.address)
|
||||
elif not device.connected:
|
||||
self._manager.connect(device.address)
|
||||
else:
|
||||
@@ -406,11 +422,17 @@ class BluetoothManagerUI(Widget):
|
||||
subtitle += " - " + tr("Limited while driving")
|
||||
gui_label(rl.Rectangle(rect.x + HEADER_PADDING, rect.y + 104, 650, 44), subtitle, font_size=40, color=TEXT_SECONDARY)
|
||||
|
||||
has_obd = any((device.connected or device.paired) and (device.serial or looks_like_obd_device(device.name)) for device in status.devices)
|
||||
|
||||
toggle_rect = rl.Rectangle(rect.x + rect.width - HEADER_PADDING - 160, rect.y + (rect.height - 80) / 2, 160, 80)
|
||||
self._power_toggle.render(toggle_rect)
|
||||
scan_rect = rl.Rectangle(toggle_rect.x - ACTION_GAP - SCAN_BUTTON_WIDTH, rect.y + (rect.height - 100) / 2, SCAN_BUTTON_WIDTH, 100)
|
||||
self._scan_button.render(scan_rect)
|
||||
|
||||
if has_obd:
|
||||
obdyssey_rect = rl.Rectangle(scan_rect.x - ACTION_GAP - OBDYSSEY_BUTTON_WIDTH, rect.y + (rect.height - 100) / 2, OBDYSSEY_BUTTON_WIDTH, 100)
|
||||
self._obdyssey_button.render(obdyssey_rect)
|
||||
|
||||
def _render_device_list(self, rect: rl.Rectangle, rows: list[BluetoothDeviceRow]):
|
||||
content_rect = rl.Rectangle(rect.x, rect.y, rect.width, len(rows) * ITEM_HEIGHT)
|
||||
offset = self._scroll_panel.update(rect, content_rect)
|
||||
|
||||
Reference in New Issue
Block a user