📄 rangepos.c
字号:
/***************************
* RangePos.c ZTL *
***************************/
#define RANGEPOS_GLOBALS
#include "includes.h"
#include "bsp.h"
#include "Tools.h"
#include "timetask.h"
#include "Public.h"
#include "GpsRecer.h"
#include "Position.h"
#include "RangePos.h"
#include "printer.h"
#define RANGEPOS_DEBUG 0
#define UseGpsValid_DEBUG 1
#define RANGSINGLE 0
static TMR_TSK *RCheckTmrID;
#define RCheckPeriod SECOND,2
static DATUM_STRUCT CurDot;
static BOOLEAN CmpGps(RangeAreatStruct *Range)
{
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"Left:");
FormatPrintDataBlock(0,1,Range->LeftLa,4);
FormatPrintDataBlock(0,1,Range->LeftLg,4);
FormatPrintDataBlock(0,1,CurDot.latitude,4);
FormatPrintDataBlock(0,1,CurDot.longitude,4);
SendFromUART_STR(1,(INT8U *)"Right:");
FormatPrintDataBlock(0,1,Range->RightLa,4);
FormatPrintDataBlock(0,1,Range->RightLg,4);
#endif
if(CmpString(Range->LeftLa,CurDot.latitude,4)==STR_GREAT) return FALSE;
if(CmpString(Range->LeftLg,CurDot.longitude,4)==STR_GREAT) return FALSE;
if(CmpString(CurDot.latitude,Range->RightLa,4)==STR_GREAT) return FALSE;
if(CmpString(CurDot.longitude,Range->RightLg,4)==STR_GREAT) return FALSE;
return TRUE;
}
static INT8U CheckArea(void)
{
INT8U i;
BOOLEAN Result;
RangeAreatStruct *Range;
GetDatumData(&CurDot);
for(i=0;i<MAX_RANGEPOS;i++)
{
Range=&RangePosPara.RPara[i];
//Type:Bit7,Bit6,Bit5,Bit4,Bit3,Bit2,Bit1,Bit0
//Bit6:有效位 0:无效;1:有效
//Bit5,Bit4:表示当前车与该区域的关系 00:无效;01:区域外;10:区域内
//Bit1,Bit0:表示该区域的属性 01:进入;10:离开
if((Range->Type&0x40)!=0x40) continue;
#if UseGpsValid_DEBUG
if(!GpsDataValid()){
CurDot.latitude[0]=0;
CurDot.latitude[1]=0;
CurDot.latitude[2]=0;
CurDot.latitude[3]=0;
CurDot.longitude[0]=0;
CurDot.longitude[1]=0;
CurDot.longitude[2]=0;
CurDot.longitude[3]=0;
}
#endif
Result=CmpGps(Range);
#if RANGEPOS_DEBUG
if(Result) SendFromUART_STR(1,(INT8U *)"Result 区域内!");
else SendFromUART_STR(1,(INT8U *)"Result 区域外!");
#endif
if((Range->Type&0x30)==0)//刚设置或刚启动
{
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"刚设置或刚启动!");
#endif
if(Result) Range->Type|=0x20;//区域内
else Range->Type|=0x10; //区域外
VirStorePubPara(RANGEPARA_);
break;
}
else if((Range->Type&0x30)==0x20)//区域内
{
if(!Result)
{
Range->Type&=0xCF;
Range->Type|=0x10;//区域外
VirStorePubPara(RANGEPARA_);
if((Range->Type&0x03)==0x03) return i;//区域属性为离开报警
}
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"-----区域内!----");
#endif
}
else if((Range->Type&0x30)==0x10)//区域外
{
if(Result)
{
Range->Type&=0xCF;
Range->Type|=0x20;//区域内
VirStorePubPara(RANGEPARA_);
if((Range->Type&0x03)==0x01) return i;//区域属性为进入报警
}
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"-----区域外!------");
#endif
}
}
return 0xFF;
}
static void AddGps(INT8U *Data,INT8U *Data1,INT8U *Data2)
{
BOOLEAN Carried;
Data[3]=Data1[3]+Data2[3];
if(Data[3]>=100) Carried=TRUE,Data[3]-=100;
else Carried=FALSE;
Data[2]=Data1[2]+Data2[2]+(INT8U)(Carried);
if(Data[2]>=100) Carried=TRUE,Data[2]-=100;
else Carried=FALSE;
Data[1]=Data1[1]+Data2[1]+(INT8U)Carried;
if(Data[1]>=60) Carried=TRUE,Data[1]-=60;
else Carried=FALSE;
Data[0]=Data1[0]+Data2[0]+(INT8U)Carried;
}
static void RecvRangeTerm(INT8U Index,INT8U *ParaSetPtr)
{
INT8U *Lg,*La;
RangeAreatStruct *Range;
Range=&RangePosPara.RPara[Index];
Range->Type=*ParaSetPtr&0x43; //01000011:BIT6代表该编号的区域有设置,BIT1BIT0代表区域属性
memcpy(&Range->LeftLg,ParaSetPtr+9,4);
if((*(ParaSetPtr+1))&0x20) Range->LeftLg[0]+=0x80;
memcpy(&Range->LeftLa,ParaSetPtr+13,4);
Lg=ParaSetPtr+1,(*Lg)&=0x1F;
La=ParaSetPtr+5,(*La)&=0x1F;
AddGps((INT8U *)&Range->RightLg,(INT8U *)&Range->LeftLg,Lg);
AddGps((INT8U *)&Range->RightLa,(INT8U *)&Range->LeftLa,La);
}
static void RCheckTmr(void)
{
INT8U Index;
StartTmr(RCheckTmrID,RCheckPeriod);
if(RangePosPara.Status!=OPEN) return;
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"RCheckTmr");
#endif
#if RANGEPOS_DEBUG
#else
//if(!GpsDataValid()) return;
#endif
Index=CheckArea();
#if RANGSINGLE
if(Index!=0xFF)
{
if(RangePosPreResult==FALSE)
{
SendPositionData(POSITION_RANGE,Index);
RangePosPreResult=TRUE;
}
}
else
{
if(RangePosPreResult)
{
RangePosPreResult=FALSE;
}
}
#else
if(Index!=0xFF) SendPositionData(POSITION_RANGE,Index);
#endif
}
BOOLEAN CheckRange(INT8U Node)
{
RangeAreatStruct *Range;
if(!GpsDataValid()) return FALSE;
Range=&RangePosPara.RPara[Node];
if(CmpGps(Range)){
return TRUE;
}
else return FALSE;
}
void RangePosInit(void)
{
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"RangePosInit");
#endif
RCheckTmrID=CreateTimer(RCheckTmr,0);
if(((RangePosPara.Status!=OPEN)&&(RangePosPara.Status!=CLOSE))
||(!PubParaValid(RANGEPARA_)))
RangePosParaClear();
StartTmr(RCheckTmrID,RCheckPeriod);
}
INT8U RangePosParaSet(INT8U *ParaSetPtr)
{
INT8U CurTag;
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"RangePosParaSet");
#endif
if(*ParaSetPtr==0)*ParaSetPtr=0x7F;
if(*(ParaSetPtr+1)==0)*(ParaSetPtr+1)=0x7F;
CurTag=(*ParaSetPtr&0x3C)>>2; //01NNNNAA: NNNN:区域编号;AA:定位属性
RecvRangeTerm(CurTag,ParaSetPtr);
VirStorePubPara(RANGEPARA_);
return sizeof(RangeTermStruct);
}
void RangePosParaClear(void)
{
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"RangePosParaClear");
#endif
ClearPubPara(RANGEPARA_);
RangePosPara.Status=CLOSE;
StorePubPara(RANGEPARA_);
}
void RangePosStart(void)
{
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"RangePosStart");
#endif
RangePosPara.Status=OPEN;
VirStorePubPara(RANGEPARA_);
}
void RangePosStop(void)
{
#if RANGEPOS_DEBUG
SendFromUART_STR(1,(INT8U *)"RangePosStop");
#endif
RangePosPara.Status=CLOSE;
VirStorePubPara(RANGEPARA_);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -