Files
scanengine-3/docs/genesis_verification.md
Thomas Ales 67aabde4b6 Phase 1c: prune remaining dead functions, unused imports, quarantine Genesis
- 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>
2026-07-28 10:08:48 -05:00

3.3 KiB
Raw Permalink Blame History

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.