diff --git a/lib/AmsDecoder/include/crc.h b/lib/AmsDecoder/include/crc.h index 2a29070a..4a2c84d1 100644 --- a/lib/AmsDecoder/include/crc.h +++ b/lib/AmsDecoder/include/crc.h @@ -12,6 +12,6 @@ uint16_t crc16(const uint8_t* p, int len); uint16_t crc16_x25(const uint8_t* p, int len); -uint16_t crc16_ccit(const uint8_t* p, int len); +uint16_t crc16_1021(const uint8_t* p, int len); #endif diff --git a/lib/AmsDecoder/src/crc.cpp b/lib/AmsDecoder/src/crc.cpp index 2626cf32..52825c1e 100644 --- a/lib/AmsDecoder/src/crc.cpp +++ b/lib/AmsDecoder/src/crc.cpp @@ -34,20 +34,23 @@ uint16_t crc16 (const uint8_t *p, int len) { return crc; } -uint16_t crc16_ccit(const uint8_t *p, int len) +uint16_t crc16_1021(const uint8_t *p, int len) { - int crc; - char i; - crc = 0; - while (len--) { - uint8_t i; - crc = crc ^ (uint8_t) *p++ << 8; - for (i = 0 ; i < 8 ; ++i) { - if (crc & 0x8000) - crc = crc << 1 ^ 0x1021; - else - crc = crc << 1; + uint16_t crc = 0x0000; + for(uint16_t i = 0; i < len; i++) { + uint16_t mask = 0x80; + while(mask > 0) { + crc <<= 1; + if (p[i] & mask) { + crc |= 1; + } + mask>>=1; + if (crc & 0x10000) { + crc &= 0xffff; + crc ^= 0x1021; + } } - } - return (crc); + } + return crc; + }