Parser for AT commands and similar protocols

Dependencies:   BufferedSerial

ATParser.h

Committer:
geky
Date:
2015-07-16
Revision:
1:66a14afe650a
Parent:
0:c741e144517c
Child:
2:4d68f546861c

File content as of revision 1:66a14afe650a:

/* Copyright (c) 2015 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @section DESCRIPTION
 *
 * Parser for the AT command syntax
 *
 */
 
#include "mbed.h"
#include <stdarg.h>

#include "BufferedSerial.h"

 
/**
* The ATParser class wraps information about the serial in use
*/
class ATParser {
private:
    // Serial information
    BufferedSerial *_serial;
    int _buffer_size;
    char *_buffer;
    int _timeout;
    
    // Helper methods for putc/getc with timeout
    int _putc(char c);
    int _getc();
    
    // Flush used to clear serial connection
    void _flush();
    
    // Helper methods for reading/writing lines with 
    // timeout and buffer limitations
    bool _putline(const char *line);
    bool _getline(char *line, int size);

public:
    /**
    * Constructor
    *
    * @param serial serial interface to use for AT commands
    * @param buffer_size size of internal buffer for transaction
    * @param timeout timeout of the connection
    * @param echo flag to indicate if an echo of sent characters should be expected
    */
    ATParser(BufferedSerial *serial, int buffer_size = 256, int timeout = 3000) :
            _serial(serial),
            _buffer_size(buffer_size),
            _timeout(timeout) {
        _buffer = new char[buffer_size];
    }
    
    /**
    * Destructor
    */
    ~ATParser() {
        delete [] _buffer;
    }
    
    /**
    * Allows timeout to be changed between commands
    *
    * @param timeout timeout of the connection
    */
    void setTimeout(int timeout) {
        _timeout = timeout;
    }
            
    /**
    * Issue AT commands with specified command and expected response
    * Uses printf/scanf like format strings to be able to parse the results
    *
    * Here are some examples:
    * @code
    * at.command("AT", "OK");
    * at.command("AT+CWMODE=%d", "OK", 3);
    * at.command("AT+CWMODE?", "+CWMODE:%d OK", &result);
    * @endcode
    *
    * @param command printf-like format string of command to send
    * @param response scanf-like format string of response to parse
    * @param ... all printf-like arguments to insert into command followed by 
    *            all scanf-like pointers to destinations for response values
    * @return true only if response is successfully matched
    */
    bool command(const char *command, const char *response, ...);
};