Code cleanup; made strobe transmission time longer again (seems to work better in cooja?)

This commit is contained in:
adamdunkels 2009-05-06 15:05:28 +00:00
parent a671ea1146
commit 9fff85757d

View File

@ -28,7 +28,7 @@
*
* This file is part of the Contiki operating system.
*
* $Id: xmac.c,v 1.32 2009/04/29 11:42:13 adamdunkels Exp $
* $Id: xmac.c,v 1.33 2009/05/06 15:05:28 adamdunkels Exp $
*/
/**
@ -49,13 +49,11 @@
#include "lib/random.h"
#include "sys/compower.h"
#include "sys/timetable.h"
#include "contiki-conf.h"
#include <string.h>
#define WITH_TIMETABLE 0
#define WITH_CHANNEL_CHECK 0 /* Seems to work badly when enabled */
#define WITH_TIMESYNCH 0
#define WITH_QUEUE 0
@ -116,7 +114,7 @@ struct xmac_hdr {
struct xmac_config xmac_config = {
DEFAULT_ON_TIME,
DEFAULT_OFF_TIME,
4 * DEFAULT_ON_TIME + DEFAULT_OFF_TIME,
20 * DEFAULT_ON_TIME + DEFAULT_OFF_TIME,
DEFAULT_STROBE_WAIT_TIME
};
@ -137,9 +135,6 @@ static const struct radio_driver *radio;
#undef LEDS_OFF
#undef LEDS_TOGGLE
#define CPRINTF(...)
#define LEDS_ON(x) leds_on(x)
#define LEDS_OFF(x) leds_off(x)
#define LEDS_TOGGLE(x) leds_toggle(x)
@ -174,10 +169,6 @@ static void (* receiver_callback)(const struct mac_driver *);
static struct compower_activity current_packet;
#endif /* XMAC_CONF_COMPOWER */
#if WITH_TIMETABLE
#define xmac_timetable_size 1024
TIMETABLE_NONSTATIC(xmac_timetable);
#endif /* WITH_TIMETABLE */
/*---------------------------------------------------------------------------*/
static void
set_receive_function(void (* recv)(const struct mac_driver *))
@ -192,10 +183,6 @@ on(void)
radio_is_on = 1;
radio->on();
LEDS_ON(LEDS_RED);
CPRINTF("/");
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "on");
#endif
}
}
/*---------------------------------------------------------------------------*/
@ -205,11 +192,7 @@ off(void)
if(xmac_is_on && radio_is_on != 0 && is_listening == 0) {
radio_is_on = 0;
radio->off();
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "off");
#endif
LEDS_OFF(LEDS_RED);
CPRINTF("\\");
}
}
/*---------------------------------------------------------------------------*/
@ -221,8 +204,7 @@ powercycle(struct rtimer *t, void *ptr)
rtimer_clock_t should_be, adjust;
#endif /* WITH_TIMESYNCH */
CPRINTF("*");
PT_BEGIN(&pt);
while(1) {
@ -246,9 +228,6 @@ powercycle(struct rtimer *t, void *ptr)
power cycles without having heard a packet, so we turn off
the radio. */
waiting_for_packet = 0;
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "off waiting");
#endif
if(we_are_sending == 0) {
off();
}
@ -259,7 +238,7 @@ powercycle(struct rtimer *t, void *ptr)
}
#if WITH_TIMESYNCH
#define NUM_SLOTS 8
#define NUM_SLOTS 16
should_be = ((timesynch_rtimer_to_time(RTIMER_TIME(t)) +
xmac_config.off_time) &
~(xmac_config.off_time + xmac_config.on_time - 1)) +
@ -385,10 +364,7 @@ send_packet(void)
}
#endif /* WITH_RANDOM_WAIT_BEFORE_SEND */
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send");
#endif
#if WITH_CHANNEL_CHECK
/* Check if there are other strobes in the air. */
waiting_for_packet = 1;
@ -402,12 +378,8 @@ send_packet(void)
}
waiting_for_packet = 0;
while(someone_is_sending); /* {printf("z");}*/
while(someone_is_sending);
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send 2");
#endif /* WITH_TIMETABLE */
#endif /* WITH_CHANNEL_CHECK */
/* By setting we_are_sending to one, we ensure that the rtimer
@ -452,37 +424,26 @@ send_packet(void)
strobes++) {
t = RTIMER_NOW();
strobe.hdr.type = TYPE_STROBE;
rimeaddr_copy(&strobe.hdr.sender, &rimeaddr_node_addr);
rimeaddr_copy(&strobe.hdr.receiver, packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
#if WITH_TIMETABLE
if(rimeaddr_cmp(&strobe.hdr.receiver, &rimeaddr_null)) {
TIMETABLE_TIMESTAMP(xmac_timetable, "send broadcast strobe");
} else {
TIMETABLE_TIMESTAMP(xmac_timetable, "send strobe");
}
#endif
/* Send the strobe packet. */
radio->send((const uint8_t *)&strobe, sizeof(struct xmac_hdr));
CPRINTF("+");
while(got_strobe_ack == 0 &&
RTIMER_CLOCK_LT(RTIMER_NOW(), t + xmac_config.strobe_wait_time)) {
/* See if we got an ACK */
len = radio->read((uint8_t *)&strobe, sizeof(struct xmac_hdr));
if(len > 0) {
CPRINTF("_");
if(rimeaddr_cmp(&strobe.hdr.sender, &rimeaddr_node_addr) &&
rimeaddr_cmp(&strobe.hdr.receiver, &rimeaddr_node_addr)) {
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send ack received");
#endif
CPRINTF("@");
/* We got an ACK from the receiver, so we can immediately send
the packet. */
got_strobe_ack = 1;
if(!is_broadcast) {
len = radio->read((uint8_t *)&strobe, sizeof(struct xmac_hdr));
if(len > 0) {
if(rimeaddr_cmp(&strobe.hdr.sender, &rimeaddr_node_addr) &&
rimeaddr_cmp(&strobe.hdr.receiver, &rimeaddr_node_addr)) {
/* We got an ACK from the receiver, so we can immediately send
the packet. */
got_strobe_ack = 1;
}
}
}
}
@ -502,9 +463,7 @@ send_packet(void)
PACKETBUF_ATTR_RELIABLE packet attribute), we keep the radio on. */
if(got_strobe_ack && (packetbuf_attr(PACKETBUF_ATTR_RELIABLE) ||
packetbuf_attr(PACKETBUF_ATTR_ERELIABLE))) {
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send got ack");
#endif
#if WITH_ACK_OPTIMIZATION
on(); /* Wait for ACK packet */
waiting_for_packet = 1;
@ -513,20 +472,15 @@ send_packet(void)
#endif /* WITH_ACK_OPTIMIZATION */
} else {
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send no ack received");
#endif
off(); /* shell ping don't seem to work with off() here, so we'll
keep it on() for a while. */
}
/* Send the data packet. */
if(is_broadcast || got_strobe_ack) {
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send packet");
#endif
radio->send(packetbuf_hdrptr(), packetbuf_totlen());
CPRINTF("#");
}
watchdog_start();
@ -549,9 +503,7 @@ send_packet(void)
#endif /* XMAC_CONF_COMPOWER */
we_are_sending = 0;
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "send we_are_sending = 0");
#endif
LEDS_OFF(LEDS_BLUE);
return 1;
@ -608,7 +560,6 @@ read_packet(void)
packetbuf_hdrreduce(sizeof(struct xmac_hdr));
if(hdr->type == TYPE_STROBE) {
CPRINTF(".");
/* There is no data in the packet so it has to be a strobe. */
someone_is_sending = 2;
@ -619,7 +570,6 @@ read_packet(void)
/* If the sender address is our node address, the strobe is
a stray strobe ACK to us, which we ignore unless we are
currently sending a packet. */
CPRINTF("&");
someone_is_sending = 0;
} else {
struct xmac_hdr msg;
@ -627,13 +577,9 @@ read_packet(void)
acknowledge the strobe and wait for the packet. By using
the same address as both sender and receiver, we flag the
message is a strobe ack. */
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "read send ack");
#endif
msg.type = TYPE_STROBE_ACK;
rimeaddr_copy(&msg.receiver, &hdr->sender);
rimeaddr_copy(&msg.sender, &hdr->sender);
CPRINTF("!");
/* We turn on the radio in anticipation of the incoming
packet. */
someone_is_sending = 1;
@ -658,13 +604,9 @@ read_packet(void)
to the caller. */
return RIME_OK;
} else if(hdr->type == TYPE_DATA) {
CPRINTF("-");
someone_is_sending = 0;
if(rimeaddr_cmp(&hdr->receiver, &rimeaddr_node_addr) ||
rimeaddr_cmp(&hdr->receiver, &rimeaddr_null)) {
#if WITH_TIMETABLE
TIMETABLE_TIMESTAMP(xmac_timetable, "read got packet");
#endif
/* This is a regular packet that is destined to us or to the
broadcast address. */
@ -762,9 +704,6 @@ xmac_set_announcement_radio_txpower(int txpower)
const struct mac_driver *
xmac_init(const struct radio_driver *d)
{
#if WITH_TIMETABLE
timetable_clear(&xmac_timetable);
#endif
radio_is_on = 0;
waiting_for_packet = 0;
PT_INIT(&pt);