67aabde4b6
- uc480_camera: drop never-called _capture_paused/get_framerate (the hardware question _capture_paused encoded is now in KNOWN_ISSUES.md) - t3r_protocol: drop read_reg/write_reg/decode_reg/Reg (commands never wired into the driver) - bbd20x: drop _update0x0212 (never dispatched) and 8 of 9 unused trigger convenience wrappers; apt_constants: drop TriggerBitsStepper (servo-only rig) - ruff --fix: 35 unused imports across all apps; drop unused T3R_BAUD - genesis_core.py: quarantine warning header; docs/genesis_verification.md bench checklist for the 7 divergences vs tools/genesis_laser_gui.py Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.3 KiB
3.3 KiB
Genesis laser — hardware verification checklist
hardware/genesis_core.py was extracted from tools/genesis_laser_gui.py,
but the extraction changed behavior in ways only the bench can adjudicate.
Until every row below is resolved, both files stay in the repo unchanged:
genesis_laser_gui.py is the reference implementation, genesis_core.py
(+ tools/genesis_laser_control.py) is the intended successor.
Run these with the Genesis laser connected, interlock chain accessible, and a front-panel/manual reference for current and temperature readouts.
| # | Divergence | Bench test | Resolution |
|---|---|---|---|
| 1 | ADS7828 command byte. Reference passes raw command bytes (0x84, 0xe4, 0x94 — genesis_laser_gui.py:73-77); core synthesizes 0x80 | (ch<<4) | 0x0c → 0x8C for ch0 (genesis_core.py:413), different PD1/PD0 power-down bits. |
Read the same ADC channel through both implementations; compare against the front-panel current readout. Also check for settling differences right after power-up. | Keep whichever matches the panel; fix the other. |
| 2 | LDD enable polarity. Reference get_ldd_enable() returns not bool(value & 0x01) ("Inverted logic", genesis_laser_gui.py:602-612); core returns the un-inverted bit (genesis_core.py:585-599). Same register, opposite answers. |
With emission verifiably OFF (keyswitch off), read LDD status via both. Exactly one will say "disabled". | Adopt the polarity that matches reality; document the register semantics inline. |
| 3 | Shutter: manual or bit-controlled? Reference docs say "this laser has a MANUAL shutter" and emergency_stop() deliberately leaves it alone; core set_shutter() toggles a PCA9555 bit and emergency_stop()/enter_safe_state() rely on it. |
Toggle set_shutter() from core with the beam blocked; observe whether anything physical actuates. |
If the bit is inert, remove set_shutter and fix the safe-state functions; if real, correct the tools/ docs. |
| 4 | ADC filtering dropped. Reference reads 3× and takes median (i2c_read_discard_high_low, genesis_laser_gui.py:341-364) or retries until two reads agree; core does single unfiltered reads. |
Log ~100 consecutive current readings through core; if the spread is more than display noise, filtering was load-bearing. | Port the median-of-3 helper into genesis_core.I2CProtocol. |
| 5 | Scaling dropped. Reference converts to Amps/Watts (AMPS_FULLSCALE * ADC_TO_VOLTS); core returns raw 0–4095 counts. |
Compare a scaled reading against the front panel. | Port the scaling constants + conversion into core. |
| 6 | Temperatures + power monitoring dropped. get_main_temp / get_etalon_temp / get_shg_temp / get_power_actual exist only in the reference. |
Confirm each channel's reading is sane vs. front panel. | Port the four getters into core. |
| 7 | pre_flight_check() dropped. Reference validates remote-enable + keyswitch + interlock before emission. |
n/a — code review + one interlock-open test. | Port into core; call it from genesis_laser_control.py before enabling. |
When all rows are resolved: port the verified behavior into
genesis_core.py, update tools/genesis_laser_control.py, delete
tools/genesis_laser_gui.py, and remove this checklist plus the warning
header in genesis_core.py.