The prosthetic control(MIT)

Committer:
ganlikun
Date:
Thu Jun 23 05:23:34 2022 +0000
Revision:
0:20e0c61e0684
01

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ganlikun 0:20e0c61e0684 1 /* Copyright (c) 2017 ARM Limited
ganlikun 0:20e0c61e0684 2 *
ganlikun 0:20e0c61e0684 3 * Licensed under the Apache License, Version 2.0 (the "License");
ganlikun 0:20e0c61e0684 4 * you may not use this file except in compliance with the License.
ganlikun 0:20e0c61e0684 5 * You may obtain a copy of the License at
ganlikun 0:20e0c61e0684 6 *
ganlikun 0:20e0c61e0684 7 * http://www.apache.org/licenses/LICENSE-2.0
ganlikun 0:20e0c61e0684 8 *
ganlikun 0:20e0c61e0684 9 * Unless required by applicable law or agreed to in writing, software
ganlikun 0:20e0c61e0684 10 * distributed under the License is distributed on an "AS IS" BASIS,
ganlikun 0:20e0c61e0684 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ganlikun 0:20e0c61e0684 12 * See the License for the specific language governing permissions and
ganlikun 0:20e0c61e0684 13 * limitations under the License.
ganlikun 0:20e0c61e0684 14 *
ganlikun 0:20e0c61e0684 15 * @section DESCRIPTION
ganlikun 0:20e0c61e0684 16 *
ganlikun 0:20e0c61e0684 17 * Parser for the AT command syntax
ganlikun 0:20e0c61e0684 18 *
ganlikun 0:20e0c61e0684 19 */
ganlikun 0:20e0c61e0684 20 #ifndef MBED_ATCMDPARSER_H
ganlikun 0:20e0c61e0684 21 #define MBED_ATCMDPARSER_H
ganlikun 0:20e0c61e0684 22
ganlikun 0:20e0c61e0684 23 #include "mbed.h"
ganlikun 0:20e0c61e0684 24 #include <cstdarg>
ganlikun 0:20e0c61e0684 25 #include "Callback.h"
ganlikun 0:20e0c61e0684 26
ganlikun 0:20e0c61e0684 27 /**
ganlikun 0:20e0c61e0684 28 * Parser class for parsing AT commands
ganlikun 0:20e0c61e0684 29 *
ganlikun 0:20e0c61e0684 30 * Here are some examples:
ganlikun 0:20e0c61e0684 31 * @code
ganlikun 0:20e0c61e0684 32 * UARTSerial serial = UARTSerial(D1, D0);
ganlikun 0:20e0c61e0684 33 * ATCmdParser at = ATCmdParser(&serial, "\r\n");
ganlikun 0:20e0c61e0684 34 * int value;
ganlikun 0:20e0c61e0684 35 * char buffer[100];
ganlikun 0:20e0c61e0684 36 *
ganlikun 0:20e0c61e0684 37 * at.send("AT") && at.recv("OK");
ganlikun 0:20e0c61e0684 38 * at.send("AT+CWMODE=%d", 3) && at.recv("OK");
ganlikun 0:20e0c61e0684 39 * at.send("AT+CWMODE?") && at.recv("+CWMODE:%d\r\nOK", &value);
ganlikun 0:20e0c61e0684 40 * at.recv("+IPD,%d:", &value);
ganlikun 0:20e0c61e0684 41 * at.read(buffer, value);
ganlikun 0:20e0c61e0684 42 * at.recv("OK");
ganlikun 0:20e0c61e0684 43 * @endcode
ganlikun 0:20e0c61e0684 44 */
ganlikun 0:20e0c61e0684 45
ganlikun 0:20e0c61e0684 46 namespace mbed {
ganlikun 0:20e0c61e0684 47
ganlikun 0:20e0c61e0684 48 class ATCmdParser : private NonCopyable<ATCmdParser>
ganlikun 0:20e0c61e0684 49 {
ganlikun 0:20e0c61e0684 50 private:
ganlikun 0:20e0c61e0684 51 // File handle
ganlikun 0:20e0c61e0684 52 // Not owned by ATCmdParser
ganlikun 0:20e0c61e0684 53 FileHandle *_fh;
ganlikun 0:20e0c61e0684 54
ganlikun 0:20e0c61e0684 55 int _buffer_size;
ganlikun 0:20e0c61e0684 56 char *_buffer;
ganlikun 0:20e0c61e0684 57 int _timeout;
ganlikun 0:20e0c61e0684 58
ganlikun 0:20e0c61e0684 59 // Parsing information
ganlikun 0:20e0c61e0684 60 const char *_output_delimiter;
ganlikun 0:20e0c61e0684 61 int _output_delim_size;
ganlikun 0:20e0c61e0684 62 char _in_prev;
ganlikun 0:20e0c61e0684 63 bool _dbg_on;
ganlikun 0:20e0c61e0684 64 bool _aborted;
ganlikun 0:20e0c61e0684 65
ganlikun 0:20e0c61e0684 66 struct oob {
ganlikun 0:20e0c61e0684 67 unsigned len;
ganlikun 0:20e0c61e0684 68 const char *prefix;
ganlikun 0:20e0c61e0684 69 mbed::Callback<void()> cb;
ganlikun 0:20e0c61e0684 70 oob *next;
ganlikun 0:20e0c61e0684 71 };
ganlikun 0:20e0c61e0684 72 oob *_oobs;
ganlikun 0:20e0c61e0684 73
ganlikun 0:20e0c61e0684 74 public:
ganlikun 0:20e0c61e0684 75
ganlikun 0:20e0c61e0684 76 /**
ganlikun 0:20e0c61e0684 77 * Constructor
ganlikun 0:20e0c61e0684 78 *
ganlikun 0:20e0c61e0684 79 * @param fh A FileHandle to a digital interface to use for AT commands
ganlikun 0:20e0c61e0684 80 * @param output_delimiter end of command line termination
ganlikun 0:20e0c61e0684 81 * @param buffer_size size of internal buffer for transaction
ganlikun 0:20e0c61e0684 82 * @param timeout timeout of the connection
ganlikun 0:20e0c61e0684 83 * @param debug turns on/off debug output for AT commands
ganlikun 0:20e0c61e0684 84 */
ganlikun 0:20e0c61e0684 85 ATCmdParser(FileHandle *fh, const char *output_delimiter = "\r",
ganlikun 0:20e0c61e0684 86 int buffer_size = 256, int timeout = 8000, bool debug = false)
ganlikun 0:20e0c61e0684 87 : _fh(fh), _buffer_size(buffer_size), _in_prev(0), _oobs(NULL)
ganlikun 0:20e0c61e0684 88 {
ganlikun 0:20e0c61e0684 89 _buffer = new char[buffer_size];
ganlikun 0:20e0c61e0684 90 set_timeout(timeout);
ganlikun 0:20e0c61e0684 91 set_delimiter(output_delimiter);
ganlikun 0:20e0c61e0684 92 debug_on(debug);
ganlikun 0:20e0c61e0684 93 }
ganlikun 0:20e0c61e0684 94
ganlikun 0:20e0c61e0684 95 /**
ganlikun 0:20e0c61e0684 96 * Destructor
ganlikun 0:20e0c61e0684 97 */
ganlikun 0:20e0c61e0684 98 ~ATCmdParser()
ganlikun 0:20e0c61e0684 99 {
ganlikun 0:20e0c61e0684 100 while (_oobs) {
ganlikun 0:20e0c61e0684 101 struct oob *oob = _oobs;
ganlikun 0:20e0c61e0684 102 _oobs = oob->next;
ganlikun 0:20e0c61e0684 103 delete oob;
ganlikun 0:20e0c61e0684 104 }
ganlikun 0:20e0c61e0684 105 delete[] _buffer;
ganlikun 0:20e0c61e0684 106 }
ganlikun 0:20e0c61e0684 107
ganlikun 0:20e0c61e0684 108 /**
ganlikun 0:20e0c61e0684 109 * Allows timeout to be changed between commands
ganlikun 0:20e0c61e0684 110 *
ganlikun 0:20e0c61e0684 111 * @param timeout timeout of the connection
ganlikun 0:20e0c61e0684 112 */
ganlikun 0:20e0c61e0684 113 void set_timeout(int timeout)
ganlikun 0:20e0c61e0684 114 {
ganlikun 0:20e0c61e0684 115 _timeout = timeout;
ganlikun 0:20e0c61e0684 116 }
ganlikun 0:20e0c61e0684 117
ganlikun 0:20e0c61e0684 118 /**
ganlikun 0:20e0c61e0684 119 * For backwards compatibility.
ganlikun 0:20e0c61e0684 120 *
ganlikun 0:20e0c61e0684 121 * Please use set_timeout(int) API only from now on.
ganlikun 0:20e0c61e0684 122 * Allows timeout to be changed between commands
ganlikun 0:20e0c61e0684 123 *
ganlikun 0:20e0c61e0684 124 * @param timeout timeout of the connection
ganlikun 0:20e0c61e0684 125 */
ganlikun 0:20e0c61e0684 126 MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with set_timeout for consistency")
ganlikun 0:20e0c61e0684 127 void setTimeout(int timeout)
ganlikun 0:20e0c61e0684 128 {
ganlikun 0:20e0c61e0684 129 set_timeout(timeout);
ganlikun 0:20e0c61e0684 130 }
ganlikun 0:20e0c61e0684 131
ganlikun 0:20e0c61e0684 132 /**
ganlikun 0:20e0c61e0684 133 * Sets string of characters to use as line delimiters
ganlikun 0:20e0c61e0684 134 *
ganlikun 0:20e0c61e0684 135 * @param output_delimiter string of characters to use as line delimiters
ganlikun 0:20e0c61e0684 136 */
ganlikun 0:20e0c61e0684 137 void set_delimiter(const char *output_delimiter)
ganlikun 0:20e0c61e0684 138 {
ganlikun 0:20e0c61e0684 139 _output_delimiter = output_delimiter;
ganlikun 0:20e0c61e0684 140 _output_delim_size = strlen(output_delimiter);
ganlikun 0:20e0c61e0684 141 }
ganlikun 0:20e0c61e0684 142
ganlikun 0:20e0c61e0684 143 /**
ganlikun 0:20e0c61e0684 144 * For backwards compatibility.
ganlikun 0:20e0c61e0684 145 *
ganlikun 0:20e0c61e0684 146 * Please use set_delimiter(const char *) API only from now on.
ganlikun 0:20e0c61e0684 147 * Sets string of characters to use as line delimiters
ganlikun 0:20e0c61e0684 148 *
ganlikun 0:20e0c61e0684 149 * @param output_delimiter string of characters to use as line delimiters
ganlikun 0:20e0c61e0684 150 */
ganlikun 0:20e0c61e0684 151 MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with set_delimiter for consistency")
ganlikun 0:20e0c61e0684 152 void setDelimiter(const char *output_delimiter)
ganlikun 0:20e0c61e0684 153 {
ganlikun 0:20e0c61e0684 154 set_delimiter(output_delimiter);
ganlikun 0:20e0c61e0684 155 }
ganlikun 0:20e0c61e0684 156
ganlikun 0:20e0c61e0684 157 /**
ganlikun 0:20e0c61e0684 158 * Allows traces from modem to be turned on or off
ganlikun 0:20e0c61e0684 159 *
ganlikun 0:20e0c61e0684 160 * @param on set as 1 to turn on traces and vice versa.
ganlikun 0:20e0c61e0684 161 */
ganlikun 0:20e0c61e0684 162 void debug_on(uint8_t on)
ganlikun 0:20e0c61e0684 163 {
ganlikun 0:20e0c61e0684 164 _dbg_on = (on) ? 1 : 0;
ganlikun 0:20e0c61e0684 165 }
ganlikun 0:20e0c61e0684 166
ganlikun 0:20e0c61e0684 167 /**
ganlikun 0:20e0c61e0684 168 * For backwards compatibility.
ganlikun 0:20e0c61e0684 169 *
ganlikun 0:20e0c61e0684 170 * Allows traces from modem to be turned on or off
ganlikun 0:20e0c61e0684 171 *
ganlikun 0:20e0c61e0684 172 * @param on set as 1 to turn on traces and vice versa.
ganlikun 0:20e0c61e0684 173 */
ganlikun 0:20e0c61e0684 174 MBED_DEPRECATED_SINCE("mbed-os-5.5.0", "Replaced with debug_on for consistency")
ganlikun 0:20e0c61e0684 175 void debugOn(uint8_t on)
ganlikun 0:20e0c61e0684 176 {
ganlikun 0:20e0c61e0684 177 debug_on(on);
ganlikun 0:20e0c61e0684 178 }
ganlikun 0:20e0c61e0684 179
ganlikun 0:20e0c61e0684 180 /**
ganlikun 0:20e0c61e0684 181 * Sends an AT command
ganlikun 0:20e0c61e0684 182 *
ganlikun 0:20e0c61e0684 183 * Sends a formatted command using printf style formatting
ganlikun 0:20e0c61e0684 184 * @see printf
ganlikun 0:20e0c61e0684 185 *
ganlikun 0:20e0c61e0684 186 * @param command printf-like format string of command to send which
ganlikun 0:20e0c61e0684 187 * is appended with a newline
ganlikun 0:20e0c61e0684 188 * @param ... all printf-like arguments to insert into command
ganlikun 0:20e0c61e0684 189 * @return true only if command is successfully sent
ganlikun 0:20e0c61e0684 190 */
ganlikun 0:20e0c61e0684 191 bool send(const char *command, ...) MBED_PRINTF_METHOD(1,2);
ganlikun 0:20e0c61e0684 192
ganlikun 0:20e0c61e0684 193 bool vsend(const char *command, va_list args);
ganlikun 0:20e0c61e0684 194
ganlikun 0:20e0c61e0684 195 /**
ganlikun 0:20e0c61e0684 196 * Receive an AT response
ganlikun 0:20e0c61e0684 197 *
ganlikun 0:20e0c61e0684 198 * Receives a formatted response using scanf style formatting
ganlikun 0:20e0c61e0684 199 * @see scanf
ganlikun 0:20e0c61e0684 200 *
ganlikun 0:20e0c61e0684 201 * Responses are parsed line at a time.
ganlikun 0:20e0c61e0684 202 * Any received data that does not match the response is ignored until
ganlikun 0:20e0c61e0684 203 * a timeout occurs.
ganlikun 0:20e0c61e0684 204 *
ganlikun 0:20e0c61e0684 205 * @param response scanf-like format string of response to expect
ganlikun 0:20e0c61e0684 206 * @param ... all scanf-like arguments to extract from response
ganlikun 0:20e0c61e0684 207 * @return true only if response is successfully matched
ganlikun 0:20e0c61e0684 208 */
ganlikun 0:20e0c61e0684 209 bool recv(const char *response, ...) MBED_SCANF_METHOD(1,2);
ganlikun 0:20e0c61e0684 210
ganlikun 0:20e0c61e0684 211 bool vrecv(const char *response, va_list args);
ganlikun 0:20e0c61e0684 212
ganlikun 0:20e0c61e0684 213 /**
ganlikun 0:20e0c61e0684 214 * Write a single byte to the underlying stream
ganlikun 0:20e0c61e0684 215 *
ganlikun 0:20e0c61e0684 216 * @param c The byte to write
ganlikun 0:20e0c61e0684 217 * @return The byte that was written or -1 during a timeout
ganlikun 0:20e0c61e0684 218 */
ganlikun 0:20e0c61e0684 219 int putc(char c);
ganlikun 0:20e0c61e0684 220
ganlikun 0:20e0c61e0684 221 /**
ganlikun 0:20e0c61e0684 222 * Get a single byte from the underlying stream
ganlikun 0:20e0c61e0684 223 *
ganlikun 0:20e0c61e0684 224 * @return The byte that was read or -1 during a timeout
ganlikun 0:20e0c61e0684 225 */
ganlikun 0:20e0c61e0684 226 int getc();
ganlikun 0:20e0c61e0684 227
ganlikun 0:20e0c61e0684 228 /**
ganlikun 0:20e0c61e0684 229 * Write an array of bytes to the underlying stream
ganlikun 0:20e0c61e0684 230 *
ganlikun 0:20e0c61e0684 231 * @param data the array of bytes to write
ganlikun 0:20e0c61e0684 232 * @param size number of bytes to write
ganlikun 0:20e0c61e0684 233 * @return number of bytes written or -1 on failure
ganlikun 0:20e0c61e0684 234 */
ganlikun 0:20e0c61e0684 235 int write(const char *data, int size);
ganlikun 0:20e0c61e0684 236
ganlikun 0:20e0c61e0684 237 /**
ganlikun 0:20e0c61e0684 238 * Read an array of bytes from the underlying stream
ganlikun 0:20e0c61e0684 239 *
ganlikun 0:20e0c61e0684 240 * @param data the destination for the read bytes
ganlikun 0:20e0c61e0684 241 * @param size number of bytes to read
ganlikun 0:20e0c61e0684 242 * @return number of bytes read or -1 on failure
ganlikun 0:20e0c61e0684 243 */
ganlikun 0:20e0c61e0684 244 int read(char *data, int size);
ganlikun 0:20e0c61e0684 245
ganlikun 0:20e0c61e0684 246 /**
ganlikun 0:20e0c61e0684 247 * Direct printf to underlying stream
ganlikun 0:20e0c61e0684 248 * @see printf
ganlikun 0:20e0c61e0684 249 *
ganlikun 0:20e0c61e0684 250 * @param format format string to pass to printf
ganlikun 0:20e0c61e0684 251 * @param ... arguments to printf
ganlikun 0:20e0c61e0684 252 * @return number of bytes written or -1 on failure
ganlikun 0:20e0c61e0684 253 */
ganlikun 0:20e0c61e0684 254 int printf(const char *format, ...) MBED_PRINTF_METHOD(1,2);
ganlikun 0:20e0c61e0684 255
ganlikun 0:20e0c61e0684 256 int vprintf(const char *format, va_list args);
ganlikun 0:20e0c61e0684 257
ganlikun 0:20e0c61e0684 258 /**
ganlikun 0:20e0c61e0684 259 * Direct scanf on underlying stream
ganlikun 0:20e0c61e0684 260 * @see scanf
ganlikun 0:20e0c61e0684 261 *
ganlikun 0:20e0c61e0684 262 * @param format format string to pass to scanf
ganlikun 0:20e0c61e0684 263 * @param ... arguments to scanf
ganlikun 0:20e0c61e0684 264 * @return number of bytes read or -1 on failure
ganlikun 0:20e0c61e0684 265 */
ganlikun 0:20e0c61e0684 266 int scanf(const char *format, ...) MBED_SCANF_METHOD(1,2);
ganlikun 0:20e0c61e0684 267
ganlikun 0:20e0c61e0684 268 int vscanf(const char *format, va_list args);
ganlikun 0:20e0c61e0684 269
ganlikun 0:20e0c61e0684 270 /**
ganlikun 0:20e0c61e0684 271 * Attach a callback for out-of-band data
ganlikun 0:20e0c61e0684 272 *
ganlikun 0:20e0c61e0684 273 * @param prefix string on when to initiate callback
ganlikun 0:20e0c61e0684 274 * @param func callback to call when string is read
ganlikun 0:20e0c61e0684 275 * @note out-of-band data is only processed during a scanf call
ganlikun 0:20e0c61e0684 276 */
ganlikun 0:20e0c61e0684 277 void oob(const char *prefix, mbed::Callback<void()> func);
ganlikun 0:20e0c61e0684 278
ganlikun 0:20e0c61e0684 279 /**
ganlikun 0:20e0c61e0684 280 * Flushes the underlying stream
ganlikun 0:20e0c61e0684 281 */
ganlikun 0:20e0c61e0684 282 void flush();
ganlikun 0:20e0c61e0684 283
ganlikun 0:20e0c61e0684 284 /**
ganlikun 0:20e0c61e0684 285 * Abort current recv
ganlikun 0:20e0c61e0684 286 *
ganlikun 0:20e0c61e0684 287 * Can be called from oob handler to interrupt the current
ganlikun 0:20e0c61e0684 288 * recv operation.
ganlikun 0:20e0c61e0684 289 */
ganlikun 0:20e0c61e0684 290 void abort();
ganlikun 0:20e0c61e0684 291 };
ganlikun 0:20e0c61e0684 292 } //namespace mbed
ganlikun 0:20e0c61e0684 293
ganlikun 0:20e0c61e0684 294 #endif //MBED_ATCMDPARSER_H
ganlikun 0:20e0c61e0684 295