Sarah Marsh / emw3162-driver

Fork of emw3162-driver by Maggie Mei

Committer:
sarahmarshy
Date:
Thu Jan 12 17:21:34 2017 -0600
Revision:
4:2ab7d68a654c
Parent:
0:2d5090e1ceb4
Updated to mbed-os

Who changed what in which revision?

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