listen serial input and react by callback registered.
Dependents: Interference_Simple StrCommandHandler_Demo SerialInputReactionHandler_DEMO
Diff: SerialInputReactionHandler.cpp
- Revision:
- 1:fd211f137803
- Parent:
- 0:ec916055f0dd
- Child:
- 2:4718a4eaf340
--- a/SerialInputReactionHandler.cpp Tue Nov 12 01:10:29 2019 +0000 +++ b/SerialInputReactionHandler.cpp Tue Nov 12 02:41:58 2019 +0000 @@ -34,7 +34,7 @@ void SerialInputReactionHandler::quit() { m_serial_socket->attach(NULL); -} +} void SerialInputReactionHandler::commonProcedure() { @@ -56,7 +56,8 @@ { m_buffer_c = m_serial_socket->getc(); m_buffer_s = m_buffer_c; - callback_onCommand(m_buffer_s.c_str()); + if(m_buffer_c != 0x1B && isArrowSymbol()) + callback_onCommand(m_buffer_s.c_str()); m_serial_socket->printf("Single key board input: %c (%x)\n", m_buffer_c, m_buffer_c); discardBuffer(); } @@ -78,11 +79,32 @@ || (0x7B <= arg_c && arg_c <= 0x7E)); } +bool SerialInputReactionHandler::isArrowSymbol() +{ + // If only 0x1B, ESC KEY should be Pressed, else some symbol sequence. + if (m_buffer_c == 0x1B && m_serial_socket->readable()) { + m_buffer_s = m_buffer_c; + m_buffer_c = m_serial_socket->getc(); + + // If 0x5B follows, it coul be arrow key was pressed + if (m_buffer_c == 0x5B && m_serial_socket->readable()) { + m_buffer_s += m_buffer_c; + m_buffer_c = m_serial_socket->getc(); + } else m_buffer_c = 0x1B; + + m_buffer_s += m_buffer_c; + } else m_buffer_c = 0x1B; + + if (m_buffer_c == 0x1B) return false; + else return true; +} + + void SerialInputReactionHandler::listenKBTillEnter() { __disable_irq(); m_buffer_c = m_serial_socket->getc(); - + if ( isUpperCase(m_buffer_c) || isLowerCase(m_buffer_c) || isSymbol( m_buffer_c)) { if(m_buffer_s.length() != 0 && m_buffer_s[0] != '\0') @@ -97,23 +119,10 @@ m_serial_socket->putc(m_buffer_c); discardBuffer(); - } else if (m_buffer_c == 0x1B /*ESC*/) { - - // If only 0x1B, ESC KEY should be Pressed, else some symbol sequence. - if (m_serial_socket->readable()) { - m_buffer_s += m_buffer_c; - m_buffer_c = m_serial_socket->getc(); + } else if (isArrowSymbol()) { - // If 0x5B follows, it coul be arrow key was pressed - if (m_buffer_c == 0x5B && m_serial_socket->readable()) { - m_buffer_s += m_buffer_c; - m_buffer_c = m_serial_socket->getc(); - } - - m_buffer_s += m_buffer_c; - // Arrows - callback_onCommand(m_buffer_s.c_str()); - } + // Arrows + callback_onCommand(m_buffer_s.c_str()); discardBuffer(); } else { @@ -127,15 +136,10 @@ m_serial_socket->putc(0x08); break; case 0x1B /*ESC*/: + discardBuffer(); break; } } __enable_irq(); } - -void SerialInputReactionHandler::discardBuffer() -{ - m_buffer_c = '\0'; - m_buffer_s = ""; -}