diff --git a/src/main/common/crc.c b/src/main/common/crc.c index 1ccbd78e5e..afd77b79d1 100644 --- a/src/main/common/crc.c +++ b/src/main/common/crc.c @@ -77,3 +77,25 @@ void crc8_dvb_s2_sbuf_append(sbuf_t *dst, uint8_t *start) } sbufWriteU8(dst, crc); } + +uint8_t crc8_xor_update(uint8_t crc, const void *data, uint32_t length) +{ + const uint8_t *p = (const uint8_t *)data; + const uint8_t *pend = p + length; + + for (; p != pend; p++) { + crc ^= *p; + } + return crc; +} + +void crc8_xor_sbuf_append(sbuf_t *dst, uint8_t *start) +{ + uint8_t crc = 0; + const uint8_t *end = dst->ptr; + for (uint8_t *ptr = start; ptr < end; ++ptr) { + crc ^= *ptr; + } + sbufWriteU8(dst, crc); +} + diff --git a/src/main/common/crc.h b/src/main/common/crc.h index 8e8fbf5557..8aebc3c415 100644 --- a/src/main/common/crc.h +++ b/src/main/common/crc.h @@ -17,9 +17,12 @@ #pragma once +struct sbuf_s; + uint16_t crc16_ccitt(uint16_t crc, unsigned char a); uint16_t crc16_ccitt_update(uint16_t crc, const void *data, uint32_t length); uint8_t crc8_dvb_s2(uint8_t crc, unsigned char a); uint8_t crc8_dvb_s2_update(uint8_t crc, const void *data, uint32_t length); -struct sbuf_s; void crc8_dvb_s2_sbuf_append(struct sbuf_s *dst, uint8_t *start); +uint8_t crc8_xor_update(uint8_t crc, const void *data, uint32_t length); +void crc8_xor_sbuf_append(struct sbuf_s *dst, uint8_t *start); diff --git a/src/main/common/streambuf.c b/src/main/common/streambuf.c index 976439ae81..ad7db189d3 100644 --- a/src/main/common/streambuf.c +++ b/src/main/common/streambuf.c @@ -61,6 +61,12 @@ void sbufWriteU32BigEndian(sbuf_t *dst, uint32_t val) } +void sbufFill(sbuf_t *dst, uint8_t data, int len) +{ + memset(dst->ptr, data, len); + dst->ptr += len; +} + void sbufWriteData(sbuf_t *dst, const void *data, int len) { memcpy(dst->ptr, data, len); diff --git a/src/main/common/streambuf.h b/src/main/common/streambuf.h index 790423350e..21f5822fb6 100644 --- a/src/main/common/streambuf.h +++ b/src/main/common/streambuf.h @@ -20,19 +20,20 @@ #include // simple buffer-based serializer/deserializer without implicit size check -// little-endian encoding implemneted now typedef struct sbuf_s { - uint8_t *ptr; // data pointer must be first (sbuff_t* is equivalent to uint8_t **) + uint8_t *ptr; // data pointer must be first (sbuf_t* is equivalent to uint8_t **) uint8_t *end; } sbuf_t; sbuf_t *sbufInit(sbuf_t *sbuf, uint8_t *ptr, uint8_t *end); + void sbufWriteU8(sbuf_t *dst, uint8_t val); void sbufWriteU16(sbuf_t *dst, uint16_t val); void sbufWriteU32(sbuf_t *dst, uint32_t val); void sbufWriteU16BigEndian(sbuf_t *dst, uint16_t val); void sbufWriteU32BigEndian(sbuf_t *dst, uint32_t val); +void sbufFill(sbuf_t *dst, uint8_t data, int len); void sbufWriteData(sbuf_t *dst, const void *data, int len); void sbufWriteString(sbuf_t *dst, const char *string); void sbufWriteStringWithZeroTerminator(sbuf_t *dst, const char *string);