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

网络

开发平台:

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.     interface SetDrand;
  22. #endif
  23.     interface SetDrand;
  24.     async command result_t ResetPower();
  25.     async command result_t ResetDataSent();
  26.     async command uint16_t GetPower_tx();
  27.     async command uint16_t GetDataSent();
  28.     async command uint16_t GetPower_sp();
  29.     async command uint16_t GetPower_rx();
  30.   }
  31. }
  32. implementation {
  33. #ifdef APP_DEBUG
  34. #include "SODebug.h"
  35. #endif
  36.   TOS_Msg DataPkt;
  37.   uint16_t Rcount;
  38.   uint16_t Scount;
  39.   uint16_t time;
  40.   bool txBusy, gotFrames, startSender;
  41.   uint8_t eachCount[MAX_NODES];
  42.   /*********** StdControl Interface ************/
  43.   command result_t StdControl.init(){
  44.     uint8_t i;
  45.     Rcount = 0;
  46.     Scount = 0;
  47.     call ResetDataSent();
  48.     call ResetPower();
  49.     for(i = 0; i < MAX_NODES; i++)
  50.       eachCount[i] = 0;
  51.     txBusy = startSender = FALSE;
  52. #ifdef APP_DEBUG
  53.     init_debug();
  54. #endif
  55. #ifdef DRAND_ENABLE
  56.     call SubControl.init();
  57.     gotFrames = FALSE;
  58. #else
  59.     gotFrames = TRUE;
  60. #endif
  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.     uint8_t i;
  117.     time++;
  118.     for(i = 0; i < MAX_NODES; i++){
  119.       if(eachCount[i] != 0)
  120.         SODbg(DBG_USR2, "      %u : %un", (uint8_t) i, (uint16_t) eachCount[i]);
  121.     }
  122.     SODbg(DBG_USR2, "Rcount %u Scount %u EnergyTX %u EnergyRX %u EnergySP %un",
  123.           Rcount, call GetDataSent(), call GetPower_tx(), call GetPower_rx(), call GetPower_sp());
  124.     Rcount = 0;
  125.     Scount = 0;
  126.     call ResetPower();
  127.     call ResetDataSent();
  128.     for(i = 0; i < MAX_NODES; i++)
  129.       eachCount[i] = 0;
  130.     return SUCCESS;
  131.   }
  132.   event result_t RouteTimer.fired(){ // routes should be set up by now
  133. #ifdef DRAND_ENABLE
  134.     call StatTimer.start(TIMER_ONE_SHOT, DRAND_TIME);
  135.     call SubControl.start(); // so start drand
  136. #else
  137.     switch(TOS_LOCAL_ADDRESS){
  138.     case 0: // sink node
  139. #ifndef BMAC_ENABLE
  140.       call SetDrand.Set(NULL, 0, NULL, 50);
  141. #endif
  142.       break;
  143.       // fall through for rest of the nodes
  144.       //********************************************
  145.     case 21:
  146.     case 22:
  147.     case 37:
  148.     case 38:
  149.     case 31:
  150.     case 32:
  151.     case 15:
  152.     case 17:
  153.     case 40:
  154.     case 41:
  155.     case 42:
  156.     case 43:
  157.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  158. #ifndef BMAC_ENABLE
  159.       call SetDrand.Set(NULL, 0, NULL, 50);
  160. #endif
  161.       break;
  162.       //********************************************
  163.     case 2:
  164.     case 3:
  165.     case 9:
  166.     case 10:
  167.     case 39:
  168.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  169. #ifndef BMAC_ENABLE
  170.       call SetDrand.Set(NULL, 38, NULL, 50);
  171. #endif
  172.       break;
  173.       //********************************************
  174.     case 24:
  175.     case 27:
  176.     case 28:
  177.     case 8:
  178.     case 20:
  179.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  180. #ifndef BMAC_ENABLE
  181.       call SetDrand.Set(NULL, 1, NULL, 50);
  182. #endif
  183.       break;
  184.       //********************************************
  185.     case 1:
  186.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  187. #ifndef BMAC_ENABLE
  188.       call SetDrand.Set(NULL, 10, NULL, 50);
  189. #endif
  190.       break;
  191.       //********************************************
  192.     case 5:
  193.     case 14:
  194.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  195. #ifndef BMAC_ENABLE
  196.       call SetDrand.Set(NULL, 42, NULL, 50);
  197. #endif
  198.       break;
  199.       //********************************************
  200.     case 18:
  201.     case 19:
  202.       call SendTimer.start(TIMER_REPEAT, SEND_RATE);
  203. #ifndef BMAC_ENABLE
  204.       call SetDrand.Set(NULL, 43, NULL, 50);
  205. #endif
  206.       break;
  207.     }
  208.     call StatTimer.start(TIMER_REPEAT, STAT_TIME);
  209. #endif
  210. #ifdef APP_SEND_DEBUG
  211.     //    SODbg(DBG_USR2, "Routing finished with parent = %u!n", call RouteControl.getParent());
  212. #endif
  213.     return SUCCESS;
  214.   }
  215. #ifdef DRAND_ENABLE
  216.   async event void Drand.gotFrame(){ // Drand over, start sending !!
  217. #ifdef APP_DEBUG
  218.     nodeInfo *nbrInfo, *myInfo;
  219.     uint8_t i;
  220.     nbrInfo = call Drand.getNeighborInfo();
  221.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  222.       if(nbrInfo[i].bitMap & ONE_HOP){
  223.         SODbg(DBG_USR2, "OneHopNodeID(FRAME) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  224.               nbrInfo[i].frame);
  225.       } else if(nbrInfo[i].bitMap & TWO_HOP){
  226.         SODbg(DBG_USR2, "TwoHopNodeID(FRAME) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  227.               nbrInfo[i].frame);
  228.       }
  229.     myInfo = call Drand.getMyInfo();
  230.     SODbg(DBG_USR2, "MyInfo(FRAME) : %u  %u  %un", myInfo->nodeID, myInfo->slot, myInfo->frame);
  231.     SODbg(DBG_USR2, "Parent = %un", call RouteControl.getParent());
  232. #endif
  233.     gotFrames = TRUE;
  234.     call SetDrand.Set(call Drand.getMyInfo(), call RouteControl.getParent(), call Drand.getNeighborInfo(),
  235.                       50);
  236.   }
  237.   async event void Drand.helloOver(){}
  238. #endif
  239. }//end of implementation