WORD GSM_SmsReceive(void)
{
WORD i, k;
static BYTE SmsGetFlag = 0;
if(ModemGsm.Signal.Control.RcvSms){
ModemGsm.Signal.Control.RcvSms = FALSE;
for(i=0; i<strlen((char*)Gsm.ReceiveData); i++){
if(Gsm.ReceiveData[i] == ',') break;
}
if(Gsm.ReceiveData[i+2] == '\r'){
bTemp[0] = Gsm.ReceiveData[i+1];
bTemp[1] = '\0';
}
else{
bTemp[0] = Gsm.ReceiveData[i+1];
bTemp[1] = Gsm.ReceiveData[i+2];
bTemp[2] = '\0';
}
i = atoi(bTemp);
Sms.NumRcvSms[i] = Sms.NumRcvSms[i] | REC_SMS;
#if defined(GSM_SMS_LONG)
OsSocket.TickTask[RTX_LONG_SMS] = TickGet();
#endif
}
if(ModemGsm.Signal.Control.RcvDelivery){
ModemGsm.Signal.Control.RcvDelivery = FALSE;
}
if(ModemGsm.Signal.Control.RcvMessage){
if(GSM_CompareMessage(GSMResponse[mrCMGR])){
Gsm.ActualCommand = mcCMGR;
Sms.State = PARSE_MESSAGE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
}
else if(GSM_CompareMessage(GSMResponse[mrOK])){
switch(Gsm.ActualCommand){
case mcCMGR:
Gsm.ActualCommand = 0;
ModemGsm.Signal.Control.CommandOK = TRUE;
if(ModemGsm.Signal.Control.RcvAnswerSms) ModemGsm.Signal.Control.RcvAnswerSms = FALSE;
else Sms.State = DELETE_MESSAGE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCMGD:
Gsm.ActualCommand = 0;
ModemGsm.Signal.Control.CommandOK = TRUE;
Sms.NumRcvSms[Sms.IndexReadRx] = Sms.NumRcvSms[Sms.IndexReadRx] & ~DEL_SMS;
Sms.NumRcvSms[Sms.IndexReadRx] = Sms.NumRcvSms[Sms.IndexReadRx] & ~REC_SMS;
ModemGsm.Signal.Control.SmsProcess = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
SmsGetFlag = 0;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
}
}
else if(GSM_CompareMessage(GSMResponse[mrERROR])){ //chyba
switch(Gsm.ActualCommand){
case mcCMGR:
Gsm.ActualCommand = 0;
ModemGsm.Signal.Control.CommandOK = TRUE;
ModemGsm.Signal.Control.RcvAnswerSms = FALSE;
Sms.State = DELETE_MESSAGE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
case mcCMGD:
Gsm.ActualCommand = 0;
ModemGsm.Signal.Control.CommandOK = TRUE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
SmsGetFlag++;
if(SmsGetFlag == 3){
Sms.NumRcvSms[Sms.IndexReadRx] = Sms.NumRcvSms[Sms.IndexReadRx] & ~DEL_SMS;
Sms.NumRcvSms[Sms.IndexReadRx] = Sms.NumRcvSms[Sms.IndexReadRx] & ~REC_SMS;
ModemGsm.Signal.Control.SmsProcess = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
SmsGetFlag = 0;
}
else Sms.State = DELETE_MESSAGE;
ModemGsm.Signal.Control.RcvMessage = FALSE;
break;
}
}
}
switch(Sms.State){
case READ_SMS:
strcpy((char*)Gsm.CommandData, GSMCommand[mcCMGR]);
ui_to_a(Sms.IndexReadRx, bTemp);
strcat((char*)Gsm.CommandData, bTemp);
strcat((char*)Gsm.CommandData, "\r");
Gsm.ActualCommand = mcCMGR;
ModemGsm.Signal.Control.SendCommand = TRUE;
Sms.State = NONE;
break;
case PARSE_MESSAGE:
for(i=23, k=0; i<strlen((char*)Gsm.ReceiveData); i++, k++){
if(Gsm.ReceiveData[i] == '"'){
Sms.RxBuff[0].Tel[k] = '\0';
break;
}
Sms.RxBuff[0].Tel[k] = Gsm.ReceiveData[i];
}
for(; i<strlen((char*)Gsm.ReceiveData); i++){ // datum dorucenia
if(Gsm.ReceiveData[i] == '\n'){
i++;
break;
}
}
for(k=0; i<strlen((char*)Gsm.ReceiveData); i++, k++){ // text SMS
if(Gsm.ReceiveData[i] == '\r' || k == (MAX_SMS_DATA - 1)){
Sms.RxBuff[0].Message[k] = '\0';
break;
}
Sms.RxBuff[0].Message[k] = Gsm.ReceiveData[i];
}
Sms.NumRcvSms[Sms.IndexReadRx] = Sms.NumRcvSms[Sms.IndexReadRx] | DEL_SMS;
Sms.State = EXECUTE_MESSAGE;
break;
case EXECUTE_MESSAGE:
i = GSM_SendSmsToData((GSM*)&Gsm);
if(i == ERR_GSM_SendSmsToData_PACKET){
break;
}
else if(i == ERR_GSM_SendSmsToData_TEL || i == ERR_GSM_SendSmsToData_FORMAT || i == ERR_GSM_SendSmsToData_ACCESS){
Sms.State = DELETE_MESSAGE;
break;
}
Sms.State = NONE;
break;
case DELETE_MESSAGE:
strcpy((char*)Gsm.CommandData, GSMCommand[mcCMGD]);
ui_to_a(Sms.IndexReadRx, bTemp);
strcat((char*)Gsm.CommandData, bTemp);
strcat((char*)Gsm.CommandData, "\r");
Gsm.ActualCommand = mcCMGD;
ModemGsm.Signal.Control.SendCommand = TRUE;
Sms.State = NONE;
break;
}
return 1;
}