diff options
Diffstat (limited to 'libraries/GSM/GSM3ShieldV1ClientProvider.cpp')
-rw-r--r-- | libraries/GSM/GSM3ShieldV1ClientProvider.cpp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/libraries/GSM/GSM3ShieldV1ClientProvider.cpp b/libraries/GSM/GSM3ShieldV1ClientProvider.cpp new file mode 100644 index 0000000..92d3e85 --- /dev/null +++ b/libraries/GSM/GSM3ShieldV1ClientProvider.cpp @@ -0,0 +1,294 @@ +#include <GSM3ShieldV1ClientProvider.h> +#include <GSM3ShieldV1ModemCore.h> + +GSM3ShieldV1ClientProvider::GSM3ShieldV1ClientProvider() +{ + theGSM3MobileClientProvider=this; +}; + +//Response management. +void GSM3ShieldV1ClientProvider::manageResponse(byte from, byte to) +{ + switch(theGSM3ShieldV1ModemCore.getOngoingCommand()) + { + case NONE: + theGSM3ShieldV1ModemCore.gss.cb.deleteToTheEnd(from); + break; + case CONNECTTCPCLIENT: + connectTCPClientContinue(); + break; + case FLUSHSOCKET: + flushSocketContinue(); + break; + } +} + +//Connect TCP main function. +int GSM3ShieldV1ClientProvider::connectTCPClient(const char* server, int port, int id_socket) +{ + theGSM3ShieldV1ModemCore.setPort(port); + idSocket = id_socket; + + theGSM3ShieldV1ModemCore.setPhoneNumber((char*)server); + theGSM3ShieldV1ModemCore.openCommand(this,CONNECTTCPCLIENT); + theGSM3ShieldV1ModemCore.registerUMProvider(this); + connectTCPClientContinue(); + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +int GSM3ShieldV1ClientProvider::connectTCPClient(IPAddress add, int port, int id_socket) +{ + remoteIP=add; + theGSM3ShieldV1ModemCore.setPhoneNumber(0); + return connectTCPClient(0, port, id_socket); +} + +//Connect TCP continue function. +void GSM3ShieldV1ClientProvider::connectTCPClientContinue() +{ + bool resp; + // 0: Dot or DNS notation activation + // 1: Disable SW flow control + // 2: Waiting for IFC OK + // 3: Start-up TCP connection "AT+QIOPEN" + // 4: Wait for connection OK + // 5: Wait for CONNECT + + switch (theGSM3ShieldV1ModemCore.getCommandCounter()) { + case 1: + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIDNSIP="), false); + if ((theGSM3ShieldV1ModemCore.getPhoneNumber()!=0)&& + ((*(theGSM3ShieldV1ModemCore.getPhoneNumber())<'0')||((*(theGSM3ShieldV1ModemCore.getPhoneNumber())>'9')))) + { + theGSM3ShieldV1ModemCore.print('1'); + theGSM3ShieldV1ModemCore.print('\r'); + } + else + { + theGSM3ShieldV1ModemCore.print('0'); + theGSM3ShieldV1ModemCore.print('\r'); + } + theGSM3ShieldV1ModemCore.setCommandCounter(2); + break; + case 2: + if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp)) + { + //Response received + if(resp) + { + // AT+QIOPEN + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIOPEN="),false); + theGSM3ShieldV1ModemCore.print("\"TCP\",\""); + if(theGSM3ShieldV1ModemCore.getPhoneNumber()!=0) + { + theGSM3ShieldV1ModemCore.print(theGSM3ShieldV1ModemCore.getPhoneNumber()); + } + else + { + remoteIP.printTo(theGSM3ShieldV1ModemCore); + } + theGSM3ShieldV1ModemCore.print('"'); + theGSM3ShieldV1ModemCore.print(','); + 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 + theGSM3ShieldV1ModemCore.setCommandCounter(4); + } + else theGSM3ShieldV1ModemCore.closeCommand(3); + } + break; + case 4: + char auxLocate [12]; + prepareAuxLocate(PSTR("CONNECT\r\n"), auxLocate); + if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp,auxLocate)) + { + // Response received + if(resp) + { + // Received CONNECT OK + // Great. We're done + theGSM3ShieldV1ModemCore.setStatus(TRANSPARENT_CONNECTED); + theGSM3ShieldV1ModemCore.theBuffer().chopUntil(auxLocate, true); + theGSM3ShieldV1ModemCore.closeCommand(1); + } + else + theGSM3ShieldV1ModemCore.closeCommand(3); + } + break; + + } +} + +//Disconnect TCP main function. +int GSM3ShieldV1ClientProvider::disconnectTCP(bool client1Server0, int id_socket) +{ + // id Socket does not really mean anything, in this case we have + // only one socket running + theGSM3ShieldV1ModemCore.openCommand(this,DISCONNECTTCP); + + // If we are not closed, launch the command +//[ZZ] if(theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED) +// { + delay(1000); + theGSM3ShieldV1ModemCore.print("+++"); + delay(1000); + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QICLOSE")); + theGSM3ShieldV1ModemCore.setStatus(GPRS_READY); +// } + // Looks like it runs everytime, so we simply flush to death and go on + do + { + // Empty the local buffer, and tell the modem to XON + // If meanwhile we receive a DISCONNECT we should detect it as URC. + theGSM3ShieldV1ModemCore.theBuffer().flush(); + theGSM3ShieldV1ModemCore.gss.spaceAvailable(); + // Give some time for the buffer to refill + delay(100); + theGSM3ShieldV1ModemCore.closeCommand(1); + }while(theGSM3ShieldV1ModemCore.theBuffer().storedBytes()>0); + + theGSM3ShieldV1ModemCore.unRegisterUMProvider(this); + return theGSM3ShieldV1ModemCore.getCommandError(); +} + + +//Write socket first chain main function. +void GSM3ShieldV1ClientProvider::beginWriteSocket(bool client1Server0, int id_socket) +{ +} + + +//Write socket next chain function. +void GSM3ShieldV1ClientProvider::writeSocket(const char* buf) +{ + if(theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED) + theGSM3ShieldV1ModemCore.print(buf); +} + +//Write socket character function. +void GSM3ShieldV1ClientProvider::writeSocket(uint8_t c) +{ + if(theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED) + theGSM3ShieldV1ModemCore.print((char)c); +} + +//Write socket last chain main function. +void GSM3ShieldV1ClientProvider::endWriteSocket() +{ +} + + +//Available socket main function. +int GSM3ShieldV1ClientProvider::availableSocket(bool client1Server0, int id_socket) +{ + + if(!(theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED)) + theGSM3ShieldV1ModemCore.closeCommand(4); + + if(theGSM3ShieldV1ModemCore.theBuffer().storedBytes()) + theGSM3ShieldV1ModemCore.closeCommand(1); + else + theGSM3ShieldV1ModemCore.closeCommand(4); + + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +int GSM3ShieldV1ClientProvider::readSocket() +{ + char charSocket; + + if(theGSM3ShieldV1ModemCore.theBuffer().availableBytes()==0) + { + return 0; + } + + charSocket = theGSM3ShieldV1ModemCore.theBuffer().read(); + + if(theGSM3ShieldV1ModemCore.theBuffer().availableBytes()==100) + theGSM3ShieldV1ModemCore.gss.spaceAvailable(); + + return charSocket; + +} + +//Read socket main function. +int GSM3ShieldV1ClientProvider::peekSocket() +{ + return theGSM3ShieldV1ModemCore.theBuffer().peek(0); +} + + +//Flush SMS main function. +void GSM3ShieldV1ClientProvider::flushSocket() +{ + theGSM3ShieldV1ModemCore.openCommand(this,FLUSHSOCKET); + + flushSocketContinue(); +} + +//Send SMS continue function. +void GSM3ShieldV1ClientProvider::flushSocketContinue() +{ + // If we have incomed data + if(theGSM3ShieldV1ModemCore.theBuffer().storedBytes()>0) + { + // Empty the local buffer, and tell the modem to XON + // If meanwhile we receive a DISCONNECT we should detect it as URC. + theGSM3ShieldV1ModemCore.theBuffer().flush(); + theGSM3ShieldV1ModemCore.gss.spaceAvailable(); + } + else + { + //We're done + theGSM3ShieldV1ModemCore.closeCommand(1); + } +} + +// URC recognize. +// Yes, we recognize "closes" in client mode +bool GSM3ShieldV1ClientProvider::recognizeUnsolicitedEvent(byte oldTail) +{ + char auxLocate [12]; + prepareAuxLocate(PSTR("CLOSED"), auxLocate); + + if((theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED) & theGSM3ShieldV1ModemCore.theBuffer().chopUntil(auxLocate, false, false)) + { + theGSM3ShieldV1ModemCore.setStatus(GPRS_READY); + theGSM3ShieldV1ModemCore.unRegisterUMProvider(this); + return true; + } + + return false; +} + +int GSM3ShieldV1ClientProvider::getSocket(int socket) +{ + return 0; +} + +void GSM3ShieldV1ClientProvider::releaseSocket(int socket) +{ + +} + +bool GSM3ShieldV1ClientProvider::getStatusSocketClient(uint8_t socket) +{ + return (theGSM3ShieldV1ModemCore.getStatus()==TRANSPARENT_CONNECTED); + +}; + + + |