# Ticket: Reference calibration press-and-hold auto-repeat

Status: complete; target tap/hold/release, Cancel, both endpoints, bounded Save, and safe restoration passed
Type: ticket
Updated: 2026-07-24
Next Action: none
Parent: work/wp/completed/wp-bounded-temperature-calibration-and-drift-recovery.md

## Problem

Temperature Setup -> Calibrate changes the displayed reference value in
`0.1 C` steps, but its increment and decrement buttons currently produce only
one step per touch. Reaching either absolute calibration boundary can require
approximately 100 taps, which is slow and increases operator error risk.

Other numeric entry screens already use GUIX button-repeat behavior when the
operator holds an increment/decrement button.

## Expected Behavior

A short tap changes the displayed reference value by exactly `0.1 C`. Holding
either button repeats the same bounded adjustment until release or until the
absolute `MainTemp_Offset` endpoint is reached. Repeat must not bypass the
existing `[-10.0,+10.0] C` total-offset clamp.

## Acceptance Criteria

- [x] The canonical `GuiX/SMI_Gui.gxp` project enables button repeat for both
  SelectWarningMsgScreen calibration adjustment buttons.
- [x] Generated GUI source enables `GX_STYLE_BUTTON_REPEAT` for both buttons.
- [x] Single-tap behavior remains one `0.1 C` step.
- [x] Existing increment/decrement callbacks and absolute endpoint clamps are
  unchanged.
- [x] Automated calibration policy checks pass.
- [x] Debug and Release firmware builds pass.
- [x] Exact Debug candidate is committed, hash-checked, programmed, and verified
  on Controller A without changing VEEPROM or option memory.
- [x] On Controller A, a short tap changes the value once, press-and-hold
  repeats, and release stops promptly in both directions.
- [x] The increment direction reaches exactly `+10.0 C` and cannot cross its
  absolute endpoint.
- [x] The decrement direction cannot cross its absolute endpoint on the exact
  replacement candidate.
- [x] Cancel remains non-mutating.
- [x] Save commits only the displayed bounded correction.

## Verification

Run `script/check-temperature-calibration.ps1` and the full firmware regression
suite, then build both configurations. On the next exact candidate flash,
exercise short tap, press-and-hold, release, both endpoints, Cancel, and Save
with read-only J-Link offset confirmation.

Controller A passed the full interaction set on 2026-07-24. At the lower
endpoint, the temporary offset was exactly `0xC1200000` (`-10.0 C`) after the
held decrement and three additional decrement taps while the stored offset and
VEEPROM remained at the safe `+0.3 C` baseline. Save committed exactly
`-10.0 C` into two identical generation-222 VEEPROM copies with valid CRC
`0xA42D7157`. The owner then restored displayed `+0.3 C`; readback found
`0x3E999A27` (`+0.3000042 C`) in two identical generation-224 copies with valid
CRC `0x5F23D7B4`, zero save request, zero system errors, and unchanged SD CID
`035344535330384780976F0084018559`.
