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

📄 gps.c

📁 名厂车载GPS通信终端
💻 C
字号:
#define GPS_GLOBAL             1
#include "includes.h"

#pragma ROM MONTHS[]       
const uchar MONTHS[][12]={ 
	{31,28,31,30,31,30,31,31,30,31,30,31},
	{31,29,31,30,31,30,31,31,30,31,30,31}
};
#define POWER_ON              0x00
#define POWER_OFF             0x01                         
TIMER *Reset_Gps_Timer;
TIMER *Gps_Timer;
TIMER *Sleep_Gps_Timer;    
uchar gpslen;              
uchar *gpsptr;
uchar gpspower;
//=============================================================

void Power_OnGps(void)
{
	gps_data.wakestatus = _WAKE;
	gpspower            = POWER_ON;        
	GPS_ON              = VOL_LOW;
}

void Init_Gpsuart(void)
{   
	gpsuart.recvstep   = 0;
	gpsuart.bufnum     = 0;
	gpsuart.sendstatus = _IDLE;
	gpsuart.sendlen    = 0;
}

void Add1Second(void)
{
	handset_datetime.time.second += 1;
	if(handset_datetime.time.second>=60)
	{
		handset_datetime.time.second -=60;
		handset_datetime.time.minute ++;
		if(handset_datetime.time.minute>=60)
		{
			handset_datetime.time.minute -= 60;
			AddHour((uchar *)&handset_datetime.date.day,1);
		}
	}
}

void Add_Timer_Proc(void)
{ 
	Start_Timer(Gps_Timer,2,HMSEL); 
//	if(future.status==_BUSY)	//Removed by lxo 122821
	if(future.status==_BUSY&&GpsIsValid())//Modified by lxo 122822
	{
		if(!Cmp_Time((uchar *)(&(future.date.day))))
		{
#ifdef DEBUG_AT
			Uart1Send("FUTRUE START");
#endif 
			future.status = _IDLE;
			Send_Taskmsg(GprsTaskid,STARTFUTURE,NULL);
		}
	}
	if(gpspower == POWER_OFF)gpspostime = 0;         //暂时没有考虑中心开启gps长时间不定位的情况//

	if(GpsIsValid()&&(gpspower == POWER_ON))
	{
		return;
	}
	
	if(Second1Flag)
	{
#ifdef DEBUG_AT
	//	Uart1Send("NEED ADD TIME NOW");
#endif 
		Second1Flag = 0;
		Add1Second();
	}
}

void Sleep_Gps_Proc(void)
{
	GPS_ON   = VOL_HIGH;
	gpspower = POWER_OFF;
}

void Init_Gpsdata(void)
{
	//gps_data.wakestatus     = _WAKE;
	//gpspower                = POWER_ON;
//	   gps_data=gps_data_bak; //Removed by lxo 1229211 for gps data initialization
	gps_data.pre_workstatus = _NORMAL;
	gps_data.workstatus     = _NORMAL;
	if(ResetMemory!=0x5a)//Added lxo 122931 for gps data initialization
	{
		gps_data.flag           = _NORMAL;//Readd by lxo 1229212 for gps data initialization
		gps_data.date.year      = 05;//Readd by lxo 1229212 for gps data initialization
		gps_data.date.month     = 05;//Readd by lxo 1229212 for gps data initialization
		gps_data.date.day       = 24;//Readd by lxo 1229212 for gps data initialization
		gps_data.time.hour      = 1;//Readd by lxo 1229212 for gps data initialization
		gps_data.time.minute    = 1; //Readd by lxo 1229212 for gps data initialization
	}//Added lxo 122932 for gps data initialization
	gpspostime              = 0;
	Reset_Gps_Timer = Create_Timer(Reset_Gps_Proc);
	Gps_Timer       = Create_Timer(Add_Timer_Proc);
	Sleep_Gps_Timer = Create_Timer(Sleep_Gps_Proc);
	Start_Timer(Gps_Timer,3,SECOND);
}

void Init_Gps(void)
{
	Init_Gpsuart();
	Init_Gpsdata();
	Power_OnGps();
}

