* @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 {
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;
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;
}
}