]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Now supporting PIB attribute "macRxOnWhenIdle"
authorjanhauer <janhauer>
Mon, 4 May 2009 09:40:36 +0000 (09:40 +0000)
committerjanhauer <janhauer>
Mon, 4 May 2009 09:40:36 +0000 (09:40 +0000)
tos/lib/mac/tkn154/DispatchSlottedCsmaP.nc
tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc
tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc
tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc
tos/lib/mac/tkn154/dummies/NoDispatchSlottedCsmaP.nc

index eccccc19eb8efdf36c304e813e900f6e05dd21a2..7709ae8f63342eab1f0f494c89ff279e08d5e3b1 100644 (file)
@@ -80,6 +80,7 @@ generic module DispatchSlottedCsmaP(uint8_t sfDirection)
     interface Get<ieee154_txframe_t*> as GetIndirectTxFrame; 
     interface Notify<bool> as RxEnableStateChange;
     interface GetNow<bool> as IsTrackingBeacons;
+    interface Notify<const void*> as PIBUpdateMacRxOnWhenIdle;
     interface FrameUtility;
     interface SlottedCsmaCa;
     interface RadioRx;
@@ -121,6 +122,7 @@ implementation
   norace ieee154_txframe_t *m_bcastFrame;
   norace ieee154_txframe_t *m_lastFrame;
   norace uint16_t m_remainingBackoff;
+  ieee154_macRxOnWhenIdle_t macRxOnWhenIdle;
 
   /* variables for the slotted CSMA-CA */
   norace ieee154_csma_t m_csma;
@@ -406,7 +408,7 @@ implementation
       else if (call SuperframeStructure.battLifeExtDuration() > 0 &&
           call TimeCalc.hasExpired(call SuperframeStructure.sfStartTime(), 
             call SuperframeStructure.battLifeExtDuration()) &&
-          !call IsRxEnableActive.getNow()) {
+          !call IsRxEnableActive.getNow() && !macRxOnWhenIdle) {
         dbg_push_state(5);
         next = trySwitchOff();
       }
@@ -418,13 +420,12 @@ implementation
       }
 
       // Check 7: should we be in receive mode?
-      else if (COORD_ROLE || call IsRxEnableActive.getNow()) {
+      else if (COORD_ROLE || call IsRxEnableActive.getNow() || macRxOnWhenIdle) {
         dbg_push_state(7);
         next = tryReceive(NO_ALARM);
         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 respective component
+          // 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();
         }
       }
@@ -524,6 +525,10 @@ implementation
   async event void BLEAlarm.fired() { updateState();}
   event void RxEnableStateChange.notify(bool whatever) { updateState();}
   async event void BroadcastAlarm.fired() { m_broadcastRxPending = FALSE; updateState();}
+  event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) {
+    atomic macRxOnWhenIdle = *((ieee154_macRxOnWhenIdle_t*) val);
+    updateState();
+  }
 
   async event void IndirectTxWaitAlarm.fired() 
   { 
index 53ebe948a6b9800f630e641dbb9467b2adf9b37b..f579f71f5b4d7fd0070ddab478441c5824244e64 100644 (file)
@@ -67,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;
@@ -96,6 +97,7 @@ implementation
   norace bool m_resume;
   norace ieee154_txframe_t *m_currentFrame;
   norace ieee154_txframe_t *m_lastFrame;
+  norace ieee154_macRxOnWhenIdle_t macRxOnWhenIdle;
 
   /* variables for the unslotted CSMA-CA */
   norace ieee154_csma_t m_csma;
@@ -275,12 +277,11 @@ implementation
       }
 
       // Check 4: should we be in receive mode?
-      else if (call IsRxEnableActive.getNow()) {
+      else if (call IsRxEnableActive.getNow() || macRxOnWhenIdle) {
         next = tryReceive(FALSE);
         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();
         }
       }
@@ -362,6 +363,10 @@ implementation
     else
       updateState();
   }
+  event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) {
+    atomic macRxOnWhenIdle = *((ieee154_macRxOnWhenIdle_t*) val);
+    signal RxEnableStateChange.notify(TRUE);
+  }
 
   event void IndirectTxWaitTimer.fired() 
   { 
index a04bfea8c2b94fdc34aec816ab1fa387d7456193..62633314eddb54117aec362f8c9f0936364b1a54 100644 (file)
@@ -413,6 +413,7 @@ implementation
   DeviceCap.GetIndirectTxFrame -> IndirectTxP;
   DeviceCap.RxEnableStateChange -> RxEnableP.RxEnableStateChange;  
   DeviceCap.IsTrackingBeacons -> BeaconSynchronizeP.IsTrackingBeacons;  
+  DeviceCap.PIBUpdateMacRxOnWhenIdle -> PibP.PIBUpdate[IEEE154_macRxOnWhenIdle];
   DeviceCap.FrameUtility -> PibP;
   DeviceCap.SlottedCsmaCa -> DeviceCapRadioClient;
   DeviceCap.RadioRx -> DeviceCapRadioClient;
@@ -439,6 +440,7 @@ implementation
   CoordCap.GetIndirectTxFrame -> IndirectTxP;
   CoordCap.RxEnableStateChange -> RxEnableP.RxEnableStateChange;  
   CoordCap.IsTrackingBeacons -> BeaconSynchronizeP.IsTrackingBeacons;  
+  CoordCap.PIBUpdateMacRxOnWhenIdle -> PibP.PIBUpdate[IEEE154_macRxOnWhenIdle];
   CoordCap.FrameUtility -> PibP;
   CoordCap.SlottedCsmaCa -> CoordCapRadioClient;
   CoordCap.RadioRx -> CoordCapRadioClient;
index e5b79176203e969d312ca528ef606c8ca88ec7ef..fa2d24d2e6ef90455b6e4a63c122b602b2d3f837 100644 (file)
@@ -293,6 +293,7 @@ implementation
   DispatchP.IsRadioTokenRequested -> ScanP.IsRadioTokenRequested;
   DispatchP.GetIndirectTxFrame -> IndirectTxP;
   DispatchP.RxEnableStateChange -> RxEnableP.RxEnableStateChange;  
+  DispatchP.PIBUpdateMacRxOnWhenIdle -> PibP.PIBUpdate[IEEE154_macRxOnWhenIdle];
   DispatchP.FrameUtility -> PibP;
   DispatchP.UnslottedCsmaCa -> DispatchRadioClient;
   DispatchP.RadioRx -> DispatchRadioClient;
index b61259ecce4bf856afe4160cc13d96134cba62e5..b664b3f9444f18e39bce27e22f97000007543af5 100644 (file)
@@ -62,6 +62,7 @@ generic module NoDispatchSlottedCsmaP(uint8_t sfDirection)
     interface Get<ieee154_txframe_t*> as GetIndirectTxFrame; 
     interface Notify<bool> as RxEnableStateChange;
     interface GetNow<bool> as IsTrackingBeacons;
+    interface Notify<const void*> as PIBUpdateMacRxOnWhenIdle;
     interface FrameUtility;
     interface SlottedCsmaCa;
     interface RadioRx;
@@ -114,4 +115,5 @@ implementation
 
   command error_t WasRxEnabled.enable(){return FAIL;}
   command error_t WasRxEnabled.disable(){return FAIL;}
+  event void PIBUpdateMacRxOnWhenIdle.notify( const void* val ) {}
 }