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

📄 station.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "Station.h"
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <string.h>
#include "mem.h"
#include "djk.h"
#include "namedef.h"
#include "rs232.h"
#include "datadef.h"
//#define GET_FROM_NVRAM
//#define FLASH_SEG	0xc800
//#define FLASH_OFF	0x0000
//#define FLASH_PORT	0x308
 
#define LINK_DRCT_UP	1
#define LINK_DRCT_DOWN	2

typedef struct {
	char flags[4];
	unsigned int station;
	unsigned char yard;
	unsigned char headlen;
	unsigned int upstart;
	unsigned int upnum;
	unsigned int uppoista;
	unsigned int uplocsta;
	unsigned int downstart;
	unsigned int downnum;
	unsigned int downpoista;
	unsigned int downlocsta;
	unsigned char headchk;
	unsigned int rtlocs[2];
}TYPE_BRT_HEAD;

typedef struct {
	char flags[4];
	unsigned int station;
	unsigned char yard;
	unsigned char headlen;
	unsigned char upmax;
	unsigned char downmax;
	unsigned char datalen;
	unsigned int start;
	unsigned int num;
	unsigned int loc;
	unsigned int brtend;
}TYPE_MRT_HEAD;

typedef struct {
	unsigned int id;
	unsigned char datalen;
	unsigned char tracknum;
	unsigned int start;
	unsigned int end;
	unsigned int length;
	unsigned int trackdatas[2];
}TYPE_BRT;

typedef struct {
	unsigned int brt;
	unsigned int mrt;
}TYPE_MRT;

typedef struct {
	char flags[4];
	unsigned int station;
	unsigned char yard;
	unsigned char headlen;
	unsigned int sglen;
	unsigned int sgnum;
	unsigned int sgstart;
	unsigned int wclen;
	unsigned int wcnum;
	unsigned int wcstart;
	unsigned int gdlen;
	unsigned int gdnum;
	unsigned int gdstart;
	unsigned int swlen;
	unsigned int swnum;
	unsigned int swstart;
	unsigned int xnlen;
	unsigned int xnnum;
	unsigned int xnstart;
}TYPE_LKFILEHEAD;

typedef struct {
	unsigned int id;
	unsigned char type;
	unsigned int devid;
	unsigned int up;
	unsigned int down;
	unsigned char direction;
	unsigned char character;
	unsigned char limit;
	unsigned int map;
}TYPE_LKFILESG;
typedef struct {
	unsigned int id;
	unsigned char type;
	unsigned int devid;
	unsigned int up;
	unsigned int down;
	unsigned char character;
	unsigned int length;
	unsigned int map;
}TYPE_LKFILEWC;
typedef struct {
	unsigned int id;
	unsigned char type;
	unsigned int devid;
	unsigned int up;
	unsigned int down;
	unsigned char character;
	unsigned int length;
	unsigned int map;
}TYPE_LKFILEGD;
typedef struct {
	unsigned int id;
	unsigned char type;
	unsigned int swid;
	unsigned int devid;
	unsigned int upd;
	unsigned int upf;
	unsigned int downd;
	unsigned int downf;
	unsigned char direction;
	unsigned char character;
	unsigned char relation;
	unsigned char swchr;
	unsigned char dlimit;
	unsigned char flimit;
	unsigned int swmap;
	unsigned int map;
}TYPE_LKFILESW;
typedef struct {
	unsigned int id;
	unsigned char type;
	unsigned int devid;
	unsigned int up;
	unsigned int down;
	unsigned char direction;
	unsigned char character;
	unsigned char limit;
	unsigned int map;
}TYPE_LKFILEXN;

typedef struct {
	unsigned char type;
	unsigned int devid;
	unsigned int upd;
	unsigned int upf;
	unsigned int downd;
	unsigned int downf;
	unsigned char direction;
	unsigned char character;
	unsigned int map;
	unsigned int swmap;
	unsigned int length;
}TYPE_LINKNODE;

