📄 blkquery.c
字号:
/*
========================================================================
Description: BlkQuery.c
Author: Zealea.Kuethy
change by qzc
Date: 2003.8.11
========================================================================
*/
#define BLKQUERY_GLOBALS
#include "includes.h"
#include "uart_drv.h"
#include "structs.h"
#include "Public.h"
#include "Printer.h"
#include "TimeTask.h"
#include "tools.h"
#include "Flash.h"
#include "BlkSave.h"
#include "BlkQuery.h"
#include "BlkOpt.h"
#include "BlkSend.h"
#if EN_BLACKBOX > 0
#if DEBUG_UARTNo_BlkBOX<=3
//static INT8U ShowData[10];
#endif
#define QUERYDELAY 600
static BlkRdStruct *Read;
static BLKTIME LastDotTm;
static TOTALGPS AllDots[MAXGPSNUM];
static QUERYTERM TERM;
static TMR_TSK *BlkqueryTmrId;
static void ResetAreaMatchFlag(QueryTblStruct *QTbl)
{
QTbl->TotalRegion=0;
InitBuf(QTbl->Area.MatchFlag,0,MAXFLAG);
}
static void InitQueryTbl(QueryTblStruct *QTbl)
{
QTbl->TotalRegion=0;
QTbl->MatchRegion=0;
QTbl->Status=IDLE;
QTbl->TimeCount=0;
QTbl->QueryTimeFlag=FALSE;
QTbl->TimeSynch=FALSE;
QTbl->TimeLapFlag=FALSE;
QTbl->TotalMatchDot=0;
QTbl->MatchDots.TotalDots=0;
QTbl->MatchDots.RdOffset=0;
QTbl->SendCtr=0;
QTbl->FrameError=0;
QTbl->TotoalTimeTerm=0;
ResetAreaMatchFlag(QTbl);
}
#if DEBUG_UARTNo_BlkBOX <= 3
#define BUFSIZE 128
static INT8U data[BUFSIZE];
static void DebugStruct(void)
{
INT16U templen,i;
QUERYTERM *queryTermPtr;
templen = sizeof(QUERYTERM);
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\nsizeof(QUERYTERM)=");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&templen,2);
templen = sizeof(QueryTblStruct);
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\nsizeof(QueryTblStruct)=");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&templen,2);
for (i=0;i<sizeof(QUERYTERM);i++) {
data[i] = i;
}
queryTermPtr = (QUERYTERM *)data;
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\nqueryTermPtr=");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)queryTermPtr,sizeof(QUERYTERM));
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\nqueryTermPtr->TERMSTRUCT=");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&(queryTermPtr->TermStruct.TermLen),sizeof(TERMSTRUCT));
PrintFromUART(DEBUG_UARTNo_BlkBOX, "\nqueryTermPtr->TermCount=");
SendFromUART_HEX(DEBUG_UARTNo_BlkBOX, queryTermPtr->TermCount);
}
#endif
void InitBlkQuery(void)
{
INT8U i;
#if DEBUG_UARTNo_BlkBOX <= 3
DebugStruct();
#endif
BlkqueryTmrId=CreateTimer(BlkQuery,0);
for(i=0;i<MAXQUERYTBL;i++) InitQueryTbl(&QueryTbl[i]);
StartTmr(BlkqueryTmrId,MILTICK,5);
}
static QueryTblStruct *GetIdleQueryTbl(void)
{
INT8U i;
for(i=0;i<MAXQUERYTBL;i++)
{
if(QueryTbl[i].Status==IDLE) return &QueryTbl[i];
}
return 0;
}
static QueryTblStruct *SearchQTbl(INT8U *Id,INT8U Status)
{
INT8U i;
for(i=0;i<MAXQUERYTBL;i++)
{
if(QueryTbl[i].Status&Status)
{
if(CmpData(QueryTbl[i].WatchId,Id,MAXIDNUM,MAXIDNUM)==STR_EQUAL) return &QueryTbl[i];
}
}
return 0;
}
static QueryTblStruct *CheckQueryTblID(INT8U *Id)
{
INT8U i;
for(i=0;i<MAXQUERYTBL;i++)
{
if(CmpData(QueryTbl[i].WatchId,Id,MAXIDNUM,MAXIDNUM)==STR_EQUAL) return &QueryTbl[i];
}
return 0;
}
static BOOLEAN CheckQueryStatut(QueryTblStruct *QTbl,INT8U Status)
{
if((QTbl->Status)&Status) return TRUE;
else return FALSE;
}
static void SaveQueryTerm(QueryTblStruct *QTbl,QUERYTERM *Term)
{
INT8U *Ptr;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nSaveQueryTerm");
#endif
QTbl->TotalFrame=Term->TotalFrame;
QTbl->MaxSendDot=(Term->MaxSendDot)*SENDING_DOTS;
Ptr=Term->TermStruct.TermPtr;
Term->TermCount=Term->TermStruct.TimeTermCount+Term->TermStruct.RangeTermCount;
Ptr=++(Term->TermStruct.TermPtr);
while((Term->TermStruct.TimeTermCount--)>0)
{
QTbl->QueryTimeFlag=TRUE;
memcpy((INT8U*)&QTbl->BTime[QTbl->TotoalTimeTerm],Ptr,sizeof(BLKTIME)-1);
QTbl->BTime[QTbl->TotoalTimeTerm].Time.TSecond=0x00;
Ptr+=(sizeof(BLKTIME)-1);
memcpy((INT8U *)&QTbl->ETime[QTbl->TotoalTimeTerm],Ptr,sizeof(BLKTIME)-1);
QTbl->ETime[QTbl->TotoalTimeTerm].Time.TSecond=0x00;
Ptr+=(sizeof(BLKTIME)-1);
if((++QTbl->TotoalTimeTerm)>MAXTIMETERM)
{
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nQTbl->TotoalTimeTerm)>MAXTIMETERM,err");
//ErrExit(0x0603);
}
}
Ptr++;
while((Term->TermStruct.RangeTermCount--)>0)
{
memcpy((INT8U *)&QTbl->Area.GpsRegion[QTbl->TotalRegion],Ptr,sizeof(GPS_REGION));
Ptr+=sizeof(GPS_REGION);
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nGpsRegion:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&QTbl->Area.GpsRegion[QTbl->TotalRegion],sizeof(GPS_REGION));
//PrintString('x', (INT8U *)&QTbl->Area.GpsRegion[QTbl->TotalRegion],sizeof(GPS_REGION));
#endif
if(++QTbl->TotalRegion>=MAXREGION)
{
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nQTbl->TotalRegion>=MAXREGION,err");
//ErrExit(ERR_BLK_REGION);
}
}
}
static void InitBlkReadPara(BlkRdStruct *Rd)
{
Rd->Sector=GetBlkReadSector();
Rd->Frame=0;
Rd->Offset=HEADOFFSET;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nRd->Sector Rd->Offset:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&Rd->Sector,1);
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&Rd->Offset,2);
//Printu("Rd->Sector:%x\tRd->Offset:%x\r\n",Rd->Sector,Rd->Offset);
#endif
}
//监控终端ID号10+允许最大传输个数1+查询时间段个数1+时间间隔范围(5+5)
//位置范围个数1+位置范围(8+8)+查询数据总帧数1+当前帧序号1
void ReceiveQueryTerm(INT8U *Data,INT8U Len)
{
QueryTblStruct *QTbl;
QUERYTERM *Term;
INT8U TimeTermLen;
Len=Len;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nReceiveQueryTerm");
#endif
Term=&TERM;
memcpy(Term->WatchId,Data,MAXIDNUM);
Data+=MAXIDNUM;
Term->MaxSendDot=*Data++;
Term->TermStruct.TermPtr=Data;
Term->TermStruct.TimeTermCount=*Data;
TimeTermLen=1+(*Data)*10;
Data+=TimeTermLen;
Term->TermStruct.TermLen=TimeTermLen+1+(*Data)*16;
Term->TermStruct.RangeTermCount=*Data;
Data+=1+(*Data)*16;
Term->TotalFrame=*Data++;
Term->CurFrame=*Data;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nTerm->CurFrame:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&Term->CurFrame,1);
//Printu("Term->CurFrame:%x\r\n",Term->CurFrame);
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nTerm信息:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)Term,sizeof(QUERYTERM)); //sizeof(QUERYTERM)
//PrintString('x',(INT8U*)Term,sizeof(QUERYTERM));
#endif
if(Term->CurFrame==1)
{
if((QTbl=GetIdleQueryTbl())==0)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nGetIdleQueryTbl())==0");
#endif
//ErrExit(ERR_BLK_QUERYTBL);
}
InitQueryTbl(QTbl);
memcpy(QTbl->WatchId,Term->WatchId,MAXIDNUM);
SaveQueryTerm(QTbl,Term);
if(QTbl->TotalFrame==1)
{
InitBlkReadPara(&QTbl->Read);
QTbl->Status=QUERYING;
}
else
{
QTbl->TimeCount=QUERYDELAY;
QTbl->Status=WAITING;
}
}
else
{
QTbl=SearchQTbl(Term->WatchId,WAITING|WAITSEND|QUERYING);
if(QTbl==0)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nQTbl==0");
#endif
// ErrExit(ERR_BLK_QUERYTBL);
return ;
}
if(Term->CurFrame>QTbl->TotalFrame) QTbl->FrameError=FRAMEERROR;//帧发送不完
if(QTbl->Status&QUERYING)//正在查询中,需要清除部分标志
{
QTbl->Status=IDLE;
QTbl->MatchRegion=0;
QTbl->TimeSynch=FALSE;
QTbl->TimeLapFlag=FALSE;
QTbl->MatchDots.TotalDots=0;
QTbl->MatchDots.RdOffset=0;
QTbl->FrameError=0;
QTbl->TotoalTimeTerm=0;
ResetAreaMatchFlag(QTbl);
}
SaveQueryTerm(QTbl,Term);
if(Term->CurFrame==Term->TotalFrame)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nQTbl->Status=QUERYING\n");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&(QTbl->FrameError),sizeof(QueryTblStruct));
//PrintString('x',&(QTbl->FrameError),sizeof(QueryTblStruct));
#endif
InitBlkReadPara(&QTbl->Read);
QTbl->Status=QUERYING;
}
else QTbl->TimeCount=QUERYDELAY;
}
}
BOOLEAN ReadWriteConflict(INT8U WrSecotr)
{
INT8U i;
for(i=0;i<MAXQUERYTBL;i++)
{
if(QueryTbl[i].Status&(QUERYING|WAITSEND|SENDING))
{
if(QueryTbl[i].MatchDots.TotalDots!=0)
{
if(QueryTbl[i].MatchDots.MatchTbl[QueryTbl[i].MatchDots.RdOffset].Sector==WrSecotr)
return TRUE;
}
}
}
return FALSE;
}
static BOOLEAN SkipBlkReadPara(BlkRdStruct *Rd)
{
if(Rd->Sector==BlkPara.BlkWr->WrSector) return FALSE;
else
{
if(++Rd->Sector>BlkPara.Top) Rd->Sector=BlkPara.Bottom;
if((Rd->Sector==BlkPara.BlkWr->WrSector)
&&(BlkPara.BlkWr->WrOffset==HEADOFFSET))
return FALSE;
Rd->Offset=HEADOFFSET;
Rd->Frame=0;
return TRUE;
}
}
static BOOLEAN GetNextBlkReadPara(BlkRdStruct *Rd)
{
Rd->Offset+=BlkPara.Size;
Rd->Frame++;
if(Rd->Offset+BlkPara.Size>SIZE_FLASHSECTOR)
{
Rd->Offset=HEADOFFSET;
Rd->Frame=0;
if(++Rd->Sector>BlkPara.Top) Rd->Sector=BlkPara.Bottom;
}
if((Rd->Sector==BlkPara.BlkWr->WrSector)
&&(Rd->Offset==BlkPara.BlkWr->WrOffset))
return FALSE;
else return TRUE;
}
static BOOLEAN GetNextBlkReadParaInSameSector(BlkRdStruct *Rd)//0309..zealea
{
Rd->Offset+=BlkPara.Size;
Rd->Frame++;
if(Rd->Offset+BlkPara.Size>SIZE_FLASHSECTOR) return FALSE;
else return TRUE;
}
static BOOLEAN CheckTimeAynch(QueryTblStruct *QTbl,INT8U DotFrame,INT8U DotOffset)//0309..qzl
{
BLKHEAD *Blk;
INT16U i;
Blk=(BLKHEAD *)FlashAbsAddr(QTbl->Read.Sector,QTbl->Read.Offset);
for(i=0;i<QTbl->TotoalTimeTerm;i++)
{
if(CmpData((INT8U *)&Blk->BaseTime,(INT8U *)&QTbl->BTime[i],sizeof(BLKTIME),sizeof(BLKTIME))==STR_LESS)
{
if(QTbl->MatchDots.TotalDots==0) //还没有找到匹配的点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -