47 lines
883 B
C++
47 lines
883 B
C++
#include "hdlcCrc.h"
|
|
|
|
HdlcCrc::HdlcCrc(HdlcCrcTable* crcTable) {
|
|
_crcTable = crcTable;
|
|
}
|
|
|
|
void HdlcCrc::resetFcs() {
|
|
_fcs = CRC_RESET_VAL;
|
|
_calcFcs[0] = _calcFcs[1];
|
|
_calcFcs[1] = _fcs;
|
|
_count = 0;
|
|
}
|
|
|
|
void HdlcCrc::calcFcs(byte newByte) {
|
|
_fcs = (_fcs >> 8) ^ _crcTable->getValue((_fcs ^ newByte) & 0xff);
|
|
_rxFcs[0] = _rxFcs[1];
|
|
_rxFcs[1] = newByte;
|
|
_calcFcs[0] = _calcFcs[1];
|
|
_calcFcs[1] = _calcFcs[2];
|
|
_calcFcs[2] = _fcs;
|
|
_count++;
|
|
}
|
|
|
|
byte HdlcCrc::getFcsL() {
|
|
return (_fcs & 0xff) ^ 0xff;
|
|
}
|
|
|
|
byte HdlcCrc::getFcsH() {
|
|
return (_fcs >> 8) ^ 0xff;
|
|
}
|
|
|
|
boolean HdlcCrc::checkFcs() {
|
|
boolean result = false;
|
|
byte calcFcsL = (_calcFcs[0] & 0xff) ^ 0xff;
|
|
byte calcFcsH = (_calcFcs[0] >> 8) ^ 0xff;
|
|
|
|
if (_count > 2) {
|
|
if (_rxFcs[0] == calcFcsL) {
|
|
if (_rxFcs[1] == calcFcsH) {
|
|
result = true;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|