typedef struct {
	unsigned int sgnum;
	unsigned int sgstart;
	unsigned int wcnum;
	unsigned int wcstart;
	unsigned int gdnum;
	unsigned int gdstart;
	unsigned int swnum;
	unsigned int swstart;
	unsigned int xnnum;
	unsigned int xnstart;
	unsigned int nodenum;
}TYPE_LINKHEAD;

typedef struct {
	int track;
	char *tstr;
}TYPE_JOB_MEM;

typedef struct {
	int trannum;
	TYPE_JOB_MEM *mems;
}TYPE_JOB_TRANSLATE;

static TYPE_BRT_HEAD *pbrthead;
static unsigned char *pbrts;
static TYPE_MRT_HEAD *pmrthead;
static TYPE_MRT *pmrts;
static TYPE_LINKHEAD *plnkhead;
static TYPE_LINKNODE *plnks;
static TYPE_JOB_TRANSLATE jobtr;

extern void G93_ShowInfor(int id,unsigned char cmd);
extern void GetDistance(void);
extern int IsSignalOpen(int id);
extern void GetRtColor(unsigned char engageid);
extern void ClearAllWhite(void);
extern unsigned char GetBit(unsigned char data,int src,int dst);
static unsigned char slide;
extern PORT *com2;

STATION station;
JOBLIST joblist;
ROUTE route1;
ROUTE routepre;
TRAIN train;
#ifdef HAVEDAOCHA
DCLIMIT dclimit;
DCLIMIT savedl;
#endif
/*typedef struct{
	unsigned int id;
	unsigned int length;
	unsigned char start;
	unsigned char end;
	unsigned char tracknum;
	unsigned char tracks[8];
	unsigned int tracklen[8];
}BASEROUTE;

typedef struct{
	unsigned int id;
	unsigned int length;
	unsigned char start;
	unsigned char end;
	unsigned char state;
	unsigned char basenum;
	BASEROUTE base[7];
}ROUTE;*/

int GetSigLnkLoc(int id)
{
	int i,j;
	int ret;
	ret=-1;
	if(id<=0)
		return(ret);
	if(id&1)
	{
		j=station.dhdcnum+station.dhlcnum;
		if(id<=(j*2-1))
		{
			ret=(id-1)/2;
		}
		else if(id<=(2*(j+station.dhxnnum)-1))
		{
			ret=plnkhead->sgnum+plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum+(id-j*2-1)/2;
		}
		else
			return(ret);
	}
	else
	{
		j=station.shdcnum+station.shlcnum;
		if(id<=(j*2))
		{
			ret=station.dhdcnum+station.dhlcnum+(id-2)/2;
		}
		else if(id<=(2*(j+station.shxnnum)))
		{
			i=plnkhead->sgnum+plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum+station.dhxnnum;
			ret=i+(id-j*2-2)/2;
		}
		else
			return(ret);
	}
	return(ret);
}

int GetTrkLnkLoc(int id)
{
	int i,j;
	if(id<=0)
		return(-1);
	j=plnkhead->sgnum+plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum;
	for(i=plnkhead->sgnum;i<j;i++)
	{
		if(plnks[i].devid==id)
			return(i);
	}
	return(-1);
}

