Alex Pirciu
/
BFMC
a
src/Encoders/encoder.cpp
- Committer:
- alexpirciu
- Date:
- 2019-03-28
- Revision:
- 1:ceee5a608e7c
File content as of revision 1:ceee5a608e7c:
/** ****************************************************************************** * @file Encoder.cpp * @author RBRO/PJ-IU * @version V1.0.0 * @date day-month-year * @brief This file contains the class implementations for the encoder * functionality. ****************************************************************************** */ #include <Encoders/encoder.hpp> /** \brief Constructor for the CCounter class * * Constructor method * * @param f_pin digital pin connected to encoder output */ CCounter::CCounter(PinName f_pin) :m_interrupt(f_pin) ,m_count(0) { m_interrupt.rise(mbed::callback(CCounter::staticIncrement,this)); m_interrupt.fall(mbed::callback(CCounter::staticIncrement,this)); } /** \brief Counter reset method * * * */ void CCounter::reset(){ m_count=0; } /** \brief Counter increment method * * * */ void CCounter::increment(){ m_count++; } /** \brief Get counts method * * * @return counts */ int32_t CCounter::getCount(){ return m_count; } /** \brief Get counts method * * Method attaches the increment method to an object. * * @param obj object * */ void CCounter::staticIncrement(void* obj){ CCounter* self=static_cast<CCounter*>(obj); self->increment(); } /** \brief Constructor for the CEncoder class * * Constructor method * * @param f_period period value * @param f_period_sec period value in seconds * @param f_cpr counts per revolution (rise and fall edges) * @param f_pinName digital pin connected to encoder output */ CEncoder::CEncoder(uint32_t f_period ,float f_period_sec ,uint32_t f_cpr ,PinName f_pinName) :task::CTask(f_period) ,m_counter(f_pinName) ,m_period_sec(f_period_sec) ,m_cpr(f_cpr) ,m_rps(0) { } /** \brief Get rps method * * Returns the value of the rotations per second value * * * @return rps */ float CEncoder::getSpeedRps() { return m_rps; } /** \brief Get count * * Returns the value of the count * * * @return rps */ int16_t CEncoder::getCount() { return m_rps*m_period_sec*m_cpr; } /** \brief Run method * * Method executed at predefined time intervals. * Method called each f_period * * */ void CEncoder::_run() { float l_count=m_counter.getCount(); m_counter.reset(); m_rps=l_count/m_period_sec/m_cpr; } /** \brief Constructor for the CMagEncoderTime class * * Constructor method * * @param f_pin digital pin connected to encoder output */ CMagEncoderTime::CMagEncoderTime(PinName f_pin) :m_interrupt(f_pin) { m_interrupt.rise(mbed::callback(CMagEncoderTime::staticRise,this)); // m_interrupt.fall(mbed::callback(CMagEncoderTime::staticFall,this)); m_Timer.start(); } /** \brief Callback method for rising edge interrupt * * */ void CMagEncoderTime::riseCallback() { m_Timer.stop(); m_lowTime=m_Timer.read(); m_Timer.reset(); m_Timer.start(); } /** \brief Callback method for rising edge interrupt * * */ void CMagEncoderTime::fallCallback() { m_Timer.stop(); m_highTime=m_Timer.read(); m_Timer.reset(); m_Timer.start(); } /** \brief Callback method for rising edge interrupt attached to pbject * * @param obj object */ void CMagEncoderTime::staticRise(void* obj) { CMagEncoderTime* self=static_cast<CMagEncoderTime*>(obj); self->riseCallback(); } /** \brief Callback method for rising edge interrupt attached to pbject * * @param obj object * @return None */ void CMagEncoderTime::staticFall(void* obj) { CMagEncoderTime* self=static_cast<CMagEncoderTime*>(obj); self->fallCallback(); } /** \brief Callback method for rising edge interrupt * * * @return High period value */ float CMagEncoderTime::getHighTime() { return m_highTime; } /** \brief Callback method for rising edge interrupt * * @return Low period value */ float CMagEncoderTime::getLowTime() { return m_lowTime; }