2017-05-23 17:07:24 +00:00
|
|
|
/* 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"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parser class for parsing AT commands
|
|
|
|
*
|
|
|
|
* Here are some examples:
|
|
|
|
* @code
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace mbed {
|
|
|
|
|
|
|
|
class 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;
|
|
|
|
|
|
|
|
// Prohibiting use of of copy constructor
|
|
|
|
ATCmdParser(const ATCmdParser &);
|
|
|
|
// Prohibiting copy assignment Operator
|
|
|
|
ATCmdParser &operator=(const ATCmdParser &);
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
2017-06-01 18:14:51 +00:00
|
|
|
* @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
|
2017-05-23 17:07:24 +00:00
|
|
|
*/
|
|
|
|
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.
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*
|
2017-06-01 18:14:51 +00:00
|
|
|
* @param output_delimiter string of characters to use as line delimiters
|
2017-05-23 17:07:24 +00:00
|
|
|
*/
|
|
|
|
void set_delimiter(const char *output_delimiter)
|
|
|
|
{
|
|
|
|
_output_delimiter = output_delimiter;
|
|
|
|
_output_delim_size = strlen(output_delimiter);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* For backwards compatibility.
|
|
|
|
*
|
|
|
|
* Please use set_delimiter(const char *) API only from now on.
|
|
|
|
* Sets string of characters to use as line delimiters
|
|
|
|
*
|
2017-06-01 18:14:51 +00:00
|
|
|
* @param output_delimiter string of characters to use as line delimiters
|
2017-05-23 17:07:24 +00:00
|
|
|
*/
|
|
|
|
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.
|
|
|
|
*
|
|
|
|
* 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
|
2017-06-01 18:14:51 +00:00
|
|
|
* @see printf
|
2017-05-23 17:07:24 +00:00
|
|
|
*
|
|
|
|
* @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
|
2017-06-01 18:14:51 +00:00
|
|
|
* @see scanf
|
2017-05-23 17:07:24 +00:00
|
|
|
*
|
|
|
|
* 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
|
2017-06-01 18:14:51 +00:00
|
|
|
* @see printf
|
2017-05-23 17:07:24 +00:00
|
|
|
*
|
|
|
|
* @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
|
2017-06-01 18:14:51 +00:00
|
|
|
* @see scanf
|
2017-05-23 17:07:24 +00:00
|
|
|
*
|
|
|
|
* @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();
|
|
|
|
};
|
|
|
|
} //namespace mbed
|
|
|
|
|
|
|
|
#endif //MBED_ATCMDPARSER_H
|