]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Redo Average interface.
authorsmckown <smckown@4bc1554a-c7f2-4f65-a403-e0be01f0239c>
Mon, 9 Nov 2009 19:30:58 +0000 (19:30 +0000)
committerR. Steve McKown <rsmckown@gmail.com>
Tue, 1 Dec 2009 03:01:51 +0000 (20:01 -0700)
There is no point in having the averagers pre-know their number of samples.
The user should know this information.  Therefore we have a more flexible
solution and avoid a signal to return the averate to the user when that user is
very likely to want to call a command instead.

tos/platforms/tmirws/sensors/Average.nc
tos/platforms/tmirws/sensors/AverageAngleC.nc
tos/platforms/tmirws/sensors/AveragePolarP.nc
tos/platforms/tmirws/sensors/AverageU16C.nc

index cccb75a801b8977a11bc4e40d413e508477560b4..d9ed12c339a7970f6ae3c7df93b9b81d8178859b 100644 (file)
@@ -41,16 +41,16 @@ interface Average<val_t> {
   command void reset();
 
   /* Submit a value to the averager, to be averaged into the next average. */
-  command void submit(val_t);
+  command void submit(val_t value);
 
-  /* Submit a null value to the averager.  Each null submitted counts as one
-   * of the expected values for calculating the average.  Each null submitted
-   * reduces the divisor for the subsequent average by one.
+  /* Return the number of values submitted since the last
+   * <code>reset()</code> or <code>average()</code>.
    */
-  command void null();
+  command uint16_t count();
 
-  /* Signalled after the expected number of samples + nulls have been delivered
-   * and their set have been used to calculate a new average.
+  /* Ask for the average of the values submitted since the last
+   * <code>reset()</code> or <code>average()</code>.  <code>average()</code>
+   * also performs a <code>reset()</code>.
    */
-  event void average(val_t);
+  command val_t average();
 }
index 52d03ac592a5df3c9eefc21dc6db303d603e2037..65565b2a38e86586a3f914f73ca82deb207c386a 100644 (file)
@@ -34,7 +34,9 @@
  * @author R. Steve McKown <rsmckown@gmail.com>
  */
  
-generic module AverageAngleC(uint16_t samples) {
+#include "AeroVane.h"  /* For AEROVANE_VECTOR_NULL */
+
+generic module AverageAngleC() {
   provides interface Average<uint16_t>;
 }
 implementation {
@@ -53,24 +55,6 @@ implementation {
     init();
   }
 
-  task void signalAverage()
-  {
-    int16_t angle;
-
-    if (m_angle > 0)
-      angle = (m_angle + (m_count / 2)) / m_count;
-    else {
-      angle = (m_angle - (m_count / 2)) / m_count;
-      while (m_angle < 0)
-       angle += 1024;
-    }
-    angle &= 0x03ff; /* %= 1024 */
-    init();
-
-    /* Inform the consumer of the average angle */
-    signal Average.average(angle);
-  }
-
   int distance(int angle1, int angle2)
   {
     int d = angle2 - angle1;
@@ -84,15 +68,37 @@ implementation {
 
   command void Average.submit(uint16_t angle)
   {
-    m_lastAngle += distance(m_lastAngle, angle);
+    if (m_count++ == 0)
+      m_lastAngle = angle;
+    else
+      m_lastAngle += distance(m_lastAngle, angle);
     m_angle += m_lastAngle;
-    if (++m_count == samples)
-      post signalAverage();
   }
 
-  command void Average.null()
+  command uint16_t Average.average()
+  {
+    uint16_t angle;
+
+    if (m_count == 0)
+      angle = AEROVANE_VECTOR_NULL;
+    else {
+      angle = m_angle;
+
+      if (angle > 0)
+       angle = (angle + (m_count / 2)) / m_count;
+      else if (angle < 0) {
+       angle = (angle - (m_count / 2)) / m_count;
+       while (angle < 0)
+         angle += 1024;
+      }
+      angle &= 0x03ff; /* %= 1024 */
+    }
+    init();
+    return angle;
+  }
+
+  command uint16_t Average.count()
   {
-    if (++m_count == samples)
-      post signalAverage();
+    return m_count;
   }
 }
index cf49de690e72c20ceff8e07689914c3b462c644c..4031078d052b77012a551429ac16393326b5b50e 100644 (file)
 generic module AveragePolarC(uint16_t samples) {
   provides interface Average<aerovector_t>;
   uses {
-    interface Average<int16_t> as AverageAngle;
+    interface Average<uint16_t> as AverageAngle;
     interface Average<uint16_t> as AverageSpeed;
   }
 }
 implementation {
   int m_count;
-  aerovector_t vector;
 
   command void Average.reset()
   {
@@ -54,29 +53,24 @@ implementation {
     AverageSpeed.init();
   }
 
-  event void AverageAngle.average(uint16_t angle)
+  command uint16_t Average.submit(aerovector_t vector)
   {
-    vector.dir = angle;
-    if (++m_count == 2)
-      signal Average.average(vector);
+    call AverageAngle.submit(vector.dir);
+    call AverageSpeed.submit(vector.speed);
   }
 
-  event void AverageSpeed.average(uint16_t speed)
+  command aerovector_t Average.average()
   {
-    vector.speed = speed;
-    if (++m_count == 2)
-      signal Average.average(vector);
-  }
+    aerovector_t vector;
 
-  command void Average.submit(aerovector_t vector)
-  {
-    call AverageAngle.submit(vector.dir);
-    call AverageSpeed.submit(vector.speed);
+    vector.dir = call AverageAngle.average();
+    vector.speed = call AverageSpeed.average();
+    init();
+    return vector;
   }
 
-  command void Average.null()
+  command uint16_t Average.count()
   {
-    call AverageAngle.submit(vector.dir);
-    call AverageSpeed.submit(vector.speed);
+    return call AverageAngle.count();
   }
 }
index 85daac5c3b970c667e39078a4a75b86454c032bc..0885614105b6d72e75b148e2b7986cd1f467f430 100644 (file)
  
 #include "AeroVane.h"
 
-generic module AverageU16(uint16_t samples) {
-  provides interface Average<aerovector_t>;
+generic module AverageU16() {
+  provides interface Average<uint16_t>;
 }
 implementation {
-  uint8_t m_count;
+  uint16_t m_count;
   uint16_t m_value;
 
   inline void init()
@@ -53,27 +53,25 @@ implementation {
     init();
   }
 
-  task void signalAverage()
+  command Average.submit(uint16_t value)
   {
-    uint16_t value;
-
-    value = (m_value + (m_count / 2)) / m_count;
-    init();
-
-    /* Inform the consumer of the vector */
-    signal Average.average(vector);
+    m_count++;
+    m_value += value;
   }
 
-  command Average.submit(uint16_t value)
+  command uint16_t Average.average()
   {
-    m_value += value;
-    if (++m_count == samples)
-      post signalAverage();
+    uint16_t value = 0;
+
+    if (m_count) {
+      value = (m_value + (m_count / 2)) / m_count;
+      init();
+    }
+    return value;
   }
 
-  command Average.null()
+  command uint16_t Average.count()
   {
-    if (++m_count == samples)
-      post signalAverage();
+    return m_count;
   }
 }