blkopt.c

来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 299 行

C
299
字号
#define BLKOPT_GLOBALS
#include "includes.h"
#include "uart_drv.h"
#include "structs.h"
#include "Printer.h"
#include "tools.h"
#include "Public.h"
#include "Flash.h"
#include "BlkSave.h"
#include "BlkQuery.h"
#include "BlkOpt.h"

#if EN_BLACKBOX > 0

static INT8U CDAY[]={31,28,31,30,31,30,31,31,30,31,30,31};
static INT8U Temp[4];
static TOTALGPS PreDot;
static INT16U Second,Minute,Temp16;
static INT8U CurDays;

//(TA In TB=SUBCLASS);
INT8U IsTimeOverLap(BLKTIME *TA1,BLKTIME *TA2,BLKTIME *TB1,BLKTIME *TB2)
{
   return RangeRelation((INT8U *)TA1,(INT8U *)TA2,(INT8U *)TB1,(INT8U *)TB2,sizeof(BLKTIME));
}

INT8U CmpSectorBootTime(BLKTIME *BeginTime,BLKTIME *EndTime,INT8U Sector)
{
   SectorBootStruct *Boot;

   Boot=(SectorBootStruct *)FlashAbsAddr(Sector,0);
   return IsTimeOverLap(&Boot->StartTime,&Boot->EndTime,BeginTime,EndTime);
}

BOOLEAN CmpGatherTime(BLKTIME *BeginTime,BLKTIME *EndTime,BLKTIME *Time)
{
   INT8U Result;

   Result=CmpString((INT8U *)BeginTime,(INT8U *)Time,sizeof(BLKTIME));
   if(Result==STR_GREAT) return FALSE;
   Result=CmpString((INT8U *)Time,(INT8U *)EndTime,sizeof(BLKTIME));
   if(Result==STR_GREAT) return FALSE;
   return TRUE;
}

INT8U CmpGpsRegion(TOTALGPS *Dot,GPS_REGION *Region)
{
   INT8U Result1,Result2;

   Result1=CmpString(Region->LeftLa,Dot->Latitude,4);
   Result2=CmpString(Region->LeftLg,Dot->Longitude,4);
   if(Result1==STR_GREAT||Result2==STR_GREAT) return FALSE;
   Result1=CmpString(Dot->Latitude,Region->RightLa,4);
   Result2=CmpString(Dot->Longitude,Region->RightLg,4);
   if(Result1==STR_GREAT||Result2==STR_GREAT) return FALSE;
   return TRUE;
}

void GetOffsetTime(BLKTIME *DestTime,BLKTIME *BaseTime,INT8U *Invertal,INT8U DotCount)
{
   Second=(*(Invertal+1))*DotCount;
   Minute=(*Invertal)*DotCount;
   memcpy((INT8U *)DestTime,(INT8U *)BaseTime,sizeof(BLKTIME));

   Temp16=DestTime->Time.TSecond+Second;
   Minute+=Temp16/60;
   DestTime->Time.TSecond=(Temp16%60);
   Temp16=DestTime->Time.TMinute+Minute;
   DestTime->Time.TMinute=Temp16%60;
   DestTime->Time.THour+=(Temp16/60);
   if(DestTime->Time.THour>=24)
     {
      DestTime->Time.THour-=24;
      CurDays=CDAY[DestTime->Date.TMonth-1];
      if((DestTime->Date.TMonth==2)&&(DestTime->Date.TMonth%4)==0) CurDays=29;
      if(++DestTime->Date.TDay>CurDays)
        {
	 DestTime->Date.TDay=1;
	 if(++DestTime->Date.TMonth>12)
	   {
	    DestTime->Date.TMonth=1;
	    DestTime->Date.TYear++;
	   }
	}
     }
}

static void CountSOffset(INT8U *Result,INT8U *Pre,INT8U *Offset)
{
   Temp[1]=(Offset[0]&0x7F)%60;
   Temp[0]=((Offset[0]&0x7F)-Temp[1])/60;
   Temp[2]=Offset[1];
   Temp[3]=Offset[2];
   if(Offset[0]&0x80) DecGpsData(Result,Pre,Temp);
   else AddGpsData(Result,Pre,Temp);
}

void GetOrgSGpsDot(TOTALGPS *ResultDot,TOTALGPS *Pre,S_GPS *OftGps)
{
   CountSOffset(ResultDot->Latitude,Pre->Latitude,(INT8U*)&OftGps->Vla_D);
   CountSOffset(ResultDot->Longitude,Pre->Longitude,(INT8U*)&OftGps->Vlg_D);
   ResultDot->Vector=OftGps->Vector;
}
/*
static void CountCOffset(INT8U *Result,INT8U *Pre,INT8U *Offset)
{
   Temp[1]=0;
   Temp[0]=0;
   Temp[2]=Offset[0]&0x7F;
   Temp[3]=Offset[1];
   if(Offset[0]&0x80) DecGpsData(Result,Pre,Temp);
   else AddGpsData(Result,Pre,Temp);
}

void GetOrgCGpsDot(TOTALGPS *ResultDot,TOTALGPS *Pre,C_GPS *OftGps)
{
   CountCOffset(ResultDot->Latitude,Pre->Latitude,(INT8U *)OftGps->Vla_C);
   CountCOffset(ResultDot->Longitude,Pre->Longitude,(INT8U *)OftGps->Vlg_C);
   ResultDot->Vector=OftGps->Vector;
   ResultDot->Direction=OftGps->Direction;
   ResultDot->Sensor=OftGps->Sensor;
} */

void ExtractGpsDot(TOTALGPS *Dot,BLKHEAD *Blk,INT8U Count)
{
   INT8U i,*Offset;

   if(Count>=MAXGPSNUM) return;
   memcpy((INT8U *)&Dot->DateTime,(INT8U *)&Blk->BaseTime,sizeof(BLKTIME));
   Offset=(INT8U *)Blk+sizeof(BLKHEAD);
   memcpy(Dot->Latitude,Offset,BlkPara.BaseSize);
   Offset+=BlkPara.BaseSize;
   for(i=0;i<Count;i++)
     {
        GetOrgSGpsDot(&PreDot,Dot,(S_GPS *)Offset);
        memcpy(Dot->Latitude,PreDot.Latitude,BlkPara.BaseSize);
     }
   GetOffsetTime(&Dot->DateTime,&Dot->DateTime,Blk->Interval,Count);
}

void ExtractAllGps(TOTALGPS *Dot,BLKHEAD *Blk)
{
   TOTALGPS *PreDot;
   INT8U i,*Offset;

   memcpy((INT8U *)&Dot->DateTime,(INT8U *)&Blk->BaseTime,sizeof(BLKTIME));
   Offset=(INT8U *)Blk+sizeof(BLKHEAD);
   memcpy(Dot->Latitude,Offset,BlkPara.BaseSize);
   Offset+=BlkPara.BaseSize;
   for(i=0;i<MAXGPSNUM-1;i++)
     {
      PreDot=Dot++;
      memcpy((INT8U *)&Dot->DateTime,(INT8U *)&PreDot->DateTime,sizeof(BLKTIME));
      GetOffsetTime(&Dot->DateTime,&Dot->DateTime,Blk->Interval,1);
      GetOrgSGpsDot(Dot,PreDot,(S_GPS *)Offset);
      Offset+=BlkPara.OffsetSize;
     }
}

//时间偏移量的计算Tm1-Tm2
BOOLEAN DecSysTime(INT8U *Result,BLKTIME *Tm1,BLKTIME *Tm2)
{
   INT8U DecResult,Carried;
   INT16U TempMin;

   if(CmpString((INT8U *)Tm1,(INT8U *)Tm2,3)==STR_GREAT) return FALSE; //隔天当作超过4小时
   if(Tm1->Time.TSecond<Tm2->Time.TSecond)
     {
      Result[1]=Tm1->Time.TSecond+60-Tm2->Time.TSecond;
      Carried=1;
     }
   else
     {
      Result[1]=Tm1->Time.TSecond-Tm2->Time.TSecond;
      Carried=0;
     }
   if(Tm1->Time.TMinute<(Tm2->Time.TMinute+Carried))
     {
      Result[0]=Tm1->Time.TMinute+60-Tm2->Time.TMinute-Carried;
      Carried=1;
     }
   else
     {
      Result[0]=Tm1->Time.TMinute-Tm2->Time.TMinute-Carried;
      Carried=0;
     }
   if(Tm1->Time.THour<(Tm2->Time.THour+Carried))
     {
      DecResult=Tm1->Time.THour+24-Tm2->Time.THour-Carried;
      Carried=1;
     }
   else
     {
      DecResult=Tm1->Time.THour-Tm2->Time.THour-Carried;
      Carried=0;
     }
   TempMin=Result[0]+DecResult*(INT16U)60;
   if(TempMin>0xFF) return FALSE;//超过最大范围
   Result[0]+=DecResult*60;
   return TRUE;
}

