ATParser for EMW3162 wifi module

Dependents:   EMWConfig

Committer:
Maggie17
Date:
Wed Nov 02 05:28:49 2016 +0000
Revision:
1:47dd607c7707
Parent:
0:1b9f0bcf0b2b
first release

Who changed what in which revision?

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