]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/mac/tkn154/BeaconTransmitP.nc
Fixed a bug with the resource transfer
[tinyos-2.x.git] / tos / lib / mac / tkn154 / BeaconTransmitP.nc
index d3034e142049992aff6e103c2e0b72e5c0e2292b..b3b04dbd3560d0d409f30aef71bfc407c83db775 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; 
@@ -65,19 +65,21 @@ module BeaconTransmitP
     interface Alarm<TSymbolIEEE802154,uint32_t> as BeaconTxAlarm;
     interface Timer<TSymbolIEEE802154> as BeaconPayloadUpdateTimer;
     interface RadioOff;
-    interface Get<bool> as IsBeaconEnabledPAN;
+    interface GetNow<bool> as IsBeaconEnabledPAN;
     interface RadioTx as BeaconTx;
     interface MLME_GET;
     interface MLME_SET;
     interface Resource as Token;
+    interface ResourceTransferred as TokenTransferred;
     interface ResourceTransfer as TokenToBroadcast;
+    interface GetNow<bool> as IsTokenRequested;
     interface FrameTx as RealignmentBeaconEnabledTx;
     interface FrameTx as RealignmentNonBeaconEnabledTx;
     interface FrameRx as BeaconRequestRx;
     interface WriteBeaconField as GtsInfoWrite;
     interface WriteBeaconField as PendingAddrWrite;
     interface FrameUtility;
-    interface Get<bool> as IsTrackingBeacons;
+    interface GetNow<bool> as IsTrackingBeacons;
     interface GetNow<uint32_t> as LastBeaconRxTime;
     interface GetNow<ieee154_reftime_t*> as LastBeaconRxRefTime; 
     interface Ieee802154Debug as Debug;
@@ -158,7 +160,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;
@@ -222,14 +224,14 @@ implementation
         !(IEEE154_SUPPORTED_CHANNELS & ((uint32_t) 1 << logicalChannel)) ||
         (superframeOrder > beaconOrder))
       status =  IEEE154_INVALID_PARAMETER;
-    else if (startTime && !call IsTrackingBeacons.get())
+    else if (startTime && !call IsTrackingBeacons.getNow())
       status = IEEE154_TRACKING_OFF;
     else if (startTime && 0xFF000000)
       status = IEEE154_INVALID_PARAMETER;
     else if (m_requests & (REQUEST_CONFIRM_PENDING | REQUEST_UPDATE_SF))
       status = IEEE154_TRANSACTION_OVERFLOW;
-    else if ((call IsBeaconEnabledPAN.get() && beaconOrder > 14) ||
-              (!call IsBeaconEnabledPAN.get() && beaconOrder < 15))
+    else if ((call IsBeaconEnabledPAN.getNow() && beaconOrder == 15) ||
+              (!call IsBeaconEnabledPAN.getNow() && beaconOrder < 15))
       status = IEEE154_INVALID_PARAMETER;
     else {
       // new configuration *will* be put in operation
@@ -251,8 +253,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();  // otherwise we'll get it eventually and update the superframe then
     }
     return status;
   }
@@ -282,7 +284,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){
@@ -391,6 +393,7 @@ implementation
 
   event void Token.granted()
   {
+    call Debug.flush();
     call Debug.log(LEVEL_INFO, StartP_GOT_RESOURCE, m_lastBeaconTxTime, m_beaconInterval, m_requests);
     if (m_requests & REQUEST_REALIGNMENT_DONE_PENDING){
       // unlikely to occur: we have not yet received a done()
@@ -409,6 +412,17 @@ implementation
       call RadioOff.off();
   }
 
+  async event void TokenTransferred.transferred()
+  {
+    if (call IsTokenRequested.getNow()){
+      // some other component needs the token - we give it up for now,  
+      // but make another request to get it back later
+      call Token.request();
+      call Token.release();
+    } else
+      post grantedTask();
+  }  
+
   async event void RadioOff.offDone()
   {
     prepareNextBeaconTransmission();
@@ -421,7 +435,7 @@ implementation
       post grantedTask();
       call Debug.log(LEVEL_CRITICAL, StartP_OWNER_TOO_FAST, 0, 0, 0);
       return;
-    } else if (m_beaconOrder > 14){
+    } else if (m_beaconOrder == 15){
       call Token.release();
     } else {
       atomic {
@@ -516,7 +530,7 @@ implementation
       m_framePendingBit = TRUE;
     else
       m_framePendingBit = FALSE;
-    memcpy(m_gtsField, &frame->payload[0], gtsFieldLength);
+    memcpy(m_gtsField, &frame->payload[2], gtsFieldLength);
     if (frame->payload[1] & 0x10){
       // BLE is active; calculate the time offset from slot0
       m_BLELen = IEEE154_SHR_DURATION + 
@@ -528,8 +542,7 @@ implementation
       m_BLELen += m_battLifeExtPeriods;
     } else
       m_BLELen = 0;
-    call Token.request();             // register another request, before ...
-    call TokenToBroadcast.transfer(); // ... we let Broadcast module take over
+    call TokenToBroadcast.transfer(); // borrow Token to Broadcast/CAP/CFP module, we'll get it back afterwards
     post txDoneTask();
   }
 
@@ -759,7 +772,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
     }
@@ -773,7 +786,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; }