diff --git a/dcc/dn_dcc_proto.c b/dcc/dn_dcc_proto.c index 89eda3e..a3073f8 100644 --- a/dcc/dn_dcc_proto.c +++ b/dcc/dn_dcc_proto.c @@ -257,6 +257,35 @@ uint32_t DN_Packet_Compress3(uint8_t *src, uint32_t size, uint8_t *dest) } #endif +void DN_Packet_Uncompress(uint8_t *src, uint32_t size, uint8_t *dest) +{ + uint32_t inOffset; + uint32_t outOffset; + uint16_t getCount; + uint32_t incrOffset; + + outOffset = 0; + wdog_reset(); + + for (inOffset = 0; inOffset < size; inOffset += incrOffset) { + getCount = *(uint16_t *)(src + inOffset); + + if ((src[inOffset + 1] & 0x80) == 0) { + /* RLE flag: 0 => Copy data */ + memcpy(dest + outOffset, src + inOffset + 2, getCount & 0x7fff); + incrOffset = (getCount & 0x7fff) + 2; + } else { + /* RLE flag: 1 => Repeat data */ + memset(dest + outOffset, src[inOffset + 2], getCount & 0x7fff); + incrOffset = 3; + } + + outOffset = (getCount & 0x7fff) + outOffset; + } +} + + + /* 03 - DCC Packets */ #ifdef DCC_TESTING uint32_t DN_Packet_DCC_Send(uint32_t data) {