WORD GSM_SetPin(char * str_pin)
{
static WORD PinNo = 1;
PinNo = 1;
if(ModemGsm.Signal.Control.RcvMessage){
if(GSM_CompareMessage(GSMResponse[mrCPIN_OK])){ //PIN je zadany
Gsm.State = NONE;
ModemGsm.Signal.Control.PinSet = TRUE;
}
else if(GSM_CompareMessage(GSMResponse[mrCPIN_NO])){ //PIN este nebol zadany
Gsm.State = NONE;
ModemGsm.Signal.Control.PinSet = FALSE;
}
else if(GSM_CompareMessage(GSMResponse[mrCPIN_NOT_READY])){ //SIM karta nie je dostupna
Gsm.State = NONE;
ModemGsm.Signal.Control.PinSet = FALSE;
UM_G_VgsmOn(0);
UM_G_EnableRS232(0);
UM_G_LedOn(0);
UM_G_VaddOn(0);
#if defined(SYSTEM_DEBUG)
GIE = 0;
SLEEP();
while(1){
asm( "clrwdt" );
}
#else
Reset();
#endif
}
else if(GSM_CompareMessage("Call Ready")){
ModemGsm.Signal.Control.RegOk = TRUE;
OsSocket.TickTask[RTX_START] = TickGet();
Gsm.State = NONE; //SIGNAL;
ModemGsm.Signal.Control.RcvMessage = FALSE;
return 0;
}
else if(GSM_CompareMessage(GSMResponse[mrOK])){ //prikaz bol uspesne vykonany
switch(Gsm.ActualCommand){
case mcIPR:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = FLOW_CONTROL;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcIFC:
DelayMs(3000);
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = QUERY_CPIN;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCPIN_Q:
ModemGsm.Signal.Control.CommandOK = TRUE;
if(ModemGsm.Signal.Control.PinSet){
Gsm.ProcessState = NONE;
Gsm.State = NONE;
ModemGsm.Semaphore.Control.CpinError = FALSE;
PinNo = 0;
ModemGsm.Signal.Control.RegOk = TRUE;
OsSocket.TickTask[RTX_START] = TickGet();
Gsm.State = NONE; //SIGNAL;
ModemGsm.Signal.Control.RcvMessage = FALSE;
return 0;
}
else Gsm.State = ENTER_PIN;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCPIN:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = NONE;
Gsm.ProcessState = NONE;
ModemGsm.Semaphore.Control.CpinError = FALSE;
PinNo = 0;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
}
}
else if(GSM_CompareMessage(GSMResponse[mrERROR])){ //chyba
switch(Gsm.ActualCommand){
case mcCPIN:
case mcCPIN_Q:
Gsm.State = NONE;
PinNo = 2;
ModemGsm.Signal.Control.RcvMessage = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
AppFlag.bits.wake_up_external = FALSE;
AppFlag.bits.start = FALSE;
UmG.bits.totalsleep = TRUE;
ModemGsm.Semaphore.Control.CpinError = TRUE;
ModemGsm.Semaphore.Control.Enable = FALSE;
UM_G_VgsmOn(0);
DelayMs(1000);
return PinNo;
case mcIPR:
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = FLOW_CONTROL;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcIFC:
DelayMs(3000);
ModemGsm.Signal.Control.CommandOK = TRUE;
Gsm.State = QUERY_CPIN;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
}
}
}
switch(Gsm.State){
case DISCONNECT:
if(UART_GetHwMode(MODEM) == HANDSHAKE_RTS_CTS){
strcpy((char*)Gsm.CommandData, GSMCommand[mcIPR]);
Gsm.ActualCommand = mcIPR;
}
else{
strcpy((char*)Gsm.CommandData, GSMCommand[mcCPIN_Q]);
Gsm.ActualCommand = mcCPIN_Q;
Gsm.ProcessState = GSM_PIN;
}
ModemGsm.Signal.Control.SendCommand = TRUE;
Gsm.State = NONE;
break;
case FLOW_CONTROL:
ModemGsm.Signal.Control.SendCommand = TRUE;
strcpy((char*)Gsm.CommandData, GSMCommand[mcIFC]);
Gsm.ActualCommand = mcIFC;
Gsm.State = NONE;
break;
case QUERY_CPIN:
strcpy((char*)Gsm.CommandData, GSMCommand[mcCPIN_Q]);
Gsm.ActualCommand = mcCPIN_Q;
Gsm.ProcessState = GSM_PIN;
ModemGsm.Signal.Control.SendCommand = TRUE;
Gsm.State = NONE;
break;
case ENTER_PIN: //zadaj PIN
strcpy((char*)Gsm.CommandData, GSMCommand[mcCPIN]);
Gsm.ActualCommand = mcCPIN;
ModemGsm.Signal.Control.SendCommand = TRUE;
Gsm.State = NONE;
break;
}
return 1;
}