aboutsummaryrefslogtreecommitdiff
path: root/libraries/GSM/GSM3ShieldV1ServerProvider.cpp
diff options
context:
space:
mode:
authorCristian Maglie <c.maglie@bug.st>2013-04-03 13:51:04 +0200
committerCristian Maglie <c.maglie@bug.st>2013-04-03 13:51:04 +0200
commitee90e68e86dd61d86f5d17b69080338328765b22 (patch)
treee620c0edc2690ab789b665e567910640597aa6fe /libraries/GSM/GSM3ShieldV1ServerProvider.cpp
parent0ecdc5ebc96ad4c7c548c438a03d9ce00679db8b (diff)
parentf50c307be280dc6ece9e70c43b301c1db36291a0 (diff)
Merged 1.0.5
Merge remote-tracking branch 'arduino/master' into ide-1.5.x Conflicts: app/src/processing/app/Base.java build/shared/revisions.txt hardware/arduino/avr/cores/arduino/malloc.c hardware/arduino/cores/arduino/avr-libc/malloc.c hardware/arduino/cores/arduino/malloc.c todo.txt
Diffstat (limited to 'libraries/GSM/GSM3ShieldV1ServerProvider.cpp')
-rw-r--r--libraries/GSM/GSM3ShieldV1ServerProvider.cpp205
1 files changed, 205 insertions, 0 deletions
diff --git a/libraries/GSM/GSM3ShieldV1ServerProvider.cpp b/libraries/GSM/GSM3ShieldV1ServerProvider.cpp
new file mode 100644
index 0000000..77f5436
--- /dev/null
+++ b/libraries/GSM/GSM3ShieldV1ServerProvider.cpp
@@ -0,0 +1,205 @@
+#include <GSM3ShieldV1ServerProvider.h>
+#include <GSM3ShieldV1ModemCore.h>
+#include <Arduino.h>
+
+GSM3ShieldV1ServerProvider::GSM3ShieldV1ServerProvider()
+{
+ theGSM3MobileServerProvider=this;
+};
+
+//Response management.
+void GSM3ShieldV1ServerProvider::manageResponse(byte from, byte to)
+{
+ switch(theGSM3ShieldV1ModemCore.getOngoingCommand())
+ {
+ case NONE:
+ theGSM3ShieldV1ModemCore.gss.cb.deleteToTheEnd(from);
+ break;
+ case CONNECTSERVER:
+ connectTCPServerContinue();
+ break;
+ /*case GETIP:
+ getIPContinue();
+ break;*/
+ }
+}
+
+//Connect Server main function.
+int GSM3ShieldV1ServerProvider::connectTCPServer(int port)
+{
+ // We forget about LocalIP as it has no real use, the modem does whatever it likes
+ theGSM3ShieldV1ModemCore.setPort(port);
+ theGSM3ShieldV1ModemCore.openCommand(this,CONNECTSERVER);
+ // From this moment on we wait for a call
+ connectTCPServerContinue();
+ return theGSM3ShieldV1ModemCore.getCommandError();
+}
+
+//Connect Server continue function.
+void GSM3ShieldV1ServerProvider::connectTCPServerContinue()
+{
+
+ bool resp;
+ // 1: Read Local IP "AT+QILOCIP"
+ // 2: Waiting for IP and Set local port "AT+QILPORT"
+ // 3: Waiting for QILPOR OK andConfigure as server "AT+QISERVER"
+ // 4: Wait for SERVER OK
+
+ switch (theGSM3ShieldV1ModemCore.getCommandCounter()) {
+ case 1:
+ //"AT+QILOCIP."
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QILOCIP"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ break;
+ case 2:
+ //Not IP storing but the command is necessary.
+ //if(parseQILOCIP_rsp(local_IP, local_IP_Length, resp))
+ // This awful trick saves some RAM bytes
+ char aux[3];
+ aux[0]='\r';aux[1]='\n';aux[2]=0;
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp, aux))
+ {
+ //Response received
+ if(resp)
+ {
+ // Great. Go for the next step
+ // AT+QILPORT
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QILPORT=\"TCP\","),false);
+ theGSM3ShieldV1ModemCore.print( theGSM3ShieldV1ModemCore.getPort());
+ theGSM3ShieldV1ModemCore.print('\r');
+ theGSM3ShieldV1ModemCore.setCommandCounter(3);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ break;
+ case 3:
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ // Response received
+ if(resp)
+ {
+ // OK received
+ // Great. Go for the next step
+ // AT+QISERVER
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QISERVER"),true);
+ theGSM3ShieldV1ModemCore.setCommandCounter(4);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ break;
+ case 4:
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ // Response received
+ // OK received, kathapoon, chessespoon
+ if (resp)
+ {
+ theGSM3ShieldV1ModemCore.registerUMProvider(this);
+ theGSM3ShieldV1ModemCore.closeCommand(1);
+ }
+ else
+ theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ break;
+ }
+}
+
+//QILOCIP parse.
+/*bool GSM3ShieldV1ServerProvider::parseQILOCIP_rsp(char* LocalIP, int LocalIPlength, bool& rsp)
+{
+ if (!(theGSM3ShieldV1ModemCore.theBuffer().extractSubstring("\r\n","\r\n", LocalIP, LocalIPlength)))
+ rsp = false;
+ else
+ rsp = true;
+ return true;
+}
+
+//Get IP main function.
+int GSM3ShieldV1ServerProvider::getIP(char* LocalIP, int LocalIPlength)
+{
+ theGSM3ShieldV1ModemCore.setPhoneNumber(LocalIP);
+ theGSM3ShieldV1ModemCore.setPort(LocalIPlength);
+ theGSM3ShieldV1ModemCore.openCommand(this,GETIP);
+ getIPContinue();
+ return theGSM3ShieldV1ModemCore.getCommandError();
+}
+
+void GSM3ShieldV1ServerProvider::getIPContinue()
+{
+
+ bool resp;
+ // 1: Read Local IP "AT+QILOCIP"
+ // 2: Waiting for IP.
+
+ switch (theGSM3ShieldV1ModemCore.getCommandCounter()) {
+ case 1:
+ //AT+QILOCIP
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_MonoQILOCIP);
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ break;
+ case 2:
+ if(parseQILOCIP_rsp(theGSM3ShieldV1ModemCore.getPhoneNumber(), theGSM3ShieldV1ModemCore.getPort(), resp))
+ {
+ if (resp)
+ theGSM3ShieldV1ModemCore.closeCommand(1);
+ else
+ theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ theGSM3ShieldV1ModemCore.theBuffer().flush();
+ theGSM3ShieldV1ModemCore.gss.spaceAvailable();
+ break;
+ }
+}*/
+
+bool GSM3ShieldV1ServerProvider::getSocketAsServerModemStatus(int s)
+{
+ if(theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED)
+ return true;
+ else
+ return false;
+}
+
+
+//URC recognize.
+bool GSM3ShieldV1ServerProvider::recognizeUnsolicitedEvent(byte oldTail)
+{
+
+ int nlength;
+ char auxLocate [15];
+
+ //REMOTE SOCKET CLOSED.
+ prepareAuxLocate(PSTR("CLOSED\r\n"), auxLocate);
+ if(theGSM3ShieldV1ModemCore.gss.cb.locate(auxLocate))
+ {
+ //To detect remote socket closed for example inside socket data.
+ theGSM3ShieldV1ModemCore.setStatus(GPRS_READY);
+ }
+
+
+ //REMOTE SOCKET ACCEPTED.
+ prepareAuxLocate(PSTR("CONNECT\r\n"), auxLocate);
+ if(theGSM3ShieldV1ModemCore.gss.cb.locate(auxLocate))
+ {
+ //To detect remote socket closed for example inside socket data.
+ theGSM3ShieldV1ModemCore.theBuffer().chopUntil(auxLocate, true);
+ theGSM3ShieldV1ModemCore.gss.spaceAvailable();
+ theGSM3ShieldV1ModemCore.setStatus(TRANSPARENT_CONNECTED);
+ return true;
+ }
+
+ return false;
+}
+
+bool GSM3ShieldV1ServerProvider::getStatusSocketAsServer(uint8_t socket)
+{
+ return(theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED);
+};
+
+void GSM3ShieldV1ServerProvider::releaseSocket(int socket)
+{
+}
+
+int GSM3ShieldV1ServerProvider::getNewOccupiedSocketAsServer()
+{
+ return 0;
+} \ No newline at end of file