module P2MM
{
uses interface Boot;
uses interface Timer<TMilli> as Timer0;
uses interface SplitControl as AMControl;
uses interface AMPacket;
uses interface AMSend;
uses interface Receive;
uses interface Packet;
}
implementation
{
typedef nx_struct P2MMsg {nx_uint16_t nodeid[3];nx_uint16_t num;nx_uint16_t counter;}P2MMsg;
uint8_t counter=0;
bool busy =FALSE;
message_t pkt;
task void test() { }
/**********************************************
* 函数名:booted()
* 功 能:系统启动完毕后自动触发
* 参 数:无
***********************************************/
event void Boot.booted()
{
call AMControl.start();
}
/**********************************************
* 函数名:fired()
* 功 能:定时器触发事件
* 参 数:无
***********************************************/
event void Timer0.fired()
{
counter++;
if (!busy)
{
P2MMsg* btrpkt = (P2MMsg*)(call Packet.getPayload(&pkt, sizeof(P2MMsg)));
btrpkt->num=0;
btrpkt->nodeid[btrpkt->num] = TOS_NODE_ID;
btrpkt->counter = counter;
call AMPacket.setGroup(&pkt,TOS_IEEE_GROUP);
if (call AMSend.send(0xFFFF, &pkt, sizeof(P2MMsg)) == SUCCESS)
busy = TRUE;
}
}
/**********************************************
* 函数名:startDone(error_t err)
* 功 能:SplitControl控制启动完成事件
* 参 数:error_t err
***********************************************/
event void AMControl.startDone(error_t err)
{
if(err==SUCCESS)
{
if(TOS_NODE_ID!=0x1)
call Timer0.startPeriodic(1000);
}
else
call AMControl.start();
}
/**********************************************
* 函数名:sendDone(message_t* msg, error_t erro)
* 功 能:AM消息发送完毕事件
* 参 数:message_t* msg, error_t erro
***********************************************/
event void AMSend.sendDone(message_t* msg, error_t erro)
{
if (&pkt == msg)
busy = FALSE;
}
/**********************************************
* 函数名:receive(message_t* msg, void* payload, uint8_t len)
* 功 能:Receive接收事件
* 参 数:message_t* msg, void* payload, uint8_t len
***********************************************/
event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len)
{
if (len == sizeof(P2MMsg))
{
P2MMsg* btrpkt = (P2MMsg*)payload;
DbgOut(9,"Data is %d,Start is %d,Other is %d,%d\r\n",(uint16_t)btrpkt->counter,
(uint16_t)btrpkt->nodeid[0],(uint16_t)btrpkt->nodeid[1],(uint16_t)btrpkt->nodeid[2]);
btrpkt->num++;
if(TOS_NODE_ID!=0x1){
if(btrpkt->num<3){
bool flag=TRUE;
uint16_t i;
for(i=0;i<btrpkt->num;i++){
if(btrpkt->nodeid[i] == TOS_NODE_ID)
flag=FALSE;
}
if(flag){
btrpkt->nodeid[btrpkt->num] = TOS_NODE_ID;
call AMSend.send(0xFFFF, msg, sizeof(P2MMsg));
}
}
}
}
}
event void AMControl.stopDone(error_t err) { }
}
configuration P2MC {}
#define AM_DATA_TYPE 123
implementation
{
components P2MM as App;
components MainC;
App.Boot ->MainC;
components ActiveMessageC as AM; //消息组件
App.Packet -> AM.Packet;
App.AMPacket -> AM.AMPacket;
App.AMSend -> AM.AMSend[AM_DATA_TYPE];
App.Receive -> AM.Receive[AM_DATA_TYPE];
App.AMControl -> AM.SplitControl;
components new TimerMilliC () as Timer0;
App.Timer0 ->Timer0;
}
COMPONENT= P2MC
PFLAGS += -DUART_DEBUG
PFLAGS += -DUART_BAUDRATE=9600
include $(MAKERULES)
好课程内容。