feat(debug): add debug read with CSV export
- Parse F1 debug data via family-independent temp formula (bits 4-14 scaled by 2**(i-8), sign at bit 0) - Save sensor+debug temps side-by-side to debug_info.csv - Wire READ DEBUG button in StatusActionsPanel - Rename ReplayChart → RunChart; move into GraphTab - Extract PanelBox/SectionTitle/PanelSlider in ReadoutPanel to cut ~300 lines of duplicated styling - Add rightRailWidth token to Theme for consistent rail sizing - Wrap ReadoutPanel in ScrollView so Thresholds card stays reachable when E-C delta rows appear
This commit is contained in:
@@ -133,6 +133,64 @@ def test_read_debug_handler(controller):
|
||||
assert controller.connectionStatus == "Connected"
|
||||
assert not controller.operationInProgress
|
||||
|
||||
def _make_p_family_bytes(value: int = 0x0100) -> bytes:
|
||||
"""Synthetic single-block P-family binary: 244 valid words + 12 overhead."""
|
||||
data = bytearray()
|
||||
for i in range(256):
|
||||
word = value if i < 244 else 0
|
||||
data += word.to_bytes(2, byteorder="little")
|
||||
return bytes(data)
|
||||
|
||||
|
||||
def test_debug_worker_decodes_and_saves_csv(controller, tmp_path):
|
||||
controller._last_wafer_info = {"familyCode": "P"}
|
||||
controller._save_data_dir = str(tmp_path)
|
||||
controller._service.read_wafer_data = MagicMock(
|
||||
side_effect=[_make_p_family_bytes(), _make_p_family_bytes()]
|
||||
)
|
||||
|
||||
captured = {}
|
||||
controller._debugFinished.connect(captured.update)
|
||||
|
||||
controller._debug_worker("COM1")
|
||||
|
||||
assert captured.get("success") is True
|
||||
assert captured.get("sensor_bytes") == 512
|
||||
assert captured.get("debug_bytes") == 512
|
||||
assert "csv_path" in captured
|
||||
from pathlib import Path
|
||||
assert Path(captured["csv_path"]).exists()
|
||||
assert Path(captured["csv_path"]).name == "debug_info.csv"
|
||||
|
||||
|
||||
def test_debug_worker_reports_error_when_csv_save_fails(controller, tmp_path):
|
||||
controller._last_wafer_info = {"familyCode": "P"}
|
||||
# Point save dir somewhere save_debug_csv cannot write to, so it returns None.
|
||||
controller._save_data_dir = str(tmp_path / "debug_info.csv") # a file, not a dir
|
||||
(tmp_path / "debug_info.csv").write_text("occupied")
|
||||
controller._service.read_wafer_data = MagicMock(
|
||||
side_effect=[_make_p_family_bytes(), _make_p_family_bytes()]
|
||||
)
|
||||
|
||||
captured = {}
|
||||
controller._debugFinished.connect(captured.update)
|
||||
|
||||
controller._debug_worker("COM1")
|
||||
|
||||
assert captured.get("success") is not True
|
||||
assert "error" in captured
|
||||
|
||||
|
||||
def test_debug_handler_logs_csv_path(controller):
|
||||
controller._handle_debug_finished({
|
||||
"success": True,
|
||||
"sensor_bytes": 512,
|
||||
"debug_bytes": 512,
|
||||
"csv_path": "/tmp/debug_info.csv",
|
||||
})
|
||||
assert "/tmp/debug_info.csv" in controller.activityLog
|
||||
|
||||
|
||||
def test_parse_and_save_data_and_get_chart_data(controller):
|
||||
res = controller.getChartData()
|
||||
assert res == {"success": False}
|
||||
|
||||
Reference in New Issue
Block a user