Add const fields to type representations

This commit is contained in:
Marko Durkovic
2021-08-01 17:38:18 +02:00
committed by Florian Friesdorf
parent fa57b16765
commit 03b4d7e5c7
12 changed files with 1573 additions and 907 deletions
+10 -8
View File
@@ -161,12 +161,13 @@ def deserialize_message(rawdata: bytes, bmap: BasetypeMap, pos: int, msgdef: Msg
values.append(num)
elif desc.valtype == Valtype.ARRAY:
arr, pos = deserialize_array(rawdata, bmap, pos, *desc.args)
subdesc, length = desc.args
arr, pos = deserialize_array(rawdata, bmap, pos, length, subdesc)
values.append(arr)
elif desc.valtype == Valtype.SEQUENCE:
size, pos = deserialize_number(rawdata, bmap, pos, 'int32')
arr, pos = deserialize_array(rawdata, bmap, pos, int(size), desc.args)
arr, pos = deserialize_array(rawdata, bmap, pos, int(size), desc.args[0])
values.append(arr)
return msgdef.cls(*values), pos
@@ -323,12 +324,12 @@ def serialize_message(
pos = serialize_number(rawdata, bmap, pos, desc.args, val)
elif desc.valtype == Valtype.ARRAY:
pos = serialize_array(rawdata, bmap, pos, desc.args[1], val)
pos = serialize_array(rawdata, bmap, pos, desc.args[0], val)
elif desc.valtype == Valtype.SEQUENCE:
size = len(val)
pos = serialize_number(rawdata, bmap, pos, 'int32', size)
pos = serialize_array(rawdata, bmap, pos, desc.args, val)
pos = serialize_array(rawdata, bmap, pos, desc.args[0], val)
return pos
@@ -397,14 +398,15 @@ def get_size(message: Any, msgdef: Msgdef, size: int = 0) -> int:
size += isize
elif desc.valtype == Valtype.ARRAY:
if len(val) != desc.args[0]:
raise SerdeError(f'Unexpected array length: {len(val)} != {desc.args[0]}.')
size = get_array_size(desc.args[1], val, size)
subdesc, length = desc.args
if len(val) != length:
raise SerdeError(f'Unexpected array length: {len(val)} != {length}.')
size = get_array_size(subdesc, val, size)
elif desc.valtype == Valtype.SEQUENCE:
size = (size + 4 - 1) & -4
size += 4
size = get_array_size(desc.args, val, size)
size = get_array_size(desc.args[0], val, size)
return size
+44 -33
View File
@@ -35,6 +35,7 @@ time time
================================================================================
MSG: test_msgs/Other
uint64[3] Header
uint32 static = 42
"""
RELSIBLING_MSG = """
@@ -81,6 +82,11 @@ module test_msgs {
typedef test_msgs::msg::Bar Bar;
typedef double d4[4];
module Foo_Constants {
const int32 FOO = 32;
const int64 BAR = 64;
};
@comment(type="text", text="ignore")
struct Foo {
std_msgs::msg::Header header;
@@ -102,17 +108,18 @@ def test_parse_msg():
get_types_from_msg('', 'test_msgs/msg/Foo')
ret = get_types_from_msg(MSG, 'test_msgs/msg/Foo')
assert 'test_msgs/msg/Foo' in ret
fields = ret['test_msgs/msg/Foo']
assert fields[0][0][1] == 'std_msgs/msg/Header'
assert fields[0][1][1] == 'header'
assert fields[1][0][1] == 'std_msgs/msg/Bool'
assert fields[1][1][1] == 'bool'
assert fields[2][0][1] == 'test_msgs/msg/Bar'
assert fields[2][1][1] == 'sibling'
assert fields[3][0][0] == Nodetype.BASE
assert fields[4][0][0] == Nodetype.SEQUENCE
assert fields[5][0][0] == Nodetype.SEQUENCE
assert fields[6][0][0] == Nodetype.ARRAY
consts, fields = ret['test_msgs/msg/Foo']
assert consts == [('global', 'int32', 42)]
assert fields[0][0] == 'header'
assert fields[0][1][1] == 'std_msgs/msg/Header'
assert fields[1][0] == 'bool'
assert fields[1][1][1] == 'std_msgs/msg/Bool'
assert fields[2][0] == 'sibling'
assert fields[2][1][1] == 'test_msgs/msg/Bar'
assert fields[3][1][0] == Nodetype.BASE
assert fields[4][1][0] == Nodetype.SEQUENCE
assert fields[5][1][0] == Nodetype.SEQUENCE
assert fields[6][1][0] == Nodetype.ARRAY
def test_parse_multi_msg():
@@ -122,20 +129,23 @@ def test_parse_multi_msg():
assert 'test_msgs/msg/Foo' in ret
assert 'std_msgs/msg/Header' in ret
assert 'test_msgs/msg/Other' in ret
assert ret['test_msgs/msg/Foo'][0][0][1] == 'std_msgs/msg/Header'
assert ret['test_msgs/msg/Foo'][1][0][1] == 'uint8'
assert ret['test_msgs/msg/Foo'][2][0][1] == 'uint8'
fields = ret['test_msgs/msg/Foo'][1]
assert fields[0][1][1] == 'std_msgs/msg/Header'
assert fields[1][1][1] == 'uint8'
assert fields[2][1][1] == 'uint8'
consts = ret['test_msgs/msg/Other'][0]
assert consts == [('static', 'uint32', 42)]
def test_parse_relative_siblings_msg():
"""Test relative siblings with msg parser."""
ret = get_types_from_msg(RELSIBLING_MSG, 'test_msgs/msg/Foo')
assert ret['test_msgs/msg/Foo'][0][0][1] == 'std_msgs/msg/Header'
assert ret['test_msgs/msg/Foo'][1][0][1] == 'test_msgs/msg/Other'
assert ret['test_msgs/msg/Foo'][1][0][1][1] == 'std_msgs/msg/Header'
assert ret['test_msgs/msg/Foo'][1][1][1][1] == 'test_msgs/msg/Other'
ret = get_types_from_msg(RELSIBLING_MSG, 'rel_msgs/msg/Foo')
assert ret['rel_msgs/msg/Foo'][0][0][1] == 'std_msgs/msg/Header'
assert ret['rel_msgs/msg/Foo'][1][0][1] == 'rel_msgs/msg/Other'
assert ret['rel_msgs/msg/Foo'][1][0][1][1] == 'std_msgs/msg/Header'
assert ret['rel_msgs/msg/Foo'][1][1][1][1] == 'rel_msgs/msg/Other'
def test_parse_idl():
@@ -145,28 +155,29 @@ def test_parse_idl():
ret = get_types_from_idl(IDL)
assert 'test_msgs/msg/Foo' in ret
fields = ret['test_msgs/msg/Foo']
assert fields[0][0][1] == 'std_msgs/msg/Header'
assert fields[0][1][1] == 'header'
assert fields[1][0][1] == 'std_msgs/msg/Bool'
assert fields[1][1][1] == 'bool'
assert fields[2][0][1] == 'test_msgs/msg/Bar'
assert fields[2][1][1] == 'sibling'
assert fields[3][0][0] == Nodetype.BASE
assert fields[4][0][0] == Nodetype.SEQUENCE
assert fields[5][0][0] == Nodetype.SEQUENCE
assert fields[6][0][0] == Nodetype.ARRAY
consts, fields = ret['test_msgs/msg/Foo']
assert consts == [('FOO', 'int32', 32), ('BAR', 'int64', 64)]
assert fields[0][0] == 'header'
assert fields[0][1][1] == 'std_msgs/msg/Header'
assert fields[1][0] == 'bool'
assert fields[1][1][1] == 'std_msgs/msg/Bool'
assert fields[2][0] == 'sibling'
assert fields[2][1][1] == 'test_msgs/msg/Bar'
assert fields[3][1][0] == Nodetype.BASE
assert fields[4][1][0] == Nodetype.SEQUENCE
assert fields[5][1][0] == Nodetype.SEQUENCE
assert fields[6][1][0] == Nodetype.ARRAY
def test_register_types():
"""Test type registeration."""
assert 'foo' not in FIELDDEFS
register_types({})
register_types({'foo': [[(1, 'bool'), (2, 'b')]]})
register_types({'foo': [[], [('b', (1, 'bool'))]]})
assert 'foo' in FIELDDEFS
register_types({'std_msgs/msg/Header': []})
assert len(FIELDDEFS['std_msgs/msg/Header']) == 2
register_types({'std_msgs/msg/Header': [[], []]})
assert len(FIELDDEFS['std_msgs/msg/Header'][1]) == 2
with pytest.raises(TypesysError, match='different definition'):
register_types({'foo': [[(1, 'bool'), (2, 'x')]]})
register_types({'foo': [[], [('x', (1, 'bool'))]]})