WORD GSM_Process(void)
{
WORD_VAL wvTemp, wvTemp2;
WORD i;
BYTE type_message, data;
char *p;
char *end;
if(!ModemGsm.Signal.Control.ModemReady && (TickGetDiff(TickGet(), OsSocket.TickTask[RTX_MODEM]) >= (8*TICKS_PER_SECOND))){
ModemGsm.Signal.Control.ModemReady = TRUE;
}
if(ModemGsm.Signal.Control.ModemReady){
if(!GSM_SetPin((char*)"0000")){
#if defined(GSM_CALL)
Gsm.State = SET_CALL;
}
if(!ModemGsm.Signal.Control.Process && Call.Flag){
Call.Flag = 0;
Gsm.State = TERMINATE_CALL;
}
i = GSM_Call();
if(i == 3) return ERR_OK;
else if(i == 0) Gsm.State = SET_SMS;
else if(i == 2){
#if defined(GPRS_HTTP)
if(ModemGsm.Semaphore.Control.enable_web || ModemGsm.Semaphore.Control.enable_email) Gsm.State = TCP_DISABLE_MUX;
else if(!ModemGsm.Semaphore.Control.enable_web && !ModemGsm.Semaphore.Control.enable_email){
Gsm.State = NONE;
ModemGsm.Signal.Control.Process = FALSE;
}
#else
Gsm.State = NONE;
ModemGsm.Signal.Control.Process = FALSE;
#endif
}
#else
#if defined(GSM_SMS)
Gsm.State = SET_SMS;
#else
Gsm.State = SIGNAL;
#endif
}
#endif
#if defined(GSM_SMS)
if(!GSM_SmsConfigure()) Gsm.State = REG_NETWORK;
if(!GSM_SmsReceive()) Gsm.State = NONE;
if(!GSM_SmsSend()) Gsm.State = NONE;
#endif
if(!GSM_RegNetwork()){
#if defined(GSM_CALL)
DelayMs(250);
Gsm.State = GET_CREDIT;
}
if(GSM_Call() == 3) return ERR_OK;
#else
#if defined(GPRS_HTTP)
if(ModemGsm.Semaphore.Control.enable_web || ModemGsm.Semaphore.Control.enable_email) Gsm.State = TCP_DISABLE_MUX;
else if(!ModemGsm.Semaphore.Control.enable_web && !ModemGsm.Semaphore.Control.enable_email){
Gsm.State = NONE;
ModemGsm.Signal.Control.Process = FALSE;
}
#else
Gsm.State = NONE;
ModemGsm.Signal.Control.Process = FALSE;
#endif
}
#endif
#if defined(GSM_GPRS)
// if(!GSM_GprsGetAPN()){
// Gsm.State = TCP_DISABLE_MUX;
// }
if(!GSM_AttachGprs((char*)"internet", 0, 0)){
GSM_AppInitGprs();
#if defined(GPRS_SMTP)
if(ModemGsm.Semaphore.Control.enable_email) Gsm.State = SMTP_SERVER; //GPRS_ACTIVATE;
else{
ModemGsm.Signal.Control.Process = FALSE;
Gsm.State = NONE;
}
#else
ModemGsm.Signal.Control.Process = FALSE;
Gsm.State = NONE;
#endif
}
i = GSM_ActivateGprs();
if(i == 2){
Gsm.State = TCP_SET_APN;
ModemGsm.Signal.Control.Process = TRUE;
}
else if(i == 0){
Gsm.State = NONE;
ModemGsm.Signal.Control.Process = FALSE;
}
#if defined(GPRS_HTTP)
if(!GSM_HttpRead(Gprs.Message)){
Gsm.State = NONE;
GSM_AppInitHttp();
}
#endif
if(!GSM_DeactivateGprs()) Gsm.State = NONE;
#endif
#if defined(GPRS_SMTP)
if(!GSM_SmtpConfigure()){
ModemGsm.Signal.Control.Process = FALSE;
Gsm.State = NONE;
}
if(!GSM_SmtpSend(0, 0, Gprs.Message)) Gsm.State = NONE;
#endif
if(ModemGsm.Signal.Control.RcvMessage && GSM_CompareMessage(GSMResponse[mrERROR])){
ModemGsm.Signal.Control.CommandOK = TRUE;
ModemGsm.Signal.Control.SmsProcess = FALSE;
ModemGsm.Signal.Control.Process = FALSE;
}
ModemGsm.Signal.Control.RcvMessage = FALSE;
#if defined(GPRS_HTTP)
if(ModemGsm.Semaphore.Control.SendHttp && ModemGsm.Semaphore.Control.GprsRegister && !ModemGsm.Semaphore.Control.GprsAttach && !ModemGsm.Signal.Control.Process && ModemGsm.Signal.Control.RegOk){
Gsm.State = GPRS_ACTIVATE;
ModemGsm.Signal.Control.Process = TRUE;
}
else if(!ModemGsm.Semaphore.Control.GprsRegister && !ModemGsm.Semaphore.Control.GprsAttach && ModemGsm.Semaphore.Control.enable_web && !ModemGsm.Signal.Control.Process && ModemGsm.Signal.Control.RegOk && Gsm.Operator != 0xff){
Gsm.State = TCP_DISABLE_MUX;
ModemGsm.Signal.Control.Process = TRUE;
}
#endif
}
GSM_InitReady();
if(!ModemGsm.Signal.Control.RcvMessage && !ModemGsm.Signal.Control.RcvDelivery && !ModemGsm.Signal.Control.RcvSms){ // precitanie odpovede alebo udalosti z modemu
GSM_ReadMessage(Gsm.ReceiveData);
}
#if defined(GSM_SMS)
#if defined(GSM_SMS_LONG)
if(ModemGsm.Signal.Control.RegOk && !ModemGsm.Signal.Control.Process && !ModemGsm.Signal.Control.SmsProcess && (TickGetDiff(TickGet(), OsSocket.TickTask[RTX_LONG_SMS]) >= (10*TICKS_PER_SECOND))){
#else
if(ModemGsm.Signal.Control.RegOk && !ModemGsm.Signal.Control.Process && !ModemGsm.Signal.Control.SmsProcess){
#endif
for(i=0; i<MAX_RECEIVE_SMS; i++){
if(Sms.NumRcvSms[i] == REC_SMS){
ModemGsm.Signal.Control.SmsProcess = TRUE;
ModemGsm.Signal.Control.Process = TRUE;
Sms.State = READ_SMS;
Sms.IndexReadRx = i;
break;
}
}
}
#endif
if(ModemGsm.Signal.Control.CommandOK){ //ak bol predosly prikaz uspesne ukonceny spracuje dalsi
#if defined(GSM_SMS)
#if defined(EXTENDED_SMS)
if(Sms.IndexWriteTx != Sms.IndexWriteRx && !ModemGsm.Signal.Control.Process){
ModemGsm.Signal.Control.SendCommand = TRUE;
ModemGsm.Signal.Control.SendSms = TRUE;
ModemGsm.Signal.Control.Process = TRUE;
}
else if(Sms.IndexWriteTx == Sms.IndexWriteRx && ModemGsm.Semaphore.Control.alarm_call && !ModemGsm.Signal.Control.Process){
if(Call.IndexWrite != Call.IndexRead){
ModemGsm.Signal.Control.Process = TRUE;
Gsm.State = VOICE_CALL;
Call.IndexRead++;
if(Call.IndexRead == MAX_CALL_BUFFER) Call.IndexRead = 0;
}
else ModemGsm.Semaphore.Control.alarm_call = FALSE;
// ModemGsm.Signal.Control.SendCommand = TRUE;
// strcpy(Gsm.CommandData,GSMCommand[mcCMGS]);
// Gsm.ActualCommand = mcCMGS;
}
#else
if(ModemGsm.Semaphore.Control.alarm_call && !ModemGsm.Signal.Control.Process){
if(Call.IndexWrite != Call.IndexRead){
ModemGsm.Signal.Control.Process = TRUE;
Gsm.State = VOICE_CALL;
Call.IndexRead++;
if(Call.IndexRead == MAX_CALL_BUFFER) Call.IndexRead = 0;
}
else ModemGsm.Semaphore.Control.alarm_call = FALSE;
}
#endif
#endif
if(ModemGsm.Signal.Control.SendCommand){
ModemGsm.Signal.Control.CommandOK = FALSE;
#if defined(GSM_SMS)
if( ModemGsm.Signal.Control.SendSms){
#if defined(EXTENDED_SMS)
strcpy(Gsm.CommandData,GSMCommand[mcCMGS]);
Gsm.ActualCommand = mcCMGS;
strcat(Gsm.CommandData, "\"");
SmsTxBuffControll.Write = strlen((const char*)Sms.TxBuff[Sms.IndexWriteRx].Tel) + 1;
SmsTxBuffControll.Read = 0;
CYCLIC_BUFFER_Read( bTemp, strlen((const char*)Sms.TxBuff[Sms.IndexWriteRx].Tel) + 1, &SmsTxBuffControll, Sms.TxBuff[Sms.IndexWriteRx].Tel, GSM_SMS_TEL_BUFFER );
strcat(Gsm.CommandData, bTemp);
strcat(Gsm.CommandData, "\"\r");
#endif
ModemGsm.Signal.Control.InsertSms = TRUE;
}
#endif
ModemGsm.Signal.Control.SendCommand = FALSE;
UART_PutData(MODEM, (char*)Gsm.CommandData, strlen((char*)Gsm.CommandData));
#if defined(DEBUG)
UART_PutData(GSM_DEBUG, Gsm.CommandData, strlen(Gsm.CommandData));
#endif
}
#if defined(GSM_GPRS)
#if defined(GPRS_HTTP) && defined(GPRS_SMTP)
else if((ModemGsm.Semaphore.Control.SendHttp || ModemGsm.Semaphore.Control.SendSmtp) && ModemGsm.Semaphore.Control.GprsAttach && ModemGsm.Signal.Control.RegOk && !ModemGsm.Signal.Control.SendSms && !ModemGsm.Signal.Control.Process){
ModemGsm.Signal.Control.Process = TRUE;
GprsTxBuffControll.Read = Gprs.IndexReadTx;
GprsTxBuffControll.Write = Gprs.IndexWriteTx;
CYCLIC_BUFFER_Read( bTemp, 3, &GprsTxBuffControll, Gprs.TxBuff, MAX_GPRS_BUFFER );
type_message = bTemp[0];
wvTemp.byte.HB = bTemp[1];
wvTemp.byte.LB = bTemp[2];
wvTemp.Val -= 3;
CYCLIC_BUFFER_Read( Gprs.Message, wvTemp.Val, &GprsTxBuffControll, Gprs.TxBuff, MAX_GPRS_BUFFER );
if((i = CYCLIC_BUFFER_GetFreeSpace( &GprsTxBuffControll, MAX_GPRS_BUFFER )) == (MAX_GPRS_BUFFER - 1)){
ModemGsm.Semaphore.Control.SendHttp = FALSE;
ModemGsm.Semaphore.Control.SendSmtp = FALSE;
}
Gprs.IndexReadTx = GprsTxBuffControll.Read;
Gprs.IndexWriteTx = GprsTxBuffControll.Write;
for(i=0; i<MAX_COMMAND_DATA_GSM; i++) Gsm.CommandData[i] = Gprs.Message[i];
if((p = (char*)strstr((const char*)Gsm.CommandData, "answer")) != NULL){
#if defined(SENSOR_HISTORY)
if(strtol (p + 7, &end, 0) == AC_SENSOR_HISTORY_GET_VALUE){
SensorFlag.bits.DataHistory = TRUE;
// SensorFlag.bits.DataHistorySend = FALSE;
// SensorFlag.bits.DataHistorySend2 = FALSE;
// SensorFlag.bits.DataHistorySend3 = FALSE;
}
#endif
}
if(type_message == MESSAGE_TYPE_HTTP){
Gsm.State = HTTP_URL;
}
else if(type_message == MESSAGE_TYPE_SMTP){
Gsm.State = SMTP_RECIPIENT;
}
}
#elif !defined(GPRS_HTTP) && defined(GPRS_SMTP)
else if(ModemGsm.Semaphore.Control.SendSmtp && ModemGsm.Semaphore.Control.GprsAttach && ModemGsm.Signal.Control.RegOk && !ModemGsm.Signal.Control.SendSms && !ModemGsm.Signal.Control.Process){
ModemGsm.Signal.Control.Process = TRUE;
GprsTxBuffControll.Read = Gprs.IndexReadTx;
GprsTxBuffControll.Write = Gprs.IndexWriteTx;
CYCLIC_BUFFER_Read( bTemp, 3, &GprsTxBuffControll, Gprs.TxBuff, MAX_GPRS_BUFFER );
type_message = bTemp[0];
wvTemp.byte.HB = bTemp[1];
wvTemp.byte.LB = bTemp[2];
wvTemp.Val -= 3;
CYCLIC_BUFFER_Read( Gprs.Message, wvTemp.Val, &GprsTxBuffControll, Gprs.TxBuff, MAX_GPRS_BUFFER );
if(CYCLIC_BUFFER_GetFreeSpace( &GprsTxBuffControll, MAX_GPRS_BUFFER ) == (MAX_GPRS_BUFFER - 1)){
ModemGsm.Semaphore.Control.SendSmtp = FALSE;
}
Gprs.IndexReadTx = GprsTxBuffControll.Read;
Gprs.IndexWriteTx = GprsTxBuffControll.Write;
for(i=0; i<MAX_COMMAND_DATA_GSM; i++) Gsm.CommandData[i] = Gprs.Message[i];
if((p = (char*)strstr((const char*)Gsm.CommandData, "answer")) != NULL){
#if defined(SENSOR_HISTORY)
if(strtol (p + 7, &end, 0) == AC_SENSOR_HISTORY_GET_VALUE){
SensorFlag.bits.DataHistory = TRUE;
// SensorFlag.bits.DataHistorySend = FALSE;
// SensorFlag.bits.DataHistorySend2 = FALSE;
// SensorFlag.bits.DataHistorySend3 = FALSE;
}
#endif
}
if(type_message == MESSAGE_TYPE_SMTP){
Gsm.State = SMTP_RECIPIENT;
}
}
#elif defined(GPRS_HTTP) && !defined(GPRS_SMTP)
else if(ModemGsm.Semaphore.Control.SendHttp && ModemGsm.Semaphore.Control.GprsAttach && ModemGsm.Signal.Control.RegOk && !ModemGsm.Signal.Control.SendSms && !ModemGsm.Signal.Control.Process){
ModemGsm.Signal.Control.Process = TRUE;
GprsTxBuffControll.Read = Gprs.IndexReadTx;
GprsTxBuffControll.Write = Gprs.IndexWriteTx;
CYCLIC_BUFFER_Read( bTemp, 3, &GprsTxBuffControll, Gprs.TxBuff, MAX_GPRS_BUFFER );
type_message = bTemp[0];
wvTemp.byte.HB = bTemp[1];
wvTemp.byte.LB = bTemp[2];
wvTemp.Val -= 3;
CYCLIC_BUFFER_Read( Gprs.Message, wvTemp.Val, &GprsTxBuffControll, Gprs.TxBuff, MAX_GPRS_BUFFER );
if(CYCLIC_BUFFER_GetFreeSpace( &GprsTxBuffControll, MAX_GPRS_BUFFER ) == (MAX_GPRS_BUFFER - 1)){
ModemGsm.Semaphore.Control.SendHttp = FALSE;
}
Gprs.IndexReadTx = GprsTxBuffControll.Read;
Gprs.IndexWriteTx = GprsTxBuffControll.Write;
for(i=0; i<MAX_COMMAND_DATA_GSM; i++) Gsm.CommandData[i] = Gprs.Message[i];
if((p = (char*)strstr((const char*)Gsm.CommandData, "answer")) != NULL){
#if defined(SENSOR_HISTORY)
if(strtol (p + 7, &end, 0) == AC_SENSOR_HISTORY_GET_VALUE){
SensorFlag.bits.DataHistory = TRUE;
// SensorFlag.bits.DataHistorySend = FALSE;
// SensorFlag.bits.DataHistorySend2 = FALSE;
// SensorFlag.bits.DataHistorySend3 = FALSE;
}
#endif
}
if(type_message == MESSAGE_TYPE_HTTP){
Gsm.State = HTTP_URL;
}
}
#endif
#endif //GSM_GPRS
}
return ERR_OK;
}