feat: Wafer Map integration

## Backend — Session & playback
- Add SessionController (QML-facing live/review controller) with
  loadedFile property for active-file highlight binding
- Add SessionModel, FramePlayer, and CsvRecorder for state machine,
  frame seek/step/speed, and CSV recording
- Add SensorEditor for per-sensor value overrides (replace + offset)
This commit is contained in:
jack
2026-06-11 11:55:34 -07:00
parent 59528eb6c9
commit ca1a514f23
11 changed files with 689 additions and 22 deletions
+21 -6
View File
@@ -120,24 +120,37 @@ class FileBrowser(QObject):
for csv_path in sorted(self._current_directory.glob("*.csv")):
try:
metadata = self._load_metadata(csv_path)
wafer_type = metadata.get_wafer_type().upper() or (csv_path.stem[0].upper() if csv_path.stem else "")
date_str = metadata.string_date_format()
serial = metadata.wafer[1:] if len(metadata.wafer) > 1 else ""
time_str = date_str[11:] if len(date_str) > 10 else ""
self._files.append(
{
"selected": selected_state.get(str(csv_path), False),
"baseName": csv_path.stem,
"wafer": metadata.wafer,
"date": metadata.string_date_format(),
"waferType": wafer_type,
"serialNumber": serial,
"date": date_str,
"timeStr": time_str,
"chamber": metadata.chamber,
"notes": metadata.notes,
"masterType": master_state.get(str(csv_path), "") or metadata.master_type,
"fileName": str(csv_path),
"highlight": metadata.get_wafer_type() in {"A", "B", "C"},
"highlight": wafer_type in {"A", "B", "C"},
}
)
except Exception:
stem = csv_path.stem
self._files.append(
{
"selected": selected_state.get(str(csv_path), False),
"wafer": csv_path.stem,
"baseName": stem,
"wafer": stem,
"waferType": stem[0].upper() if stem else "",
"serialNumber": stem[1:] if len(stem) > 1 else "",
"date": "",
"timeStr": "",
"chamber": "",
"notes": "Unable to parse metadata",
"masterType": master_state.get(str(csv_path), ""),
@@ -186,7 +199,7 @@ class FileBrowser(QObject):
def _metadata_from_filename(self, csv_path: Path) -> CSVFileMetadata:
match = re.match(
r"^(?P<wafer>[^-]+)-(?P<date>\d{8})(?:_(?P<run>\d+))?$",
r"^(?P<wafer>[^-]+)-(?P<date>\d{8})(?:_(?P<time>\d{6}))?$",
csv_path.stem,
)
if not match:
@@ -194,7 +207,9 @@ class FileBrowser(QObject):
date_text = ""
try:
parsed = datetime.strptime(match.group("date"), "%Y%m%d")
date_part = match.group("date")
time_part = match.group("time") or "000000"
parsed = datetime.strptime(date_part + time_part, "%Y%m%d%H%M%S")
date_text = CSVFileMetadata.format_date(parsed)
except ValueError:
date_text = ""
@@ -236,7 +251,7 @@ class FileBrowser(QObject):
def showInfo(self, message: str) -> None:
self._show_info(message)
@Slot(str, result="QVariantMap")
@Slot(str, result=dict)
def parseCsvMetadata(self, file_path: str) -> dict:
from pathlib import Path as _Path