WORD GSM_Call(void)

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;
}