refactor: standardize codebase formatting, optimize import orders, and update GUI resolution to 1080p

This commit is contained in:
jack
2026-06-18 13:13:47 -07:00
parent 8ad2a9b972
commit 66942d250d
32 changed files with 453 additions and 120 deletions
@@ -1,21 +1,23 @@
"""QML-facing controller for the live/review wafer dashboard."""
from __future__ import annotations
import logging
import time
from typing import Any, Optional
from typing import Optional
from PySide6.QtCore import QObject, Property, QTimer, Qt, Signal, Slot
from PySide6.QtCore import Property, QObject, Qt, QTimer, Signal, Slot
from pygui.backend.cluster_average import average_clusters, group_sensors_by_radius
from pygui.backend.data.csv_recorder import CsvRecorder
from pygui.backend.models.frame import Frame
from pygui.backend.models.frame_player import FramePlayer, frames_from_wafer_data
from pygui.backend.models.sensor_editor import SensorEditor
from pygui.backend.models.session_model import SessionModel
from pygui.backend.models.threshold_classifier import ThresholdConfig
from pygui.backend.wafer.zwafer_models import Sensor
from pygui.backend.wafer.zwafer_parser import ZWaferParser
from pygui.serialcomm.stream_reader import StreamReader
from pygui.backend.models.sensor_editor import SensorEditor
from pygui.backend.cluster_average import average_clusters, group_sensors_by_radius
log = logging.getLogger(__name__)
MODE_LIVE = "live"
@@ -24,7 +26,7 @@ MODE_REVIEW = "review"
class SessionController(QObject):
# public signals
frameUpdated = Signal()
frameUpdated = Signal()
modeChanged = Signal()
stateChanged = Signal()
recordingChanged = Signal()
@@ -56,7 +58,7 @@ class SessionController(QObject):
self._dirty = False
self._liveFrame.connect(self._on_live_frame, Qt.ConnectionType.QueuedConnection)
self._sensor_editor = SensorEditor()
self._last_raw_frame: Frame | None = None
self._loaded_file: str = ""
@@ -74,13 +76,13 @@ class SessionController(QObject):
def frameTotal(self) -> int: return self._player.total
@Property(str, notify=stateChanged)
def state(self) -> str:
def state(self) -> str:
if self._last:
return self._last.state
# IF we dont have data yet, but the reader is running -> Streaming
if self._mode == MODE_LIVE and self._reader is not None:
return "streaming"
return "idle"
@Property(bool, notify=recordingChanged)
@@ -198,7 +200,12 @@ class SessionController(QObject):
@Slot(str)
def loadFile(self, file_path: str) -> None:
from pathlib import Path
from pygui.backend.data.data_records import is_official_csv, read_data_records, read_official_csv
from pygui.backend.data.data_records import (
is_official_csv,
read_data_records,
read_official_csv,
)
from pygui.backend.wafer.wafer_layouts import WaferLayout, resolve_shape_and_size
frames = []
@@ -319,10 +326,9 @@ class SessionController(QObject):
# ---- live: stream start/stop ----
@Slot(str, str)
def startStream(self, port: str, family_code: str = "") -> None:
from pygui.serialcomm.serial_port import SerialPort # transport open
import serial as pyserial
from pygui.backend.wafer.wafer_layouts import load_layout_for_wafer_id
import time
from pygui.serialcomm.serial_port import SerialPort # transport open
if family_code:
try:
@@ -346,7 +352,7 @@ class SessionController(QObject):
high_byte = payload[i * 2]
low_byte = payload[i * 2 + 1]
val16 = (high_byte << 8) | low_byte
is_negative = (val16 & 0x8000) != 0
integer_part = (val16 >> 7) & 0xFF
fractional_bits = val16 & 0x7F
@@ -355,7 +361,7 @@ class SessionController(QObject):
if is_negative:
result = -result
values.append(result)
return Frame(seq=seq, time=time.monotonic(), values=values)
# Clear out any old data from the prev sessions
@@ -378,7 +384,7 @@ class SessionController(QObject):
family_code=family_code or "A")
self._reader.start()
self._repaint_timer.start()
self.setMode("live")
self.stateChanged.emit()
@@ -389,7 +395,7 @@ class SessionController(QObject):
transport = self._reader._transport
self._reader.stop()
self._reader = None
# Send 'D2S' command padded to 512 bytes to stop the stream
if transport and transport.is_open:
try:
@@ -398,7 +404,7 @@ class SessionController(QObject):
transport.flush()
except Exception as exc:
log.error("Error sending stop command: %s", exc)
self.stateChanged.emit()
self.stopRecording()
@@ -455,6 +461,5 @@ class SessionController(QObject):
"""Remove all sensor overrides."""
self._sensor_editor.clear()
self._reprocess_current()