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
Diff: Cellular/EasyIP.cpp
- Revision:
- 33:3b6f3904dde0
- Parent:
- 32:7d5581159bed
- Child:
- 35:257eb41405e1
diff -r 7d5581159bed -r 3b6f3904dde0 Cellular/EasyIP.cpp
--- a/Cellular/EasyIP.cpp Tue Jul 15 20:37:08 2014 +0000
+++ b/Cellular/EasyIP.cpp Wed Jul 16 14:26:10 2014 +0000
@@ -6,121 +6,10 @@
using namespace mts;
-bool EasyIP::sendEscapeCommand()
-{
- //string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc)
- if(io == NULL) {
- logError("MTSBufferedIO not set");
- return false;
- }
- if(!socketOpened) {
- logError("Socket is not open. Can not send AT escape sequence (+++)");
- return false;
- }
-
- if(!socketCloseable) {
- logError("Socket is not closeable");
- return false;
- }
-
- io->rxClear();
- io->txClear();
-
- std::string result;
- unsigned int timeoutMillis = 2000;
- const int size_cmd = 3;
- //Attempt to write command
- wait(1); //Format for +++ command is 1 second wait, send +++, then another second wait
- //1s wait after command is implemented as a polling function for 2 seconds
- //Option: Could change wait periods to be longer/shorter (0-255)*50ms
- if(io->write("+++", size_cmd, timeoutMillis) != size_cmd) {
- //Failed to write command
- logError("failed to send command to radio within %d milliseconds", timeoutMillis);
- return false;
- }
-
- int timer = 0;
- char tmp[256];
- tmp[255] = 0;
- bool done = false;
- io->read(tmp,255,0);
- bool exitmode = false;
-
- do {
- wait(0.1);
- timer += 100;
- //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);
- }
- if(result.find("OK") != std::string::npos) {
- exitmode = true;
- done = true;
- } else if(result.find("NO CARRIER") != std::string::npos) {
- exitmode = true;
- done = true;
- } else if(result.find("ERROR") != std::string::npos) {
- exitmode = false;
- done = true;
- }
- if(timer >= timeoutMillis) {
- logDebug("Escape sequence [+++] timed out after %d milliseconds", timeoutMillis);
- exitmode = true;
- done = true;
- }
- } while (!done);
-
- return exitmode;
-}
-bool EasyIP::socketCheck() {
- bool status = false;
- std::string socketInfo = "9"; //9 is unrecognized
- std::vector<std::string> params;
-
- if(sendEscapeCommand()) {
- socketOpened = false;
- if(sendBasicCommand("AT", 1000) == MTS_SUCCESS) {
- socketInfo = sendCommand("AT#SS=1", 2000);
- if(socketInfo.find("OK") != std::string::npos) {
- //Found valid response
- params = Text::split(socketInfo, "\r\n");
- params = Text::split(params[1], ",");
- socketInfo = params[1];
- //Check comparison of params[1] to response codes
- } else {
- logError("Could not determine socket status[%s]",socketInfo.c_str());
- socketInfo == "9"; //9 is unrecognized
- }
- }
- } else {
- status = false; //Return value of socketOpened when checking
- }
- //Check socket status query
- if(socketInfo == "2" || socketInfo == "3" || socketInfo == "1" || socketInfo == "4") {
- status = true; //2 and 3 are suspended connections
- } else if(socketInfo == "0" || socketInfo == "5") {
- status = false; //0 is closed socket, probably won't occur
- } else {
- logError("Could not determine socket status");
- status = false; //anything else is unknown status
- }
-
- if(status) {
- std::string reconnect = sendCommand("AT#SO=1", 2000);
- if(reconnect.find("CONNECT") != std::string::npos || reconnect.find("OK") != std::string::npos) {
- } else {
- logError("Failed to resume socket connection");
- }
- }
- return status;
-}
EasyIP::EasyIP(Radio type)
{
- //Not sure how the construction process is done,
- //but assuming it works for both EasyIP and UIP the same way.
this->type = type;
io = NULL;
dcd = NULL;
@@ -138,8 +27,6 @@
EasyIP::~EasyIP()
{
- //Same reasoning for the destructor as the constructor,
- //assuming it works for UIP, it will work for EasyIP
if (dtr != NULL) {
dtr->write(1);
}
@@ -166,7 +53,7 @@
bool EasyIP::connect()
{
- //Check if APN is not set, if so, connect will not work.
+ //Check if APN is not set, if it is not, connect will not work.
if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) {
if(apn.size() == 0) {
logDebug("APN is not set");
@@ -327,7 +214,7 @@
}
}
- //Check active mode (SGACT = 1,1)
+ //Check active context (SGACT = 1,1)
reply = sendCommand("AT#SGACT?", 500);
if(reply.empty() || (reply.find("ERROR") != std::string::npos)) {
active = false;
@@ -388,6 +275,18 @@
return pppConnected;
}
+//Resets the radio
+void EasyIP::reset()
+{
+ disconnect();
+ if(sendBasicCommand("AT#REBOOT", 10000) != MTS_SUCCESS) {
+ logError("Socket Modem did not accept RESET command\n\r");
+ } else {
+ logWarning("Socket Modem is resetting, allow 30 seconds for it to come back\n\r");
+ return;
+ }
+}
+
//Binds the socket to a specific port if able
bool EasyIP::bind(unsigned int port)
{
@@ -678,7 +577,7 @@
//Set IP,PPP,IPv6
Code code = sendBasicCommand("AT+CGDCONT=1,PPP," + apn, 1000);
if (code != MTS_SUCCESS) {
- return code;
+ return code; //This will return whatever is not MTS_SUCCESS
}
this->apn = apn;
return code; //This will return MTS_SUCCESS
@@ -688,17 +587,6 @@
}
}
-void EasyIP::reset()
-{
- disconnect();
- if(sendBasicCommand("AT#REBOOT", 10000) != MTS_SUCCESS) {
- logError("Socket Modem did not accept RESET command\n\r");
- } else {
- logWarning("Socket Modem is resetting, allow 30 seconds for it to come back\n\r");
- return;
- }
-}
-
std::string EasyIP::getDeviceIP()
{
return local_address;
@@ -776,3 +664,117 @@
return MTS_SUCCESS;
}
+
+bool EasyIP::sendEscapeCommand()
+{
+ //string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc)
+ if(io == NULL) {
+ logError("MTSBufferedIO not set");
+ return false;
+ }
+ if(!socketOpened) {
+ logError("Socket is not open. Can not send AT escape sequence (+++)");
+ return false;
+ }
+
+ if(!socketCloseable) {
+ logError("Socket is not closeable");
+ return false;
+ }
+
+ io->rxClear();
+ io->txClear();
+
+ std::string result;
+ unsigned int timeoutMillis = 2000;
+ const int size_cmd = 3;
+ //Attempt to write command
+ wait(1); //Format for +++ command is 1 second wait, send +++, then another second wait
+ //1s wait after command is implemented as a polling function for 2 seconds
+ //Option: Could change wait periods to be longer/shorter (0-255)*50ms
+ if(io->write("+++", size_cmd, timeoutMillis) != size_cmd) {
+ //Failed to write command
+ logError("failed to send command to radio within %d milliseconds", timeoutMillis);
+ return false;
+ }
+
+ int timer = 0;
+ char tmp[256];
+ tmp[255] = 0;
+ bool done = false;
+ io->read(tmp,255,0);
+ bool exitmode = false;
+
+ do {
+ wait(0.1);
+ timer += 100;
+ //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);
+ }
+ if(result.find("OK") != std::string::npos) {
+ exitmode = true;
+ done = true;
+ } else if(result.find("NO CARRIER") != std::string::npos) {
+ exitmode = true;
+ done = true;
+ } else if(result.find("ERROR") != std::string::npos) {
+ exitmode = false;
+ done = true;
+ }
+ if(timer >= timeoutMillis) {
+ logDebug("Escape sequence [+++] timed out after %d milliseconds", timeoutMillis);
+ exitmode = true;
+ done = true;
+ }
+ } while (!done);
+
+ return exitmode;
+}
+
+bool EasyIP::socketCheck() {
+ bool status = false;
+ std::string socketInfo = "9"; //9 is unrecognized
+ std::vector<std::string> params;
+
+ //Goes from data mode to command mode
+ if(sendEscapeCommand()) {
+ socketOpened = false;
+ if(sendBasicCommand("AT", 1000) == MTS_SUCCESS) {
+ socketInfo = sendCommand("AT#SS=1", 2000);
+ if(socketInfo.find("OK") != std::string::npos) {
+ //Found valid response
+ params = Text::split(socketInfo, "\r\n");
+ params = Text::split(params[1], ",");
+ socketInfo = params[1];
+ //Check comparison of params[1] to response codes
+ } else {
+ logError("Could not determine socket status[%s]",socketInfo.c_str());
+ socketInfo == "9"; //9 is unrecognized
+ }
+ }
+ } else {
+ status = false; //Return value of socketOpened when checking
+ }
+
+ //Check socket status query
+ if(socketInfo == "2" || socketInfo == "3" || socketInfo == "1" || socketInfo == "4") {
+ status = true; //2 and 3 are suspended connections
+ } else if(socketInfo == "0" || socketInfo == "5") {
+ status = false; //0 is closed socket, probably won't occur
+ } else {
+ logError("Could not determine socket status");
+ status = false; //anything else is unknown status
+ }
+
+ //Reconnects to active socket if able
+ if(status) {
+ std::string reconnect = sendCommand("AT#SO=1", 2000);
+ if(reconnect.find("CONNECT") != std::string::npos || reconnect.find("OK") != std::string::npos) {
+ } else {
+ logError("Failed to resume socket connection");
+ }
+ }
+ return status;
+}