//gps偏移量的计算
void SBlkDotsOffset(INT8U *Lat,INT8U *Lon,TOTALGPS *SDot,TOTALGPS *DDot)
{
   BOOLEAN Carried;

   Carried=DecGpsData(Lat,SDot->Latitude,DDot->Latitude);
   Lat[1]+=Lat[0]*60;
   if(Carried) Lat[0]=0x01;
   else Lat[0]=0x00;
   Carried=DecGpsData(Lon,SDot->Longitude,DDot->Longitude);
   Lon[1]+=Lon[0]*60;
   if(Carried) Lon[0]=0x02;
   else Lon[0]=0x00;
}

void CBlkDotsOffset(INT8U *Lat,INT8U *Lon,TOTALGPS *SDot,TOTALGPS *DDot)
{
   BOOLEAN Carried;

   Carried=DecGpsData(Lat,SDot->Latitude,DDot->Latitude);
   if(Carried) Lat[0]=0x01;
   else Lat[0]=0x00;
   Carried=DecGpsData(Lon,SDot->Longitude,DDot->Longitude);
   if(Carried) Lon[0]=0x02;
   else Lon[0]=0x00;
}

INT8U PileOffSet(INT8U Carried1,INT8U *Data,INT8U Carried2,INT8U *Offset)
{
   INT8U Carried;

   if(Carried1)
	  {
      if(Carried2) //-A-B
        {
         AddGpsData(Data,Data,Offset);
         Carried=0x80;
        }
      else //-A+B
        {
         if(DecGpsData(Data,Offset,Data)) Carried=0x80;
         else Carried=0x00;
        }
	  }
	else //A-B
	  {
      if(Carried2)
        {
        	if(DecGpsData(Data,Data,Offset)) Carried=0x80;
        	else Carried=0x00;
        }
      else//A+B
        {
         AddGpsData(Data,Data,Offset);
         Carried=0x00;
        }
	  }
	return Carried;
}

//Data的格式:符号(1),分(1),小数分(2); 其中符号:0X00为正,0X80为负
//Offset的格式:整数分(1),小数分(2); Offset[0]的最高位为符号位;
void PileSOffSet(INT8U *Data,INT8U *Offset)
{
   INT8U Carried1,Carried2,Carried;

   Carried1=Data[0]&0x80;
   Data[0]&=0x7F;
   Carried2=Offset[0]&0x80;
   Temp[0]=((Offset[0]&0x7F)/60);
   Temp[1]=(Offset[0]&0x7F)%60;
   Temp[2]=Offset[1];
   Temp[3]=Offset[2];

   Carried=PileOffSet(Carried1,Data,Carried2,Temp);
   Data[0]|=Carried;
}

//Data的格式:符号(1),分(1),小数分(2); 其中符号:0X00为正,0X80为负
//Offset的格式:小数分(2); Offset[0]的最高位为符号位;
void PileCOffSet(INT8U *Data,INT8U *Offset)
{
   INT8U Carried1,Carried2,Carried;

   Carried1=Data[0]&0x80;
   Data[0]&=0x7F;
   Carried2=Offset[0]&0x80;
   Temp[0]=0;
   Temp[1]=0;
   Temp[2]=Offset[0]&0x7F;
   Temp[3]=Offset[1];

   Carried=PileOffSet(Carried1,Data,Carried2,Temp);
   Data[0]|=Carried;
}

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?