listen serial input and react by callback registered.

Dependents:   Interference_Simple StrCommandHandler_Demo SerialInputReactionHandler_DEMO

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?

UserRevisionLine numberNew 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 }