def _validate(cls, message: bytes, header: bytes, length: int) -> base.Message: # consistency check: bug in message singnature assert len(header) == 5, f"wrong header length {len(header)}" assert header[:2] == b"\x7E\x00", f"wrong header start {header!r}" assert length in [7, 47], f"wrong payload length {length} != 4||47" len_payload = header[-1] assert length == len_payload + 7, f"wrong payload length {length} != {len_payload+7}" # validate message: recoverable errors (throw away observation) msg = cls(message) if msg.header != header: raise WrongMessageFormat(f"message header: {msg.header!r}") if msg.tail != 0x7E: raise WrongMessageFormat(f"message tail: {msg.tail:#x}") if len(message) != length: raise WrongMessageFormat( f"message length: {len(message)} != {length}") checksum = 0xFF - (sum(msg.header[1:]) + sum(msg.payload)) % 0x100 if msg.checksum != checksum: raise WrongMessageChecksum( f"message checksum {msg.checksum} != {checksum}") if sum(msg.payload) == 0: raise SensorWarmingUp(f"message empty: warming up sensor") return msg
def decode(cls, message: bytes, command: base.Cmd) -> Tuple[float, ...]: # decode ACK message if command.answer_header == b"\xA5\xA5" and command.answer_length == 2: if not message.endswith(command.answer_header): raise WrongMessageFormat("message does not end in ACK") return tuple() return super().decode(message, command)
def _validate(cls, message: bytes, header: bytes, length: int) -> base.Message: # consistency check: bug in message singnature assert len(header) == 3, f"wrong header length {len(header)}" assert header[:1] == b"\x40", f"wrong header start {header!r}" assert length in [8, 16], f"wrong payload length {length}" # validate message: recoverable errors (throw away observation) msg = cls(message) if msg.header != header: raise WrongMessageFormat(f"message header: {msg.header!r}") if len(message) != length: raise WrongMessageFormat(f"message length: {len(message)} != {length}") checksum = (0x10000 - sum(msg.header) - sum(msg.payload)) % 0x100 if msg.checksum != checksum: raise WrongMessageChecksum(f"message checksum {msg.checksum} != {checksum}") if sum(msg.payload) == 0: raise SensorWarmingUp(f"message empty: warming up sensor") return msg
def _validate(cls, message: bytes, header: bytes, length: int) -> base.Message: # consistency check: bug in message singnature assert len(header) == 2, f"wrong header length {len(header)}" # validate message: recoverable errors (throw away observation) msg = cls(message) if msg.header != header: raise WrongMessageFormat(f"message header: {msg.header!r}") if len(message) != length: raise WrongMessageFormat(f"message length: {len(message)}") checksum = message[-1] if msg.checksum != checksum: raise WrongMessageChecksum( f"message checksum 0x{msg.checksum:02X} != 0x{checksum:02X}") if sum(msg.payload) == 0: raise SensorWarmingUp(f"message empty: warming up sensor") return msg
def _validate(cls, message: bytes, header: bytes, length: int) -> base.Message: # consistency check: bug in message singnature assert len(header) == 4, f"wrong header length {len(header)}" assert header[:2] == b"BM", f"wrong header start {header!r}" len_payload = cls._unpack(header[-2:])[0] assert length == 4 + len_payload, f"wrong payload length {length} != {4+len_payload}" # validate message: recoverable errors (throw away observation) msg = cls(message) if msg.header != header: raise WrongMessageFormat(f"message header: {msg.header!r}") if len(message) != length: raise WrongMessageFormat(f"message length: {len(message)}") checksum = sum(msg.header) + sum(msg.payload) if msg.checksum != checksum: raise WrongMessageChecksum(f"message checksum {msg.checksum} != {checksum}") if sum(msg.payload) == 0: raise SensorWarmingUp(f"message empty: warming up sensor") return msg