zoukankan      html  css  js  c++  java
  • 第七次实验:CC2530平台上多跳通信的TinyOS编程

    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 ",(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)

    好课程内容。

  • 相关阅读:
    逆向初级-win32(四)
    逆向初级-C++(三)
    逆向初级-C语言(二)
    逆向初级-汇编(一)
    Kimabll数仓架构下如何确定模型落地哪些表
    浅谈数据仓库设计
    (转)Go语言的%d,%p,%v等占位符的使用
    (转)深入MySQL源码 学习方法 何登成专家
    (转)浅析MySQL二段锁
    (转)MySQL:为什么无法KILL在processlist中的语句
  • 原文地址:https://www.cnblogs.com/LeonNchu/p/10695795.html
Copyright © 2011-2022 走看看