1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
# SPDX-FileCopyrightText: 2016 Ole Martin Bjorndalen <ombdalen@gmail.com>
#
# SPDX-License-Identifier: MIT
from .specs import SPEC_BY_TYPE, make_msgdict
def msg2str(msg, include_time=True):
type_ = msg['type']
spec = SPEC_BY_TYPE[type_]
words = [type_]
for name in spec['value_names']:
value = msg[name]
if name == 'data':
value = '({})'.format(','.join(str(byte) for byte in value))
words.append(f'{name}={value}')
if include_time:
words.append('time={}'.format(msg['time']))
return str.join(' ', words)
def _parse_time(value):
# Convert to int if possible.
try:
return int(value)
except ValueError:
pass
try:
return float(value)
except ValueError:
pass
raise ValueError(f'invalid time {value!r}')
def _parse_data(value):
if not value.startswith('(') and value.endswith(')'):
raise ValueError('missing parentheses in data message')
try:
return [int(byte) for byte in value[1:-1].split(',')]
except ValueError as ve:
raise ValueError('unable to parse data bytes') from ve
def str2msg(text):
"""Parse str format and return message dict.
No type or value checking is done. The caller is responsible for
calling check_msgdict().
"""
words = text.split()
type_ = words[0]
args = words[1:]
msg = {}
for arg in args:
name, value = arg.split('=', 1)
if name == 'time':
value = _parse_time(value)
elif name == 'data':
value = _parse_data(value)
else:
value = int(value)
msg[name] = value
return make_msgdict(type_, msg)
|