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

📄 blksend.c

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