Akifumi Takahashi / SerialInputReactionHandler

Dependents:   Interference_Simple StrCommandHandler_Demo SerialInputReactionHandler_DEMO

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SerialInputReactionHandler.cpp Source File

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 }