refactor: standardize codebase formatting, optimize import orders, and update GUI resolution to 1080p
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user