Three asked-for changes, one commit because they are one coordinate system. The live axis is a fixed [-window, 0] with the newest sample at 0, so x reads as an age and the labels stand still while the trace rolls under them. That makes the display clock distinct from the stream clock for the first time, so `ScopeModel::stream_at_x0()` becomes the single conversion between them (`display_x = stream_t - stream_at_x0()` in all four modes) and a snapshot carries its own origin in `EventSnapshot::x_offset`. The pause view is now rebased like an event's, reversing an earlier deliberate choice: a frozen absolute-stamped picture would sit a whole uptime right of a newest-relative axis. That also fixed a latent bug, the export adding `trigger_time()` to a *paused* view's stamps. The status bar says how long you have been paused -- wall time, since the producer never stops, through `format_elapsed()` so the field cannot widen. The export writes two time columns: `time`, the axis as displayed, and `abs_seconds`, the stream's own clock for the same sample. f64 seconds and not the wire's integer, because `udps_frame_t::values` is a `const double*` and the integer never exists in this process. Cursors and measurement marks move in opposite directions under the rolling axis, deliberately: a cursor is a position on screen and stays put, a mark names a sample and travels with it. `App::measure_window` is stream-clocked for a sharper reason -- a display-coordinate live window never moves, so the "the window moved" recompute would never fire again. Moves the deps/plotter pin to 58473db, which stops a time label's mantissa reaching its own radix: a one-second tick differenced off a live axis read `1e+3ms`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
32 lines
1.6 KiB
Plaintext
32 lines
1.6 KiB
Plaintext
<b>Pause and play</b>
|
|
|
|
Pause freezes the <i>display</i>, not the acquisition. The producer keeps filling the ring at
|
|
full rate; the view binds an immutable snapshot of the window that was on screen, and the axis
|
|
is pinned to it.
|
|
|
|
<b>How to reach it</b>
|
|
|
|
The pause button in the toolbar, or <tt>Space</tt>. Press it again to resume, which rebinds the
|
|
live ring and puts the window back on the newest data.
|
|
|
|
<b>Worth knowing</b>
|
|
|
|
• Nothing is lost while paused. Because the producer never stops, resuming shows current data
|
|
with no hole in the history behind it.
|
|
• The axis is pinned to the <i>snapshot's own stamps</i>, not to the window that was requested.
|
|
A window reaching back past the oldest retained sample yields a shorter snapshot, and the
|
|
pinned axis is that shorter span — so you see a narrower view rather than an empty margin.
|
|
• A paused view is pinned exactly as a held trigger event is: zoom in freely, but a pan or a
|
|
zoom out is clamped to the snapshot's data.
|
|
• Pausing is the easiest way to measure a layout or read a cursor precisely, because nothing
|
|
under the pointer moves between frames.
|
|
• The status bar says how long you have been paused — wall time, since the stream itself never
|
|
stopped. It is there so a frozen picture cannot be mistaken for a live one that went quiet.
|
|
|
|
<b>Example</b>
|
|
|
|
Pause with a 2 s window over a ring holding 1.4 s: the frozen axis reads
|
|
<tt>[-1.40 .. 0.00]</tt> rather than <tt>[-2.00 .. 0.00]</tt> with 0.6 s of blank. The pause
|
|
probe reports <tt>ring_produced</tt> still growing across the pause and
|
|
<tt>event_size</tt> non-zero exactly while paused.
|