From de3bf162a7f3764ba43088c13e9e656c2a9ae4f1 Mon Sep 17 00:00:00 2001 From: smckown Date: Mon, 9 Nov 2009 19:30:52 +0000 Subject: [PATCH] Enhancements to AeroVaneReadC. * Anemometer is read immediately after the Timer fires to reduce jitter. * Count interface is renamed Revolutions to be more meaningful. * m_count is now uint8_t to reflect a more reasonable real life range. * Direction data is returned no as degrees but as a 10-bit unsigned value. * m_sum accumulates the correct, updated angle values. * Rounding is done properly when m_sum is negative. --- tos/platforms/tmirws/sensors/AeroVaneReadC.nc | 2 +- tos/platforms/tmirws/sensors/AeroVaneReadP.nc | 41 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/tos/platforms/tmirws/sensors/AeroVaneReadC.nc b/tos/platforms/tmirws/sensors/AeroVaneReadC.nc index 1b2fcf2e..5ba23a9f 100644 --- a/tos/platforms/tmirws/sensors/AeroVaneReadC.nc +++ b/tos/platforms/tmirws/sensors/AeroVaneReadC.nc @@ -51,7 +51,7 @@ implementation { components AnemometerReadC; AeroVaneReadP.AnemometerControl -> AnemometerReadC.StdControl; - AeroVaneReadP.Count -> AnemometerReadC; + AeroVaneReadP.Revolutions -> AnemometerReadC; components new StateC(); AeroVaneReadP.State -> StateC; diff --git a/tos/platforms/tmirws/sensors/AeroVaneReadP.nc b/tos/platforms/tmirws/sensors/AeroVaneReadP.nc index c620006e..68be7c67 100644 --- a/tos/platforms/tmirws/sensors/AeroVaneReadP.nc +++ b/tos/platforms/tmirws/sensors/AeroVaneReadP.nc @@ -42,7 +42,7 @@ generic module AeroVaneReadP(uint16_t period) { interface Timer; interface Read; interface StdControl as AnemometerControl; - interface AsyncGet as Count; + interface Get as Revolutions; interface State; } } @@ -54,7 +54,8 @@ implementation { PHYS_PER_READ = 4, /* # of physical reads per reading */ }; - uint16_t m_count; + uint8_t m_count; + uint16_t m_speed; int m_vane; int m_sum; @@ -87,6 +88,11 @@ implementation { event void Timer.fired() { + if (++m_count == PHYS_PER_READ) { + /* Get anemometer revolutions for the period */ + m_speed = call Revolutions.get(); + } + if (!(call State.isIdle())) call Read.read(); } @@ -95,10 +101,10 @@ implementation { { int d = angle2 - angle1; - if (d <= -180) - d += 360; - else if (d > 180) - d -= 360; + if (d <= -512) + d += 1024; + else if (d > 512) + d -= 1024; return d; } @@ -110,20 +116,17 @@ implementation { return; newVane = m_vane + distance(m_vane, result); - m_sum += result; + m_sum += m_vane; m_vane = newVane; - if (++m_count == PHYS_PER_READ) { - norace aerovector_t vector; - - /* Get speed average */ - atomic vector.speed = (call Count.get() * 2.25) / (period * 4 / 1024) + - 0.5; - - /* Complete direction average */ - vector.dir = m_sum / PHYS_PER_READ; - while (vector.dir < 0) - vector.dir += 360; - vector.dir %= 360; + 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 */ -- 2.39.2