a

Dependencies:   mbed mbed-rtos

src/SerialMonitor/serialmonitor.cpp

Committer:
alexpirciu
Date:
2019-03-28
Revision:
1:ceee5a608e7c

File content as of revision 1:ceee5a608e7c:

/**
  ******************************************************************************
  * @file    SerialMonitor.cpp
  * @author  RBRO/PJ-IU
  * @version V1.0.0
  * @date    day-month-2017
  * @brief   This file contains the class definition for the serial communication
  *          functionality.
  ******************************************************************************
 */

#include <SerialMonitor/serialmonitor.hpp>


namespace serial{

    /** @brief  CSerialMonitor class constructor
     *
     *
     *  @param f_serialPort               reference to serial object
     *  @param f_serialSubscriberMap      sensor mounteed on left front part
     */
    CSerialMonitor::CSerialMonitor(Serial& f_serialPort
                    ,CSerialSubscriberMap f_serialSubscriberMap)
            :task::CTask(0)
            , m_serialPort(f_serialPort)
            , m_RxBuffer()
            , m_TxBuffer()
            , m_parseBuffer()
            , m_parseIt(m_parseBuffer.begin())
            , m_serialSubscriberMap(f_serialSubscriberMap) 
            {
                m_serialPort.attach(mbed::callback(&CSerialMonitor::RxCallback, this), Serial::RxIrq);
                m_serialPort.attach(mbed::callback(&CSerialMonitor::TxCallback, this), Serial::TxIrq);
            }

    /** @brief  Rx callback
     *
     *  @param thisPointer         the object pointer
     *  
     */
    void CSerialMonitor::RxCallback(void *thisPointer)
    {
        CSerialMonitor* self = static_cast<CSerialMonitor*>(thisPointer);
        self->serialRxCallback(); 
    }

    /** @brief  Tx callback
     *
     *  @param thisPointer         the object pointer
     *  
     */
    void CSerialMonitor::TxCallback(void *thisPointer)
    {
        CSerialMonitor* self = static_cast<CSerialMonitor*>(thisPointer);
        self->serialTxCallback(); 
    }

    /** @brief  Rx callback actions
     *
     *  @param None
     *  
     */
    void CSerialMonitor::serialRxCallback()
    {
        __disable_irq();
        while ((m_serialPort.readable()) && (!m_RxBuffer.isFull())) {
            char l_c = m_serialPort.getc();
            m_RxBuffer.push(l_c);
        }
        __enable_irq();
        return;
    }

    /** @brief  Tx callback actions
     *
     *  @param None
     *  
     */
    void CSerialMonitor::serialTxCallback()
    {
        __disable_irq();
        while ((m_serialPort.writeable()) && (!m_TxBuffer.isEmpty())) {
            m_serialPort.putc(m_TxBuffer.pop());
        }
        __enable_irq();
        return;
    }

    /** @brief  Run method
     * 
     *  @param  None
     *  @param None
     */
    void CSerialMonitor::_run()
    {
        if ((!m_RxBuffer.isEmpty()))
        {
            char l_c = m_RxBuffer.pop();
            // m_serialPort.printf("%c",l_c);
            if ('#' == l_c)
            {
                m_parseIt = m_parseBuffer.begin();
                m_parseIt[0] = l_c;
                m_parseIt++;
                return;
            }
            if (m_parseIt != m_parseBuffer.end())
            {
                if (l_c == '\n')
                {
                    if ((';' == m_parseIt[-3]) && (';' == m_parseIt[-2]) && ('\r' == m_parseIt[-1]))
                    {
                        char l_msgID[5];
                        char l_msg[256];

                        uint32_t res = sscanf(m_parseBuffer.data(),"#%4s:%s;;",l_msgID,l_msg);
                        if (res == 2)
                        {
                            auto l_pair = m_serialSubscriberMap.find(l_msgID);
                            if (l_pair != m_serialSubscriberMap.end())
                            {
                                char l_resp[256] = "no response given";
                                string s(l_resp);
                                l_pair->second(l_msg,l_resp);
                                m_serialPort.printf("@%s:%s\r\n",l_msgID,l_resp);
                            }
                        }
                        m_parseIt = m_parseBuffer.begin();
                    }
                }
                m_parseIt[0] = l_c;
                m_parseIt++;
                return;
            }
        }
    }

}; // namespace serial