⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blkquery.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
        {
         #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 + -