aboutsummaryrefslogtreecommitdiff
path: root/libraries/GSM/GSM3ShieldV1AccessProvider.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/GSM3ShieldV1AccessProvider.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/GSM3ShieldV1AccessProvider.cpp')
-rw-r--r--libraries/GSM/GSM3ShieldV1AccessProvider.cpp296
1 files changed, 296 insertions, 0 deletions
diff --git a/libraries/GSM/GSM3ShieldV1AccessProvider.cpp b/libraries/GSM/GSM3ShieldV1AccessProvider.cpp
new file mode 100644
index 0000000..67ae755
--- /dev/null
+++ b/libraries/GSM/GSM3ShieldV1AccessProvider.cpp
@@ -0,0 +1,296 @@
+#include <GSM3ShieldV1AccessProvider.h>
+#include <Arduino.h>
+
+#define __RESETPIN__ 7
+#define __TOUTSHUTDOWN__ 5000
+#define __TOUTMODEMCONFIGURATION__ 5000//equivalent to 30000 because of time in interrupt routine.
+#define __TOUTAT__ 1000
+
+char _command_AT[] PROGMEM = "AT";
+char _command_CGREG[] PROGMEM = "AT+CGREG?";
+
+
+GSM3ShieldV1AccessProvider::GSM3ShieldV1AccessProvider(bool debug)
+{
+ theGSM3ShieldV1ModemCore.setDebug(debug);
+
+}
+
+void GSM3ShieldV1AccessProvider::manageResponse(byte from, byte to)
+{
+ switch(theGSM3ShieldV1ModemCore.getOngoingCommand())
+ {
+ case MODEMCONFIG:
+ ModemConfigurationContinue();
+ break;
+ case ALIVETEST:
+ isModemAliveContinue();
+ break;
+ }
+}
+
+///////////////////////////////////////////////////////CONFIGURATION FUNCTIONS///////////////////////////////////////////////////////////////////
+
+// Begin
+// Restart or start the modem
+// May be synchronous
+GSM3_NetworkStatus_t GSM3ShieldV1AccessProvider::begin(char* pin, bool restart, bool synchronous)
+{
+ pinMode(__RESETPIN__, OUTPUT);
+
+ // If asked for modem restart, restart
+ if (restart)
+ HWrestart();
+ else
+ HWstart();
+
+ theGSM3ShieldV1ModemCore.gss.begin(9600);
+ // Launch modem configuration commands
+ ModemConfiguration(pin);
+ // If synchronous, wait till ModemConfiguration is over
+ if(synchronous)
+ {
+ // if we shorten this delay, the command fails
+ while(ready()==0)
+ delay(1000);
+ }
+ return getStatus();
+}
+
+//HWrestart.
+int GSM3ShieldV1AccessProvider::HWrestart()
+{
+
+ theGSM3ShieldV1ModemCore.setStatus(IDLE);
+ digitalWrite(__RESETPIN__, HIGH);
+ delay(12000);
+ digitalWrite(__RESETPIN__, LOW);
+ delay(1000);
+ return 1; //configandwait(pin);
+}
+
+//HWrestart.
+int GSM3ShieldV1AccessProvider::HWstart()
+{
+
+ theGSM3ShieldV1ModemCore.setStatus(IDLE);
+ digitalWrite(__RESETPIN__, HIGH);
+ delay(2000);
+ digitalWrite(__RESETPIN__, LOW);
+ //delay(1000);
+
+ return 1; //configandwait(pin);
+}
+
+//Initial configuration main function.
+int GSM3ShieldV1AccessProvider::ModemConfiguration(char* pin)
+{
+ theGSM3ShieldV1ModemCore.setPhoneNumber(pin);
+ theGSM3ShieldV1ModemCore.openCommand(this,MODEMCONFIG);
+ theGSM3ShieldV1ModemCore.setStatus(CONNECTING);
+ ModemConfigurationContinue();
+ return theGSM3ShieldV1ModemCore.getCommandError();
+}
+
+//Initial configuration continue function.
+void GSM3ShieldV1AccessProvider::ModemConfigurationContinue()
+{
+ bool resp;
+
+ // 1: Send AT
+ // 2: Wait AT OK and SetPin or CGREG
+ // 3: Wait Pin OK and CGREG
+ // 4: Wait CGREG and Flow SW control or CGREG
+ // 5: Wait IFC OK and SMS Text Mode
+ // 6: Wait SMS text Mode OK and Calling line identification
+ // 7: Wait Calling Line Id OK and Echo off
+ // 8: Wait for OK and COLP command for connecting line identification.
+ // 9: Wait for OK.
+ int ct=theGSM3ShieldV1ModemCore.getCommandCounter();
+ if(ct==1)
+ {
+ // Launch AT
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_AT);
+ }
+ else if(ct==2)
+ {
+ // Wait for AT - OK.
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ // OK received
+ if(theGSM3ShieldV1ModemCore.getPhoneNumber() && (theGSM3ShieldV1ModemCore.getPhoneNumber()[0]!=0))
+ {
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+CPIN="), false);
+ theGSM3ShieldV1ModemCore.setCommandCounter(3);
+ theGSM3ShieldV1ModemCore.genericCommand_rqc(theGSM3ShieldV1ModemCore.getPhoneNumber());
+ }
+ else
+ {
+ //DEBUG
+ //Serial.println("AT+CGREG?");
+ theGSM3ShieldV1ModemCore.setCommandCounter(4);
+ theGSM3ShieldV1ModemCore.takeMilliseconds();
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_CGREG);
+ }
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==3)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ theGSM3ShieldV1ModemCore.setCommandCounter(4);
+ theGSM3ShieldV1ModemCore.takeMilliseconds();
+ theGSM3ShieldV1ModemCore.delayInsideInterrupt(2000);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_CGREG);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==4)
+ {
+ char auxLocate1 [12];
+ char auxLocate2 [12];
+ prepareAuxLocate(PSTR("+CGREG: 0,1"), auxLocate1);
+ prepareAuxLocate(PSTR("+CGREG: 0,5"), auxLocate2);
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp, auxLocate1, auxLocate2))
+ {
+ if(resp)
+ {
+ theGSM3ShieldV1ModemCore.setCommandCounter(5);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+IFC=1,1"));
+ }
+ else
+ {
+ // If not, launch command again
+ if(theGSM3ShieldV1ModemCore.takeMilliseconds() > __TOUTMODEMCONFIGURATION__)
+ {
+ theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ else
+ {
+ theGSM3ShieldV1ModemCore.delayInsideInterrupt(2000);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_CGREG);
+ }
+ }
+ }
+ }
+ else if(ct==5)
+ {
+ // 5: Wait IFC OK
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ //Delay for SW flow control being active.
+ theGSM3ShieldV1ModemCore.delayInsideInterrupt(2000);
+ // 9: SMS Text Mode
+ theGSM3ShieldV1ModemCore.setCommandCounter(6);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+CMGF=1"));
+ }
+ }
+ else if(ct==6)
+ {
+ // 6: Wait SMS text Mode OK
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ //Calling line identification
+ theGSM3ShieldV1ModemCore.setCommandCounter(7);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+CLIP=1"));
+ }
+ }
+ else if(ct==7)
+ {
+ // 7: Wait Calling Line Id OK
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ // Echo off
+ theGSM3ShieldV1ModemCore.setCommandCounter(8);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("ATE0"));
+ }
+ }
+ else if(ct==8)
+ {
+ // 8: Wait ATEO OK, send COLP
+ // In Arduino Mega, attention, take away the COLP step
+ // It looks as we can only have 8 steps
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ theGSM3ShieldV1ModemCore.setCommandCounter(9);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+COLP=1"));
+ }
+ }
+ else if(ct==9)
+ {
+ // 9: Wait ATCOLP OK
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if (resp)
+ {
+ theGSM3ShieldV1ModemCore.setStatus(GSM_READY);
+ theGSM3ShieldV1ModemCore.closeCommand(1);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+}
+
+//Alive Test main function.
+int GSM3ShieldV1AccessProvider::isAccessAlive()
+{
+ theGSM3ShieldV1ModemCore.setCommandError(0);
+ theGSM3ShieldV1ModemCore.setCommandCounter(1);
+ theGSM3ShieldV1ModemCore.openCommand(this,ALIVETEST);
+ isModemAliveContinue();
+ return theGSM3ShieldV1ModemCore.getCommandError();
+}
+
+//Alive Test continue function.
+void GSM3ShieldV1AccessProvider::isModemAliveContinue()
+{
+bool rsp;
+switch (theGSM3ShieldV1ModemCore.getCommandCounter()) {
+ case 1:
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_AT);
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ break;
+ case 2:
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(rsp))
+ {
+ if (rsp) theGSM3ShieldV1ModemCore.closeCommand(1);
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ break;
+ }
+}
+
+//Shutdown.
+bool GSM3ShieldV1AccessProvider::shutdown()
+{
+ unsigned long m;
+ bool resp;
+ char auxLocate [18];
+
+ // It makes no sense to have an asynchronous shutdown
+ pinMode(__RESETPIN__, OUTPUT);
+ digitalWrite(__RESETPIN__, HIGH);
+ delay(1500);
+ digitalWrite(__RESETPIN__, LOW);
+ theGSM3ShieldV1ModemCore.setStatus(IDLE);
+ theGSM3ShieldV1ModemCore.gss.close();
+
+ m=millis();
+ prepareAuxLocate(PSTR("POWER DOWN"), auxLocate);
+ while((millis()-m) < __TOUTSHUTDOWN__)
+ {
+ delay(1);
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp, auxLocate))
+ return resp;
+ }
+ return false;
+}
+