📄 blkquery.c
字号:
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nTotalDots=0");
#endif
QTbl->DummyDot.Sector=QTbl->Read.Sector;
QTbl->DummyDot.Frame=DotFrame;
QTbl->DummyDot.Offset=DotOffset;
}
return FALSE;
}
}
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nWaitSend");
#endif
QTbl->Status=WAITSEND;
return TRUE;
}
//查询到匹配点后对匹配范围个数的操作
static void SetAreaMatchFlag(QueryTblStruct *QTbl,INT8U Index)
{
INT8U y,x;
if(Index>MAXREGION) return;
y=Index/8;
x=Index%8;
QTbl->Area.MatchFlag[y]|=(0x80>>x);
}
static INT8U Count1InByte(INT8U Data)
{
INT8U i,Count=0;
for(i=0;i<8;i++)
{
if(Data&(0x01<<i)) Count++;
}
return Count;
}
INT8U GetMatchRegionCnt(QueryTblStruct *QTbl)
{
INT8U i,Num,Count=0;
if(QTbl->TotalRegion==0) return Count;
Num=QTbl->TotalRegion/8;
if((QTbl->TotalRegion%8)>0) Num++;
for(i=0;i<Num;i++) Count+=Count1InByte(QTbl->Area.MatchFlag[i]);
return Count;
}
//将数据点的参数存入索引表中
static BOOLEAN SaveMatchDot(QueryTblStruct *QTbl,INT8U Sector,INT8U Frame,INT8U Offset)
{
INT8U Index;
Index=QTbl->MatchDots.TotalDots;
if(Index>=GetSmall(GPS_MATCH_CNT,QTbl->MaxSendDot)) return FALSE;
QTbl->MatchDots.MatchTbl[Index].Sector=Sector;
QTbl->MatchDots.MatchTbl[Index].Frame=Frame;
QTbl->MatchDots.MatchTbl[Index].Offset=Offset;
QTbl->MatchDots.TotalDots++;
QTbl->TotalMatchDot++;
return TRUE;
}
static BOOLEAN SaveAllMatchDot(QueryTblStruct *QTbl,INT8U Sector,INT8U Frame)
{
INT8U i;
for(i=0;i<MAXGPSNUM;i++)
{
if(!SaveMatchDot(QTbl,Sector,Frame,i)) return FALSE;
}
return TRUE;
}
static void QueryTimeRegion(QueryTblStruct *QTbl)
{
BLKHEAD *Blk;
INT8U i,j,Result,Count;
Read=&QTbl->Read;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n时间位置结合查询");
#endif
do{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nRead_Sector:");
FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&Read->Sector,1);
//Printu("Read_Sector:%d\r\n",Read->Sector);
#endif
for(Count=0;Count<(QTbl->TotoalTimeTerm);Count++)
{
Result=CmpSectorBootTime(&QTbl->BTime[Count],&QTbl->ETime[Count],Read->Sector);
if(Result!=VACUUM) break;
}
if(Result==VACUUM)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nVACUUM");
#endif
if(CheckTimeAynch(QTbl,BLKFRAME-1,MAXGPSNUM-1))
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nCheckTimeAynch");
#endif
return;
}
if(!SkipBlkReadPara(Read))
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nNoSkip");
#endif
QTbl->Status=WAITSEND;
return;
}
}
else break;
}while(1);
QTbl->TimeLapFlag=TRUE;
do{
Blk=(BLKHEAD *)FlashAbsAddr(Read->Sector,Read->Offset);
GetOffsetTime(&LastDotTm,&Blk->BaseTime,Blk->Interval,MAXGPSNUM-1);
for(Count=0;Count<(QTbl->TotoalTimeTerm);Count++)
{
Result=IsTimeOverLap(&Blk->BaseTime,&LastDotTm,&QTbl->BTime[Count],&QTbl->ETime[Count]);
if(Result!=VACUUM) break;
}
if(Result==VACUUM)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nIsTimeOverLap");
#endif
if(CheckTimeAynch(QTbl,Read->Frame,MAXGPSNUM-1)) return;
if(!GetNextBlkReadPara(Read))
{
QTbl->Status=WAITSEND;
return;
}
}
else break;
}while(1);
ExtractAllGps(AllDots,Blk);
for(i=0;i<MAXGPSNUM;i++)
{
for(Count=0;Count<(QTbl->TotoalTimeTerm);Count++)
{
Result=CmpGatherTime(&QTbl->BTime[Count],&QTbl->ETime[Count],&AllDots[i].DateTime);
if(Result) break;
}
if(Result)
{
QTbl->TimeSynch=TRUE;
for(j=0;j<QTbl->TotalRegion;j++)
{
if(CmpGpsRegion(&AllDots[i],&QTbl->Area.GpsRegion[j]))
{
SaveMatchDot(QTbl,Read->Sector,Read->Frame,i);
SetAreaMatchFlag(QTbl,j);
break;
}
}
}
else
{
if(CheckTimeAynch(QTbl,Read->Frame,i)) return;
}
}
if(!GetNextBlkReadPara(Read))
{
QTbl->Status=WAITSEND;
return;
}
}
static void QueryTime(QueryTblStruct *QTbl)
{
BLKHEAD *Blk;
INT8U i,j,Result,Count,PreResult;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n时间查询");
#endif
do{
Read=&QTbl->Read;
for(Count=0;Count<(QTbl->TotoalTimeTerm);Count++)
{
Result=CmpSectorBootTime(&QTbl->BTime[Count],&QTbl->ETime[Count],Read->Sector);
if(Result==SUBCLASS) break;
else if(Result==OVERLAP) PreResult=OVERLAP;
else if((VACUUM==Result)&&(OVERLAP==PreResult)) Result=OVERLAP;
}
if(Result==VACUUM)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nVACUUM");
#endif
if(CheckTimeAynch(QTbl,BLKFRAME-1,MAXGPSNUM-1)) return;
}
else if(Result==SUBCLASS)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nSUBCLASS");
#endif
QTbl->TimeLapFlag=TRUE;
for(j=0;j<BLKFRAME;j++) SaveAllMatchDot(QTbl,Read->Sector,j);
QTbl->TimeSynch=TRUE;
}
else if(Result==OVERLAP)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nOVERLAP");
#endif
QTbl->TimeLapFlag=TRUE;
for(j=0;j<BLKFRAME;j++)
{
Blk=(BLKHEAD *)FlashAbsAddr(Read->Sector,Read->Offset);
GetOffsetTime(&LastDotTm,&Blk->BaseTime,Blk->Interval,MAXGPSNUM-1);
for(Count=0;Count<(QTbl->TotoalTimeTerm);Count++)
{
Result=IsTimeOverLap(&Blk->BaseTime,&LastDotTm,&QTbl->BTime[Count],&QTbl->ETime[Count]);
if(Result==SUBCLASS) break;
else if(Result==OVERLAP) PreResult=OVERLAP;
else if((VACUUM==Result)&&(OVERLAP==PreResult)) Result=OVERLAP;
}
if(Result==VACUUM)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nVACUUM1");
#endif
if(CheckTimeAynch(QTbl,j,MAXGPSNUM-1)) return;
}
else if(Result==SUBCLASS)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nSUBCLASS1");
#endif
SaveAllMatchDot(QTbl,Read->Sector,j);
QTbl->TimeSynch=TRUE;
}
else if(Result==OVERLAP)
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nOVERLAP1");
#endif
for(i=0;i<MAXGPSNUM;i++)
{
GetOffsetTime(&LastDotTm,&Blk->BaseTime,Blk->Interval,i);
for(Count=0;Count<(QTbl->TotoalTimeTerm);Count++)
{
if(CmpGatherTime(&QTbl->BTime[Count],&QTbl->ETime[Count],&LastDotTm))
{
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nCmpGatherTime");
#endif
SaveMatchDot(QTbl,Read->Sector,j,i);
QTbl->TimeSynch=TRUE;
}
else if(CheckTimeAynch(QTbl,j,i)) return;
}
}
}
if(!GetNextBlkReadParaInSameSector(Read)) break; //0309..qzl
}
}
}while(SkipBlkReadPara(Read));
QTbl->Status=WAITSEND;
}
static void QueryRegion(QueryTblStruct *QTbl)
{
BLKHEAD *Blk;
INT8U i,j;
Read=&QTbl->Read;
Blk=(BLKHEAD *)FlashAbsAddr(Read->Sector,Read->Offset);
ExtractAllGps(AllDots,Blk);
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n位置查询");
/* OSQPost(QLCD,LCDDEBUGID,(INT32U)"位置查询",8);
memcpy(ShowData,&QTbl->Read,sizeof(QTbl->Read));
OSQPost(QLCD,LCDASCIIID,(INT32U)ShowData,sizeof(QTbl->Read));
OSQPost(QLCD,LCDDEBUGID,(INT32U)" ",1);
OSQPost(QLCD,LCDDEBUGID,(INT32U)"AllDots:",8);
OSQPost(QLCD,LCDASCIIID,(INT32U)AllDots,sizeof(AllDots));
OSQPost(QLCD,LCDDEBUGID,(INT32U)" ",1);
*/
#endif
for(i=0;i<MAXGPSNUM;i++)
{
for(j=0;j<QTbl->TotalRegion;j++)
{
if(CmpGpsRegion(&AllDots[i],&QTbl->Area.GpsRegion[j]))
{
SaveMatchDot(QTbl,Read->Sector,Read->Frame,i);
SetAreaMatchFlag(QTbl,j);
break;
}
}
}
if(!GetNextBlkReadPara(Read))
{
QTbl->Status=WAITSEND;
return;
}
}
void BlkQuery(void)
{
INT8U i;
QueryTblStruct *QTbl;
for(i=0;i<MAXQUERYTBL;i++)
{
QTbl=&QueryTbl[i];
if(QTbl->Status==QUERYING)
{
if(QTbl->QueryTimeFlag)
{
if(QTbl->TotalRegion>0) QueryTimeRegion(QTbl);
else QueryTime(QTbl);
}
else if(QTbl->TotalRegion>0) QueryRegion(QTbl);
}
else if(QTbl->Status==WAITING)
{
if(--QTbl->TimeCount==0)
{
QTbl->FrameError=FRAMEERROR;
QueryTbl->Status=WAITSEND;
}
}
}
}
BOOLEAN NetCancelBlkQuery(INT8U *Data,INT8U Len) //change by qzc
{
QueryTblStruct *QTbl;
#if DEBUG_UARTNo_BlkBOX<=3
PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nNetCancelBlkQuery");
#endif
if(MAXIDNUM!=Len) return FALSE;
if((QTbl=CheckQueryTblID(Data))!=0)
{
if(CheckQueryStatut(QTbl,SENDING|WAITING|WAITSEND|QUERYING|SENDING))//0309..qzl
{
InitQueryTbl(QTbl);
return TRUE;
}
}
return FALSE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -