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

📄 blkquery.c

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