<pre name="code" class="cpp">#include <Timer.h>
#include "BlinkToRadio.h"
#include "pr.h"
module BlinkToRadioC {
uses interface Boot;
#if (MOTE_ID == 1)
uses interface Leds;
#endif
#if (MOTE_ID != 1)
uses interface Timer<TMilli> as Timer0;
#endif
uses interface Packet;
uses interface AMPacket;
#if (MOTE_ID != 1)
uses interface AMSend;
#else
uses interface Receive;
#endif
uses interface SplitControl as AMControl;
} implementation {
message_t pkt;
bool busy = FALSE;
event void Boot.booted() {
call AMControl.start();
}
event void AMControl.startDone(error_t err) {
if (err == SUCCESS) {
#if (MOTE_ID != 1)
call Timer0.startPeriodic(TIMER_PERIOD_MILLI);
#endif
pr("start done\n");
}
else {
call AMControl.start();
}
}
event void AMControl.stopDone(error_t err) {
pr("stop done\n");
}
#if (MOTE_ID != 1)
event void Timer0.fired() {
static uint16_t counter = 0;
if (!busy) {
PayloadMsg * pPM =
(PayloadMsg *)(call Packet.getPayload(&pkt, sizeof (PayloadMsg)));
if (pPM == NULL) {
pr("can not creatbtr\n");
return;
}
pPM->nodeId = TOS_NODE_ID;
pPM->counter = counter;
if (call AMSend.send(1, &pkt, sizeof (PayloadMsg)) == SUCCESS) {
pr("call send\n");
busy = TRUE;
}
}
counter++;
}
#endif
#if (MOTE_ID != 1)
event void AMSend.sendDone(message_t * pMsg, error_t err) {
if (&pkt == pMsg) {
busy = FALSE;
}
}
#endif
#if (MOTE_ID == 1)
event message_t * Receive.receive(message_t * pMsg, void * pPayload, uint8_t payloadLen) {
static uint8_t lock2 = 0, lock3 = 0; //state start with unlock; it doesn't support bit type
static uint8_t isFirstPkt2 = 1, isFirstPkt3 = 1; //special judge
static uint16_t dataBuf = 0;
static uint8_t periodId = 0;
pr("in receive\n");
if (payloadLen == sizeof (PayloadMsg)) { //payload is not missed
am_addr_t srcAddr = call AMPacket.source(pMsg);
PayloadMsg * pPM = (PayloadMsg *)pPayload;
if (srcAddr == 2) {
if (pPM->counter == 0 && isFirstPkt2 == 0) {
lock2 = !lock2;
}
if (lock2 == 0) { //reset LEDBuff only when lock2 is unlocked
dataBuf = pPM->counter;
if (periodId == 0) {
call Leds.set(dataBuf);
}
}
pr("receive from nodeid: %d, %d\n", pPM->nodeId, pPM->counter);
} else if (srcAddr == 3) {
if (pPM->counter == 0 && isFirstPkt3 == 0) {
lock3 = !lock3;
}
if (lock3 == 0) {
if (pPM->counter & 1) {
periodId = 1;
call Leds.set(0);
} else {
periodId = 0;
call Leds.set(dataBuf);
}
}
pr("receive from nodeid: %d, %d\n", pPM->nodeId, pPM->counter);
}
isFirstPkt2 = 0;
isFirstPkt3 = 0;
}
return pMsg;
}
#endif
}