def parse_status(packet_type, body): body, result = parse_timestamp(body, packet_type) result.update({ 'format': 'status', 'status': body.strip(' ') }) return (body, result)
def parse_position(packet_type, body): parsed = {} if packet_type not in '!=/@;': _, body = body.split('!', 1) packet_type = '!' if packet_type == ';': logger.debug("Attempting to parse object report format") match = re.findall(r"^([ -~]{9})(\*|_)", body) if match: name, flag = match[0] parsed.update({ 'object_name': name, 'alive': flag == '*', }) body = body[10:] else: raise ParseError("invalid format") else: parsed.update({"messagecapable": packet_type in '@='}) # decode timestamp if packet_type in "/@;": body, result = parse_timestamp(body, packet_type) parsed.update(result) if len(body) == 0 and 'timestamp' in parsed: raise ParseError("invalid position report format", packet) # decode body body, result = parse_compressed(body) parsed.update(result) if len(result) > 0: logger.debug("Parsed as compressed position report") else: body, result = parse_normal(body) parsed.update(result) if len(result) > 0: logger.debug("Parsed as normal position report") else: raise ParseError("invalid format") # check comment for weather information # Page 62 of the spec if parsed['symbol'] == '_': logger.debug("Attempting to parse weather report from comment") body, result = parse_weather_data(body) parsed.update({ 'comment': body.strip(' '), 'weather': result, }) else: # decode comment parse_comment(body, parsed) if packet_type == ';': parsed.update({ 'object_format': parsed['format'], 'format': 'object', }) return ('', parsed)
def parse_status(packet_type, body): body, result = parse_timestamp(body, packet_type) result.update({'format': 'status', 'status': body.strip(' ')}) return (body, result)
def parse_position(packet_type, body): parsed = {} if packet_type not in '!=/@;': _, body = body.split('!', 1) packet_type = '!' if packet_type == ';': logger.debug("Attempting to parse object report format") match = re.findall(r"^([ -~]{9})(\*|_)", body) if match: name, flag = match[0] parsed.update({ 'object_name': name, 'alive': flag == '*', }) body = body[10:] else: raise ParseError("invalid format") else: parsed.update({"messagecapable": packet_type in '@='}) # decode timestamp if packet_type in "/@;": body, result = parse_timestamp(body, packet_type) parsed.update(result) if len(body) == 0 and 'timestamp' in parsed: raise ParseError("invalid position report format") # decode body body, result = parse_compressed(body) parsed.update(result) if len(result) > 0: logger.debug("Parsed as compressed position report") else: body, result = parse_normal(body) parsed.update(result) if len(result) > 0: logger.debug("Parsed as normal position report") else: raise ParseError("invalid format") # check comment for weather information # Page 62 of the spec if parsed['symbol'] == '_': logger.debug("Attempting to parse weather report from comment") body, result = parse_weather_data(body) parsed.update({ 'comment': body.strip(' '), 'weather': result, }) else: # decode comment parse_comment(body, parsed) if packet_type == ';': parsed.update({ 'object_format': parsed['format'], 'format': 'object', }) return ('', parsed)