⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs.c

📁 名厂车载GPS通信终端
💻 C
📖 第 1 页 / 共 4 页
字号:
#define GPRS_GLOBAL              1


#include "includes.h"
#pragma ROM GPRSTASKPROC[]
const ENTRY_PROC far GPRSTASKPROC[] ={
	{GSMUARTRECV,Gsmuart_Recv},
	{RECVONESMS, Sms_Recv},
	//{SENDONESMS, SendSmsProc},//
	{SEND_NO_CLIP,Deal_Hangbyother},
	{AUTODIALFAIL,Auto_DialProc},
	{STARTFUTURE,Start_Future_Track},
	{SEND_ACC_ON,Send_Acc_On},
	{SEND_ACC_OFF,Send_Acc_Off},
	{RECV_ONE_GPRS,Gprs_Recv},
};




//----------------for initialize the modem-----
//uchar Init_Modem_Step;//Removed by lxo 1229021  for set it for globle value
uchar rst_modem_step;
uchar pickup_status;
//uchar Hangup_BacktoGPRS_Step; //added by leon 051011
TIMER *Init_Gprs_Timer;
TIMER *Moniter_Timer;
TIMER *Reset_Gprs_Timer; 
TIMER *Auto_Pickup_Timer;
//TIMER *Sms_Send_Timer;
TIMER *Auto_TelTimer;
TIMER *Sleep_Gprs_Timer;
TIMER *Hangup_BacktoGPRS_Timer;  //added by leon 051011
//uchar auto_dailtel[16];
//uchar auto_daillen;
//uchar auto_atti
//uchar AutoDialTime=0;
//-----------------funcation-------------------
void ToneSetting(uchar value)
{
	UCHAR len;
	UCHAR str[3];
	
	len=IntToStr(value,str);
	At_Cmd_Vgr(str,len);
#ifdef DEBUG_AT
	//Uart1Send("tone setting");
	//Uart1Word(value);
#endif 
}

void Voice_End(void)  //通话结束//
{
	audio_status = 0;
	VOICE_MUTE = VOL_LOW;
	SUB_MUTE   = VOL_HIGH;
	VOICE_CON  = VOL_LOW;
}

void Voice_Sel(uchar mode) //选择通话模式//
{
	VOICE_MUTE = VOL_HIGH;
	VOICE_CON  = VOL_LOW;
	switch(mode)
	{
	case 1:  //手柄//
		gsmstatus.talk = _HAND_TALK;
		VOICE_MUTE     = VOL_LOW;
		HAND_VOICE_CON = VOL_HIGH;
		SUB_MUTE       = VOL_HIGH;
		break;
	case 2:  //免提//
		gsmstatus.talk = _VOICE_TALK;
		VOICE_CON      = VOL_HIGH;
		HAND_VOICE_CON = VOL_LOW;
		SUB_MUTE       = VOL_LOW;
		break;
	case 3:  //监听//
		gsmstatus.talk = _NOVOICE_TALK;
		HAND_VOICE_CON = VOL_LOW;
		SUB_MUTE       = VOL_HIGH;
		break;
	}
}

void Simcard_Sel(uchar i)
{
	if(i>0)
	{
		//      gsmstatus.simid = 1;
		SIMCARD_SEL = VOL_LOW;
	}
	else
	{
		//      gsmstatus.simid = 0;
		SIMCARD_SEL = VOL_HIGH;
	}
}

//added by leon 051013 for Switching Area between Mainland and Extra-area
//modified lxo 120704 for chang sim
BOOL SwitchArea(uchar simid)
{
#ifdef DEBUG_AT
	Uart1Send("Switch Sim Card and the Sim ID is:");
	Uart1Word(simid);
#endif
//	if(n_simid == gsc.Gprs_Simcard_bits.currsc)   
/*
	if(simid==save.basevalue.mode.bit.simid)//lxo 12070401 for change sim
	{
#ifdef DEBUG_AT
		Uart1Send("But the current sim card and the simid which ready to switch is the same!");
#endif
		if(ParaSet.ChangeSim)
			ParaSet.ChangeSim=0;
		return TRUE;
	}
*/	
	ParaSet.ChangeSim=1;
	ParaSet.SimId=simid;
	Start_Timer(Gprs_Service_Timer,10,SECOND);
	return TRUE;
}

//modified by leon 051013
//modified lxo 120701
void JudgeSimCardArea(void)
{
	uchar   i;
	uchar  TempId;
	if(!GpsIsValid()) return;
	if(ParaSet.ChangeSim)
		TempId=ParaSet.SimId;
	else
		TempId=save.basevalue.mode.bit.simid;
	if(TempId)
	{//HongKong to Homeland
		for(i=0;i<save.simsel.set_port_number;i++)
		{
			if( (gps_data.latitude < save.simsel.judge_port[i].mainland_port.top_left.lati &&
			 gps_data.latitude > save.simsel.judge_port[i].mainland_port.right_bottom.lati)&&
			(gps_data.longitude > save.simsel.judge_port[i].mainland_port.top_left.longi&&
		 	 gps_data.longitude < save.simsel.judge_port[i].mainland_port.right_bottom.longi))
			{
				SwitchArea(0);
				break;
			}		
		}
	}
	else
	{//Homeland to HongKong
		for(i=0;i<save.simsel.set_port_number;i++)
		{
			if(( (gps_data.latitude < save.simsel.judge_port[i].extraarea_port.top_left.lati &&
			 gps_data.latitude > save.simsel.judge_port[i].extraarea_port.right_bottom.lati)&&
			(gps_data.longitude > save.simsel.judge_port[i].extraarea_port.top_left.longi&&
		 	 gps_data.longitude < save.simsel.judge_port[i].extraarea_port.right_bottom.longi)))
		 	 
			{
				SwitchArea(1);
				break;
			}
			if( (gps_data.latitude < save.simsel.judge_port[i].extraarea_map.top_left.lati &&
			 gps_data.latitude > save.simsel.judge_port[i].extraarea_map.right_bottom.lati)&&
			(gps_data.longitude > save.simsel.judge_port[i].extraarea_map.top_left.longi&&
		 	 gps_data.longitude < save.simsel.judge_port[i].extraarea_map.right_bottom.longi))
		 	 
			{
				SwitchArea(1);
				break;
			}
			
		}
	}
}

uchar Get_Free_Sms_Point()
{
	uchar i;
	for(i=0;i<MAX_SMSRECV_STORE;i++)
	{
		if(sms_store[i].isvalid ==0)
			return i;
	}
	return 0xff;
}

//added by leon 051019 for Receive the SMS Timer
void Recv_Sms_Proc()
{
	uchar i;	
	if(gsc.Gprs_Simcard_bits.isrecvingsms)
	{
		Start_Timer(Recv_Sms_Timer,10,HMSEL);
		return;
	}
	for(i=0;i<MAX_SMSRECV_STORE;i++)
	{
		if(sms_store[i].isvalid == 1)
		{
			Send_Taskmsg(GprsTaskid,RECVONESMS,sms_store[i].smsdata);
			sms_store[i].isvalid =0;
			Start_Timer(Recv_Sms_Timer,10,HMSEL);
			return;
		}
	}
	Stop_Timer(Recv_Sms_Timer);
}

//added by leon 051011 for Hangup then Back to GPRS at once.
void Hangup_BacktoGPRS_Proc()
{
	uchar buf[2];
	if(ring_steps ==0)
	{
		ring_steps =1;
		buf[0]='+';
		Uart2Tx(buf,1);
		Uart2Tx(buf,1);
		Uart2Tx(buf,1);
		Start_Timer(Hangup_BacktoGPRS_Timer,5,SECOND);
	}
	else
	{
		if(isneedbacktogprs == TRUE)
		{
			if(ring_steps == 1)
			{
#ifdef DEBUG_AT
				Uart1Send("Try Hangup Failed then Back To AT Command!");
#endif	
				ring_steps =2;
				Start_Timer(Hangup_BacktoGPRS_Timer,2,SECOND);
			}
			else if(ring_steps == 2)
			{
#ifdef DEBUG_AT
//				Uart1Send("the gprsdata status is:");
//				Uart1Word(gsmstatus.gprsdata);
#endif
				if(gsmstatus.isupdate == TRUE)
				{
					ring_steps =0;
					ring.ack = 0;
					return;
				}
				gsmstatus.gprsdata = TRUE;
				SwitchToAtCmd();
				isneedbacktogprs = FALSE;
				Start_Timer(Gprs_Service_Timer,1,MINUTE);
				ring_steps = 0;
			}
		}
		else
		{
			ring_steps = 0;
		}
	}
}

