listen serial input and react by callback registered.
Dependents: Interference_Simple StrCommandHandler_Demo SerialInputReactionHandler_DEMO
SerialInputReactionHandler.cpp@3:599073f82114, 2019-11-27 (annotated)
- Committer:
- aktk
- Date:
- Wed Nov 27 23:35:41 2019 +0000
- Revision:
- 3:599073f82114
- Parent:
- 2:4718a4eaf340
nyaan nyaan
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aktk | 0:ec916055f0dd | 1 | #include "SerialInputReactionHandler.h" |
aktk | 0:ec916055f0dd | 2 | |
aktk | 0:ec916055f0dd | 3 | SerialInputReactionHandler::SerialInputReactionHandler( |
aktk | 2:4718a4eaf340 | 4 | Callback<void *(char const * const)> arg_callback_onCommand, |
aktk | 3:599073f82114 | 5 | Callback<void (char const * const)> arg_Pre_callback_onCommand, |
aktk | 3:599073f82114 | 6 | Callback<void (char const * const, void *)> arg_Post_callback_onCommand |
aktk | 0:ec916055f0dd | 7 | ) |
aktk | 0:ec916055f0dd | 8 | { |
aktk | 0:ec916055f0dd | 9 | funcIfInput[KB_SINGLE_INPUT] = &SerialInputReactionHandler::listenKBSingleInput; |
aktk | 0:ec916055f0dd | 10 | funcIfInput[KB_TILL_ENTER] = &SerialInputReactionHandler::listenKBTillEnter; |
aktk | 3:599073f82114 | 11 | m_callback_onCommand = arg_callback_onCommand; |
aktk | 3:599073f82114 | 12 | m_Pre_callback_onCommand = arg_Pre_callback_onCommand; |
aktk | 3:599073f82114 | 13 | m_Post_callback_onCommand = arg_Post_callback_onCommand; |
aktk | 0:ec916055f0dd | 14 | } |
aktk | 0:ec916055f0dd | 15 | |
aktk | 3:599073f82114 | 16 | |
aktk | 3:599073f82114 | 17 | |
aktk | 0:ec916055f0dd | 18 | void SerialInputReactionHandler::attach( |
aktk | 2:4718a4eaf340 | 19 | Callback<void * (char const * const)> arg_callback_onCommand |
aktk | 0:ec916055f0dd | 20 | ) |
aktk | 0:ec916055f0dd | 21 | { |
aktk | 3:599073f82114 | 22 | m_callback_onCommand = arg_callback_onCommand; |
aktk | 0:ec916055f0dd | 23 | } |
aktk | 0:ec916055f0dd | 24 | |
aktk | 3:599073f82114 | 25 | |
aktk | 3:599073f82114 | 26 | |
aktk | 2:4718a4eaf340 | 27 | void SerialInputReactionHandler::attach_PreProc( |
aktk | 3:599073f82114 | 28 | Callback<void (char const * const)> arg_Pre_callback_onCommand |
aktk | 2:4718a4eaf340 | 29 | ) |
aktk | 2:4718a4eaf340 | 30 | { |
aktk | 3:599073f82114 | 31 | m_Pre_callback_onCommand = arg_Pre_callback_onCommand; |
aktk | 2:4718a4eaf340 | 32 | } |
aktk | 2:4718a4eaf340 | 33 | |
aktk | 3:599073f82114 | 34 | |
aktk | 3:599073f82114 | 35 | |
aktk | 2:4718a4eaf340 | 36 | void SerialInputReactionHandler::attach_PostProc( |
aktk | 3:599073f82114 | 37 | Callback<void (char const * const, void *)> arg_Post_callback_onCommand |
aktk | 2:4718a4eaf340 | 38 | ) |
aktk | 2:4718a4eaf340 | 39 | { |
aktk | 3:599073f82114 | 40 | m_Post_callback_onCommand = arg_Post_callback_onCommand; |
aktk | 2:4718a4eaf340 | 41 | } |
aktk | 2:4718a4eaf340 | 42 | |
aktk | 3:599073f82114 | 43 | |
aktk | 3:599073f82114 | 44 | |
aktk | 0:ec916055f0dd | 45 | void SerialInputReactionHandler::startReception( |
aktk | 0:ec916055f0dd | 46 | Serial * arg_serial_socket, |
aktk | 0:ec916055f0dd | 47 | InputMode arg_mode |
aktk | 0:ec916055f0dd | 48 | ) |
aktk | 0:ec916055f0dd | 49 | { |
aktk | 0:ec916055f0dd | 50 | m_serial_socket = arg_serial_socket; |
aktk | 0:ec916055f0dd | 51 | m_input_mode = arg_mode; |
aktk | 0:ec916055f0dd | 52 | m_serial_socket->attach(callback(this, &SerialInputReactionHandler::sig_bind)); |
aktk | 0:ec916055f0dd | 53 | } |
aktk | 0:ec916055f0dd | 54 | |
aktk | 3:599073f82114 | 55 | |
aktk | 3:599073f82114 | 56 | |
aktk | 0:ec916055f0dd | 57 | void SerialInputReactionHandler::quit() |
aktk | 0:ec916055f0dd | 58 | { |
aktk | 0:ec916055f0dd | 59 | m_serial_socket->attach(NULL); |
aktk | 1:fd211f137803 | 60 | } |
aktk | 0:ec916055f0dd | 61 | |
aktk | 3:599073f82114 | 62 | |
aktk | 3:599073f82114 | 63 | |
aktk | 0:ec916055f0dd | 64 | void SerialInputReactionHandler::sig_bind() |
aktk | 0:ec916055f0dd | 65 | { |
aktk | 0:ec916055f0dd | 66 | (this->*funcIfInput[m_input_mode])(); |
aktk | 0:ec916055f0dd | 67 | } |
aktk | 0:ec916055f0dd | 68 | |
aktk | 3:599073f82114 | 69 | |
aktk | 3:599073f82114 | 70 | |
aktk | 0:ec916055f0dd | 71 | void SerialInputReactionHandler::changeMode(InputMode arg_mode) |
aktk | 0:ec916055f0dd | 72 | { |
aktk | 0:ec916055f0dd | 73 | discardBuffer(); |
aktk | 0:ec916055f0dd | 74 | m_input_mode = arg_mode; |
aktk | 0:ec916055f0dd | 75 | } |
aktk | 0:ec916055f0dd | 76 | |
aktk | 3:599073f82114 | 77 | |
aktk | 3:599073f82114 | 78 | |
aktk | 3:599073f82114 | 79 | void SerialInputReactionHandler::callback_onCommand(char const * const arg_command) |
aktk | 3:599073f82114 | 80 | { |
aktk | 3:599073f82114 | 81 | void * l_rescallback; |
aktk | 3:599073f82114 | 82 | m_Pre_callback_onCommand(arg_command); |
aktk | 3:599073f82114 | 83 | l_rescallback = m_callback_onCommand(arg_command); |
aktk | 3:599073f82114 | 84 | m_Post_callback_onCommand(arg_command, l_rescallback); |
aktk | 3:599073f82114 | 85 | } |
aktk | 3:599073f82114 | 86 | |
aktk | 3:599073f82114 | 87 | |
aktk | 3:599073f82114 | 88 | |
aktk | 0:ec916055f0dd | 89 | void SerialInputReactionHandler::listenKBSingleInput() |
aktk | 0:ec916055f0dd | 90 | { |
aktk | 0:ec916055f0dd | 91 | m_buffer_c = m_serial_socket->getc(); |
aktk | 0:ec916055f0dd | 92 | m_buffer_s = m_buffer_c; |
aktk | 3:599073f82114 | 93 | if(m_buffer_c != 0x1B || m_buffer_c == 0x1B && isArrowSymbol()) |
aktk | 1:fd211f137803 | 94 | callback_onCommand(m_buffer_s.c_str()); |
aktk | 0:ec916055f0dd | 95 | discardBuffer(); |
aktk | 0:ec916055f0dd | 96 | } |
aktk | 0:ec916055f0dd | 97 | |
aktk | 3:599073f82114 | 98 | |
aktk | 3:599073f82114 | 99 | |
aktk | 1:fd211f137803 | 100 | bool SerialInputReactionHandler::isArrowSymbol() |
aktk | 1:fd211f137803 | 101 | { |
aktk | 1:fd211f137803 | 102 | // If only 0x1B, ESC KEY should be Pressed, else some symbol sequence. |
aktk | 1:fd211f137803 | 103 | if (m_buffer_c == 0x1B && m_serial_socket->readable()) { |
aktk | 1:fd211f137803 | 104 | m_buffer_s = m_buffer_c; |
aktk | 1:fd211f137803 | 105 | m_buffer_c = m_serial_socket->getc(); |
aktk | 1:fd211f137803 | 106 | |
aktk | 1:fd211f137803 | 107 | // If 0x5B follows, it coul be arrow key was pressed |
aktk | 1:fd211f137803 | 108 | if (m_buffer_c == 0x5B && m_serial_socket->readable()) { |
aktk | 1:fd211f137803 | 109 | m_buffer_s += m_buffer_c; |
aktk | 1:fd211f137803 | 110 | m_buffer_c = m_serial_socket->getc(); |
aktk | 1:fd211f137803 | 111 | } else m_buffer_c = 0x1B; |
aktk | 1:fd211f137803 | 112 | |
aktk | 1:fd211f137803 | 113 | m_buffer_s += m_buffer_c; |
aktk | 1:fd211f137803 | 114 | } else m_buffer_c = 0x1B; |
aktk | 1:fd211f137803 | 115 | |
aktk | 1:fd211f137803 | 116 | if (m_buffer_c == 0x1B) return false; |
aktk | 1:fd211f137803 | 117 | else return true; |
aktk | 1:fd211f137803 | 118 | } |
aktk | 1:fd211f137803 | 119 | |
aktk | 1:fd211f137803 | 120 | |
aktk | 3:599073f82114 | 121 | |
aktk | 0:ec916055f0dd | 122 | void SerialInputReactionHandler::listenKBTillEnter() |
aktk | 0:ec916055f0dd | 123 | { |
aktk | 0:ec916055f0dd | 124 | __disable_irq(); |
aktk | 0:ec916055f0dd | 125 | m_buffer_c = m_serial_socket->getc(); |
aktk | 1:fd211f137803 | 126 | |
aktk | 0:ec916055f0dd | 127 | if ( isUpperCase(m_buffer_c) || isLowerCase(m_buffer_c) || isSymbol( m_buffer_c)) { |
aktk | 0:ec916055f0dd | 128 | |
aktk | 0:ec916055f0dd | 129 | if(m_buffer_s.length() != 0 && m_buffer_s[0] != '\0') |
aktk | 0:ec916055f0dd | 130 | m_buffer_s += m_buffer_c; |
aktk | 0:ec916055f0dd | 131 | else |
aktk | 0:ec916055f0dd | 132 | m_buffer_s = m_buffer_c; |
aktk | 0:ec916055f0dd | 133 | m_serial_socket->putc(m_buffer_c); |
aktk | 0:ec916055f0dd | 134 | |
aktk | 0:ec916055f0dd | 135 | } else if ( m_buffer_c == '\n' || m_buffer_c == '\r') { |
aktk | 0:ec916055f0dd | 136 | |
aktk | 3:599073f82114 | 137 | m_serial_socket->putc(m_buffer_c); |
aktk | 0:ec916055f0dd | 138 | callback_onCommand(m_buffer_s.c_str()); |
aktk | 0:ec916055f0dd | 139 | discardBuffer(); |
aktk | 0:ec916055f0dd | 140 | |
aktk | 1:fd211f137803 | 141 | } else if (isArrowSymbol()) { |
aktk | 0:ec916055f0dd | 142 | |
aktk | 1:fd211f137803 | 143 | // Arrows |
aktk | 1:fd211f137803 | 144 | callback_onCommand(m_buffer_s.c_str()); |
aktk | 0:ec916055f0dd | 145 | discardBuffer(); |
aktk | 0:ec916055f0dd | 146 | |
aktk | 0:ec916055f0dd | 147 | } else { |
aktk | 0:ec916055f0dd | 148 | switch (m_buffer_c) { |
aktk | 0:ec916055f0dd | 149 | case 0x08 /*BS */: |
aktk | 0:ec916055f0dd | 150 | case 0x7F /*DEL*/: |
aktk | 0:ec916055f0dd | 151 | m_buffer_s.erase(m_buffer_s.end() - 1); |
aktk | 0:ec916055f0dd | 152 | //m_serial_socket->putc(0x7F); |
aktk | 0:ec916055f0dd | 153 | m_serial_socket->putc(0x08); |
aktk | 0:ec916055f0dd | 154 | m_serial_socket->putc(0x20); |
aktk | 0:ec916055f0dd | 155 | m_serial_socket->putc(0x08); |
aktk | 0:ec916055f0dd | 156 | break; |
aktk | 0:ec916055f0dd | 157 | case 0x1B /*ESC*/: |
aktk | 1:fd211f137803 | 158 | discardBuffer(); |
aktk | 0:ec916055f0dd | 159 | break; |
aktk | 0:ec916055f0dd | 160 | |
aktk | 0:ec916055f0dd | 161 | } |
aktk | 0:ec916055f0dd | 162 | } |
aktk | 0:ec916055f0dd | 163 | __enable_irq(); |
aktk | 0:ec916055f0dd | 164 | } |