void Write_Gps(uchar *ptr,uchar len)
{
    uchar i;
	//  clr_watchdog();
    while(gpsuart.sendstatus==_BUSY)
    {
		//     clr_watchdog();
    }
    for(i=0; i<len; i++)
    {
        gpsuart.sendbuf[len-1-i] = ptr[i];
    }
    gpsuart.sendstatus = _BUSY;
    gpsuart.sendlen    = len-1;
    u0tb               = gpsuart.sendbuf[len-1];
}

void Reset_Gps(void)
{
	//gps_data.wakestatus = _SLEEP;
	gpspower = POWER_OFF;
	GPS_ON   = VOL_HIGH;
	Start_Timer(Reset_Gps_Timer,5,SECOND);
#ifdef DEBUG_AT
	Uart1Send("reset gps");
#endif 
}

void Reset_Gps_Proc(void)
{
#ifdef DEBUG_AT
	Uart1Send("RESET GPS FINISH");
#endif
	gpspower            = POWER_ON;
	//gps_data.wakestatus = _WAKE;
	GPS_ON              = VOL_LOW;
	Init_Gpsuart();
}

void Sleep_Gps(void)
{
	if(gps_data.wakestatus!=_SLEEP)
	{
#ifdef DEBUG_AT
		Uart1Send("SLEEP GPS");
#endif
		gps_data.wakestatus = _SLEEP;
		
		Start_Timer(Sleep_Gps_Timer,60,SECOND);
		//GPS_ON              = VOL_HIGH;
	}
}

void Wake_Gps(void)
{
	if(gps_data.wakestatus!=_WAKE)
	{
#ifdef DEBUG_SLEEP
		Uart1Send("WAKE GPS");
#endif
		Stop_Timer(Sleep_Gps_Timer);
		gps_data.wakestatus = _WAKE;
		gpspower            = POWER_ON;
		GPS_ON              = VOL_LOW;
    }
}

uchar Get_Gps_Wakestatus(void)
{
	return gps_data.wakestatus;
}

void Get_Latitude(void)
{
	uchar pos,pos1;
	
	pos  = Find_Pos(gpsptr,gpslen,',',3);
	pos1 = Find_Pos(gpsptr,gpslen,',',4);
	if((pos1-pos)>1&&GpsIsValid())
	{
		gps_data.latitude = ((dword)Str2Hex(&gpsptr[pos+1],2))*3600000L+\
			((dword)Str2Hex(&gpsptr[pos+3],2))*60000L+\
			((dword)Str2Hex(&gpsptr[pos+6],2))*600L+\
			((dword)Str2Hex(&gpsptr[pos+8],2))*6L;
		if(gpsptr[pos1+1]=='N')
		{
			Set_Char_Bit(&gps_data.flag,_BIT_LAT);;
		}
		else if(gpsptr[pos1+1]=='S')
		{
			Clr_Char_Bit(&gps_data.flag,_BIT_LAT);
		}                     
	}
}

void Get_Valid(void)
{
	uchar pos;
	
	pos = Find_Pos(gpsptr,gpslen,',',2)+1;
	if(gpsptr[pos]=='A')
	{
#ifdef DEBUG_GPS
		Uart1Send("recv a gps valid");
#endif
		gpspostime     = 0;
		Second1Flag    = 0;
		Set_Char_Bit(&gps_data.flag,_BIT_VALID); 
	}
	else if(gpsptr[pos]=='V')
	{
#ifdef DEBUG_GPS
		Uart1Send("recv a gps invalid");
#endif
		//gps_data.flag &= ~0x04;
		Clr_Char_Bit(&gps_data.flag,_BIT_VALID);
	}
}

void AddHour(uchar *ptr,uchar hour)
{
	DATE *dateptr;
	TIME *timeptr;
	uchar yunyear;
	
	dateptr = (DATE *) ptr;
	timeptr = (TIME *) (ptr+3);
	
	timeptr->hour +=hour;
	if((timeptr->hour) >=24)
	{
		timeptr->hour -= 24;
		//exceed 24 hours , so add one day
		if(dateptr->month==12&&dateptr->day==31)  // the last day of the year 
		{
			dateptr->year  = (dateptr->year + 1) % 100;
			dateptr->month = 1;
			dateptr->day   = 1;
		}
		else
		{
			yunyear = 0;
			if(dateptr->year!=0&&((dateptr->year%4)==0))          //润年//
			{
				yunyear = 1;
			}
			
			if(dateptr->day==MONTHS[yunyear][dateptr->month-1])   //the last day of month//
			{
				dateptr->day    = 1;
				dateptr->month += 1;
			}
			else{
				dateptr->day   += 1;}
		}
	}
	
}

