From 041f09896ab095ce1d36f2f40e7280e9cac1bab3 Mon Sep 17 00:00:00 2001 From: Matt Way Date: Sat, 9 Dec 2023 09:57:11 +1100 Subject: [PATCH] Use PacketCRC helper --- HDPacketBuilder.h | 27 +++++-------------------- PacketCRC.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++ PacketCRC.h | 18 +++++++++++++++++ 3 files changed, 74 insertions(+), 22 deletions(-) create mode 100644 PacketCRC.cpp create mode 100644 PacketCRC.h diff --git a/HDPacketBuilder.h b/HDPacketBuilder.h index 695bbf8..d1e2360 100644 --- a/HDPacketBuilder.h +++ b/HDPacketBuilder.h @@ -1,4 +1,4 @@ -#include +#include "PacketCRC.h" #define LENGTH_17 (0x11) #define LENGTH_21 (0x15) @@ -15,7 +15,7 @@ uint8_t rollingCode2 = 0x82; uint8_t buf[32]; -CRC16 crc(0x755B, 0x0, 0xBA68, false, false); +PacketCRC packetCRC; void setPacketLength(uint8_t); void setConstants(); @@ -140,26 +140,9 @@ void setProtocolVersion(uint8_t version) { } void calculateCRC() { // must be called after the buffer has been filled - crc.restart(); - uint8_t length = buf[0]; - switch(length) { - case 0x11: - crc.setXorOut(0xBA68); - break; - case 0x15: - crc.setXorOut(0xE10C); - break; - case 0x19: - crc.setXorOut(0x89A0); - break; - default: - Serial.print("Unsupported length ("); - Serial.print(length); - Serial.println("). Cannot calculate CRC"); - return; - } - crc.add(buf, length + 1); - uint16_t result = crc.calc(); + uint8_t length = buf[1]; + uint16_t result = packetCRC.calculate(buf); + uint8_t checksum1 = (uint8_t)((result & 0xFF00) >> 8); uint8_t checksum2 = (uint8_t)(result & 0x00FF); diff --git a/PacketCRC.cpp b/PacketCRC.cpp new file mode 100644 index 0000000..e3ef255 --- /dev/null +++ b/PacketCRC.cpp @@ -0,0 +1,51 @@ +#include "PacketCRC.h" + +PacketCRC::PacketCRC() : crc(CRC16(0x755B, 0x0, 0xBA68, false, false)) { + // Constructor implementation (if needed) +} + +PacketCRC::~PacketCRC() { + // Destructor implementation (if needed) +} + +bool PacketCRC::check(const uint8_t* packet) { + uint8_t length = packet[1]; + switch(length) { + case 0x11: + case 0x15: + case 0x19: + break; + default: + return false; + } + + uint16_t result = calculate(packet); + uint8_t checksum1 = (uint8_t)((result & 0xFF00) >> 8); + uint8_t checksum2 = (uint8_t)(result & 0x00FF); + + if (packet[length + 2] == checksum1 && packet[length + 3] == checksum2) { + return true; + } + + return false; +} + +uint16_t PacketCRC::calculate(const uint8_t* packet) { + crc.restart(); + uint8_t length = packet[1]; + switch(length) { + case 0x11: + crc.setXorOut(0x539E); + break; + case 0x15: + crc.setXorOut(0x3B0E); + break; + case 0x19: + crc.setXorOut(0x5C02); + break; + default: + return 0x0000; + } + crc.add(packet, length + 2); + return crc.calc(); +} \ No newline at end of file diff --git a/PacketCRC.h b/PacketCRC.h new file mode 100644 index 0000000..e5d5512 --- /dev/null +++ b/PacketCRC.h @@ -0,0 +1,18 @@ +#ifndef PACKET_CRC_H +#define PACKET_CRC_H + +#include + +class PacketCRC { +public: + PacketCRC(); + ~PacketCRC(); + + // Method to calculate CRC for a packet + bool check(const uint8_t* packet); + uint16_t calculate(const uint8_t* packet); +private: + CRC16 crc; +}; + +#endif // PACKET_CRC_H \ No newline at end of file