Skip to content

SSD1333 brightness: dimming policy refit from the measured response surface (stage 3) - #570

Merged
brickbots merged 1 commit into
mainfrom
ssd1333-stage3-dimming-policy
Aug 2, 2026
Merged

SSD1333 brightness: dimming policy refit from the measured response surface (stage 3)#570
brickbots merged 1 commit into
mainfrom
ssd1333-stage3-dimming-policy

Conversation

@brickbots

Copy link
Copy Markdown
Owner

Stage 3 of the panel-characterization effort (follows #568): DisplaySSD1333.set_brightness is refit against the rig-measured response surface, and the shipped curve is verified end-to-end on the photometer rig.

What changed

The old policy factored a target into per-axis multipliers — a model the stage-2 photometry falsified (the axes don't multiply; contrast and master are one drive-product axis; pre-charge authority runs 32× to 1.1× depending on drive). The new policy walks three measured response tables, one per regime:

levels regime axes measured span
1–20 pre-charge ceiling 4, drive at cut-out, pc code = level+3 (4→0x17) 151 → 5.03e4 ADU/s
21–47 ceiling drive at cut-out, pc full, ceiling = level−16 (5→31) 6.43e4 → 2.03e5
48–255 drive full ceiling/pc, power-law target inverted through measured f(P) 2.03e5 → 1.05e6

Tables come from a dedicated same-day calibration session (stage3-calibration-20260802.jsonl, 74 points; repeat-point agreement 0.02%, reference within 0.9% of stage 2). Standing user decisions kept: dim-weighted knee shape, tonal-range rule (ceiling ≥ 4, value-64 canary), MAX_CONTRAST = 160 and the 70% blooming cap (eyeball constants, unexamined), top at ~75% of clean max, panel-agnostic harness.

Rig verification (acceptance test)

Selftest gates all PASS, then one measurement per level, all 255 levels, axes exactly as the policy programs them (stage3-verification-20260802.jsonl):

  • Bottom = the panel's floor: level 1 measured 149.6 ADU/s (measured emission floor 148–151). The old policy's dimmest state sat 40× above this.
  • Top: level 255 measured 1.046e6 ADU/s, +0.3% of the soft-top target.
  • Span: 6998:1 — 3.84 decades within the tonal rule (old policy: 233:1).
  • No dead keypresses: under the UI's real +20%/−10% stepping, every press changes the light, both directions, all levels.
  • Four adjacent-level dips of ~2.5% at levels 76–112 are rig noise, not policy inversions: those fluxes saturate the period-locked tier and fall to the sub-period tier, whose 48-frame mean carries ~4.6% beat noise (single-frame CV ~33% in the journal). The programmed states come from monotone measured tables. Sentinels show only a slow +2.6% thermal warm-up across the ~35-minute run.
  • Model vs measured: median 0.75% across the curve; worst ~7%, confined to the sub-period tier + warm-up region.

Saved settings shift (like the 2026-07 reshape — call-out)

The knee state is unchanged, so settings ≥ 20 render within ~30% of before (old 50 ≈ new 48, old 125 ≈ new 96; the top is 18% dimmer under the soft cap). Below the knee the range runs 40× deeper: the old dimmest setting's light now lives around level 8, and levels 1–7 are darkness the old model couldn't reach. Field users who lived at the old bottom will want to press up a few times.

Docs

  • ADR 0023 amended in place: separability, pre-charge linearity/cut-out/"dark at 0", the 0.16% drive-floor claim, and the 6%/35% curve description all replaced with measured facts; decisions unchanged.
  • Display CONTEXT.md: knee-curve entry refit, ceiling/drive regime terms added.
  • ssd1333-response.md §7 marked resolved; stage-3 handoff file retired (fulfilled).
  • Unit tests rewritten around the measured tables and real keypress trajectories (17 pass; full unit suite 1151 pass).

🤖 Generated with Claude Code

… surface (stage 3)

Replaces the multiplicative axis model in DisplaySSD1333.set_brightness
with three measured response tables (stage-3 rig calibration), one per
regime: pre-charge codes 4-0x17 one per level (1-20), ceiling 5-31 one
step per level (21-47), then a power law inverted through the measured
drive response (48-255, soft top at 75% of clean max). The bottom is now
the panel's measured 151 ADU/s emission floor, 40x below the old policy's
dimmest state; span 6998:1 (3.84 decades), rig-verified end-to-end at all
255 levels with zero dead keypresses under the UI's +20%/-10% stepping.

Amends ADR 0023 (separability, pre-charge linearity/cut-out, drive floor
claims all corrected to measurement), updates the Display CONTEXT.md
regime vocabulary, rewrites the unit tests around the measured tables and
real keypress trajectories, and retires the fulfilled stage-3 handoff.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@brickbots
brickbots marked this pull request as ready for review August 2, 2026 21:26
@brickbots
brickbots merged commit 3b4a797 into main Aug 2, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant