📄 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 + -