Use PacketCRC helper
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
#include <CRC16.h>
|
#include "PacketCRC.h"
|
||||||
|
|
||||||
#define LENGTH_17 (0x11)
|
#define LENGTH_17 (0x11)
|
||||||
#define LENGTH_21 (0x15)
|
#define LENGTH_21 (0x15)
|
||||||
@@ -15,7 +15,7 @@ uint8_t rollingCode2 = 0x82;
|
|||||||
|
|
||||||
uint8_t buf[32];
|
uint8_t buf[32];
|
||||||
|
|
||||||
CRC16 crc(0x755B, 0x0, 0xBA68, false, false);
|
PacketCRC packetCRC;
|
||||||
|
|
||||||
void setPacketLength(uint8_t);
|
void setPacketLength(uint8_t);
|
||||||
void setConstants();
|
void setConstants();
|
||||||
@@ -140,26 +140,9 @@ void setProtocolVersion(uint8_t version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void calculateCRC() { // must be called after the buffer has been filled
|
void calculateCRC() { // must be called after the buffer has been filled
|
||||||
crc.restart();
|
uint8_t length = buf[1];
|
||||||
uint8_t length = buf[0];
|
uint16_t result = packetCRC.calculate(buf);
|
||||||
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 checksum1 = (uint8_t)((result & 0xFF00) >> 8);
|
uint8_t checksum1 = (uint8_t)((result & 0xFF00) >> 8);
|
||||||
uint8_t checksum2 = (uint8_t)(result & 0x00FF);
|
uint8_t checksum2 = (uint8_t)(result & 0x00FF);
|
||||||
|
|
||||||
|
|||||||
51
PacketCRC.cpp
Normal file
51
PacketCRC.cpp
Normal file
@@ -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();
|
||||||
|
}
|
||||||
18
PacketCRC.h
Normal file
18
PacketCRC.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef PACKET_CRC_H
|
||||||
|
#define PACKET_CRC_H
|
||||||
|
|
||||||
|
#include <CRC16.h>
|
||||||
|
|
||||||
|
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
|
||||||
Reference in New Issue
Block a user