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

网络

开发平台:

Others

  1. includes DrandInfo;
  2. module DrandM {
  3.   provides {    
  4.     interface StdControl;
  5.     interface Drand;
  6.   }
  7.   uses {
  8.     interface SendMsg as SendHelloMsg;
  9.     interface SendMsg as SendRequestMsg;
  10.     interface SendMsg as SendRejectMsg;
  11.     interface SendMsg as SendReleaseMsg;
  12.     interface SendMsg as SendTwoHopMsg;
  13.     interface SendMsg as SendGrantMsg;
  14.     interface SendMsg as SendReportMsg;
  15.     interface SendMsg as SendFrameMsg;
  16.     interface ReceiveMsg as ReceiveHelloMsg;
  17.     interface ReceiveMsg as ReceiveRequestMsg;
  18.     interface ReceiveMsg as ReceiveRejectMsg;
  19.     interface ReceiveMsg as ReceiveReleaseMsg;
  20.     interface ReceiveMsg as ReceiveTwoHopMsg;
  21.     interface ReceiveMsg as ReceiveGrantMsg;
  22.     interface ReceiveMsg as ReceiveReportMsg;
  23.     interface ReceiveMsg as ReceiveFrameMsg;
  24. #ifdef LDEBUG    
  25.     interface Leds;
  26. #endif
  27.     interface Timer as roundTimer;
  28.     interface Timer as reXTimer;
  29.     interface Timer as drandRoundTimer;
  30.     interface SClock;
  31.   }
  32. }
  33. implementation {
  34. #include "DrandMSG.h"
  35. #ifdef DEBUG
  36. #include "SODebug.h"
  37. #endif
  38.   struct TOS_Msg DataPkt;
  39.   uint8_t globalState; // global state
  40.   bool setMySlot, gotAllFrames;
  41.   uint8_t OneWayId[MAX_NBR]; // hello world variables
  42.   uint8_t TwoWayId[MAX_NBR];
  43.   
  44.   nodeInfo nbrInfo[MAX_NBR], myInfo;
  45.   uint8_t requestFireCount, grantFireCount, frameFireCount, reportFireCount;
  46.   uint16_t OTT, ROUND_TIME, REQUEST_TIME, GRANT_TIME; // timer variables
  47.   GTime requestStartTime, locTime, drandStartTime, drandRunTime;
  48.   uint16_t shiftReg, mask;
  49. #ifdef DEBUG
  50.   GTime roundStartTime;   //variables for debugging
  51.   uint8_t reqCount, graCount, rejCount, relCount, twoCount, reqXCount, graXCount ;
  52.   bool reqX, graX;
  53.   uint8_t roundNum;
  54. #endif
  55.   bool sendBusy, drandFinishedFirstTime, reportFinishedFirstTime, sentRelease, firstGrant;
  56.   uint8_t lastReqID;
  57.   GTime timeDiff(GTime A, GTime B){ // returns A-B
  58.     GTime diff;
  59.     if(A.sticks >= B.sticks){
  60.       diff.mticks = (A.mticks - B.mticks);//*568.88;    //ms
  61.       diff.sticks = (A.sticks - B.sticks);//*0.00868;    //ms
  62.     }
  63.     else{
  64.       uint32_t temp = 65536;
  65.       diff.mticks = (A.mticks - 1 - B.mticks);//*568.88;    //ms
  66.       diff.sticks = ((uint16_t)(temp + A.sticks - B.sticks));//*0.00868);
  67.     }
  68.     return diff;
  69.   }
  70. #ifdef DEBUG
  71.   void printState(){
  72.     SODbg(DBG_USR2, "ID:%u,ST:%u,R:%u,L:%un", TOS_LOCAL_ADDRESS, globalState, roundNum, lastReqID);
  73.   }
  74.   void printMsg(TOS_MsgPtr msg){
  75.     requestMsg *reqPtr = (requestMsg *) msg->data;
  76.     switch(msg->type){
  77.     case AM_GRANT:
  78.       SODbg(DBG_USR2, "MT: Grantn");
  79.       break;
  80.     case AM_REQUEST:
  81.       SODbg(DBG_USR2, "MT: Requestn");
  82.       break;
  83.     case AM_RELEASE:
  84.       SODbg(DBG_USR2, "MT: Releasen");
  85.       break;
  86.     case AM_REJECT:
  87.       SODbg(DBG_USR2, "MT: Rejectn");
  88.       break;
  89.     case AM_TWOHOP:
  90.       SODbg(DBG_USR2, "MT: 2 Hop Reln");
  91.       break;
  92.     }
  93.     SODbg(DBG_USR2, "SID:%u,SS:%u,LID:%u,RD:%un", reqPtr->sendID, reqPtr->myState, reqPtr->lastRequestID,
  94.           reqPtr->roundNum);
  95.   }
  96.   void printNbrInfo(){
  97.     uint8_t i;
  98.     SODbg(DBG_USR2, "*******************************************************n");
  99.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++){
  100.       switch(globalState){
  101.       case IDLE_STATE2:
  102.         if(nbrInfo[i].bitMap & ONE_HOP){
  103.           SODbg(DBG_USR2, "OneHopNodeID(HELLO) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  104.                 nbrInfo[i].frame);
  105.         } else if(nbrInfo[i].bitMap & TWO_HOP){
  106.           SODbg(DBG_USR2, "TwoHopNodeID(HELLO) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  107.                 nbrInfo[i].frame);
  108.         }
  109.         break;
  110.       case RELEASE_STATE:
  111.         if(nbrInfo[i].bitMap & ONE_HOP){
  112.           SODbg(DBG_USR2, "OneHopNodeID(DRAND) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  113.                 nbrInfo[i].frame);
  114.         } else if(nbrInfo[i].bitMap & TWO_HOP){
  115.           SODbg(DBG_USR2, "TwoHopNodeID(DRAND) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  116.                 nbrInfo[i].frame);
  117.         }
  118.         break;
  119.       case FRAME_STATE:
  120.         if(nbrInfo[i].bitMap & ONE_HOP){
  121.           SODbg(DBG_USR2, "OneHopNodeID(FRAME) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  122.                 nbrInfo[i].frame);
  123.         } else if(nbrInfo[i].bitMap & TWO_HOP){
  124.           SODbg(DBG_USR2, "TwoHopNodeID(FRAME) : %u  %u  %un", nbrInfo[i].nodeID, nbrInfo[i].slot,
  125.                 nbrInfo[i].frame);
  126.         }
  127.         break;
  128.       }
  129.     }
  130.     SODbg(DBG_USR2, "*******************************************************n");
  131.   }
  132.   void timeCheck() {
  133.     GTime roundTime;
  134.     call SClock.getTime(&locTime);
  135.     drandRunTime = timeDiff(locTime, drandStartTime);
  136.     roundTime = timeDiff(locTime, roundStartTime);
  137.     
  138.     SODbg(DBG_USR2, "MESSAGE sID %u mCt %u rReq %u rGra %u mTime %u sTime %un", 
  139.           TOS_LOCAL_ADDRESS, (reqCount+graCount+rejCount+relCount+twoCount), reqXCount,
  140.           graXCount, (uint16_t) drandRunTime.mticks, (uint16_t) drandRunTime.sticks);
  141.     SODbg(DBG_USR2, "MESSAGE sID %u reqCt %u graCt %u rejCt %u relCt %u twoCt %un",
  142.           TOS_LOCAL_ADDRESS, reqCount, graCount, rejCount, relCount, twoCount);
  143.     SODbg(DBG_USR2, "MESSAGE sID %u Round %u slotNum %u mRound %u sRound %un",
  144.           TOS_LOCAL_ADDRESS, roundNum, myInfo.slot, roundTime.mticks, roundTime.sticks);
  145.     //}
  146.   }
  147. #endif
  148. #ifdef LDEBUG
  149.   void printLED(){
  150.     switch(globalState){
  151.     case IDLE_STATE2:
  152.       call Leds.yellowOff();
  153.       call Leds.greenOff();
  154.       call Leds.redOn();
  155.       break;
  156.     case REQUEST_STATE:
  157.       call Leds.yellowOff();
  158.       call Leds.greenOn();
  159.       call Leds.redOff();
  160.       break;
  161.     case RELEASE_STATE:
  162.       call Leds.yellowOn();
  163.       call Leds.greenOff();
  164.       call Leds.redOff();
  165.       break;
  166.     case GRANT_STATE:
  167.       call Leds.yellowOn();
  168.       call Leds.greenOn();
  169.       call Leds.redOn();
  170.       break;
  171.     }
  172.   }
  173. #endif
  174.   uint64_t Max(uint16_t v1, uint16_t v2){
  175.     if(v1 >= v2)
  176.       return v1;
  177.     else
  178.       return v2;
  179.   }
  180.   uint64_t Min(uint16_t v1, uint16_t v2){
  181.     if(v1 <= v2)
  182.       return v1;
  183.     else
  184.       return v2;
  185.   }
  186.   int isPresentHelloID(uint8_t node, uint8_t *array, uint8_t max){
  187.     // return -1 if not found, else return position
  188.     uint8_t i;
  189.     for(i = 0; i < max; i++)
  190.       if(array[i] == node)
  191.         return i;
  192.     return -1;
  193.   }
  194.   bool checkForRetransGrant(requestMsg *reqMsgPtr){
  195.     if(isPresentHelloID(TOS_LOCAL_ADDRESS, reqMsgPtr->idMap, MAX_NBR) == -1){
  196.       return FALSE;
  197.     }
  198.     else
  199.       return TRUE;
  200.   }
  201.   bool checkForRetransReport(){
  202.     uint8_t i;
  203.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  204.       if(nbrInfo[i].slot == 0xFF){
  205. #ifdef REPORT_DEBUG
  206.         SODbg(DBG_USR2, "Need to retransmit for node %un", nbrInfo[i].nodeID);
  207. #endif
  208.         return TRUE;
  209.       }
  210.     return FALSE;
  211.   }
  212.   bool checkForRetransFrame(){
  213.     uint8_t i;
  214.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  215.       if(nbrInfo[i].frame == 0xFF){
  216. #ifdef FRAME_DEBUG
  217.         SODbg(DBG_USR2, "CheckForRetransmitFrame: Need to retransmit for node %un", nbrInfo[i].nodeID);
  218. #endif
  219.         return TRUE;
  220.       }
  221.     return FALSE;
  222.   }
  223.   uint8_t getMaxSlot(){
  224.     uint8_t i, maxSlot = myInfo.slot;
  225.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  226.       if(nbrInfo[i].slot > maxSlot)
  227.         maxSlot = nbrInfo[i].slot;
  228.     return maxSlot;
  229.   }
  230.   void addNode(uint8_t nodeID, uint8_t type){
  231.     uint8_t i;
  232.     if((nodeID == TOS_LOCAL_ADDRESS) || (nodeID == 0xFF)) return;
  233.     atomic{
  234.       for(i = 0;(i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF) && (nbrInfo[i].nodeID != nodeID); i++);
  235.       if (i == MAX_NBR){
  236. #ifdef DEBUG
  237.         SODbg( DBG_USR2, "addNode: No space to add noden");
  238. #endif
  239.       } else if (nbrInfo[i].nodeID != nodeID){
  240.         nbrInfo[i].nodeID = nodeID;
  241.         nbrInfo[i].bitMap = type;
  242.         nbrInfo[i].slot = 0xFF;
  243.         nbrInfo[i].frame = 0xFF;
  244.       }
  245.     }
  246.   }
  247.   void removeNode(uint8_t nodeID, uint8_t type){
  248.     uint8_t i;
  249.     atomic{
  250.       for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF) && (nbrInfo[i].nodeID != nodeID); i++);
  251.       if((i != MAX_NBR) && (nbrInfo[i].nodeID == nodeID) && (nbrInfo[i].bitMap & type)){
  252.         for (;i < MAX_NBR - 1; i++)
  253.           nbrInfo[i] = nbrInfo[i+1];
  254.         nbrInfo[MAX_NBR - 1].nodeID = 0xFF;
  255.       }
  256.     }
  257.   }
  258.   void initializeGrantSent(){
  259.     uint8_t i;
  260.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  261.       if(nbrInfo[i].bitMap & ONE_HOP)
  262.         nbrInfo[i].bitMap = (nbrInfo[i].bitMap & ~GRANT_SENT);
  263.   }
  264.   uint8_t numGrantsRemaining(){
  265.     uint8_t i, count;
  266.     for(i = 0, count = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  267.       if((nbrInfo[i].bitMap & ONE_HOP) && (!(nbrInfo[i].bitMap & GRANT_SENT))){
  268. #ifdef DRAND_DEBUG
  269.         SODbg(DBG_USR2, "RequestTimerFired: Need to retransmit for node %un", nbrInfo[i].nodeID);
  270. #endif
  271.         count++;
  272.       }
  273.     return count;
  274.   }
  275.   uint8_t numOneHop(){
  276.     uint8_t i, count;
  277.     for(i = 0, count = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  278.       if(nbrInfo[i].bitMap & ONE_HOP)
  279.         count++;
  280.     return count;
  281.   }
  282.   bool updateNeighborInfo(uint8_t nID, uint8_t slot){ // return true if information has changed
  283.     uint8_t i;
  284.     if((slot == 0xFF) || (nID == 0xFF)) return FALSE;
  285.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  286.       if((nbrInfo[i].nodeID == nID) && (nbrInfo[i].slot == 0xFF)){
  287.         nbrInfo[i].slot = slot;
  288.         return TRUE;
  289.       }
  290.     return FALSE;
  291.   }
  292.   void fillGrantSendInfo(uint8_t *array){
  293.     uint8_t i, j;
  294.     for(i = 0, j = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  295.       if((nbrInfo[i].bitMap & ONE_HOP) && (!(nbrInfo[i].bitMap & GRANT_SENT)))
  296.         array[j++] = nbrInfo[i].nodeID;
  297.     for(; j < MAX_NBR; j++)
  298.       array[j] = 0xFF;
  299.   }
  300.   void fillTimeSlotInfo(uint8_t *array){
  301.     uint8_t i;
  302.     for(i = 0; i < MAX_NBR; i++)     // first clear array
  303.       array[i] = 0xFF;
  304.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++) // put in one hop slot information
  305.       if((nbrInfo[i].slot != 0xFF) && (nbrInfo[i].bitMap & ONE_HOP))
  306.         array[nbrInfo[i].slot] = nbrInfo[i].nodeID;
  307.     if(setMySlot) // put in my slot info
  308.       array[myInfo.slot] = TOS_LOCAL_ADDRESS;
  309.   }
  310.   void fillFrameInfo(frameMsg *pkt){
  311.     uint8_t i, j;
  312.     for(i = 0; i < MAX_ONE_HOP; i++){     // first clear array
  313.       pkt->oneHopNodeID[i] = 0xFF;
  314.       pkt->frameArray[i] = 0xFF;
  315.     }
  316.     for(i = 0, j = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  317.       if((nbrInfo[i].bitMap & ONE_HOP) && (nbrInfo[i].frame != 0xFF)){
  318.         pkt->oneHopNodeID[j] = nbrInfo[i].nodeID;
  319.         pkt->frameArray[j] = nbrInfo[i].frame;
  320.         j++;
  321.       }
  322.   }
  323.   void fillTimeSlotInfoForReport(uint8_t *array){
  324.     uint8_t i;
  325.     for(i = 0; i < MAX_NBR; i++)     // first clear array
  326.       array[i] = 0xFF;
  327.     for(i = 0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  328.       if(nbrInfo[i].slot != 0xFF)
  329.         array[nbrInfo[i].slot] = nbrInfo[i].nodeID;
  330.     if(setMySlot)
  331.       array[myInfo.slot] = TOS_LOCAL_ADDRESS;
  332.   }
  333.   void addHelloID (uint8_t node, uint8_t *array){
  334.     uint8_t i;
  335.     if(node == TOS_LOCAL_ADDRESS) return;
  336.     atomic{
  337.       for(i = 0; (i < MAX_NBR) && (array[i] != 0xFF) && (array[i] != node); i++);
  338.       if(i == MAX_NBR){
  339. #ifdef DEBUG
  340.         SODbg( DBG_USR2, "addNode: No space to add noden");
  341. #endif
  342.       } else if(array[i] != node)
  343.         array[i] = node;
  344.     }
  345.   }
  346.   void removeHelloID(uint8_t node, uint8_t *array){
  347.     uint8_t i;
  348.     atomic{
  349.       for(i = 0; (i < MAX_NBR) && (array[i] != 0xFF) && (array[i] != node); i++);
  350.       if((i != MAX_NBR) && (array[i] == node)){
  351.         for (;i < MAX_NBR - 1; i++)
  352.           array[i]=array[i+1];
  353.         array[MAX_NBR - 1] = 0xFF;
  354.       }
  355.     }
  356.   }
  357.   int isPresent(uint8_t nodeID, uint8_t type){
  358.     uint8_t i;
  359.     if(nodeID == 0xFF) return -1;
  360.     for(i = 0;(i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  361.       if((nbrInfo[i].nodeID == nodeID) && (nbrInfo[i].bitMap & type))
  362.         return i;
  363.     return -1;
  364.   }
  365.   uint8_t getContenders(){
  366.     uint8_t i, contenders = 0;
  367.     for(i = 0;(i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  368.       if(nbrInfo[i].slot == 0xFF)
  369.         contenders++;
  370.     return (contenders + 1); // I am also a contender !
  371.   }
  372.   void removeNodesForRequest(){
  373.     int i;
  374.     for(i = MAX_NBR - 1; i >= 0; i--){
  375.       if(nbrInfo[i].nodeID == 0xFF)
  376.         continue;
  377.       else if((nbrInfo[i].bitMap & ONE_HOP) && !(nbrInfo[i].bitMap & GRANT_SENT)){
  378. #ifdef DEBUG
  379.         SODbg( DBG_USR2, "RemoveNodesForRequest: Changed %u to Two Hopn", nbrInfo[i].nodeID);
  380. #endif
  381.         //        removeNode(nbrInfo[i].nodeID, nbrInfo[i].bitMap); // TODO - rewrite !!
  382.         nbrInfo[i].bitMap = TWO_HOP;
  383.       }
  384.     }
  385.   }
  386.   void removeNodeForGrant(uint8_t nodeID){
  387.     int i;
  388.     for(i = MAX_NBR - 1; i >= 0; i--){
  389.       if(nbrInfo[i].nodeID == 0xFF)
  390.         continue;
  391.       else if(nbrInfo[i].nodeID == nodeID){
  392. #ifdef DEBUG
  393.         SODbg( DBG_USR2, "RemoveNodeForGrant: Changed %u to Two Hopn", nbrInfo[i].nodeID);
  394. #endif
  395.         //        removeNode(nbrInfo[i].nodeID, nbrInfo[i].bitMap);
  396.         nbrInfo[i].bitMap = TWO_HOP;
  397.         return;
  398.       }
  399.     }
  400.   }
  401.   void removeNodesForReport(){
  402.     int i;
  403.     for(i = MAX_NBR - 1; i >= 0; i--){
  404.       if(nbrInfo[i].nodeID == 0xFF)
  405.         continue;
  406.       else if(nbrInfo[i].slot == 0xFF){
  407. #ifdef DEBUG
  408.         SODbg( DBG_USR2, "RemoveNodesForReport: Removed node %un", nbrInfo[i].nodeID);
  409. #endif
  410.         removeNode(nbrInfo[i].nodeID, nbrInfo[i].bitMap); // TODO - rewrite !!
  411.       }
  412.     }
  413.   }
  414.   void removeNodesForFrame(){
  415.     int i;
  416.     for(i = MAX_NBR - 1; i >= 0; i--){
  417.       if(nbrInfo[i].nodeID == 0xFF)
  418.         continue;
  419.       else if(nbrInfo[i].frame == 0xFF){
  420. #ifdef DEBUG
  421.         SODbg( DBG_USR2, "RemoveNodesForFrame: Removed node %un", nbrInfo[i].nodeID);
  422. #endif
  423.         removeNode(nbrInfo[i].nodeID, nbrInfo[i].bitMap); // TODO - rewrite !!
  424.       }
  425.     }
  426.   }
  427.   void updateNeighborInfoForReport(int nIndex, reportMsg *pkt){
  428.     uint8_t i;
  429.     int n;
  430. #ifdef REPORT_DEBUG
  431.     SODbg(DBG_USR2, "updating for node = %u ***********************n", nbrInfo[nIndex].nodeID);
  432. #endif
  433.     if(nIndex != -1)
  434.       nbrInfo[nIndex].slot = pkt->slot;
  435.     for(i = 0; i < MAX_NBR; i++)
  436.       if((n = isPresent(pkt->timeSlot[i], ONE_HOP | TWO_HOP)) != -1){
  437.         nbrInfo[n].slot = i;
  438. #ifdef REPORT_DEBUG
  439.         SODbg(DBG_USR2, "updating for node = %u, Slot = %un", nbrInfo[n].nodeID, nbrInfo[n].slot);
  440. #endif
  441.       }
  442.   }
  443.   void updateNeighborInfoForFrame(uint8_t nIndex, frameMsg *pkt){
  444.     uint8_t i;
  445.     int n;
  446. #ifdef FRAME_DEBUG
  447.     SODbg(DBG_USR2, "updating for node = %u ***********************n", nbrInfo[nIndex].nodeID);
  448. #endif
  449.     nbrInfo[nIndex].frame = pkt->frame;
  450.     for(i = 0; (i < MAX_ONE_HOP) && (pkt->oneHopNodeID[i] != 0xFF); i++)
  451.       if(((n = isPresent(pkt->oneHopNodeID[i], ONE_HOP | TWO_HOP)) != -1)){
  452.         nbrInfo[n].frame = pkt->frameArray[i];
  453. #ifdef DEBUG
  454.         SODbg(DBG_USR2, "updating for node = %u, Frame = %un", nbrInfo[n].nodeID, nbrInfo[n].frame);
  455. #endif
  456.       }
  457.   }
  458.   uint16_t randNew() {   /* Return the next 16 bit random number */
  459.     bool endbit;
  460.     uint16_t tmpShiftReg;
  461.     atomic {
  462.       tmpShiftReg = shiftReg;
  463.       endbit = ((tmpShiftReg & 0x8000) != 0);
  464.       tmpShiftReg <<= 1;
  465.       if (endbit)
  466.         tmpShiftReg ^= 0x100b;
  467.       tmpShiftReg++;
  468.       shiftReg = tmpShiftReg;
  469.       tmpShiftReg = tmpShiftReg ^ mask;
  470.     }
  471.     return tmpShiftReg;
  472.   }
  473.   command result_t StdControl.init(){
  474.     atomic {
  475.       uint8_t i;
  476.       for(i = 0 ; i<MAX_NBR ; i++){
  477.         nbrInfo[i].nodeID = 0xFF;
  478.         nbrInfo[i].slot = 0xFF;
  479.         nbrInfo[i].frame = 0xFF;
  480.         nbrInfo[i].bitMap = 0x0;
  481.         OneWayId[i] = TwoWayId[i] = 0xFF;
  482.       }
  483.       myInfo.slot = 0xFF;
  484.       myInfo.nodeID = TOS_LOCAL_ADDRESS;
  485.       myInfo.frame = 0xFF;
  486.       myInfo.bitMap = 0xFF;
  487.       globalState = HELLO_STATE; //start this application with hello mode
  488.       setMySlot = gotAllFrames = FALSE;
  489.       lastReqID = 0xFF;
  490.       requestFireCount = grantFireCount = reportFireCount = frameFireCount = 0;
  491.       OTT = 100; // all times in ms (OTT = time for one time transmission of request/grant msg)
  492.       ROUND_TIME = 1500;
  493.       REQUEST_TIME = 1000;
  494.       GRANT_TIME = 1000;
  495.       sendBusy = FALSE;
  496.       drandFinishedFirstTime = reportFinishedFirstTime = TRUE;
  497.       sentRelease = FALSE;
  498.       firstGrant = TRUE;
  499.       call SClock.getTime(&locTime);
  500.       shiftReg = 119 * 119 * (locTime.sticks + TOS_LOCAL_ADDRESS + 1);
  501.       mask = 137 * 29 * (locTime.sticks + TOS_LOCAL_ADDRESS + 1);
  502. #ifdef DEBUG
  503.       reqCount = graCount = rejCount = relCount = twoCount = reqXCount = graXCount = 0, roundNum = 0;
  504.       reqX = graX = FALSE;
  505.       init_debug();
  506. #endif
  507. #ifdef LDEBUG
  508.       call Leds.init();
  509. #endif
  510.     }
  511.     return SUCCESS;
  512.   }
  513.   command result_t StdControl.start(){
  514.     globalState = HELLO_STATE;
  515.     call reXTimer.start(TIMER_ONE_SHOT, randNew() % HELLO_INTERVAL);
  516.     call roundTimer.start(TIMER_ONE_SHOT, HELLO_PERIOD);
  517.     return SUCCESS;
  518.   }
  519.   command result_t StdControl.stop(){
  520.     call reXTimer.stop();
  521.     call roundTimer.stop();
  522.     call drandRoundTimer.stop();
  523.     return SUCCESS;
  524.   }
  525.   void sendHelloMsg(){
  526.     atomic{
  527.       if(!sendBusy){
  528.         uint8_t i = 0, j = 0;
  529.         helloMsg *helloMsgData = (helloMsg*)DataPkt.data;
  530.         helloMsgData->sendID = TOS_LOCAL_ADDRESS;
  531.         for(i = 0; i < MAX_NBR; i++)
  532.           helloMsgData->OneWayId[i] = 0xFF;
  533.         
  534.         for(i = 0; (i < MAX_NBR) && (OneWayId[i] != 0xFF); i++)
  535.           helloMsgData->OneWayId[i] = OneWayId[i];
  536.         if(i == MAX_NBR){
  537. #ifdef DEBUG
  538.           SODbg(DBG_USR2, "SendHelloMsg: Too many neighbors, abort !!!!n");
  539. #endif
  540.         }
  541.         helloMsgData->OneWayLen = i;
  542.         for(j = 0; (j < MAX_NBR) && (i < MAX_NBR) && (TwoWayId[j] != 0xFF); j++, i++)
  543.           helloMsgData->OneWayId[i] = TwoWayId[j];
  544.         if (call SendHelloMsg.send(TOS_BCAST_ADDR, sizeof(helloMsg), &DataPkt) == SUCCESS)
  545.           sendBusy = TRUE;
  546.         else{
  547. #ifdef HELLO_DEBUG
  548.           SODbg(DBG_USR2, "SendHelloMsg: Something wrong, send failed !n");
  549. #endif
  550.           call reXTimer.start(TIMER_ONE_SHOT, randNew() % HELLO_INTERVAL);
  551.         }
  552.       } else {
  553. #ifdef HELLO_DEBUG
  554.         printState();SODbg(DBG_USR2,"sendHelloMsg:Channel busyn");
  555. #endif
  556.         call reXTimer.start(TIMER_ONE_SHOT, randNew() % HELLO_INTERVAL);
  557.       }
  558.     }
  559.   }
  560.   void sendRequestMsg(){
  561.     atomic{
  562.       if(!sendBusy){
  563.         requestMsg *requestMsgData = (requestMsg *)DataPkt.data;
  564.         requestMsgData->sendID = TOS_LOCAL_ADDRESS;
  565.         call SClock.getTime(&(requestMsgData->timestamp));
  566. #ifdef DEBUG
  567.         requestMsgData->myState = globalState;
  568.         requestMsgData->roundNum = roundNum;
  569.         requestMsgData->lastRequestID = lastReqID;
  570. #endif
  571.         fillGrantSendInfo(requestMsgData->idMap);
  572.         requestMsgData->numRemaining = numGrantsRemaining();
  573.         requestMsgData->OTT = OTT;
  574.         if(call SendRequestMsg.send(TOS_BCAST_ADDR, sizeof(requestMsg), &DataPkt) != SUCCESS){
  575. #ifdef DRAND_DEBUG
  576.           printState();SODbg(DBG_USR2,"SendRequestMsg: Something wrong, send failed.... n");
  577. #endif
  578.           call reXTimer.start(TIMER_ONE_SHOT, REQUEST_TIME);
  579.         }else{
  580.           sendBusy = TRUE;
  581.         }
  582.       } else {
  583. #ifdef DRAND_DEBUG
  584.         printState();SODbg(DBG_USR2,"SendRequestMsg: Channel Busyn");
  585. #endif
  586.         call reXTimer.start(TIMER_ONE_SHOT, REQUEST_TIME);
  587.       }
  588.     }
  589.   }
  590.   void sendRejectMsg(uint8_t msgADDR){
  591.     atomic{
  592.       if(!sendBusy){
  593.         rejectMsg *rejectMsgData = (rejectMsg*) DataPkt.data;
  594.         rejectMsgData->sendID = TOS_LOCAL_ADDRESS;
  595. #ifdef DEBUG
  596.         rejectMsgData->myState = globalState;
  597.         rejectMsgData->roundNum = roundNum;
  598.         rejectMsgData->lastRequestID = lastReqID;
  599. #endif
  600.         if (call SendRejectMsg.send((uint16_t)msgADDR, sizeof(rejectMsg), &DataPkt) == SUCCESS){
  601.           sendBusy = TRUE;
  602.         }
  603.         else{
  604. #ifdef DRAND_DEBUG
  605.           printState();SODbg(DBG_USR2,"sendRejectMsg:failedn");
  606. #endif
  607.         }
  608.       }
  609.     }
  610.   }
  611.   void sendReleaseMsg(uint8_t slot){
  612.     atomic{
  613.       if(!sendBusy){
  614.         releaseMsg *releaseMsgData = (releaseMsg*)DataPkt.data;
  615.         releaseMsgData->sendID = TOS_LOCAL_ADDRESS;
  616.         releaseMsgData->slot = slot;
  617. #ifdef DEBUG
  618.         releaseMsgData->myState = globalState;
  619.         releaseMsgData->lastRequestID = lastReqID;
  620.         releaseMsgData->roundNum = roundNum;
  621. #endif
  622.         if (call SendReleaseMsg.send(TOS_BCAST_ADDR, sizeof(releaseMsg), &DataPkt) == SUCCESS){
  623.           sendBusy = TRUE;
  624.         }
  625.         else{
  626. #ifdef DRAND_DEBUG
  627.           printState();SODbg(DBG_USR2,"sendReleaseMsg: send failedn");
  628. #endif
  629.         }
  630.       }
  631.     }
  632.   }
  633.   void setSlot(){
  634.     uint8_t i;
  635.     uint32_t slotField;
  636.     atomic{
  637.       for(i = 0, slotField = 0x0; (i < MAX_NBR) && (nbrInfo[i].nodeID != 0xFF); i++)
  638.         if(nbrInfo[i].slot != 0xFF)
  639.           slotField = slotField | (0x1 << nbrInfo[i].slot);
  640.       for(i = 0; i < 32; i++)
  641.         if(!(slotField & (0x1 << i))){
  642.           myInfo.slot = i;
  643.           setMySlot = TRUE;
  644.           break;
  645.         }
  646.       if(!setMySlot){
  647. #ifdef DEBUG
  648.         SODbg(DBG_USR2, "SetSlot: Could not set slot, something wrong, abort !!!n");
  649. #endif
  650.       } else{
  651. #ifdef DRAND_DEBUG
  652.         printState();SODbg(DBG_USR2,"SetSlot:Scheduling release msgn");
  653. #endif
  654.         globalState = RELEASE_STATE;
  655.         sendReleaseMsg(myInfo.slot);
  656.         call reXTimer.stop();
  657.       }
  658.     }
  659.   }
  660.   void setFrame(){
  661.     uint8_t maxSlot, frameLen;
  662.     removeNodesForReport(); // clear 2hop nodes still without slot information
  663.     call reXTimer.stop();
  664.     maxSlot = getMaxSlot(); // now find nearest power of 2
  665.     frameLen = 0;
  666.     while(maxSlot != 0){
  667.       maxSlot = (int)(maxSlot/2);
  668.       frameLen++;
  669.     }
  670.     myInfo.frame = 0x1 << frameLen;
  671. #ifdef ES_DEBUG
  672.     SODbg(DBG_USR2, "Local Frame Size = %u for maxSlot = %un", myInfo.frame, getMaxSlot());
  673. #endif
  674.   }
  675.   
  676.   void sendTwoHopMsg(uint8_t slot, uint8_t sendID){
  677.     atomic{
  678.       if(!sendBusy){
  679.         twoHopMsg *twoHopMsgData = (twoHopMsg*)DataPkt.data;
  680.         twoHopMsgData->sendID = TOS_LOCAL_ADDRESS;
  681.         twoHopMsgData->slotID = sendID;
  682.         twoHopMsgData->slot = slot;
  683. #ifdef DEBUG
  684.         twoHopMsgData->myState = globalState;
  685.         twoHopMsgData->roundNum = roundNum;
  686.         twoHopMsgData->lastRequestID = lastReqID;
  687. #endif
  688.         if (call SendTwoHopMsg.send(TOS_BCAST_ADDR, sizeof(twoHopMsg), &DataPkt) == SUCCESS){
  689.           sendBusy = TRUE;
  690.         } else{
  691. #ifdef DRAND_DEBUG
  692.           printState();SODbg(DBG_USR2,"sendTwoHopMsg: send failedn");
  693. #endif
  694.         }
  695.       }
  696.     }
  697.   }
  698.   void sendGrantMsg(uint8_t msgADDR){
  699.     atomic{
  700.       if(!sendBusy){
  701.         grantMsg *grantMsgData = (grantMsg*)DataPkt.data;
  702.         grantMsgData->sendID = TOS_LOCAL_ADDRESS;
  703. #ifdef DEBUG
  704.         grantMsgData->myState = globalState;
  705.         grantMsgData->lastRequestID = lastReqID;
  706.         grantMsgData->roundNum = roundNum;
  707. #endif
  708.         grantMsgData->timestamp = requestStartTime;
  709.         fillTimeSlotInfo(grantMsgData->timeSlot);
  710.         if (call SendGrantMsg.send((uint16_t)msgADDR, sizeof(grantMsg), &DataPkt) != SUCCESS){
  711.           call reXTimer.start(TIMER_ONE_SHOT, GRANT_TIME);
  712. #ifdef DRAND_DEBUG
  713.           printState();SODbg(DBG_USR2,"sendGrantMsg:grant postponed-1n");
  714. #endif
  715.         }
  716.         else{
  717.           sendBusy = TRUE;
  718.         }
  719.       } else {
  720.         call reXTimer.start(TIMER_ONE_SHOT, GRANT_TIME);
  721. #ifdef DRAND_DEBUG
  722.         printState();SODbg(DBG_USR2,"sendGrantMsg:grant postponed-2n");
  723. #endif
  724.       }
  725.     }
  726.   }
  727.   void sendReportMsg(uint8_t type){
  728.     atomic{
  729.       if(!sendBusy){
  730.         reportMsg *reportMsgData = (reportMsg *) DataPkt.data;
  731.         reportMsgData->slot = myInfo.slot;
  732.         reportMsgData->sendID = TOS_LOCAL_ADDRESS;
  733.         reportMsgData->type = type;
  734.         fillTimeSlotInfoForReport(reportMsgData->timeSlot);
  735.         if(call SendReportMsg.send(TOS_BCAST_ADDR, sizeof(reportMsg), &DataPkt) != SUCCESS){
  736.           call reXTimer.start(TIMER_ONE_SHOT, REPORT_XPERIOD + (randNew() % REPORT_INTERVAL));
  737. #ifdef REPORT_DEBUG
  738.           SODbg(DBG_USR2, "sendReportMsg: Failed to send report msgn");
  739. #endif
  740.         } else{
  741.           sendBusy = TRUE;
  742.         }
  743.       } else{
  744.         call reXTimer.start(TIMER_ONE_SHOT, REPORT_XPERIOD + (randNew() % REPORT_INTERVAL));
  745. #ifdef REPORT_DEBUG
  746.         printState();SODbg(DBG_USR2,"sendReportMsg:Channel Busyn");
  747. #endif
  748.       }
  749.     }
  750.   }
  751.   
  752.   void sendFrameMsg(uint8_t frameType){
  753.     atomic{
  754.       if(!sendBusy){
  755.         frameMsg *frameMsgData = (frameMsg*) DataPkt.data;
  756.         frameMsgData->sendID = TOS_LOCAL_ADDRESS;
  757.         frameMsgData->frame = myInfo.frame;
  758.         frameMsgData->type = frameType;
  759.         fillFrameInfo(frameMsgData);
  760.         if (call SendFrameMsg.send(TOS_BCAST_ADDR, sizeof(frameMsg), &DataPkt) == SUCCESS){
  761.           sendBusy = TRUE;
  762.         } else{
  763. #ifdef FRAME_DEBUG
  764.           SODbg(DBG_USR2,"SendFrameMsg.SendDone: Failed to Send Frame Messagen");
  765. #endif
  766.           call reXTimer.start(TIMER_ONE_SHOT, FRAME_XPERIOD + (randNew() % FRAME_INTERVAL));
  767.         }
  768.       } else{
  769. #ifdef FRAME_DEBUG
  770.         printState();SODbg(DBG_USR2,"sendFrameMsg: Channel Busyn");
  771. #endif
  772.         call reXTimer.start(TIMER_ONE_SHOT, FRAME_XPERIOD + (randNew() % FRAME_INTERVAL));
  773.       }
  774.     }
  775.   }
  776.   event result_t SendHelloMsg.sendDone(TOS_MsgPtr msg, result_t success){
  777.     atomic {
  778.       if(sendBusy){
  779.         sendBusy = FALSE;
  780. #ifdef HELLO_DEBUG
  781.         SODbg(DBG_USR2, "SendHelloMsg.SendDone: Sent Hello Messagen");
  782. #endif
  783.         if(globalState == HELLO_STATE)
  784.           call reXTimer.start(TIMER_ONE_SHOT, randNew() % HELLO_INTERVAL);
  785.       }
  786.     }
  787.     return SUCCESS;
  788.   }
  789.   event result_t SendRequestMsg.sendDone(TOS_MsgPtr msg, result_t success){
  790.     atomic{
  791.       if(sendBusy){
  792.         sendBusy = FALSE;
  793. #ifdef DRAND_DEBUG
  794.         printMsg(msg);
  795. #endif
  796.         if(success == FAIL){
  797. #ifdef DRAND_DEBUG
  798.           printState();SODbg(DBG_USR2,"SendRequestMsgSendDone:Postponed Requestn");
  799. #endif
  800.         } else{
  801. #ifdef DEBUG
  802.           if(reqX) reqXCount ++;
  803.           else if(!reqX) reqX = TRUE;
  804.           reqCount++;
  805. #endif
  806.           requestFireCount++;
  807. #ifdef DRAND_DEBUG
  808.           printState();SODbg(DBG_USR2,"SendRequestMsgSendDone:sent Requestn");
  809.           printMsg(msg);
  810. #endif
  811.         }
  812.         if (globalState == REQUEST_STATE)
  813.           call reXTimer.start(TIMER_ONE_SHOT,REQUEST_TIME);
  814.       }
  815.     }
  816.     return SUCCESS;
  817.   }
  818.   event result_t SendRejectMsg.sendDone(TOS_MsgPtr msg, result_t success){
  819.     atomic{
  820.       if(sendBusy){
  821.         sendBusy = FALSE;
  822. #ifdef DRAND_DEBUG
  823.         printMsg(msg);
  824. #endif
  825.         if(success == SUCCESS){
  826. #ifdef DRAND_DEBUG
  827.           printState();SODbg(DBG_USR2,"SendRejectMsgSendDone:Sent Reject n");
  828. #endif
  829. #ifdef DEBUG
  830.           rejCount++;
  831. #endif
  832.         } else{
  833. #ifdef DRAND_DEBUG
  834.           printState();SODbg(DBG_USR2,"SendRejectMsgSendDone:Reject FAILEDn");
  835. #endif
  836.         }
  837.       }
  838.     }
  839.     return SUCCESS;
  840.   }
  841.   event result_t SendReleaseMsg.sendDone(TOS_MsgPtr msg, result_t success){
  842.     atomic{
  843.       if(sendBusy){
  844.         sendBusy = FALSE;
  845.         if(success == SUCCESS){
  846. #ifdef DEBUG
  847.           relCount++;
  848. #endif
  849. #ifdef DRAND_DEBUG
  850.           printState();SODbg(DBG_USR2,"SendReleaseMsgSendDone:Sent Release n");
  851.           printMsg(msg);
  852. #endif
  853.         } else{
  854. #ifdef DRAND_DEBUG
  855.           printState();SODbg(DBG_USR2,"SendReleaseMsgSendDone:Release failedn");
  856. #endif
  857.         }
  858.       }
  859.     }
  860.     return SUCCESS;
  861.   }
  862.   event result_t SendTwoHopMsg.sendDone(TOS_MsgPtr msg, result_t success){
  863.     atomic {
  864.       if(sendBusy){
  865.         sendBusy = FALSE;
  866.         if(success == SUCCESS){
  867. #ifdef DRAND_DEBUG
  868.           printState();SODbg(DBG_USR2,"SendTwoHopMsgSendDone: Sent TwoHop n");
  869.           printMsg(msg);
  870. #endif
  871. #ifdef DEBUG
  872.           twoCount++;
  873. #endif
  874.         } else{
  875. #ifdef DRAND_DEBUG
  876.           printState();SODbg(DBG_USR2,"SendTwoHopMsgSendDone:failed n");
  877. #endif
  878.         }
  879.       }
  880.     }
  881.     return SUCCESS;
  882.   }
  883.   event result_t SendGrantMsg.sendDone(TOS_MsgPtr msg, result_t success){
  884.     atomic{
  885.       if(sendBusy){
  886.         sendBusy = FALSE;
  887. #ifdef DRAND_DEBUG
  888.         printMsg(msg);
  889. #endif
  890.         if(success == FAIL){
  891. #ifdef DRAND_DEBUG
  892.           printState();SODbg(DBG_USR2,"SendGrantMsgSendDone: grant failed  n");
  893. #endif
  894.         } else{
  895. #ifdef DEBUG
  896.           if(graX) graXCount ++;
  897.           else if(!graX) graX = TRUE ;
  898.           graCount++;
  899.           grantFireCount++;
  900. #endif
  901. #ifdef DRAND_DEBUG
  902.           printState();SODbg(DBG_USR2,"SendGrantMsgSendDone:Sent Grant  n");
  903.           printMsg(msg);
  904. #endif
  905.         }
  906.       }
  907.       if(globalState == GRANT_STATE)
  908.         call reXTimer.start(TIMER_ONE_SHOT, GRANT_TIME);
  909.     }
  910.     return SUCCESS;
  911.   }
  912.   event result_t SendReportMsg.sendDone(TOS_MsgPtr msg, result_t success){
  913.     atomic{
  914. #ifdef LDEBUG
  915.       call Leds.redToggle();
  916. #endif
  917.       if(sendBusy){
  918.         sendBusy = FALSE;
  919. #ifdef REPORT_DEBUG
  920.         if(success == SUCCESS)
  921.           SODbg(DBG_USR2,"SendReport.SendDone:send report message n");
  922. #endif
  923.       }
  924.       if(globalState == REPORT_STATE)
  925.         call reXTimer.start(TIMER_ONE_SHOT, REPORT_XPERIOD + (randNew() % REPORT_INTERVAL));
  926.     }
  927.     return SUCCESS;
  928.   }
  929.   event result_t SendFrameMsg.sendDone(TOS_MsgPtr msg, result_t success){
  930.     atomic{
  931.       if(sendBusy){
  932.         sendBusy = FALSE;
  933. #ifdef FRAME_DEBUG
  934.         if(success == SUCCESS)
  935.           SODbg(DBG_USR2,"SendFrame.SendDone:sent frame message n");
  936. #endif
  937.       }
  938.       if(globalState == FRAME_STATE)
  939.         call reXTimer.start(TIMER_ONE_SHOT, FRAME_XPERIOD + (randNew() % FRAME_INTERVAL));
  940.     }
  941.     return SUCCESS;
  942.   }
  943.   event TOS_MsgPtr ReceiveHelloMsg.receive(TOS_MsgPtr m){
  944.     if (globalState != HELLO_STATE) return m;
  945.     atomic{
  946.       uint8_t PacketOneWayID[MAX_NBR], PacketTwoWayID[MAX_NBR];
  947.       helloMsg *recvHelloPtr = (helloMsg*)(m->data);
  948.       uint8_t Sender = recvHelloPtr->sendID;
  949.       uint8_t Me = TOS_LOCAL_ADDRESS;
  950.       uint8_t i, j;
  951.       bool SendHelloFlag = FALSE;
  952. #ifdef HELLO_DEBUG
  953.       printState();SODbg(DBG_USR2,"ReceiveHelloMsg:Receive Hello Msg from %un",
  954.                             recvHelloPtr->sendID);
  955. #endif
  956. #ifdef LDEBUG
  957.       call Leds.greenToggle();
  958. #endif
  959.       for(i = 0; i < MAX_NBR; i++)
  960.         PacketOneWayID[i] = PacketTwoWayID[i] = 0xFF;
  961.       for(i = 0; i < recvHelloPtr->OneWayLen; i++)
  962.         PacketOneWayID[i] = recvHelloPtr->OneWayId[i];
  963.       for(j = 0; i < MAX_NBR; i++, j++)
  964.         PacketTwoWayID[j] = recvHelloPtr->OneWayId[i];
  965.       if (isPresentHelloID(Me, PacketOneWayID, MAX_NBR) != -1) {
  966.         if (isPresentHelloID(Sender, OneWayId, MAX_NBR) != -1) {
  967.           addHelloID(Sender, TwoWayId);
  968. #ifdef LDEBUG
  969.           call Leds.redToggle();
  970. #endif
  971.           removeHelloID(Sender, OneWayId);
  972.         }
  973.         else if (isPresentHelloID(Sender, TwoWayId, MAX_NBR) != -1) {
  974.           SendHelloFlag = TRUE;
  975.         }
  976.         else {
  977.           addHelloID(Sender, TwoWayId);
  978. #ifdef LDEBUG
  979.           call Leds.redToggle();
  980. #endif
  981.           SendHelloFlag = TRUE;
  982.         }
  983.       }
  984.       else if (isPresentHelloID(Me, PacketTwoWayID, MAX_NBR) != -1) {
  985.         if (isPresentHelloID(Sender, OneWayId, MAX_NBR) != -1) {
  986.           addHelloID(Sender, TwoWayId);
  987. #ifdef LDEBUG
  988.           call Leds.redToggle();
  989. #endif
  990.           removeHelloID(Sender, OneWayId);
  991.           SendHelloFlag = TRUE;
  992.         }
  993.         else if (isPresentHelloID(Sender, TwoWayId, MAX_NBR) != -1) {}
  994.         else if ((isPresentHelloID(Sender, TwoWayId, MAX_NBR) == -1) &&
  995.                  (isPresentHelloID(Sender, OneWayId, MAX_NBR) == -1)) {}
  996.       }
  997.       else if ((isPresentHelloID(Me, PacketOneWayID, MAX_NBR) == -1) &&
  998.                (isPresentHelloID(Me, PacketTwoWayID, MAX_NBR) == -1)) {
  999.         if (isPresentHelloID(Sender, OneWayId, MAX_NBR) == -1) {
  1000.           addHelloID(Sender, OneWayId);
  1001.         }
  1002.         else if (isPresentHelloID(Sender, OneWayId, MAX_NBR) != -1) {
  1003.           SendHelloFlag = TRUE;
  1004.         }
  1005.         else if (isPresentHelloID(Sender, TwoWayId, MAX_NBR) != -1) {}
  1006.       }
  1007.       if (SendHelloFlag && globalState != HELLO_STATE)
  1008.         sendHelloMsg();
  1009.       // Update Two Hop ID
  1010.       for (i = 0; i < MAX_NBR; i++)
  1011.         if (isPresentHelloID(PacketTwoWayID[i], TwoWayId, MAX_NBR) == -1)
  1012.           addNode(PacketTwoWayID[i], TWO_HOP);
  1013.       // Remove this sender from my two Hop node if it is present
  1014.       removeNode(recvHelloPtr->sendID, TWO_HOP);
  1015.     }//atomic
  1016.     return m;
  1017.   }//end of ReceiveHelloMsg.receive(TOS_MsgPtr m)
  1018.   event TOS_MsgPtr ReceiveRequestMsg.receive(TOS_MsgPtr m){
  1019.     uint8_t i;
  1020.     requestMsg *recvRequestPtr = (requestMsg*)(m->data);
  1021.     uint16_t reqSentID = recvRequestPtr->sendID;
  1022.     if(isPresent(reqSentID, ONE_HOP) == -1) return m;
  1023.     atomic{
  1024.       requestStartTime = recvRequestPtr->timestamp;
  1025.       for(i = 0; (i < MAX_NBR) && (recvRequestPtr->idMap[i] != 0xFF); i++)
  1026.         if(isPresent(recvRequestPtr->idMap[i], ONE_HOP) == -1)
  1027.           addNode(recvRequestPtr->idMap[i], TWO_HOP);
  1028. #ifdef DRAND_DEBUG
  1029.       printState();SODbg(DBG_USR2,"ReceiveRequestMsg:Receive Request Msgn");
  1030.       printMsg(m);
  1031. #endif
  1032.       if (( reqSentID != lastReqID ) && (globalState == GRANT_STATE ||
  1033.                                          globalState == REQUEST_STATE)) {
  1034.         // This node is not the one that I already sent a grant, so send a reject.
  1035. #ifdef DRAND_DEBUG
  1036.         printState();SODbg(DBG_USR2,"ReceiveRequestMsg:Scheduling rejectn");
  1037. #endif
  1038.         sendRejectMsg(reqSentID);
  1039. #ifdef DRAND_DEBUG
  1040.         SODbg( DBG_USR2, "sent reject to %un", reqSentID);
  1041. #endif
  1042.       } else if((globalState == IDLE_STATE2) || (setMySlot)){
  1043.         if(!setMySlot)
  1044.           call drandRoundTimer.stop();
  1045.         globalState = GRANT_STATE;
  1046.         grantFireCount = 0;
  1047. #ifdef LDEBUG
  1048.         printLED();
  1049. #endif
  1050.         lastReqID = reqSentID ; //to distinguish with request which is because of loss of reject
  1051.         GRANT_TIME = ((recvRequestPtr->numRemaining * recvRequestPtr->OTT) + recvRequestPtr->OTT) * 2;
  1052.         // subdue grant because this is costly !
  1053.         call reXTimer.start(TIMER_ONE_SHOT, randNew() % GRANT_INTERVAL);
  1054.       } else if((globalState == GRANT_STATE) && (reqSentID == lastReqID)){
  1055.         GRANT_TIME = ((recvRequestPtr->numRemaining * recvRequestPtr->OTT) + recvRequestPtr->OTT) * 2;
  1056.         // subdue grant because this is costly !
  1057.         if (checkForRetransGrant(recvRequestPtr)){
  1058.           call reXTimer.start(TIMER_ONE_SHOT, randNew() % GRANT_INTERVAL);
  1059.         } else{
  1060.           call reXTimer.start(TIMER_ONE_SHOT, GRANT_TIME);
  1061.           grantFireCount = 0;
  1062.         }
  1063.       }
  1064.     }//atomic
  1065.     return m;
  1066.   }//end of ReceiveRequestMsg.receive(TOS_MsgPtr m)
  1067.   event TOS_MsgPtr ReceiveRejectMsg.receive(TOS_MsgPtr m){
  1068.     if(globalState != REQUEST_STATE) return m;
  1069.     atomic{
  1070. #ifdef DRAND_DEBUG
  1071.       printState();SODbg(DBG_USR2,"ReceiveRejectMsg:Received Reject Msgn");
  1072.       printMsg(m);
  1073. #endif
  1074.       call reXTimer.stop();
  1075.       //      if(!sentRelease){
  1076. #ifdef DRAND_DEBUG
  1077.         printState();SODbg(DBG_USR2, "ReceivedRejectMsg:Scheduling Releasen");
  1078. #endif
  1079.         sendReleaseMsg(0xFF);
  1080.         sentRelease = TRUE;
  1081.         //      }
  1082.       initializeGrantSent();
  1083.       globalState = IDLE_STATE2; //go back to IDLE_STATE2
  1084. #ifdef DEBUG
  1085.       reqX = FALSE;
  1086. #endif
  1087.       call drandRoundTimer.start(TIMER_ONE_SHOT, 1000); // time for current round to finish
  1088. #ifdef LDEBUG
  1089.       printLED();
  1090. #endif
  1091.     }//atomic
  1092.     return m;
  1093.   }//end of ReceiveRejectMsg.receive(TOS_MsgPtr m)
  1094.   event TOS_MsgPtr ReceiveReleaseMsg.receive(TOS_MsgPtr m){
  1095.     int nIndex;
  1096.     releaseMsg *recvReleasePtr = (releaseMsg*)(m->data);
  1097. #ifdef DRAND_DEBUG
  1098.     printState();SODbg(DBG_USR2,"ReceiveReleaseMsg:Received Release Msgn");
  1099.     printMsg(m);
  1100. #endif
  1101.     if(((nIndex = isPresent(recvReleasePtr->sendID, ONE_HOP)) == -1) ||
  1102.        (globalState != GRANT_STATE) || (lastReqID != recvReleasePtr->sendID))
  1103.       return m;
  1104.     atomic{
  1105.       call reXTimer.stop();
  1106.       if(updateNeighborInfo(recvReleasePtr->sendID, recvReleasePtr->slot))
  1107.         sendTwoHopMsg(recvReleasePtr->slot, recvReleasePtr->sendID);
  1108. #ifdef DRAND_DEBUG
  1109.       printState();SODbg(DBG_USR2,"ReceiveReleaseMsg:Scheduling two hop releasen");
  1110. #endif
  1111.       
  1112.       if (setMySlot) {   //&&(globalState == GRANT_STATE)
  1113.         globalState = RELEASE_STATE;
  1114. #ifdef LDEBUG
  1115.         printLED();
  1116. #endif
  1117.       } else {
  1118.         globalState = IDLE_STATE2;
  1119.         call drandRoundTimer.start(TIMER_ONE_SHOT, 100);
  1120. #ifdef LDEBUG
  1121.         printLED();
  1122. #endif
  1123.       }
  1124. #ifdef DEBUG
  1125.       graX = FALSE;
  1126. #endif
  1127.       lastReqID = 0xFF;
  1128.     }
  1129.     return m;
  1130.   }//end of ReceiveReleaseMsg.receive(TOS_MsgPtr m)
  1131.   event TOS_MsgPtr ReceiveTwoHopMsg.receive(TOS_MsgPtr m){
  1132.     int nIndex;
  1133.     twoHopMsg *recvTwoHopPtr = (twoHopMsg*)(m->data);
  1134. #ifdef DRAND_DEBUG
  1135.     printState();SODbg(DBG_USR2,"ReceiveTwoHopMsg:Received Two Hopn");
  1136.     printMsg(m);
  1137. #endif
  1138.     if(((nIndex = isPresent(recvTwoHopPtr->sendID, ONE_HOP)) == -1) ||
  1139.        recvTwoHopPtr->slotID == TOS_LOCAL_ADDRESS)
  1140.       return m;
  1141.     atomic {
  1142.       if((globalState == GRANT_STATE) && (recvTwoHopPtr->slotID == lastReqID)){
  1143.         recvTwoHopPtr->sendID = recvTwoHopPtr->slotID;
  1144.         signal ReceiveReleaseMsg.receive(m);
  1145.       }
  1146.       
  1147.       updateNeighborInfo(recvTwoHopPtr->slotID, recvTwoHopPtr->slot);
  1148.     }
  1149.     return m;
  1150.   }//end of ReceiveTwoHopMsg.receive(TOS_MsgPtr m)
  1151.   event TOS_MsgPtr ReceiveGrantMsg.receive(TOS_MsgPtr m){
  1152.     uint8_t i;
  1153.     GTime rttTime;
  1154.     double currOTT;
  1155.     bool dup = FALSE;
  1156.     grantMsg *recvGrantPtr = (grantMsg*)(m->data);
  1157.     int nIndex = isPresent(recvGrantPtr->sendID, ONE_HOP);
  1158.     if(nIndex == -1)
  1159.       return m;
  1160.     atomic{
  1161.       for (i = 0; i < MAX_NBR; i++){ // copy sender information
  1162.         if(isPresent(recvGrantPtr->timeSlot[i], ONE_HOP) == -1)
  1163.           addNode(recvGrantPtr->timeSlot[i], TWO_HOP);
  1164.         updateNeighborInfo(recvGrantPtr->timeSlot[i], i);
  1165.       }
  1166.         
  1167. #ifdef DRAND_DEBUG
  1168.       printState();SODbg(DBG_USR2,"ReceiveGrantMsg:Received Grant Msgn");
  1169.       printMsg(m);
  1170. #endif
  1171.       if(setMySlot){
  1172. #ifdef DRAND_DEBUG
  1173.         printState();SODbg(DBG_USR2,"ReceiveGrantMsg:Scheduling release msgn");
  1174. #endif
  1175.         sendReleaseMsg(myInfo.slot);
  1176.       } else if((globalState == IDLE_STATE2)|| (globalState == GRANT_STATE)){
  1177.         //        if(!sentRelease){
  1178. #ifdef DRAND_DEBUG
  1179.           printState();SODbg(DBG_USR2,"ReceiveGrantMsg:Scheduling FAIL release msgn");
  1180. #endif
  1181.           sendReleaseMsg(0xFF);
  1182.           sentRelease = TRUE;
  1183.           //        }
  1184.       } else if(globalState == REQUEST_STATE){
  1185.         if(!(nbrInfo[nIndex].bitMap & GRANT_SENT)) // if not duplicate, add to grantSendNode list
  1186.           nbrInfo[nIndex].bitMap |= GRANT_SENT;
  1187.         else
  1188.           dup = TRUE;
  1189.         if(firstGrant){ // update timers using info from first grant
  1190.           call SClock.getTime(&locTime);
  1191.           rttTime = timeDiff(locTime, recvGrantPtr->timestamp);
  1192.           currOTT = (rttTime.mticks * 568.88 + rttTime.sticks * 0.00868)/2;
  1193.           OTT = (uint16_t) (currOTT * .50 + OTT * .50);
  1194. #ifdef DRAND_DEBUG
  1195.           SODbg(DBG_USR2,"ReceiveGrantMsg: Current OTT = %u, average OTT = %un",
  1196.                 (uint16_t) currOTT, OTT);
  1197. #endif          
  1198.           ROUND_TIME = (OTT + (OTT * numOneHop()) + OTT) * 2;
  1199.           REQUEST_TIME = (2 * OTT) * 2;
  1200.           firstGrant = FALSE;
  1201.         }
  1202.         //check that all one hop node sent grant message and set the time slot. And send release message.
  1203.         if ((numGrantsRemaining() == 0) && (!setMySlot)){
  1204.           setSlot(); // set slot, change state, send release and schedule report timer
  1205. #ifdef ES_DEBUG
  1206.           timeCheck();
  1207.           printNbrInfo();
  1208. #endif
  1209. #ifdef LDEBUG
  1210.           printLED();
  1211. #endif
  1212.         } else if(!dup){
  1213.           call reXTimer.start(TIMER_ONE_SHOT, REQUEST_TIME);
  1214.           requestFireCount = 0;
  1215.         }
  1216.       }//else
  1217.     }//atomic  
  1218.     return m;
  1219.   }//end of ReceiveGrantMsg.receive(TOS_MsgPtr m)
  1220.   void reXFrame(){
  1221.     if(frameFireCount > MAX_FRAME)
  1222.       removeNodesForFrame();
  1223.     else
  1224.       frameFireCount++;
  1225.     if(!checkForRetransFrame()){
  1226.       call reXTimer.stop();
  1227.       if(!gotAllFrames){
  1228.         signal Drand.gotFrame();
  1229.         gotAllFrames = TRUE;
  1230. #ifdef ES_DEBUG
  1231.       printNbrInfo();
  1232. #endif
  1233.       }
  1234.     } else{
  1235. #ifdef FRAME_DEBUG
  1236.       SODbg(DBG_USR2,"frameTimer.fired:Broadcast request for Frame againn");
  1237. #endif
  1238.       sendFrameMsg(FRAME_REQUEST);
  1239.     }
  1240.   }
  1241.   void reXReport(){
  1242.     if(reportFireCount > MAX_REPORT)
  1243.       removeNodesForReport();
  1244.     else
  1245.       reportFireCount++;
  1246.     
  1247.     if(!checkForRetransReport())
  1248.       setFrame();
  1249.     else{
  1250.       sendReportMsg(REPORT_REQUEST);
  1251. #ifdef REPORT_DEBUG
  1252.       SODbg(DBG_USR2, "ReportTimerFired: Need to retransmit with %un", reportFireCount);
  1253. #endif
  1254.     }
  1255.   }
  1256.   
  1257.   event TOS_MsgPtr ReceiveReportMsg.receive(TOS_MsgPtr m){
  1258.     if(!setMySlot) return m;
  1259.     atomic{
  1260.       reportMsg *recvReportPtr = (reportMsg*)(m->data);
  1261.       int nIndex = isPresent(recvReportPtr->sendID, ONE_HOP);
  1262. #ifdef REPORT_DEBUG
  1263.       printState(); SODbg(DBG_USR2,"ReceiveReportMsg.receive:from %u, type %un", recvReportPtr->sendID,
  1264.                           recvReportPtr->type);
  1265. #endif
  1266.       updateNeighborInfoForReport(nIndex, recvReportPtr); // update time slots from packet
  1267.       if(globalState == RELEASE_STATE){
  1268.         globalState = REPORT_STATE;
  1269.         reXReport();
  1270.         call roundTimer.start(TIMER_ONE_SHOT, REPORT_PERIOD);
  1271.       }
  1272.       if(recvReportPtr->type == REPORT_REQUEST){
  1273.         sendReportMsg(REPORT_REPLY);
  1274. #ifdef REPORT_DEBUG
  1275.         SODbg(DBG_USR2,"ReceiveReportMsg: Sending Replyn");
  1276. #endif
  1277.       }
  1278.     }
  1279.     return m;
  1280.   }
  1281.   
  1282.   event TOS_MsgPtr ReceiveFrameMsg.receive(TOS_MsgPtr m){
  1283.     if((globalState != FRAME_STATE) && !gotAllFrames) return m;
  1284.     atomic{
  1285.       frameMsg *recvFramePtr = (frameMsg*)(m->data);
  1286.       int nIndex = isPresent(recvFramePtr->sendID, ONE_HOP);
  1287. #ifdef FRAME_DEBUG
  1288.       SODbg(DBG_USR2,"ReceiveFrameMsg:receive frame msg from %u of type %un", recvFramePtr->sendID,
  1289.             recvFramePtr->type);
  1290. #endif
  1291.       updateNeighborInfoForFrame(nIndex, recvFramePtr);
  1292.       if(globalState == REPORT_STATE){
  1293.         globalState = FRAME_STATE;
  1294.         reXFrame();
  1295.       }
  1296.       if(recvFramePtr->type == FRAME_REQUEST)
  1297.         sendFrameMsg(FRAME_REPLY);
  1298.     }
  1299.     return m;
  1300.   }
  1301.   void reXHello(){
  1302.     atomic{
  1303.       sendHelloMsg();
  1304.     }
  1305.   }
  1306.   void reXRequest(){
  1307.     atomic {
  1308.       if (requestFireCount > MAX_REQUEST){
  1309.         removeNodesForRequest(); // remove nodes who have not sent grant yet
  1310.         if((numGrantsRemaining() == 0) && (!setMySlot)){
  1311.           setSlot();
  1312. #ifdef ES_DEBUG
  1313.           timeCheck();
  1314.           printNbrInfo();
  1315. #endif
  1316. #ifdef DRAND_DEBUG
  1317.           printState();SODbg(DBG_USR2,"RequestTimerFired:Scheduling release msgn");
  1318. #endif
  1319. #ifdef LDEBUG
  1320.           printLED();
  1321. #endif
  1322.         }
  1323.       } else {
  1324. #ifdef DRAND_DEBUG
  1325.         printState();SODbg(DBG_USR2,"requestTimerFired:Scheduling request with %un", requestFireCount);
  1326. #endif
  1327.         sendRequestMsg();
  1328.       }
  1329.     }
  1330.   }
  1331.   void reXGrant(){
  1332.     atomic{
  1333.       if (grantFireCount > MAX_GRANT){
  1334.         removeNodeForGrant(lastReqID);
  1335.         if(setMySlot){
  1336.           globalState = RELEASE_STATE;
  1337. #ifdef LDEBUG
  1338.           printLED();
  1339. #endif
  1340.         } else{
  1341.           globalState = IDLE_STATE2;
  1342.           call drandRoundTimer.start(TIMER_ONE_SHOT, 100);
  1343. #ifdef LDEBUG
  1344.           printLED();
  1345. #endif
  1346.         }
  1347. #ifdef DEBUG
  1348.         graX = FALSE;
  1349. #endif
  1350.         lastReqID = 0xFF;
  1351.       } else{
  1352. #ifdef DRAND_DEBUG
  1353.         printState();SODbg(DBG_USR2,"grantTimerFired:Scheduling grant with %un", grantFireCount);
  1354. #endif
  1355.         sendGrantMsg(lastReqID);
  1356.       }
  1357.     }
  1358.   }
  1359.   void helloOver(){ // hello phase over, start drand round
  1360.     uint8_t i, randNum, contender;
  1361.     signal Drand.helloOver(); // signal aplication that hello is over
  1362.     atomic{
  1363.       globalState = IDLE_STATE2;
  1364.       call reXTimer.stop();
  1365. #ifdef LDEBUG
  1366.       printLED();
  1367. #endif
  1368.       call SClock.getTime(&drandStartTime);         //drand starting time
  1369.       for (i = 0; i < MAX_NBR; i++)
  1370.         addNode(TwoWayId[i], ONE_HOP);
  1371. #ifdef ES_DEBUG
  1372.       printNbrInfo();
  1373. #endif
  1374.       contender = getContenders();
  1375.       randNum = randNew();
  1376. #ifdef DRAND_DEBUG
  1377.       printState();SODbg(DBG_USR2,"HelloTimerFired: trying lottery with contenders = %un", contender);
  1378.       SODbg(DBG_USR2,"Random number : %u n", randNum);
  1379. #endif
  1380.       if ((randNum % contender) == 0){ // I am the winner
  1381.         globalState = REQUEST_STATE;
  1382.         requestFireCount = 0;
  1383. #ifdef DEBUG
  1384.         call SClock.getTime(&roundStartTime);
  1385. #endif
  1386. #ifdef LDEBUG
  1387.         printLED();
  1388. #endif
  1389. #ifdef DRAND_DEBUG
  1390.         printState();SODbg(DBG_USR2,"HelloRoundTimerFired:Scheduling requestn");
  1391. #endif
  1392.         sendRequestMsg();
  1393.       } else
  1394.         call drandRoundTimer.start(TIMER_ONE_SHOT, ROUND_TIME);
  1395.     }//atomic
  1396.   }
  1397.   void drandRoundOver(){
  1398.     uint8_t randNum, contender;
  1399.     atomic{
  1400.       sentRelease = FALSE;
  1401.       firstGrant = TRUE;
  1402. #ifdef DEBUG
  1403.       roundNum++;
  1404. #endif
  1405.       randNum = randNew();
  1406.       contender = getContenders();
  1407. #ifdef DRAND_DEBUG
  1408.       printState();SODbg(DBG_USR2,"DrandRoundTimerFired:running lottery n");
  1409.       SODbg(DBG_USR2, "Contender = %un", contender);
  1410.       SODbg(DBG_USR2,"Random number : %u n", randNum);
  1411. #endif
  1412.       if((randNum % contender) == 0){ // I am the winner
  1413.         globalState = REQUEST_STATE;
  1414. #ifdef DEBUG
  1415.         call SClock.getTime(&roundStartTime);
  1416. #endif
  1417.         requestFireCount = 0;
  1418. #ifdef LDEBUG
  1419.         printLED();
  1420. #endif
  1421. #ifdef DRAND_DEBUG
  1422.         printState();SODbg(DBG_USR2,"drandRoundTimerFired:WON LOTTERY, Scheduling requestn");
  1423. #endif
  1424.         sendRequestMsg();
  1425.       } else{
  1426. #ifdef DRAND_DEBUG
  1427.         printState();
  1428.         SODbg(DBG_USR2,"drandRoundTimerFired:LOST LOTTERY, Scheduling request after %un", ROUND_TIME);
  1429. #endif
  1430.         call drandRoundTimer.start(TIMER_ONE_SHOT, ROUND_TIME);
  1431.       }
  1432.       lastReqID = 0xff;
  1433.     }
  1434.   }
  1435.   event result_t reXTimer.fired(){
  1436.     atomic{
  1437.       switch(globalState){
  1438.       case HELLO_STATE:
  1439.         reXHello();
  1440.         break;
  1441.       case REQUEST_STATE:
  1442.         reXRequest();
  1443.         break;
  1444.       case GRANT_STATE:
  1445.         reXGrant();
  1446.         break;
  1447.       case REPORT_STATE:
  1448.         reXReport();
  1449.         break;
  1450.       case FRAME_STATE:
  1451.         reXFrame();
  1452.         break;
  1453.       }
  1454.     }
  1455.     return SUCCESS;
  1456.   }
  1457.   event result_t roundTimer.fired(){
  1458.     atomic{
  1459.       switch(globalState){
  1460.       case HELLO_STATE:
  1461.         helloOver();
  1462.         call roundTimer.start(TIMER_ONE_SHOT, DRAND_PERIOD);
  1463.         break;
  1464.       case RELEASE_STATE: // timer expired earlier
  1465.         globalState = REPORT_STATE;
  1466.         reXReport();
  1467.         call roundTimer.start(TIMER_ONE_SHOT, REPORT_PERIOD);
  1468.         break;
  1469.       case REPORT_STATE: // remove nodes without slot info, and start frame state
  1470.         setFrame();
  1471.         globalState = FRAME_STATE;
  1472.         reXFrame();
  1473.         break;
  1474.       }
  1475.     }
  1476.     return SUCCESS;
  1477.   }
  1478.   event result_t drandRoundTimer.fired(){
  1479.     if(globalState == IDLE_STATE2)
  1480.       drandRoundOver();
  1481.     return SUCCESS;
  1482.   }
  1483.   /******************       Drand Interface ********************/
  1484.   default async event void Drand.gotFrame(){}
  1485.   default async event void Drand.helloOver(){}
  1486.   command nodeInfo* Drand.getNeighborInfo(){ return nbrInfo; }
  1487.   command nodeInfo* Drand.getMyInfo(){ return &myInfo; }
  1488.   command void Drand.startDrand(){
  1489.     call StdControl.init();
  1490.     call StdControl.start();
  1491.   }
  1492.   command void Drand.stopDrand(){ call StdControl.stop(); }
  1493.   /**************SClock Interface********/
  1494.   async event result_t SClock.syncDone(){ return SUCCESS; }
  1495.   async event result_t SClock.fire(uint16_t mticks){ return SUCCESS; }
  1496. }//end of implementation