mayuresh bharmoria / Mbed OS mbed-os-example-wifi
Committer:
mayur098
Date:
Thu Jun 21 17:50:21 2018 +0000
Revision:
0:8f8e8f3cbd1c
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mayur098 0:8f8e8f3cbd1c 1 /* Copyright (c) 2015 ARM Limited
mayur098 0:8f8e8f3cbd1c 2 * Copyright (c) 2017 Renesas Electronics Corporation
mayur098 0:8f8e8f3cbd1c 3 *
mayur098 0:8f8e8f3cbd1c 4 * Licensed under the Apache License, Version 2.0 (the "License");
mayur098 0:8f8e8f3cbd1c 5 * you may not use this file except in compliance with the License.
mayur098 0:8f8e8f3cbd1c 6 * You may obtain a copy of the License at
mayur098 0:8f8e8f3cbd1c 7 *
mayur098 0:8f8e8f3cbd1c 8 * http://www.apache.org/licenses/LICENSE-2.0
mayur098 0:8f8e8f3cbd1c 9 *
mayur098 0:8f8e8f3cbd1c 10 * Unless required by applicable law or agreed to in writing, software
mayur098 0:8f8e8f3cbd1c 11 * distributed under the License is distributed on an "AS IS" BASIS,
mayur098 0:8f8e8f3cbd1c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mayur098 0:8f8e8f3cbd1c 13 * See the License for the specific language governing permissions and
mayur098 0:8f8e8f3cbd1c 14 * limitations under the License.
mayur098 0:8f8e8f3cbd1c 15 *
mayur098 0:8f8e8f3cbd1c 16 * @section DESCRIPTION
mayur098 0:8f8e8f3cbd1c 17 *
mayur098 0:8f8e8f3cbd1c 18 * Parser for the AT command syntax
mayur098 0:8f8e8f3cbd1c 19 *
mayur098 0:8f8e8f3cbd1c 20 */
mayur098 0:8f8e8f3cbd1c 21
mayur098 0:8f8e8f3cbd1c 22 #include "ATParser_os.h"
mayur098 0:8f8e8f3cbd1c 23 #include "mbed_debug.h"
mayur098 0:8f8e8f3cbd1c 24
mayur098 0:8f8e8f3cbd1c 25
mayur098 0:8f8e8f3cbd1c 26 // getc/putc handling with timeouts
mayur098 0:8f8e8f3cbd1c 27 int ATParser_os::putc(char c)
mayur098 0:8f8e8f3cbd1c 28 {
mayur098 0:8f8e8f3cbd1c 29 int wait_cnt = 0;
mayur098 0:8f8e8f3cbd1c 30
mayur098 0:8f8e8f3cbd1c 31 while (true) {
mayur098 0:8f8e8f3cbd1c 32 if (_serial->writeable()) {
mayur098 0:8f8e8f3cbd1c 33 return _serial->putc((uint8_t)c);
mayur098 0:8f8e8f3cbd1c 34 }
mayur098 0:8f8e8f3cbd1c 35 if (wait_cnt > _timeout) {
mayur098 0:8f8e8f3cbd1c 36 return -1;
mayur098 0:8f8e8f3cbd1c 37 }
mayur098 0:8f8e8f3cbd1c 38 wait_cnt++;
mayur098 0:8f8e8f3cbd1c 39 Thread::wait(1);
mayur098 0:8f8e8f3cbd1c 40 }
mayur098 0:8f8e8f3cbd1c 41 }
mayur098 0:8f8e8f3cbd1c 42
mayur098 0:8f8e8f3cbd1c 43 int ATParser_os::getc()
mayur098 0:8f8e8f3cbd1c 44 {
mayur098 0:8f8e8f3cbd1c 45 int wait_cnt = 0;
mayur098 0:8f8e8f3cbd1c 46
mayur098 0:8f8e8f3cbd1c 47 while (true) {
mayur098 0:8f8e8f3cbd1c 48 if (_serial->readable()) {
mayur098 0:8f8e8f3cbd1c 49 return (uint8_t)_serial->getc();
mayur098 0:8f8e8f3cbd1c 50 }
mayur098 0:8f8e8f3cbd1c 51 if (wait_cnt > _timeout) {
mayur098 0:8f8e8f3cbd1c 52 return -1;
mayur098 0:8f8e8f3cbd1c 53 }
mayur098 0:8f8e8f3cbd1c 54 wait_cnt++;
mayur098 0:8f8e8f3cbd1c 55 Thread::wait(1);
mayur098 0:8f8e8f3cbd1c 56 }
mayur098 0:8f8e8f3cbd1c 57 }
mayur098 0:8f8e8f3cbd1c 58
mayur098 0:8f8e8f3cbd1c 59 void ATParser_os::flush()
mayur098 0:8f8e8f3cbd1c 60 {
mayur098 0:8f8e8f3cbd1c 61 while (_serial->readable()) {
mayur098 0:8f8e8f3cbd1c 62 _serial->getc();
mayur098 0:8f8e8f3cbd1c 63 }
mayur098 0:8f8e8f3cbd1c 64 }
mayur098 0:8f8e8f3cbd1c 65
mayur098 0:8f8e8f3cbd1c 66
mayur098 0:8f8e8f3cbd1c 67 // read/write handling with timeouts
mayur098 0:8f8e8f3cbd1c 68 int ATParser_os::write(const char *data, int size)
mayur098 0:8f8e8f3cbd1c 69 {
mayur098 0:8f8e8f3cbd1c 70 int i = 0;
mayur098 0:8f8e8f3cbd1c 71 for ( ; i < size; i++) {
mayur098 0:8f8e8f3cbd1c 72 if (putc(data[i]) < 0) {
mayur098 0:8f8e8f3cbd1c 73 return -1;
mayur098 0:8f8e8f3cbd1c 74 }
mayur098 0:8f8e8f3cbd1c 75 }
mayur098 0:8f8e8f3cbd1c 76 return i;
mayur098 0:8f8e8f3cbd1c 77 }
mayur098 0:8f8e8f3cbd1c 78
mayur098 0:8f8e8f3cbd1c 79 int ATParser_os::read(char *data, int size)
mayur098 0:8f8e8f3cbd1c 80 {
mayur098 0:8f8e8f3cbd1c 81 int i = 0;
mayur098 0:8f8e8f3cbd1c 82 for ( ; i < size; i++) {
mayur098 0:8f8e8f3cbd1c 83 int c = getc();
mayur098 0:8f8e8f3cbd1c 84 if (c < 0) {
mayur098 0:8f8e8f3cbd1c 85 return -1;
mayur098 0:8f8e8f3cbd1c 86 }
mayur098 0:8f8e8f3cbd1c 87 data[i] = c;
mayur098 0:8f8e8f3cbd1c 88 }
mayur098 0:8f8e8f3cbd1c 89 return i;
mayur098 0:8f8e8f3cbd1c 90 }
mayur098 0:8f8e8f3cbd1c 91
mayur098 0:8f8e8f3cbd1c 92
mayur098 0:8f8e8f3cbd1c 93 // printf/scanf handling
mayur098 0:8f8e8f3cbd1c 94 int ATParser_os::vprintf(const char *format, va_list args)
mayur098 0:8f8e8f3cbd1c 95 {
mayur098 0:8f8e8f3cbd1c 96 if (vsprintf(_buffer, format, args) < 0) {
mayur098 0:8f8e8f3cbd1c 97 return false;
mayur098 0:8f8e8f3cbd1c 98 }
mayur098 0:8f8e8f3cbd1c 99 int i = 0;
mayur098 0:8f8e8f3cbd1c 100 for ( ; _buffer[i]; i++) {
mayur098 0:8f8e8f3cbd1c 101 if (putc(_buffer[i]) < 0) {
mayur098 0:8f8e8f3cbd1c 102 return -1;
mayur098 0:8f8e8f3cbd1c 103 }
mayur098 0:8f8e8f3cbd1c 104 }
mayur098 0:8f8e8f3cbd1c 105 return i;
mayur098 0:8f8e8f3cbd1c 106 }
mayur098 0:8f8e8f3cbd1c 107
mayur098 0:8f8e8f3cbd1c 108 int ATParser_os::vscanf(const char *format, va_list args)
mayur098 0:8f8e8f3cbd1c 109 {
mayur098 0:8f8e8f3cbd1c 110 // Since format is const, we need to copy it into our buffer to
mayur098 0:8f8e8f3cbd1c 111 // add the line's null terminator and clobber value-matches with asterisks.
mayur098 0:8f8e8f3cbd1c 112 //
mayur098 0:8f8e8f3cbd1c 113 // We just use the beginning of the buffer to avoid unnecessary allocations.
mayur098 0:8f8e8f3cbd1c 114 int i = 0;
mayur098 0:8f8e8f3cbd1c 115 int offset = 0;
mayur098 0:8f8e8f3cbd1c 116
mayur098 0:8f8e8f3cbd1c 117 while (format[i]) {
mayur098 0:8f8e8f3cbd1c 118 if (format[i] == '%' && format[i+1] != '%' && format[i+1] != '*') {
mayur098 0:8f8e8f3cbd1c 119 _buffer[offset++] = '%';
mayur098 0:8f8e8f3cbd1c 120 _buffer[offset++] = '*';
mayur098 0:8f8e8f3cbd1c 121 i++;
mayur098 0:8f8e8f3cbd1c 122 } else {
mayur098 0:8f8e8f3cbd1c 123 _buffer[offset++] = format[i++];
mayur098 0:8f8e8f3cbd1c 124 }
mayur098 0:8f8e8f3cbd1c 125 }
mayur098 0:8f8e8f3cbd1c 126
mayur098 0:8f8e8f3cbd1c 127 // Scanf has very poor support for catching errors
mayur098 0:8f8e8f3cbd1c 128 // fortunately, we can abuse the %n specifier to determine
mayur098 0:8f8e8f3cbd1c 129 // if the entire string was matched.
mayur098 0:8f8e8f3cbd1c 130 _buffer[offset++] = '%';
mayur098 0:8f8e8f3cbd1c 131 _buffer[offset++] = 'n';
mayur098 0:8f8e8f3cbd1c 132 _buffer[offset++] = 0;
mayur098 0:8f8e8f3cbd1c 133
mayur098 0:8f8e8f3cbd1c 134 // To workaround scanf's lack of error reporting, we actually
mayur098 0:8f8e8f3cbd1c 135 // make two passes. One checks the validity with the modified
mayur098 0:8f8e8f3cbd1c 136 // format string that only stores the matched characters (%n).
mayur098 0:8f8e8f3cbd1c 137 // The other reads in the actual matched values.
mayur098 0:8f8e8f3cbd1c 138 //
mayur098 0:8f8e8f3cbd1c 139 // We keep trying the match until we succeed or some other error
mayur098 0:8f8e8f3cbd1c 140 // derails us.
mayur098 0:8f8e8f3cbd1c 141 int j = 0;
mayur098 0:8f8e8f3cbd1c 142
mayur098 0:8f8e8f3cbd1c 143 while (true) {
mayur098 0:8f8e8f3cbd1c 144 // Ran out of space
mayur098 0:8f8e8f3cbd1c 145 if (j+1 >= _buffer_size - offset) {
mayur098 0:8f8e8f3cbd1c 146 return false;
mayur098 0:8f8e8f3cbd1c 147 }
mayur098 0:8f8e8f3cbd1c 148 // Recieve next character
mayur098 0:8f8e8f3cbd1c 149 int c = getc();
mayur098 0:8f8e8f3cbd1c 150 if (c < 0) {
mayur098 0:8f8e8f3cbd1c 151 return -1;
mayur098 0:8f8e8f3cbd1c 152 }
mayur098 0:8f8e8f3cbd1c 153 _buffer[offset + j++] = c;
mayur098 0:8f8e8f3cbd1c 154 _buffer[offset + j] = 0;
mayur098 0:8f8e8f3cbd1c 155
mayur098 0:8f8e8f3cbd1c 156 // Check for match
mayur098 0:8f8e8f3cbd1c 157 int count = -1;
mayur098 0:8f8e8f3cbd1c 158 sscanf(_buffer+offset, _buffer, &count);
mayur098 0:8f8e8f3cbd1c 159
mayur098 0:8f8e8f3cbd1c 160 // We only succeed if all characters in the response are matched
mayur098 0:8f8e8f3cbd1c 161 if (count == j) {
mayur098 0:8f8e8f3cbd1c 162 // Store the found results
mayur098 0:8f8e8f3cbd1c 163 vsscanf(_buffer+offset, format, args);
mayur098 0:8f8e8f3cbd1c 164 return j;
mayur098 0:8f8e8f3cbd1c 165 }
mayur098 0:8f8e8f3cbd1c 166 }
mayur098 0:8f8e8f3cbd1c 167 }
mayur098 0:8f8e8f3cbd1c 168
mayur098 0:8f8e8f3cbd1c 169
mayur098 0:8f8e8f3cbd1c 170 // Command parsing with line handling
mayur098 0:8f8e8f3cbd1c 171 bool ATParser_os::vsend(const char *command, va_list args)
mayur098 0:8f8e8f3cbd1c 172 {
mayur098 0:8f8e8f3cbd1c 173 // Create and send command
mayur098 0:8f8e8f3cbd1c 174 if (vsprintf(_buffer, command, args) < 0) {
mayur098 0:8f8e8f3cbd1c 175 return false;
mayur098 0:8f8e8f3cbd1c 176 }
mayur098 0:8f8e8f3cbd1c 177 for (int i = 0; _buffer[i]; i++) {
mayur098 0:8f8e8f3cbd1c 178 if (putc(_buffer[i]) < 0) {
mayur098 0:8f8e8f3cbd1c 179 return false;
mayur098 0:8f8e8f3cbd1c 180 }
mayur098 0:8f8e8f3cbd1c 181 }
mayur098 0:8f8e8f3cbd1c 182
mayur098 0:8f8e8f3cbd1c 183 // Finish with newline
mayur098 0:8f8e8f3cbd1c 184 for (int i = 0; _delimiter[i]; i++) {
mayur098 0:8f8e8f3cbd1c 185 if (putc(_delimiter[i]) < 0) {
mayur098 0:8f8e8f3cbd1c 186 return false;
mayur098 0:8f8e8f3cbd1c 187 }
mayur098 0:8f8e8f3cbd1c 188 }
mayur098 0:8f8e8f3cbd1c 189
mayur098 0:8f8e8f3cbd1c 190 debug_if(dbg_on, "AT> %s\r\n", _buffer);
mayur098 0:8f8e8f3cbd1c 191 return true;
mayur098 0:8f8e8f3cbd1c 192 }
mayur098 0:8f8e8f3cbd1c 193
mayur098 0:8f8e8f3cbd1c 194 bool ATParser_os::vrecv(const char *response, va_list args)
mayur098 0:8f8e8f3cbd1c 195 {
mayur098 0:8f8e8f3cbd1c 196 // Iterate through each line in the expected response
mayur098 0:8f8e8f3cbd1c 197 while (response[0]) {
mayur098 0:8f8e8f3cbd1c 198 // Since response is const, we need to copy it into our buffer to
mayur098 0:8f8e8f3cbd1c 199 // add the line's null terminator and clobber value-matches with asterisks.
mayur098 0:8f8e8f3cbd1c 200 //
mayur098 0:8f8e8f3cbd1c 201 // We just use the beginning of the buffer to avoid unnecessary allocations.
mayur098 0:8f8e8f3cbd1c 202 int i = 0;
mayur098 0:8f8e8f3cbd1c 203 int offset = 0;
mayur098 0:8f8e8f3cbd1c 204
mayur098 0:8f8e8f3cbd1c 205 while (response[i]) {
mayur098 0:8f8e8f3cbd1c 206 if (memcmp(&response[i+1-_delim_size], _delimiter, _delim_size) == 0) {
mayur098 0:8f8e8f3cbd1c 207 i++;
mayur098 0:8f8e8f3cbd1c 208 break;
mayur098 0:8f8e8f3cbd1c 209 } else if (response[i] == '%' && response[i+1] != '%' && response[i+1] != '*') {
mayur098 0:8f8e8f3cbd1c 210 _buffer[offset++] = '%';
mayur098 0:8f8e8f3cbd1c 211 _buffer[offset++] = '*';
mayur098 0:8f8e8f3cbd1c 212 i++;
mayur098 0:8f8e8f3cbd1c 213 } else {
mayur098 0:8f8e8f3cbd1c 214 _buffer[offset++] = response[i++];
mayur098 0:8f8e8f3cbd1c 215 }
mayur098 0:8f8e8f3cbd1c 216 }
mayur098 0:8f8e8f3cbd1c 217
mayur098 0:8f8e8f3cbd1c 218 // Scanf has very poor support for catching errors
mayur098 0:8f8e8f3cbd1c 219 // fortunately, we can abuse the %n specifier to determine
mayur098 0:8f8e8f3cbd1c 220 // if the entire string was matched.
mayur098 0:8f8e8f3cbd1c 221 _buffer[offset++] = '%';
mayur098 0:8f8e8f3cbd1c 222 _buffer[offset++] = 'n';
mayur098 0:8f8e8f3cbd1c 223 _buffer[offset++] = 0;
mayur098 0:8f8e8f3cbd1c 224
mayur098 0:8f8e8f3cbd1c 225 // To workaround scanf's lack of error reporting, we actually
mayur098 0:8f8e8f3cbd1c 226 // make two passes. One checks the validity with the modified
mayur098 0:8f8e8f3cbd1c 227 // format string that only stores the matched characters (%n).
mayur098 0:8f8e8f3cbd1c 228 // The other reads in the actual matched values.
mayur098 0:8f8e8f3cbd1c 229 //
mayur098 0:8f8e8f3cbd1c 230 // We keep trying the match until we succeed or some other error
mayur098 0:8f8e8f3cbd1c 231 // derails us.
mayur098 0:8f8e8f3cbd1c 232 int j = 0;
mayur098 0:8f8e8f3cbd1c 233
mayur098 0:8f8e8f3cbd1c 234 while (true) {
mayur098 0:8f8e8f3cbd1c 235 // Recieve next character
mayur098 0:8f8e8f3cbd1c 236 int c = getc();
mayur098 0:8f8e8f3cbd1c 237 if (c < 0) {
mayur098 0:8f8e8f3cbd1c 238 return false;
mayur098 0:8f8e8f3cbd1c 239 }
mayur098 0:8f8e8f3cbd1c 240 _buffer[offset + j++] = c;
mayur098 0:8f8e8f3cbd1c 241 _buffer[offset + j] = 0;
mayur098 0:8f8e8f3cbd1c 242
mayur098 0:8f8e8f3cbd1c 243 // Check for oob data
mayur098 0:8f8e8f3cbd1c 244 for (int k = 0; k < _oobs.size(); k++) {
mayur098 0:8f8e8f3cbd1c 245 if (j == _oobs[k].len && memcmp(
mayur098 0:8f8e8f3cbd1c 246 _oobs[k].prefix, _buffer+offset, _oobs[k].len) == 0) {
mayur098 0:8f8e8f3cbd1c 247 debug_if(dbg_on, "AT! %s\r\n", _oobs[k].prefix);
mayur098 0:8f8e8f3cbd1c 248 _oobs[k].cb();
mayur098 0:8f8e8f3cbd1c 249
mayur098 0:8f8e8f3cbd1c 250 // oob may have corrupted non-reentrant buffer,
mayur098 0:8f8e8f3cbd1c 251 // so we need to set it up again
mayur098 0:8f8e8f3cbd1c 252 return vrecv(response, args);
mayur098 0:8f8e8f3cbd1c 253 }
mayur098 0:8f8e8f3cbd1c 254 }
mayur098 0:8f8e8f3cbd1c 255
mayur098 0:8f8e8f3cbd1c 256 // Check for match
mayur098 0:8f8e8f3cbd1c 257 int count = -1;
mayur098 0:8f8e8f3cbd1c 258 sscanf(_buffer+offset, _buffer, &count);
mayur098 0:8f8e8f3cbd1c 259
mayur098 0:8f8e8f3cbd1c 260 // We only succeed if all characters in the response are matched
mayur098 0:8f8e8f3cbd1c 261 if (count == j) {
mayur098 0:8f8e8f3cbd1c 262 debug_if(dbg_on, "AT= %s\r\n", _buffer+offset);
mayur098 0:8f8e8f3cbd1c 263 // Reuse the front end of the buffer
mayur098 0:8f8e8f3cbd1c 264 memcpy(_buffer, response, i);
mayur098 0:8f8e8f3cbd1c 265 _buffer[i] = 0;
mayur098 0:8f8e8f3cbd1c 266
mayur098 0:8f8e8f3cbd1c 267 // Store the found results
mayur098 0:8f8e8f3cbd1c 268 vsscanf(_buffer+offset, _buffer, args);
mayur098 0:8f8e8f3cbd1c 269
mayur098 0:8f8e8f3cbd1c 270 // Jump to next line and continue parsing
mayur098 0:8f8e8f3cbd1c 271 response += i;
mayur098 0:8f8e8f3cbd1c 272 break;
mayur098 0:8f8e8f3cbd1c 273 }
mayur098 0:8f8e8f3cbd1c 274
mayur098 0:8f8e8f3cbd1c 275 // Clear the buffer when we hit a newline or ran out of space
mayur098 0:8f8e8f3cbd1c 276 // running out of space usually means we ran into binary data
mayur098 0:8f8e8f3cbd1c 277 if (j+1 >= _buffer_size - offset ||
mayur098 0:8f8e8f3cbd1c 278 strcmp(&_buffer[offset + j-_delim_size], _delimiter) == 0) {
mayur098 0:8f8e8f3cbd1c 279
mayur098 0:8f8e8f3cbd1c 280 debug_if(dbg_on, "AT< %s", _buffer+offset);
mayur098 0:8f8e8f3cbd1c 281 j = 0;
mayur098 0:8f8e8f3cbd1c 282 }
mayur098 0:8f8e8f3cbd1c 283 }
mayur098 0:8f8e8f3cbd1c 284 }
mayur098 0:8f8e8f3cbd1c 285
mayur098 0:8f8e8f3cbd1c 286 return true;
mayur098 0:8f8e8f3cbd1c 287 }
mayur098 0:8f8e8f3cbd1c 288
mayur098 0:8f8e8f3cbd1c 289
mayur098 0:8f8e8f3cbd1c 290 // Mapping to vararg functions
mayur098 0:8f8e8f3cbd1c 291 int ATParser_os::printf(const char *format, ...)
mayur098 0:8f8e8f3cbd1c 292 {
mayur098 0:8f8e8f3cbd1c 293 va_list args;
mayur098 0:8f8e8f3cbd1c 294 va_start(args, format);
mayur098 0:8f8e8f3cbd1c 295 int res = vprintf(format, args);
mayur098 0:8f8e8f3cbd1c 296 va_end(args);
mayur098 0:8f8e8f3cbd1c 297 return res;
mayur098 0:8f8e8f3cbd1c 298 }
mayur098 0:8f8e8f3cbd1c 299
mayur098 0:8f8e8f3cbd1c 300 int ATParser_os::scanf(const char *format, ...)
mayur098 0:8f8e8f3cbd1c 301 {
mayur098 0:8f8e8f3cbd1c 302 va_list args;
mayur098 0:8f8e8f3cbd1c 303 va_start(args, format);
mayur098 0:8f8e8f3cbd1c 304 int res = vscanf(format, args);
mayur098 0:8f8e8f3cbd1c 305 va_end(args);
mayur098 0:8f8e8f3cbd1c 306 return res;
mayur098 0:8f8e8f3cbd1c 307 }
mayur098 0:8f8e8f3cbd1c 308
mayur098 0:8f8e8f3cbd1c 309 bool ATParser_os::send(const char *command, ...)
mayur098 0:8f8e8f3cbd1c 310 {
mayur098 0:8f8e8f3cbd1c 311 va_list args;
mayur098 0:8f8e8f3cbd1c 312 va_start(args, command);
mayur098 0:8f8e8f3cbd1c 313 bool res = vsend(command, args);
mayur098 0:8f8e8f3cbd1c 314 va_end(args);
mayur098 0:8f8e8f3cbd1c 315 return res;
mayur098 0:8f8e8f3cbd1c 316 }
mayur098 0:8f8e8f3cbd1c 317
mayur098 0:8f8e8f3cbd1c 318 bool ATParser_os::recv(const char *response, ...)
mayur098 0:8f8e8f3cbd1c 319 {
mayur098 0:8f8e8f3cbd1c 320 va_list args;
mayur098 0:8f8e8f3cbd1c 321 va_start(args, response);
mayur098 0:8f8e8f3cbd1c 322 bool res = vrecv(response, args);
mayur098 0:8f8e8f3cbd1c 323 va_end(args);
mayur098 0:8f8e8f3cbd1c 324 return res;
mayur098 0:8f8e8f3cbd1c 325 }
mayur098 0:8f8e8f3cbd1c 326
mayur098 0:8f8e8f3cbd1c 327
mayur098 0:8f8e8f3cbd1c 328 // oob registration
mayur098 0:8f8e8f3cbd1c 329 void ATParser_os::oob(const char *prefix, Callback<void()> cb)
mayur098 0:8f8e8f3cbd1c 330 {
mayur098 0:8f8e8f3cbd1c 331 struct oob oob;
mayur098 0:8f8e8f3cbd1c 332 oob.len = strlen(prefix);
mayur098 0:8f8e8f3cbd1c 333 oob.prefix = prefix;
mayur098 0:8f8e8f3cbd1c 334 oob.cb = cb;
mayur098 0:8f8e8f3cbd1c 335 _oobs.push_back(oob);
mayur098 0:8f8e8f3cbd1c 336 }