uchar Cmp_Time(uchar *ptr)
{
	DATE *dateptr;
	TIME *timeptr;
	
	dateptr = (DATE *) ptr;
	timeptr = (TIME *) (ptr+3);
	if(dateptr->year < gps_data.date.year)
	{
		return FALSE;
	}
	else if(dateptr->year > gps_data.date.year)
	{
		return TRUE;
	}
	else {
		if(dateptr->month >gps_data.date.month){
			return TRUE;
		}
		else if(dateptr->month <gps_data.date.month){
			return FALSE;
		}
		else{
			if(dateptr->day <gps_data.date.day){
				return FALSE;
			}
			else if(dateptr->day >gps_data.date.day){
				return TRUE;
			}
			else {
				if(timeptr->hour > gps_data.time.hour){
					return TRUE;
				}
				else if(timeptr->hour < gps_data.time.hour){
					return FALSE;
				}
				else
				{
					if(timeptr->minute > gps_data.time.minute)
					{
						return TRUE;
					}
					else if(timeptr->minute < gps_data.time.minute)
					{
						return FALSE;
					}
					else{
						if(timeptr->second >gps_data.time.second){
							return TRUE;
						}
						else{
							return FALSE;
						}
					}
				}
			}
		}
	}
}

void Get_Time(void)
{
	uchar pos;
	uchar yunyear;
	
	if(!GpsIsValid())
	{
		return;
	}
	pos = Find_Pos(gpsptr,gpslen,',',1);
	
	gps_data.time.hour    = Str2Hex(&gpsptr[pos+1],2);
	gps_data.time.minute  = Str2Hex(&gpsptr[pos+3],2);
	gps_data.time.second  = Str2Hex(&gpsptr[pos+5],2);
	
	pos = Find_Pos(gpsptr,gpslen,',',9);
	
	gps_data.date.day     = Str2Hex(&gpsptr[pos+1],2);
	gps_data.date.month   = Str2Hex(&gpsptr[pos+3],2);
	gps_data.date.year    = Str2Hex(&gpsptr[pos+5],2);

	handset_datetime.date.day     = gps_data.date.day;
	handset_datetime.date.month   = gps_data.date.month;
	handset_datetime.date.year    = gps_data.date.year;
	handset_datetime.time.hour    = gps_data.time.hour;
	handset_datetime.time.minute  = gps_data.time.minute;
	handset_datetime.time.second  = gps_data.time.second;
}

void Get_Longitude(void)
{
	uchar pos,pos1;
	
	pos  = Find_Pos(gpsptr,gpslen,',',5);
	pos1 = Find_Pos(gpsptr,gpslen,',',6);
	if((pos1-pos)>1&&GpsIsValid())
	{
		gps_data.longitude = ((dword)Str2Hex(&gpsptr[pos+1],3))*3600000L+\
			((dword)Str2Hex(&gpsptr[pos+4],2))*60000L+\
			((dword)Str2Hex(&gpsptr[pos+7],2))*600L+\
			((dword)Str2Hex(&gpsptr[pos+9],2))*6L;
		if(gpsptr[pos1+1]=='E')
		{
			Set_Char_Bit(&gps_data.flag,_BIT_LONG);
			//gps_data.flag |= _EAST;
		}
		else if(gpsptr[pos1+1]=='W')
		{
			Clr_Char_Bit(&gps_data.flag,_BIT_LONG);
			//        gps_data.flag &= ~_EAST;
		}                     
	}
}

