mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

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