diff --git a/csaxs_bec/bec_ipython_client/plugins/omny/AI_docs/SAMPLE_STORAGE_TEST_CHECKLIST.md b/csaxs_bec/bec_ipython_client/plugins/omny/AI_docs/SAMPLE_STORAGE_TEST_CHECKLIST.md new file mode 100644 index 00000000..21f47040 --- /dev/null +++ b/csaxs_bec/bec_ipython_client/plugins/omny/AI_docs/SAMPLE_STORAGE_TEST_CHECKLIST.md @@ -0,0 +1,66 @@ +# OMNY sample-storage testing checklist (as of 2026-09-04) + +For live/sim testing of this branch's (`update-omny`) sample-storage work: the +`OMNY_SampleStorage` widget's OMNY support, the real owner + measured-status EPICS +channel, and the `omny.otransfer_*` CLI wrappers. Written so this can be pulled and +run from a separate session/machine. See `OPEN_ISSUES.md` for the broader OMNY +live-testing effort this is part of. + +## Widget — `OMNY_SampleStorage` + +- [ ] Open the widget in an OMNY session — header (stage+gripper) + fixed-O grid + 3 + shuttle group boxes render, no "no known setup" banner. +- [ ] Occupied slots show names in legible text (not near-invisible — this was a + dark-theme contrast bug, fixed). +- [ ] Right-click an empty slot → **New sample…** → name + owner (both required, + empty owner rejected) → slot fills in without an error (a `STATUS_NONE` + crash here was fixed — client-side device proxies don't expose plain class + attributes, only signals/USER_ACCESS methods). +- [ ] Duplicate name (matching another occupied slot) → rejected with a clear + message; renaming a slot to its own existing name is still fine. +- [ ] Right-click an occupied slot → menu shows only **Change name…** / **Clear + (set empty)** — no "Set measured status…" (removed; status is CLI-only now). +- [ ] **Clear (set empty)** works without error. +- [ ] Each shuttle's status line: right-click → **Set parking slot…** (1-6) / + **Clear parking assignment** — shows "Slot N" / "not parked". The + "● ACTIVE" badge needs `oparkz` sitting at a real target position (2-6); + may not be easy to trigger from sim unless you drive that motor there. +- [ ] **Print** button builds a PDF (expect a "printer not available" message + unless you have a `WSLA_X12SA` CUPS queue locally — not a bug). + +## CLI (`omny.otransfer_*`) + +- [ ] Tab-complete `omny.otransfer_` — lists ~22 commands (`otransfer_show_all`, + `otransfer_set_sample_status`, `otransfer_get_sample_owner`, etc.). +- [ ] `omny.otransfer_help()` — prints the transfer commands **and then the full + `dev.omny_samples.help()` reference** below it, in one call. +- [ ] `omny.otransfer_show_all()` — table shows `(owner)` and + `◐ started`/`✓ completed` suffixes on occupied slots. +- [ ] `dev.omny_samples.set_sample_slot('A', 4, 'testsample', 'yourname')` then + `dev.omny_samples.get_sample_name_and_owner('A', 4)` round-trips. +- [ ] `omny.otransfer_set_sample_status('A', 1, 'started')` / `'completed'` / + `'none'` — status is settable from the CLI (by design; not from the widget). +- [ ] `omny.otransfer_park_loadlock_slot(6)` → answer **y** to "in back position" + → should now proceed (drive to the slot) instead of raising + `OMNYTransferError` (was inverted — pre-existing bug, fixed); answer **n** + → should correctly abort with that error. + +## Transfer reference-image saving + +Depends on whether your session drives the Galil `MGconfirm`/`MGmntprgs` +handshake (`_otransfer_confirm()`) — may not fire in a lightweight sim. + +- [ ] Run `omny.otransfer_put_sample(...)` / `otransfer_get_sample(...)` through a + confirm checkpoint → check `~/data/raw/logs/omny_sample_transfer_images/` + for a new `.h5` file with both cameras of whichever pair was active + (parking `cam200`/`cam203` vs stage `cam201`/`cam202`). +- [ ] If the handshake doesn't fire: `omny._otransfer_save_reference_images(file_suffix='test')` + after opening a camera view (e.g. `omny.otransfer_park_slot(3)`) to set + `_omnycam_active_pair` — same effect, minus the physical move. + +## X-ray eye alignment — known incomplete, not this branch's scope + +The fit+image saving in `x_ray_eye_align.py` is shared code (also used by FlOMNI/LamNI) +and should already work in principle, but it has pre-existing OMNY/LamNI method-name +mismatches (e.g. `self.lfzp_in()`) that likely block the actual click-through run from +completing for OMNY. Not fixed this pass — flag if you hit it.