Files
2026-06-22 11:39:50 +03:00

37 lines
1.0 KiB
C

#include "code.h"
static inline int parity(unsigned long long x){
return __builtin_parityll(x);
}
// Convolutionally encode a packet. The input data bytes are read
// high bit first and the encoded packet is written into 'symbols',
// one symbol per byte. The first symbol is generated from POLY1,
// the second from POLY2.
// Storing only one symbol per byte uses more space, but it is faster
// and easier than trying to pack them more compactly.
int encode(
unsigned char *symbols, // Output buffer, 2*8*nbytes
const unsigned char *data, // Input buffer, nbytes
unsigned int nbytes) // Number of bytes in data
{
unsigned long long encstate;
int i;
encstate = 0;
while(nbytes-- != 0){
for(i=7;i>=0;i--){ // Transmit MSB first
encstate = ((encstate << 1) | ((*data >> i) & 1));
*symbols++ = G1FLIP ^ parity(encstate & POLY1);
*symbols++ = G2FLIP ^ parity(encstate & POLY2);
}
data++;
}
if((encstate & ((1LL << K) -1)) != 0)
return -1; // Warn if encoder wasn't tailed back to 0
return 0;
}