From 633ad2ea84321b8ff1c81a754664f3fd43bb8918 Mon Sep 17 00:00:00 2001 From: Rossen Georgiev Date: Sat, 23 Jan 2016 07:17:34 +0000 Subject: [PATCH] added DAO parsing, fix #14 --- aprslib/parsing/common.py | 33 ++++++++++++++++++++++++++++----- aprslib/parsing/mice.py | 4 +++- aprslib/parsing/position.py | 3 +-- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/aprslib/parsing/common.py b/aprslib/parsing/common.py index be26a2a..b4f85ef 100644 --- a/aprslib/parsing/common.py +++ b/aprslib/parsing/common.py @@ -127,8 +127,7 @@ def _parse_timestamp(body, packet_type=''): return (body, parsed) -def _parse_comment(body): - parsed = {} +def _parse_comment(body, parsed): # attempt to parse remaining part of the packet (comment field) # try CRS/SPD match = re.findall(r"^([0-9]{3})/([0-9]{3})", body) @@ -163,17 +162,41 @@ def _parse_comment(body): match = re.findall(r"^(.*?)/A=(\-\d{5}|\d{6})(.*)$", body) if match: - body, altitude, post = match[0] - body += post # glue front and back part together, DONT ASK + body, altitude, rest = match[0] + body += rest parsed.update({'altitude': int(altitude)*0.3048}) body, telemetry = _parse_comment_telemetry(body) parsed.update(telemetry) + # parse DAO extention + body = _parse_dao(body, parsed) + if len(body) > 0 and body[0] == "/": body = body[1:] parsed.update({'comment': body.strip(' ')}) - return ('', parsed) + +def _parse_dao(body, parsed): + match = re.findall("^(.*)\!([\x21-\x7b][\x20-\x7b]{2})\!(.*?)$", body) + if match: + body, dao, rest = match[0] + body += rest + + parsed.update({'daodatumbyte': dao[0].upper()}) + + lat_offset = lon_offset = 0 + + if re.match("^[A-Z]", dao): + lat_offset = int(dao[1]) * 0.001 / 60 + lon_offset = int(dao[2]) * 0.001 / 60 + elif re.match("^[a-z]", dao): + lat_offset = base91.to_decimal(dao[1]) / 91.0 * 0.01 / 60 + lon_offset = base91.to_decimal(dao[2]) / 91.0 * 0.01 / 60 + + parsed['latitude'] += lat_offset if parsed['latitude'] >= 0 else -lat_offset + parsed['longitude'] += lon_offset if parsed['longitude'] >= 0 else -lon_offset + + return body diff --git a/aprslib/parsing/mice.py b/aprslib/parsing/mice.py index 8a84667..5b7236c 100644 --- a/aprslib/parsing/mice.py +++ b/aprslib/parsing/mice.py @@ -2,6 +2,7 @@ import re import math from aprslib import base91 from aprslib.exceptions import ParseError +from aprslib.parsing.common import _parse_dao from aprslib.parsing.telemetry import _parse_comment_telemetry __all__ = [ @@ -210,7 +211,8 @@ def _parse_mice(dstcall, body): body, telemetry = _parse_comment_telemetry(body) parsed.update(telemetry) - #TODO !DAO! parsing + # parse DAO extention + body = _parse_dao(body, parsed) # rest is a comment parsed.update({'comment': body.strip(' ')}) diff --git a/aprslib/parsing/position.py b/aprslib/parsing/position.py index 439bc6b..bb08f32 100644 --- a/aprslib/parsing/position.py +++ b/aprslib/parsing/position.py @@ -68,8 +68,7 @@ def _parse_position(packet_type, body): }) else: # decode comment - body, result = _parse_comment(body) - parsed.update(result) + _parse_comment(body, parsed) if packet_type == ';': parsed.update({