Made estimation of departure time better by locally measuring the average time per byte and adding this to the incoming timestamp.

This commit is contained in:
adamdunkels 2008-01-07 14:08:02 +00:00
parent 26a554e7c2
commit d8e84abaae

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: simple-cc2420.c,v 1.17 2007/12/16 14:30:36 adamdunkels Exp $ * @(#)$Id: simple-cc2420.c,v 1.18 2008/01/07 14:08:02 adamdunkels Exp $
*/ */
/* /*
* This code is almost device independent and should be easy to port. * This code is almost device independent and should be easy to port.
@ -53,6 +53,7 @@
#define FOOTER_LEN 2 #define FOOTER_LEN 2
#define CRC_LEN 2
#if SIMPLE_CC2420_CONF_TIMESTAMPS #if SIMPLE_CC2420_CONF_TIMESTAMPS
#include "sys/timesynch.h" #include "sys/timesynch.h"
@ -81,10 +82,13 @@ void simple_cc2420_arch_init(void);
/* XXX hack: these will be made as Chameleon packet attributes */ /* XXX hack: these will be made as Chameleon packet attributes */
rtimer_clock_t simple_cc2420_time_of_arrival, simple_cc2420_time_of_departure; rtimer_clock_t simple_cc2420_time_of_arrival, simple_cc2420_time_of_departure;
rtimer_clock_t simple_cc2420_time_for_transmission;
int simple_cc2420_authority_level_of_sender; int simple_cc2420_authority_level_of_sender;
static rtimer_clock_t setup_time_for_transmission;
static unsigned long total_time_for_transmission, total_transmission_len;
static int num_transmissions;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
PROCESS(simple_cc2420_process, "CC2420 driver"); PROCESS(simple_cc2420_process, "CC2420 driver");
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -318,6 +322,7 @@ simple_cc2420_send(const void *payload, unsigned short payload_len)
strobe(CC2420_STXONCCA); strobe(CC2420_STXONCCA);
for(i = LOOP_20_SYMBOLS; i > 0; i--) { for(i = LOOP_20_SYMBOLS; i > 0; i--) {
if(SFD_IS_1) { if(SFD_IS_1) {
rtimer_clock_t txtime = timesynch_time();
/* PRINTF("simple_cc2420: do_send() transmission has started\n");*/ /* PRINTF("simple_cc2420: do_send() transmission has started\n");*/
ENERGEST_OFF(ENERGEST_TYPE_LISTEN); ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
@ -326,7 +331,14 @@ simple_cc2420_send(const void *payload, unsigned short payload_len)
spiStatusByte = status(); spiStatusByte = status();
} while(spiStatusByte & BV(CC2420_TX_ACTIVE)); } while(spiStatusByte & BV(CC2420_TX_ACTIVE));
#if SIMPLE_CC2420_CONF_TIMESTAMPS #if SIMPLE_CC2420_CONF_TIMESTAMPS
simple_cc2420_time_for_transmission = timesynch_time() - timestamp.time; setup_time_for_transmission = txtime - timestamp.time;
if(num_transmissions < 10000) {
total_time_for_transmission += timesynch_time() - txtime;
total_transmission_len += total_len;
num_transmissions++;
}
#endif /* SIMPLE_CC2420_CONF_TIMESTAMPS */ #endif /* SIMPLE_CC2420_CONF_TIMESTAMPS */
ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
ENERGEST_ON(ENERGEST_TYPE_LISTEN); ENERGEST_ON(ENERGEST_TYPE_LISTEN);
@ -502,7 +514,7 @@ simple_cc2420_read(void *buf, unsigned short bufsize)
if(len > 0) { if(len > 0) {
/* Read payload and two bytes of footer */ /* Read payload and two bytes of footer */
PRINTF("simple_cc2420_read: len %d\n", len); PRINTF("simple_cc2420_read: len %d\n", len);
if(len < FOOTER_LEN + TIMESTAMP_LEN) { if(len <= FOOTER_LEN + TIMESTAMP_LEN) {
FASTSPI_READ_FIFO_GARBAGE(len); FASTSPI_READ_FIFO_GARBAGE(len);
RIMESTATS_ADD(tooshort); RIMESTATS_ADD(tooshort);
} else if(len - FOOTER_LEN - TIMESTAMP_LEN > bufsize) { } else if(len - FOOTER_LEN - TIMESTAMP_LEN > bufsize) {
@ -514,7 +526,6 @@ simple_cc2420_read(void *buf, unsigned short bufsize)
FASTSPI_READ_FIFO_NO_WAIT(&t, TIMESTAMP_LEN); /* Time stamp */ FASTSPI_READ_FIFO_NO_WAIT(&t, TIMESTAMP_LEN); /* Time stamp */
#endif /* SIMPLE_CC2420_CONF_TIMESTAMPS */ #endif /* SIMPLE_CC2420_CONF_TIMESTAMPS */
FASTSPI_READ_FIFO_NO_WAIT(footer, FOOTER_LEN); FASTSPI_READ_FIFO_NO_WAIT(footer, FOOTER_LEN);
// len = bufsize - 2; /* We eventually return len - 2 */
len = TIMESTAMP_LEN + FOOTER_LEN; len = TIMESTAMP_LEN + FOOTER_LEN;
RIMESTATS_ADD(toolong); RIMESTATS_ADD(toolong);
} else { } else {
@ -533,8 +544,13 @@ simple_cc2420_read(void *buf, unsigned short bufsize)
len = TIMESTAMP_LEN + FOOTER_LEN; len = TIMESTAMP_LEN + FOOTER_LEN;
} }
#if SIMPLE_CC2420_CONF_TIMESTAMPS #if SIMPLE_CC2420_CONF_TIMESTAMPS
simple_cc2420_time_of_departure = t.time; simple_cc2420_time_of_departure =
t.time +
setup_time_for_transmission +
(total_time_for_transmission * (len - 2)) / total_transmission_len;
simple_cc2420_authority_level_of_sender = t.authority_level; simple_cc2420_authority_level_of_sender = t.authority_level;
#endif /* SIMPLE_CC2420_CONF_TIMESTAMPS */ #endif /* SIMPLE_CC2420_CONF_TIMESTAMPS */
} }
} }