Call the fec decode function, compute RSSI and check CRC
Signed-off-by: Keith Packard <keithp@keithp.com>
-ao_fec_decode(uint8_t *in, uint16_t in_len, uint8_t *out);
+ao_fec_decode(uint8_t *in, uint16_t in_len, uint8_t *out, uint8_t out_len);
/*
* Interleave data packed in bytes. 'out' must be 'len' bytes long.
/*
* Interleave data packed in bytes. 'out' must be 'len' bytes long.
-ao_fec_decode(uint8_t *in, uint16_t len, uint8_t *out)
+ao_fec_decode(uint8_t *in, uint16_t len, uint8_t *out, uint8_t out_len)
{
static uint16_t cost[2][NUM_STATE]; /* path cost */
static uint16_t bits[2][NUM_STATE]; /* save bits to quickly output them */
{
static uint16_t cost[2][NUM_STATE]; /* path cost */
static uint16_t bits[2][NUM_STATE]; /* save bits to quickly output them */
printf ("\tbit %3d min_cost %5d old bit %3d old_state %x bits %02x whiten %0x\n",
i/2, min_cost, o + 8, min_state, (bits[p][min_state] >> dist) & 0xff, *whiten);
#endif
printf ("\tbit %3d min_cost %5d old bit %3d old_state %x bits %02x whiten %0x\n",
i/2, min_cost, o + 8, min_state, (bits[p][min_state] >> dist) & 0xff, *whiten);
#endif
- *out++ = (bits[p][min_state] >> dist) ^ *whiten++;
+ if (out_len) {
+ *out++ = (bits[p][min_state] >> dist) ^ *whiten++;
+ --out_len;
+ }
static uint8_t rx_data[2048];
static uint16_t rx_data_count;
static uint16_t rx_data_cur;
static uint8_t rx_data[2048];
static uint16_t rx_data_count;
static uint16_t rx_data_cur;
-static uint8_t rx_started;
+static uint8_t rx_ignore;
static void
ao_radio_rx_isr(void)
{
static void
ao_radio_rx_isr(void)
{
rx_data[rx_data_cur++] = stm_spi2.dr;
if (rx_data_cur >= rx_data_count) {
ao_exti_disable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN);
rx_data[rx_data_cur++] = stm_spi2.dr;
if (rx_data_cur >= rx_data_count) {
ao_exti_disable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN);
}
} else {
(void) stm_spi2.dr;
}
} else {
(void) stm_spi2.dr;
uint8_t
ao_radio_recv(__xdata void *d, uint8_t size)
{
uint8_t
ao_radio_recv(__xdata void *d, uint8_t size)
{
- uint8_t len = ((size - 2) + 4) * 2; /* two bytes for status */
- rx_data_count = sizeof (rx_data);
+ size -= 2; /* status bytes */
+ len = size + 2; /* CRC bytes */
+ len += 1 + ~(len & 1); /* 1 or two pad bytes */
+ len *= 2; /* 1/2 rate convolution */
+ rx_data_count = len * 8; /* bytes to bits */
printf ("len %d rx_data_count %d\n", len, rx_data_count);
printf ("len %d rx_data_count %d\n", len, rx_data_count);
ao_radio_strobe(CC1120_SRX);
ao_radio_burst_read_start(CC1120_SOFT_RX_DATA_OUT);
ao_radio_strobe(CC1120_SRX);
ao_radio_burst_read_start(CC1120_SOFT_RX_DATA_OUT);
cli();
while (!ao_radio_wake && !ao_radio_abort)
ao_sleep(&ao_radio_wake);
sei();
cli();
while (!ao_radio_wake && !ao_radio_abort)
ao_sleep(&ao_radio_wake);
sei();
-
-#else
- printf ("Hit a character to stop..."); flush();
- getchar();
- putchar('\n');
- ao_exti_disable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN);
-#endif
ao_radio_burst_read_stop();
ao_radio_burst_read_stop();
+ /* Convert from 'real' rssi to cc1111-style values */
+
+ rssi = (((int8_t) ao_radio_reg_read(CC1120_RSSI1)) + 74) * 2;
+
ao_radio_strobe(CC1120_SIDLE);
ao_radio_put();
ao_radio_strobe(CC1120_SIDLE);
ao_radio_put();
- printf ("Received data:");
- for (i = 0; i < rx_data_cur; i++) {
- if ((i & 15) == 0)
- printf ("\n");
- printf (" %02x", rx_data[i]);
- }
- printf ("\n");
+ /* Construct final packet */
+
+ ao_fec_decode(rx_data, rx_data_cur, d, size + 2);
+
+ if (ao_fec_check_crc(d, size))
+ ((uint8_t *) d)[size + 1] = 0x80;
+ else
+ ((uint8_t *) d)[size + 1] = 0x00;
+
+ ((uint8_t *) d)[size] = (uint8_t) rssi;
+