]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Renamed some components and added a blocking version of the SineSensor
authorklueska <klueska>
Fri, 13 Jun 2008 21:40:36 +0000 (21:40 +0000)
committerklueska <klueska>
Fri, 13 Jun 2008 21:40:36 +0000 (21:40 +0000)
tos/lib/tosthreads/chips/atm128/adc/BlockingAdcP.nc
tos/lib/tosthreads/chips/msp430/adc12/BlockingAdcP.nc
tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorC.nc [new file with mode: 0644]
tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorP.nc [new file with mode: 0644]
tos/lib/tosthreads/system/BlockingAdcImplP.nc [deleted file]
tos/lib/tosthreads/system/BlockingReadP.nc [new file with mode: 0644]
tos/lib/tosthreads/system/BlockingReadStreamP.nc [new file with mode: 0644]

index 9afdaafe284349db83d2ecf86631ae4ff8c8dd35..c67bd62028a26448fb837ad93795e8a6c587aa49 100644 (file)
@@ -54,26 +54,30 @@ implementation {
   components MainC;
   components WireAdcP;
   components WireAdcStreamP;
-  components BlockingAdcImplP;
+  components new BlockingReadP();
+  components new BlockingReadStreamP();
   
-  MainC.SoftwareInit -> BlockingAdcImplP;
+  MainC.SoftwareInit -> BlockingReadP;
+  MainC.SoftwareInit -> BlockingReadStreamP;
   
   //For BlockingRead
-  BlockingRead = BlockingAdcImplP;
-  BlockingAdcImplP.Read -> WireAdcP;
+  BlockingRead = BlockingReadP;
+  BlockingReadP.Read -> WireAdcP;
   Config = WireAdcP;
   ResourceRead = WireAdcP;
   
   //For BlockingReadStream
-  BlockingReadStream = BlockingAdcImplP;
-  BlockingAdcImplP.ReadStream -> WireAdcStreamP;
+  BlockingReadStream = BlockingReadStreamP;
+  BlockingReadStreamP.ReadStream -> WireAdcStreamP;
   ConfigReadStream = WireAdcStreamP;
   ResourceReadStream = WireAdcStreamP;
   
   components SystemCallC;
   components SystemCallQueueC;
-  BlockingAdcImplP.SystemCallQueue -> SystemCallQueueC;
-  BlockingAdcImplP.SystemCall -> SystemCallC;
+  BlockingReadP.SystemCallQueue -> SystemCallQueueC;
+  BlockingReadP.SystemCall -> SystemCallC;
+  BlockingReadStreamP.SystemCallQueue -> SystemCallQueueC;
+  BlockingReadStreamP.SystemCall -> SystemCallC;
 }
 
 
index e88a996096a234ce8052fc2d68be25e86a7d1c25..ce22d9657fd6e8835cee7ec315fcec94f099e21f 100644 (file)
@@ -56,28 +56,32 @@ implementation {
   components MainC;
   components AdcP;
   components WireAdcStreamP;
-  components BlockingAdcImplP;
+  components new BlockingReadP();
+  components new BlockingReadStreamP();
   
-  MainC.SoftwareInit -> BlockingAdcImplP;
+  MainC.SoftwareInit -> BlockingReadP;
+  MainC.SoftwareInit -> BlockingReadStreamP;
   
   //For BlockingRead
-  BlockingRead = BlockingAdcImplP;
+  BlockingRead = BlockingReadP;
   Config = AdcP.Config;
   SingleChannel = AdcP.SingleChannel;
   ResourceRead = AdcP.ResourceRead;
-  BlockingAdcImplP.Read -> AdcP.Read;
+  BlockingReadP.Read -> AdcP.Read;
   
   //For BlockingReadStream
-  BlockingReadStream = BlockingAdcImplP;
+  BlockingReadStream = BlockingReadStreamP;
   ConfigReadStream = WireAdcStreamP;
   SingleChannelReadStream = WireAdcStreamP;
   ResourceReadStream = WireAdcStreamP;
-  BlockingAdcImplP.ReadStream -> WireAdcStreamP;
+  BlockingReadStreamP.ReadStream -> WireAdcStreamP;
   
   components SystemCallC;
   components SystemCallQueueC;
-  BlockingAdcImplP.SystemCallQueue -> SystemCallQueueC;
-  BlockingAdcImplP.SystemCall -> SystemCallC;
+  BlockingReadP.SystemCallQueue -> SystemCallQueueC;
+  BlockingReadP.SystemCall -> SystemCallC;
+  BlockingReadStreamP.SystemCallQueue -> SystemCallQueueC;
+  BlockingReadStreamP.SystemCall -> SystemCallC;
 }
 
 
