Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Interference_Simple StrCommandHandler_Demo SerialInputReactionHandler_DEMO
SerialInputReactionHandler.cpp
00001 #include "SerialInputReactionHandler.h" 00002 00003 SerialInputReactionHandler::SerialInputReactionHandler( 00004 Callback<void *(char const * const)> arg_callback_onCommand, 00005 Callback<void (char const * const)> arg_Pre_callback_onCommand, 00006 Callback<void (char const * const, void *)> arg_Post_callback_onCommand 00007 ) 00008 { 00009 funcIfInput[KB_SINGLE_INPUT] = &SerialInputReactionHandler::listenKBSingleInput; 00010 funcIfInput[KB_TILL_ENTER] = &SerialInputReactionHandler::listenKBTillEnter; 00011 m_callback_onCommand = arg_callback_onCommand; 00012 m_Pre_callback_onCommand = arg_Pre_callback_onCommand; 00013 m_Post_callback_onCommand = arg_Post_callback_onCommand; 00014 } 00015 00016 00017 00018 void SerialInputReactionHandler::attach( 00019 Callback<void * (char const * const)> arg_callback_onCommand 00020 ) 00021 { 00022 m_callback_onCommand = arg_callback_onCommand; 00023 } 00024 00025 00026 00027 void SerialInputReactionHandler::attach_PreProc( 00028 Callback<void (char const * const)> arg_Pre_callback_onCommand 00029 ) 00030 { 00031 m_Pre_callback_onCommand = arg_Pre_callback_onCommand; 00032 } 00033 00034 00035 00036 void SerialInputReactionHandler::attach_PostProc( 00037 Callback<void (char const * const, void *)> arg_Post_callback_onCommand 00038 ) 00039 { 00040 m_Post_callback_onCommand = arg_Post_callback_onCommand; 00041 } 00042 00043 00044 00045 void SerialInputReactionHandler::startReception( 00046 Serial * arg_serial_socket, 00047 InputMode arg_mode 00048 ) 00049 { 00050 m_serial_socket = arg_serial_socket; 00051 m_input_mode = arg_mode; 00052 m_serial_socket->attach(callback(this, &SerialInputReactionHandler::sig_bind)); 00053 } 00054 00055 00056 00057 void SerialInputReactionHandler::quit() 00058 { 00059 m_serial_socket->attach(NULL); 00060 } 00061 00062 00063 00064 void SerialInputReactionHandler::sig_bind() 00065 { 00066 (this->*funcIfInput[m_input_mode])(); 00067 } 00068 00069 00070 00071 void SerialInputReactionHandler::changeMode(InputMode arg_mode) 00072 { 00073 discardBuffer(); 00074 m_input_mode = arg_mode; 00075 } 00076 00077 00078 00079 void SerialInputReactionHandler::callback_onCommand(char const * const arg_command) 00080 { 00081 void * l_rescallback; 00082 m_Pre_callback_onCommand(arg_command); 00083 l_rescallback = m_callback_onCommand(arg_command); 00084 m_Post_callback_onCommand(arg_command, l_rescallback); 00085 } 00086 00087 00088 00089 void SerialInputReactionHandler::listenKBSingleInput() 00090 { 00091 m_buffer_c = m_serial_socket->getc(); 00092 m_buffer_s = m_buffer_c; 00093 if(m_buffer_c != 0x1B || m_buffer_c == 0x1B && isArrowSymbol()) 00094 callback_onCommand(m_buffer_s.c_str()); 00095 discardBuffer(); 00096 } 00097 00098 00099 00100 bool SerialInputReactionHandler::isArrowSymbol() 00101 { 00102 // If only 0x1B, ESC KEY should be Pressed, else some symbol sequence. 00103 if (m_buffer_c == 0x1B && m_serial_socket->readable()) { 00104 m_buffer_s = m_buffer_c; 00105 m_buffer_c = m_serial_socket->getc(); 00106 00107 // If 0x5B follows, it coul be arrow key was pressed 00108 if (m_buffer_c == 0x5B && m_serial_socket->readable()) { 00109 m_buffer_s += m_buffer_c; 00110 m_buffer_c = m_serial_socket->getc(); 00111 } else m_buffer_c = 0x1B; 00112 00113 m_buffer_s += m_buffer_c; 00114 } else m_buffer_c = 0x1B; 00115 00116 if (m_buffer_c == 0x1B) return false; 00117 else return true; 00118 } 00119 00120 00121 00122 void SerialInputReactionHandler::listenKBTillEnter() 00123 { 00124 __disable_irq(); 00125 m_buffer_c = m_serial_socket->getc(); 00126 00127 if ( isUpperCase(m_buffer_c) || isLowerCase(m_buffer_c) || isSymbol( m_buffer_c)) { 00128 00129 if(m_buffer_s.length() != 0 && m_buffer_s[0] != '\0') 00130 m_buffer_s += m_buffer_c; 00131 else 00132 m_buffer_s = m_buffer_c; 00133 m_serial_socket->putc(m_buffer_c); 00134 00135 } else if ( m_buffer_c == '\n' || m_buffer_c == '\r') { 00136 00137 m_serial_socket->putc(m_buffer_c); 00138 callback_onCommand(m_buffer_s.c_str()); 00139 discardBuffer(); 00140 00141 } else if (isArrowSymbol()) { 00142 00143 // Arrows 00144 callback_onCommand(m_buffer_s.c_str()); 00145 discardBuffer(); 00146 00147 } else { 00148 switch (m_buffer_c) { 00149 case 0x08 /*BS */: 00150 case 0x7F /*DEL*/: 00151 m_buffer_s.erase(m_buffer_s.end() - 1); 00152 //m_serial_socket->putc(0x7F); 00153 m_serial_socket->putc(0x08); 00154 m_serial_socket->putc(0x20); 00155 m_serial_socket->putc(0x08); 00156 break; 00157 case 0x1B /*ESC*/: 00158 discardBuffer(); 00159 break; 00160 00161 } 00162 } 00163 __enable_irq(); 00164 }
Generated on Tue Jul 12 2022 23:51:24 by
1.7.2