diff --git a/ssdv.c b/ssdv.c index 28901f7..85241e9 100644 --- a/ssdv.c +++ b/ssdv.c @@ -335,6 +335,13 @@ static char ssdv_process(ssdv_t *s) /*****************************************************************************/ +static void ssdv_memset_prng(uint8_t *s, size_t n) +{ + /* A very simple PRNG for noise whitening */ + uint8_t l = 0x00; + for(; n > 0; n--) *(s++) = (l = l * 245 + 45); +} + static char ssdv_have_marker(ssdv_t *s) { switch(s->marker) @@ -418,9 +425,6 @@ char ssdv_enc_set_buffer(ssdv_t *s, uint8_t *buffer) s->outp = buffer + SSDV_PKT_SIZE_HEADER; s->out_len = SSDV_PKT_SIZE_PAYLOAD; - /* Zero the payload memory */ - memset(s->out, 0, SSDV_PKT_SIZE); - /* Flush the output bits */ ssdv_outbits(s, 0, 0); @@ -527,6 +531,9 @@ char ssdv_enc_get_packet(ssdv_t *s) s->out[9] = mcu_id >> 8; /* MCU ID MSB */ s->out[10] = mcu_id & 0xFF; /* MCU ID LSB */ + /* Fill any remaining bytes with noise */ + if(s->out_len > 0) ssdv_memset_prng(s->outp, s->out_len); + /* Generate the RS codes */ encode_rs_8(&s->out[1], &s->out[SSDV_PKT_SIZE - SSDV_PKT_SIZE_RSCODES], 0);