void Get_Speed(void)
{
	uchar pos,pos1,pos2;
	uint  speed;
	uchar i;
	static uchar overspeed_count=0;   //added by leon 
	speed = 0;
	pos  = Find_Pos(gpsptr,gpslen,',',7);
	pos1 = Find_Pos(gpsptr,gpslen,',',8);
	if((pos1-pos)>1&&GpsIsValid())
	{
		pos2 = Find_Pos(&gpsptr[pos],pos1-pos,'.',1);//没有找到.//
		if((pos+pos2)>=pos1)
		{
			for(i=pos+1; i<pos1; i++)                 //放大10倍//
			{
				speed += gpsptr[i]-'0';
				speed *= 10;
			}
		}
		else
		{
			for(i=pos+1; i<pos+pos2; i++)
			{
				speed += gpsptr[i]-'0';
				speed *= 10;
			}
			speed += gpsptr[pos+pos2+1]-'0';
		}
		gps_data.speed =(uint)((dword)(speed*36)/7);   //1852)/360);
		if(gps_data.speed > save.basevalue.max_speed)  //added by leon 
		{ 
			overspeed_count++;
			if(overspeed_count<0xff)  overspeed_count++;
			if(overspeed_count == 30)
			{
				Set_Word_Bit(&alarm_flag,_OVERSPEED_ALM);
				Send_Taskmsg(AlarmTaskid,STATUSCHANGE,NULL);
			}
		}
		else
		{
			overspeed_count = 0;
			alarm_remove(_OVERSPEED_ALM);
		}
	}
	if(port[_ACC].status==0) //Added by lxo 0228011
		gps_data.speed = 0;//Added by lxo 0228012
}

void Get_Course(void)
{
	uchar pos,pos1,pos2;
	uint  course;
	uchar i;
	
	course = 0;
	pos  = Find_Pos(gpsptr,gpslen,',',8);
	pos1 = Find_Pos(gpsptr,gpslen,',',9);
	if((pos1-pos)>1&&GpsIsValid())
	{
		pos2 = Find_Pos(&gpsptr[pos],pos1-pos,'.',1);   //没有找到.
		if((pos+pos2)>=pos1)
		{
			for(i=pos+1; i<pos1; i++)                   //放大10倍
			{
				course += gpsptr[i]-'0';
				course *= 10;
			}
		}
		else
		{
			for(i=pos+1; i<pos+pos2; i++)
			{
				course += gpsptr[i]-'0';
				course *= 10;
			}
			course += gpsptr[pos+pos2+1]-'0';
		}
		gps_data.course = course;
	}
}

uchar GpsIsValid(void)
{
	return(Get_Char_Bit(&gps_data.flag,_BIT_VALID));
}
void FixedDistanceHandle(void)//add by lxo 122626//Adjusted by lxo 122713 
{
	FixedDistanceTemp+=gps_data.speed;
//	if(gsc.Gprs_Simcard_bits.isconnecting == 1 || gsmstatus.isupdate == TRUE || ring.ack!=0)
//	{	
//			return;
//	}
//	if(gsmstatus.gprsdata == TRUE&&FixedDistanceTemp>=FixedDistance)
	if(FixedDistanceTemp>=FixedDistance)
	{
#ifdef DEBUG_AT
		Uart1Send("IN FixedDistanceHandle");
#endif
		FixedDistanceTemp=0x00;
		if(gsc.Gprs_Simcard_bits.isconnecting != 1 || gsmstatus.isupdate != TRUE || ring.ack==0)
		{	
			 if(gsmstatus.gprsdata == TRUE)
			{
				Send_Gpsdata(0x0142,_SMS_COMMON,0);
			}
//Added by lxo 06081115 for none-signal-region-supplement condition compile
#if SUPPLEMENT == SUPPLEMENTENABLE
			else
				InformationSave(0x0142,_SMS_COMMON,0);
#endif				
		}
		if(FixedDistance_times<255&&FixedDistance_times>0)
			FixedDistance_times--;
		if(FixedDistance_times==0)
			ParaSet.FixedDistanceReport=0;			
	}
}
void Get_Gpsdata(void)
{
	gpslen = Current_Tskmsg->msgptr[0];
	gpsptr = &Current_Tskmsg->msgptr[1];
	Get_Valid();
	Get_Course();
	Get_Speed();
	Get_Longitude();
	Get_Time();
	Get_Latitude();
	JudgeSimCardArea();
    //Remove by lxo 06081121 
   	//gps_data_bak=gps_data;
//	if(ParaSet.FixedDistanceReport)//add by lxo 122627//Removed by lxo 122811
	if(ParaSet.FixedDistanceReport&&GpsIsValid())//Modified by lxo 122812
		FixedDistanceHandle();   
}

