GUI: seed the actual-trace history with the real t=0 point on a fresh start
The actual trace's first sample otherwise only lands at on_plot_timer()'s next 1-second tick - under a real sim_warp_factor that's already a noticeable way into the run, leaving a small visible gap between the forecast's exact t=0 anchor and where the actual trace first appears. Seeds forecast_history with (elapsed, plot_temp_ist) the moment a fresh Elapsed push arrives, gated on elapsed still being small (FRESH_RUN_ELAPSED_THRESHOLD_S) so reconnecting mid-brew - where the current reading has nothing to do with that run's actual t=0 - doesn't get a bogus point plotted at x=0. Verified live: without this, the actual trace's first point landed at (0.5min, 20.6°) against a forecast anchored at (0min, 19.92°) - a visible gap. With it, the seeded point (0.017min, 19.9°) lines up with the anchor almost exactly, and the following natural samples continue smoothly from there. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkkuG48uHFCGKe6dPSERFk
This commit is contained in:
@@ -24,6 +24,16 @@ SUD_RUNNING_STATES = {"SudState.RAMPING", "SudState.HOLDING", "SudState.WAIT_USE
|
|||||||
SUD_WAIT_USER_STATE = "SudState.WAIT_USER"
|
SUD_WAIT_USER_STATE = "SudState.WAIT_USER"
|
||||||
SUD_PAUSED_STATE = "SudState.PAUSED"
|
SUD_PAUSED_STATE = "SudState.PAUSED"
|
||||||
|
|
||||||
|
# Below this (simulated seconds), an 'Elapsed' push is treated as "this run
|
||||||
|
# just started" rather than "reconnecting mid-brew" - see on_sud_changed()'s
|
||||||
|
# Elapsed handling. Generous relative to typical dt (0.1-1s/tick): a fresh
|
||||||
|
# start's first push always lands well under it, while reconnecting to an
|
||||||
|
# established run (anything past its first handful of ticks) always lands
|
||||||
|
# well over it - and seeding the history a few seconds "late" within a
|
||||||
|
# genuinely fresh run is harmless anyway, since the temperature there is
|
||||||
|
# still essentially the t=0 anchor.
|
||||||
|
FRESH_RUN_ELAPSED_THRESHOLD_S = 5.0
|
||||||
|
|
||||||
|
|
||||||
def _style_axis(ax):
|
def _style_axis(ax):
|
||||||
ax.set_facecolor('white')
|
ax.set_facecolor('white')
|
||||||
@@ -827,6 +837,19 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
|
|||||||
# a run starting.
|
# a run starting.
|
||||||
if self.sud_elapsed_seconds is not None:
|
if self.sud_elapsed_seconds is not None:
|
||||||
self.sud_elapsed_seconds = msg['Elapsed']
|
self.sud_elapsed_seconds = msg['Elapsed']
|
||||||
|
# Seed the actual-trace history with this run's real
|
||||||
|
# t=0 point - without it, the first sample only lands
|
||||||
|
# at on_plot_timer()'s next 1-second tick, which under
|
||||||
|
# a real sim_warp_factor can already be a noticeable
|
||||||
|
# way into the run, leaving a small visible gap between
|
||||||
|
# the forecast's exact t=0 anchor and where the actual
|
||||||
|
# trace first appears. Gated on elapsed still being
|
||||||
|
# small so reconnecting mid-brew (large elapsed) - where
|
||||||
|
# this temperature reading has nothing to do with that
|
||||||
|
# run's actual t=0 - doesn't get a bogus point plotted
|
||||||
|
# at x=0.
|
||||||
|
if not self.forecast_history and self.plot_temp_ist and msg['Elapsed'] < FRESH_RUN_ELAPSED_THRESHOLD_S:
|
||||||
|
self.forecast_history.append((msg['Elapsed'] / 60.0, self.plot_temp_ist))
|
||||||
elif "Forecast" in key:
|
elif "Forecast" in key:
|
||||||
self.on_sud_forecast_received(msg['Forecast'])
|
self.on_sud_forecast_received(msg['Forecast'])
|
||||||
elif "Error" in key:
|
elif "Error" in key:
|
||||||
|
|||||||
Reference in New Issue
Block a user