#if !defined(CRC_BIGTABLES)
#define CRC_BIGTABLES 1
#endif
#if !defined(FastCRC_h)
#define FastCRC_h
#if defined(ARDUINO)
#include <Arduino.h>
#endif
#include <inttypes.h>
#include <cstddef>
#if defined(KINETISK)
#define CRC_SW 0
#define CRC_FLAG_NOREFLECT (((1<<31) | (1<<30)) | ((0<<29) | (0<<28)))
#define CRC_FLAG_REFLECT (((1<<31) | (0<<30)) | ((1<<29) | (0<<28)))
#define CRC_FLAG_XOR (1<<26)
#define CRC_FLAG_NOREFLECT_8 (0)
#define CRC_FLAG_REFLECT_SWAP (((1<<31) | (0<<30)) | ((0<<29) | (1<<28)))
#else
#define CRC_SW 1
#endif
class FastCRC7
{
public:
FastCRC7();
uint8_t crc7(const uint8_t *data, const size_t datalen); uint8_t crc7_upd(const uint8_t *data, const size_t datalen); #if !CRC_SW
uint8_t generic(const uint8_t polyom, const uint8_t seed, const uint32_t flags, const uint8_t *data, const size_t datalen); #endif
private:
#if CRC_SW
uint8_t seed;
#else
uint8_t update(const uint8_t *data, const size_t datalen);
#endif
};
class FastCRC8
{
public:
FastCRC8();
uint8_t smbus(const uint8_t *data, const size_t datalen); uint8_t maxim(const uint8_t *data, const size_t datalen);
uint8_t smbus_upd(const uint8_t *data, size_t datalen); uint8_t maxim_upd(const uint8_t *data, size_t datalen); #if !CRC_SW
uint8_t generic(const uint8_t polyom, const uint8_t seed, const uint32_t flags, const uint8_t *data, const size_t datalen); #endif
private:
#if CRC_SW
uint8_t seed;
#else
uint8_t update(const uint8_t *data, const size_t datalen);
#endif
};
class FastCRC14
{
public:
#if !CRC_SW
FastCRC14();
uint16_t darc(const uint8_t *data, const size_t datalen);
uint16_t gsm(const uint8_t *data, const size_t datalen);
uint16_t eloran(const uint8_t *data, const size_t datalen);
uint16_t ft4(const uint8_t *data, const size_t datalen);
uint16_t darc_upd(const uint8_t *data, size_t len);
uint16_t gsm_upd(const uint8_t *data, size_t len);
uint16_t eloran_upd(const uint8_t *data, size_t len);
uint16_t ft4_upd(const uint8_t *data, size_t len);
#endif
#if !CRC_SW
uint16_t generic(const uint16_t polyom, const uint16_t seed, const uint32_t flags, const uint8_t *data, const size_t datalen); #endif
private:
#if CRC_SW
uint16_t seed;
#else
uint16_t update(const uint8_t *data, const size_t datalen);
#endif
};
class FastCRC16
{
public:
FastCRC16();
uint16_t ccitt(const uint8_t *data, const size_t datalen); uint16_t mcrf4xx(const uint8_t *data,const size_t datalen); uint16_t kermit(const uint8_t *data, const size_t datalen); uint16_t modbus(const uint8_t *data, const size_t datalen); uint16_t xmodem(const uint8_t *data, const size_t datalen); uint16_t x25(const uint8_t *data, const size_t datalen);
uint16_t ccitt_upd(const uint8_t *data, size_t len); uint16_t mcrf4xx_upd(const uint8_t *data, size_t len); uint16_t kermit_upd(const uint8_t *data, size_t len); uint16_t modbus_upd(const uint8_t *data, size_t len); uint16_t xmodem_upd(const uint8_t *data, size_t len); uint16_t x25_upd(const uint8_t *data, size_t len); #if !CRC_SW
uint16_t generic(const uint16_t polyom, const uint16_t seed, const uint32_t flags, const uint8_t *data, const size_t datalen); #endif
private:
#if CRC_SW
uint16_t seed;
#else
uint16_t update(const uint8_t *data, const size_t datalen);
#endif
};
class FastCRC32
{
public:
FastCRC32();
uint32_t crc32(const uint8_t *data, const size_t datalen); uint32_t cksum(const uint8_t *data, const size_t datalen);
uint32_t crc32_upd(const uint8_t *data, size_t len); uint32_t cksum_upd(const uint8_t *data, size_t len); #if !CRC_SW
uint32_t generic(const uint32_t polyom, const uint32_t seed, const uint32_t flags, const uint8_t *data, const size_t datalen); #endif
private:
#if CRC_SW
uint32_t seed;
#else
uint32_t update(const uint8_t *data, const size_t datalen);
#endif
};
#endif