123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- /* Copyright (c) 2017 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @section DESCRIPTION
- *
- * Parser for the AT command syntax
- *
- */
- #ifndef MBED_ATCMDPARSER_H
- #define MBED_ATCMDPARSER_H
- #include "mbed.h"
- #include <cstdarg>
- #include "Callback.h"
- namespace mbed {
- /** \addtogroup platform */
- /** @{*/
- /**
- * \defgroup platform_ATCmdParser ATCmdParser class
- * @{
- */
- /**
- * Parser class for parsing AT commands
- *
- * Here are some examples:
- * @code
- * UARTSerial serial = UARTSerial(D1, D0);
- * ATCmdParser at = ATCmdParser(&serial, "\r\n");
- * int value;
- * char buffer[100];
- *
- * at.send("AT") && at.recv("OK");
- * at.send("AT+CWMODE=%d", 3) && at.recv("OK");
- * at.send("AT+CWMODE?") && at.recv("+CWMODE:%d\r\nOK", &value);
- * at.recv("+IPD,%d:", &value);
- * at.read(buffer, value);
- * at.recv("OK");
- * @endcode
- */
- class ATCmdParser : private NonCopyable<ATCmdParser> {
- private:
- // File handle
- // Not owned by ATCmdParser
- FileHandle *_fh;
- int _buffer_size;
- char *_buffer;
- int _timeout;
- // Parsing information
- const char *_output_delimiter;
- int _output_delim_size;
- char _in_prev;
- bool _dbg_on;
- bool _aborted;
- struct oob {
- unsigned len;
- const char *prefix;
- mbed::Callback<void()> cb;
- oob *next;
- };
- oob *_oobs;
- public:
- /**
- * Constructor
- *
- * @param fh A FileHandle to a digital interface to use for AT commands
- * @param output_delimiter end of command line termination
- * @param buffer_size size of internal buffer for transaction
- * @param timeout timeout of the connection
- * @param debug turns on/off debug output for AT commands
- */
- ATCmdParser(FileHandle *fh, const char *output_delimiter = "\r",
- int buffer_size = 256, int timeout = 8000, bool debug = false)
- : _fh(fh), _buffer_size(buffer_size), _in_prev(0), _oobs(NULL)
- {
- _buffer = new char[buffer_size];
- set_timeout(timeout);
- set_delimiter(output_delimiter);
- debug_on(debug);
- }
- /**
- * Destructor
- */
- ~ATCmdParser()
- {
- while (_oobs) {
- struct oob *oob = _oobs;
- _oobs = oob->next;
- delete oob;
- }
- delete[] _buffer;
- }
- /**
- * Allows timeout to be changed between commands
- *
- * @param timeout timeout of the connection
- */
- void set_timeout(int timeout)
- {
- _timeout = timeout;
- }
- /**
- * For backwards compatibility.
- * @deprecated Do not use this function. This function has been replaced with set_timeout for consistency.
- *
- * Please use set_timeout(int) API only from now on.
- * Allows timeout to be changed between commands
- *
- * @param timeout timeout of the connection
- */
- MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with set_timeout for consistency")
- void setTimeout(int timeout)
- {
- set_timeout(timeout);
- }
- /**
- * Sets string of characters to use as line delimiters
- *
- * @param output_delimiter string of characters to use as line delimiters
- */
- void set_delimiter(const char *output_delimiter)
- {
- _output_delimiter = output_delimiter;
- _output_delim_size = strlen(output_delimiter);
- }
- /**
- * For backwards compatibility.
- * @deprecated Do not use this function. This function has been replaced with set_delimiter for consistency.
- *
- * Please use set_delimiter(const char *) API only from now on.
- * Sets string of characters to use as line delimiters
- *
- * @param output_delimiter string of characters to use as line delimiters
- */
- MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with set_delimiter for consistency")
- void setDelimiter(const char *output_delimiter)
- {
- set_delimiter(output_delimiter);
- }
- /**
- * Allows traces from modem to be turned on or off
- *
- * @param on set as 1 to turn on traces and vice versa.
- */
- void debug_on(uint8_t on)
- {
- _dbg_on = (on) ? 1 : 0;
- }
- /**
- * For backwards compatibility.
- * @deprecated Do not use this function. This function has been replaced with debug_on for consistency.
- *
- * Allows traces from modem to be turned on or off
- *
- * @param on set as 1 to turn on traces and vice versa.
- */
- MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with debug_on for consistency")
- void debugOn(uint8_t on)
- {
- debug_on(on);
- }
- /**
- * Sends an AT command
- *
- * Sends a formatted command using printf style formatting
- * @see printf
- *
- * @param command printf-like format string of command to send which
- * is appended with a newline
- * @param ... all printf-like arguments to insert into command
- * @return true only if command is successfully sent
- */
- bool send(const char *command, ...) MBED_PRINTF_METHOD(1, 2);
- bool vsend(const char *command, va_list args);
- /**
- * Receive an AT response
- *
- * Receives a formatted response using scanf style formatting
- * @see scanf
- *
- * Responses are parsed line at a time.
- * Any received data that does not match the response is ignored until
- * a timeout occurs.
- *
- * @param response scanf-like format string of response to expect
- * @param ... all scanf-like arguments to extract from response
- * @return true only if response is successfully matched
- */
- bool recv(const char *response, ...) MBED_SCANF_METHOD(1, 2);
- bool vrecv(const char *response, va_list args);
- /**
- * Write a single byte to the underlying stream
- *
- * @param c The byte to write
- * @return The byte that was written or -1 during a timeout
- */
- int putc(char c);
- /**
- * Get a single byte from the underlying stream
- *
- * @return The byte that was read or -1 during a timeout
- */
- int getc();
- /**
- * Write an array of bytes to the underlying stream
- *
- * @param data the array of bytes to write
- * @param size number of bytes to write
- * @return number of bytes written or -1 on failure
- */
- int write(const char *data, int size);
- /**
- * Read an array of bytes from the underlying stream
- *
- * @param data the destination for the read bytes
- * @param size number of bytes to read
- * @return number of bytes read or -1 on failure
- */
- int read(char *data, int size);
- /**
- * Direct printf to underlying stream
- * @see printf
- *
- * @param format format string to pass to printf
- * @param ... arguments to printf
- * @return number of bytes written or -1 on failure
- */
- int printf(const char *format, ...) MBED_PRINTF_METHOD(1, 2);
- int vprintf(const char *format, va_list args);
- /**
- * Direct scanf on underlying stream
- * @see scanf
- *
- * @param format format string to pass to scanf
- * @param ... arguments to scanf
- * @return number of bytes read or -1 on failure
- */
- int scanf(const char *format, ...) MBED_SCANF_METHOD(1, 2);
- int vscanf(const char *format, va_list args);
- /**
- * Attach a callback for out-of-band data
- *
- * @param prefix string on when to initiate callback
- * @param func callback to call when string is read
- * @note out-of-band data is only processed during a scanf call
- */
- void oob(const char *prefix, mbed::Callback<void()> func);
- /**
- * Flushes the underlying stream
- */
- void flush();
- /**
- * Abort current recv
- *
- * Can be called from oob handler to interrupt the current
- * recv operation.
- */
- void abort();
- /**
- * Process out-of-band data
- *
- * Process out-of-band data in the receive buffer. This function
- * returns immediately if there is no data to process.
- *
- * @return true if oob data processed, false otherwise
- */
- bool process_oob(void);
- };
- /**@}*/
- /**@}*/
- } //namespace mbed
- #endif //MBED_ATCMDPARSER_H
|