uchar IsGpsWireOpen(void)
{
	if(gps_data.workstatus&_OPEN)
	{
		return TRUE; 
	}
	return FALSE;
}

uchar IsGpsWireClose(void)
{
	if(gps_data.workstatus&_SHORT)
	{
		return TRUE;
	}
	return FALSE;
}

uchar IsGpsLongInvalid(void)
{
	if(gps_data.workstatus&_NVALID)
	{
		return TRUE;
	}
	return FALSE;
}

void Recv_Gps(void)
{
	uchar len;
	uchar *ptr;
	uchar pos;
	uchar temp;
	
	len = Current_Tskmsg->msgptr[0];
	//Current_Tskmsg->msgptr++;
	ptr = &Current_Tskmsg->msgptr[1];
#ifdef DEBUG_GPS
	hand_send(ptr,len);
#endif
	if(Str_Cmp(ptr,"RMC,",4))
	{
		Get_Gpsdata();
	}
	else if(Str_Cmp(ptr,"TXT,",4))
	{
		if(Str_Find(ptr,len,"OK"))
		{
			gps_data.workstatus  &= ~0x06;    //GPS 天线正常
		}
		else if(Str_Find(ptr,len,"OPEN"))
		{
#ifdef DEBUG_GPS
			Uart1Send("gps Open!"); 
#endif
			gps_data.workstatus  |= _OPEN;
			gps_data.workstatus  &= ~_SHORT;
		}
		else if(Str_Find(ptr,len,"SHORT"))
		{
#ifdef DEBUG_GPS
			Uart1Send("gps Short!");
#endif
			gps_data.workstatus  |= _SHORT;
			gps_data.workstatus  &= ~_OPEN;
		}
	}
	else if(Str_Cmp(ptr,"GSA,",4))        //取卫星数和有效标志 //
	{
		pos = Find_Pos(ptr,len,',',2);
		if(ptr[pos+1]>'0'&&ptr[pos+1]<'9')
			temp          = (ptr[pos+1]-'0')&0x0f;
		if(temp==3)                       //3d定位//
		{
			if(Get_Char_Bit(&gps_data.flag,_BIT_VALID))
				Set_Char_Bit(&gps_data.flag,_BIT_3D);
		}
		else if(temp ==2)                 //2d定位//
		{
			Clr_Char_Bit(&gps_data.flag,_BIT_3D);
		}
		
		pos = Find_Pos(ptr,len,',',3);
		temp          = (Find_Pos(ptr,len,',',15)-pos-12)/2;
		gps_data.flag |= (temp<<4)&0xf0;
	}
#ifdef DEBUG_GPS
	Uart1Send("gps work status is:");
	Uart1Word(gps_data.workstatus);
	Uart1Word(gps_data.pre_workstatus);
#endif

	
	if(gpspostime>1440)  //modified by leon from 4 hours(240) to 24 hours(1440)
	{
		gps_data.workstatus |=_NVALID;
	}
	else
	{
		gps_data.workstatus &=~_NVALID;
	}
	if(gps_data.workstatus!=gps_data.pre_workstatus)
	{
		if(gps_data.workstatus!=_NORMAL)
		{
			Set_Word_Bit(&alarm_flag,_GPSEER_ALM);
			Send_Taskmsg(AlarmTaskid,STATUSCHANGE,NULL);
#ifdef DEBUG_GPS
			Uart1Send("gps alarm");
			Uart1Word(gps_data.workstatus);
			Uart1Word(gps_data.pre_workstatus);
#endif
		}
		else    //added by leon 050912
			alarm_remove(_GPSEER_ALM);	
		gps_data.pre_workstatus = gps_data.workstatus;
	}
}

⌨️ 快捷键说明

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