WORD GSM_SetPin(char * str_pin)

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