]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/mac/tkn154/BeaconTransmitP.nc
- moved promiscuous mode into separate component
[tinyos-2.x.git] / tos / lib / mac / tkn154 / BeaconTransmitP.nc
index 3d0dd438868e2ffc290d7b6aa36890e5ed3b52f5..c7b88333a50d14396a83d60eef2366d170296985 100644 (file)
@@ -42,7 +42,7 @@ module BeaconTransmitP
     interface Init as Reset;
     interface MLME_START;
     interface WriteBeaconField as SuperframeSpecWrite;
-    interface Get<bool> as IsSendingBeacons;
+    interface GetNow<bool> as IsSendingBeacons;
     interface GetNow<uint32_t> as CapStart; 
     interface GetNow<ieee154_reftime_t*> as CapStartRefTime; 
     interface GetNow<uint32_t> as CapLen; 
@@ -70,6 +70,7 @@ module BeaconTransmitP
     interface MLME_GET;
     interface MLME_SET;
     interface Resource as Token;
+    interface ResourceTransferred as TokenTransferred;
     interface ResourceTransfer as TokenToBroadcast;
     interface FrameTx as RealignmentBeaconEnabledTx;
     interface FrameTx as RealignmentNonBeaconEnabledTx;
@@ -158,7 +159,7 @@ implementation
   uint16_t m_updatePANId;
   uint8_t m_updateLogicalChannel;
   uint32_t m_updateStartTime;
-  uint8_t m_updateBeaconOrder;
+  norace uint8_t m_updateBeaconOrder;
   uint8_t m_updateSuperframeOrder;
   bool m_updatePANCoordinator;
   bool m_updateBatteryLifeExtension;
@@ -251,8 +252,8 @@ implementation
       m_requests = (REQUEST_CONFIRM_PENDING | REQUEST_UPDATE_SF); // lock
       if (coordRealignment)
         m_requests |= REQUEST_REALIGNMENT;
-      if (!call IsSendingBeacons.get())
-        call Token.request();
+      if (m_beaconOrder == 15) // only request token if we're not already transmitting beacons
+        call Token.request(); 
     }
     return status;
   }
@@ -282,7 +283,7 @@ implementation
       *((nxle_uint16_t*) &realignmentFrame->payload[6]) = 0xFFFF;
       realignmentFrame->payloadLen = 8;
       
-      if (call IsSendingBeacons.get()){
+      if (m_beaconOrder < 15){
         // we're already transmitting beacons; the realignment frame
         // must be sent (broadcast) after the next beacon
         if (call RealignmentBeaconEnabledTx.transmit(realignmentFrame) != IEEE154_SUCCESS){
@@ -410,6 +411,11 @@ implementation
       call RadioOff.off();
   }
 
+  async event void TokenTransferred.transferred()
+  {
+    post grantedTask();
+  }  
+
   async event void RadioOff.offDone()
   {
     prepareNextBeaconTransmission();
@@ -760,7 +766,7 @@ implementation
 
   event message_t* BeaconRequestRx.received(message_t* frame)
   {
-    if (!call IsSendingBeacons.get()){
+    if (m_beaconOrder == 15){
       // transmit the beacon frame using unslotted CSMA-CA
       // TODO
     }
@@ -774,7 +780,10 @@ implementation
     signal MLME_START.confirm(SUCCESS);
   }
 
-  command bool IsSendingBeacons.get(){ return m_beaconOrder < 15;}
+  async command bool IsSendingBeacons.getNow()
+  { 
+    return (m_beaconOrder < 15) || ((m_requests & REQUEST_CONFIRM_PENDING) && m_updateBeaconOrder < 15);
+  }
 
   async command uint32_t BeaconInterval.getNow() { return m_beaconInterval; }
   async command uint32_t CapStart.getNow() { return m_lastBeaconTxTime; }