]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/cc1000/CC1000RssiP.nc
debug: add cfprintf macro
[tinyos-2.x.git] / tos / chips / cc1000 / CC1000RssiP.nc
index 7b768d504f76bc8fd1b85ed360eabf34c1d77cf2..bdb2def138c743c282ac5e2211b8cdb7373e154d 100644 (file)
  *   the stack.
  */
 
-module CC1000RssiP
+module CC1000RssiP @safe()
 {
   provides {
     interface ReadNow<uint16_t> as Rssi[uint8_t reason];
     async command void cancel();
   }
-  uses interface Read<uint16_t> as ActualRssi;
+  uses {
+    interface Resource;
+    interface ReadNow<uint16_t> as ActualRssi;
+  }
 }
 implementation
 {
@@ -65,43 +68,41 @@ implementation
       currentOp = CANCELLED;
   }
 
-  void startNextOp() {
-    if (nextOp != IDLE)
-      {
-       currentOp = nextOp;
-       nextOp = IDLE;
-       call ActualRssi.read();
-      }
-    else
-      currentOp = IDLE;
-  }
-
-  task void startOpTask() {
-    atomic startNextOp();
+  event void Resource.granted() {
+    call ActualRssi.read();
   }
 
   async command error_t Rssi.read[uint8_t reason]() {
     if (currentOp == IDLE)
       {
-       nextOp = reason;
-       post startOpTask();
+       currentOp = reason;
+       if (call Resource.immediateRequest() == SUCCESS)
+         call ActualRssi.read();
+       else
+         call Resource.request();
       }
-    else // We should only come here with currentOp = CANCELLED
+    else
       nextOp = reason;
     return SUCCESS;
   }
 
-  event void ActualRssi.readDone(error_t result, uint16_t data) {
-    atomic
+  void startNextOp() {
+    currentOp = nextOp;
+    if (nextOp != IDLE)
       {
-       uint8_t op = currentOp;
+       nextOp = IDLE;
+       call ActualRssi.read();
+      }
+    else
+      call Resource.release();
+  }
 
-       /* The code assumes that RSSI measurements are 10-bits 
-          (legacy effect) */
-       data >>= 6;
+  async event void ActualRssi.readDone(error_t result, uint16_t data) {
+    atomic
+      {
+       /* The RSSI measurements are assumed to be 10-bits */
+       signal Rssi.readDone[currentOp](result, data);
        startNextOp();
-
-       signal Rssi.readDone[op](result, data);
       }
   }