X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=blobdiff_plain;f=tos%2Fplatforms%2Ftmirws%2Fsensors%2FAeroVaneReadP.nc;h=71d04b08b661655ad28bf04526220f6f99d51cfb;hp=68be7c67c700e80ba84e06eb34554ef4cf5bfd94;hb=69fc4c14eb331474d8c6654eebcf4147b7780ec8;hpb=c9c913f02451e45b41c74dec562d35f21a2960a5 diff --git a/tos/platforms/tmirws/sensors/AeroVaneReadP.nc b/tos/platforms/tmirws/sensors/AeroVaneReadP.nc index 68be7c67..71d04b08 100644 --- a/tos/platforms/tmirws/sensors/AeroVaneReadP.nc +++ b/tos/platforms/tmirws/sensors/AeroVaneReadP.nc @@ -43,6 +43,7 @@ generic module AeroVaneReadP(uint16_t period) { interface Read; interface StdControl as AnemometerControl; interface Get as Revolutions; + interface Average; 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); + } } } }