//added by leon 050929 for Accept Ring 
void Accept_Ring_Proc(void)
{
	//	Uart1Word(alarm_flag);
	//	Uart1Word(gsmstatus.isupdate);
	//	Uart1Word(save.basevalue.phone_mode);
	if(gsmstatus.gprsdata == FALSE || gsc.Gprs_Simcard_bits.isconnecting) 
		return;
	if((alarm_flag&0xfe53 ||gsmstatus.isupdate==TRUE)||(save.basevalue.phone_mode==0||save.basevalue.phone_mode==0x03)) 
   	{
   		if(ring_steps==0)
   		{
#ifdef DEBUG_AT
			Uart1Send("Ringing...");
#endif
			isneedbacktogprs = TRUE;
			gsmstatus.gprsdata = FALSE;
			ring.ack = 1;
			Start_Timer(Hangup_BacktoGPRS_Timer,1,HMSEL);
   		}
		return;
    }
    clr_watchdog();
	//ring.ack = 1;//Removed by lxo 06090102 for not being able to auto answer the telephone.
	SwitchToAtCmd();
	Start_Timer(Gprs_Service_Timer,1,MINUTE);
}

//added by leon 050921 for GPRS service Timer procedure.
void Gprs_Service_Proc(void)
{
	//必须排除当前正在通话,拨号,振铃,自动回拨,监听等电话状态
#ifdef DEBUG_AT
	Uart1Send("Gprs_Service Timer Entered!");
	Uart1Word(ring.ack);
	Uart1Word(gsmstatus.tel);
	Uart1Word(AutoDial.state);
	Uart1Word(isgprsnoservice);
	Uart1Word(gsc.Gprs_Simcard_bits.isconnecting);
	Uart1Word(ParaSet.IPChange);
	Uart1Word(gsmstatus.isupdate);
	Uart1Word(gsmstatus.gprsdata);
	Uart1Word(alarm_flag);
	Uart1Word(ParaSet.ChangeSim);
	Uart1Word(ParaSet.SimId);
#endif
	Start_Timer(Gprs_Service_Timer,5,MINUTE);
	//add lxo 120102 for reset mode after 24 hours passed.
	if(ParaSet.Hours24Reset)
	{
			if(!(alarm_flag&0xfe53 || gsmstatus.isupdate == TRUE)&&(ring.ack == 0 && gsmstatus.tel == _TEL_IDLE && AutoDial.state == _IDLE))
			{
				if(gsmstatus.gprsdata==TRUE)
				{
					SwitchToAtCmd();
					isgprsnoservice = 0;
					Start_Timer(Gprs_Service_Timer,3,SECOND);
					return;
				}
				else
				{
					ParaSet.Hours24Reset=0;
					Reset_Gprs();
					return;
				}
				
			}
	}
	//add lxo 120705 for change sim
	if(ParaSet.ChangeSim)
	{
		if(ParaSet.SimId==save.basevalue.mode.bit.simid)		
		{
			ParaSet.ChangeSim=0;
		}
		else if(gsc.Gprs_Simcard_bits.isconnecting==0)//lxo 121201 for change sim regardless of alarm&telephone&updata-program
		{
			if(gsmstatus.gprsdata==TRUE)
			{
				SwitchToAtCmd();
				Start_Timer(Gprs_Service_Timer,3,SECOND);
				return;
			}
			else
			{
				ParaSet.ChangeSim=0;
				save.basevalue.mode.bit.simid=ParaSet.SimId;
				Reset_Gprs();
				return;
			}
		}
	}
	//add lxo 112314 for reconnect after IP&Port change.
	if(ParaSet.IPChange)
	{
		if(gsmstatus.isupdate==TRUE)
			ParaSet.IPChange=0;
		else if((alarm_flag==0)&&gsmstatus.gprsdata==TRUE)
		{
			need_start_connect = 1;			
			SwitchToAtCmd();
		}			
	}
	if(port[_ACC].status == 0 && gsc.Gprs_Simcard_bits.isneedsendaccoff ==1)
	{
		if(gsmstatus.gprsdata == TRUE)
		{
			if(alarm_flag&0xfe53 || gsmstatus.isupdate == TRUE || monitor_times !=0) 
				return;
			Send_Acc_Off();
			gsc.Gprs_Simcard_bits.isneedsendaccoff = 0;
			return;
		}
	}
	if(isgprsnoservice && !gsc.Gprs_Simcard_bits.isconnecting)
	{
		if(ring.ack ==0 && gsmstatus.tel == _TEL_IDLE && AutoDial.state == _IDLE)
		{
			SwitchToGprs();
		}
		else
		{
			Start_Timer(Gprs_Service_Timer,1,MINUTE);
		}
	}
}

void Auto_Pickup_Proc(void)
{
	Send_H09Msg(0x05);
	if(gsmstatus.tel == _TEL_IDLE)
	{
		++pickup_status;
		if(pickup_status<3)
			Start_Timer(Auto_Pickup_Timer,1,SECOND);
	} //don't know why?
	Pickup();
}

