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

📄 searchalarmerobj.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************
**                                                              *
**  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 + -