test

Dependencies:   mbed Watchdog

Dependents:   STM32-MC_node

Committer:
ommpy
Date:
Mon Jul 06 17:18:59 2020 +0530
Revision:
0:d383e2dee0f7
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ommpy 0:d383e2dee0f7 1 /* Copyright (c) 2017 ARM Limited
ommpy 0:d383e2dee0f7 2 * SPDX-License-Identifier: Apache-2.0
ommpy 0:d383e2dee0f7 3 *
ommpy 0:d383e2dee0f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
ommpy 0:d383e2dee0f7 5 * you may not use this file except in compliance with the License.
ommpy 0:d383e2dee0f7 6 * You may obtain a copy of the License at
ommpy 0:d383e2dee0f7 7 *
ommpy 0:d383e2dee0f7 8 * http://www.apache.org/licenses/LICENSE-2.0
ommpy 0:d383e2dee0f7 9 *
ommpy 0:d383e2dee0f7 10 * Unless required by applicable law or agreed to in writing, software
ommpy 0:d383e2dee0f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
ommpy 0:d383e2dee0f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ommpy 0:d383e2dee0f7 13 * See the License for the specific language governing permissions and
ommpy 0:d383e2dee0f7 14 * limitations under the License.
ommpy 0:d383e2dee0f7 15 *
ommpy 0:d383e2dee0f7 16 * @section DESCRIPTION
ommpy 0:d383e2dee0f7 17 *
ommpy 0:d383e2dee0f7 18 * Parser for the AT command syntax
ommpy 0:d383e2dee0f7 19 *
ommpy 0:d383e2dee0f7 20 */
ommpy 0:d383e2dee0f7 21 #ifndef MBED_ATCMDPARSER_H
ommpy 0:d383e2dee0f7 22 #define MBED_ATCMDPARSER_H
ommpy 0:d383e2dee0f7 23
ommpy 0:d383e2dee0f7 24 #include <cstdarg>
ommpy 0:d383e2dee0f7 25 #include "Callback.h"
ommpy 0:d383e2dee0f7 26 #include "NonCopyable.h"
ommpy 0:d383e2dee0f7 27 #include "FileHandle.h"
ommpy 0:d383e2dee0f7 28
ommpy 0:d383e2dee0f7 29 namespace mbed {
ommpy 0:d383e2dee0f7 30
ommpy 0:d383e2dee0f7 31 /** \addtogroup platform */
ommpy 0:d383e2dee0f7 32 /** @{*/
ommpy 0:d383e2dee0f7 33 /**
ommpy 0:d383e2dee0f7 34 * \defgroup platform_ATCmdParser ATCmdParser class
ommpy 0:d383e2dee0f7 35 * @{
ommpy 0:d383e2dee0f7 36 */
ommpy 0:d383e2dee0f7 37
ommpy 0:d383e2dee0f7 38 /**
ommpy 0:d383e2dee0f7 39 * Parser class for parsing AT commands
ommpy 0:d383e2dee0f7 40 *
ommpy 0:d383e2dee0f7 41 * Here are some examples:
ommpy 0:d383e2dee0f7 42 * @code
ommpy 0:d383e2dee0f7 43 * UARTSerial serial = UARTSerial(D1, D0);
ommpy 0:d383e2dee0f7 44 * ATCmdParser at = ATCmdParser(&serial, "\r\n");
ommpy 0:d383e2dee0f7 45 * int value;
ommpy 0:d383e2dee0f7 46 * char buffer[100];
ommpy 0:d383e2dee0f7 47 *
ommpy 0:d383e2dee0f7 48 * at.send("AT") && at.recv("OK");
ommpy 0:d383e2dee0f7 49 * at.send("AT+CWMODE=%d", 3) && at.recv("OK");
ommpy 0:d383e2dee0f7 50 * at.send("AT+CWMODE?") && at.recv("+CWMODE:%d\r\nOK", &value);
ommpy 0:d383e2dee0f7 51 * at.recv("+IPD,%d:", &value);
ommpy 0:d383e2dee0f7 52 * at.read(buffer, value);
ommpy 0:d383e2dee0f7 53 * at.recv("OK");
ommpy 0:d383e2dee0f7 54 * @endcode
ommpy 0:d383e2dee0f7 55 */
ommpy 0:d383e2dee0f7 56
ommpy 0:d383e2dee0f7 57 class ATCmdParser : private NonCopyable<ATCmdParser> {
ommpy 0:d383e2dee0f7 58 private:
ommpy 0:d383e2dee0f7 59 // File handle
ommpy 0:d383e2dee0f7 60 // Not owned by ATCmdParser
ommpy 0:d383e2dee0f7 61 FileHandle *_fh;
ommpy 0:d383e2dee0f7 62
ommpy 0:d383e2dee0f7 63 int _buffer_size;
ommpy 0:d383e2dee0f7 64 char *_buffer;
ommpy 0:d383e2dee0f7 65 int _timeout;
ommpy 0:d383e2dee0f7 66
ommpy 0:d383e2dee0f7 67 // Parsing information
ommpy 0:d383e2dee0f7 68 const char *_output_delimiter;
ommpy 0:d383e2dee0f7 69 int _output_delim_size;
ommpy 0:d383e2dee0f7 70 int _oob_cb_count;
ommpy 0:d383e2dee0f7 71 char _in_prev;
ommpy 0:d383e2dee0f7 72 bool _dbg_on;
ommpy 0:d383e2dee0f7 73 bool _aborted;
ommpy 0:d383e2dee0f7 74
ommpy 0:d383e2dee0f7 75 struct oob {
ommpy 0:d383e2dee0f7 76 unsigned len;
ommpy 0:d383e2dee0f7 77 const char *prefix;
ommpy 0:d383e2dee0f7 78 mbed::Callback<void()> cb;
ommpy 0:d383e2dee0f7 79 oob *next;
ommpy 0:d383e2dee0f7 80 };
ommpy 0:d383e2dee0f7 81 oob *_oobs;
ommpy 0:d383e2dee0f7 82
ommpy 0:d383e2dee0f7 83 public:
ommpy 0:d383e2dee0f7 84
ommpy 0:d383e2dee0f7 85 /**
ommpy 0:d383e2dee0f7 86 * Constructor
ommpy 0:d383e2dee0f7 87 *
ommpy 0:d383e2dee0f7 88 * @param fh A FileHandle to the digital interface, used for AT commands
ommpy 0:d383e2dee0f7 89 * @param output_delimiter End of command-line termination
ommpy 0:d383e2dee0f7 90 * @param buffer_size Size of internal buffer for transaction
ommpy 0:d383e2dee0f7 91 * @param timeout Timeout of the connection
ommpy 0:d383e2dee0f7 92 * @param debug Turns on/off debug output for AT commands
ommpy 0:d383e2dee0f7 93 */
ommpy 0:d383e2dee0f7 94 ATCmdParser(FileHandle *fh, const char *output_delimiter = "\r",
ommpy 0:d383e2dee0f7 95 int buffer_size = 256, int timeout = 8000, bool debug = false)
ommpy 0:d383e2dee0f7 96 : _fh(fh), _buffer_size(buffer_size), _oob_cb_count(0), _in_prev(0), _oobs(NULL)
ommpy 0:d383e2dee0f7 97 {
ommpy 0:d383e2dee0f7 98 _buffer = new char[buffer_size];
ommpy 0:d383e2dee0f7 99 set_timeout(timeout);
ommpy 0:d383e2dee0f7 100 set_delimiter(output_delimiter);
ommpy 0:d383e2dee0f7 101 debug_on(debug);
ommpy 0:d383e2dee0f7 102 }
ommpy 0:d383e2dee0f7 103
ommpy 0:d383e2dee0f7 104 /**
ommpy 0:d383e2dee0f7 105 * Destructor
ommpy 0:d383e2dee0f7 106 */
ommpy 0:d383e2dee0f7 107 ~ATCmdParser()
ommpy 0:d383e2dee0f7 108 {
ommpy 0:d383e2dee0f7 109 while (_oobs) {
ommpy 0:d383e2dee0f7 110 struct oob *oob = _oobs;
ommpy 0:d383e2dee0f7 111 _oobs = oob->next;
ommpy 0:d383e2dee0f7 112 delete oob;
ommpy 0:d383e2dee0f7 113 }
ommpy 0:d383e2dee0f7 114 delete[] _buffer;
ommpy 0:d383e2dee0f7 115 }
ommpy 0:d383e2dee0f7 116
ommpy 0:d383e2dee0f7 117 /**
ommpy 0:d383e2dee0f7 118 * Allows timeout to be changed between commands
ommpy 0:d383e2dee0f7 119 *
ommpy 0:d383e2dee0f7 120 * @param timeout ATCmdParser APIs (read/write/send/recv ..etc) throw an
ommpy 0:d383e2dee0f7 121 * error if no response is received in `timeout` duration
ommpy 0:d383e2dee0f7 122 */
ommpy 0:d383e2dee0f7 123 void set_timeout(int timeout)
ommpy 0:d383e2dee0f7 124 {
ommpy 0:d383e2dee0f7 125 _timeout = timeout;
ommpy 0:d383e2dee0f7 126 }
ommpy 0:d383e2dee0f7 127
ommpy 0:d383e2dee0f7 128 /**
ommpy 0:d383e2dee0f7 129 * For backward compatibility.
ommpy 0:d383e2dee0f7 130 * @deprecated Do not use this function. This function has been replaced with set_timeout for consistency.
ommpy 0:d383e2dee0f7 131 *
ommpy 0:d383e2dee0f7 132 * Please use set_timeout(int) API only from now on.
ommpy 0:d383e2dee0f7 133 * Allows timeout to be changed between commands
ommpy 0:d383e2dee0f7 134 *
ommpy 0:d383e2dee0f7 135 * @param timeout ATCmdParser APIs (read/write/send/recv ..etc) throw an
ommpy 0:d383e2dee0f7 136 * error if no response is received in `timeout` duration
ommpy 0:d383e2dee0f7 137 *
ommpy 0:d383e2dee0f7 138 */
ommpy 0:d383e2dee0f7 139 MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with set_timeout for consistency")
ommpy 0:d383e2dee0f7 140 void setTimeout(int timeout)
ommpy 0:d383e2dee0f7 141 {
ommpy 0:d383e2dee0f7 142 set_timeout(timeout);
ommpy 0:d383e2dee0f7 143 }
ommpy 0:d383e2dee0f7 144
ommpy 0:d383e2dee0f7 145 /**
ommpy 0:d383e2dee0f7 146 * Sets string of characters to use as line delimiters
ommpy 0:d383e2dee0f7 147 *
ommpy 0:d383e2dee0f7 148 * @param output_delimiter String of characters to use as line delimiters
ommpy 0:d383e2dee0f7 149 */
ommpy 0:d383e2dee0f7 150 void set_delimiter(const char *output_delimiter)
ommpy 0:d383e2dee0f7 151 {
ommpy 0:d383e2dee0f7 152 _output_delimiter = output_delimiter;
ommpy 0:d383e2dee0f7 153 _output_delim_size = strlen(output_delimiter);
ommpy 0:d383e2dee0f7 154 }
ommpy 0:d383e2dee0f7 155
ommpy 0:d383e2dee0f7 156 /**
ommpy 0:d383e2dee0f7 157 * For backwards compatibility.
ommpy 0:d383e2dee0f7 158 * @deprecated Do not use this function. This function has been replaced with set_delimiter for consistency.
ommpy 0:d383e2dee0f7 159 *
ommpy 0:d383e2dee0f7 160 * Please use set_delimiter(const char *) API only from now on.
ommpy 0:d383e2dee0f7 161 * Sets string of characters to use as line delimiters
ommpy 0:d383e2dee0f7 162 *
ommpy 0:d383e2dee0f7 163 * @param output_delimiter string of characters to use as line delimiters
ommpy 0:d383e2dee0f7 164 */
ommpy 0:d383e2dee0f7 165 MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with set_delimiter for consistency")
ommpy 0:d383e2dee0f7 166 void setDelimiter(const char *output_delimiter)
ommpy 0:d383e2dee0f7 167 {
ommpy 0:d383e2dee0f7 168 set_delimiter(output_delimiter);
ommpy 0:d383e2dee0f7 169 }
ommpy 0:d383e2dee0f7 170
ommpy 0:d383e2dee0f7 171 /**
ommpy 0:d383e2dee0f7 172 * Allows traces from modem to be turned on or off
ommpy 0:d383e2dee0f7 173 *
ommpy 0:d383e2dee0f7 174 * @param on Set as 1 to turn on traces and 0 to disable traces.
ommpy 0:d383e2dee0f7 175 */
ommpy 0:d383e2dee0f7 176 void debug_on(uint8_t on)
ommpy 0:d383e2dee0f7 177 {
ommpy 0:d383e2dee0f7 178 _dbg_on = (on) ? 1 : 0;
ommpy 0:d383e2dee0f7 179 }
ommpy 0:d383e2dee0f7 180
ommpy 0:d383e2dee0f7 181 /**
ommpy 0:d383e2dee0f7 182 * For backward compatibility.
ommpy 0:d383e2dee0f7 183 * @deprecated Do not use this function. This function has been replaced with debug_on for consistency.
ommpy 0:d383e2dee0f7 184 *
ommpy 0:d383e2dee0f7 185 * Allows traces from modem to be turned on or off
ommpy 0:d383e2dee0f7 186 *
ommpy 0:d383e2dee0f7 187 * @param on Set as 1 to turn on traces and 0 to disable traces.
ommpy 0:d383e2dee0f7 188 */
ommpy 0:d383e2dee0f7 189 MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with debug_on for consistency")
ommpy 0:d383e2dee0f7 190 void debugOn(uint8_t on)
ommpy 0:d383e2dee0f7 191 {
ommpy 0:d383e2dee0f7 192 debug_on(on);
ommpy 0:d383e2dee0f7 193 }
ommpy 0:d383e2dee0f7 194
ommpy 0:d383e2dee0f7 195 /**
ommpy 0:d383e2dee0f7 196 * Sends an AT command
ommpy 0:d383e2dee0f7 197 *
ommpy 0:d383e2dee0f7 198 * Sends a formatted command using printf style formatting
ommpy 0:d383e2dee0f7 199 * @see printf
ommpy 0:d383e2dee0f7 200 *
ommpy 0:d383e2dee0f7 201 * @param command printf-like format string of command to send which
ommpy 0:d383e2dee0f7 202 * is appended with a newline
ommpy 0:d383e2dee0f7 203 * @param ... all printf-like arguments to insert into command
ommpy 0:d383e2dee0f7 204 * @return true only if command is successfully sent
ommpy 0:d383e2dee0f7 205 */
ommpy 0:d383e2dee0f7 206 bool send(const char *command, ...) MBED_PRINTF_METHOD(1, 2);
ommpy 0:d383e2dee0f7 207
ommpy 0:d383e2dee0f7 208 bool vsend(const char *command, std::va_list args);
ommpy 0:d383e2dee0f7 209
ommpy 0:d383e2dee0f7 210 /**
ommpy 0:d383e2dee0f7 211 * Receive an AT response
ommpy 0:d383e2dee0f7 212 *
ommpy 0:d383e2dee0f7 213 * Receives a formatted response using scanf style formatting
ommpy 0:d383e2dee0f7 214 * @see scanf
ommpy 0:d383e2dee0f7 215 *
ommpy 0:d383e2dee0f7 216 * Responses are parsed line at a time.
ommpy 0:d383e2dee0f7 217 * Any received data that does not match the response is ignored until
ommpy 0:d383e2dee0f7 218 * a timeout occurs.
ommpy 0:d383e2dee0f7 219 *
ommpy 0:d383e2dee0f7 220 * @param response scanf-like format string of response to expect
ommpy 0:d383e2dee0f7 221 * @param ... all scanf-like arguments to extract from response
ommpy 0:d383e2dee0f7 222 * @return true only if response is successfully matched
ommpy 0:d383e2dee0f7 223 */
ommpy 0:d383e2dee0f7 224 bool recv(const char *response, ...) MBED_SCANF_METHOD(1, 2);
ommpy 0:d383e2dee0f7 225
ommpy 0:d383e2dee0f7 226 bool vrecv(const char *response, std::va_list args);
ommpy 0:d383e2dee0f7 227
ommpy 0:d383e2dee0f7 228 /**
ommpy 0:d383e2dee0f7 229 * Write a single byte to the underlying stream
ommpy 0:d383e2dee0f7 230 *
ommpy 0:d383e2dee0f7 231 * @param c The byte to write
ommpy 0:d383e2dee0f7 232 * @return The byte that was written or -1 during a timeout
ommpy 0:d383e2dee0f7 233 */
ommpy 0:d383e2dee0f7 234 int putc(char c);
ommpy 0:d383e2dee0f7 235
ommpy 0:d383e2dee0f7 236 /**
ommpy 0:d383e2dee0f7 237 * Get a single byte from the underlying stream
ommpy 0:d383e2dee0f7 238 *
ommpy 0:d383e2dee0f7 239 * @return The byte that was read or -1 during a timeout
ommpy 0:d383e2dee0f7 240 */
ommpy 0:d383e2dee0f7 241 int getc();
ommpy 0:d383e2dee0f7 242
ommpy 0:d383e2dee0f7 243 /**
ommpy 0:d383e2dee0f7 244 * Write an array of bytes to the underlying stream
ommpy 0:d383e2dee0f7 245 *
ommpy 0:d383e2dee0f7 246 * @param data The array of bytes to write
ommpy 0:d383e2dee0f7 247 * @param size Number of bytes to write
ommpy 0:d383e2dee0f7 248 * @return number of bytes written or -1 on failure
ommpy 0:d383e2dee0f7 249 */
ommpy 0:d383e2dee0f7 250 int write(const char *data, int size);
ommpy 0:d383e2dee0f7 251
ommpy 0:d383e2dee0f7 252 /**
ommpy 0:d383e2dee0f7 253 * Read an array of bytes from the underlying stream
ommpy 0:d383e2dee0f7 254 *
ommpy 0:d383e2dee0f7 255 * @param data The buffer for filling the read bytes
ommpy 0:d383e2dee0f7 256 * @param size Number of bytes to read
ommpy 0:d383e2dee0f7 257 * @return number of bytes read or -1 on failure
ommpy 0:d383e2dee0f7 258 */
ommpy 0:d383e2dee0f7 259 int read(char *data, int size);
ommpy 0:d383e2dee0f7 260
ommpy 0:d383e2dee0f7 261 /**
ommpy 0:d383e2dee0f7 262 * Direct printf to underlying stream
ommpy 0:d383e2dee0f7 263 * @see printf
ommpy 0:d383e2dee0f7 264 *
ommpy 0:d383e2dee0f7 265 * @param format Format string to pass to printf
ommpy 0:d383e2dee0f7 266 * @param ... Variable arguments to printf
ommpy 0:d383e2dee0f7 267 * @return number of bytes written or -1 on failure
ommpy 0:d383e2dee0f7 268 */
ommpy 0:d383e2dee0f7 269 int printf(const char *format, ...) MBED_PRINTF_METHOD(1, 2);
ommpy 0:d383e2dee0f7 270
ommpy 0:d383e2dee0f7 271 int vprintf(const char *format, std::va_list args);
ommpy 0:d383e2dee0f7 272
ommpy 0:d383e2dee0f7 273 /**
ommpy 0:d383e2dee0f7 274 * Direct scanf on underlying stream
ommpy 0:d383e2dee0f7 275 * @see scanf
ommpy 0:d383e2dee0f7 276 *
ommpy 0:d383e2dee0f7 277 * @param format Format string to pass to scanf
ommpy 0:d383e2dee0f7 278 * @param ... Variable arguments to scanf
ommpy 0:d383e2dee0f7 279 * @return number of bytes read or -1 on failure
ommpy 0:d383e2dee0f7 280 */
ommpy 0:d383e2dee0f7 281 int scanf(const char *format, ...) MBED_SCANF_METHOD(1, 2);
ommpy 0:d383e2dee0f7 282
ommpy 0:d383e2dee0f7 283 int vscanf(const char *format, std::va_list args);
ommpy 0:d383e2dee0f7 284
ommpy 0:d383e2dee0f7 285 /**
ommpy 0:d383e2dee0f7 286 * Attach a callback for out-of-band data
ommpy 0:d383e2dee0f7 287 *
ommpy 0:d383e2dee0f7 288 * @param prefix String on when to initiate callback
ommpy 0:d383e2dee0f7 289 * @param func Callback to call when string is read
ommpy 0:d383e2dee0f7 290 * @note out-of-band data is only processed during a scanf call
ommpy 0:d383e2dee0f7 291 */
ommpy 0:d383e2dee0f7 292 void oob(const char *prefix, mbed::Callback<void()> func);
ommpy 0:d383e2dee0f7 293
ommpy 0:d383e2dee0f7 294 /**
ommpy 0:d383e2dee0f7 295 * Flushes the underlying stream
ommpy 0:d383e2dee0f7 296 */
ommpy 0:d383e2dee0f7 297 void flush();
ommpy 0:d383e2dee0f7 298
ommpy 0:d383e2dee0f7 299 /**
ommpy 0:d383e2dee0f7 300 * Abort current recv
ommpy 0:d383e2dee0f7 301 *
ommpy 0:d383e2dee0f7 302 * Can be called from out-of-band handler to interrupt the current
ommpy 0:d383e2dee0f7 303 * recv operation.
ommpy 0:d383e2dee0f7 304 */
ommpy 0:d383e2dee0f7 305 void abort();
ommpy 0:d383e2dee0f7 306
ommpy 0:d383e2dee0f7 307 /**
ommpy 0:d383e2dee0f7 308 * Process out-of-band data
ommpy 0:d383e2dee0f7 309 *
ommpy 0:d383e2dee0f7 310 * Process out-of-band data in the receive buffer. This function
ommpy 0:d383e2dee0f7 311 * returns immediately if there is no data to process.
ommpy 0:d383e2dee0f7 312 *
ommpy 0:d383e2dee0f7 313 * @return true if out-of-band data processed, false otherwise
ommpy 0:d383e2dee0f7 314 */
ommpy 0:d383e2dee0f7 315 bool process_oob(void);
ommpy 0:d383e2dee0f7 316 };
ommpy 0:d383e2dee0f7 317
ommpy 0:d383e2dee0f7 318 /**@}*/
ommpy 0:d383e2dee0f7 319
ommpy 0:d383e2dee0f7 320 /**@}*/
ommpy 0:d383e2dee0f7 321
ommpy 0:d383e2dee0f7 322 } //namespace mbed
ommpy 0:d383e2dee0f7 323
ommpy 0:d383e2dee0f7 324 #endif //MBED_ATCMDPARSER_H