diff --git a/hosts/yarn/forza-trigger/forza_trigger.py b/hosts/yarn/forza-trigger/forza_trigger.py index f20bfd6..ddea9db 100644 --- a/hosts/yarn/forza-trigger/forza_trigger.py +++ b/hosts/yarn/forza-trigger/forza_trigger.py @@ -777,17 +777,18 @@ def run(host: str, port: int, exit_on_idle: bool = False) -> int: if in_race: handle_throttle(controller, pkt, state) handle_brake(controller, pkt, state) - else: - # On the in-race → menu transition, partial-reset state so - # the next race resumption gets clean EWMA cells, fresh slip - # flags (so the cold-start fix at handle_throttle/brake - # re-fires), and a redrawn lightbar. Edge-only — repeated - # menu packets shouldn't keep clearing state. - if state.last_in_race: - state.reset() - reset_triggers(controller) + apply_lightbar(controller, pkt, state, in_race=True) + elif state.last_in_race: + # in-race → menu edge: one-shot reset of state, triggers, + # and lightbar. We do NOT touch the controller again until + # the next in-race packet. Doing per-packet writes between + # races causes audible clicks on the trigger actuator — + # every HID OUT report (even the ones that look idempotent + # via library dedup) re-encodes the trigger config and the + # firmware reacts on receipt. + state.reset() + reset_all(controller) state.last_in_race = in_race - apply_lightbar(controller, pkt, state, in_race) finally: try: reset_all(controller)