]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/power/AsyncDeferredPowerManagerP.nc
Merge over into the trunk.
[tinyos-2.x.git] / tos / lib / power / AsyncDeferredPowerManagerP.nc
index a3df6e409d270a2a2d6bd1edaaab5738b7156bfd..0344a7fe855d0b22c6d94ffa3ab5a203da6831db 100644 (file)
@@ -29,6 +29,8 @@
  */
  
 /**
+ * Please refer to TEP 115 for more information about this component and its
+ * intended use.<br><br>
  *
  * This is the internal implementation of the deffered power management
  * policy for managing the power states of non-virtualized devices.
  *                        before shutting down the device once it is free.
  * 
  * @author Kevin Klues (klueska@cs.wustl.edu)
- * @see  Please refer to TEP 115 for more information about this component and its
- *          intended use.
  */
  
 generic module AsyncDeferredPowerManagerP(uint32_t delay) {
-  provides {
-    interface Init;
-  }
   uses {
     interface AsyncStdControl;
 
     interface PowerDownCleanup;
-    interface Init as ArbiterInit;
     interface ResourceController;
     interface ArbiterInfo;
     interface Timer<TMilli> as TimerMilli;
@@ -65,53 +61,41 @@ generic module AsyncDeferredPowerManagerP(uint32_t delay) {
 }
 implementation {
 
-  norace struct {
-   uint8_t stopping :1;
-   uint8_t requested :1;
-  } f; //for flags
+  norace bool stopTimer = FALSE;
 
-  task void timerTask() { 
-    call TimerMilli.startOneShot(delay); 
+  task void stopTimerTask() {
+    call TimerMilli.stop();
+    stopTimer = FALSE;
   }
 
-  command error_t Init.init() {
-    f.stopping = FALSE;
-    f.requested = FALSE;
-    call ArbiterInit.init();
-    call ResourceController.immediateRequest();
-    return SUCCESS;
+  task void timerTask() {
+    if(stopTimer == FALSE)
+      call TimerMilli.startOneShot(delay);
   }
 
   async event void ResourceController.requested() {
-    if(f.stopping == FALSE) {
-      call AsyncStdControl.start();
-      call ResourceController.release();
-    }
-    else atomic f.requested = TRUE;
+    stopTimer = TRUE;
+    post stopTimerTask();
+    call AsyncStdControl.start();
+    call ResourceController.release();
+  }
+
+  async event void ResourceController.immediateRequested() {
+    stopTimer = TRUE;
+    post stopTimerTask();
+    call AsyncStdControl.start();
+    call ResourceController.release();
   }
 
-  async event void ResourceController.idle() {
-    if(!(call ArbiterInfo.inUse()))
+  async event void ResourceController.granted() {
       post timerTask();
   }
 
   event void TimerMilli.fired() {
-    if(call ResourceController.immediateRequest() == SUCCESS) {
-      f.stopping = TRUE;
+    if(stopTimer == FALSE) {
       call PowerDownCleanup.cleanup();
       call AsyncStdControl.stop();
     }
-    if(f.requested == TRUE) {
-      call AsyncStdControl.start();
-      call ResourceController.release();
-    }
-    atomic {
-      f.stopping = FALSE;
-      f.requested = FALSE;
-    }    
-  }
-
-  event void ResourceController.granted() {
   }
 
   default async command void PowerDownCleanup.cleanup() {