void InitJlData(void)
{
	int i,j,floc;
	int handle,fllen;
	FILE *fl;
	handle=open(station.jbjlfile,O_RDONLY);
	if(handle==-1)
		fllen=0;
	else
	{
		fllen=filelength(handle);
		close(handle);
	}

	if((fl=fopen(station.jbjlfile,"rb"))==NULL) return;
	
	if(pbrts!=NULL)
	{
		free(pbrts);
		pbrts=NULL;
	}
	pbrts=malloc(fllen);
	fread(pbrts,1,fllen,fl);
	fclose(fl);
	pbrthead=(TYPE_BRT_HEAD*) pbrts;
	printf("downstart=%d,downnum=%d\n",pbrthead->downstart,pbrthead->downnum);
	if((fl=fopen(station.fhjlfile,"rb"))==NULL) return;
	if(pmrthead!=NULL)
	{
		free(pmrthead);
		pmrthead=NULL;
	}
	if(pmrts!=NULL)
	{
		free(pmrts);
		pmrts=NULL;
	}
	pmrthead=(TYPE_MRT_HEAD*)malloc(sizeof(TYPE_MRT_HEAD));
	if(pmrthead==NULL)
		return;
	fread(pmrthead,sizeof(TYPE_MRT_HEAD),1,fl);
	pmrthead->brtend=pbrthead->downstart+pbrthead->downnum-1;
	pmrthead->num=0;
	floc=13;
	for(i=0;i<(pmrthead->upmax-1);i++)
	{
		fseek(fl,floc,SEEK_SET);
		fread(&j,2,1,fl);
		pmrthead->num+=j;
		floc+=6;
	}
	for(i=0;i<(pmrthead->downmax-1);i++)
	{
		fseek(fl,floc,SEEK_SET);
		fread(&j,2,1,fl);
		pmrthead->num+=j;
		floc+=6;
	}
	printf("num=%d,loc=%d,brtend=%d\n",pmrthead->num,pmrthead->loc,pmrthead->brtend);
	pmrts=(TYPE_MRT*)malloc(sizeof(TYPE_MRT)*pmrthead->num);
	fseek(fl,pmrthead->loc,SEEK_SET);
	fread(pmrts,sizeof(TYPE_MRT),pmrthead->num,fl);
	fclose(fl);
	printf("brt1=%d,mrt1=%d,brtn=%d,mrtn=%d\n",pmrts[0].brt,pmrts[0].mrt,
		pmrts[pmrthead->num-1].brt,pmrts[pmrthead->num-1].mrt);
}

void InitJobTranslate(void)
{
	int i;
	char sname[500];
	long lvalue;
	FILE *fl;
	if(jobtr.mems!=NULL)
	{
		for(i=0;i<jobtr.trannum;i++)
		{
			if(jobtr.mems[i].tstr!=NULL)
				free(jobtr.mems[i].tstr);
		}
		free(jobtr.mems);
		jobtr.mems=NULL;
		jobtr.trannum=0;
	}
	if((fl=fopen(station.jobfile,"r"))!=NULL)
	{
		lvalue=0;
		fscanf(fl,"station=%ld\n",&lvalue);
		fscanf(fl,"yard=%ld\n",&lvalue);
		fscanf(fl,"translate=%ld\n",&lvalue);
		if(lvalue<0)
			lvalue=0;
		if(lvalue>100)
			lvalue=100;
		jobtr.trannum=lvalue;
		jobtr.mems=malloc(jobtr.trannum*sizeof(TYPE_JOB_MEM));
		for(i=0;i<jobtr.trannum;i++)
		{
			fscanf(fl,"%ld=%s\n",&lvalue,sname);
			sname[99]=0;
			jobtr.mems[i].track=lvalue;
			lvalue=strlen(sname);
			jobtr.mems[i].tstr=malloc(lvalue+1);
			strcpy(jobtr.mems[i].tstr,sname);
		}
		fclose(fl);
	}
	printf("jobtr.trannum=%d\n",jobtr.trannum);
	//for(i=0;i<jobtr.trannum;i++)
	//{
	//	printf("%d=%s,%x,%x\n",jobtr.mems[i].track,jobtr.mems[i].tstr,jobtr.mems[i].tstr[0],jobtr.mems[i].tstr[1]);
	//}
}

