diff --git a/tests/test_dsc.py b/tests/test_dsc.py index cb74018..b47c9ae 100644 --- a/tests/test_dsc.py +++ b/tests/test_dsc.py @@ -313,8 +313,9 @@ class TestDSCDecoder: def test_decode_mmsi_with_leading_zeros(self, decoder): """Test MMSI decoding handles leading zeros.""" # Coast station: 002320001 - # 00-23-20-00-01 -> [0, 23, 20, 0, 1] - symbols = [0, 23, 20, 0, 1] + # Padded to 10 digits: 0002320001 + # BCD pairs: 00-02-32-00-01 -> [0, 2, 32, 0, 1] + symbols = [0, 2, 32, 0, 1] result = decoder._decode_mmsi(symbols) assert result == '002320001' @@ -328,14 +329,16 @@ class TestDSCDecoder: # Symbols > 99 should be treated as 0 symbols = [100, 32, 12, 34, 56] result = decoder._decode_mmsi(symbols) - # First symbol becomes 00 - assert result == '003212345'[-9:] + # First symbol (100) becomes 00, padded result "0032123456", + # trim leading pad digit -> "032123456" + assert result == '032123456' def test_decode_position_northeast(self, decoder): """Test position decoding for NE quadrant.""" # Quadrant 10 = NE (lat+, lon+) # Position: 51°30'N, 0°10'E - symbols = [10, 51, 30, 0, 10, 0, 0, 0, 0, 0] + # lon_deg = symbols[3]*100 + symbols[4] = 0, lon_min = symbols[5] = 10 + symbols = [10, 51, 30, 0, 0, 10, 0, 0, 0, 0] result = decoder._decode_position(symbols) assert result is not None diff --git a/utils/dsc/decoder.py b/utils/dsc/decoder.py index 031c5b1..51442bd 100644 --- a/utils/dsc/decoder.py +++ b/utils/dsc/decoder.py @@ -264,6 +264,20 @@ class DSCDecoder: symbol_value = self._bits_to_symbol(symbol_bits) symbols.append(symbol_value) + # Strip phasing sequence (RX/DX symbols 120-126) from the + # start of the message. Per ITU-R M.493, after the dot pattern + # there are 7 phasing symbols before the format specifier. + msg_start = 0 + for i, sym in enumerate(symbols): + if 120 <= sym <= 126: + msg_start = i + 1 + else: + break + symbols = symbols[msg_start:] + + if len(symbols) < 5: + return None + # Look for EOS (End of Sequence) - symbol 127 eos_found = False eos_index = -1 @@ -404,9 +418,10 @@ class DSCDecoder: digits.append(f'{sym:02d}') mmsi = ''.join(digits) - # MMSI is 9 digits, might need to trim leading zero + # MMSI is 9 digits - trim the leading digit from the 10-digit + # BCD result since the first symbol's high digit is always 0 if len(mmsi) > 9: - mmsi = mmsi[-9:] + mmsi = mmsi[1:] return mmsi.zfill(9)