ESP8266 driver from ARM

Dependents:   8-0_OneNet_IoT_demo STM32F103C8T6_OneNet_IoT

Committer:
TaylorGy
Date:
Wed Mar 29 03:09:15 2017 +0000
Revision:
0:dfb22bd0e039
ESP8266 driver from ARM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TaylorGy 0:dfb22bd0e039 1 /* Copyright (c) 2015 ARM Limited
TaylorGy 0:dfb22bd0e039 2 *
TaylorGy 0:dfb22bd0e039 3 * Licensed under the Apache License, Version 2.0 (the "License");
TaylorGy 0:dfb22bd0e039 4 * you may not use this file except in compliance with the License.
TaylorGy 0:dfb22bd0e039 5 * You may obtain a copy of the License at
TaylorGy 0:dfb22bd0e039 6 *
TaylorGy 0:dfb22bd0e039 7 * http://www.apache.org/licenses/LICENSE-2.0
TaylorGy 0:dfb22bd0e039 8 *
TaylorGy 0:dfb22bd0e039 9 * Unless required by applicable law or agreed to in writing, software
TaylorGy 0:dfb22bd0e039 10 * distributed under the License is distributed on an "AS IS" BASIS,
TaylorGy 0:dfb22bd0e039 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TaylorGy 0:dfb22bd0e039 12 * See the License for the specific language governing permissions and
TaylorGy 0:dfb22bd0e039 13 * limitations under the License.
TaylorGy 0:dfb22bd0e039 14 *
TaylorGy 0:dfb22bd0e039 15 * @section DESCRIPTION
TaylorGy 0:dfb22bd0e039 16 *
TaylorGy 0:dfb22bd0e039 17 * Parser for the AT command syntax
TaylorGy 0:dfb22bd0e039 18 *
TaylorGy 0:dfb22bd0e039 19 */
TaylorGy 0:dfb22bd0e039 20 #ifndef AT_PARSER_H
TaylorGy 0:dfb22bd0e039 21 #define AT_PARSER_H
TaylorGy 0:dfb22bd0e039 22
TaylorGy 0:dfb22bd0e039 23 #include "mbed.h"
TaylorGy 0:dfb22bd0e039 24 #include <cstdarg>
TaylorGy 0:dfb22bd0e039 25 #include <vector>
TaylorGy 0:dfb22bd0e039 26 #include "BufferedSerial.h"
TaylorGy 0:dfb22bd0e039 27 #include "Callback.h"
TaylorGy 0:dfb22bd0e039 28
TaylorGy 0:dfb22bd0e039 29
TaylorGy 0:dfb22bd0e039 30 /**
TaylorGy 0:dfb22bd0e039 31 * Parser class for parsing AT commands
TaylorGy 0:dfb22bd0e039 32 *
TaylorGy 0:dfb22bd0e039 33 * Here are some examples:
TaylorGy 0:dfb22bd0e039 34 * @code
TaylorGy 0:dfb22bd0e039 35 * ATParser at = ATParser(serial, "\r\n");
TaylorGy 0:dfb22bd0e039 36 * int value;
TaylorGy 0:dfb22bd0e039 37 * char buffer[100];
TaylorGy 0:dfb22bd0e039 38 *
TaylorGy 0:dfb22bd0e039 39 * at.send("AT") && at.recv("OK");
TaylorGy 0:dfb22bd0e039 40 * at.send("AT+CWMODE=%d", 3) && at.recv("OK");
TaylorGy 0:dfb22bd0e039 41 * at.send("AT+CWMODE?") && at.recv("+CWMODE:%d\r\nOK", &value);
TaylorGy 0:dfb22bd0e039 42 * at.recv("+IPD,%d:", &value);
TaylorGy 0:dfb22bd0e039 43 * at.read(buffer, value);
TaylorGy 0:dfb22bd0e039 44 * at.recv("OK");
TaylorGy 0:dfb22bd0e039 45 * @endcode
TaylorGy 0:dfb22bd0e039 46 */
TaylorGy 0:dfb22bd0e039 47 class ATParser
TaylorGy 0:dfb22bd0e039 48 {
TaylorGy 0:dfb22bd0e039 49 private:
TaylorGy 0:dfb22bd0e039 50 // Serial information
TaylorGy 0:dfb22bd0e039 51 BufferedSerial *_serial;
TaylorGy 0:dfb22bd0e039 52 int _buffer_size;
TaylorGy 0:dfb22bd0e039 53 char *_buffer;
TaylorGy 0:dfb22bd0e039 54 int _timeout;
TaylorGy 0:dfb22bd0e039 55
TaylorGy 0:dfb22bd0e039 56 // Parsing information
TaylorGy 0:dfb22bd0e039 57 const char *_delimiter;
TaylorGy 0:dfb22bd0e039 58 int _delim_size;
TaylorGy 0:dfb22bd0e039 59 bool dbg_on;
TaylorGy 0:dfb22bd0e039 60
TaylorGy 0:dfb22bd0e039 61 struct oob {
TaylorGy 0:dfb22bd0e039 62 unsigned len;
TaylorGy 0:dfb22bd0e039 63 const char *prefix;
TaylorGy 0:dfb22bd0e039 64 mbed::Callback<void()> cb;
TaylorGy 0:dfb22bd0e039 65 };
TaylorGy 0:dfb22bd0e039 66 std::vector<oob> _oobs;
TaylorGy 0:dfb22bd0e039 67
TaylorGy 0:dfb22bd0e039 68 public:
TaylorGy 0:dfb22bd0e039 69 /**
TaylorGy 0:dfb22bd0e039 70 * Constructor
TaylorGy 0:dfb22bd0e039 71 *
TaylorGy 0:dfb22bd0e039 72 * @param serial serial interface to use for AT commands
TaylorGy 0:dfb22bd0e039 73 * @param buffer_size size of internal buffer for transaction
TaylorGy 0:dfb22bd0e039 74 * @param timeout timeout of the connection
TaylorGy 0:dfb22bd0e039 75 * @param delimiter string of characters to use as line delimiters
TaylorGy 0:dfb22bd0e039 76 */
TaylorGy 0:dfb22bd0e039 77 ATParser(BufferedSerial &serial, const char *delimiter = "\r\n", int buffer_size = 256, int timeout = 4000, bool debug = false) :
TaylorGy 0:dfb22bd0e039 78 _serial(&serial),
TaylorGy 0:dfb22bd0e039 79 _buffer_size(buffer_size) {
TaylorGy 0:dfb22bd0e039 80 _buffer = new char[buffer_size];
TaylorGy 0:dfb22bd0e039 81 setTimeout(timeout);
TaylorGy 0:dfb22bd0e039 82 setDelimiter(delimiter);
TaylorGy 0:dfb22bd0e039 83 debugOn(debug);
TaylorGy 0:dfb22bd0e039 84 }
TaylorGy 0:dfb22bd0e039 85
TaylorGy 0:dfb22bd0e039 86 /**
TaylorGy 0:dfb22bd0e039 87 * Destructor
TaylorGy 0:dfb22bd0e039 88 */
TaylorGy 0:dfb22bd0e039 89 ~ATParser() {
TaylorGy 0:dfb22bd0e039 90 delete [] _buffer;
TaylorGy 0:dfb22bd0e039 91 }
TaylorGy 0:dfb22bd0e039 92
TaylorGy 0:dfb22bd0e039 93 /**
TaylorGy 0:dfb22bd0e039 94 * Allows timeout to be changed between commands
TaylorGy 0:dfb22bd0e039 95 *
TaylorGy 0:dfb22bd0e039 96 * @param timeout timeout of the connection
TaylorGy 0:dfb22bd0e039 97 */
TaylorGy 0:dfb22bd0e039 98 void setTimeout(int timeout) {
TaylorGy 0:dfb22bd0e039 99 _timeout = timeout;
TaylorGy 0:dfb22bd0e039 100 }
TaylorGy 0:dfb22bd0e039 101
TaylorGy 0:dfb22bd0e039 102 /**
TaylorGy 0:dfb22bd0e039 103 * Sets string of characters to use as line delimiters
TaylorGy 0:dfb22bd0e039 104 *
TaylorGy 0:dfb22bd0e039 105 * @param delimiter string of characters to use as line delimiters
TaylorGy 0:dfb22bd0e039 106 */
TaylorGy 0:dfb22bd0e039 107 void setDelimiter(const char *delimiter) {
TaylorGy 0:dfb22bd0e039 108 _delimiter = delimiter;
TaylorGy 0:dfb22bd0e039 109 _delim_size = strlen(delimiter);
TaylorGy 0:dfb22bd0e039 110 }
TaylorGy 0:dfb22bd0e039 111
TaylorGy 0:dfb22bd0e039 112 /**
TaylorGy 0:dfb22bd0e039 113 * Allows echo to be on or off
TaylorGy 0:dfb22bd0e039 114 *
TaylorGy 0:dfb22bd0e039 115 * @param echo 1 for echo and 0 turns it off
TaylorGy 0:dfb22bd0e039 116 */
TaylorGy 0:dfb22bd0e039 117 void debugOn(uint8_t on) {
TaylorGy 0:dfb22bd0e039 118 dbg_on = (on) ? 1 : 0;
TaylorGy 0:dfb22bd0e039 119 }
TaylorGy 0:dfb22bd0e039 120
TaylorGy 0:dfb22bd0e039 121 /**
TaylorGy 0:dfb22bd0e039 122 * Sends an AT command
TaylorGy 0:dfb22bd0e039 123 *
TaylorGy 0:dfb22bd0e039 124 * Sends a formatted command using printf style formatting
TaylorGy 0:dfb22bd0e039 125 * @see ::printf
TaylorGy 0:dfb22bd0e039 126 *
TaylorGy 0:dfb22bd0e039 127 * @param command printf-like format string of command to send which
TaylorGy 0:dfb22bd0e039 128 * is appended with the specified delimiter
TaylorGy 0:dfb22bd0e039 129 * @param ... all printf-like arguments to insert into command
TaylorGy 0:dfb22bd0e039 130 * @return true only if command is successfully sent
TaylorGy 0:dfb22bd0e039 131 */
TaylorGy 0:dfb22bd0e039 132 bool send(const char *command, ...);
TaylorGy 0:dfb22bd0e039 133 bool vsend(const char *command, va_list args);
TaylorGy 0:dfb22bd0e039 134
TaylorGy 0:dfb22bd0e039 135 /**
TaylorGy 0:dfb22bd0e039 136 * Recieve an AT response
TaylorGy 0:dfb22bd0e039 137 *
TaylorGy 0:dfb22bd0e039 138 * Recieves a formatted response using scanf style formatting
TaylorGy 0:dfb22bd0e039 139 * @see ::scanf
TaylorGy 0:dfb22bd0e039 140 *
TaylorGy 0:dfb22bd0e039 141 * Responses are parsed line at a time using the specified delimiter.
TaylorGy 0:dfb22bd0e039 142 * Any recieved data that does not match the response is ignored until
TaylorGy 0:dfb22bd0e039 143 * a timeout occurs.
TaylorGy 0:dfb22bd0e039 144 *
TaylorGy 0:dfb22bd0e039 145 * @param response scanf-like format string of response to expect
TaylorGy 0:dfb22bd0e039 146 * @param ... all scanf-like arguments to extract from response
TaylorGy 0:dfb22bd0e039 147 * @return true only if response is successfully matched
TaylorGy 0:dfb22bd0e039 148 */
TaylorGy 0:dfb22bd0e039 149 bool recv(const char *response, ...);
TaylorGy 0:dfb22bd0e039 150 bool vrecv(const char *response, va_list args);
TaylorGy 0:dfb22bd0e039 151
TaylorGy 0:dfb22bd0e039 152 /**
TaylorGy 0:dfb22bd0e039 153 * Write a single byte to the underlying stream
TaylorGy 0:dfb22bd0e039 154 *
TaylorGy 0:dfb22bd0e039 155 * @param c The byte to write
TaylorGy 0:dfb22bd0e039 156 * @return The byte that was written or -1 during a timeout
TaylorGy 0:dfb22bd0e039 157 */
TaylorGy 0:dfb22bd0e039 158 int putc(char c);
TaylorGy 0:dfb22bd0e039 159
TaylorGy 0:dfb22bd0e039 160 /**
TaylorGy 0:dfb22bd0e039 161 * Get a single byte from the underlying stream
TaylorGy 0:dfb22bd0e039 162 *
TaylorGy 0:dfb22bd0e039 163 * @return The byte that was read or -1 during a timeout
TaylorGy 0:dfb22bd0e039 164 */
TaylorGy 0:dfb22bd0e039 165 int getc();
TaylorGy 0:dfb22bd0e039 166
TaylorGy 0:dfb22bd0e039 167 /**
TaylorGy 0:dfb22bd0e039 168 * Write an array of bytes to the underlying stream
TaylorGy 0:dfb22bd0e039 169 *
TaylorGy 0:dfb22bd0e039 170 * @param data the array of bytes to write
TaylorGy 0:dfb22bd0e039 171 * @param size number of bytes to write
TaylorGy 0:dfb22bd0e039 172 * @return number of bytes written or -1 on failure
TaylorGy 0:dfb22bd0e039 173 */
TaylorGy 0:dfb22bd0e039 174 int write(const char *data, int size);
TaylorGy 0:dfb22bd0e039 175
TaylorGy 0:dfb22bd0e039 176 /**
TaylorGy 0:dfb22bd0e039 177 * Read an array of bytes from the underlying stream
TaylorGy 0:dfb22bd0e039 178 *
TaylorGy 0:dfb22bd0e039 179 * @param data the destination for the read bytes
TaylorGy 0:dfb22bd0e039 180 * @param size number of bytes to read
TaylorGy 0:dfb22bd0e039 181 * @return number of bytes read or -1 on failure
TaylorGy 0:dfb22bd0e039 182 */
TaylorGy 0:dfb22bd0e039 183 int read(char *data, int size);
TaylorGy 0:dfb22bd0e039 184
TaylorGy 0:dfb22bd0e039 185 /**
TaylorGy 0:dfb22bd0e039 186 * Direct printf to underlying stream
TaylorGy 0:dfb22bd0e039 187 * @see ::printf
TaylorGy 0:dfb22bd0e039 188 *
TaylorGy 0:dfb22bd0e039 189 * @param format format string to pass to printf
TaylorGy 0:dfb22bd0e039 190 * @param ... arguments to printf
TaylorGy 0:dfb22bd0e039 191 * @return number of bytes written or -1 on failure
TaylorGy 0:dfb22bd0e039 192 */
TaylorGy 0:dfb22bd0e039 193 int printf(const char *format, ...);
TaylorGy 0:dfb22bd0e039 194 int vprintf(const char *format, va_list args);
TaylorGy 0:dfb22bd0e039 195
TaylorGy 0:dfb22bd0e039 196 /**
TaylorGy 0:dfb22bd0e039 197 * Direct scanf on underlying stream
TaylorGy 0:dfb22bd0e039 198 * @see ::scanf
TaylorGy 0:dfb22bd0e039 199 *
TaylorGy 0:dfb22bd0e039 200 * @param format format string to pass to scanf
TaylorGy 0:dfb22bd0e039 201 * @param ... arguments to scanf
TaylorGy 0:dfb22bd0e039 202 * @return number of bytes read or -1 on failure
TaylorGy 0:dfb22bd0e039 203 */
TaylorGy 0:dfb22bd0e039 204 int scanf(const char *format, ...);
TaylorGy 0:dfb22bd0e039 205 int vscanf(const char *format, va_list args);
TaylorGy 0:dfb22bd0e039 206
TaylorGy 0:dfb22bd0e039 207 /**
TaylorGy 0:dfb22bd0e039 208 * Attach a callback for out-of-band data
TaylorGy 0:dfb22bd0e039 209 *
TaylorGy 0:dfb22bd0e039 210 * @param prefix string on when to initiate callback
TaylorGy 0:dfb22bd0e039 211 * @param func callback to call when string is read
TaylorGy 0:dfb22bd0e039 212 * @note out-of-band data is only processed during a scanf call
TaylorGy 0:dfb22bd0e039 213 */
TaylorGy 0:dfb22bd0e039 214 void oob(const char *prefix, mbed::Callback<void()> func);
TaylorGy 0:dfb22bd0e039 215
TaylorGy 0:dfb22bd0e039 216 /**
TaylorGy 0:dfb22bd0e039 217 * Attach a callback for out-of-band data
TaylorGy 0:dfb22bd0e039 218 *
TaylorGy 0:dfb22bd0e039 219 * @param prefix string on when to initiate callback
TaylorGy 0:dfb22bd0e039 220 * @param obj pointer to object to call member function on
TaylorGy 0:dfb22bd0e039 221 * @param method callback to call when string is read
TaylorGy 0:dfb22bd0e039 222 * @note out-of-band data is only processed during a scanf call
TaylorGy 0:dfb22bd0e039 223 */
TaylorGy 0:dfb22bd0e039 224 template <typename T, typename M>
TaylorGy 0:dfb22bd0e039 225 void oob(const char *prefix, T *obj, M method) {
TaylorGy 0:dfb22bd0e039 226 return oob(prefix, mbed::Callback<void()>(obj, method));
TaylorGy 0:dfb22bd0e039 227 }
TaylorGy 0:dfb22bd0e039 228
TaylorGy 0:dfb22bd0e039 229 /**
TaylorGy 0:dfb22bd0e039 230 * Flushes the underlying stream
TaylorGy 0:dfb22bd0e039 231 */
TaylorGy 0:dfb22bd0e039 232 void flush();
TaylorGy 0:dfb22bd0e039 233 };
TaylorGy 0:dfb22bd0e039 234 #endif