python-ogn-client/tests/parser/parse/test_position.py

101 wiersze
4.0 KiB
Python
Czysty Zwykły widok Historia

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
assert message['symboltable'] == '/'
2025-05-22 07:49:56 +00:00
assert message['longitude'] == 6.0005
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
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
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
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
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'