def getPacket(self): """ Adds start token, header and CRC to payload. Escapes bytes. """ # Construct the packet for CRC calculation packet = [] packet.append(self.protocolMajor) packet.append(self.protocolMinor) packet.append(int(self.messageType)) packet += self.payload # Calculate the CRC of the packet packetCrc = crc16ccitt(packet) # Append the CRC to the base packet to escape the entire thing packet += Conversion.uint16_to_uint8_array(packetCrc) # Prepend the size field. sizeField = len(packet) packet = Conversion.uint16_to_uint8_array(sizeField) + packet # Escape everything except the start token packet = self.escapeCharacters(packet) # Prepend the start token. packet = [START_TOKEN] + packet return packet
def process(self): """ Process a buffer. Check CRC, and emit a uart packet. Buffer starts after size header, and includes wrapper header and tail (CRC). Return: processing success """ # Check size bufferSize = len(self.buffer) wrapperSize = WRAPPER_HEADER_SIZE + CRC_SIZE if bufferSize < wrapperSize: _LOGGER.warning("Buffer too small") return False # Get the buffer between size field and CRC: baseBuffer = self.buffer[0 : bufferSize - CRC_SIZE] # Check CRC calculatedCrc = crc16ccitt(baseBuffer) sourceCrc = Conversion.uint8_array_to_uint16(self.buffer[bufferSize - CRC_SIZE : ]) if calculatedCrc != sourceCrc: _LOGGER.warning("Failed CRC: {0} != {1} (data: {2})".format(calculatedCrc, sourceCrc, baseBuffer)) UartEventBus.emit(DevTopics.uartNoise, "crc mismatch") return False wrapperPacket = UartWrapperPacket() if wrapperPacket.parse(baseBuffer): UartEventBus.emit(SystemTopics.uartNewPackage, wrapperPacket) return True
def filterhash(self): """ Flatten the filter settings and the uint16 array of fingerprints to a uint8 array in little endian and return a crc16 of the result. Must match firmware. returns: FingerprintType """ return crc16ccitt(self.serialize())
def process(self): """ Process a buffer. Check CRC, and emit a uart packet. Buffer starts after size header, and includes wrapper header and tail (CRC). """ # Check size bufferSize = len(self.buffer) wrapperSize = WRAPPER_HEADER_SIZE + CRC_SIZE if bufferSize < wrapperSize: _LOGGER.warning("Buffer too small") UartEventBus.emit(DevTopics.uartNoise, "buffer too small") return # Get the buffer between size field and CRC: baseBuffer = self.buffer[0:bufferSize - CRC_SIZE] # Check CRC calculatedCrc = crc16ccitt(baseBuffer) sourceCrc = Conversion.uint8_array_to_uint16(self.buffer[bufferSize - CRC_SIZE:]) if calculatedCrc != sourceCrc: _LOGGER.warning("Failed CRC") _LOGGER.debug( f"Failed CRC: sourceCrc={sourceCrc} calculatedCrc={calculatedCrc} bufSize={len(self.buffer)} buffer={self.buffer}" ) UartEventBus.emit(DevTopics.uartNoise, "crc mismatch") return wrapperPacket = UartWrapperPacket() if wrapperPacket.parse(baseBuffer): UartEventBus.emit(SystemTopics.uartNewPackage, wrapperPacket)
def calculateChecksum(self): self.checksum = crc16ccitt(self.buffer) print(f"CRC: used: {hex(self.checksum)}")
def calculateChecksum(self): self.checksum = crc16ccitt(self.chunk) print(f"Chunk CRC: {hex(self.checksum)}")
def test_crc16_ccitt(): assert (crc16ccitt([1, 2, 3, 4, 5]) == 37636) assert (crc16ccitt([63, 63]) == 53016) assert (crc16ccitt([99, 51]) == 17734) assert (crc16ccitt([170, 251]) == 45518)
def hash_to_fingerprint(self, key): """ key: ByteArrayType returns: FingerprintType """ return crc16ccitt(key)