新增:射频性能阈值着色

This commit is contained in:
2026-08-28 13:29:31 +08:00
parent 2cf8ca7a5a
commit 233866b5df
2 changed files with 57 additions and 9 deletions
+35 -6
View File
@@ -423,7 +423,12 @@
.ov-perf-name { .ov-perf-name {
font-size: 12px; font-size: 12px;
font-weight: 700; font-weight: 700;
letter-spacing: 0.4px; /* UPPERCASE to match the chain's stage labels (INPUT/PROCESS/OUTPUT), which
are text-transform:uppercase. Owner consistency ruling 2026-08-17: every
card header in the signal chain reads uppercase, so this one does too.
Letter-spacing bumped to sit with the stage labels' 1.4px feel. */
letter-spacing: 1.2px;
text-transform: uppercase;
color: var(--info-text); color: var(--info-text);
margin-bottom: 8px; margin-bottom: 8px;
padding-bottom: 6px; padding-bottom: 6px;
@@ -439,6 +444,15 @@
} }
.ov-perf-row .ov-perf-k { color: var(--text-muted); } .ov-perf-row .ov-perf-k { color: var(--text-muted); }
.ov-perf-row .ov-perf-v { color: var(--text-primary); } .ov-perf-row .ov-perf-v { color: var(--text-primary); }
/* Threshold colouring for the RF Performance values, matching the dashboard's
scheme (owner, 2026-08-17). Same tokens the dashboard uses (value-ok/warn/err/
off resolve to these), so a below-threshold reading turns the same colour here
as on the dashboard. Status is computed by the dashboard's OWN getSnrStatus/
getImdStatus (one source of truth), not re-thresholded here. */
.ov-perf-row .ov-perf-v.ov-v-ok { color: var(--accent-green); }
.ov-perf-row .ov-perf-v.ov-v-warn { color: var(--status-warn); }
.ov-perf-row .ov-perf-v.ov-v-err { color: var(--status-err); }
.ov-perf-row .ov-perf-v.ov-v-off { color: var(--text-muted); }
.ov-perf-foot { .ov-perf-foot {
margin-top: auto; margin-top: auto;
padding-top: 10px; padding-top: 10px;
@@ -768,13 +782,24 @@ function fbArrow() {
box's full width and can wrap without clipping. Values pass through exactly box's full width and can wrap without clipping. Values pass through exactly
as parse() produced them, so 'N/A-FSSI' shows verbatim under FSSI Refresh. */ as parse() produced them, so 'N/A-FSSI' shows verbatim under FSSI Refresh. */
function perfBox(snr, limd, uimd) { function perfBox(snr, limd, uimd) {
/* Colour each value by the dashboard's OWN threshold functions (getSnrStatus:
>=27 ok / >=20 warn / else err; getImdStatus: >=47 ok / else err; 'N/A*' ->
off/grey). One source of truth shared with the dashboard, so the box and the
dashboard never disagree. The status maps to ov-v-* (same colours as the
dashboard's value-* tokens). SNR can go amber; the IMDs jump straight to red,
exactly as the dashboard treats them. */
var H = window.DashboardHelpers;
var vc = function(cls){ return 'ov-perf-v' + (cls ? ' ov-v-' + cls : ''); };
var snrC = vc(H.getSnrStatus(snr));
var limdC = vc(H.getImdStatus(limd));
var uimdC = vc(H.getImdStatus(uimd));
return '' + return '' +
'<div class="ov-perf" onclick="window.location.href=\'sys_spectrum.html\'">' + '<div class="ov-perf" onclick="window.location.href=\'sys_spectrum.html\'">' +
' <div class="ov-perf-name">RF Performance</div>' + ' <div class="ov-perf-name">RF Performance</div>' +
' <div class="ov-perf-caption">Sampled transmit signal</div>' + ' <div class="ov-perf-caption">Sampled transmit signal</div>' +
' <div class="ov-perf-row"><span class="ov-perf-k">SNR</span><span class="ov-perf-v">' + snr + ' dB</span></div>' + ' <div class="ov-perf-row"><span class="ov-perf-k">SNR</span><span class="' + snrC + '">' + snr + ' dB</span></div>' +
' <div class="ov-perf-row"><span class="ov-perf-k">LIMD</span><span class="ov-perf-v">' + limd + ' dBc</span></div>' + ' <div class="ov-perf-row"><span class="ov-perf-k">LIMD</span><span class="' + limdC + '">' + limd + ' dBc</span></div>' +
' <div class="ov-perf-row"><span class="ov-perf-k">UIMD</span><span class="ov-perf-v">' + uimd + ' dBc</span></div>' + ' <div class="ov-perf-row"><span class="ov-perf-k">UIMD</span><span class="' + uimdC + '">' + uimd + ' dBc</span></div>' +
' <div class="ov-perf-foot">Details &rsaquo;</div>' + ' <div class="ov-perf-foot">Details &rsaquo;</div>' +
'</div>'; '</div>';
} }
@@ -861,9 +886,13 @@ window.Trends = (function () {
/* Chart set per sub-mode. Order = display order. Duplicated from the 1.0 /* Chart set per sub-mode. Order = display order. Duplicated from the 1.0
verbatim per the owner's law (exciter 5 charts / translator 7). smod has verbatim per the owner's law (exciter 5 charts / translator 7). smod has
only these two modes, so only these two are defined. */ only these two modes, so only these two are defined. */
/* Chart set per sub-mode. Order = display order. LIMD before UIMD (lower
intermodulation product first, then upper) — owner-ruled 2026-08-17. The
1.0 has these reversed (uimd, limd); that is logged as a cross-product fix,
NOT copied here. smod has only these two modes. */
var CHARTS_FOR_MODE = { var CHARTS_FOR_MODE = {
exciter: ['input_bitrate', 'snr', 'fwd_pct', 'uimd', 'limd'], exciter: ['input_bitrate', 'snr', 'fwd_pct', 'limd', 'uimd'],
translator: ['input_bitrate', 'rsnr', 'rssi', 'snr', 'fwd_pct', 'uimd', 'limd'] translator: ['input_bitrate', 'rsnr', 'rssi', 'snr', 'fwd_pct', 'limd', 'uimd']
}; };
var SPARK_W = 200, SPARK_H = 40, SPARK_PAD_Y = 2; var SPARK_W = 200, SPARK_H = 40, SPARK_PAD_Y = 2;
+22 -3
View File
@@ -210,9 +210,28 @@
negative). Verified: raw -22.7 -> -33.7 vs IMD 32.3/32.5; raw ~-63.4 -> -74.4 negative). Verified: raw -22.7 -> -33.7 vs IMD 32.3/32.5; raw ~-63.4 -> -74.4
vs IMD 73.6/73.9. */ vs IMD 73.6/73.9. */
var IMD_PILOT_OFFSET = 11; // dB; documented pilot offset (1.0 status_info_new.html) var IMD_PILOT_OFFSET = 11; // dB; documented pilot offset (1.0 status_info_new.html)
setReadout('rd_shoulder', d.shoulder - IMD_PILOT_OFFSET, 1); /* Threshold colouring for the three shoulder-suppression readouts, to match
setReadout('rd_limd', d.limd + IMD_PILOT_OFFSET, 1); the dashboard's scheme (owner, 2026-08-17). The dashboard colours SNR/LIMD/
setReadout('rd_uimd', d.uimd + IMD_PILOT_OFFSET, 1); UIMD via getSnrStatus/getImdStatus; SNR here is already coloured below
(line ~303). LIMD and UIMD use the dashboard's IMD rule directly: >= 47 dBc
green, else red (they already carry the +11 offset so they match the
dashboard values). Shoulder has NO pre-existing threshold anywhere; owner
ruled it uses the SAME 47 dBc line as the IMDs on its ABSOLUTE value (it is
the same kind of dBc shoulder-suppression measure, only signed negative). All
OTHER spectrum readouts (FSSI, Pilot, Peak, RBW, ...) stay plain — no invented
thresholds. A '--'/NaN reading clears the colour (stays default), never red. */
function imdColour(v){ // dBc magnitude vs the 47 dBc pass line
return (v === null) ? '' : (Math.abs(v) >= 47 ? 'var(--accent-green)' : 'var(--status-err)');
}
var shoulderVal = setReadout('rd_shoulder', d.shoulder - IMD_PILOT_OFFSET, 1);
var limdVal = setReadout('rd_limd', d.limd + IMD_PILOT_OFFSET, 1);
var uimdVal = setReadout('rd_uimd', d.uimd + IMD_PILOT_OFFSET, 1);
var shoulderEl = document.getElementById('rd_shoulder');
var limdEl = document.getElementById('rd_limd');
var uimdEl = document.getElementById('rd_uimd');
if (shoulderEl) shoulderEl.style.color = imdColour(shoulderVal);
if (limdEl) limdEl.style.color = imdColour(limdVal);
if (uimdEl) uimdEl.style.color = imdColour(uimdVal);
setReadout('rd_pilot', d.pilot, 4); setReadout('rd_pilot', d.pilot, 4);
setReadout('rd_peak', d.peak, 1); setReadout('rd_peak', d.peak, 1);
setReadout('rd_rbw', d.rbw_khz, 2); setReadout('rd_rbw', d.rbw_khz, 2);