a

Dependencies:   mbed mbed-rtos

Committer:
alexpirciu
Date:
Thu Mar 28 07:44:42 2019 +0000
Revision:
1:ceee5a608e7c
assa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alexpirciu 1:ceee5a608e7c 1 /**
alexpirciu 1:ceee5a608e7c 2 ******************************************************************************
alexpirciu 1:ceee5a608e7c 3 * @file SerialMonitor.cpp
alexpirciu 1:ceee5a608e7c 4 * @author RBRO/PJ-IU
alexpirciu 1:ceee5a608e7c 5 * @version V1.0.0
alexpirciu 1:ceee5a608e7c 6 * @date day-month-2017
alexpirciu 1:ceee5a608e7c 7 * @brief This file contains the class definition for the serial communication
alexpirciu 1:ceee5a608e7c 8 * functionality.
alexpirciu 1:ceee5a608e7c 9 ******************************************************************************
alexpirciu 1:ceee5a608e7c 10 */
alexpirciu 1:ceee5a608e7c 11
alexpirciu 1:ceee5a608e7c 12 #include <SerialMonitor/serialmonitor.hpp>
alexpirciu 1:ceee5a608e7c 13
alexpirciu 1:ceee5a608e7c 14
alexpirciu 1:ceee5a608e7c 15 namespace serial{
alexpirciu 1:ceee5a608e7c 16
alexpirciu 1:ceee5a608e7c 17 /** @brief CSerialMonitor class constructor
alexpirciu 1:ceee5a608e7c 18 *
alexpirciu 1:ceee5a608e7c 19 *
alexpirciu 1:ceee5a608e7c 20 * @param f_serialPort reference to serial object
alexpirciu 1:ceee5a608e7c 21 * @param f_serialSubscriberMap sensor mounteed on left front part
alexpirciu 1:ceee5a608e7c 22 */
alexpirciu 1:ceee5a608e7c 23 CSerialMonitor::CSerialMonitor(Serial& f_serialPort
alexpirciu 1:ceee5a608e7c 24 ,CSerialSubscriberMap f_serialSubscriberMap)
alexpirciu 1:ceee5a608e7c 25 :task::CTask(0)
alexpirciu 1:ceee5a608e7c 26 , m_serialPort(f_serialPort)
alexpirciu 1:ceee5a608e7c 27 , m_RxBuffer()
alexpirciu 1:ceee5a608e7c 28 , m_TxBuffer()
alexpirciu 1:ceee5a608e7c 29 , m_parseBuffer()
alexpirciu 1:ceee5a608e7c 30 , m_parseIt(m_parseBuffer.begin())
alexpirciu 1:ceee5a608e7c 31 , m_serialSubscriberMap(f_serialSubscriberMap)
alexpirciu 1:ceee5a608e7c 32 {
alexpirciu 1:ceee5a608e7c 33 m_serialPort.attach(mbed::callback(&CSerialMonitor::RxCallback, this), Serial::RxIrq);
alexpirciu 1:ceee5a608e7c 34 m_serialPort.attach(mbed::callback(&CSerialMonitor::TxCallback, this), Serial::TxIrq);
alexpirciu 1:ceee5a608e7c 35 }
alexpirciu 1:ceee5a608e7c 36
alexpirciu 1:ceee5a608e7c 37 /** @brief Rx callback
alexpirciu 1:ceee5a608e7c 38 *
alexpirciu 1:ceee5a608e7c 39 * @param thisPointer the object pointer
alexpirciu 1:ceee5a608e7c 40 *
alexpirciu 1:ceee5a608e7c 41 */
alexpirciu 1:ceee5a608e7c 42 void CSerialMonitor::RxCallback(void *thisPointer)
alexpirciu 1:ceee5a608e7c 43 {
alexpirciu 1:ceee5a608e7c 44 CSerialMonitor* self = static_cast<CSerialMonitor*>(thisPointer);
alexpirciu 1:ceee5a608e7c 45 self->serialRxCallback();
alexpirciu 1:ceee5a608e7c 46 }
alexpirciu 1:ceee5a608e7c 47
alexpirciu 1:ceee5a608e7c 48 /** @brief Tx callback
alexpirciu 1:ceee5a608e7c 49 *
alexpirciu 1:ceee5a608e7c 50 * @param thisPointer the object pointer
alexpirciu 1:ceee5a608e7c 51 *
alexpirciu 1:ceee5a608e7c 52 */
alexpirciu 1:ceee5a608e7c 53 void CSerialMonitor::TxCallback(void *thisPointer)
alexpirciu 1:ceee5a608e7c 54 {
alexpirciu 1:ceee5a608e7c 55 CSerialMonitor* self = static_cast<CSerialMonitor*>(thisPointer);
alexpirciu 1:ceee5a608e7c 56 self->serialTxCallback();
alexpirciu 1:ceee5a608e7c 57 }
alexpirciu 1:ceee5a608e7c 58
alexpirciu 1:ceee5a608e7c 59 /** @brief Rx callback actions
alexpirciu 1:ceee5a608e7c 60 *
alexpirciu 1:ceee5a608e7c 61 * @param None
alexpirciu 1:ceee5a608e7c 62 *
alexpirciu 1:ceee5a608e7c 63 */
alexpirciu 1:ceee5a608e7c 64 void CSerialMonitor::serialRxCallback()
alexpirciu 1:ceee5a608e7c 65 {
alexpirciu 1:ceee5a608e7c 66 __disable_irq();
alexpirciu 1:ceee5a608e7c 67 while ((m_serialPort.readable()) && (!m_RxBuffer.isFull())) {
alexpirciu 1:ceee5a608e7c 68 char l_c = m_serialPort.getc();
alexpirciu 1:ceee5a608e7c 69 m_RxBuffer.push(l_c);
alexpirciu 1:ceee5a608e7c 70 }
alexpirciu 1:ceee5a608e7c 71 __enable_irq();
alexpirciu 1:ceee5a608e7c 72 return;
alexpirciu 1:ceee5a608e7c 73 }
alexpirciu 1:ceee5a608e7c 74
alexpirciu 1:ceee5a608e7c 75 /** @brief Tx callback actions
alexpirciu 1:ceee5a608e7c 76 *
alexpirciu 1:ceee5a608e7c 77 * @param None
alexpirciu 1:ceee5a608e7c 78 *
alexpirciu 1:ceee5a608e7c 79 */
alexpirciu 1:ceee5a608e7c 80 void CSerialMonitor::serialTxCallback()
alexpirciu 1:ceee5a608e7c 81 {
alexpirciu 1:ceee5a608e7c 82 __disable_irq();
alexpirciu 1:ceee5a608e7c 83 while ((m_serialPort.writeable()) && (!m_TxBuffer.isEmpty())) {
alexpirciu 1:ceee5a608e7c 84 m_serialPort.putc(m_TxBuffer.pop());
alexpirciu 1:ceee5a608e7c 85 }
alexpirciu 1:ceee5a608e7c 86 __enable_irq();
alexpirciu 1:ceee5a608e7c 87 return;
alexpirciu 1:ceee5a608e7c 88 }
alexpirciu 1:ceee5a608e7c 89
alexpirciu 1:ceee5a608e7c 90 /** @brief Run method
alexpirciu 1:ceee5a608e7c 91 *
alexpirciu 1:ceee5a608e7c 92 * @param None
alexpirciu 1:ceee5a608e7c 93 * @param None
alexpirciu 1:ceee5a608e7c 94 */
alexpirciu 1:ceee5a608e7c 95 void CSerialMonitor::_run()
alexpirciu 1:ceee5a608e7c 96 {
alexpirciu 1:ceee5a608e7c 97 if ((!m_RxBuffer.isEmpty()))
alexpirciu 1:ceee5a608e7c 98 {
alexpirciu 1:ceee5a608e7c 99 char l_c = m_RxBuffer.pop();
alexpirciu 1:ceee5a608e7c 100 // m_serialPort.printf("%c",l_c);
alexpirciu 1:ceee5a608e7c 101 if ('#' == l_c)
alexpirciu 1:ceee5a608e7c 102 {
alexpirciu 1:ceee5a608e7c 103 m_parseIt = m_parseBuffer.begin();
alexpirciu 1:ceee5a608e7c 104 m_parseIt[0] = l_c;
alexpirciu 1:ceee5a608e7c 105 m_parseIt++;
alexpirciu 1:ceee5a608e7c 106 return;
alexpirciu 1:ceee5a608e7c 107 }
alexpirciu 1:ceee5a608e7c 108 if (m_parseIt != m_parseBuffer.end())
alexpirciu 1:ceee5a608e7c 109 {
alexpirciu 1:ceee5a608e7c 110 if (l_c == '\n')
alexpirciu 1:ceee5a608e7c 111 {
alexpirciu 1:ceee5a608e7c 112 if ((';' == m_parseIt[-3]) && (';' == m_parseIt[-2]) && ('\r' == m_parseIt[-1]))
alexpirciu 1:ceee5a608e7c 113 {
alexpirciu 1:ceee5a608e7c 114 char l_msgID[5];
alexpirciu 1:ceee5a608e7c 115 char l_msg[256];
alexpirciu 1:ceee5a608e7c 116
alexpirciu 1:ceee5a608e7c 117 uint32_t res = sscanf(m_parseBuffer.data(),"#%4s:%s;;",l_msgID,l_msg);
alexpirciu 1:ceee5a608e7c 118 if (res == 2)
alexpirciu 1:ceee5a608e7c 119 {
alexpirciu 1:ceee5a608e7c 120 auto l_pair = m_serialSubscriberMap.find(l_msgID);
alexpirciu 1:ceee5a608e7c 121 if (l_pair != m_serialSubscriberMap.end())
alexpirciu 1:ceee5a608e7c 122 {
alexpirciu 1:ceee5a608e7c 123 char l_resp[256] = "no response given";
alexpirciu 1:ceee5a608e7c 124 string s(l_resp);
alexpirciu 1:ceee5a608e7c 125 l_pair->second(l_msg,l_resp);
alexpirciu 1:ceee5a608e7c 126 m_serialPort.printf("@%s:%s\r\n",l_msgID,l_resp);
alexpirciu 1:ceee5a608e7c 127 }
alexpirciu 1:ceee5a608e7c 128 }
alexpirciu 1:ceee5a608e7c 129 m_parseIt = m_parseBuffer.begin();
alexpirciu 1:ceee5a608e7c 130 }
alexpirciu 1:ceee5a608e7c 131 }
alexpirciu 1:ceee5a608e7c 132 m_parseIt[0] = l_c;
alexpirciu 1:ceee5a608e7c 133 m_parseIt++;
alexpirciu 1:ceee5a608e7c 134 return;
alexpirciu 1:ceee5a608e7c 135 }
alexpirciu 1:ceee5a608e7c 136 }
alexpirciu 1:ceee5a608e7c 137 }
alexpirciu 1:ceee5a608e7c 138
alexpirciu 1:ceee5a608e7c 139 }; // namespace serial