Updated to new radio_driver API + LPM4_EXIT instead of LPM_AWAKE()

This commit is contained in:
nifi 2007-08-07 11:11:19 +00:00
parent 39c12bad29
commit fb54bba19e
3 changed files with 189 additions and 75 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.8 2007/05/22 21:08:04 adamdunkels Exp $ * @(#)$Id: tr1001-gcr.c,v 1.9 2007/08/07 11:11:19 nifi Exp $
*/ */
/** /**
* \addtogroup esb * \addtogroup esb
@ -52,8 +52,8 @@
#include "contiki-esb.h" #include "contiki-esb.h"
#include "dev/tr1001.h"
#include "lib/gcr.h" #include "lib/gcr.h"
/* #include "lib/me.h" */
#include "lib/crc16.h" #include "lib/crc16.h"
#include <io.h> #include <io.h>
@ -76,15 +76,6 @@ static unsigned short packets_err;
static unsigned short packets_ok; static unsigned short packets_ok;
#endif /* TR1001_STATISTICS */ #endif /* TR1001_STATISTICS */
/*const struct radio_driver tr1001_driver =
{
tr1001_send,
tr1001_read,
tr1001_set_receiver,
tr1001_on,
tr1001_off,
};*/
/* /*
* The buffer which holds incoming data. * The buffer which holds incoming data.
*/ */
@ -120,7 +111,7 @@ struct tr1001_hdr {
#define OFF 0 #define OFF 0
#define ON 1 #define ON 1
static u8_t onoroff = ON; static u8_t onoroff = OFF;
#define NUM_SYNCHBYTES 4 #define NUM_SYNCHBYTES 4
@ -139,8 +130,6 @@ static struct timer rxtimer;
static unsigned short tmp_sstrength, sstrength; static unsigned short tmp_sstrength, sstrength;
static unsigned short tmp_count; static unsigned short tmp_count;
static struct process *poll_process;
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
@ -152,6 +141,24 @@ static struct process *poll_process;
#define GCRLOG(...) /* printf(__VA_ARGS__)*/ #define GCRLOG(...) /* printf(__VA_ARGS__)*/
/*---------------------------------------------------------------------------*/
PROCESS(tr1001_process, "TR1001 driver");
/*---------------------------------------------------------------------------*/
static void (* receiver_callback)(const struct radio_driver *);
static void tr1001_set_receiver(void (* recv)(const struct radio_driver *));
static int tr1001_on(void);
static int tr1001_off(void);
const struct radio_driver tr1001_driver = {
tr1001_send,
tr1001_read,
tr1001_set_receiver,
tr1001_on,
tr1001_off
};
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#if TR1001_STATISTICS #if TR1001_STATISTICS
#define PACKET_DROPPED() do { \ #define PACKET_DROPPED() do { \
@ -193,13 +200,13 @@ rxon(void)
/* Enable the receiver. */ /* Enable the receiver. */
ME1 |= URXE0; ME1 |= URXE0;
/* Turn off receive interrupt. */ /* Turn on receive interrupt. */
IE1 |= URXIE0; IE1 |= URXIE0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* Turn on data reception for the radio tranceiver. * Turn off data reception for the radio tranceiver.
*/ */
static void static void
rxoff(void) rxoff(void)
@ -226,28 +233,37 @@ rxclear(void)
* Turn TR1001 radio transceiver off. * Turn TR1001 radio transceiver off.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void static int
radio_off(void) tr1001_off(void)
{ {
if(onoroff == OFF) {
return 1;
}
onoroff = OFF; onoroff = OFF;
rxoff(); rxoff();
rxclear(); rxclear();
ENERGEST_OFF(ENERGEST_TYPE_RECEIVE); ENERGEST_OFF(ENERGEST_TYPE_RECEIVE);
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* Turn TR1001 radio transceiver on. * Turn TR1001 radio transceiver on.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void static int
radio_on(void) tr1001_on(void)
{ {
if(onoroff == ON) {
return 1;
}
ENERGEST_ON(ENERGEST_TYPE_RECEIVE); ENERGEST_ON(ENERGEST_TYPE_RECEIVE);
onoroff = ON; onoroff = ON;
rxon(); rxon();
rxclear(); rxclear();
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
@ -356,11 +372,15 @@ tr1001_set_txpower(unsigned char p)
P2OUT |= 0x40; /* P26 = 1 (chipselect off) */ P2OUT |= 0x40; /* P26 = 1 (chipselect off) */
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void static void
tr1001_init(struct process *p) tr1001_set_receiver(void (* recv)(const struct radio_driver *))
{
receiver_callback = recv;
}
/*---------------------------------------------------------------------------*/
void
tr1001_init()
{ {
poll_process = p;
PT_INIT(&rxhandler_pt); PT_INIT(&rxhandler_pt);
#if TR1001_STATISTICS #if TR1001_STATISTICS
@ -369,6 +389,7 @@ tr1001_init(struct process *p)
sstrength_min = 0xFFFF; sstrength_min = 0xFFFF;
sstrength_max = 0; sstrength_max = 0;
#endif /* TR1001_STATISTICS */ #endif /* TR1001_STATISTICS */
onoroff = OFF;
UCTL0 = CHAR; /* 8-bit character */ UCTL0 = CHAR; /* 8-bit character */
UTCTL0 = SSEL1; /* UCLK = SMCLK */ UTCTL0 = SSEL1; /* UCLK = SMCLK */
@ -383,12 +404,13 @@ tr1001_init(struct process *p)
timer_set(&rxtimer, CLOCK_SECOND / 4); timer_set(&rxtimer, CLOCK_SECOND / 4);
radio_on(); tr1001_on();
tr1001_set_txpower(100); tr1001_set_txpower(100);
/* Reset reception state. */ /* Reset reception state. */
rxclear(); rxclear();
process_start(&tr1001_process, NULL);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
interrupt (UART0RX_VECTOR) interrupt (UART0RX_VECTOR)
@ -397,7 +419,7 @@ interrupt (UART0RX_VECTOR)
ENERGEST_ON(ENERGEST_TYPE_IRQ); ENERGEST_ON(ENERGEST_TYPE_IRQ);
tr1001_default_rxhandler_pt(RXBUF0); tr1001_default_rxhandler_pt(RXBUF0);
if(tr1001_rxstate == RXSTATE_FULL) { if(tr1001_rxstate == RXSTATE_FULL) {
LPM_AWAKE(); LPM4_EXIT;
} }
ENERGEST_OFF(ENERGEST_TYPE_IRQ); ENERGEST_OFF(ENERGEST_TYPE_IRQ);
} }
@ -553,9 +575,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
request the driver to take care of the incoming data. */ request the driver to take care of the incoming data. */
PACKET_ACCEPTED(); PACKET_ACCEPTED();
if(poll_process != NULL) { process_poll(&tr1001_process);
process_poll(poll_process);
}
/* We'll set the receive state flag to signal that a full frame /* We'll set the receive state flag to signal that a full frame
is present in the buffer, and we'll wait until the buffer has is present in the buffer, and we'll wait until the buffer has
@ -564,7 +584,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
PT_WAIT_UNTIL(&rxhandler_pt, tr1001_rxstate != RXSTATE_FULL); PT_WAIT_UNTIL(&rxhandler_pt, tr1001_rxstate != RXSTATE_FULL);
} else { } else {
LOG("Incorrect CRC"); LOG("Incorrect CRC\n");
beep_beep(1000); beep_beep(1000);
PACKET_DROPPED(); PACKET_DROPPED();
} }
@ -624,8 +644,8 @@ prepare_transmission(int synchbytes)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
u8_t int
tr1001_send(u8_t *packet, u16_t len) tr1001_send(const u8_t *packet, u16_t len)
{ {
int i; int i;
u16_t crc16; u16_t crc16;
@ -682,11 +702,11 @@ tr1001_send(u8_t *packet, u16_t len)
ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
return UIP_FW_OK; return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned short u16_t
tr1001_poll(u8_t *buf, u16_t bufsize) tr1001_read(u8_t *buf, u16_t bufsize)
{ {
unsigned short tmplen; unsigned short tmplen;
@ -696,11 +716,8 @@ tr1001_poll(u8_t *buf, u16_t bufsize)
tmplen = tr1001_rxlen; tmplen = tr1001_rxlen;
/* if(tmplen > UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN)) { if(tmplen > bufsize) {
tmplen = UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN); tmplen = bufsize;
}*/
if(tmplen > bufsize - TR1001_HDRLEN) {
tmplen = bufsize - TR1001_HDRLEN;
} }
memcpy(buf, &tr1001_rxbuf[TR1001_HDRLEN], tmplen); memcpy(buf, &tr1001_rxbuf[TR1001_HDRLEN], tmplen);
@ -713,13 +730,35 @@ tr1001_poll(u8_t *buf, u16_t bufsize)
rxclear(); rxclear();
LOG("tr1001_poll: got %d bytes\n", tmplen); LOG("tr1001_read: got %d bytes\n", tmplen);
return tmplen; return tmplen;
} }
return 0; return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
PROCESS_THREAD(tr1001_process, ev, data)
{
PROCESS_BEGIN();
/* Reset reception state now that the process is ready to receive data. */
rxclear();
while(1) {
PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL);
if(receiver_callback != NULL) {
receiver_callback(&tr1001_driver);
} else {
LOG("tr1001 has no receive function\n");
/* Perform a dummy read to drop the message. */
tr1001_read((u8_t *) &data, 0);
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/
void void
tr1001_set_speed(unsigned char speed) tr1001_set_speed(unsigned char speed)
{ {

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.6 2007/03/28 09:52:35 joxe Exp $ * @(#)$Id: tr1001.c,v 1.7 2007/08/07 11:11:20 nifi Exp $
*/ */
/** /**
* \addtogroup esb * \addtogroup esb
@ -52,9 +52,9 @@
#include "contiki-esb.h" #include "contiki-esb.h"
#include "dev/tr1001.h"
#include "lib/me.h" #include "lib/me.h"
#include "lib/crc16.h" #include "lib/crc16.h"
#include "net/tr1001-drv.h"
#include <io.h> #include <io.h>
#include <signal.h> #include <signal.h>
@ -112,7 +112,7 @@ struct tr1001_hdr {
#define OFF 0 #define OFF 0
#define ON 1 #define ON 1
static u8_t onoroff = ON; static u8_t onoroff = OFF;
#define NUM_SYNCHBYTES 4 #define NUM_SYNCHBYTES 4
@ -129,6 +129,7 @@ static struct pt rxhandler_pt;
static struct timer rxtimer; static struct timer rxtimer;
static unsigned short tmp_sstrength, sstrength; static unsigned short tmp_sstrength, sstrength;
static unsigned short tmp_count;
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
@ -138,13 +139,31 @@ static unsigned short tmp_sstrength, sstrength;
#define LOG(...) #define LOG(...)
#endif #endif
/*---------------------------------------------------------------------------*/
PROCESS(tr1001_process, "TR1001 driver");
/*---------------------------------------------------------------------------*/
static void (* receiver_callback)(const struct radio_driver *);
static void tr1001_set_receiver(void (* recv)(const struct radio_driver *));
static int tr1001_on(void);
static int tr1001_off(void);
const struct radio_driver tr1001_driver = {
tr1001_send,
tr1001_read,
tr1001_set_receiver,
tr1001_on,
tr1001_off
};
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#if TR1001_STATISTICS #if TR1001_STATISTICS
#define PACKET_DROPPED(bytes) do { \ #define PACKET_DROPPED() do { \
if(packets_err < ~0) {\ if(packets_err < ~0) {\
packets_err++;\ packets_err++;\
}\ }\
sstrength_dropped = ((bytes) == 0 ? 0 : ((tmp_sstrength / (bytes)) << 1));\ sstrength_dropped = (tmp_count ? ((tmp_sstrength / tmp_count) << 2) : 0);\
} while(0) } while(0)
#define PACKET_ACCEPTED() do {\ #define PACKET_ACCEPTED() do {\
if(packets_ok < ~0) {\ if(packets_ok < ~0) {\
@ -152,7 +171,7 @@ static unsigned short tmp_sstrength, sstrength;
}\ }\
} while(0); } while(0);
#else #else
#define PACKET_DROPPED(bytes) #define PACKET_DROPPED()
#define PACKET_ACCEPTED() #define PACKET_ACCEPTED()
#endif /* TR1001_STATISTICS */ #endif /* TR1001_STATISTICS */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -212,24 +231,37 @@ rxclear(void)
* Turn TR1001 radio transceiver off. * Turn TR1001 radio transceiver off.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void static int
radio_off(void) tr1001_off(void)
{ {
if(onoroff == OFF) {
return 1;
}
onoroff = OFF; onoroff = OFF;
rxoff(); rxoff();
rxclear(); rxclear();
ENERGEST_OFF(ENERGEST_TYPE_RECEIVE);
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* Turn TR1001 radio transceiver on. * Turn TR1001 radio transceiver on.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void static int
radio_on(void) tr1001_on(void)
{ {
if(onoroff == ON) {
return 1;
}
ENERGEST_ON(ENERGEST_TYPE_RECEIVE);
onoroff = ON; onoroff = ON;
rxon(); rxon();
rxclear(); rxclear();
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
@ -310,6 +342,12 @@ tr1001_set_txpower(unsigned char p)
P2OUT |= 0x40; /* P26 = 1 (chipselect off) */ P2OUT |= 0x40; /* P26 = 1 (chipselect off) */
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void
tr1001_set_receiver(void (* recv)(const struct radio_driver *))
{
receiver_callback = recv;
}
/*---------------------------------------------------------------------------*/
void void
tr1001_init(void) tr1001_init(void)
{ {
@ -322,6 +360,7 @@ tr1001_init(void)
sstrength_min = 0xFFFF; sstrength_min = 0xFFFF;
sstrength_max = 0; sstrength_max = 0;
#endif /* TR1001_STATISTICS */ #endif /* TR1001_STATISTICS */
onoroff = OFF;
UCTL0 = CHAR; /* 8-bit character */ UCTL0 = CHAR; /* 8-bit character */
UTCTL0 = SSEL1; /* UCLK = SMCLK */ UTCTL0 = SSEL1; /* UCLK = SMCLK */
@ -336,21 +375,24 @@ tr1001_init(void)
timer_set(&rxtimer, CLOCK_SECOND / 4); timer_set(&rxtimer, CLOCK_SECOND / 4);
radio_on(); tr1001_on();
tr1001_set_txpower(100); tr1001_set_txpower(100);
/* Reset reception state. */ /* Reset reception state. */
rxclear(); rxclear();
process_start(&tr1001_process, NULL);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
interrupt (UART0RX_VECTOR) interrupt (UART0RX_VECTOR)
tr1001_rxhandler(void) tr1001_rxhandler(void)
{ {
ENERGEST_ON(ENERGEST_TYPE_IRQ);
tr1001_default_rxhandler_pt(RXBUF0); tr1001_default_rxhandler_pt(RXBUF0);
if(tr1001_rxstate == RXSTATE_FULL) { if(tr1001_rxstate == RXSTATE_FULL) {
LPM_AWAKE(); LPM4_EXIT;
} }
ENERGEST_OFF(ENERGEST_TYPE_IRQ);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static void
@ -375,6 +417,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
if(tr1001_rxstate == RXSTATE_RECEVING) { if(tr1001_rxstate == RXSTATE_RECEVING) {
unsigned short signal = radio_sensor_signal; unsigned short signal = radio_sensor_signal;
tmp_sstrength += (signal >> 2); tmp_sstrength += (signal >> 2);
tmp_count++;
if(signal < tmp_sstrength_min) { if(signal < tmp_sstrength_min) {
tmp_sstrength_min = signal; tmp_sstrength_min = signal;
} }
@ -406,6 +449,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
/* Start signal strength measurement */ /* Start signal strength measurement */
tmp_sstrength = 0; tmp_sstrength = 0;
tmp_count = 0;
tmp_sstrength_max = 0; tmp_sstrength_max = 0;
tmp_sstrength_min = 0xFFFF; tmp_sstrength_min = 0xFFFF;
@ -423,7 +467,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
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);
PACKET_DROPPED(tmppos); PACKET_DROPPED();
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -435,7 +479,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
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);
PACKET_DROPPED(tmppos + 1); PACKET_DROPPED();
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -457,7 +501,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
/* If the length is longer than we can handle, we'll start from /* If the length is longer than we can handle, we'll start from
the beginning. */ the beginning. */
if(tmppos + tr1001_rxlen > sizeof(tr1001_rxbuf)) { if(tmppos + tr1001_rxlen > sizeof(tr1001_rxbuf)) {
PACKET_DROPPED(tmppos); PACKET_DROPPED();
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -469,7 +513,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char 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);
PACKET_DROPPED(tmppos); PACKET_DROPPED();
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -480,7 +524,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);
PACKET_DROPPED(tmppos + 1); PACKET_DROPPED();
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -496,7 +540,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
if(!me_valid(incoming_byte)) { if(!me_valid(incoming_byte)) {
beep_beep(1000); beep_beep(1000);
PACKET_DROPPED(tr1001_rxlen + TR1001_HDRLEN); PACKET_DROPPED();
PT_RESTART(&rxhandler_pt); PT_RESTART(&rxhandler_pt);
} }
@ -508,7 +552,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
request the driver to take care of the incoming data. */ request the driver to take care of the incoming data. */
PACKET_ACCEPTED(); PACKET_ACCEPTED();
tr1001_drv_request_poll(); process_poll(&tr1001_process);
/* We'll set the receive state flag to signal that a full frame /* We'll set the receive state flag to signal that a full frame
is present in the buffer, and we'll wait until the buffer has is present in the buffer, and we'll wait until the buffer has
@ -519,7 +563,7 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
} else { } else {
LOG("Incorrect CRC"); LOG("Incorrect CRC");
beep_beep(1000); beep_beep(1000);
PACKET_DROPPED(tr1001_rxlen + TR1001_HDRLEN); PACKET_DROPPED();
} }
} }
PT_END(&rxhandler_pt); PT_END(&rxhandler_pt);
@ -577,14 +621,16 @@ prepare_transmission(int synchbytes)
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
u8_t int
tr1001_send(u8_t *packet, u16_t len) tr1001_send(const u8_t *packet, u16_t len)
{ {
int i; int i;
u16_t crc16; u16_t crc16;
LOG("tr1001_send: sending %d bytes\n", len); LOG("tr1001_send: sending %d bytes\n", len);
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */ /* Prepare the transmission. */
prepare_transmission(NUM_SYNCHBYTES); prepare_transmission(NUM_SYNCHBYTES);
@ -620,11 +666,13 @@ tr1001_send(u8_t *packet, u16_t len)
rxclear(); rxclear();
} }
return UIP_FW_OK; ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned short u16_t
tr1001_poll(u8_t *buf, u16_t bufsize) tr1001_read(u8_t *buf, u16_t bufsize)
{ {
unsigned short tmplen; unsigned short tmplen;
@ -637,26 +685,48 @@ tr1001_poll(u8_t *buf, u16_t bufsize)
/* if(tmplen > UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN)) { /* if(tmplen > UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN)) {
tmplen = UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN); tmplen = UIP_BUFSIZE - (UIP_LLH_LEN - TR1001_HDRLEN);
}*/ }*/
if(tmplen > bufsize - TR1001_HDRLEN) { if(tmplen > bufsize) {
tmplen = bufsize - TR1001_HDRLEN; tmplen = bufsize;
} }
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_max = tmp_sstrength_max; sstrength_max = tmp_sstrength_max;
sstrength_min = tmp_sstrength_min; sstrength_min = tmp_sstrength_min;
rxclear(); rxclear();
LOG("tr1001_poll: got %d bytes\n", tmplen); LOG("tr1001_read: got %d bytes\n", tmplen);
return tmplen; return tmplen;
} }
return 0; return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
PROCESS_THREAD(tr1001_process, ev, data)
{
PROCESS_BEGIN();
/* Reset reception state now that the process is ready to receive data. */
rxclear();
while(1) {
PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL);
if(receiver_callback != NULL) {
receiver_callback(&tr1001_driver);
} else {
LOG("tr1001 has no receive function\n");
/* Perform a dummy read to drop the message. */
tr1001_read(&data, 0);
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/
void void
tr1001_set_speed(unsigned char speed) tr1001_set_speed(unsigned char speed)
{ {

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.h,v 1.4 2007/03/15 21:57:35 adamdunkels Exp $ * @(#)$Id: tr1001.h,v 1.5 2007/08/07 11:11:20 nifi Exp $
*/ */
#ifndef __TR1001_H__ #ifndef __TR1001_H__
#define __TR1001_H__ #define __TR1001_H__
@ -38,13 +38,18 @@
#include "contiki-conf.h" #include "contiki-conf.h"
/**
* Radio driver for TR1001
*/
extern const struct radio_driver tr1001_driver;
/** /**
* Initialize the radio tranciever. * Initialize the radio tranciever.
* *
* Turns on reception of bytes and installs the receive interrupt * Turns on reception of bytes and installs the receive interrupt
* handler. * handler.
*/ */
void tr1001_init(struct process *p); void tr1001_init();
/** /**
* Set the speed of the TR1001 radio device. * Set the speed of the TR1001 radio device.
@ -109,7 +114,7 @@ void tr1001_set_numrexmit(unsigned char acks);
* This function should normally not be called from user * This function should normally not be called from user
* programs. Rather, the uIP TCP/IP stack should be used. * programs. Rather, the uIP TCP/IP stack should be used.
*/ */
u8_t tr1001_send(u8_t *packet, u16_t len); int tr1001_send(const u8_t *packet, u16_t len);
/** /**
* Check if an incoming packet has been received. * Check if an incoming packet has been received.
@ -121,7 +126,7 @@ u8_t tr1001_send(u8_t *packet, u16_t len);
* \return The length of the received packet, or 0 if no packet has * \return The length of the received packet, or 0 if no packet has
* been received. * been received.
*/ */
unsigned short tr1001_poll(u8_t *buf, u16_t bufsize); u16_t tr1001_read(u8_t *buf, u16_t bufsize);
extern unsigned char tr1001_rxbuf[]; extern unsigned char tr1001_rxbuf[];
extern volatile unsigned char tr1001_rxstate; extern volatile unsigned char tr1001_rxstate;