docs: help pages for export, sessions and the status bar
This commit is contained in:
1 parent
ba4de92f7a
commit
3e0d0de325
5 files changed
+107
No files matched your search
@@ -0,0 +1,31 @@
|
|||||||
|
<b>Saving and export</b>
|
||||||
|
|
||||||
|
Export writes the <i>visible range</i> of every plotted trace to a file: NumPy <tt>.npy</tt> or
|
||||||
|
<tt>.csv</tt>, chosen by the extension you type.
|
||||||
|
|
||||||
|
<b>How to reach it</b>
|
||||||
|
|
||||||
|
<b>Export visible range…</b> in the overflow menu, or <tt>Ctrl+E</tt>. A file chooser asks where;
|
||||||
|
the format follows the path's extension.
|
||||||
|
|
||||||
|
<b>Worth knowing</b>
|
||||||
|
|
||||||
|
• The table is collected at the moment you click, not when the chooser returns. A live view keeps
|
||||||
|
scrolling while a dialog is up, so a late collection would write a window you never saw.
|
||||||
|
• The rows are the <b>stored samples</b>, never the LOD buckets the plot draws from. A row count
|
||||||
|
far below the span times the stored rate means something cut the table from the pyramid.
|
||||||
|
• The stored rate is not always the wire rate. A window long enough to need decimation is stored
|
||||||
|
averaged at a lower rate, and the export carries <i>that</i> — read the status bar's ⓘ popover
|
||||||
|
for the figure before trusting a sample count.
|
||||||
|
• Two time columns. <tt>time</tt> is the display timeline (relative to the trigger edge while an
|
||||||
|
event is held) and <tt>stream_time</tt> is the source's own clock. Both are strictly increasing
|
||||||
|
and evenly spaced; duplicate or backwards stamps would mean the file held two clocks.
|
||||||
|
• An export taken <i>mid-capture</i> writes the partly filled window that is on screen, which is
|
||||||
|
shorter than the event span. Export outside a capture if you want the whole event.
|
||||||
|
|
||||||
|
<b>Example</b>
|
||||||
|
|
||||||
|
A 2 s window at 10 kS/s over 3 traces writes 20001 rows and 5 columns
|
||||||
|
(<tt>time</tt>, <tt>stream_time</tt>, three signals). The <tt>.npy</tt> is
|
||||||
|
<tt>64·⌈(10+len(header)+1)/64⌉ + rows·(16 + 4·cols)</tt> bytes. Read it back with
|
||||||
|
<tt>pd.DataFrame(np.load(path))</tt>.
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<b>Sessions and settings</b>
|
||||||
|
|
||||||
|
udpscope stores one session file per source, so reopening a source gives you the scope you
|
||||||
|
closed. There is no global preferences file: the session <i>is</i> the settings.
|
||||||
|
|
||||||
|
<b>How to reach it</b>
|
||||||
|
|
||||||
|
Nothing to open — the file is written as you work. Its path is in the About dialog, and the
|
||||||
|
directory is <tt>$XDG_CONFIG_HOME/udpscope</tt>, or <tt>~/.config/udpscope</tt> when that is
|
||||||
|
unset. Each file is named <tt><host>_<port>.toml</tt>.
|
||||||
|
|
||||||
|
<b>Worth knowing</b>
|
||||||
|
|
||||||
|
• What a session persists: the time window, the rows and each row's slot signals, the
|
||||||
|
calibration, which signals are enabled, the math channels with their graphs, and the
|
||||||
|
measurements pane.
|
||||||
|
• Signal identity is the <i>name</i> throughout, because a new CONFIG renumbers the channels.
|
||||||
|
• A file written by a run against a source whose streamer was down would name no signals at all,
|
||||||
|
so such a run does <b>not</b> write: a configured session is never overwritten by a run that
|
||||||
|
configured nothing.
|
||||||
|
• The multicast group and the interface live <i>inside</i> the file, because its name cannot
|
||||||
|
carry them. A file from an older build has neither key and loads as unicast on the default
|
||||||
|
route.
|
||||||
|
• The startup chooser lists only files that name at least one signal, which is what keeps it the
|
||||||
|
sources you configured rather than every port you have ever tested against.
|
||||||
|
• Deleting a file is a supported way to start a source over; the chooser's <tt>×</tt> does
|
||||||
|
exactly that.
|
||||||
|
|
||||||
|
<b>Example</b>
|
||||||
|
|
||||||
|
Connect to <tt>127.0.0.1:8000</tt>, drop three signals on row 1 and set a 2 s window.
|
||||||
|
<tt>~/.config/udpscope/127.0.0.1_8000.toml</tt> now holds <tt>rows=1 window_s=2</tt> with
|
||||||
|
<tt>signals = ["sine", "ramp", "noise", ""]</tt>, and the next run reports
|
||||||
|
<tt>layout loaded from …/127.0.0.1_8000.toml</tt> with those signals already acquired.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<b>Status bar and diagnostics</b>
|
||||||
|
|
||||||
|
The status bar is two tiers. The bar itself is one glance line — the state, the rate and the
|
||||||
|
window — and everything else is behind the ⓘ button at its right-hand end.
|
||||||
|
|
||||||
|
<b>How to reach it</b>
|
||||||
|
|
||||||
|
The bar is always visible under the plot. Click <b>ⓘ</b> for the detail popover.
|
||||||
|
|
||||||
|
<b>Worth knowing</b>
|
||||||
|
|
||||||
|
• The badge is one glyph in three colours: lit and dim alternating means data is arriving, and a
|
||||||
|
steady idle colour means it is not. A badge that never blinks is not a working badge.
|
||||||
|
• The state field is one word from a fixed set: <tt>live</tt>, <tt>paused</tt>, <tt>armed</tt>,
|
||||||
|
<tt>capturing</tt>, <tt>event held</tt>, <tt>disarmed</tt>. In trigger mode the bar adds
|
||||||
|
exactly one more field, how long ago the last event was.
|
||||||
|
• Nothing on the bar may change width with the stream, because the bar sits directly above the
|
||||||
|
plot and a wider label would relayout it. That is why the rate collapses to one figure or a
|
||||||
|
range rather than listing per channel, and why an elapsed time steps to a coarser unit instead
|
||||||
|
of growing digits.
|
||||||
|
• <tt>gaps</tt> counts packets the receiver knows it missed. It is the number that matters: a
|
||||||
|
non-zero count means samples are absent from the buffer, not merely late.
|
||||||
|
• <tt>reconnects</tt> counts sessions re-established with the source. Over unicast a climbing
|
||||||
|
count usually means a second client is taking the source's single session.
|
||||||
|
• The starvation notice — <i>connected, but no new frames in the last second</i> — is that same
|
||||||
|
situation seen from the other side. Pointing the app at a port where nothing answers produces
|
||||||
|
it too.
|
||||||
|
• <tt>stored</tt> versus <tt>wire</tt> in the popover is the decimation. They differ exactly
|
||||||
|
when the window is too long to store at full rate.
|
||||||
|
|
||||||
|
<b>Example</b>
|
||||||
|
|
||||||
|
The bar reads <tt>● live · 10.0 kS/s · 2 s window</tt>. Behind ⓘ:
|
||||||
|
<tt>Stream connected, configured / packets 717 · frames 716 · gaps 0 / 3 signals · 3 channels</tt>,
|
||||||
|
<tt>Buffer 200.0 MB · 1677 s span · time x1 / stored 10.0 kS/s (wire 10.0 kS/s)</tt>,
|
||||||
|
<tt>Plot 1 3 traces · 195000 samples</tt>, <tt>Reconnects 0</tt>.
|
||||||
@@ -20,5 +20,8 @@
|
|||||||
<file>09-cursors.txt</file>
|
<file>09-cursors.txt</file>
|
||||||
<file>10-measurements.txt</file>
|
<file>10-measurements.txt</file>
|
||||||
<file>11-math.txt</file>
|
<file>11-math.txt</file>
|
||||||
|
<file>12-export.txt</file>
|
||||||
|
<file>13-sessions.txt</file>
|
||||||
|
<file>14-status.txt</file>
|
||||||
</gresource>
|
</gresource>
|
||||||
</gresources>
|
</gresources>
|
||||||
@@ -41,6 +41,9 @@ constexpr HelpPage kPages[] = {
|
|||||||
{"Analysis", "Cursors", "/org/udpscope/help/09-cursors.txt"},
|
{"Analysis", "Cursors", "/org/udpscope/help/09-cursors.txt"},
|
||||||
{"Analysis", "Measurements", "/org/udpscope/help/10-measurements.txt"},
|
{"Analysis", "Measurements", "/org/udpscope/help/10-measurements.txt"},
|
||||||
{"Analysis", "Math channels", "/org/udpscope/help/11-math.txt"},
|
{"Analysis", "Math channels", "/org/udpscope/help/11-math.txt"},
|
||||||
|
{"Output and state", "Saving and export", "/org/udpscope/help/12-export.txt"},
|
||||||
|
{"Output and state", "Sessions and settings", "/org/udpscope/help/13-sessions.txt"},
|
||||||
|
{"Output and state", "Status bar and diagnostics", "/org/udpscope/help/14-status.txt"},
|
||||||
};
|
};
|
||||||
constexpr int kPageCount = static_cast<int>(sizeof(kPages) / sizeof(kPages[0]));
|
constexpr int kPageCount = static_cast<int>(sizeof(kPages) / sizeof(kPages[0]));
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user