feat(udp): speak WSJT-X to Logger32, and lighten Sahara

"sent 1153 bytes to 127.0.0.1:2250" and nothing in Logger32. Both true: the
line the operator screenshotted is titled "Setup additional WSJT/JTDX UDP
sockets", and those receivers take UDP LOGGING PACKETS — the WSJT-X v2
protocol. A bare ADIF record posted to them is dropped without a word.

So there is a new outbound service rather than a change to the existing one:
"WSJT-X logged QSO (Logger32)" sends the same ADIF wrapped in a Logged ADIF
datagram (magic 0xadbccbda, schema 2, type 12), defaulting to port 2250. The
plain-text row stays for JTAlert/GridTracker-style receivers, because the two
really are different wire formats and one row cannot be both.

The id string is "OpsLog", not "WSJT-X": a receiver uses it to tell instances
apart, and impersonating the real thing would make a second WSJT-X
indistinguishable from us.

Tested both ways — the header byte for byte, and a round trip back through our
own ParseWSJT, since that is the same decoding every receiver applies.

Sahara moves to the parchment an operator asked for: page #e6ded0, panels
#f3eee2, toolbars #ded5c4, terracotta #c4501e on the buttons and the focus
ring. Lighter and less saturated than the deep sand it was.
This commit is contained in:
2026-08-14 17:51:31 +02:00
parent c5c9d355ec
commit d95c998081
10 changed files with 165 additions and 32 deletions
+24 -24
View File
@@ -785,27 +785,27 @@
The accent moves from Warm light's burnt orange to ochre to keep the two
themes apart at a glance in the theme picker. ---------------------------- */
[data-theme="sahara"] {
--background: #dcceab; /* deep sand — the page */
--foreground: #2b2318; /* deep warm brown-ink */
--card: #faf6eb; /* lifted panel / entry strip — kept cream */
--card-foreground: #2b2318;
--popover: #faf6eb;
--popover-foreground: #2b2318;
--primary: #a55f14; /* ochre */
--primary-foreground: #fffbf2;
--secondary: #cdbb92;
--secondary-foreground: #2b2318;
--muted: #cdbb92; /* toolbars / tab bar / table headers */
--muted-foreground: #544731; /* readable on both sands */
--accent: #e9d3a6; /* warm highlight */
--accent-foreground: #6b3a06;
--destructive: #b91c1c;
--background: #e6ded0; /* parchment — the page */
--foreground: #3a3227; /* warm brown-ink */
--card: #f3eee2; /* panels, entry strip, log rows */
--card-foreground: #3a3227;
--popover: #f3eee2;
--popover-foreground: #3a3227;
--primary: #c4501e; /* terracotta — buttons and the frequency */
--primary-foreground: #fdf8f0;
--secondary: #ded5c4;
--secondary-foreground: #3a3227;
--muted: #ded5c4; /* toolbars / tab bar / table headers */
--muted-foreground: #6a5f4e; /* readable on both parchments */
--accent: #ecd9c0; /* warm highlight */
--accent-foreground: #7a3410;
--destructive: #b3401b;
--destructive-foreground: #ffffff;
--destructive-muted: #fdecec;
--destructive-muted-foreground: #b91c1c;
--border: #b6a179; /* sand a step down again, so edges read */
--input: #b6a179;
--ring: #c2760c; /* amber focus ring */
--destructive-muted: #f7e4da;
--destructive-muted-foreground: #8f3315;
--border: #cdc2ae; /* one step down, so edges read without lines */
--input: #cdc2ae;
--ring: #c4501e; /* the accent, so focus matches the buttons */
--success: #15803d;
--success-foreground: #ffffff;
@@ -843,11 +843,11 @@
--mx-call-work: #7fd6a4;
--mx-dx-conf: #3730a3;
--mx-dx-work: #a5b4fc;
--mx-none: #cdbb92;
--mx-none: #ded5c4;
--scrollbar-thumb: #ac9868;
--scrollbar-thumb-hover: #927d4e;
--card-shadow: 0 1px 2px rgba(43, 35, 24, 0.07), 0 0 0 1px rgba(43, 35, 24, 0.03);
--scrollbar-thumb: #c2b6a0;
--scrollbar-thumb-hover: #a5977e;
--card-shadow: 0 1px 2px rgba(58, 50, 39, 0.06), 0 0 0 1px rgba(58, 50, 39, 0.03);
color-scheme: light;
}