📄 gprs.c
字号:
#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 + -