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

📄 blkwire.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/**********************
		BlkWire.c		 *
***********************/
#define BLKLINE_GLOBALS
#include "includes.h"
#include "bsp.h"
#include "structs.h"
#include "tools.h"
#include "timetask.h"
#include "LcdList.h"
#include "hstiodrv.h"
#include "flash.h"
#include "Printer.h"
#include "BlkSave.h"
#include "BlkSend.h"
#include "BlkQuery.h"
#include "BlkOpt.h"
#include "BlkWire.h"

#if EN_BLACKBOX >0

#define PILEOFFSET      0

TMR_TSK *BlkBoxWireInqueryTmrID;

static BLKWIREFRAME BlkWireFrame;

static INT8U ComRdSector;
static INT16U ComRdOffset;

#if PILEOFFSET
static INT8U Lat[4],Lg[4];
#endif

static void ConvertDataAndTime(INT8U *Result,BLKTIME *BlkTime)
{
    *Result=0x00;
    *Result |=((BlkTime->Date.TYear)<<4);
    *Result|=BlkTime->Date.TMonth;
    *++Result=0x00;
    *Result|=((BlkTime->Date.TDay)<<3); //高5位
    *Result|=((BlkTime->Time.THour)>>2);//低3位
    *++Result=0x00;
    *Result|=((BlkTime->Time.THour)<<6);
    *Result|=(BlkTime->Time.TMinute);
}

//FLAG	校验码	类型	用户数据	FLAG
//用户数据==sendflag+GpsData
static void SendBlkWireData(INT8U Type)
{
   INT8U Len;

   BlkWireFrame.Flag=Type;
   if(Type==0x01) Len=sizeof(BlkWireFrame);
   else if(Type==0x02)
     {
      BlkWireFrame.GpsCount=0;
      Len=2;
     }
#if EN_LCD > 0
	RequestSend_LCD(LCD_ATTR_COMMON,0X31,(INT8U *)&BlkWireFrame,Len,0);
#endif
#if EN_HSTIO > 0
    SendMemFromHstIO(0x31, Len, (INT8U *)&BlkWireFrame);
#endif
}

static void ProcessBlkData(void)
{
    INT8U Index=0;
    SPARSEBLK *Blk;

   Blk=(SPARSEBLK *)FlashAbsAddr(ComRdSector,ComRdOffset);
   if(Blk->WRSuccess!=SUCCESS) return;
   BlkWireFrame.GpsCount=GetSmall(Blk->GpsCount,MAXGPSNUM);

   while(Index<(BlkWireFrame.GpsCount))
      {
       if(0==Index)
       {
         memcpy((INT8U*)BlkWireFrame.Interval,(INT8U*)Blk->Interval,sizeof(Blk->Interval));
   		#if DEBUG_UARTNo_BlkBOX<=3
   		PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlk->BaseTime:");
		FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)Blk->BaseTime.Date.TYear,6);
   		#endif
         ConvertDataAndTime(BlkWireFrame.DataTime,&Blk->BaseTime);
   		#if DEBUG_UARTNo_BlkBOX<=3
   		PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlkWireFrame.DataTime:");
		FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,BlkWireFrame.DataTime,3);
   		#endif
         memcpy((INT8U *)&BlkWireFrame.BaseDot,(INT8U*)&(Blk->BaseDot),sizeof(S_BASEGPS));
        #if DEBUG_UARTNo_BlkBOX<=3
   		PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBase Dot:");
		FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&BlkWireFrame,30);
   		#endif

         #if PILEOFFSET
         InitBuf(Lat,0,sizeof(Lat));
         InitBuf(Lg,0,sizeof(Lg));
         #endif
       }
       else
         {
         	#if DEBUG_UARTNo_BlkBOX<=3
         	PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlk->GpsDot:");
         	FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&(Blk->GpsDot[Index-1]),sizeof(S_GPS));
	     	PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlkWireFrame.GpsOffsetDot:");
	     	FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&(BlkWireFrame.GpsOffsetDot[Index-1]),sizeof(S_GPS));
	  	    #endif

            //与基准点的偏移量
	    		#if PILEOFFSET
            PileSOffSet(Lat,&Blk->GpsDot[Index-1].Vla_D);
            PileSOffSet(Lg,&Blk->GpsDot[Index-1].Vlg_D);

	    		BlkWireFrame.GpsOffsetDot[Index-1].Vla_D=Lat[0]|Lat[1];
            BlkWireFrame.GpsOffsetDot[Index-1].Vla_C[0]=Lat[2];
            BlkWireFrame.GpsOffsetDot[Index-1].Vla_C[1]=Lat[3];
	    		BlkWireFrame.GpsOffsetDot[Index-1].Vlg_D=Lg[0]|Lg[1];
            BlkWireFrame.GpsOffsetDot[Index-1].Vlg_C[0]=Lg[2];
            BlkWireFrame.GpsOffsetDot[Index-1].Vlg_C[1]=Lg[3];
            BlkWireFrame.GpsOffsetDot[Index-1].Vector=Blk->GpsDot[Index-1].Vector;
            #else
            memcpy(&BlkWireFrame.GpsOffsetDot[Index-1],&Blk->GpsDot[Index-1],sizeof(S_GPS));
            #endif
         }
      Index++;
     }
    SendBlkWireData(0x01);
    #if DEBUG_UARTNo_BlkBOX<=3
    PrintFromUART(DEBUG_UARTNo_BlkBOX,"\nBlkWireFrame:");
    FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U*)&BlkWireFrame,sizeof(BlkWireFrame));
    #endif
}

static BOOLEAN GetNextBlkWireReadPara(void)
{
   SPARSEBLK *Blk;

   ComRdOffset+=BlkPara.Size;
   if(ComRdOffset+BlkPara.Size>SIZE_FLASHSECTOR)
     {
      ComRdOffset=HEADOFFSET;
      if(++ComRdSector>BlkPara.Top) ComRdSector=BlkPara.Bottom;
     }
    #if DEBUG_UARTNo_BlkBOX<=3
   	PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n================ComRdSector:");
    FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,&ComRdSector,1);
   	PrintFromUART(DEBUG_UARTNo_BlkBOX,"\n================ComRdOffset:");
   	FormatPrintDataBlock(FORMAT_HEX,DEBUG_UARTNo_BlkBOX,(INT8U *)&ComRdOffset,2);
  	#endif
   if((ComRdSector==BlkPara.BlkWr->WrSector) && (ComRdOffset==BlkPara.BlkWr->WrOffset)) {
		#if DEBUG_UARTNo_BlkBOX<=3
		PrintFromUART(DEBUG_UARTNo_BlkBOX, "\n<ReadPtr == WritePtr>");
		#endif
     	return FALSE;
   } else {
      Blk=(SPARSEBLK *)FlashAbsAddr(ComRdSector,ComRdOffset);
      if(Blk->WRSuccess==SUCCESS) {
      	return TRUE;
      } else {
     	#if DEBUG_UARTNo_BlkBOX<=3
		PrintFromUART(DEBUG_UARTNo_BlkBOX, "\n<WRSuccess!=SUCCESS>");
		#endif
     	return FALSE;
     }
   }
}

static void BlkBoxWireInquery(void)
{
   ProcessBlkData();
   if(!GetNextBlkWireReadPara())
      {
       RemoveTmr(BlkBoxWireInqueryTmrID);
       SendBlkWireData(0x02);
      }
}
//dataPtr类型
void HdlMsgBlkBox21H(void)
{
   ComRdSector=GetBlkReadSector();
   ComRdOffset=HEADOFFSET;
   BlkBoxWireInqueryTmrID=CreateTimer(BlkBoxWireInquery,0);
   StartTmr(BlkBoxWireInqueryTmrID,MILTICK,20);
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -