Source code for larpix.packet.message_packet

from bitarray import bitarray
import struct

from .. import bitarrayhelper as bah
from ..key import Key

[docs]class MessagePacket(object): ''' A packet-like object which contains a string message and timestamp. :param message: a string message of length less than 64 :param timestamp: the timestamp of the message ''' size=72 chip_key = None def __init__(self, message, timestamp): self.packet_type = 5 self.message = message self.timestamp = timestamp def __str__(self): return '[ Message: %s | Timestamp: %d ]' % (self.message, self.timestamp) def __repr__(self): return 'MessagePacket(%s, %d)' % (repr(self.message), self.timestamp) def __eq__(self, other): return (self.message == other.message and self.timestamp == other.timestamp) def __ne__(self, other): return not (self == other) def export(self): return { 'type_str': 'message', 'type': self.packet_type, 'message': self.message, 'timestamp': self.timestamp, 'bits': self.bits.to01(), }
[docs] def from_dict(self, d): ''' Inverse of export - modify packet based on dict ''' if 'type' in d and d['type'] != self.packet_type: raise ValueError('invalid packet type for MessagePacket') for key, value in d.items(): if key == 'type': self.packet_type = value elif key == 'type_str': continue elif key == 'bits': self.bits = bitarray(value) else: setattr(self, key, value)
@property def bits(self): b = bitarray() b.frombytes(self.bytes()) return b @bits.setter def bits(self, value): value_bytes = value.tobytes() message_bytes = value_bytes[:64] timestamp_bytes = value_bytes[64:] self.message = message_bytes[:message_bytes.find(b'\x00')].decode() self.timestamp = struct.unpack('Q', timestamp_bytes)[0] def bytes(self): return (self.message.ljust(64, '\x00').encode() + struct.pack('Q', self.timestamp))