UoS³ Flight Computer Firmware
 All Data Structures Files Functions Groups Pages
interleave.c
1 /* @file interleave.c
2  *
3  * Packet Interleaving Functions
4  *
5  * @author Phil Crump
6  *
7  * @ingroup packet
8  * @{
9  */
10 
11 #include "../firmware.h"
12 
20 void Packet_interleave_32x32(uint8_t *buffer)
21 {
22  uint32_t i, j;
23  uint8_t output[128] = { 0 };
24 
25  for(i=0;i<1024;i++)
26  {
27  j = (((i & 0x1f) << 5) + (i >> 5));
28 
29  if((i & 0x07) >= (j & 0x07))
30  {
31  output[j>>3] = (uint8_t)(output[j>>3] | ((buffer[i>>3] & (0x80 >> (i & 0x07))) << ((i & 0x07) - (j & 0x07))));
32  }
33  else
34  {
35  output[j>>3] = (uint8_t)(output[j>>3] | ((buffer[i>>3] & (0x80 >> (i & 0x07))) >> ((j & 0x07) - (i & 0x07))));
36  }
37  }
38 
39  memcpy(buffer, output, 128);
40 }
41 
49 void Packet_interleave_64x64(uint8_t *buffer)
50 {
51  uint32_t i, j;
52  uint8_t output[512] = { 0 };
53 
54  for(i=0;i<4096;i++)
55  {
56  j = (((i & 0x3f) << 6) + (i >> 6));
57 
58  if((i & 0x07) >= (j & 0x07))
59  {
60  output[j>>3] = (uint8_t)(output[j>>3] | ((buffer[i>>3] & (0x80 >> (i & 0x07))) << ((i & 0x07) - (j & 0x07))));
61  }
62  else
63  {
64  output[j>>3] = (uint8_t)(output[j>>3] | ((buffer[i>>3] & (0x80 >> (i & 0x07))) >> ((j & 0x07) - (i & 0x07))));
65  }
66  }
67 
68  memcpy(buffer, output, 512);
69 }
70