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/GSM3ShieldV1VoiceProvider.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/GSM3ShieldV1VoiceProvider.cpp')
-rw-r--r-- | libraries/GSM/GSM3ShieldV1VoiceProvider.cpp | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/libraries/GSM/GSM3ShieldV1VoiceProvider.cpp b/libraries/GSM/GSM3ShieldV1VoiceProvider.cpp new file mode 100644 index 0000000..98a50b9 --- /dev/null +++ b/libraries/GSM/GSM3ShieldV1VoiceProvider.cpp @@ -0,0 +1,215 @@ +#include <GSM3ShieldV1VoiceProvider.h> +#include <Arduino.h> + +GSM3ShieldV1VoiceProvider::GSM3ShieldV1VoiceProvider() + { + phonelength=0; + theGSM3MobileVoiceProvider=this; + } + + void GSM3ShieldV1VoiceProvider::initialize() + { + theGSM3ShieldV1ModemCore.registerUMProvider(this); + } + +//Voice Call main function. +int GSM3ShieldV1VoiceProvider::voiceCall(const char* to) +{ + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("ATD"),false); + theGSM3ShieldV1ModemCore.print(to); + theGSM3ShieldV1ModemCore.print(";\r"); + setvoiceCallStatus(CALLING); + return 1; +} + +//Retrieve calling number main function. +int GSM3ShieldV1VoiceProvider::retrieveCallingNumber (char* buffer, int bufsize) +{ + theGSM3ShieldV1ModemCore.setPhoneNumber(buffer); + phonelength = bufsize; + theGSM3ShieldV1ModemCore.setCommandError(0); + theGSM3ShieldV1ModemCore.setCommandCounter(1); + theGSM3ShieldV1ModemCore.openCommand(this,RETRIEVECALLINGNUMBER); + retrieveCallingNumberContinue(); + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +//Retrieve calling number Continue function. +void GSM3ShieldV1VoiceProvider::retrieveCallingNumberContinue() +{ + // 1: AT+CLCC + // 2: Receive +CLCC: 1,1,4,0,0,"num",129,"" + // This implementation really does not care much if the modem aswers trash to CMGL + bool resp; + //int msglength_aux; + switch (theGSM3ShieldV1ModemCore.getCommandCounter()) { + case 1: + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+CLCC")); + theGSM3ShieldV1ModemCore.setCommandCounter(2); + break; + case 2: + if(parseCLCC(theGSM3ShieldV1ModemCore.getPhoneNumber(), phonelength)) + { + theGSM3ShieldV1ModemCore.closeCommand(1); + } + break; + } +} + +//CLCC parse. +bool GSM3ShieldV1VoiceProvider::parseCLCC(char* number, int nlength) +{ + theGSM3ShieldV1ModemCore.theBuffer().extractSubstring("+CLCC: 1,1,4,0,0,\"","\"", number, nlength); + theGSM3ShieldV1ModemCore.theBuffer().flush(); + return true; +} + +//Answer Call main function. +int GSM3ShieldV1VoiceProvider::answerCall() +{ + theGSM3ShieldV1ModemCore.setCommandError(0); + theGSM3ShieldV1ModemCore.setCommandCounter(1); + theGSM3ShieldV1ModemCore.openCommand(this,ANSWERCALL); + answerCallContinue(); + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +//Answer Call continue function. +void GSM3ShieldV1VoiceProvider::answerCallContinue() +{ + // 1: ATA + // 2: Waiting for OK + + // This implementation really does not care much if the modem aswers trash to CMGL + bool resp; + switch (theGSM3ShieldV1ModemCore.getCommandCounter()) { + case 1: + // ATA ; + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("ATA")); + theGSM3ShieldV1ModemCore.setCommandCounter(2); + break; + case 2: + if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp)) + { + setvoiceCallStatus(TALKING); + if (resp) theGSM3ShieldV1ModemCore.closeCommand(1); + else theGSM3ShieldV1ModemCore.closeCommand(3); + } + break; + } +} + +//Hang Call main function. +int GSM3ShieldV1VoiceProvider::hangCall() +{ + theGSM3ShieldV1ModemCore.setCommandError(0); + theGSM3ShieldV1ModemCore.setCommandCounter(1); + theGSM3ShieldV1ModemCore.openCommand(this,HANGCALL); + hangCallContinue(); + return theGSM3ShieldV1ModemCore.getCommandError(); +} + +//Hang Call continue function. +void GSM3ShieldV1VoiceProvider::hangCallContinue() +{ + // 1: ATH + // 2: Waiting for OK + + bool resp; + switch (theGSM3ShieldV1ModemCore.getCommandCounter()) { + case 1: + //ATH + theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("ATH")); + theGSM3ShieldV1ModemCore.setCommandCounter(2); + break; + case 2: + if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp)) + { + setvoiceCallStatus(IDLE_CALL); + if (resp) theGSM3ShieldV1ModemCore.closeCommand(1); + else theGSM3ShieldV1ModemCore.closeCommand(3); + } + break; + } +} + +//Response management. +void GSM3ShieldV1VoiceProvider::manageResponse(byte from, byte to) +{ + switch(theGSM3ShieldV1ModemCore.getOngoingCommand()) + { + case ANSWERCALL: + answerCallContinue(); + break; + case HANGCALL: + hangCallContinue(); + break; + case RETRIEVECALLINGNUMBER: + retrieveCallingNumberContinue(); + break; + + } +} + +//URC recognize. +bool GSM3ShieldV1VoiceProvider::recognizeUnsolicitedEvent(byte oldTail) +{ + + int nlength; + char auxLocate [15]; + //RING. + prepareAuxLocate(PSTR("RING"), auxLocate); + if(theGSM3ShieldV1ModemCore.theBuffer().locate(auxLocate)) + { + // RING + setvoiceCallStatus(RECEIVINGCALL); + theGSM3ShieldV1ModemCore.theBuffer().flush(); + return true; + } + + //CALL ACEPTED. + prepareAuxLocate(PSTR("+COLP:"), auxLocate); + if(theGSM3ShieldV1ModemCore.theBuffer().locate(auxLocate)) + { + //DEBUG + //Serial.println("Call Accepted."); + setvoiceCallStatus(TALKING); + theGSM3ShieldV1ModemCore.theBuffer().flush(); + return true; + } + + //NO CARRIER. + prepareAuxLocate(PSTR("NO CARRIER"), auxLocate); + if(theGSM3ShieldV1ModemCore.theBuffer().locate(auxLocate)) + { + //DEBUG + //Serial.println("NO CARRIER received."); + setvoiceCallStatus(IDLE_CALL); + theGSM3ShieldV1ModemCore.theBuffer().flush(); + return true; + } + + //BUSY. + prepareAuxLocate(PSTR("BUSY"), auxLocate); + if(theGSM3ShieldV1ModemCore.theBuffer().locate(auxLocate)) + { + //DEBUG + //Serial.println("BUSY received."); + setvoiceCallStatus(IDLE_CALL); + theGSM3ShieldV1ModemCore.theBuffer().flush(); + return true; + } + + //CALL RECEPTION. + prepareAuxLocate(PSTR("+CLIP:"), auxLocate); + if(theGSM3ShieldV1ModemCore.theBuffer().locate(auxLocate)) + { + theGSM3ShieldV1ModemCore.theBuffer().flush(); + setvoiceCallStatus(RECEIVINGCALL); + return true; + } + + return false; +} + + |