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.
Fork of MTS-Cellular by
Diff: Cellular/EasyIP.cpp
- Revision:
- 56:43205bd2752a
- Parent:
- 54:a6c738bfc391
- Child:
- 57:7eb2eb536d4a
--- a/Cellular/EasyIP.cpp Mon Aug 11 21:01:50 2014 +0000 +++ b/Cellular/EasyIP.cpp Wed Aug 13 16:46:10 2014 +0000 @@ -43,7 +43,7 @@ logDebug("radio type: %s", Cellular::getRadioNames(type).c_str()); //Turns on the HW flow control - if(sendBasicCommand("AT&K3", 2000) != MTS_SUCCESS) { + if(sendBasicCommand("AT+IFC=2,2", 2000) != MTS_SUCCESS) { logWarning("Failed to enable serial flow control"); } return true; @@ -74,7 +74,7 @@ tmr.start(); do { Registration registration = getRegistration(); - if(registration != REGISTERED) { + if(registration != REGISTERED && registration != ROAMING) { logTrace("Not Registered [%d] ... waiting", (int)registration); wait(1); } else { @@ -201,7 +201,7 @@ regist = false; } - string reply = sendCommand("AT#SGACT?", 500); + string reply = sendCommand("AT#SGACT?", 1000); if (reply.find("1,1") != std::string::npos) { active = true; } else { @@ -211,18 +211,14 @@ RadioState state; bool ppp = pppConnected; if (signal && regist && active) { - //Radio connected state = CONNECTED; pppConnected = true; } else if (signal && !regist && !active) { - //Radio idle state = IDLE; pppConnected = false; } else if (active) { - //Radio Connecting state = CONNECTING; } else { - //Radio Disconnected state = DISCONNECTED; pppConnected = false; } @@ -230,7 +226,25 @@ if (!ppp && state == CONNECTED) { logWarning("Internal PPP state tracking differs from radio (DISCONNECTED:CONNECTED)"); } else if (ppp && state != CONNECTED) { - logWarning("Internal PPP state tracking differs from radio (CONNECTED:%s)", state); + string stateStr; + switch (state) { + case IDLE: + stateStr = "IDLE"; + break; + case CONNECTING: + stateStr = "CONNECTING"; + break; + case DISCONNECTED: + stateStr = "DISCONNECTED"; + break; + case CONNECTED: + stateStr = "CONNECTED"; + break; + default: + stateStr = "UKNOWN"; + break; + } + logWarning("Internal PPP state tracking differs from radio (CONNECTED:%s)", stateStr.c_str()); } return pppConnected; @@ -248,21 +262,6 @@ } } -//Binds the socket to a specific port if able -bool EasyIP::bind(unsigned int port) -{ - if(socketOpened) { - logError("socket is open. Can not set local port"); - return false; - } - if(port > 65535) { - logError("port out of range (0-65535)"); - return false; - } - local_port = port; - return true; -} - bool EasyIP::open(const std::string& address, unsigned int port, Mode mode) { char sOpenSocketCmd[256] = {0}; //String for AT command @@ -310,7 +309,7 @@ } } - //4) Set escape sequence to not be transmitted + //4) Set escape sequence to not be transmitted through socket if(sendBasicCommand("AT#SKIPESC=1", 2000) != MTS_SUCCESS) { logWarning("Failed to disable escape sequence transmission on data mode suspension"); } @@ -347,15 +346,6 @@ return socketOpened; } -bool EasyIP::isOpen() -{ - if(io->readable()) { - logDebug("Assuming open, data available to read."); - return true; - } - return socketOpened; -} - bool EasyIP::close() { @@ -498,78 +488,22 @@ return bytesWritten; } -unsigned int EasyIP::readable() -{ - if(io == NULL) { - logWarning("MTSBufferedIO not set"); - return 0; - } - if(!socketOpened && !io->readable()) { - logWarning("Socket is not open"); - return 0; - } - return io->readable(); -} - -unsigned int EasyIP::writeable() -{ - if(io == NULL) { - logWarning("MTSBufferedIO not set"); - return 0; - } - if(!socketOpened) { - logWarning("Socket is not open"); - return 0; - } - - return io->writeable(); -} - -bool EasyIP::setDeviceIP(std::string address) -{ - if (address.compare("DHCP") == 0) { - return true; - } else { - logWarning("Radio does not support static IPs, using DHCP."); - return false; - } -} - Code EasyIP::setApn(const std::string& apn) { if (type == MTSMC_H5 || type == MTSMC_G3) { - //Set IP,PPP,IPv6 - Code code = sendBasicCommand("AT+CGDCONT=1,PPP," + apn, 1000); + //CGDCONT has options: IP,PPP,IPv6 + Code code = sendBasicCommand("AT+CGDCONT=1,IP," + apn, 1000); if (code != MTS_SUCCESS) { - return code; //This will return whatever is not MTS_SUCCESS + return code; } this->apn = apn; - return code; //This will return MTS_SUCCESS + return code; } else { logInfo("CDMA radios don't need an APN"); return MTS_SUCCESS; } } -std::string EasyIP::getDeviceIP() -{ - return local_address; -} - -//Turns off echo when it receives a true, turns on when it receives false -Code EasyIP::echo(bool state) -{ - Code code; - if (state) { - code = sendBasicCommand("ATE0", 1000); - echoMode = (code == MTS_SUCCESS) ? false : echoMode; - } else { - code = sendBasicCommand("ATE1", 1000); - echoMode = (code == MTS_SUCCESS) ? true : echoMode; - } - return code; -} - bool EasyIP::ping(const std::string& address) { char buffer[256] = {0}; @@ -604,24 +538,6 @@ return false; } -//Pass 1 to enable socket closeable -//Pass 0 to disable socket closeable -Code EasyIP::setSocketCloseable(bool enabled) -{ - if(socketCloseable == enabled) { - return MTS_SUCCESS; - } - - if(socketOpened) { - logError("socket is already opened. Can not set closeable"); - return MTS_ERROR; - } - - socketCloseable = enabled; - - return MTS_SUCCESS; -} - bool EasyIP::sendEscapeCommand() { //string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc) @@ -690,8 +606,8 @@ bool EasyIP::socketCheck() { bool status = false; - int socketInfo = 9; //error - enum SocketStatus {SOCKETCLOSED, SOCKETACTIVEDATA, SOCKETSUSPEND, SOCKETSUSPENDDATA, SOCKETLISTEN, SOCKETINCOMING, ERROR = 9}; + int socketInfo = ERROR; + enum SocketStatus {SOCKETCLOSED = 0, SOCKETACTIVEDATA = 1, SOCKETSUSPEND = 2, SOCKETSUSPENDDATA = 3, SOCKETLISTEN = 4, SOCKETINCOMING = 5, ERROR = 9}; std::vector<std::string> params; //Goes from data mode to command mode @@ -704,14 +620,14 @@ socketInfo = atoi(params[1].c_str()); } else { logError("Could not determine socket status[%d]",socketInfo); - socketInfo = 9; //9 is unrecognized + socketInfo = ERROR; } } else { status = false; //Return value of socketOpened when checking } //Check socket status query - if(socketInfo < 5 && socketInfo > 0) { //Socket opened responses + if(socketInfo == SOCKETINCOMING || socketInfo == SOCKETACTIVEDATA || socketInfo == SOCKETSUSPEND || socketInfo == SOCKETSUSPENDDATA || socketInfo == SOCKETLISTEN) { //Socket opened responses status = true; } else if(socketInfo == SOCKETCLOSED || socketInfo == SOCKETINCOMING) { status = false;