[feat](trx-rs): rename AMC (AM C-QUAM) to SAM (Stereo AM) with stereo width and carrier sync controls

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-03-26 21:50:53 +01:00
parent 20a22622e7
commit 27489c3745
20 changed files with 427 additions and 166 deletions
@@ -2955,6 +2955,13 @@ function render(update) {
wfmStFlagEl.classList.toggle("wfm-st-flag-stereo", detected);
wfmStFlagEl.classList.toggle("wfm-st-flag-mono", !detected);
}
if (samStereoWidthEl && typeof update.filter.sam_stereo_width === "number") {
samStereoWidthEl.value = String(Math.round(update.filter.sam_stereo_width * 100));
}
if (samCarrierSyncEl && typeof update.filter.sam_carrier_sync === "boolean") {
const nextVal = update.filter.sam_carrier_sync ? "on" : "off";
if (samCarrierSyncEl.value !== nextVal) samCarrierSyncEl.value = nextVal;
}
const hasSdrSquelchEnabled = typeof update.filter.sdr_squelch_enabled === "boolean";
const hasSdrSquelchThreshold = typeof update.filter.sdr_squelch_threshold_db === "number";
if (hasSdrSquelchEnabled || hasSdrSquelchThreshold) {
@@ -3915,7 +3922,7 @@ const MODE_BW_DEFAULTS = {
LSB: [2_700, 300, 6_000, 100],
USB: [2_700, 300, 6_000, 100],
AM: [9_000, 500, 20_000, 500],
"AMC-QUAM": [9_000, 500, 20_000, 500],
SAM: [9_000, 500, 20_000, 500],
FM: [12_500, 2_500, 25_000, 500],
AIS: [25_000, 12_500, 50_000, 500],
VDES: [100_000, 25_000, 200_000, 1_000],
@@ -7487,6 +7494,9 @@ const sdrLnaGainEl = document.getElementById("sdr-lna-gain-db");
const sdrLnaGainSetBtn = document.getElementById("sdr-lna-gain-set");
const sdrAgcEl = document.getElementById("sdr-agc-enabled");
const wfmStFlagEl = document.getElementById("wfm-st-flag");
const samControlsCol = document.getElementById("sam-controls-col");
const samStereoWidthEl = document.getElementById("sam-stereo-width");
const samCarrierSyncEl = document.getElementById("sam-carrier-sync");
const sdrSquelchWrapEl = document.getElementById("sdr-squelch-wrap");
const sdrSquelchEl = document.getElementById("sdr-squelch");
const sdrSquelchPctEl = document.getElementById("sdr-squelch-pct");
@@ -7681,6 +7691,18 @@ if (wfmDeemphasisEl) {
postPath(`/set_wfm_deemphasis?us=${encodeURIComponent(wfmDeemphasisEl.value)}`).catch(() => {});
});
}
if (samStereoWidthEl) {
samStereoWidthEl.addEventListener("input", () => {
const width = Number(samStereoWidthEl.value) / 100;
postPath(`/set_sam_stereo_width?width=${width}`).catch(() => {});
});
}
if (samCarrierSyncEl) {
samCarrierSyncEl.addEventListener("change", () => {
const enabled = samCarrierSyncEl.value === "on";
postPath(`/set_sam_carrier_sync?enabled=${enabled}`).catch(() => {});
});
}
function submitSdrGain() {
if (!sdrGainEl) return;
const parsed = Number.parseFloat(sdrGainEl.value);
@@ -7761,9 +7783,9 @@ if (sdrNbThresholdEl) {
});
}
function updateWfmControls() {
if (!wfmControlsCol) return;
const mode = (modeEl && modeEl.value ? modeEl.value : "").toUpperCase();
wfmControlsCol.style.display = mode === "WFM" ? "" : "none";
if (wfmControlsCol) wfmControlsCol.style.display = mode === "WFM" ? "" : "none";
if (samControlsCol) samControlsCol.style.display = mode === "SAM" ? "" : "none";
}
// Show compatibility warning for non-Chromium browsers
@@ -253,6 +253,22 @@
</div>
<div class="label"><span>WFM</span></div>
</div>
<div class="controls-col controls-col-sam label-below-col" id="sam-controls-col" style="display:none;">
<div class="inline sam-controls-inline">
<label class="wfm-control">
<span class="wfm-control-label">Stereo Width</span>
<input type="range" id="sam-stereo-width" min="0" max="100" value="100" class="status-input" />
</label>
<label class="wfm-control">
<span class="wfm-control-label">Carrier Sync</span>
<select id="sam-carrier-sync" class="status-input">
<option value="on">On</option>
<option value="off">Off</option>
</select>
</label>
</div>
<div class="label"><span>SAM</span></div>
</div>
<div class="controls-col controls-col-power label-below-col" id="tx-power-col">
<div class="label"><span>Transmit / Power</span></div>
<div class="btn-grid">
@@ -411,7 +427,7 @@
<option value="LSB">
<option value="USB">
<option value="AM">
<option value="AMC-QUAM">
<option value="SAM">
<option value="FM">
<option value="DIG">
<option value="CW">
@@ -1122,6 +1122,36 @@ pub async fn set_wfm_denoise(
send_command(&rig_tx, RigCommand::SetWfmDenoise(q.level), q.remote).await
}
#[derive(serde::Deserialize)]
pub struct SamStereoWidthQuery {
pub width: f32,
pub remote: Option<String>,
}
#[post("/set_sam_stereo_width")]
pub async fn set_sam_stereo_width(
query: web::Query<SamStereoWidthQuery>,
rig_tx: web::Data<mpsc::Sender<RigRequest>>,
) -> Result<HttpResponse, Error> {
let q = query.into_inner();
send_command(&rig_tx, RigCommand::SetSamStereoWidth(q.width), q.remote).await
}
#[derive(serde::Deserialize)]
pub struct SamCarrierSyncQuery {
pub enabled: bool,
pub remote: Option<String>,
}
#[post("/set_sam_carrier_sync")]
pub async fn set_sam_carrier_sync(
query: web::Query<SamCarrierSyncQuery>,
rig_tx: web::Data<mpsc::Sender<RigRequest>>,
) -> Result<HttpResponse, Error> {
let q = query.into_inner();
send_command(&rig_tx, RigCommand::SetSamCarrierSync(q.enabled), q.remote).await
}
#[post("/toggle_aprs_decode")]
pub async fn toggle_aprs_decode(
query: web::Query<RemoteQuery>,
@@ -1974,6 +2004,8 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
.service(set_wfm_deemphasis)
.service(set_wfm_stereo)
.service(set_wfm_denoise)
.service(set_sam_stereo_width)
.service(set_sam_carrier_sync)
.service(toggle_aprs_decode)
.service(toggle_hf_aprs_decode)
.service(toggle_cw_decode)