From 7044747ade6b0aa6d4a64bfc8c66225fe99ea097 Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Tue, 17 Mar 2026 22:26:55 +0100 Subject: [PATCH] [fix](trx-wspr): remove spurious power field offset that rejected all decodes The WSPR 7-bit power field contains the raw dBm value (0-60) with no offset. The decoder was subtracting 64, turning valid power values into negative numbers that always failed the range check, causing unpack_message to return None for every real signal. Also fix callsign trimming to strip leading spaces from space-padded callsigns. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Stanislaw Grams --- src/decoders/trx-wspr/src/protocol.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/decoders/trx-wspr/src/protocol.rs b/src/decoders/trx-wspr/src/protocol.rs index 39b482f..c5e3a0f 100644 --- a/src/decoders/trx-wspr/src/protocol.rs +++ b/src/decoders/trx-wspr/src/protocol.rs @@ -141,8 +141,8 @@ fn unpack_message(bits: &[u8; NBITS]) -> Option { power_code = (power_code << 1) | b as u32; } - // power_code = dBm + 64; valid WSPR levels are 0–60 dBm. - let power_dbm = power_code as i32 - 64; + // power_code is the raw dBm value; valid WSPR levels are 0–60 dBm. + let power_dbm = power_code as i32; if !(0..=60).contains(&power_dbm) { return None; } @@ -179,7 +179,7 @@ fn unpack_message(bits: &[u8; NBITS]) -> Option { CS27[i4] as char, CS27[i5] as char, ) - .trim_end() + .trim() .to_string(); if callsign.len() < 3 || !callsign.chars().any(|c| c.is_alphabetic()) { @@ -243,10 +243,7 @@ mod tests { let c4 = idx27(b'T'); let c5 = idx27(b' '); - let n1 = ((c0 * 36 + c1) * 10 + c2) * 27u32.pow(3) - + c3 * 27u32.pow(2) - + c4 * 27 - + c5; + let n1 = ((c0 * 36 + c1) * 10 + c2) * 27u32.pow(3) + c3 * 27u32.pow(2) + c4 * 27 + c5; // Grid "FN20": loc1='F'=5 (lon), loc2='N'=13 (lat), loc3='2', loc4='0' let loc1 = (b'F' - b'A') as u32; // 5 @@ -255,8 +252,8 @@ mod tests { let loc4 = 0u32; let m1 = (179 - 10 * loc1 - loc3) * 180 + 10 * loc2 + loc4; - // Power 37 dBm → power_code = 37 + 64 = 101 - let power_code = 37u32 + 64; + // Power 37 dBm → power_code = 37 (raw dBm value) + let power_code = 37u32; // Pack into 50-bit array let mut bits = [0u8; NBITS];