Wi-Fi over USB tab for firmware with the USB console (v13)
Writes / reads / removes the box's Wi-Fi over the serial port with the usb_console commands (kota ping, wifi set|get|clear, health) and follows the box through the restart until it joins the network. The password is sent hex-encoded and never logged. firmware/ now holds merged-binary-v13.bin (build 3ae273ec) instead of the previous 1.0.16 build; error_ids.csv synced with the firmware. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0d21c5c205
commit
ab420220e1
11 files changed
+758
No files matched your search
@@ -28,6 +28,7 @@ from ..core.logline import LineKind, LogLine, host_event
|
||||
from ..core.session import SessionLog
|
||||
from ..diag.engine import DiagnosticsEngine
|
||||
from ..diag.guides import GuideRunner
|
||||
from ..serialio.commands import loggable
|
||||
from ..serialio.manager import SerialManager, State
|
||||
from ..serialio.ports import PortInfo, list_serial_ports
|
||||
from ..matter.payload import SetupPayload, payload_from_log
|
||||
@@ -38,6 +39,7 @@ from .flash_tab import FlashTab
|
||||
from .matter_qr import MatterQrDialog
|
||||
from .guide_panel import GuidePanel
|
||||
from .sd_tab import SdTab
|
||||
from .wifi_tab import WifiTab
|
||||
|
||||
MAX_LINES = 20000
|
||||
# "KOTA" = the firmware's structured diagnostic lines (1.0.16+) plus errors.
|
||||
@@ -76,6 +78,7 @@ class SerialTab(QWidget):
|
||||
self._engine = DiagnosticsEngine()
|
||||
self._diag_dirty = True
|
||||
self._runner = GuideRunner(self._engine, on_action=self._guide_action, on_log=self._guide_log)
|
||||
self._line_listeners: list = [] # other tabs following the live log (Wi-Fi over USB)
|
||||
|
||||
# --- controls
|
||||
self.port_combo = QComboBox(minimumWidth=320)
|
||||
@@ -237,6 +240,39 @@ class SerialTab(QWidget):
|
||||
def engine(self) -> DiagnosticsEngine:
|
||||
return self._engine
|
||||
|
||||
# ---- commands to the box (firmware usb_console) -----------------------
|
||||
@property
|
||||
def is_connected(self) -> bool:
|
||||
return self._manager.state == State.CONNECTED
|
||||
|
||||
@property
|
||||
def active_port(self) -> PortInfo | None:
|
||||
return self._active_port if self._manager.is_running else None
|
||||
|
||||
def add_line_listener(self, callback) -> None:
|
||||
self._line_listeners.append(callback)
|
||||
|
||||
def send_command(self, command: str) -> bool:
|
||||
"""Write one "kota ..." line to the box; False when not connected.
|
||||
The session log gets the command without the Wi-Fi password."""
|
||||
if not self.is_connected:
|
||||
return False
|
||||
self._manager.write((command + "\n").encode("ascii"))
|
||||
if not command.startswith(("kota health", "kota ping")): # polled; would flood the log
|
||||
self._guide_log(f"sent to the box: {loggable(command)}")
|
||||
return True
|
||||
|
||||
def connect_first_box(self) -> bool:
|
||||
"""Connect to the first sensorbox port found (for tabs that need the box)."""
|
||||
if self._manager.is_running:
|
||||
return True
|
||||
self.refresh_ports()
|
||||
port = next((p for p in self._ports if p.is_sensorbox), None)
|
||||
if port is None:
|
||||
return False
|
||||
self.connect_port(port, capture=False)
|
||||
return True
|
||||
|
||||
def release_port(self) -> None:
|
||||
"""Stop monitoring so esptool can open the port exclusively."""
|
||||
if self._manager.is_running:
|
||||
@@ -293,6 +329,8 @@ class SerialTab(QWidget):
|
||||
self._session.write(line)
|
||||
self._engine.feed(line)
|
||||
self._runner.feed(line)
|
||||
for listener in self._line_listeners:
|
||||
listener(line)
|
||||
self._diag_dirty = True
|
||||
if line.kind == LineKind.BOOT:
|
||||
self._counts["boots"] += 1
|
||||
@@ -402,6 +440,8 @@ class MainWindow(QMainWindow):
|
||||
tabs.addTab(guide, "Quick start")
|
||||
tabs.addTab(self.serial_tab, "Serial monitor")
|
||||
tabs.addTab(self.flash_tab, "Flash firmware")
|
||||
self.wifi_tab = WifiTab(self.serial_tab)
|
||||
tabs.addTab(self.wifi_tab, "Wi-Fi (USB)")
|
||||
self.sd_tab = SdTab(self.serial_tab)
|
||||
tabs.addTab(self.sd_tab, "SD card")
|
||||
self.setCentralWidget(tabs)
|
||||
|
||||
Reference in new issue
Block a user