MultiHopTtestM.nc
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:6k
源码类别:

网络

开发平台:

Others

  1. includes MultiHopTtestMSG;
  2. includes DrandInfo;
  3. module MultiHopTtestM {
  4.   provides {
  5.     interface StdControl;
  6.   }
  7.   uses {
  8. #ifdef DRAND_ENABLE
  9.     interface StdControl as SubControl;
  10. #endif
  11.     interface Send;
  12.     interface Intercept;
  13.     interface Random;
  14.     interface Timer as RouteTimer;
  15.     interface Timer as StatTimer;
  16.     interface Timer as SendTimer;
  17.     interface RouteControl;
  18.     interface CC1000Control as RFset;
  19. #ifdef DRAND_ENABLE
  20.     interface Drand;
  21. #endif
  22.     interface SetDrand;
  23.     async command result_t ResetPower();
  24.     async command result_t ResetDataSent();
  25.     async command uint16_t GetPower_tx();
  26.     async command uint16_t GetDataSent();
  27.     async command uint16_t GetPower_sp();
  28.     async command uint16_t GetPower_rx();
  29.   }
  30. }
  31. implementation {
  32. #ifdef APP_DEBUG
  33. #include "SODebug.h"
  34. #endif
  35.   TOS_Msg DataPkt;
  36.   uint16_t Rcount;
  37.   uint16_t Scount;
  38.   uint16_t time;
  39.   bool txBusy, gotFrames, startSender, drandFirstTime;
  40.   uint8_t eachCount[MAX_NODES];
  41.   /*********** StdControl Interface ************/
  42.   command result_t StdControl.init(){
  43.     uint8_t i;
  44.     Rcount = 0;
  45.     Scount = 0;
  46.     call ResetDataSent();
  47.     call ResetPower();
  48.     for(i = 0; i < MAX_NODES; i++)
  49.       eachCount[i] = 0;
  50.     txBusy = startSender = FALSE;
  51. #ifdef APP_DEBUG
  52.     init_debug();
  53. #endif
  54. #ifdef DRAND_ENABLE
  55.     call SubControl.init();
  56.     gotFrames = FALSE;
  57. #else
  58.     gotFrames = TRUE;
  59. #endif
  60.     drandFirstTime = FALSE;
  61.     call Random.init();
  62.     return SUCCESS;
  63.   }
  64.   command result_t StdControl.start(){
  65.     uint16_t len;
  66.     multiHopMsg *multiHopMsgData = (multiHopMsg*) (call Send.getBuffer(&DataPkt, &len));
  67.     multiHopMsgData->sendID = TOS_LOCAL_ADDRESS;
  68.     call RFset.SetRFPower(255); //lowest 1~0xFF highest
  69.     call RouteTimer.start(TIMER_ONE_SHOT, (call Random.rand()) % ROUTE_TIME);
  70.     return SUCCESS;
  71.   }
  72.   
  73.   command result_t StdControl.stop(){
  74.     call RouteTimer.stop();
  75.     call StatTimer.stop();
  76.     call SendTimer.stop();
  77. #ifdef DRAND_ENABLE
  78.     call SubControl.stop();
  79. #endif
  80.     return SUCCESS;
  81.   }
  82.   event result_t Send.sendDone(TOS_MsgPtr msg, result_t success){
  83.     if(success == SUCCESS){
  84. #ifdef APP_SEND_DEBUG
  85.       SODbg(DBG_USR2, "Sent packet to address %un", call RouteControl.getParent());
  86. #endif
  87.       Scount++;
  88.     }
  89.     txBusy = FALSE;
  90.     return SUCCESS;
  91.   }
  92.   event result_t Intercept.intercept(TOS_MsgPtr m, void* payload, uint16_t payloadLen){
  93.     multiHopMsg *hData = (multiHopMsg*)payload;
  94.     if(hData->sendID < MAX_NODES){
  95.       eachCount[hData->sendID]++;
  96.       Rcount++;
  97.     }
  98.     return SUCCESS;
  99.   }
  100.   event result_t SendTimer.fired(){
  101.     if(!txBusy && gotFrames){
  102.       if(call Send.send(&DataPkt, sizeof(multiHopMsg)) == SUCCESS){
  103. #ifdef APP_SEND_DEBUG
  104.         SODbg(DBG_USR2, "Scheduled sending packet # %u for %u secondsn", Scount, time);
  105. #endif
  106.         txBusy = TRUE;
  107.       } else{
  108. #ifdef APP_SEND_DEBUG
  109.         SODbg(DBG_USR2, "Send Failed !!n");
  110. #endif
  111.       }
  112.     }
  113.     return SUCCESS;
  114.   }
  115.   event result_t StatTimer.fired(){
  116.     if(!drandFirstTime && gotFrames){
  117.       uint8_t i;
  118.       time++;
  119.       for(i = 0; i < MAX_NODES; i++){
  120.         if(eachCount[i] != 0)
  121.           SODbg(DBG_USR2, "      %u : %un", (uint8_t) i, (uint16_t) eachCount[i]);
  122.       }
  123.       SODbg(DBG_USR2, "Rcount %u Scount %u EnergyTX %u EnergyRX %u EnergySP %un",
  124.             Rcount, call GetDataSent(), call GetPower_tx(), call GetPower_rx(), call GetPower_sp());
  125.       Rcount = 0;
  126.       Scount = 0;
  127.       call ResetPower();
  128.       call ResetDataSent();
  129.       for(i = 0; i < MAX_NODES; i++)
  130.         eachCount[i] = 0;
  131.     } else if(drandFirstTime && gotFrames){ // drand just finished, start sending
  132.       if(TOS_LOCAL_ADDRESS != 0){
  133.         call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  134.       }
  135.       call StatTimer.start(TIMER_REPEAT, STAT_TIME);
  136.       drandFirstTime = FALSE;
  137.     }
  138.     return SUCCESS;
  139.   }
  140.   event result_t RouteTimer.fired(){ // routes should be set up by now
  141. #ifdef DRAND_ENABLE // wait for drand
  142.     call StatTimer.start(TIMER_ONE_SHOT, DRAND_TIME);
  143.     call SubControl.start(); // so start drand
  144.     drandFirstTime = TRUE;
  145. #else // start sending at once
  146.     drandFirstTime = FALSE;
  147.     if(TOS_LOCAL_ADDRESS == 0){
  148.       call SetDrand.Set(NULL, 0, NULL, 50);
  149.     } else{
  150.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  151.       call SetDrand.Set(NULL, call RouteControl.getParent(), NULL, 50);
  152.     }
  153.     call StatTimer.start(TIMER_REPEAT, STAT_TIME);
  154. #endif
  155. #ifdef APP_SEND_DEBUG
  156.     SODbg(DBG_USR2, "Routing finished with parent = %u!n", call RouteControl.getParent());
  157. #endif
  158.     return SUCCESS;
  159.   }
  160. #ifdef DRAND_ENABLE
  161.   async event void Drand.gotFrame(){ // Drand over, start sending !!
  162. #ifdef APP_DEBUG
  163.     nodeInfo *nbrInfo, *myInfo;
  164.     uint8_t i;
  165.     nbrInfo = call Drand.getNeighborInfo();
  166.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  167.       if(nbrInfo[i].bitMap & ONE_HOP){
  168.         SODbg(DBG_USR2, "OneHopNodeID(FRAME) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  169.               nbrInfo[i].frame);
  170.       } else if(nbrInfo[i].bitMap & TWO_HOP){
  171.         SODbg(DBG_USR2, "TwoHopNodeID(FRAME) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  172.               nbrInfo[i].frame);
  173.       }
  174.     myInfo = call Drand.getMyInfo();
  175.     SODbg(DBG_USR2, "MyInfo(FRAME) : %u  %u  %un", myInfo->nodeID, myInfo->slot, myInfo->frame);
  176.     SODbg(DBG_USR2, "Parent = %un", call RouteControl.getParent());
  177. #endif
  178.     gotFrames = TRUE;
  179.     call SetDrand.Set(call Drand.getMyInfo(), call RouteControl.getParent(),
  180.                       call Drand.getNeighborInfo(), 50);
  181.   }
  182.   async event void Drand.helloOver(){}
  183. #endif
  184. }//end of implementation