Wires the SSTV decoder into the stack, from the audio the server already
has to a panel in the browser that shows the picture arriving.
Server: a decoder task alongside the WEFAX one, running whenever the
decoder is enabled and the rig is in a mode SSTV is sent in. A finished
picture is written to the cache as a PNG and sent on as a message; the
rows are sent as they decode, so a client can watch two minutes of
Martin M1 fill in rather than waiting for it. Pictures join the decode
history, are replayed to a client that connects later, and survive a
restart.
Protocol: SetSstvDecodeEnabled and ResetSstvDecoder, a sstv_decode
_enabled flag in the rig state, two audio message types, and Sstv and
SstvProgress on DecodedMessage. The history stores the message without
its base64 payload -- the picture is already on disk, and a megabyte per
entry is not what a history is for.
Client: pictures land in their own history, and the PNG the server sent
is written to the local cache so /sstv-images/ can serve it back. That
endpoint and the WEFAX one now share their filename checks rather than
each carrying a copy: no separators, no parent references, .png only.
Web UI: an SSTV sub-tab beside WEFAX, with a live canvas the rows paint
into at the line number they carry, a card for the last picture, and a
filterable history with links to the files. Rows below the one arriving
are grey rather than black -- not yet received is a different thing from
received as black. A picture is not a spot, so neither pictures nor
their progress updates reach the decode statistics; that exclusion list
had grown by hand for LRPT and WEFAX and is now one named set.
The decoder crate gains what the server needed to hand a picture on:
to_png, to_png_base64 and save_png, with file names stamped in UTC so
they sort.
Panel behaviour is tested with the plugin runtime: rows painting at
their own line numbers rather than in arrival order, a completed picture
linked by file name alone with no server path in the page, a cut-off
picture reported as partial, clearing, and the toggle following the rig
state.
Signed-off-by: Stan Grams <sjg@haxx.space>