]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/platforms/tmirws/sensors/AverageAngleC.nc
Redo Average interface.
[tinyos-2.x.git] / tos / platforms / tmirws / sensors / AverageAngleC.nc
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;
   }
 }