Double MSP (TLM and MAVLink) throughput for Gemini hardware (#3037)
[ExpressLRS.git] / src / lib / FEC / FEC.cpp
blob0edb928df0f102087cf737b8e6af9a7b0ae83369
1 #include "FEC.h"
3 void FECEncode(uint8_t *incomingData, uint8_t *FECBuffer)
5 // Encode Hamming(7,4)
6 uint8_t encodedBuffer[8 * 2] = {0};
7 for (uint8_t i = 0; i < 8; i++)
9 encodedBuffer[i * 2 + 0] = HammingTableEncode(incomingData[i] & 0x0F); // LSB nibble
10 encodedBuffer[i * 2 + 1] = HammingTableEncode(incomingData[i] >> 4); // MSB nibble
13 // Interleaving
14 for (uint8_t i = 0; i < (14 / 2); i++)
16 for (uint8_t j = 0; j < 8; j++)
18 FECBuffer[i * 2 + 0] |= ((encodedBuffer[j + 0] >> i) & 0x01) << j;
19 FECBuffer[i * 2 + 1] |= ((encodedBuffer[j + 8] >> i) & 0x01) << j;
24 void FECDecode(uint8_t *incomingFECBuffer, uint8_t *outgoingData)
26 // Interleaving
27 uint8_t encodedBuffer[16] = {0};
28 for (uint8_t i = 0; i < 8; i++)
30 for (uint8_t j = 0; j < 7; j++)
32 encodedBuffer[i + 0] |= ((incomingFECBuffer[j * 2 + 0] >> i) & 0x01) << j;
33 encodedBuffer[i + 8] |= ((incomingFECBuffer[j * 2 + 1] >> i) & 0x01) << j;
37 // Decode Hamming(7,4)
38 for (uint8_t i = 0; i < 8; i++)
40 outgoingData[i] = HammingTableDecode(encodedBuffer[i * 2 + 0]); // LSB nibble
41 outgoingData[i] |= HammingTableDecode(encodedBuffer[i * 2 + 1]) << 4; // MSB nibble