2025-05-21 15:23:18 +00:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
from ogn.parser import parse
|
|
|
|
from ogn.parser.exceptions import AprsParseError
|
|
|
|
from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS, KNOTS_TO_MS, KPH_TO_MS, FEETS_TO_METER
|
|
|
|
|
|
|
|
|
|
|
|
def test_basic():
|
|
|
|
raw_message = r"FLRDDA5BA>APRS,qAS,LFMX:/160829h4415.41N/00600.03E'342/049/A=005524 this is a comment"
|
|
|
|
message = parse(raw_message)
|
|
|
|
|
|
|
|
assert message['aprs_type'] == 'position'
|
|
|
|
assert message['beacon_type'] == 'unknown'
|
|
|
|
|
|
|
|
assert message['name'] == "FLRDDA5BA"
|
|
|
|
assert message['dstcall'] == "APRS"
|
|
|
|
assert message['receiver_name'] == "LFMX"
|
|
|
|
assert message['timestamp'].strftime('%H:%M:%S') == "16:08:29"
|
2025-05-22 07:49:56 +00:00
|
|
|
assert message['latitude'] == 44.25683333333333
|
2025-05-21 15:23:18 +00:00
|
|
|
assert message['symboltable'] == '/'
|
2025-05-22 07:49:56 +00:00
|
|
|
assert message['longitude'] == 6.0005
|
2025-05-21 15:23:18 +00:00
|
|
|
assert message['symbolcode'] == '\''
|
|
|
|
assert message['track'] == 342
|
|
|
|
assert message['ground_speed'] == 49 * KNOTS_TO_MS / KPH_TO_MS
|
2025-05-22 07:49:56 +00:00
|
|
|
assert message['altitude'] == 5524 * FEETS_TO_METER
|
2025-05-21 15:23:18 +00:00
|
|
|
assert message['user_comment'] == "this is a comment"
|
|
|
|
|
|
|
|
|
|
|
|
def test_v026_relay():
|
|
|
|
# beacons can be relayed
|
|
|
|
raw_message = "FLRFFFFFF>OGNAVI,NAV07220E*,qAS,NAVITER:/092002h1000.00S/01000.00W'000/000/A=003281 !W00! id2820FFFFFF +300fpm +1.7rot"
|
|
|
|
message = parse(raw_message)
|
|
|
|
|
|
|
|
assert message['aprs_type'] == 'position'
|
|
|
|
assert message['beacon_type'] == 'naviter'
|
|
|
|
|
|
|
|
assert message['relay'] == "NAV07220E"
|
|
|
|
|
|
|
|
|
|
|
|
def test_no_altitude():
|
|
|
|
# altitude is not a 'must have'
|
|
|
|
raw_message = "FLRDDEEF1>OGCAPT,qAS,CAPTURS:/065511h4837.63N/00233.79E'000/000"
|
|
|
|
message = parse(raw_message)
|
|
|
|
|
|
|
|
assert message['aprs_type'] == 'position'
|
|
|
|
assert message['beacon_type'] == 'capturs'
|
|
|
|
|
|
|
|
assert message.get('altitude') is None
|
|
|
|
|
|
|
|
|
|
|
|
def test_invalid_coordinates():
|
|
|
|
# sometimes the coordinates leave their valid range: -90<=latitude<=90 or -180<=longitude<=180
|
|
|
|
with pytest.raises(AprsParseError):
|
|
|
|
parse("RND000000>APRS,qAS,TROCALAN1:/210042h6505.31S/18136.75W^054/325/A=002591 !W31! idA4000000 +099fpm +1.8rot FL029.04 12.0dB 5e -6.3kHz gps11x17")
|
|
|
|
|
|
|
|
with pytest.raises(AprsParseError):
|
|
|
|
parse("RND000000>APRS,qAS,TROCALAN1:/210042h9505.31S/17136.75W^054/325/A=002591 !W31! idA4000000 +099fpm +1.8rot FL029.04 12.0dB 5e -6.3kHz gps11x17")
|
|
|
|
|
|
|
|
|
|
|
|
def test_invalid_timestamp():
|
|
|
|
with pytest.raises(AprsParseError):
|
|
|
|
parse("OGND4362A>APRS,qAS,Eternoz:/194490h4700.25N/00601.47E'003/063/A=000000 !W22! id07D4362A 0fpm +0.0rot FL000.00 2.0dB 3e -2.8kHz gps3x4 +12.2dBm")
|
|
|
|
|
|
|
|
with pytest.raises(AprsParseError):
|
|
|
|
parse("Ulrichamn>APRS,TCPIP*,qAC,GLIDERN1:/194490h5747.30NI01324.77E&/A=001322")
|
|
|
|
|
|
|
|
|
|
|
|
def test():
|
|
|
|
raw_message = r"FLRDDEEF1>OGCAPT,qAS,CAPTURS:/065511h4837.63N/00233.79E'255/045/A=003399 !W03! id06DDFAA3 -613fpm -3.9rot 22.5dB 7e -7.0kHz gps3x7 s7.07 h41 rD002F8"
|
|
|
|
message = parse(raw_message)
|
|
|
|
|
|
|
|
assert message['aprs_type'] == 'position'
|
|
|
|
assert message['beacon_type'] == 'capturs'
|
|
|
|
|
|
|
|
assert message['name'] == "FLRDDEEF1"
|
|
|
|
assert message['dstcall'] == "OGCAPT"
|
|
|
|
assert message['receiver_name'] == "CAPTURS"
|
|
|
|
assert message['timestamp'].strftime('%H:%M:%S') == "06:55:11"
|
2025-05-22 07:49:56 +00:00
|
|
|
assert message['latitude'] == 48.62716666666667
|
|
|
|
assert message['longitude'] == 2.5632166666666665
|
2025-05-21 15:23:18 +00:00
|
|
|
assert message['symboltable'] == '/'
|
|
|
|
assert message['symbolcode'] == '\''
|
|
|
|
assert message['track'] == 255
|
|
|
|
assert message['ground_speed'] == 45 * KNOTS_TO_MS / KPH_TO_MS
|
2025-05-22 07:49:56 +00:00
|
|
|
assert message['altitude'] == 3399 * FEETS_TO_METER
|
2025-05-21 15:23:18 +00:00
|
|
|
|
|
|
|
assert message['address_type'] == 2
|
|
|
|
assert message['aircraft_type'] == 1
|
|
|
|
assert message['stealth'] is False
|
|
|
|
assert message['no-tracking'] is False
|
|
|
|
assert message['address'] == 'DDFAA3'
|
2025-05-22 07:49:56 +00:00
|
|
|
assert message['climb_rate'] == -613 * FPM_TO_MS
|
|
|
|
assert message['turn_rate'] == -3.9 * HPM_TO_DEGS
|
2025-05-21 15:23:18 +00:00
|
|
|
assert message['signal_quality'] == 22.5
|
|
|
|
assert message['error_count'] == 7
|
|
|
|
assert message['frequency_offset'] == -7.0
|
|
|
|
assert message['gps_quality'] == '3x7'
|
|
|
|
assert message['software_version'] == 7.07
|
|
|
|
assert message['hardware_version'] == 65
|
|
|
|
assert message['real_address'] == 'D002F8'
|