Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mtsas mtsas mtsas mtsas
Utils/CellUtils.h
- Committer:
- Leon Lindenfelser 
- Date:
- 2018-02-19
- Revision:
- 82:5b33b670adb7
- Parent:
- 30:1326b623919a
File content as of revision 82:5b33b670adb7:
#ifndef CELLUTILS_H
#define CELLUTILS_H
#include "MTSBufferedIO.h"
#include "MTSLog.h"
using namespace mts;
//Special Payload Character Constants (ASCII Values)
const char ETX    = 0x03;   //Ends socket connection
const char DLE    = 0x10;   //Escapes ETX and DLE within Payload
const char CR     = 0x0D;   //Carriage Return
const char NL     = 0x0A;   //Newline
const char CTRL_Z = 0x1A;   //Control-Z
/// An enumeration for common responses.
enum Code {
    MTS_SUCCESS, MTS_ERROR, MTS_FAILURE, MTS_NO_RESPONSE
};
/** A static method for getting a string representation for the Code
* enumeration.
*
* @param code a Code enumeration.
* @returns the enumeration name as a string.
*/
static std::string getCodeNames(Code code)
{
    switch(code) {
        case MTS_SUCCESS:
            return "SUCCESS";
        case MTS_ERROR:
            return "ERROR";
        case MTS_NO_RESPONSE:
            return "NO_RESPONSE";
        case MTS_FAILURE:
            return "FAILURE";
        default:
            return "UNKNOWN ENUM";
    }
}
static string sendCommand(MTSBufferedIO* io, const std::string& command, unsigned int timeoutMillis, char esc = CR)
{
    if(io == NULL) {
        logError("MTSBufferedIO not set");
        return "";
    }
    io->rxClear();
    io->txClear();
    std::string result;
    //Attempt to write command
    if(io->write(command.data(), command.size(), timeoutMillis) != command.size()) {
        //Failed to write command
        if (command != "AT" && command != "at") {
            logError("failed to send command to radio within %d milliseconds", timeoutMillis);
        }
        return "";
    }
    //Send Escape Character
    if (esc != 0x00) {
        if(io->write(esc, timeoutMillis) != 1) {
            if (command != "AT" && command != "at") {
                logError("failed to send character '%c' (0x%02X) to radio within %d milliseconds", esc, esc, timeoutMillis);
            }
            return "";
        }
    }
    int timer = 0;
    size_t previous = 0;
    char tmp[256];
    tmp[255] = 0;
    bool done = false;
    do {
        wait(0.1);
        timer += 100;
        previous = result.size();
        //Make a non-blocking read call by passing timeout of zero
        int size = io->read(tmp,255,0);    //1 less than allocated (timeout is instant)
        if(size > 0) {
            result.append(tmp, size);
        }
        done =  (result.size() == previous && previous > 0);
        if(timer >= timeoutMillis) {
            if (command != "AT" && command != "at") {
                logWarning("sendCommand [%s] timed out after %d milliseconds", command.c_str(), timeoutMillis);
            }
            done = true;
        }
    } while (!done);
    return result;
}
#endif