* Added configuration for radio receive buffer size (default Rime packet size)

* Added configuration for beep on bad crc
* Changed to drop packet if read buffer is too small rather than truncating data
* Turn off energest-listen during transmission
This commit is contained in:
nifi 2009-11-19 18:04:02 +00:00
parent efdbbf9fe3
commit 3c1a7f3bc7
2 changed files with 77 additions and 23 deletions

View File

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: tr1001-gcr.c,v 1.13 2008/07/08 12:27:22 nifi Exp $ * @(#)$Id: tr1001-gcr.c,v 1.14 2009/11/19 18:04:02 nifi Exp $
*/ */
/** /**
* \addtogroup esb * \addtogroup esb
@ -62,6 +62,19 @@
#include <signal.h> #include <signal.h>
#include <string.h> #include <string.h>
#ifdef TR1001_CONF_BEEP_ON_BAD_CRC
#define BEEP_ON_BAD_CRC TR1001_CONF_BEEP_ON_BAD_CRC
#else
#define BEEP_ON_BAD_CRC 1
#endif /* TR1001_CONF_BEEP_ON_BAD_CRC */
#if BEEP_ON_BAD_CRC
#include "dev/beep.h"
#define BEEP_BEEP(t) beep_beep(t)
#else
#define BEEP_BEEP(t)
#endif /* BEEP_ON_BAD_CRC */
#define RXSTATE_READY 0 #define RXSTATE_READY 0
#define RXSTATE_RECEIVING 1 #define RXSTATE_RECEIVING 1
#define RXSTATE_FULL 2 #define RXSTATE_FULL 2
@ -69,10 +82,15 @@
#define SYNCH1 0x3c #define SYNCH1 0x3c
#define SYNCH2 0x03 #define SYNCH2 0x03
#ifdef TR1001_CONF_BUFFER_SIZE
#define RXBUFSIZE TR1001_CONF_BUFFER_SIZE
#else
#define RXBUFSIZE PACKETBUF_SIZE
#endif /* TR1001_CONF_BUFFER_SIZE */
/* /*
* The buffer which holds incoming data. * The buffer which holds incoming data.
*/ */
#define RXBUFSIZE UIP_BUFSIZE
unsigned char tr1001_rxbuf[RXBUFSIZE]; unsigned char tr1001_rxbuf[RXBUFSIZE];
/* /*
@ -372,6 +390,7 @@ interrupt (UART0RX_VECTOR)
ENERGEST_OFF(ENERGEST_TYPE_IRQ); ENERGEST_OFF(ENERGEST_TYPE_IRQ);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#if DEBUG
static void static void
dump_packet(int len) dump_packet(int len)
{ {
@ -380,6 +399,7 @@ dump_packet(int len)
LOG("%d: 0x%02x\n", i, tr1001_rxbuf[i]); LOG("%d: 0x%02x\n", i, tr1001_rxbuf[i]);
} }
} }
#endif /* DEBUG */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte)) PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
{ {
@ -440,7 +460,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
/* If the incoming byte isn't a valid GCR encoded byte, /* If the incoming byte isn't a valid GCR encoded byte,
we start again from the beginning. */ we start again from the beginning. */
if(!gcr_valid()) { if(!gcr_valid()) {
beep_beep(1000); BEEP_BEEP(1000);
LOG("Incorrect GCR in header at byte %d/1 %x\n", tmppos, incoming_byte); LOG("Incorrect GCR in header at byte %d/1 %x\n", tmppos, incoming_byte);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
@ -476,7 +496,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
/* If the incoming byte isn't a valid Manchester encoded byte, /* If the incoming byte isn't a valid Manchester encoded byte,
we start again from the beinning. */ we start again from the beinning. */
if(!gcr_valid()) { if(!gcr_valid()) {
beep_beep(1000); BEEP_BEEP(1000);
LOG("Incorrect GCR 0x%02x at byte %d/1\n", incoming_byte, LOG("Incorrect GCR 0x%02x at byte %d/1\n", incoming_byte,
tmppos - TR1001_HDRLEN); tmppos - TR1001_HDRLEN);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
@ -499,7 +519,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
gcr_decode(incoming_byte); gcr_decode(incoming_byte);
if(!gcr_valid()) { if(!gcr_valid()) {
beep_beep(1000); BEEP_BEEP(1000);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -525,7 +545,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
} else { } else {
LOG("Incorrect CRC\n"); LOG("Incorrect CRC\n");
beep_beep(1000); BEEP_BEEP(1000);
RIMESTATS_ADD(badcrc); RIMESTATS_ADD(badcrc);
} }
} }
@ -592,8 +612,11 @@ tr1001_send(const void *packet, unsigned short len)
LOG("tr1001_send: sending %d bytes\n", len); LOG("tr1001_send: sending %d bytes\n", len);
if(onoroff == ON) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
}
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */ /* Prepare the transmission. */
prepare_transmission(NUM_SYNCHBYTES); prepare_transmission(NUM_SYNCHBYTES);
@ -631,6 +654,7 @@ tr1001_send(const void *packet, unsigned short len)
/* Turn on (or off) reception again. */ /* Turn on (or off) reception again. */
if(onoroff == ON) { if(onoroff == ON) {
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
rxon(); rxon();
rxclear(); rxclear();
} else { } else {
@ -641,7 +665,7 @@ tr1001_send(const void *packet, unsigned short len)
ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
RIMESTATS_ADD(lltx); RIMESTATS_ADD(lltx);
return 0; return RADIO_TX_OK;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int
@ -651,18 +675,22 @@ tr1001_read(void *buf, unsigned short bufsize)
if(tr1001_rxstate == RXSTATE_FULL) { if(tr1001_rxstate == RXSTATE_FULL) {
#if DEBUG
dump_packet(tr1001_rxlen + 2); dump_packet(tr1001_rxlen + 2);
#endif /* DEBUG */
tmplen = tr1001_rxlen; tmplen = tr1001_rxlen;
if(tmplen > bufsize) { if(tmplen > bufsize) {
tmplen = bufsize; LOG("tr1001_read: too large packet: %d/%d bytes\n", tmplen, bufsize);
rxclear();
RIMESTATS_ADD(toolong);
return -1;
} }
memcpy(buf, &tr1001_rxbuf[TR1001_HDRLEN], tmplen); memcpy(buf, &tr1001_rxbuf[TR1001_HDRLEN], tmplen);
/* header + content + CRC */ /* header + content + CRC */
/* sstrength = (tmp_sstrength / (TR1001_HDRLEN + tr1001_rxlen + 2)) << 1; */
sstrength = (tmp_count ? ((tmp_sstrength / tmp_count) << 2) : 0); sstrength = (tmp_count ? ((tmp_sstrength / tmp_count) << 2) : 0);
rxclear(); rxclear();

View File

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: tr1001.c,v 1.11 2008/07/08 13:22:31 nifi Exp $ * @(#)$Id: tr1001.c,v 1.12 2009/11/19 18:04:02 nifi Exp $
*/ */
/** /**
* \addtogroup esb * \addtogroup esb
@ -62,6 +62,19 @@
#include <signal.h> #include <signal.h>
#include <string.h> #include <string.h>
#ifdef TR1001_CONF_BEEP_ON_BAD_CRC
#define BEEP_ON_BAD_CRC TR1001_CONF_BEEP_ON_BAD_CRC
#else
#define BEEP_ON_BAD_CRC 1
#endif /* TR1001_CONF_BEEP_ON_BAD_CRC */
#if BEEP_ON_BAD_CRC
#include "dev/beep.h"
#define BEEP_BEEP(t) beep_beep(t)
#else
#define BEEP_BEEP(t)
#endif /* BEEP_ON_BAD_CRC */
#define RXSTATE_READY 0 #define RXSTATE_READY 0
#define RXSTATE_RECEIVING 1 #define RXSTATE_RECEIVING 1
#define RXSTATE_FULL 2 #define RXSTATE_FULL 2
@ -69,10 +82,15 @@
#define SYNCH1 0x3c #define SYNCH1 0x3c
#define SYNCH2 0x03 #define SYNCH2 0x03
#ifdef TR1001_CONF_BUFFER_SIZE
#define RXBUFSIZE TR1001_CONF_BUFFER_SIZE
#else
#define RXBUFSIZE PACKETBUF_SIZE
#endif /* TR1001_CONF_BUFFER_SIZE */
/* /*
* The buffer which holds incoming data. * The buffer which holds incoming data.
*/ */
#define RXBUFSIZE UIP_BUFSIZE
unsigned char tr1001_rxbuf[RXBUFSIZE]; unsigned char tr1001_rxbuf[RXBUFSIZE];
/* /*
@ -362,6 +380,7 @@ interrupt (UART0RX_VECTOR)
ENERGEST_OFF(ENERGEST_TYPE_IRQ); ENERGEST_OFF(ENERGEST_TYPE_IRQ);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#if DEBUG
static void static void
dump_packet(int len) dump_packet(int len)
{ {
@ -370,6 +389,7 @@ dump_packet(int len)
LOG("%d: 0x%02x\n", i, tr1001_rxbuf[i]); LOG("%d: 0x%02x\n", i, tr1001_rxbuf[i]);
} }
} }
#endif /* DEBUG */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte)) PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
{ {
@ -424,7 +444,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
/* If the incoming byte isn't a valid Manchester encoded byte, /* If the incoming byte isn't a valid Manchester encoded byte,
we start again from the beginning. */ we start again from the beginning. */
if(!me_valid(incoming_byte)) { if(!me_valid(incoming_byte)) {
beep_beep(1000); BEEP_BEEP(1000);
LOG("Incorrect manchester in header at byte %d/1\n", tmppos); LOG("Incorrect manchester in header at byte %d/1\n", tmppos);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
@ -436,7 +456,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
PT_YIELD(&rxhandler_pt); PT_YIELD(&rxhandler_pt);
if(!me_valid(incoming_byte)) { if(!me_valid(incoming_byte)) {
beep_beep(1000); BEEP_BEEP(1000);
LOG("Incorrect manchester in header at byte %d/2\n", tmppos); LOG("Incorrect manchester in header at byte %d/2\n", tmppos);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
@ -471,7 +491,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
if(!me_valid(incoming_byte)) { if(!me_valid(incoming_byte)) {
LOG("Incorrect manchester 0x%02x at byte %d/1\n", incoming_byte, LOG("Incorrect manchester 0x%02x at byte %d/1\n", incoming_byte,
tmppos - TR1001_HDRLEN); tmppos - TR1001_HDRLEN);
beep_beep(1000); BEEP_BEEP(1000);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -482,7 +502,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
if(!me_valid(incoming_byte)) { if(!me_valid(incoming_byte)) {
LOG("Incorrect manchester at byte %d/2\n", tmppos - TR1001_HDRLEN); LOG("Incorrect manchester at byte %d/2\n", tmppos - TR1001_HDRLEN);
beep_beep(1000); BEEP_BEEP(1000);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -498,7 +518,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
PT_YIELD(&rxhandler_pt); PT_YIELD(&rxhandler_pt);
if(!me_valid(incoming_byte)) { if(!me_valid(incoming_byte)) {
beep_beep(1000); BEEP_BEEP(1000);
RIMESTATS_ADD(badsynch); RIMESTATS_ADD(badsynch);
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -521,7 +541,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
} else { } else {
LOG("Incorrect CRC\n"); LOG("Incorrect CRC\n");
beep_beep(1000); BEEP_BEEP(1000);
RIMESTATS_ADD(badcrc); RIMESTATS_ADD(badcrc);
} }
} }
@ -588,6 +608,9 @@ tr1001_send(const void *packet, unsigned short len)
LOG("tr1001_send: sending %d bytes\n", len); LOG("tr1001_send: sending %d bytes\n", len);
if(onoroff == ON) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
}
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */ /* Prepare the transmission. */
@ -616,6 +639,7 @@ tr1001_send(const void *packet, unsigned short len)
/* Turn on (or off) reception again. */ /* Turn on (or off) reception again. */
if(onoroff == ON) { if(onoroff == ON) {
ENERGEST_ON(ENERGEST_TYPE_LISTEN);
rxon(); rxon();
rxclear(); rxclear();
} else { } else {
@ -626,7 +650,7 @@ tr1001_send(const void *packet, unsigned short len)
ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
RIMESTATS_ADD(lltx); RIMESTATS_ADD(lltx);
return 0; return RADIO_TX_OK;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int
@ -636,15 +660,17 @@ tr1001_read(void *buf, unsigned short bufsize)
if(tr1001_rxstate == RXSTATE_FULL) { if(tr1001_rxstate == RXSTATE_FULL) {
#if DEBUG
dump_packet(tr1001_rxlen + 2); dump_packet(tr1001_rxlen + 2);
#endif /* DEBUG */
tmplen = tr1001_rxlen; tmplen = tr1001_rxlen;
/* if(tmplen > UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN)) {
tmplen = UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN);
}*/
if(tmplen > bufsize) { if(tmplen > bufsize) {
tmplen = bufsize; LOG("tr1001_read: too large packet: %d/%d bytes\n", tmplen, bufsize);
rxclear();
RIMESTATS_ADD(toolong);
return -1;
} }
memcpy(buf, &tr1001_rxbuf[TR1001_HDRLEN], tmplen); memcpy(buf, &tr1001_rxbuf[TR1001_HDRLEN], tmplen);