📄 searchalarmerobj.c
字号:
/****************************************************************
** *
** FILE : SearchAlarmerObj.c *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : Cyb 2006.12.06 *
****************************************************************/
#include "includes.h"
#include "errcode.h"
#include "errtask.h"
#include "message.h"
#include "tools.h"
#include "public.h"
#include "timetask.h"
#include "sensor.h"
#include "almtask.h"
#include "alarmer.h"
#include "SearchAlarmerObj.h"
#include "GpsTool.h"
#include "flash.h"
#include "VtPos.h"
#include "AddObjDotManully.h"
#include "debug.h"
#include "portdrv.h"
#define DEBUG_ELECDOG 1
#define DEBUG_WITHOUTRADAR 0
#define MainSearchPeriod SECOND,3
#define AssiSearchPeriod SECOND,5
#define PULL_UP 0
#define PULL_DOWN 1
#define LEDPARA_GPSVALID PORT_LEDGREEN,10,10
#define LEDPARA_ALARM PORT_LEDRED, 1, 1
#define LEDPARA_WORKSTATE1 PORT_LEDRED, 20, 20
/*
********************************************************************************
* DEFINE GLOBAL WORKING STATE VARIABLES
********************************************************************************
*/
static INT32U CurStatus;
/*
********************************************************************************
* DEFINE GLOBAL VARIABLES
********************************************************************************
*/
static CROSSINGDOT_STR CrossingDot;
static ALARMEROBJ_STR AlarmerObject;
static D_ALARMEROBJ_STR RadarData;
static VECLMTZONE_STR VecLimtedZone;
static ROADATTRI_STR Roadattri;
static DATUM_STRUCT Gpsdata;
static DATUM_STRUCT Datum_gps;
static ALARMEROBJ_STR OtherEyeData;
static D_ALARMEROBJ_STR OtherRadar;
static CROSSINGDOT_STR crossingdot;
static ALARMEROBJ_STR Objectdata;
static D_ALARMEROBJ_STR radardata;
static VECLMTZONE_STR veclimtedzone;
static ALARMEROBJ_STR othereyedata;
static D_ALARMEROBJ_STR otherradar;
static INT16U CurRroadIndex;
static INT8U CurRroadID;
static INT16U Longzonesnums;
static INT8U Vecconv;
static INT16U Distance;
static INT8U MSGType;
static TMR_TSK *MainSearchTmr;
static TMR_TSK *AssiSearchTmr;
static BOOLEAN LedParaSet;
/*
********************************************************************************
* SAVE WORKING STATE
********************************************************************************
*/
static void SaveWorkingState(void)
{
memcpy((INT8U*)&RoadAttiPara.Rdatti,(INT8U*)&Roadattri,sizeof(ROADATTRI_STR));
WorkStatPara.status = CurStatus;
VirStorePubPara(ROADATTI_);
StorePubPara(WORKSTAT_);
}
/*
********************************************************************************
* RESUME WORKING STATE
********************************************************************************
*/
static void ResumeWorkingState(void)
{
memcpy((INT8U*)&Roadattri,(INT8U*)&RoadAttiPara.Rdatti,sizeof(ROADATTRI_STR));
CurStatus = WorkStatPara.status;
}
/*
********************************************************************************
* JUDGE MESSAGE TYPE
********************************************************************************
*/
void JudgeMSGType(INT8U *msgtype)
{
switch(RadarData.type)
{
case RADAR_SORT:
*msgtype = MSG_ELECDOG_RADARFOUND;
break;
case FREEWAY_EXIT:
*msgtype = MSG_ELECDOG_FREEWAYEXIT;
break;
case CROOKED_ROAD:
*msgtype = MSG_ELECDOG_CROOKEDFOUND;
break;
case TUNNEL:
*msgtype = MSG_ELECDOG_TUNNELFOUND;
break;
case DECLINE:
*msgtype = MSG_ELECDOG_DECLINEFOUND;
break;
case ASCENT:
*msgtype = MSG_ELECDOG_ASCENTFOUND;
break;
case SERVICE:
*msgtype = MSG_ELECDOG_SERVICEFOUND;
break;
case GAS_STATION:
*msgtype = MSG_ELECDOG_GASSTFOUND;
break;
case TOLL_GATE:
*msgtype = MSG_ELECDOG_TOLLGATEFOUND;
break;
default:
break;
}
}
/*
********************************************************************************
* LOCK LATTITUDE ZONE
********************************************************************************
*/
static INT16U LockLatZone(INT8U *lat)
{
INT16U i;
INT16U nums;
ZONE_STRUCT latzone;
ClearWatchdog();
ReadRecFromFlash(ZONE_LAT,0,0, (INT8U*)&nums);
ReadRecFromFlash(ZONE_LAT,0,8, (INT8U*)&latzone);
#if DEBUG_ELECDOG > 0
PrintFromUART(1, "\n纬度区间个数\n");
SendFromUART_HEX(1, (INT8U)nums);
#endif
for( i = 0 ; i<nums; i++)
{
if(CmpString(lat, latzone.downorleft, 4) == STR_GREAT)
{
if(CmpString(lat, latzone.uporright, 4) == STR_LESS)
{
return i;
}
ReadRecFromFlash(ZONE_LAT,i+1,8,(INT8U*)&latzone);
}
else
{
return 0xffff;
}
}
return 0xffff;
}
/*
********************************************************************************
* LOCK LONGTITUDE ZONE
********************************************************************************
*/
static INT16U LockLongtZone(INT8U *longt)
{
INT16U i;
INT16U nums;
ZONE_STRUCT longzone;
ClearWatchdog();
ReadRecFromFlash(ZONE_LONGT,0,0, (INT8U*)&nums);
Longzonesnums = nums;
ReadRecFromFlash(ZONE_LONGT,0,8, (INT8U*)&longzone);
#if DEBUG_ELECDOG > 0
PrintFromUART(1, "\n经度区间个数\n");
SendFromUART_HEX(1, (INT8U)nums);
#endif
for( i = 0; i<nums;i++)
{
if(CmpString(longt, longzone.downorleft, 4)==STR_GREAT)
{
if(CmpString(longt,longzone.uporright, 4)==STR_LESS)
{
return i;
}
ReadRecFromFlash(ZONE_LONGT,i+1,8, (INT8U*)&longzone);
}
else
{
return 0xffff;
}
}
return 0xffff;
}
/*
********************************************************************************
* GET THE ROAD ATTRIBUTE
********************************************************************************
*/
static void GetRoadAttri( ROADATTRI_STR *roadattri)
{
INT8U i;
INT16U dirs;
dirs = (Gpsdata.direction -1)*3;
for(i=0 ; i< CrossingDot.direc_nums ; i++)
{
if(dirs >= (CrossingDot.road[i].direction-10) && dirs <= (CrossingDot.road[i].direction+10))
{
memcpy((INT8U*)roadattri,(INT8U*)&(CrossingDot.road[i]),sizeof(ROADATTRI_STR));
}
}
}
/*
********************************************************************************
* GET THE ROAD ATTRIBUTE
********************************************************************************
*/
static void CheckCrossingAttri()
{
INT8U i;
INT16U dirs;
INT16U Cdirs;
dirs = (Gpsdata.direction -1)*3;
for ( i= 0; i< CrossingDot.direc_nums ; i++)
{
if (CrossingDot.road[i].direction<180)
{
Cdirs = CrossingDot.road[i].direction + 180;
}
else
{
Cdirs = CrossingDot.road[i].direction - 180;
}
if (dirs >= (Cdirs - 10) && dirs <= (Cdirs + 10))
{
if (CrossingDot.road[i].turnsts != 0xffff)
{
OSQPost(AlmTaskMsgQue, MSG_ELECDOG_TURNLIMIT, CrossingDot.road[i].turnsts, 0);
}
}
}
}
/*
********************************************************************************
* SEARCH CROSSING DOT IN A CERTAIN AREA
********************************************************************************
*/
static BOOLEAN AreaSearchCrossDot(CROSSINGDOT_STR *pcrossdot,INT16U index_lat, INT16U index_longt)
{
INT16U i;
INT16U index;
INT16U valid;
INT16U pos;
INT16U nums;
INT32U len_32;
OFFSET_STRUCT oft_cross;
len_32 = 0;
pos = 0;
nums = 0;
#if DEBUG_ELECDOG >0
PrintFromUART(1,"\n纬度区间序号:");
SendFromUART_HEX(1,(INT8U)index_lat);
PrintFromUART(1,"\n经度区间序号:");
SendFromUART_HEX(1,(INT8U)index_longt);
#endif
index = Longzonesnums * index_lat + index_longt;
ReadRecFromFlash(AREA_VALID,index,2,(INT8U*)&valid);
if ( valid != 0xffff)
{
ReadRecFromFlash(OFT_CROSSINGDOT,valid,4, (INT8U*)&oft_cross);
pos = oft_cross.pos;
nums = oft_cross.nums;
}
else
{
pos = 0xffff;
}
if( pos != 0xffff)
{
ReadRecFromFlash(DATA_CROSSDOT, pos,sizeof(CROSSINGDOT_STR),(INT8U*)&crossingdot);
}
for(i=0 ; i<nums; i++)
{
if(CurStatus & ISGETCROSSING)
{
break;
}
len_32 = CalculateGpsSpace(Gpsdata.latitude, Gpsdata.longitude, crossingdot.gpsdata.latitude, crossingdot.gpsdata.longitude);
#if DEBUG_ELECDOG >0
PrintFromUART(1,"\ni:");
SendFromUART_HEX(1,(INT8U)i);
PrintFromUART(1,"\nlen_32:");
SendFromUART_HEX(1,(INT8U)len_32);
SendFromUART_HEX(1,(INT8U)(len_32>>8));
SendFromUART_HEX(1,(INT8U)(len_32>>16));
SendFromUART_HEX(1,(INT8U)(len_32>>24));
#endif
if (len_32 < A_CROSSING_D)
{
if ( !(CurStatus & ISGETCROSSING))
{
CurStatus |=ISGETCROSSING ;
memcpy((INT8U*)pcrossdot,(INT8U*)&crossingdot,sizeof(CROSSINGDOT_STR));
CheckCrossingAttri();
break;
}
}
ReadRecFromFlash(DATA_CROSSDOT,++pos,sizeof(CROSSINGDOT_STR),(INT8U*)&crossingdot);
}
#if DEBUG_ELECDOG >0
PrintFromUART(1,"\n路口位置:");
SendFromUART_MEM_HEX(1,pcrossdot->gpsdata.latitude,8);
#endif
if (CurStatus & ISGETCROSSING)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -