Skip to content

Commit a336be2

Browse files
committed
Added fixes and tests for position packets
sometimes position packets have trailing spaces. this patch fixes the parsing of those packets.
1 parent 28f8880 commit a336be2

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

aprslib/parsing/position.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ def parse_compressed(body):
156156
def parse_normal(body):
157157
parsed = {}
158158

159-
match = re.findall(r"^(\d{2})([0-9 ]{2}\.[0-9 ]{2})([NnSs])([\/\\0-9A-Z])"
160-
r"(\d{3})([0-9 ]{2}\.[0-9 ]{2})([EeWw])([\x21-\x7e])(.*)$", body)
159+
match = re.findall(r"^(\d{2})([0-9 ]{2}\.[0-9 ]{1,2})([NnSs])([\/\\0-9A-Z])"
160+
r"(\d{3})([0-9 ]{2}\.[0-9 ]{1,2})([EeWw])([\x21-\x7e])(.*)$", body)
161161

162162
if match:
163163
parsed.update({'format': 'uncompressed'})
@@ -175,9 +175,12 @@ def parse_normal(body):
175175
) = match[0]
176176

177177
# position ambiguity
178-
posambiguity = lat_min.count(' ')
178+
# Strip trailing spaces before counting (trailing spaces are not part of ambiguity)
179+
lat_min_stripped = lat_min.rstrip(' ')
180+
lon_min_stripped = lon_min.rstrip(' ')
181+
posambiguity = lat_min_stripped.count(' ')
179182

180-
if posambiguity != lon_min.count(' '):
183+
if posambiguity != lon_min_stripped.count(' '):
181184
raise ParseError("latitude and longitude ambiguity mismatch")
182185

183186
parsed.update({'posambiguity': posambiguity})
@@ -187,8 +190,9 @@ def parse_normal(body):
187190
lat_min = "30"
188191
lon_min = "30"
189192
else:
190-
lat_min = lat_min.replace(' ', '5', 1)
191-
lon_min = lon_min.replace(' ', '5', 1)
193+
# Use stripped versions for ambiguity replacement
194+
lat_min = lat_min_stripped.replace(' ', '5', 1)
195+
lon_min = lon_min_stripped.replace(' ', '5', 1)
192196

193197
# validate longitude and latitude
194198

tests/test_parse_position.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,5 +166,19 @@ def test_position_packet_optional_course(self):
166166
_, result = parse_position(packet_type, packet)
167167
self.assertEqual(expected, result)
168168

169+
def test_position_with_trailing_space_in_minutes(self):
170+
"""Test position packet with trailing space in minutes field (real-world packet)"""
171+
from aprslib.parsing import parse
172+
packet = "N0NPO-2>APWW11,TCPIP*,qAC,T2SYDNEY:@215527h4424.4 N/10017.85W#"
173+
result = parse(packet)
174+
175+
self.assertEqual(result['format'], 'uncompressed')
176+
self.assertAlmostEqual(result['latitude'], 44.406666666666666, places=5)
177+
self.assertAlmostEqual(result['longitude'], -100.2975, places=5)
178+
self.assertEqual(result['posambiguity'], 0) # Trailing spaces don't count as ambiguity
179+
self.assertEqual(result['symbol_table'], '/')
180+
self.assertEqual(result['symbol'], '#')
181+
self.assertIn('timestamp', result)
182+
169183
if __name__ == '__main__':
170184
unittest.main()

0 commit comments

Comments
 (0)