📄 busroute.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 + -