diff options
author | Cristian Maglie <c.maglie@bug.st> | 2013-04-03 13:51:04 +0200 |
---|---|---|
committer | Cristian Maglie <c.maglie@bug.st> | 2013-04-03 13:51:04 +0200 |
commit | ee90e68e86dd61d86f5d17b69080338328765b22 (patch) | |
tree | e620c0edc2690ab789b665e567910640597aa6fe /libraries/GSM/GSM3ShieldV1CellManagement.cpp | |
parent | 0ecdc5ebc96ad4c7c548c438a03d9ce00679db8b (diff) | |
parent | f50c307be280dc6ece9e70c43b301c1db36291a0 (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/GSM3ShieldV1CellManagement.cpp')
-rw-r--r-- | libraries/GSM/GSM3ShieldV1CellManagement.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/libraries/GSM/GSM3ShieldV1CellManagement.cpp b/libraries/GSM/GSM3ShieldV1CellManagement.cpp new file mode 100644 index 0000000..2af91ab --- /dev/null +++ b/libraries/GSM/GSM3ShieldV1CellManagement.cpp @@ -0,0 +1,168 @@ +#include <GSM3ShieldV1CellManagement.h> + +GSM3ShieldV1CellManagement::GSM3ShieldV1CellManagement() +{ +} + +bool GSM3ShieldV1CellManagement::parseQCCID_available(bool& rsp) +{ + char c; + bool iccidFound = false; + int i = 0; + + while(((c = theGSM3ShieldV1ModemCore.theBuffer().read()) != 0) & (i < 19)) + { + if((c < 58) & (c > 47)) + iccidFound = true; + + if(iccidFound) + { + bufferICCID[i] = c; + i++; + } + } + bufferICCID[i]=0; + + return true; +} + +bool GSM3ShieldV1CellManagement::parseQENG_available(bool& rsp) +{ + char c; + char location[50] = ""; + int i = 0; + + if (!(theGSM3ShieldV1ModemCore.theBuffer().chopUntil("+QENG: ", true))) + rsp = false; + else + rsp = true; + + if (!(theGSM3ShieldV1ModemCore.theBuffer().chopUntil("+QENG:", true))) + rsp = false; + else + rsp = true; + + while(((c = theGSM3ShieldV1ModemCore.theBuffer().read()) != 0) & (i < 50)) + { + location[i] = c; + i++; + } + location[i]=0; + + char* res_tok = strtok(location, ","); + res_tok=strtok(NULL, ","); + strcpy(countryCode, res_tok); + res_tok=strtok(NULL, ","); + strcpy(networkCode, res_tok); + res_tok=strtok(NULL, ","); + strcpy(locationArea, res_tok); + res_tok=strtok(NULL, ","); + strcpy(cellId, res_tok); + + return true; +} + +int GSM3ShieldV1CellManagement::getLocation(char *country, char *network, char *area, char *cell) +{ + if((theGSM3ShieldV1ModemCore.getStatus() != GSM_READY) && (theGSM3ShieldV1ModemCore.getStatus() != GPRS_READY)) + return 2; + + countryCode=country; + networkCode=network; + locationArea=area; + cellId=cell; + + theGSM3ShieldV1ModemCore.openCommand(this,GETLOCATION); + getLocationContinue(); + + unsigned long timeOut = millis(); + while(((millis() - timeOut) < 5000) & (ready() == 0)); + + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +void GSM3ShieldV1CellManagement::getLocationContinue() +{ + bool resp; + + switch (theGSM3ShieldV1ModemCore.getCommandCounter()) { + case 1: + theGSM3ShieldV1ModemCore.gss.tunedDelay(3000); + delay(3000); + theGSM3ShieldV1ModemCore.setCommandCounter(2); + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QENG=1"), false); + theGSM3ShieldV1ModemCore.print("\r"); + break; + case 2: + if (theGSM3ShieldV1ModemCore.genericParse_rsp(resp)) + { + theGSM3ShieldV1ModemCore.gss.tunedDelay(3000); + delay(3000); + theGSM3ShieldV1ModemCore.setCommandCounter(3); + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QENG?"), false); + theGSM3ShieldV1ModemCore.print("\r"); + } + else theGSM3ShieldV1ModemCore.closeCommand(1); + break; + case 3: + if (resp) + { + parseQENG_available(resp); + theGSM3ShieldV1ModemCore.closeCommand(3); + } + else theGSM3ShieldV1ModemCore.closeCommand(2); + break; + } +} + +int GSM3ShieldV1CellManagement::getICCID(char *iccid) +{ + if((theGSM3ShieldV1ModemCore.getStatus() != GSM_READY) && (theGSM3ShieldV1ModemCore.getStatus() != GPRS_READY)) + return 2; + + bufferICCID=iccid; + theGSM3ShieldV1ModemCore.openCommand(this,GETICCID); + getICCIDContinue(); + + unsigned long timeOut = millis(); + while(((millis() - timeOut) < 5000) & (ready() == 0)); + + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +void GSM3ShieldV1CellManagement::getICCIDContinue() +{ + bool resp; + + switch (theGSM3ShieldV1ModemCore.getCommandCounter()) { + case 1: + theGSM3ShieldV1ModemCore.setCommandCounter(2); + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QCCID"), false); + theGSM3ShieldV1ModemCore.print("\r"); + break; + case 2: + if (theGSM3ShieldV1ModemCore.genericParse_rsp(resp)) + { + parseQCCID_available(resp); + theGSM3ShieldV1ModemCore.closeCommand(2); + } + else theGSM3ShieldV1ModemCore.closeCommand(1); + break; + } +} + +void GSM3ShieldV1CellManagement::manageResponse(byte from, byte to) +{ + switch(theGSM3ShieldV1ModemCore.getOngoingCommand()) + { + case NONE: + theGSM3ShieldV1ModemCore.gss.cb.deleteToTheEnd(from); + break; + case GETLOCATION: + getLocationContinue(); + break; + case GETICCID: + getICCIDContinue(); + break; + } +}
\ No newline at end of file |