- Clarified sections on real and fabricated data in the README. - Added detailed descriptions of alignment states with corresponding conditions and visual indicators. - Removed outdated screenshot and added new images for each alignment state (Ready, Aligning, Fault).
Wafer Position Monitor (demo)
PySide6 desktop demo: load NanoBerry edge CSVs from MASTER_SD/, fit a wafer circle, show X / Y / theta offset and sigma vs a calibration baseline. No live camera integrated yet.
Stack: Python 3.11+, PySide6, NumPy.
Quick start
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
wafer-user # or: python src/wafer_edge/App.py
Click Read Wafer to load the demo CSVs. Tests: python -m pytest tests/ (UI smoke needs a display).
Data
Real data — [MASTER_SD/](MASTER_SD/): CSV files from actual NanoBerry camera captures. Names: {S|R}{1|2}{seq}P0.CSV — local/remote board, SPI camera, 4-digit sequence (e.g. S10540P0.CSV).
Fabricated data — [DATA/0610/](DATA/): Generated test data used by CsvSource.DEMO_CAMERA_PATHS (the default demo source). Change that dict or use parse_csv_filename() for other captures.
Calibration
First run creates baseline.json (gitignored). Key fields: center_mm, radius_mm (75), center_px, radius_px (pixel scale).
Layout
| Path | Role |
|---|---|
src/wafer_edge/App.py |
Main window |
VisionEngine.py |
Circle fit + offsets (no Qt) |
CsvSource.py |
CSV loader |
ui/widgets.py |
Plot + metric cards |
ui/Theme.qml |
Styles (loaded via ui/theme.py) |
Pipeline: DEMO_CAMERA_PATHS → load_camera_records_from_csv() → snapshot_from_records() → UI.
Alignment states
The monitor derives one of three states from the fitted circle on every read:
| State | Condition | Dot |
|---|---|---|
| Ready | offset ≤ 0.10 mm and σ ≤ 0.05 mm | 🟢 green |
| Aligning | offset ≤ 0.50 mm and σ ≤ 0.20 mm | 🟡 amber |
| Fault | offset > 0.50 mm or σ > 0.20 mm | 🔴 red |


