TinyOS nesC myep3 - upgrade

<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
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值