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