[CRC] Added common CRC
This commit is contained in:
parent
1c573bf598
commit
3b8218c397
3 changed files with 113 additions and 0 deletions
|
@ -110,6 +110,9 @@
|
||||||
#include "protocols/Print/Print.h"
|
#include "protocols/Print/Print.h"
|
||||||
#include "protocols/BellModem/BellModem.h"
|
#include "protocols/BellModem/BellModem.h"
|
||||||
|
|
||||||
|
// utilities
|
||||||
|
#include "utils/CRC.h"
|
||||||
|
|
||||||
// only create Radio class when using RadioShield
|
// only create Radio class when using RadioShield
|
||||||
#if defined(RADIOLIB_RADIOSHIELD)
|
#if defined(RADIOLIB_RADIOSHIELD)
|
||||||
|
|
||||||
|
|
39
src/utils/CRC.cpp
Normal file
39
src/utils/CRC.cpp
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#include "CRC.h"
|
||||||
|
|
||||||
|
RadioLibCRC::RadioLibCRC(uint8_t size, uint32_t poly, uint32_t init, uint32_t out, bool refIn, bool refOut) {
|
||||||
|
this->size = size;
|
||||||
|
this->poly = poly;
|
||||||
|
this->init = init;
|
||||||
|
this->out = out;
|
||||||
|
this->refIn = refIn;
|
||||||
|
this->refOut = refOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t RadioLibCRC::checksum(uint8_t* buff, size_t len) {
|
||||||
|
uint32_t crc = this->init;
|
||||||
|
for(size_t i = 0; i < len; i+=this->size/8) {
|
||||||
|
uint32_t window = 0;
|
||||||
|
for(uint8_t j = 0; j < this->size/8; j++) {
|
||||||
|
uint8_t inByte = buff[i + j];
|
||||||
|
if(this->refIn) {
|
||||||
|
inByte = Module::reflect(inByte, 8);
|
||||||
|
}
|
||||||
|
window |= (inByte << ((this->size - 8) - 8*j));
|
||||||
|
}
|
||||||
|
crc ^= window;
|
||||||
|
for(size_t k = 0; k < this->size; k++) {
|
||||||
|
if(crc & ((uint32_t)1 << (this->size - 1))) {
|
||||||
|
crc <<= (uint32_t)1;
|
||||||
|
crc ^= this->poly;
|
||||||
|
} else {
|
||||||
|
crc <<= (uint32_t)1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
crc ^= this->out;
|
||||||
|
if(this->refOut) {
|
||||||
|
crc = Module::reflect(crc, this->size);
|
||||||
|
}
|
||||||
|
crc &= (uint32_t)0xFFFFFFFF >> (32 - this->size);
|
||||||
|
return(crc);
|
||||||
|
}
|
71
src/utils/CRC.h
Normal file
71
src/utils/CRC.h
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#if !defined(_RADIOLIB_CRC_H)
|
||||||
|
#define _RADIOLIB_CRC_H
|
||||||
|
|
||||||
|
#include "../TypeDef.h"
|
||||||
|
#include "../Module.h"
|
||||||
|
#if defined(RADIOLIB_BUILD_ARDUINO)
|
||||||
|
#include "../ArduinoHal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// CCITT CRC properties (used by AX.25)
|
||||||
|
#define RADIOLIB_CRC_CCITT_POLY (0x1021)
|
||||||
|
#define RADIOLIB_CRC_CCITT_INIT (0xFFFF)
|
||||||
|
#define RADIOLIB_CRC_CCITT_OUT (0xFFFF)
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\class AX25Frame
|
||||||
|
\brief Abstraction of AX.25 frame format.
|
||||||
|
*/
|
||||||
|
class RadioLibCRC {
|
||||||
|
public:
|
||||||
|
/*!
|
||||||
|
\brief CRC size in bits.
|
||||||
|
*/
|
||||||
|
uint8_t size;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief CRC polynomial.
|
||||||
|
*/
|
||||||
|
uint32_t poly;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Initial value.
|
||||||
|
*/
|
||||||
|
uint32_t init;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Final XOR value.
|
||||||
|
*/
|
||||||
|
uint32_t out;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Whether to reflect input bytes.
|
||||||
|
*/
|
||||||
|
bool refIn;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Whether to reflect the result.
|
||||||
|
*/
|
||||||
|
bool refOut;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Default constructor.
|
||||||
|
\param size CRC size in bits.
|
||||||
|
\param poly CRC polynomial.
|
||||||
|
\param init Initial value.
|
||||||
|
\param out Final XOR value.
|
||||||
|
\param refIn Whether to reflect input bytes.
|
||||||
|
\param refOut Whether to reflect the result.
|
||||||
|
*/
|
||||||
|
RadioLibCRC(uint8_t size, uint32_t poly, uint32_t init, uint32_t out, bool refIn, bool refOut);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Calcualte checksum of a buffer.
|
||||||
|
\param buff Buffer to calculate the checksum over.
|
||||||
|
\param len Size of the buffer in bytes.
|
||||||
|
\returns The resulting checksum.
|
||||||
|
*/
|
||||||
|
uint32_t checksum(uint8_t* buff, size_t len);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Reference in a new issue