WORD GSM_Call(void)
{
WORD i, j;
BYTE k;
if(ModemGsm.Signal.Control.RcvMessage){
if(GSM_CompareMessage("NO CARRIER") && Gsm.ActualCommand == mcATD && ModemGsm.Semaphore.Control.alarm_call){
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
Call.IndexWrite = 0;
Call.IndexRead = 0;
biREGISTER.GlobalBlock = 0;
return 3;
}
else if(GSM_CompareMessage("NO CARRIER") && Gsm.ActualCommand == mcATD){
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
biREGISTER.GlobalBlock = 0;
return 3;
}
else if(GSM_CompareMessage("BUSY") && Gsm.ActualCommand == mcATD){
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
biREGISTER.GlobalBlock = 0;
return 3;
}
else if(GSM_CompareMessage("NO ANSWER") && Gsm.ActualCommand == mcATD){
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
biREGISTER.GlobalBlock = 0;
return 3;
}
else if(GSM_CompareMessage("RING")){
// ModemGsm.Signal.Control.CommandOK = TRUE;
// Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
}
else if(GSM_CompareMessage(GSMResponse[mrATD])){
for(i=0; i<strlen((char*)Gsm.ReceiveData); i++){
if(Gsm.ReceiveData[i] == '\"'){
for(j=i+1, k=0; j<strlen(Gsm.ReceiveData); j++, k++){
ModemGsmCredit[k] = Gsm.ReceiveData[j];
if(Gsm.ReceiveData[j] == '\"') break;
}
break;
}
else if(Gsm.ReceiveData[i] == '1' || Gsm.ReceiveData[i] == '3' || Gsm.ReceiveData[i] == '4' || Gsm.ReceiveData[i] == '5' || Gsm.ReceiveData[i] == '6' || Gsm.ReceiveData[i] == '7'){
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
return 2;
}
}
ModemGsmCredit[k] = 0;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
}
else if(GSM_CompareMessage(GSMResponse[mrCLIP])){
GSM_SendCallToData();
Call.Flag = 1;
// Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
}
else if(GSM_CompareMessage(GSMResponse[mrOK])){
switch(Gsm.ActualCommand){
case mcATD:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
if(ModemGsm.Semaphore.Control.alarm_call) break;
else return 2;
case mcCOLP:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = SET_AUDIO;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcQAUDCH:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = GAIN_MIC;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcQMIC:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = GAIN_SPK;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCLVL:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = SET_ECHO; //SIDET;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
// case mcQSIDET:
// ModemGsm.Signal.Control.CommandOK = TRUE;
// Gsm.State = SET_ECHO;
// ModemGsm.Signal.Control.RcvMessage = FALSE;
// break;
case mcQECHO:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = SET_CLIP;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCLIP:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
return 0;
case mcATH0:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
}
}
else if(GSM_CompareMessage(GSMResponse[mrERROR])){
switch(Gsm.ActualCommand){
case mcATD:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
if(ModemGsm.Semaphore.Control.alarm_call) break;
else return 2;
case mcCOLP:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = SET_AUDIO;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcQAUDCH:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = GAIN_MIC;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcQMIC:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = GAIN_SPK;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCLVL:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = SET_ECHO; //SIDET;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
//case mcQSIDET:
case mcQECHO:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = SET_CLIP;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCLIP:
case mcATH0:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
}
}
}
switch(Gsm.State){
case GET_CREDIT:
strcpy((char*)Gsm.CommandData, GSMCommand[mcATD]);
Gsm.ActualCommand = mcATD;
strcat((char*)Gsm.CommandData, TableApnSettingGPRS[Gsm.Operator].USSD);
strcat((char*)Gsm.CommandData, "\r");
ModemGsmCredit[0] = 0;
ModemGsm.Signal.Control.SendCommand = TRUE;
Gsm.State = NONE;
break;
case SET_CALL:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcCOLP]);
Gsm.ActualCommand = mcCOLP;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case SET_AUDIO:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcQAUDCH]);
Gsm.ActualCommand = mcQAUDCH;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case SET_CLIP:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcCLIP]);
Gsm.ActualCommand = mcCLIP;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case TERMINATE_CALL:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcATH0]);
Gsm.ActualCommand = mcATH0;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case VOICE_CALL:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcATD]);
strcat((char*)Gsm.CommandData, Call.PhoneNumber[Call.IndexRead]);
strcat((char*)Gsm.CommandData, ";\r");
Gsm.ActualCommand = mcATD;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case SET_ECHO:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcQECHO]);
Gsm.ActualCommand = mcQECHO;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case GAIN_MIC:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcQMIC]);
Gsm.ActualCommand = mcQMIC;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case GAIN_SPK:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcCLVL]);
Gsm.ActualCommand = mcCLVL;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
case SIDET:
Gsm.State = NONE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcQSIDET]);
Gsm.ActualCommand = mcQSIDET;
ModemGsm.Signal.Control.SendCommand = TRUE;
break;
}
return 1;
}