int GetStaInf(long stid)
{
	int stanum;
	int i,j,nodeid;
	long lvalue;
	unsigned int lsst;
	unsigned int offset,location;
	char strs[15];
	char lsstrs[50];
	FILE *fl;
	TYPE_LKFILEHEAD lkhead;
	TYPE_LKFILESG *psg=NULL;
	TYPE_LKFILEWC *pwc=NULL;
	TYPE_LKFILEGD *pgd=NULL;
	TYPE_LKFILESW *psw=NULL;
	TYPE_LKFILEXN *pxn=NULL;
	sprintf(strs,"%ld",stid);
	strcpy(lsstrs,strs);
	strcat(lsstrs,"dev.djk");
	if((fl=fopen(lsstrs,"rb"))==NULL) return(0);

	station.stationno=stid;
	strcpy(station.devicefile,strs);
	strcat(station.devicefile,"dev.djk");
	strcpy(station.specfile,strs);
	strcat(station.specfile,"spe.djk");
	strcpy(station.linkfile,strs);
	strcat(station.linkfile,"lnk.djk");
	strcpy(station.jbjlfile,strs);
	strcat(station.jbjlfile,"bas.djk");
	strcpy(station.fhjlfile,strs);
	strcat(station.fhjlfile,"mul.djk");
	strcpy(station.limitfile,strs);
	strcat(station.limitfile,"lim.djk");
	strcpy(station.jobfile,strs);
	strcat(station.jobfile,"job.djk");

	fseek(fl,6,SEEK_SET);
	fread(&station.yardno,1,1,fl);
	fread(&station.radiochannel,1,1,fl);
	printf("yardno=%d,radio=%d\n",station.yardno,station.radiochannel);
	
	fseek(fl,10,SEEK_SET);
	fread(&station.dhdcnum,2,10,fl);
	fclose(fl);
	printf("shgdnum=%d\n",station.shgdnum);

	i=(station.dhdcnum+3)/4;
	i+=(station.shdcnum+3)/4;
	i+=(station.dhlcnum+1)/2;
	i+=(station.shlcnum+1)/2;
	i+=(station.dhgdnum+3)/4;
	i+=(station.shgdnum+3)/4;
	i+=(station.dhswnum+3)/4;
	i+=(station.shswnum+3)/4;
	//i+=(station.dhgdnum+7)/8;
	//i+=(station.shgdnum+7)/8;
	station.radiodatanum=i;
	printf("radiodatanum=%d\n",station.radiodatanum);

	station.signalnum=station.dhdcnum+station.shdcnum+station.dhxnnum+station.shxnnum;
	printf("signalnum=%d\n",station.signalnum);

	if(plnks!=NULL)
		free(plnks);
	plnks=NULL;
	if(plnkhead==NULL)
		plnkhead=(TYPE_LINKHEAD*)malloc(sizeof(TYPE_LINKHEAD));
	if((fl=fopen(station.linkfile,"rb"))==NULL) return(0);

	fread(&lkhead,sizeof(TYPE_LKFILEHEAD),1,fl);
	plnkhead->sgnum=lkhead.sgnum;
	plnkhead->sgstart=0;
	plnkhead->wcnum=lkhead.wcnum;
	plnkhead->wcstart=plnkhead->sgstart+plnkhead->sgnum;
	plnkhead->gdnum=lkhead.gdnum;
	plnkhead->gdstart=plnkhead->wcstart+plnkhead->wcnum;
	plnkhead->swnum=lkhead.swnum;
	plnkhead->swstart=plnkhead->gdstart+plnkhead->gdnum;
	plnkhead->xnnum=lkhead.xnnum;
	plnkhead->xnstart=plnkhead->swstart+plnkhead->swnum;
	plnkhead->nodenum=lkhead.sgnum+lkhead.wcnum+lkhead.gdnum+lkhead.swnum+lkhead.xnnum;
	plnks=(TYPE_LINKNODE*)malloc(sizeof(TYPE_LINKNODE)*plnkhead->nodenum);
	nodeid=0;
	psg=(TYPE_LKFILESG*)malloc(lkhead.sglen);
	fseek(fl,lkhead.sgstart,SEEK_SET);
	for(i=0;i<lkhead.sgnum;i++)
	{
		fread(psg,lkhead.sglen,1,fl);
		plnks[nodeid].type=psg->type;
		plnks[nodeid].devid=psg->devid;
		plnks[nodeid].upd=psg->up;
		plnks[nodeid].upf=psg->up;
		plnks[nodeid].downd=psg->down;
		plnks[nodeid].downf=psg->down;
		plnks[nodeid].direction=psg->direction;
		plnks[nodeid].character=psg->character;
		plnks[nodeid].map=psg->map;
		plnks[nodeid].swmap=0;
		plnks[nodeid].length=0;
		nodeid++;
	}
	free(psg);
	
	pwc=(TYPE_LKFILEWC*)malloc(lkhead.wclen);
	//fseek(fl,lkhead.wcstart,SEEK_SET);
	for(i=0;i<lkhead.wcnum;i++)
	{
		fread(pwc,lkhead.wclen,1,fl);
		plnks[nodeid].type=pwc->type;
		plnks[nodeid].devid=pwc->devid;
		plnks[nodeid].upd=pwc->up;
		plnks[nodeid].upf=pwc->up;
		plnks[nodeid].downd=pwc->down;
		plnks[nodeid].downf=pwc->down;
		plnks[nodeid].direction=0;
		plnks[nodeid].character=pwc->character;
		plnks[nodeid].map=pwc->map;
		plnks[nodeid].swmap=0;
		plnks[nodeid].length=pwc->length;
		nodeid++;
	}
	free(pwc);

	pgd=(TYPE_LKFILEGD*)malloc(lkhead.gdlen);
	//fseek(fl,lkhead.gdstart,SEEK_SET);
	for(i=0;i<lkhead.gdnum;i++)
	{
		fread(pgd,lkhead.gdlen,1,fl);
		plnks[nodeid].type=pgd->type;
		plnks[nodeid].devid=pgd->devid;
		plnks[nodeid].upd=pgd->up;
		plnks[nodeid].upf=pgd->up;
		plnks[nodeid].downd=pgd->down;
		plnks[nodeid].downf=pgd->down;
		plnks[nodeid].direction=0;
		plnks[nodeid].character=pgd->character;
		plnks[nodeid].map=pgd->map;
		plnks[nodeid].swmap=0;
		plnks[nodeid].length=pgd->length;
		nodeid++;
	}
	free(pgd);

	psw=(TYPE_LKFILESW*)malloc(lkhead.swlen);
	//fseek(fl,lkhead.gdstart,SEEK_SET);
	for(i=0;i<lkhead.swnum;i++)
	{
		fread(psw,lkhead.swlen,1,fl);
		plnks[nodeid].type=psw->type;
		plnks[nodeid].devid=psw->devid;
		plnks[nodeid].upd=psw->upd;
		plnks[nodeid].upf=psw->upf;
		plnks[nodeid].downd=psw->downd;
		plnks[nodeid].downf=psw->downf;
		plnks[nodeid].direction=psw->direction;
		plnks[nodeid].character=psw->character;
		plnks[nodeid].map=psw->map;
		plnks[nodeid].swmap=psw->swmap;
		plnks[nodeid].length=0;
		nodeid++;
	}
	free(psw);

	pxn=(TYPE_LKFILEXN*)malloc(lkhead.xnlen);
	//fseek(fl,lkhead.xnstart,SEEK_SET);
	for(i=0;i<lkhead.xnnum;i++)
	{
		fread(pxn,lkhead.xnlen,1,fl);
		plnks[nodeid].type=pxn->type;
		plnks[nodeid].devid=pxn->devid;
		plnks[nodeid].upd=pxn->up;
		plnks[nodeid].upf=pxn->up;
		plnks[nodeid].downd=pxn->down;
		plnks[nodeid].downf=pxn->down;
		plnks[nodeid].direction=pxn->direction;
		plnks[nodeid].character=pxn->character;
		plnks[nodeid].map=pxn->map;
		plnks[nodeid].swmap=0;
		plnks[nodeid].length=0;
		nodeid++;
	}
	free(pxn);
	fclose(fl);
	printf("sgnum=%d,gdnum=%d,swnum=%d,xnnum=%d\n",plnkhead->sgnum,plnkhead->gdnum,
		plnkhead->swnum,plnkhead->xnnum);
	nodeid-=2;
	printf("type=%d,devid=%d,upd=%d,upf=%d,downd=%d,downf=%d,direction=%d,character=%d,map=%d\n",
		plnks[nodeid].type,plnks[nodeid].devid,plnks[nodeid].upd,plnks[nodeid].upf,
		plnks[nodeid].downd,plnks[nodeid].downf,plnks[nodeid].direction,
		plnks[nodeid].character,plnks[nodeid].map);
	nodeid=0;
	printf("type=%d,devid=%d,upd=%d,upf=%d,downd=%d,downf=%d,direction=%d,character=%d,map=%d\n",
		plnks[nodeid].type,plnks[nodeid].devid,plnks[nodeid].upd,plnks[nodeid].upf,
		plnks[nodeid].downd,plnks[nodeid].downf,plnks[nodeid].direction,
		plnks[nodeid].character,plnks[nodeid].map);

	if(station.entrances!=NULL)
		free(station.entrances);
	station.entrances=NULL;
	if((fl=fopen(station.specfile,"rb"))!=NULL)
	{
		fseek(fl,9,SEEK_SET);
		fread(&station.entrancenum,1,1,fl);
		fread(&i,2,1,fl);
		i+=4;
		printf("entancenum=%d\n",station.entrancenum);
		fseek(fl,i,SEEK_SET);
		station.entrances=(TYPE_ENTRANCE *)malloc(sizeof(TYPE_ENTRANCE)*station.entrancenum);
		fread(station.entrances,sizeof(TYPE_ENTRANCE),station.entrancenum,fl);
		fclose(fl);
		printf("id \tfac\tsor\ttra\tups\tdos\tupd\tdod\tupa\tdoa\n");
		for(i=0;i<station.entrancenum;i++)
		{
			printf("%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\t%3d\n",(int)station.entrances[i].id,
				(int)station.entrances[i].factory,(int)station.entrances[i].sort,
				station.entrances[i].track,
				station.entrances[i].upsignal,station.entrances[i].downsignal,
				station.entrances[i].updistance,station.entrances[i].downdistance,
				station.entrances[i].upaction,station.entrances[i].downaction);
		}
		//printf("en1=%d,end9=%d\n",station.entrances[0].id,station.entrances[8].id);
	}
	else
		station.entrancenum=0;
	
	i=(station.dhgdnum+1)/2+(station.shgdnum+1)/2;
	if(station.showtra!=NULL)
		free(station.showtra);
	station.showtra=NULL;
	station.showtra=(unsigned char *)malloc(i);
	
	if(station.signals!=NULL)
		free(station.signals);
	station.signals=NULL;
	station.signals=(unsigned char *)malloc(station.radiodatanum);
	i=(station.dhdcnum+3)/4;
	i+=(station.shdcnum+3)/4;
	i+=(station.dhlcnum+1)/2;
	i+=(station.shlcnum+1)/2;
	station.tracks=station.signals+i;

	i+=(station.dhgdnum+3)/4;
	i+=(station.shgdnum+3)/4;
	station.switchs=station.signals+i;

	InitJobTranslate();
	//i+=(station.dhswnum+3)/4;
	//i+=(station.shswnum+3)/4;
	//station.lctrks=station.signals+i;

	InitJlData();
	return(1);
}

int ResetStation(long stid)
{
	int i;
	disable();
	i=GetStaInf(stid);
	enable();
	if(i)
	{
		train.netstate=0;
	}
	return(i);
}

void InitStation(void)
{
	int i;
	long lvalue;
	FILE *fl;
	station.stationno=0;
	station.yardno=0;
	station.dhdcnum=0;       
	station.shdcnum=0;       
	station.dhlcnum=0;       
	station.shlcnum=0;       
	station.dhxnnum=0;       
	station.shxnnum=0;       
	station.dhgdnum=0;       
	station.shgdnum=0;       
	station.dhswnum=0;       
	station.shswnum=0;       

⌨️ 快捷键说明

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