wifi test

Dependencies:   X_NUCLEO_IKS01A2 mbed-http

Committer:
JMF
Date:
Wed Sep 05 14:28:24 2018 +0000
Revision:
0:24d3eb812fd4
Initial commit

Who changed what in which revision?

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