diff --git a/tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorC.nc b/tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorC.nc
new file mode 100644 (file)
index 0000000..5d9dbfa
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2008 Stanford University.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the
+ *   distribution.
+ * - Neither the name of the Stanford University nor the names of
+ *   its contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL STANFORD
+ * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @author Kevin Klues <klueska@cs.stanford.edu>
+ */
+
+generic configuration BlockingSineSensorC() {
+  provides interface Init;
+  provides interface BlockingRead<uint16_t>;
+}
+implementation {
+  components BlockingSineSensorP;
+  components new SineSensorC();
+  
+  enum { ID = unique("Sine.Sensor") };
+  
+  Init = SineSensorC;
+  BlockingRead = BlockingSineSensorP.BlockingRead[ID];
+  BlockingSineSensorP.Read[ID] -> SineSensorC;
+}
diff --git a/tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorP.nc b/tos/lib/tosthreads/sensorboards/universal/BlockingSineSensorP.nc
new file mode 100644 (file)
index 0000000..0c3118b
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2008 Stanford University.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the
+ *   distribution.
+ * - Neither the name of the Stanford University nor the names of
+ *   its contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL STANFORD
+ * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @author Kevin Klues <klueska@cs.stanford.edu>
+ */
+
+configuration BlockingSineSensorP {
+  provides interface BlockingRead<uint16_t>[uint8_t id];
+  uses interface Read<uint16_t>[uint8_t id];
+}
+implementation {
+  components new BlockingReadP();
+  
+  BlockingRead = BlockingReadP;
+  Read = BlockingReadP;
+  
+  components SystemCallC;
+  components SystemCallQueueC;
+  BlockingReadP.SystemCallQueue -> SystemCallQueueC;
+  BlockingReadP.SystemCall -> SystemCallC;
+}
diff --git a/tos/lib/tosthreads/system/BlockingAdcImplP.nc b/tos/lib/tosthreads/system/BlockingAdcImplP.nc
deleted file mode 100644 (file)
index 17040e5..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2008 Stanford University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the
- *   distribution.
- * - Neither the name of the Stanford University nor the names of
- *   its contributors may be used to endorse or promote products derived
- *   from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL STANFORD
- * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @author Kevin Klues <klueska@cs.stanford.edu>
- */
-
-module BlockingAdcImplP {
-  provides {
-    interface Init;
-    interface BlockingRead<uint16_t> as BlockingRead[uint8_t client];
-    interface BlockingReadStream<uint16_t> as BlockingReadStream[uint8_t streamClient];
-  }
-  uses {
-    interface Read<uint16_t> as Read[uint8_t client];
-    interface ReadStream<uint16_t> as ReadStream[uint8_t streamClient];
-    
-    interface SystemCall;
-    interface SystemCallQueue;
-  }
-}
-implementation {
-
-  typedef struct read_params {
-    uint16_t* val;
-    error_t   error;
-  } read_params_t;
-
-  typedef struct readstream_params {
-    uint32_t* usPeriod;
-    uint16_t* buf;
-    uint16_t* count;
-    error_t   error;
-  } readstream_params_t;
-
-  syscall_queue_t read_queue;
-  syscall_queue_t readstream_queue;
-  
-  command error_t Init.init() {
-    call SystemCallQueue.init(&read_queue);
-    call SystemCallQueue.init(&readstream_queue);
-    return SUCCESS;
-  }
-  
-  /**************************** Read ********************************/
-  void readTask(syscall_t* s) {
-    read_params_t* p = s->params;
-    p->error = call Read.read[s->id]();
-    if(p->error != SUCCESS) {
-      call SystemCall.finish(s);
-    } 
-  }  
-  
-  command error_t BlockingRead.read[uint8_t id](uint16_t* val) {
-    syscall_t s;
-    read_params_t p;
-    atomic {
-      if(call SystemCallQueue.find(&read_queue, id) != NULL)
-        return EBUSY;
-      call SystemCallQueue.enqueue(&read_queue, &s);
-    }
-    
-    p.val = val;
-    call SystemCall.start(&readTask, &s, id, &p);
-    
-    atomic {
-      call SystemCallQueue.remove(&read_queue, &s);
-      return p.error;
-    }
-  }
-  
-  event void Read.readDone[uint8_t id]( error_t result, uint16_t val ) {
-    syscall_t* s = call SystemCallQueue.find(&read_queue, id);
-    read_params_t* p = s->params;
-    *(p->val) = val;
-    p->error = result;
-    call SystemCall.finish(s);  
-  }
-  
-  /**************************** ReadStream ********************************/
-  void readStreamTask(syscall_t* s) {
-    readstream_params_t* p = s->params;
-    p->error = call ReadStream.postBuffer[s->id](p->buf, *(p->count));
-    if(p->error == SUCCESS)
-      p->error = call ReadStream.read[s->id](*(p->usPeriod));
-    if(p->error != SUCCESS)
-      call SystemCall.finish(s);
-  }
-  
-  command error_t BlockingReadStream.read[uint8_t id](uint32_t* usPeriod, uint16_t* buf, uint16_t count) {
-    syscall_t s;
-    readstream_params_t p;
-    atomic {
-      if(call SystemCallQueue.find(&readstream_queue, id) != NULL)
-        return EBUSY;
-      call SystemCallQueue.enqueue(&readstream_queue, &s);
-    }
-    
-    p.usPeriod = usPeriod;
-    p.buf = buf;
-    p.count = &count;
-    call SystemCall.start(&readTask, &s, id, &p);
-    
-    atomic {
-      call SystemCallQueue.remove(&readstream_queue, &s);
-      return p.error;
-    }
-  }
-  
-  event void ReadStream.bufferDone[uint8_t id](error_t result, 
-                        uint16_t* buf, uint16_t count) {
-    //Should never get here!!!!!!
-  }
-                        
-  event void ReadStream.readDone[uint8_t id](error_t result, uint32_t usPeriod) {
-    syscall_t* s = call SystemCallQueue.find(&read_queue, id);
-    readstream_params_t* p = s->params;
-    *(p->usPeriod) = usPeriod;
-    p->error = result;
-    call SystemCall.finish(s);  
-  }
-}
diff --git a/tos/lib/tosthreads/system/BlockingReadP.nc b/tos/lib/tosthreads/system/BlockingReadP.nc
new file mode 100644 (file)
index 0000000..be16b88
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2008 Stanford University.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the
+ *   distribution.
+ * - Neither the name of the Stanford University nor the names of
+ *   its contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL STANFORD
+ * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @author Kevin Klues <klueska@cs.stanford.edu>
+ */
+
+generic module BlockingReadP() {
+  provides {
+    interface Init;
+    interface BlockingRead<uint16_t> as BlockingRead[uint8_t client];
+  }
+  uses {
+    interface Read<uint16_t> as Read[uint8_t client];
+    
+    interface SystemCall;
+    interface SystemCallQueue;
+  }
+}
+implementation {
+
+  typedef struct read_params {
+    uint16_t* val;
+    error_t   error;
+  } read_params_t;
+
+  syscall_queue_t read_queue;
+  
+  command error_t Init.init() {
+    call SystemCallQueue.init(&read_queue);
+    return SUCCESS;
+  }
+  
+  /**************************** Read ********************************/
+  void readTask(syscall_t* s) {
+    read_params_t* p = s->params;
+    p->error = call Read.read[s->id]();
+    if(p->error != SUCCESS) {
+      call SystemCall.finish(s);
+    } 
+  }  
+  
+  command error_t BlockingRead.read[uint8_t id](uint16_t* val) {
+    syscall_t s;
+    read_params_t p;
+    atomic {
+      if(call SystemCallQueue.find(&read_queue, id) != NULL)
+        return EBUSY;
+      call SystemCallQueue.enqueue(&read_queue, &s);
+    }
+    
+    p.val = val;
+    call SystemCall.start(&readTask, &s, id, &p);
+    
+    atomic {
+      call SystemCallQueue.remove(&read_queue, &s);
+      return p.error;
+    }
+  }
+  
+  event void Read.readDone[uint8_t id]( error_t result, uint16_t val ) {
+    syscall_t* s = call SystemCallQueue.find(&read_queue, id);
+    read_params_t* p = s->params;
+    *(p->val) = val;
+    p->error = result;
+    call SystemCall.finish(s);  
+  }
+}
diff --git a/tos/lib/tosthreads/system/BlockingReadStreamP.nc b/tos/lib/tosthreads/system/BlockingReadStreamP.nc
new file mode 100644 (file)
index 0000000..616c5e7
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2008 Stanford University.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the
+ *   distribution.
+ * - Neither the name of the Stanford University nor the names of
+ *   its contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL STANFORD
+ * UNIVERSITY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @author Kevin Klues <klueska@cs.stanford.edu>
+ */
+
+generic module BlockingReadStreamP() {
+  provides {
+    interface Init;
+    interface BlockingReadStream<uint16_t> as BlockingReadStream[uint8_t streamClient];
+  }
+  uses {
+    interface ReadStream<uint16_t> as ReadStream[uint8_t streamClient];
+    
+    interface SystemCall;
+    interface SystemCallQueue;
+  }
+}
+implementation {
+
+  typedef struct readstream_params {
+    uint32_t* usPeriod;
+    uint16_t* buf;
+    uint16_t* count;
+    error_t   error;
+  } readstream_params_t;
+
+  syscall_queue_t readstream_queue;
+  
+  command error_t Init.init() {
+    call SystemCallQueue.init(&readstream_queue);
+    return SUCCESS;
+  }
+  
+  /**************************** ReadStream ********************************/
+  void readStreamTask(syscall_t* s) {
+    readstream_params_t* p = s->params;
+    p->error = call ReadStream.postBuffer[s->id](p->buf, *(p->count));
+    if(p->error == SUCCESS)
+      p->error = call ReadStream.read[s->id](*(p->usPeriod));
+    if(p->error != SUCCESS)
+      call SystemCall.finish(s);
+  }
+  
+  command error_t BlockingReadStream.read[uint8_t id](uint32_t* usPeriod, uint16_t* buf, uint16_t count) {
+    syscall_t s;
+    readstream_params_t p;
+    atomic {
+      if(call SystemCallQueue.find(&readstream_queue, id) != NULL)
+        return EBUSY;
+      call SystemCallQueue.enqueue(&readstream_queue, &s);
+    }
+    
+    p.usPeriod = usPeriod;
+    p.buf = buf;
+    p.count = &count;
+    call SystemCall.start(&readStreamTask, &s, id, &p);
+    
+    atomic {
+      call SystemCallQueue.remove(&readstream_queue, &s);
+      return p.error;
+    }
+  }
+  
+  event void ReadStream.bufferDone[uint8_t id](error_t result, 
+                        uint16_t* buf, uint16_t count) {
+    //Should never get here!!!!!!
+  }
+                        
+  event void ReadStream.readDone[uint8_t id](error_t result, uint32_t usPeriod) {
+    syscall_t* s = call SystemCallQueue.find(&readstream_queue, id);
+    readstream_params_t* p = s->params;
+    *(p->usPeriod) = usPeriod;
+    p->error = result;
+    call SystemCall.finish(s);  
+  }
+}