mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-10-28 00:53:45 +08:00
58 lines
2.1 KiB
Python
58 lines
2.1 KiB
Python
"""Lazy map resources for the native large screen; GPU preparation precedes drawing."""
|
|
|
|
import pyray as rl
|
|
|
|
from openpilot.starpilot.system.android_auto.projection_map_lease import projection_map_active
|
|
from openpilot.system.ui.lib.application import gui_app
|
|
|
|
|
|
class NativeMapLayer:
|
|
def __init__(self, fonts, ui_state):
|
|
self.fonts, self.ui = fonts, ui_state
|
|
self.map = self.feed = None
|
|
self.pending = None
|
|
self.prepared_size = None
|
|
gui_app.add_render_prepare(self.prepare, self.close)
|
|
|
|
@staticmethod
|
|
def placement(state):
|
|
placed = state.customization["layouts"]["large"].get("nav_map")
|
|
return placed if placed is not None and placed["enabled"] else None
|
|
|
|
def prepare(self):
|
|
# The preceding rendered frame requests the next map. Hidden pages stop
|
|
# requesting it, so their worker, GPS subscription and GPU targets go away.
|
|
# Android Auto's own map takes precedence, so only one tile worker runs.
|
|
state, self.pending = self.pending, None
|
|
placed = self.placement(state) if state is not None and self.ui.started and not projection_map_active() else None
|
|
if placed is None:
|
|
self._release()
|
|
return
|
|
if self.map is None:
|
|
from openpilot.starpilot.ui.onroad_map import MapFeed, MapOverlay
|
|
self.map = MapOverlay(fonts=self.fonts)
|
|
self.feed = MapFeed()
|
|
self.map.prepare(self.feed.read(self.ui.sm), placed["width"], placed["height"])
|
|
self.prepared_size = (placed["width"], placed["height"])
|
|
|
|
def render(self, _rect, state):
|
|
placed = self.placement(state)
|
|
if placed is None or not self.ui.started or projection_map_active():
|
|
self.pending = None
|
|
return
|
|
self.pending = state
|
|
if self.map is not None and self.prepared_size == (placed["width"], placed["height"]):
|
|
self.map.draw(rl.Rectangle(placed["x"] + state.viewport_width - 1860, placed["y"], placed["width"], placed["height"]),
|
|
placed["opacity"] / 100)
|
|
|
|
def _release(self):
|
|
if self.map is not None:
|
|
self.map.close()
|
|
self.map = self.feed = None
|
|
self.prepared_size = None
|
|
|
|
def close(self):
|
|
gui_app.remove_render_prepare(self.prepare)
|
|
self.pending = None
|
|
self._release()
|