]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc
- fixed an issue with indirect transmissions (timeout wasn't set correctly)
[tinyos-2.x.git] / tos / lib / mac / tkn154 / DispatchUnslottedCsmaP.nc
index 7c916dc2490cb6f0de03077b84bc5ffaf20df46e..8415c1ba813e5b39599baee271516852fb91aaa1 100644 (file)
  * not part of the MAC implementation but of the chip-specific radio driver.
  */
 
-#if IEEE154_BEACON_ENABLED_PAN
-#error "The IEEE154_BEACON_ENABLED_PAN macro MUST NOT be set when using this component!"
-#endif
-
 module DispatchUnslottedCsmaP
 {
   provides
@@ -71,6 +67,7 @@ module DispatchUnslottedCsmaP
     interface Set<ieee154_macPanCoordinator_t> as SetMacPanCoordinator;     
     interface Get<ieee154_txframe_t*> as GetIndirectTxFrame; 
     interface Notify<bool> as RxEnableStateChange;
+    interface Notify<const void*> as PIBUpdateMacRxOnWhenIdle;
     interface FrameUtility;
     interface UnslottedCsmaCa;
     interface RadioRx;
@@ -100,6 +97,7 @@ implementation
   norace bool m_resume;
   norace ieee154_txframe_t *m_currentFrame;
   norace ieee154_txframe_t *m_lastFrame;
+  norace ieee154_macRxOnWhenIdle_t m_macRxOnWhenIdle;
 
   /* variables for the unslotted CSMA-CA */
   norace ieee154_csma_t m_csma;
@@ -110,10 +108,9 @@ implementation
   norace ieee154_status_t m_txStatus;
   norace uint32_t m_transactionTime;
   norace bool m_indirectTxPending = FALSE;
-  norace ieee154_macMaxFrameTotalWaitTime_t m_macMaxFrameTotalWaitTime;
 
   /* function / task prototypes */
-  next_state_t tryReceive(bool startIndirectTxTimer);
+  next_state_t tryReceive();
   next_state_t tryTransmit();
   next_state_t trySwitchOff();
   void backupCurrentFrame();
@@ -169,12 +166,12 @@ implementation
       call MLME_SET.macPANId(panID);
       call MLME_SET.phyCurrentChannel(logicalChannel);
       call MLME_SET.macBeaconOrder(beaconOrder);
-      call SetMacSuperframeOrder.set(superframeOrder);
       call SetMacPanCoordinator.set(panCoordinator);
       //TODO: check realignment
       post signalStartConfirmTask();
       status = IEEE154_SUCCESS;
     }      
+    dbg_serial("DispatchUnslottedCsmaP", "MLME_START.request -> result: %lu\n", (uint32_t) status);
     return status;
   }
 
@@ -191,7 +188,10 @@ implementation
       return IEEE154_TRANSACTION_OVERFLOW;
     } else {
       setCurrentFrame(frame);
-      call RadioToken.request();
+      if (call RadioToken.isOwner())
+        updateState();
+      else
+        call RadioToken.request();      
       return IEEE154_SUCCESS;
     }
   }
@@ -226,7 +226,6 @@ implementation
     //  m_transactionTime += call MLME_GET.macMinLIFSPeriod(); 
     // else 
     //  m_transactionTime += call MLME_GET.macMinSIFSPeriod(); 
-    m_macMaxFrameTotalWaitTime = call MLME_GET.macMaxFrameTotalWaitTime();
     m_currentFrame = frame;
   }
 
@@ -255,7 +254,7 @@ implementation
       // Check 1: was an indirect transmission successfully started 
       // and are we now waiting for a frame from the coordinator?
       if (m_indirectTxPending) {
-        next = tryReceive(TRUE);
+        next = tryReceive();
       }
 
       // Check 2: is some other operation (like MLME-SCAN or MLME-RESET) pending? 
@@ -276,12 +275,11 @@ implementation
       }
 
       // Check 4: should we be in receive mode?
-      else if (call IsRxEnableActive.getNow()) {
-        next = tryReceive(FALSE);
+      else if (call IsRxEnableActive.getNow() || m_macRxOnWhenIdle) {
+        next = tryReceive();
         if (next == DO_NOTHING) {
-          // this means there is an active MLME_RX_ENABLE.request
-          // and the radio was just switched to Rx mode - signal
-          // a notify event to inform the next higher layer
+          // if there was an active MLME_RX_ENABLE.request then we'll
+          // inform the next higher layer that radio is now in Rx mode
           post wasRxEnabledTask();
         }
       }
@@ -329,7 +327,7 @@ implementation
     return next;
   }
 
-  next_state_t tryReceive(bool startIndirectTxTimer)
+  next_state_t tryReceive()
   {
     next_state_t next;
     if (call RadioRx.isReceiving())
@@ -338,8 +336,6 @@ implementation
       next = SWITCH_OFF;
     else {
       call RadioRx.enableRx(0, 0);
-      if (startIndirectTxTimer)
-        post startIndirectTxTimerTask();
       next = WAIT_FOR_RXDONE;
     }
     return next;
@@ -355,15 +351,34 @@ implementation
     return next;
   }
 
-  async event void RadioOff.offDone() { m_lock = FALSE; updateState();}
-  async event void RadioRx.enableRxDone() { m_lock = FALSE; updateState();}
-  event void RxEnableStateChange.notify(bool whatever) { 
+  async event void RadioOff.offDone() 
+  { 
+    m_lock = FALSE; 
+    updateState();
+  }
+
+  async event void RadioRx.enableRxDone() 
+  { 
+    if (m_indirectTxPending) // indirect transmission, now waiting for data
+      post startIndirectTxTimerTask();
+    m_lock = FALSE; 
+    updateState();
+  }
+
+  event void RxEnableStateChange.notify(bool whatever) 
+  { 
     if (!call RadioToken.isOwner())
       call RadioToken.request();
     else
       updateState();
   }
 
+  event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) 
+  {
+    atomic m_macRxOnWhenIdle = *((ieee154_macRxOnWhenIdle_t*) val);
+    signal RxEnableStateChange.notify(TRUE);
+  }
+
   event void IndirectTxWaitTimer.fired() 
   { 
     atomic {
@@ -376,7 +391,7 @@ implementation
 
   task void startIndirectTxTimerTask()
   {
-    call IndirectTxWaitTimer.startOneShot(m_macMaxFrameTotalWaitTime); 
+    call IndirectTxWaitTimer.startOneShot(call MLME_GET.macMaxFrameTotalWaitTime()); 
   }
 
   async event void UnslottedCsmaCa.transmitDone(ieee154_txframe_t *frame, 
@@ -464,9 +479,10 @@ implementation
     uint8_t *mhr = MHR(frame);
     uint8_t frameType = mhr[MHR_INDEX_FC1] & FC1_FRAMETYPE_MASK;
 
-    dbg("DispatchUnslottedCsmaP", "Received frame, DSN: %lu, result: 0x%lx\n", (uint32_t) mhr[MHR_INDEX_SEQNO]);
     if (frameType == FC1_FRAMETYPE_CMD)
       frameType += payload[0];
+    dbg("DispatchUnslottedCsmaP", "Received frame, DSN: %lu, type: 0x%lu\n", 
+        (uint32_t) mhr[MHR_INDEX_SEQNO], (uint32_t) frameType);
     atomic {
       if (m_indirectTxPending) {
         message_t* frameBuf;