📄 blksend.c
字号:
/*
=========================================================================
Description: Blk Send
Author: Zealea.Kuethy
change by qzc
=========================================================================
*/
#define BLKSEND_GLOBALS
#include "includes.h"
#include "uart_drv.h"
#include "structs.h"
#include "Public.h"
#include "Printer.h"
#include "tools.h"
#include "SysFrame.h"
#include "gprsdrv.h"
#include "Stream.h"
#include "Flash.h"
#include "timetask.h"
#include "BlkSave.h"
#include "BlkSend.h"
#include "BlkQuery.h"
#include "BlkOpt.h"
#if EN_BLACKBOX > 0
static TMR_TSK *BlkSendTmrId;
static SBlkFrameStruct SBlkFrame;
static TOTALGPS GpsAll[MAXGPSNUM];
//static INT8U Latitude[4],Longitude[4];
/*
static void AssembleDummy(QueryTblStruct *QTbl)
{
INT16U Offset16U;
BLKHEAD *Blk;
Offset16U=HEADOFFSET+QTbl->DummyDot.Frame*BlkPara.Size;
Blk=(BLKHEAD *)FlashAbsAddr(QTbl->DummyDot.Sector,Offset16U);
ExtractGpsDot(&GpsAll[0],Blk,QTbl->DummyDot.Offset);
//memcpy((INT8U *)&SBlkFrame.SBlkGps[0].BaseTime,(INT8U *)&GpsAll[0],sizeof(TOTALGPS)-2);
memcpy((INT8U *)&SBlkFrame.SBlkGps[0].BaseTime,(INT8U *)&GpsAll[0],sizeof(BLKTIME));
memcpy((INT8U *)&SBlkFrame.SBlkGps[0].BaseDot,(INT8U *)GpsAll[0].Latitude,sizeof(S_BASEGPS));
SBlkFrame.SBlkGps[0].HBit=0x40;
if(SBlkFrame.SBlkGps[0].BaseDot.Longitude[0]>=0x7F)
{
SBlkFrame.SBlkGps[0].BaseDot.Longitude[0]-=0x7F;
SBlkFrame.SBlkGps[0].HBit|=0x02;
}
//速度
if(SBlkFrame.SBlkGps[0].BaseDot.Vector>=0x7F)
{
SBlkFrame.SBlkGps[0].BaseDot.Vector-=0x7F;
SBlkFrame.SBlkGps[0].HBit|=0x01;
}
SBlkFrame.GpsCount=1;
}
*/
//从匹配表中取出点一个个发送出去
static BOOLEAN AssembleFrame(QueryTblStruct *QTbl)
{
INT8U i,Sector,Frame,Index=0;
INT16U Offset16U;
MATCH_GPS *MD;
BLKHEAD *Blk;
MD=&QTbl->MatchDots;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nSendDot:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&MD->TotalDots,2);
//Printu("SendDot:%x\r\n",MD->TotalDots);
#endif
if(MD->RdOffset==MD->TotalDots) return FALSE;
SBlkFrame.GpsCount=0;
while((Index<SENDING_DOTS)&&(MD->RdOffset<MD->TotalDots))
{
Sector=MD->MatchTbl[MD->RdOffset].Sector;
Frame=MD->MatchTbl[MD->RdOffset].Frame;
Offset16U=HEADOFFSET+Frame*BlkPara.Size;
Blk=(BLKHEAD *)FlashAbsAddr(Sector,Offset16U);
ExtractAllGps(GpsAll,Blk);
i=MD->MatchTbl[MD->RdOffset].Offset;
memcpy((INT8U *)&SBlkFrame.SBlkGps[Index].BaseTime,(INT8U *)&GpsAll[i],sizeof(BLKTIME));
memcpy((INT8U *)&SBlkFrame.SBlkGps[Index].BaseDot,(INT8U *)GpsAll[i].Latitude,sizeof(S_BASEGPS));
SBlkFrame.SBlkGps[Index].HBit=0x40;
if(SBlkFrame.SBlkGps[Index].BaseDot.Longitude[0]>=0x7F)
{
SBlkFrame.SBlkGps[Index].BaseDot.Longitude[0]-=0x7F;
SBlkFrame.SBlkGps[Index].HBit|=0x02;
}
//速度
if(SBlkFrame.SBlkGps[Index].BaseDot.Vector>=0x7F)
{
SBlkFrame.SBlkGps[Index].BaseDot.Vector-=0x7F;
SBlkFrame.SBlkGps[Index].HBit|=0x01;
}
MD->RdOffset++;
Index++;
SBlkFrame.GpsCount++;
}
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nSBLKFRAME信息:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&(SBlkFrame.GpsCount),sizeof(SBlkFrame));
//PrintString('x',(INT8U*)&(SBlkFrame.GpsCount),sizeof(SBlkFrame));
#endif
if(MD->RdOffset<MD->TotalDots) return TRUE;
return FALSE;
}
static INT8U GetFrameLen(INT8U OffsetNum)
{
INT8U Len;
if(SBlkFrame.GpsCount==0) return 0;
Len=1+sizeof(SBLKGPS)*OffsetNum;
return Len;
}
void Inform(INT8U Result)
{
if(Result!=SUCCESS)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n黑匣子数据发送失败");
#endif
}
else
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n黑匣子数据发送成功");
#endif
}
}
//单播:监控终端ID号10+应答类型1+当前帧序号1+当前帧点数1+GPS数据N。。。。
//匹配范围个数1+所有满足查询条件的点个数2
void SendPointCast(QueryTblStruct *QTbl)
{
INT8U Len=0,Temp, tellen;
BOOLEAN NeedAssambleMatchDot=0;
STREAM *BlkSend_Stream;
INT16U attrib;
BOOLEAN DummyProcess=0;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nSendPointCast");
#endif
BlkSend_Stream=GetSYSFrameStream();
ASMSYSFrameHead_MODE2(BlkSend_Stream,EgCode.egcode,0x0E60);
WriteDATA_Strm(BlkSend_Stream,QTbl->WatchId,MAXIDNUM);
if(QTbl->TotalMatchDot==0)
{
if((!QTbl->QueryTimeFlag)||(!QTbl->TimeLapFlag))
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n失败");
#endif
WriteBYTE_Strm(BlkSend_Stream,0x7F);
SBlkFrame.GpsCount=0;
Len=1;
QTbl->Status=IDLE;
}
else if(FRAMEERROR==(QTbl->FrameError))
{
WriteBYTE_Strm(BlkSend_Stream,0x03);
SBlkFrame.GpsCount=0;
Len=1;
QTbl->Status=IDLE;
}
else
{
/* WriteBYTE_Strm(BlkSend_Stream,0x02);
AssembleDummy(QTbl);
Len=GetFrameLen(SBlkFrame.GpsCount);
NeedAssambleMatchDot=TRUE;
QTbl->Status=IDLE;*/
DummyProcess=1;
WriteBYTE_Strm(BlkSend_Stream,0x02);
SBlkFrame.GpsCount=0;
Len=1;
QTbl->Status=IDLE;
}
}
else
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n查询成功");
#endif
if(!AssembleFrame(QTbl))
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n查询结束");
#endif
WriteBYTE_Strm(BlkSend_Stream,0x02);//查询结束
NeedAssambleMatchDot=TRUE;
QTbl->Status=IDLE;
}
else
{
WriteBYTE_Strm(BlkSend_Stream,0x01);//查询成功但未结束
}
Len=GetFrameLen(SBlkFrame.GpsCount);
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nLen=GetFrameLen:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&Len,1);
//Printu("Len=GetFrameLen:%x\r\n",Len);
#endif
}
if(DummyProcess) WriteBYTE_Strm(BlkSend_Stream,0x01);
else WriteBYTE_Strm(BlkSend_Stream,QTbl->SendCtr++);//current serial
WriteBYTE_Strm(BlkSend_Stream,SBlkFrame.GpsCount);//发送个数
WriteDATA_Strm(BlkSend_Stream,(INT8U *)&(SBlkFrame.GpsCount)+1,Len-1);//GPS数据
WriteBYTE_Strm(BlkSend_Stream,GetMatchRegionCnt(QTbl));//匹配范围个数
if(NeedAssambleMatchDot)
{
Temp=(QTbl->TotalMatchDot)%0x7E;
WriteBYTE_Strm(BlkSend_Stream,Temp);
Temp=(QTbl->TotalMatchDot)/0x7E;
WriteBYTE_Strm(BlkSend_Stream,Temp);
}
if (PubParaValid(ALARMTEL_)) {
tellen = AlarmTel.len;
} else {
tellen = 0;
}
attrib = GetServiceAttrib(SER_BLACKBOX);
SendSYSFrame_MODE2(BlkSend_Stream,AlarmTel.tel,tellen,SM_ATTR_SUCCESS|attrib,0);
}
void BlkSend(void)
{
INT8U i;
for(i=0;i<MAXQUERYTBL;i++)
{
if(QueryTbl[i].Status==WAITSEND)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nPointCast");
#endif
QueryTbl[i].Status=SENDING;
SendPointCast(&QueryTbl[i]);
return;
}
}
for(i=0;i<MAXQUERYTBL;i++)
{
if(QueryTbl[i].Status==SENDING)
{
SendPointCast(&QueryTbl[i]);
return;
}
}
}
void InitBlkSend(void)
{
BlkSendTmrId=CreateTimer(BlkSend,0);
StartTmr(BlkSendTmrId,SECOND,10);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -