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

📄 position.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/***************************
*    Position.c     ZTL    *
***************************/
#define  POSITION_GLOBALS
#include "includes.h"
#include "bsp.h"
#include "Public.h"
#include "Tools.h"
#include "Stream.h"
#include "GpsRecer.h"
#include "Alarmer.h"
#include "Position.h"
#include "IntPos.h"
#include "Vtpos.h"
#include "RangePos.h"
#include "TimePos.h"
#include "StsPos.h"
#include "Monitor.H"
//#include "SysFrame.H"
#include "Printer.h"
#include "gprsdrv.h"


#define  POSITION_DEBUG  0
void MontorSram(void);

typedef struct
{
   INT8U Mask;
   void  (*InitProc)(void);
   INT8U (*ParaSet)(INT8U *ParaSetPtr);
   void  (*ParaClear)(void);
   void  (*PosStart)(void);
   void  (*PosStop)(void);
}PositionProcStruct;

static PositionProcStruct PositionTCB[MAX_TYPE]=
{
 //0x20,INTPosInit,INTPosParaSet,INTPosParaClear,INTPosStart,INTPosStop,
 0x10,TimePosInit,TimePosParaSet,TimePosParaClear,TimePosStart,TimePosStop,
 0x08,VTPosInit,VTPosParaSet,VTPosParaClear,VTPosStart,VTPosStop,
// 0x04,RangePosInit,RangePosParaSet,RangePosParaClear,RangePosStart,RangePosStop,
// 0x02,STSPosInit,STSPosParaSet,STSPosParaClear,STSPosStart,STSPosStop
};

//static STREAM *wstrm;
static void (*Proc)(void);

void InitPosition(void)
{
   INT8U i;

   #if POSITION_DEBUG
   SendFromUART_STR(1,(INT8U *)"InitPosition");
   #endif

   for(i=0;i<MAX_TYPE;i++)
     {
      Proc=PositionTCB[i].InitProc;
      if(Proc!=0) (*Proc)();
     }
}

#if 0
static void ClearRelation(void)
{
    RelParaHead.Number=0;
    RelParaHead.Status=CLOSE;
    InitBuf((INT8U *)relation,0x70, sizeof(relation));
}
//chenqifu add 0917
BOOLEAN SetRelation(INT8U *PositionSetPtr)
{
   INT8U i,NUM;
   ClearRelation();
#if POSITION_DEBUG
          SendFromUART_STR(1,(INT8U *)"SetRelation");
	  FormatPrintDataBlock(FORMAT_HEX,1,(INT8U *)&RelParaHead.Status,1);
	  SendFromUART_STR(1,(INT8U *)"NUM:");
	  SendFromUART_HEX(1,NUM);
#endif

   NUM=*PositionSetPtr++;
   if(NUM==0){
       StorePubPara(RELATIONHEAD_);
       	       return	TRUE;
   }
   if (NUM>=20) return FALSE;


   for(i=0;i<NUM;i++){
      if (*PositionSetPtr++!=0x70)relation[i].INT=1;
      if (*PositionSetPtr!=0x70)relation[i].time=*PositionSetPtr;
      PositionSetPtr++;
      if (*PositionSetPtr++!=0x70)relation[i].vector=1;
      if (*PositionSetPtr!=0x70)relation[i].range=*PositionSetPtr;
      PositionSetPtr++;
   }
   RelParaHead.Status=OPEN;
   RelParaHead.Number=NUM;

#if POSITION_DEBUG
   FormatPrintDataBlock(FORMAT_HEX,1,(INT8U *)relation,sizeof(relation));
   FormatPrintDataBlock(FORMAT_HEX,1,(INT8U *)&RelParaHead,sizeof(RELATIONHEAD));
   SendFromUART_STR(1,(INT8U *)"IntPosPara after relation set:");
   FormatPrintDataBlock(FORMAT_HEX,1,(INT8U *)&IntPosPara,sizeof(IntPosPara));
#endif

   StorePubPara(RELATIONHEAD_);
     return TRUE;
}


