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

📄 rangepos.c

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