X-Git-Url: https://code.kerkeslager.com/?p=sandbox;a=blobdiff_plain;f=serial%2Fbinary.py;h=f6bcff7da4ee200cc72aee7dee2ef48a806d4c2d;hp=e8c9093d71f29cad1d2445a4b63ffba6b3c689f7;hb=3012060e0d2b5a98805a7c5bb6ef3c60d31f2c4e;hpb=e7e157bf8ed9f207921a22c74382bb1c500a57f7 diff --git a/serial/binary.py b/serial/binary.py index e8c9093..f6bcff7 100644 --- a/serial/binary.py +++ b/serial/binary.py @@ -1,9 +1,15 @@ import collections +import functools import io +import struct TAG_NULL = 0x00 TAG_TRUE = 0x01 TAG_FALSE = 0x02 +TAG_UINT8 = 0x03 +TAG_UINT16 = 0x04 +TAG_UINT32 = 0x05 +TAG_UINT64 = 0x06 TaggedObject = collections.namedtuple( 'TaggedObject', @@ -22,10 +28,23 @@ def _make_tag_only_serializer(tag, expected_value): return serializer +def _make_struct_serializer(fmt): + fmt = '!B' + fmt + packer = functools.partial(struct.pack, fmt) + + def serializer(to): + return packer(to.tag, to.instance) + + return serializer + _TAGS_TO_SERIALIZERS = { TAG_NULL: _make_tag_only_serializer(TAG_NULL, None), TAG_TRUE: _make_tag_only_serializer(TAG_TRUE, True), TAG_FALSE: _make_tag_only_serializer(TAG_FALSE, False), + TAG_UINT8: _make_struct_serializer('B'), + TAG_UINT16: _make_struct_serializer('H'), + TAG_UINT32: _make_struct_serializer('I'), + TAG_UINT64: _make_struct_serializer('Q'), } def serialize(to):