From b48f9846d5e982bc8f3dfe8da2498daf51e94d63 Mon Sep 17 00:00:00 2001 From: PitresAli Date: Tue, 25 Aug 2026 22:24:03 +0200 Subject: [PATCH] Add interface preview and fix WebView bridge exposure --- SUB Control/README.md | 2 ++ SUB Control/docs/sub-control-interface.png | Bin 0 -> 50134 bytes SUB Control/web/index.html | 2 +- SUB Control/web_ui.py | 24 +++++++++++---------- 4 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 SUB Control/docs/sub-control-interface.png diff --git a/SUB Control/README.md b/SUB Control/README.md index bc9db4a..86148ee 100644 --- a/SUB Control/README.md +++ b/SUB Control/README.md @@ -4,6 +4,8 @@ A deliberately small, low-bandwidth MAVLink controller for bench-testing an ArduSub vehicle over a USB serial connection. It sends no parameter-list request and no telemetry-stream request. +![SUB Control interface](docs/sub-control-interface.png) + The desktop window uses a local HTML/CSS/JavaScript interface rendered by the Windows WebView. Python remains the only launcher and owns the MAVLink worker, arming, logging, output limiting, and parameter writes. It does not run a web diff --git a/SUB Control/docs/sub-control-interface.png b/SUB Control/docs/sub-control-interface.png new file mode 100644 index 0000000000000000000000000000000000000000..db24d5bf79055c54358d7daaa169b62df7c67854 GIT binary patch literal 50134 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 z�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 GcK#32rN;9B literal 0 HcmV?d00001 diff --git a/SUB Control/web/index.html b/SUB Control/web/index.html index 9b0248d..116d5ca 100644 --- a/SUB Control/web/index.html +++ b/SUB Control/web/index.html @@ -62,7 +62,7 @@
PILOT CONSOLE

Drive

- + diff --git a/SUB Control/web_ui.py b/SUB Control/web_ui.py index 2b824c0..0eaa2a9 100644 --- a/SUB Control/web_ui.py +++ b/SUB Control/web_ui.py @@ -35,7 +35,9 @@ class ControlApi: self.motor_directions: dict[int, int] = {} self.battery_path = Path(__file__).resolve().parent / "battery_settings.json" self.model_path = Path(__file__).resolve().parent / "model_settings.json" - self.window = None + # Leading underscore keeps the native WebView object out of js_api + # serialization. Only the small public methods below are exposed. + self._window = None self.maximized = False self.battery_config = { "cells": 4, "capacity_mah": 5500, "c_rating": 35, @@ -58,29 +60,29 @@ class ControlApi: return [p.device for p in list_ports.comports()] def minimize_window(self): - if self.window: - self.window.minimize() + if self._window: + self._window.minimize() return True def toggle_maximize_window(self): - if not self.window: + if not self._window: return False if self.maximized: - self.window.restore() + self._window.restore() else: - self.window.maximize() + self._window.maximize() self.maximized = not self.maximized return self.maximized def close_window(self): - if self.window: - self.window.destroy() + if self._window: + self._window.destroy() return True def choose_model(self): - if not self.window: + if not self._window: raise RuntimeError("Window is not ready") - selected = self.window.create_file_dialog( + selected = self._window.create_file_dialog( webview.OPEN_DIALOG, allow_multiple=False, file_types=("STL mesh (*.stl)", "STEP model (*.step;*.stp)"), @@ -285,7 +287,7 @@ def main(): background_color="#111719", frameless=True, easy_drag=False, shadow=True, ) - api.window = window + api._window = window window.events.maximized += lambda: setattr(api, "maximized", True) window.events.restored += lambda: setattr(api, "maximized", False) try: