summaryrefslogtreecommitdiff
path: root/controller/fw/src/protocol.c
blob: 6b7d8b733605338688e4f2072773962c30fc8ad4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <assert.h>

#include "sr_global.h"
#include "dsss_demod.h"
#include "con_usart.h"
#include "rslib.h"
#include "crypto.h"

void handle_dsss_received(uint8_t data[static TRANSMISSION_SYMBOLS]) {
    /* Console status output */
    con_printf("DSSS data received: ");
    for (int i=0; i<TRANSMISSION_SYMBOLS; i++) {
        int x = (data[i]>>1) * (data[i]&1 ? 1 : -1);
        con_printf("%3d ", x);
    }
    con_printf("\r\n");

    /* Run reed-solomon error correction */
    const int sym_bits = DSSS_GOLD_CODE_NBITS + 1; /* +1 for amplitude sign bit */
    /* TODO identify erasures in DSSS demod layer */
    (void) rslib_decode(sym_bits, TRANSMISSION_SYMBOLS, (char *)data);
    /* TODO error detection & handling */

    /* Re-bit-pack data buffer to be bit-continuous:
     *      [ . . a b  c d e f ] [ . . g h  i j k l ] [ . . m n  o p q r ] ...
     *  ==> [ a b c d  e f g h ] [ i j k l  m n o p ] [ q r ...          ] ...
     */
    static_assert((TRANSMISSION_SYMBOLS - NPAR) * (DSSS_GOLD_CODE_NBITS + 1) == OOB_TRIGGER_LEN * 8);
    for (uint8_t i=0, j=0; i < TRANSMISSION_SYMBOLS - NPAR; i++, j += sym_bits) {
        uint32_t sym = data[i]; /* [ ... | . . X X  X X X X ] for 5-bit dsss */
        data[i] = 0; /* clear for output */

        sym <<= 8-sym_bits; /* left-align: [ ... | X X X X  X X . . ] */
        sym <<= 8; /* shift to second byte: [ ... | X X X X  X X . . | . . . .  . . . . ]*/
        sym >>= (j%8); /* shift to bit write offset: [ ... | . . . .  X X X X | X X . .  . . . . ] for offset 4 */
        data[j/8] |= sym >> 8; /* write upper byte */
        data[j/8 + 1] |= sym & 0xff; /* write lower byte */
    }

    /* hand off to crypto.c */ 
    oob_message_received(data);
}