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

📄 busroute.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/***************************************************************
**                                                              *
**  FILE         :  BusRoute.C                                  *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**  By : QZC 2004.08.16                                         *
****************************************************************/
#include "includes.h"
#include "public.h"
#include "tools.h"
#include "flashimg.h"
#include "RamImage.h"
#include "timetask.h"
#include "gpsrecer.h"
#include "blksave.h"
#include "blkquery.h"
#include "Stream.h"
//#include "SYSFrame.h"
#include "uartdrv.h"
#include "Printer.h"
#include "gprsdrv.h"
#include "GpsRecer.h"
#include "monitor.h"

#if EN_BUSROUTE > 0
#define DEBUG_BUSROUTE 0
/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define MEMBASE_                                    0x1d000
#define SECTOR_ROUTE                                 123
#define MAX_ROUTE                                    180

#define PERIOD_CHECK                                SECOND, 1
/*
********************************************************************************
*                  DEFINE STATUS
********************************************************************************
*/
#define CHECK_													0x01
#define SET1_													0x02
#define SET2_													0x03

#define OUTRANGE_												0x04
#define INRANGE_												0x05

/*
********************************************************************************
*                  DEFINE BUSROUTE_STRUCT
********************************************************************************
*/
#pragma packchar
typedef struct {
    BOOLEAN     isvalid;
    BOOLEAN 	 ControlFlag;
    INT8U       num;
    INT8U		 RouteNum;
}ROUTECB_STRUCT;

typedef struct{
	INT8U status1;
	INT8U status2;
	INT8U SeqNum;
}BUSSTATUS_STURCT;

typedef struct {
	INT8U 		SeqNum;
	GPS_REGION	PlatformRange;
}BUSROUTE_STRUCT;
#pragma endpackchar
/*
********************************************************************************
*                  DEFINE MODULE VARIANTS
********************************************************************************
*/
static ROUTECB_STRUCT   RouteCB					   _at(MEMBASE_ + 0x10);
static BUSROUTE_STRUCT  BusRoute[MAX_ROUTE]     _at(MEMBASE_ + 0x20);
static BUSROUTE_STRUCT  CheckRoute[3];
static BUSSTATUS_STURCT BusStatus;

static TMR_TSK *CheckTmr;
static STREAM *BusRoute_strm,*BusRoute1_strm;
static INT8U FrameNum,RecvFrameNum;
static INT8U SendInfo[6];

static INT8U mask[6]={0x40,0x20,0x10,0x08,0x04,0x02};

void StartSetBusRoute(INT8U *data)
{
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nStartSetBusRoute");
#endif
	InitBuf(SendInfo,0x7f,sizeof(SendInfo));
	RecvFrameNum=0;
	switch(data[0])
	 {
	 	case 0x01: StopTmr(CheckTmr);
	 				  RouteCB.isvalid=FALSE;
	 				  RouteCB.num=0;
					  UpdateImageFlash(SECTOR_ROUTE,(INT8U *)MEMBASE_);
					  FrameNum=data[1];
					  BusStatus.status1 = SET1_;
					  StoreRamImage(RI_BUSSTATUS_,(INT8U *)&BusStatus,sizeof(BusStatus));
	 				  break;
	 	case 0x02: if(BusStatus.status1 != SET1_) return;
	 				  FrameNum=data[1];
	 				  BusStatus.status1 = SET2_;
	 				  StoreRamImage(RI_BUSSTATUS_,(INT8U *)&BusStatus,sizeof(BusStatus));
	 				  break;
	 	default  : break;
	 }
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nBusStatus2:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,&BusStatus.status1,3);
#endif
}

static void SetInfo(INT8U frameseq)
{
	INT8U CurRow,CurCol;

	CurRow=frameseq / 6;
	CurCol=frameseq % 6;
	SendInfo[CurRow] &= (~mask[CurCol]);
}

