]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Use AverageAngleC in AeroVaneReadC.
authorsmckown <smckown@4bc1554a-c7f2-4f65-a403-e0be01f0239c>
Mon, 9 Nov 2009 19:31:01 +0000 (19:31 +0000)
committerR. Steve McKown <rsmckown@gmail.com>
Tue, 1 Dec 2009 03:01:52 +0000 (20:01 -0700)
tos/platforms/tmirws/sensors/AeroVaneReadC.nc
tos/platforms/tmirws/sensors/AeroVaneReadP.nc

index 5ba23a9f4837351941ad97d293d977a100119df0..8475bdac4fa19e3987fbd33a71d5e46e6212b833 100644 (file)
@@ -53,6 +53,9 @@ implementation {
   AeroVaneReadP.AnemometerControl -> AnemometerReadC.StdControl;
   AeroVaneReadP.Revolutions -> AnemometerReadC;
 
+  components new AverageAngleC();
+  AeroVaneReadP.Average -> AverageAngleC;
+
   components new StateC();
   AeroVaneReadP.State -> StateC;
 }
index 68be7c67c700e80ba84e06eb34554ef4cf5bfd94..71d04b08b661655ad28bf04526220f6f99d51cfb 100644 (file)
@@ -43,6 +43,7 @@ generic module AeroVaneReadP(uint16_t period) {
     interface Read<uint16_t>;
     interface StdControl as AnemometerControl;
     interface Get<uint16_t> as Revolutions;
+    interface Average<uint16_t>;
     interface State;
   }
 }
@@ -56,14 +57,11 @@ implementation {
 
   uint8_t m_count;
   uint16_t m_speed;
-  int m_vane;
-  int m_sum;
 
-  void init()
+  inline void init()
   {
     m_count = 0;
-    m_vane = 0;
-    m_sum = 0;
+    call Average.reset();
   }
 
   command error_t Notify.enable()
@@ -93,45 +91,29 @@ implementation {
       m_speed = call Revolutions.get();
     }
 
-    if (!(call State.isIdle()))
+    if (!(call State.isIdle())) {
+      /* Avoid notifying if the user has disabled */
       call Read.read();
-  }
-
-  int distance(int angle1, int angle2)
-  {
-    int d = angle2 - angle1;
-
-    if (d <= -512)
-      d += 1024;
-    else if (d > 512)
-      d -= 1024;
-    return d;
+    }
   }
 
   event void Read.readDone(error_t error, uint16_t result)
   {
-    int newVane;
-
-    if (error != SUCCESS)
-      return;
+    if (error == SUCCESS)
+      call Average.submit(result);
 
-    newVane = m_vane + distance(m_vane, result);
-    m_sum += m_vane;
-    m_vane = newVane;
     if (m_count == PHYS_PER_READ) {
-      aerovector_t vector;
-
-      vector.speed = m_speed;
-      if (m_sum > 0)
-       vector.dir = (m_sum + (PHYS_PER_READ / 2)) / PHYS_PER_READ;
-      else
-       vector.dir = (m_sum - (PHYS_PER_READ / 2)) / PHYS_PER_READ + 1024;
-      vector.dir &= 0x03ff; /* %= 1024 */
-      init();
-
-      /* Inform the consumer of the vector */
-      if (!(call State.isIdle()))
+      if (call State.isIdle()) {
+       /* Avoid notifying if the user has disabled */
+       init();
+      } else {
+       aerovector_t vector;
+
+       vector.dir = call Average.average();
+       vector.speed = m_speed;
+       init();
        signal Notify.notify(vector);
+      }
     }
   }
 }