fix: power is RM5, not RM4 — the CW keying was the experiment

An FM carrier could not answer it: constant by definition, so nothing to
correlate. CW at 100 W did, because the keying itself varies the output:

  key down: RM4=25 RM5=207 RM6=13
  key up:   RM4=25 RM5=0   RM6=0

RM5 follows the RF envelope exactly — it IS the power meter. RM4 sits near 25
whether the key is down or up, so it is not measuring output at all, and reading
it as power is what showed 8 W on a 100 W transmission. The operator's hunch was
right and my first reading of the ramp was wrong: what I took for a needle
rising was RM4 drifting, not tracking.

Watts are now derived from that meter (207 = 100 W, measured) instead of the
power SETTING scaled by a percentage — the setting says what was asked for, the
meter says what left the radio.

The bars also hold their peak with a gentle decay. In CW the meters genuinely
read zero between elements, so following the raw value made them flash to nothing
several times a second; a needle has inertia, and this only ever holds a value
the radio really reported.
This commit is contained in:
2026-07-29 13:56:59 +02:00
parent cbe571a742
commit 8e491544dd
4 changed files with 66 additions and 16 deletions
+5 -2
View File
@@ -19,7 +19,7 @@ type YaesuState = {
rf_power: number; mic_gain: number; af_gain: number; rf_gain: number; squelch: number;
agc?: string; preamp: number; att: number;
nb: boolean; nr: boolean; nr_level: number; narrow: boolean; vox: boolean;
split_tx_hz?: number; key_speed?: number; break_in?: boolean; swr?: number;
split_tx_hz?: number; key_speed?: number; break_in?: boolean; swr?: number; power_w?: number;
};
const ZERO: YaesuState = {
@@ -350,7 +350,10 @@ export function YaesuPanel({ onReportRST, onKeySpeed }: {
display={sParts(view.s_meter).label}
onClick={onReportRST ? () => { const sp = sParts(view.s_meter); onReportRST(sMeterRST(sp.s, sp.over, view.mode)); } : undefined}
title={onReportRST ? t('yaesu.sToRst') : undefined} />
<MeterBar label="PWR" value={view.rf_power * view.power_meter / 100} unit="W" lo={0} hi={100} accent="#0ea5e9" />
{/* Watts as MEASURED, not the power setting scaled by a percentage:
the setting says what was asked for, the meter says what left. */}
<MeterBar label="PWR" value={view.power_w ?? 0} unit="W" lo={0} hi={Math.max(100, view.rf_power || 100)} accent="#0ea5e9"
display={view.transmitting ? Math.round(view.power_w ?? 0) + 'W' : '—'} />
{/* The RATIO, as the rig shows it — a percentage of meter travel is
not something an operator can act on. The bar keeps the travel. */}
<MeterBar label="SWR" value={view.swr_meter} lo={0} hi={100} accent="#f59e0b"
+2
View File
@@ -1098,6 +1098,7 @@ export namespace cat {
nr_level: number;
narrow: boolean;
swr: number;
power_w: number;
vox: boolean;
key_speed: number;
break_in: boolean;
@@ -1131,6 +1132,7 @@ export namespace cat {
this.nr_level = source["nr_level"];
this.narrow = source["narrow"];
this.swr = source["swr"];
this.power_w = source["power_w"];
this.vox = source["vox"];
this.key_speed = source["key_speed"];
this.break_in = source["break_in"];