BOOLEAN SetPosition(INT8U *PositionPtr)
{
   INT8U i,ClearFlag,SetFlag,Count,CurType,Len;
   INT8U (* Ptr)(INT8U *ParaSetPtr);
   BOOLEAN Return_Flag=TRUE;

   #if POSITION_DEBUG
   FormatPrintDataBlock(FORMAT_HEX,1,PositionPtr,64);
 //  OSSchedLock();
   #endif


   PositionTel.Len=DecodeTel(PositionTel.Tel,PositionPtr,SYS_TELLEN);
   StorePubPara(POSITIONTEL_);
   PositionPtr+=SYS_TELLEN;

   ClearFlag=*PositionPtr++;
   for(i=0;i<MAX_TYPE;i++)
     {
      if(ClearFlag&PositionTCB[i].Mask)
	    {
	      Proc=PositionTCB[i].ParaClear;
	      if(Proc!=0) (*Proc)();
	    }
     }
   SetFlag=*PositionPtr++;
   Count=*PositionPtr++;
   if (Count==0x7F)Count=0;
   for(i=0;i<Count;i++)
     {
      CurType=(*PositionPtr++)&0x07;
      if(CurType>=MAX_TYPE) Return_Flag=FALSE;
      else
        {
	         Ptr=PositionTCB[CurType].ParaSet;
	         if(Ptr!=0) Len=(*Ptr)(PositionPtr);
	         if(Len!=ERR) PositionPtr+=Len;
	         else Return_Flag=FALSE;
	      }
      if(!Return_Flag) break;
     }
   #if POSITION_DEBUG
   SendFromUART_STR(1,(INT8U *)"The SetFlag:");
   SendFromUART_HEX(1,SetFlag);
   #endif
   for(i=0;i<MAX_TYPE;i++)
     {
      if(SetFlag&PositionTCB[i].Mask) Proc=PositionTCB[i].PosStart;
      else Proc=PositionTCB[i].PosStop;
      if(Proc!=0) (*Proc)();

     }
  StoreAllPubPara();
  return Return_Flag;
}
#endif
//void SendPositionData(INT8U PositionType,INT8U PositionSeq)
//{
//   INT8U  i, tellen;
//   INT16U attrib;
//
//   #if POSITION_DEBUG
//   SendFromUART_STR(1,(INT8U *)"SendPositionData");
//   switch(PositionType)
//     {
//      case POSITION_INTERVAL:
//           SendFromUART_STR(1,(INT8U *)"间隔条件");
 //          break;
//      case POSITION_TIME:
//           SendFromUART_STR(1,(INT8U *)"时刻条件");
//           break;
//      case POSITION_VECTOR:
 //          SendFromUART_STR(1,(INT8U *)"速度条件");
//           break;
//      case POSITION_RANGE:
//           SendFromUART_STR(1,(INT8U *)"范围条件");
//           break;
//      case POSITION_STATUS:
//           SendFromUART_STR(1,(INT8U *)"状态条件");
//           break;
//     }
//   #endif

//   if (PositionType==POSITION_RANGE)goto PositionSend;
//   if (RelParaHead.Status==OPEN){
//      for(i=0;i<RelParaHead.Number;i++){
//            if (RelCheckAll(i))goto PositionSend;

//      }
//   return;
  /// }
//PositionSend:

//   wstrm=GetSYSFrameStream();
//   ASMSYSFrameHead_MODE2(wstrm,EgCode.egcode,0x0241);
//   WriteBYTE_Strm(wstrm,PositionType);
//   WriteBYTE_Strm(wstrm,PositionSeq);
//   WriteHWORD_Strm(wstrm,GetAlarmType());
//   MovStrmPtr(wstrm,QueryPosition(GetStrmPtr(wstrm)));

 //  if (PubParaValid(POSITIONTEL_)) {
//       tellen = PositionTel.Len;
//   } else {
//       tellen = 0;
 //  }
//   attrib = GetServiceAttrib(SER_POSITION);
//   SendSYSFrame_MODE2(wstrm,PositionTel.Tel,tellen,attrib | SM_ATTR_SUCCESS,0);
//}

⌨️ 快捷键说明

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