void AutoPickup(void)
{
	if(save.basevalue.mode.bit.dial)return;
	pickup_status = 0;
	Start_Timer(Auto_Pickup_Timer,10,SECOND);
}

uchar Auto_Dial(uchar *tel,uchar tellen,uchar attrib,uchar time)
{
	uchar i;
	if(attrib==0){AutoDial.state = _IDLE;Stop_Autodial();}
	if( Is_Autodail()) return FALSE;
	AutoDial.state = _BUSY;
	
	for(i=0; i<tellen; i++)
	{
		AutoDial.tel[i] = tel[i];
	}
	AutoDial.tellen = tellen;
	AutoDial.attrib = attrib;
	AutoDial.time   = 0;
	if(attrib ==2)Wake_Once_Handset();
	Start_Timer(Auto_TelTimer,time,SECOND);
	return TRUE;
}

void Stop_Autodial(void)
{
	Stop_Timer(Auto_TelTimer);
}

void Start_Autodial(void)
{
	Start_Timer(Auto_TelTimer,100,SECOND);
}

uchar Is_Autodail(void)
{
	if(AutoDial.state==_BUSY) return TRUE;
	else return FALSE ;
}

void Auto_DialProc(void)
{
	Stop_Autodial();
#ifdef DEBUG_AT
	Uart1Send("Is Auto Dialing...");
	Uart1Word(AutoDial.attrib);
	Uart1Word(AutoDial.time);
#endif
    //Added by lxo 0609040101 for distance-disable function with AutoDial function.
	if(save.basevalue.need_service==1)
	{
        AutoDial.state = _IDLE;
		return;
	}

	switch(AutoDial.attrib)
	{
	case 0:
		if(AutoDial.time<10)
		{
            Start_Autodial();
            Hangup();
            Dial(AutoDial.tel,AutoDial.tellen,FALSE,TRUE);
            AutoDial.state=_BUSY;
		}
		break;
	case 1:
		if(AutoDial.time!=0)break;
		if(gsc.Gprs_Simcard_bits.isconnecting == 1)//Add by lxo 06083101 for conflict when initializing modem.
		{
		    Start_Timer(Auto_TelTimer,3,SECOND);
		    return;
		}
		Hangup();
		Dial(AutoDial.tel,AutoDial.tellen,TRUE,FALSE);
		AutoDial.state=_BUSY;
		break;
	case 2:
		if(AutoDial.time!=0)break;
		Hangup();
		Dial(AutoDial.tel,AutoDial.tellen,FALSE,FALSE);
		AutoDial.state=_BUSY;
		break;
	}
	AutoDial.time++;
}

void Sleep_Gprs_Proc(void)
{
#ifdef DEBUG_AT
		Uart1Send("Sleep_Gprs_Proc 01");
#endif 

	if(alarm_flag&0xfe53 || gsmstatus.isupdate == TRUE) //added by leon 051021
	{
		Start_Timer(Sleep_Gprs_Timer,10,MINUTE);
		return;
	}
	if(ring.ack == 0 && gsmstatus.tel == _TEL_IDLE && AutoDial.state == _IDLE)
	{
#ifdef DEBUG_AT
		Uart1Send("Sleep_Gprs_Proc 02");
#endif 
		if(gsmstatus.gprsdata==TRUE)//lxo 113001 for 0x4208 error
		{//lxo 113002 for 0x4208 error
			SwitchToAtCmd();
			isgprsnoservice = 0;
			Start_Timer(Sleep_Gprs_Timer,3,SECOND);//lxo 113003 for 0x4208 error
		}//lxo 113004 for 0x4208 error
		else//lxo 113005 for 0x4208 error
		{//lxo 113006 for 0x4208 error
			gsmstatus.power  = _GPRS_POWER_OFF;
			Reset_Gprs();
		}//lxo 113007 for 0x4208 error
	}
	else
	{
		Start_Timer(Sleep_Gprs_Timer,2,MINUTE);
	}
}

void Init_Gprs_Data(void)
{
	Init_Gprs_Timer      = Create_Timer(Init_Gprs_Proc);
	Moniter_Timer        = Create_Timer(MonitorProc);
	Reset_Gprs_Timer     = Create_Timer(Reset_Gprs_Proc);
	Auto_Pickup_Timer    = Create_Timer(Auto_Pickup_Proc);
	Auto_TelTimer        = Create_Timer(Auto_DialProc);
	Sleep_Gprs_Timer     = Create_Timer(Sleep_Gprs_Proc);
	Gprs_Service_Timer   = Create_Timer(Gprs_Service_Proc);  //added by leon 050921

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -