📄 blkwire.c
字号:
/**********************
BlkWire.c *
***********************/
#define BLKLINE_GLOBALS
#include "includes.h"
#include "bsp.h"
#include "structs.h"
#include "tools.h"
#include "timetask.h"
#include "LcdList.h"
#include "hstiodrv.h"
#include "flash.h"
#include "Printer.h"
#include "BlkSave.h"
#include "BlkSend.h"
#include "BlkQuery.h"
#include "BlkOpt.h"
#include "BlkWire.h"
#if EN_BLACKBOX >0
#define PILEOFFSET 0
TMR_TSK *BlkBoxWireInqueryTmrID;
static BLKWIREFRAME BlkWireFrame;
static INT8U ComRdSector;
static INT16U ComRdOffset;
#if PILEOFFSET
static INT8U Lat[4],Lg[4];
#endif
static void ConvertDataAndTime(INT8U *Result,BLKTIME *BlkTime)
{
*Result=0x00;
*Result |=((BlkTime->Date.TYear)<<4);
*Result|=BlkTime->Date.TMonth;
*++Result=0x00;
*Result|=((BlkTime->Date.TDay)<<3); //高5位
*Result|=((BlkTime->Time.THour)>>2);//低3位
*++Result=0x00;
*Result|=((BlkTime->Time.THour)<<6);
*Result|=(BlkTime->Time.TMinute);
}
//FLAG 校验码 类型 用户数据 FLAG
//用户数据==sendflag+GpsData
static void SendBlkWireData(INT8U Type)
{
INT8U Len;
BlkWireFrame.Flag=Type;
if(Type==0x01) Len=sizeof(BlkWireFrame);
else if(Type==0x02)
{
BlkWireFrame.GpsCount=0;
Len=2;
}
#if EN_LCD > 0
RequestSend_LCD(LCD_ATTR_COMMON,0X31,(INT8U *)&BlkWireFrame,Len,0);
#endif
#if EN_HSTIO > 0
SendMemFromHstIO(0x31, Len, (INT8U *)&BlkWireFrame);
#endif
}
static void ProcessBlkData(void)
{
INT8U Index=0;
SPARSEBLK *Blk;
Blk=(SPARSEBLK *)FlashAbsAddr(ComRdSector,ComRdOffset);
if(Blk->WRSuccess!=SUCCESS) return;
BlkWireFrame.GpsCount=GetSmall(Blk->GpsCount,MAXGPSNUM);
while(Index<(BlkWireFrame.GpsCount))
{
if(0==Index)
{
memcpy((INT8U*)BlkWireFrame.Interval,(INT8U*)Blk->Interval,sizeof(Blk->Interval));
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlk->BaseTime:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)Blk->BaseTime.Date.TYear,6);
#endif
ConvertDataAndTime(BlkWireFrame.DataTime,&Blk->BaseTime);
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlkWireFrame.DataTime:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,BlkWireFrame.DataTime,3);
#endif
memcpy((INT8U *)&BlkWireFrame.BaseDot,(INT8U*)&(Blk->BaseDot),sizeof(S_BASEGPS));
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBase Dot:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&BlkWireFrame,30);
#endif
#if PILEOFFSET
InitBuf(Lat,0,sizeof(Lat));
InitBuf(Lg,0,sizeof(Lg));
#endif
}
else
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlk->GpsDot:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&(Blk->GpsDot[Index-1]),sizeof(S_GPS));
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlkWireFrame.GpsOffsetDot:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&(BlkWireFrame.GpsOffsetDot[Index-1]),sizeof(S_GPS));
#endif
//与基准点的偏移量
#if PILEOFFSET
PileSOffSet(Lat,&Blk->GpsDot[Index-1].Vla_D);
PileSOffSet(Lg,&Blk->GpsDot[Index-1].Vlg_D);
BlkWireFrame.GpsOffsetDot[Index-1].Vla_D=Lat[0]|Lat[1];
BlkWireFrame.GpsOffsetDot[Index-1].Vla_C[0]=Lat[2];
BlkWireFrame.GpsOffsetDot[Index-1].Vla_C[1]=Lat[3];
BlkWireFrame.GpsOffsetDot[Index-1].Vlg_D=Lg[0]|Lg[1];
BlkWireFrame.GpsOffsetDot[Index-1].Vlg_C[0]=Lg[2];
BlkWireFrame.GpsOffsetDot[Index-1].Vlg_C[1]=Lg[3];
BlkWireFrame.GpsOffsetDot[Index-1].Vector=Blk->GpsDot[Index-1].Vector;
#else
memcpy(&BlkWireFrame.GpsOffsetDot[Index-1],&Blk->GpsDot[Index-1],sizeof(S_GPS));
#endif
}
Index++;
}
SendBlkWireData(0x01);
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlkWireFrame:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&BlkWireFrame,sizeof(BlkWireFrame));
#endif
}
static BOOLEAN GetNextBlkWireReadPara(void)
{
SPARSEBLK *Blk;
ComRdOffset+=BlkPara.Size;
if(ComRdOffset+BlkPara.Size>SIZE_FLASHSECTOR)
{
ComRdOffset=HEADOFFSET;
if(++ComRdSector>BlkPara.Top) ComRdSector=BlkPara.Bottom;
}
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n================ComRdSector:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&ComRdSector,1);
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n================ComRdOffset:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&ComRdOffset,2);
#endif
if((ComRdSector==BlkPara.BlkWr->WrSector) && (ComRdOffset==BlkPara.BlkWr->WrOffset)) {
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\n<ReadPtr == WritePtr>");
#endif
return FALSE;
} else {
Blk=(SPARSEBLK *)FlashAbsAddr(ComRdSector,ComRdOffset);
if(Blk->WRSuccess==SUCCESS) {
return TRUE;
} else {
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\n<WRSuccess!=SUCCESS>");
#endif
return FALSE;
}
}
}
static void BlkBoxWireInquery(void)
{
ProcessBlkData();
if(!GetNextBlkWireReadPara())
{
RemoveTmr(BlkBoxWireInqueryTmrID);
SendBlkWireData(0x02);
}
}
//dataPtr类型
void HdlMsgBlkBox21H(void)
{
ComRdSector=GetBlkReadSector();
ComRdOffset=HEADOFFSET;
BlkBoxWireInqueryTmrID=CreateTimer(BlkBoxWireInquery,0);
StartTmr(BlkBoxWireInqueryTmrID,MILTICK,20);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -