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 + -
显示快捷键?