FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:35:07 2017 +0000
Revision:
0:a2cb7295a1f7
Initial commit

Who changed what in which revision?

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