diff --git a/src/main/rx/fport.c b/src/main/rx/fport.c index 4b607373c4..59f62fe3f5 100644 --- a/src/main/rx/fport.c +++ b/src/main/rx/fport.c @@ -255,7 +255,7 @@ static uint8_t fportFrameStatus(rxRuntimeConfig_t *rxRuntimeConfig) if (frameLength != bufferLength - 2) { reportFrameError(DEBUG_FPORT_ERROR_SIZE); } else { - if (!frskyCheckSumIsGood(&rxBuffer[rxBufferReadIndex].data[0], bufferLength)) { + if (!frskyChecksumIsGood(&rxBuffer[rxBufferReadIndex].data[0], bufferLength)) { reportFrameError(DEBUG_FPORT_ERROR_CHECKSUM); } else { fportFrame_t *frame = (fportFrame_t *)&rxBuffer[rxBufferReadIndex].data[1]; diff --git a/src/main/rx/frsky_crc.c b/src/main/rx/frsky_crc.c index f001e0cc2f..fa3934e574 100644 --- a/src/main/rx/frsky_crc.c +++ b/src/main/rx/frsky_crc.c @@ -26,29 +26,22 @@ FILE_COMPILE_FOR_SPEED void frskyCheckSumStep(uint16_t *checksum, uint8_t byte) { *checksum += byte; + *checksum += (*checksum >> 8); + *checksum &= 0xFF; } void frskyCheckSumFini(uint16_t *checksum) { - while (*checksum > 0xFF) { - *checksum = (*checksum & 0xFF) + (*checksum >> 8); - } - *checksum = 0xFF - *checksum; } -uint8_t frskyCheckSum(uint8_t *data, uint8_t length) +bool frskyChecksumIsGood(uint8_t *data, uint8_t length) { uint16_t checksum = 0; for (unsigned i = 0; i < length; i++) { frskyCheckSumStep(&checksum, *data++); } - frskyCheckSumFini(&checksum); - return checksum; + + return checksum == FRSKY_CHECKSUM_GOOD_VALUE; } -bool frskyCheckSumIsGood(uint8_t *data, uint8_t length) -{ - uint16_t checksum = frskyCheckSum(data, length); - return checksum == 0xFF; -} diff --git a/src/main/rx/frsky_crc.h b/src/main/rx/frsky_crc.h index c0a026ba47..849b53bfab 100644 --- a/src/main/rx/frsky_crc.h +++ b/src/main/rx/frsky_crc.h @@ -18,7 +18,8 @@ #include #include -uint8_t frskyCheckSum(uint8_t *data, uint8_t length); -bool frskyCheckSumIsGood(uint8_t *data, uint8_t length); +#define FRSKY_CHECKSUM_GOOD_VALUE 0xFF + +bool frskyChecksumIsGood(uint8_t *data, uint8_t length); void frskyCheckSumStep(uint16_t *checksum, uint8_t byte); // Add byte to checksum void frskyCheckSumFini(uint16_t *checksum); // Finalize checksum