WORD GSM_SmsReceive(void)
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; }