void SetBusRoute(INT8U *data)
{
	INT8U i, num,frameseq,setno;
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nSetBusRoute");
#endif
	if( (BusStatus.status1!=SET1_)&&(BusStatus.status1!=SET2_) ) return;
	frameseq=*data++;
	if(frameseq==0x7f) frameseq=0;
	if(frameseq > FrameNum)	return;
	RecvFrameNum++;
	SetInfo(frameseq);//索引标志
	num=*data++;
	if(num==0x7f) num=0;
	RouteCB.RouteNum=*data++;
	if(RouteCB.RouteNum==0x7f) RouteCB.RouteNum=0;
	for(i=1; i<=num; i++)
	 {
		setno=*data;
		if(setno==0x7f) setno=0;
		if(setno > MAX_ROUTE)	return;
		BusRoute[setno].SeqNum=setno;
		memcpy(BusRoute[setno].PlatformRange.LeftLa,data+1,sizeof(GPS_REGION));
	#if DEBUG_BUSROUTE
		PrintFromUART(0x01,"\nsetno:");
		FormatPrintDataBlock(FORMAT_HEX,0x01,&setno,1);
		PrintFromUART(0x01,"\nBusRoute[setno]:");
		FormatPrintDataBlock(FORMAT_HEX,0x01,&BusRoute[setno].SeqNum,sizeof(BUSROUTE_STRUCT));
	#endif
		data+=sizeof(BUSROUTE_STRUCT);
		RouteCB.num++;
	 }
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nBusStatus3:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,&BusStatus.status1,3);
#endif
}

void StopBusRoute(void)
{
	INT8U len;
	INT16U attrib;
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nStopBusRoute");
#endif
	if((BusStatus.status1!=SET1_)&&(BusStatus.status1!=SET2_)) return;

	ASMSYSFrameHead_MODE2(BusRoute_strm,EgCode.egcode,0x0f46);
	if(RecvFrameNum==FrameNum)
	 {
	 	RouteCB.isvalid=TRUE;
	 	memcpy(&CheckRoute[0].SeqNum,&BusRoute[0].SeqNum,sizeof(CheckRoute));
	 #if DEBUG_BUSROUTE
		PrintFromUART(0x01,"\nCheckRoute[0]:");
		FormatPrintDataBlock(FORMAT_HEX,0x01,&CheckRoute[0].SeqNum,sizeof(BUSROUTE_STRUCT));
	#endif
	 	BusStatus.status1=CHECK_;
	 	BusStatus.status2=OUTRANGE_;
	 	BusStatus.SeqNum=CheckRoute[0].SeqNum;
	 	StoreRamImage(RI_BUSSTATUS_,(INT8U *)&BusStatus,sizeof(BusStatus));
		StartTmr(CheckTmr, PERIOD_CHECK);
		WriteBYTE_Strm(BusRoute_strm, 0x01);
	 }
	else WriteBYTE_Strm(BusRoute_strm, 0x7f);

	WriteDATA_Strm(BusRoute_strm,SendInfo,sizeof(SendInfo));

	UpdateImageFlash(SECTOR_ROUTE,(INT8U *)MEMBASE_);
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nRouteCB:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,&RouteCB.isvalid,sizeof(RouteCB));
	PrintFromUART(0x01,"\nSendInfo:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,SendInfo,sizeof(SendInfo));
	PrintFromUART(0x01,"\nBusStatus4:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,&BusStatus.status1,3);
#endif
	if (PubParaValid(ALARMTEL_))  len = AlarmTel.len;
	else len = 0;
	attrib = GetServiceAttrib(SER_ALARM);
	SendSYSFrame_MODE2(BusRoute_strm,AlarmTel.tel,len,SM_ATTR_SUCCESS|attrib,0);
}

void SetControlFlag(INT8U flag)
{
	if(flag==0x00) RouteCB.ControlFlag=FALSE;
	else if(flag==0x01) RouteCB.ControlFlag=TRUE;

	UpdateImageFlash(SECTOR_ROUTE,(INT8U *)MEMBASE_);
}

static BOOLEAN CmpRegion(DATUM_STRUCT GpsDot,GPS_REGION *Region)
{
	INT8U Result1,Result2;

   Result1=CmpString(Region->LeftLa,GpsDot.latitude,4);
   Result2=CmpString(Region->LeftLg,GpsDot.longitude,4);
   if(Result1==STR_GREAT||Result2==STR_GREAT) return FALSE;
   Result1=CmpString(GpsDot.latitude,Region->RightLa,4);
   Result2=CmpString(GpsDot.longitude,Region->RightLg,4);
   if(Result1==STR_GREAT||Result2==STR_GREAT) return FALSE;
   return TRUE;
}

static void SendInOrOut(INT8U type,INT8U Seq)
{
	INT8U len;
	INT16U attrib;

	if(!RouteCB.ControlFlag) return;

	BusRoute1_strm=GetSYSFrameStream();
	ASMSYSFrameHead_MODE2(BusRoute1_strm,EgCode.egcode,0x0f47);
	WriteBYTE_Strm(BusRoute1_strm, type);
	WriteBYTE_Strm(BusRoute1_strm, RouteCB.RouteNum);
	WriteBYTE_Strm(BusRoute1_strm, Seq);
	MovStrmPtr(BusRoute1_strm, QueryPosition(GetStrmPtr(BusRoute1_strm)));

	if (PubParaValid(ALARMTEL_)) len = AlarmTel.len;
	else len = 0;
	attrib = GetServiceAttrib(SER_ALARM);
	SendSYSFrame_MODE2(BusRoute1_strm,AlarmTel.tel,len,SM_ATTR_SUCCESS|attrib,0);
}

static void CheckTmrProc(void)
{
	DATUM_STRUCT	CurGpsDot;
	INT8U i;

	if(BusStatus.status1!=CHECK_) return;
	GetDatumData(&CurGpsDot);
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nCurGpsDot:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,CurGpsDot.latitude,8);
#endif
	switch(BusStatus.status2)
	 {
	 	case OUTRANGE_:for(i=0;i<3;i++)
	 						 {
	 						 	if(CmpRegion(CurGpsDot,(GPS_REGION *)CheckRoute[i].PlatformRange.LeftLa))
	 						 	 {
	 						 	 	#if DEBUG_BUSROUTE
	 						 	 	PrintFromUART(0x01,"\n进站");
	 						 	 	#endif
									BusStatus.status2=INRANGE_;
									BusStatus.SeqNum=CheckRoute[i].SeqNum;
									StoreRamImage(RI_BUSSTATUS_,(INT8U *)&BusStatus,sizeof(BusStatus));
									SendInOrOut(0x01,BusStatus.SeqNum);//发送进站信息
									#if DEBUG_BUSROUTE
									PrintFromUART(0x01,"\ni:");
									FormatPrintDataBlock(FORMAT_HEX,0x01,&i,1);
									PrintFromUART(0x01,"\nBusStatus5:");
									FormatPrintDataBlock(FORMAT_HEX,0x01,&BusStatus.status1,3);
									#endif
									return;
	 						 	 }
	 						 }
							break;
	 	case INRANGE_ :i=BusStatus.SeqNum;
	 						if(CmpRegion(CurGpsDot,(GPS_REGION *)BusRoute[i].PlatformRange.LeftLa)) break;
							else
							 {
							 	#if DEBUG_BUSROUTE
	 						  	PrintFromUART(0x01,"\n出站:");
	 						  	FormatPrintDataBlock(FORMAT_HEX,0x01,&i,1);
	 						  	PrintFromUART(0x01,"\nBusRoute[i].PlatformRange:");
	 						  	FormatPrintDataBlock(FORMAT_HEX,0x01,BusRoute[i].PlatformRange.LeftLa,sizeof(GPS_REGION));
	 						 	#endif
							 	BusStatus.status2=OUTRANGE_;
								BusStatus.SeqNum=i+1;
							 	memcpy(&CheckRoute[0].SeqNum,&BusRoute[i+1].SeqNum,sizeof(CheckRoute));
							 	StoreRamImage(RI_BUSSTATUS_,(INT8U *)&BusStatus,sizeof(BusStatus));
							 	SendInOrOut(0x02,i);//发送出站信息
							 }
							break;
		default		  :break;
	 }
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nBusStatus5:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,&BusStatus.status1,3);
#endif
}

