X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=blobdiff_plain;f=tos%2Fplatforms%2Ftmirws%2Fsensors%2FAverageAngleC.nc;h=65565b2a38e86586a3f914f73ca82deb207c386a;hp=52d03ac592a5df3c9eefc21dc6db303d603e2037;hb=31c5577e7d049bcb6dfc5e3d0a2c8bfd324ef25c;hpb=f54520e9a604b832eb3498102975f50f1494d1c3 diff --git a/tos/platforms/tmirws/sensors/AverageAngleC.nc b/tos/platforms/tmirws/sensors/AverageAngleC.nc index 52d03ac5..65565b2a 100644 --- a/tos/platforms/tmirws/sensors/AverageAngleC.nc +++ b/tos/platforms/tmirws/sensors/AverageAngleC.nc @@ -34,7 +34,9 @@ * @author R. Steve McKown */ -generic module AverageAngleC(uint16_t samples) { +#include "AeroVane.h" /* For AEROVANE_VECTOR_NULL */ + +generic module AverageAngleC() { provides interface Average; } 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; } }