From 71a97f34381be7a35bb0279bda451cfaa091c3a2 Mon Sep 17 00:00:00 2001 From: Rossen Georgiev Date: Sat, 27 Nov 2021 15:28:55 +0000 Subject: [PATCH] parsing: calculate power,height,gain,range for PHG --- aprslib/parsing/common.py | 24 +++++++++++++++++- tests/test_parse_common.py | 50 ++++++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/aprslib/parsing/common.py b/aprslib/parsing/common.py index 33be8ba..346af57 100644 --- a/aprslib/parsing/common.py +++ b/aprslib/parsing/common.py @@ -1,4 +1,5 @@ import re +from math import sqrt from datetime import datetime from aprslib import base91 from aprslib.exceptions import ParseError @@ -160,7 +161,28 @@ def parse_data_extentions(body): print(match) ext, phg, phgr = match[0] body = body[len(ext):] - parsed.update({'phg': phg}) + parsed.update({ + 'phg': phg, + 'phg_power': int(phg[0]) ** 2, # watts + 'phg_height': (10 * (2 ** (ord(phg[1]) - 0x30))) * 0.3048, # in meters + 'phg_gain': 10 ** (int(phg[2]) / 10), # dB + }) + + phg_dir = int(phg[3]) + if phg_dir == 0: + phg_dir = 'omni' + elif phg_dir == 9: + phg_dir = 'invalid' + else: + phg_dir = 45 * phg_dir + + parsed['phg_dir'] = phg_dir + # range in km + parsed['phg_range'] = sqrt(2 * (parsed['phg_height'] / 0.3048) + * sqrt((parsed['phg_power'] / 10.0) + * (parsed['phg_gain'] / 2.0) + ) + ) * 1.60934 if phgr: # PHG rate per hour diff --git a/tests/test_parse_common.py b/tests/test_parse_common.py index e30210e..d64f07f 100644 --- a/tests/test_parse_common.py +++ b/tests/test_parse_common.py @@ -313,43 +313,77 @@ class DataExtentionsTC(unittest.TestCase): }) def test_PHGR_1(self): - body = "PHG12345/text" + body = "PHG51325/text" remaining, parsed = parse_data_extentions(body) self.assertEqual(remaining, 'text') self.assertEqual(parsed, { - 'phg': '12345', + 'phg': '51325', 'phg_rate': 5, + 'phg_power': 25, + 'phg_height': 6.096, + 'phg_gain': 1.9952623149688795, + 'phg_dir': 90, + 'phg_range': 12.791023731208883, }) def test_PHGR_2(self): - body = "PHG1234F/text" + body = "PHG5132F/text" remaining, parsed = parse_data_extentions(body) self.assertEqual(remaining, 'text') self.assertEqual(parsed, { - 'phg': '1234F', + 'phg': '5132F', 'phg_rate': 15, + 'phg_power': 25, + 'phg_height': 6.096, + 'phg_gain': 1.9952623149688795, + 'phg_dir': 90, + 'phg_range': 12.791023731208883, }) def test_PHG_1(self): - body = "PHG1234Atext" + body = "PHG5132Atext" remaining, parsed = parse_data_extentions(body) self.assertEqual(remaining, 'Atext') self.assertEqual(parsed, { - 'phg': '1234', + 'phg': '5132', + 'phg_power': 25, + 'phg_height': 6.096, + 'phg_gain': 1.9952623149688795, + 'phg_dir': 90, + 'phg_range': 12.791023731208883, }) def test_PHG_2(self): - body = "PHG1234text" + body = "PHG5132text" remaining, parsed = parse_data_extentions(body) self.assertEqual(remaining, 'text') self.assertEqual(parsed, { - 'phg': '1234', + 'phg': '5132', + 'phg_power': 25, + 'phg_height': 6.096, + 'phg_gain': 1.9952623149688795, + 'phg_dir': 90, + 'phg_range': 12.791023731208883, }) + def test_PHG_dir_omni(self): + body = "PHG0000text" + remaining, parsed = parse_data_extentions(body) + + self.assertEqual(remaining, 'text') + self.assertEqual(parsed['phg_dir'], 'omni') + + def test_PHG_dir_invalid(self): + body = "PHG0009text" + remaining, parsed = parse_data_extentions(body) + + self.assertEqual(remaining, 'text') + self.assertEqual(parsed['phg_dir'], 'invalid') + def test_range(self): body = "RNG1000text" remaining, parsed = parse_data_extentions(body)