Alex Pirciu
/
BFMC
a
src/SerialMonitor/serialmonitor.cpp@1:ceee5a608e7c, 2019-03-28 (annotated)
- Committer:
- alexpirciu
- Date:
- Thu Mar 28 07:44:42 2019 +0000
- Revision:
- 1:ceee5a608e7c
assa
Who changed what in which revision?
User | Revision | Line number | New 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 |