void InitBusRoute(void)
{
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nInitBusRoute");
#endif
	if(!InitImageSram(SECTOR_ROUTE,(INT8U *)MEMBASE_))
	 {
		RouteCB.isvalid=FALSE;
		RouteCB.ControlFlag=TRUE;
		RouteCB.num=0;
	 }

	if(!ResumeRamImage(RI_BUSSTATUS_, (INT8U *)&BusStatus,sizeof(BusStatus)))
	 {
	 	BusStatus.status1=0;
		BusStatus.status2=OUTRANGE_;
		BusStatus.SeqNum=0;
		StoreRamImage(RI_BUSSTATUS_,(INT8U *)&BusStatus,sizeof(BusStatus));
	 }
	else memcpy(&CheckRoute[0].SeqNum,&BusRoute[BusStatus.SeqNum].SeqNum,sizeof(CheckRoute));

	CheckTmr=CreateTimer(CheckTmrProc, 0);
	if(RouteCB.isvalid==TRUE)
	 {
	 	BusStatus.status1=CHECK_;
	 	memcpy(&CheckRoute[0].SeqNum,&BusRoute[BusStatus.SeqNum].SeqNum,sizeof(CheckRoute));
	 	StartTmr(CheckTmr, PERIOD_CHECK);
	 }

	BusRoute_strm=GetSYSFrameStream();
#if DEBUG_BUSROUTE
	PrintFromUART(0x01,"\nBusStatus1:");
	FormatPrintDataBlock(FORMAT_HEX,0x01,&BusStatus.status1,3);
#endif
}

#endif

⌨️ 快捷键说明

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