#include "AM.h"
#include "Serial.h"
-module BaseStationP {
+module BaseStationP @safe() {
uses {
interface Boot;
interface SplitControl as SerialControl;
interface AMSend as RadioSend[am_id_t id];
interface Receive as RadioReceive[am_id_t id];
+ interface Receive as RadioSnoop[am_id_t id];
interface Packet as RadioPacket;
interface AMPacket as RadioAMPacket;
};
message_t uartQueueBufs[UART_QUEUE_LEN];
- message_t *uartQueue[UART_QUEUE_LEN];
+ message_t * ONE_NOK uartQueue[UART_QUEUE_LEN];
uint8_t uartIn, uartOut;
bool uartBusy, uartFull;
message_t radioQueueBufs[RADIO_QUEUE_LEN];
- message_t *radioQueue[RADIO_QUEUE_LEN];
+ message_t * ONE_NOK radioQueue[RADIO_QUEUE_LEN];
uint8_t radioIn, radioOut;
bool radioBusy, radioFull;
event void RadioControl.stopDone(error_t error) {}
uint8_t count = 0;
+
+ message_t* ONE receive(message_t* ONE msg, void* payload, uint8_t len);
+
+ event message_t *RadioSnoop.receive[am_id_t id](message_t *msg,
+ void *payload,
+ uint8_t len) {
+ return receive(msg, payload, len);
+ }
+
event message_t *RadioReceive.receive[am_id_t id](message_t *msg,
void *payload,
uint8_t len) {
+ return receive(msg, payload, len);
+ }
+
+ message_t* receive(message_t *msg, void *payload, uint8_t len) {
message_t *ret = msg;
atomic {
task void uartSendTask() {
uint8_t len;
am_id_t id;
- am_addr_t addr;
+ am_addr_t addr, src;
message_t* msg;
atomic
if (uartIn == uartOut && !uartFull)
tmpLen = len = call RadioPacket.payloadLength(msg);
id = call RadioAMPacket.type(msg);
addr = call RadioAMPacket.destination(msg);
+ src = call RadioAMPacket.source(msg);
+ call UartPacket.clear(msg);
+ call UartAMPacket.setSource(msg, src);
if (call UartSend.send[id](addr, uartQueue[uartOut], len) == SUCCESS)
call Leds.led1Toggle();
task void radioSendTask() {
uint8_t len;
am_id_t id;
- am_addr_t addr;
+ am_addr_t addr,source;
message_t* msg;
atomic
msg = radioQueue[radioOut];
len = call UartPacket.payloadLength(msg);
addr = call UartAMPacket.destination(msg);
+ source = call UartAMPacket.source(msg);
id = call UartAMPacket.type(msg);
+
+ call RadioPacket.clear(msg);
+ call RadioAMPacket.setSource(msg, source);
+
if (call RadioSend.send[id](addr, msg, len) == SUCCESS)
call Leds.led0Toggle();
else