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

📄 station.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 3 页
字号:
	 
	station.radiodatanum=0;
	station.signalnum=0;  
	station.tracknum=0;   
	station.switchnum=0;  
	station.entrancenum=0;

	station.jbjlfile=NULL;
	station.fhjlfile=NULL;
	station.limitfile=NULL;
	station.linkfile=NULL;
	station.devicefile=NULL;
	station.specfile=NULL;

	station.entrances=NULL;
	station.tracks=NULL;
	station.switchs=NULL;
	station.signals=NULL;
	station.showtra=NULL;

	pbrthead=NULL;
	pbrts=NULL;
	pmrthead=NULL;
	pmrts=NULL;
	plnkhead=NULL;
	plnks=NULL;
	jobtr.trannum=0;
	jobtr.mems=NULL;

	station.jbjlfile=malloc(15);
	station.fhjlfile=malloc(15);
	station.limitfile=malloc(15);
	station.linkfile=malloc(15);
	station.devicefile=malloc(15);
	station.specfile=malloc(15);
	station.jobfile=malloc(15);

	station.conversion=DEFAULT_CONVERSION;
	station.pipe=DEFAULT_PIPE;

	if((fl=fopen(FILETRAIN,"r"))==NULL) return;

	lvalue=0;
	fscanf(fl,"train=%ld\n",&lvalue);
	train.nohi=lvalue>>16;
	train.nomid=lvalue>>8;
	train.nolo=lvalue&0xff;
	printf("train no=%ld\n",lvalue);

	lvalue=0;
	fscanf(fl,"direction=%ld\n",&lvalue);
	train.drctsort=lvalue;
	printf("drct sort=%d\n",train.drctsort);
	
	lvalue=0;
	fscanf(fl,"conversion=%ld\n",&lvalue);
	station.conversion=lvalue;
	printf("conversion=%d\n",station.conversion);
	if(station.conversion<10 || station.conversion>30)
		station.conversion=DEFAULT_CONVERSION;

	lvalue=0;
	fscanf(fl,"pipe=%ld\n",&lvalue);
	station.pipe=lvalue;
	printf("pipe=%d\n",station.pipe);

	lvalue=0;
	fscanf(fl,"station=%ld\n",&lvalue);
	printf("station=%ld\n",lvalue);
	fclose(fl);
	ResetStation(lvalue);

	//debug down
	//CreateRoute(&route1,158);
	//printf("id=%d,jlnum=%d,start=%d,end=%d\n",route1.id,route1.fhjl.jlnum,route1.start,route1.end);
	//for(i=0;i<route1.fhjl.jlnum;i++)
	//	printf("base%d=%d,%d,%d\n",route1.fhjl.jl[i],route1.base[i].tracknum,route1.base[i].start,route1.base[i].end);

	/*printf("Signal link loc debug:\n");
	for(i=0;i<(station.dhdcnum+station.dhlcnum+station.dhxnnum+5);i++)
	{
		lvalue=GetSigLnkLoc(2*i+1);
		printf("Signal link %d loc=%ld\n",2*i+1,lvalue);
		if(plnks[lvalue].devid!=(2*i+1))
			printf("Signal link Error!\n");
	}
	for(i=0;i<(station.shdcnum+station.shlcnum+station.shxnnum+5);i++)
	{
		lvalue=GetSigLnkLoc(2*i+2);
		printf("Signal link %d loc=%ld\n",2*i+2,lvalue);
		if(plnks[lvalue].devid!=(2*i+2))
			printf("Signal link Error!\n");
	}*/
	//printf("Sig %d Prop=%x,Sig %d Prop=%x\n",2,GetSigProp(2),46,GetSigProp(46));
	//debug up
}

int TranslateJobTrk(char *str)
{
	int i;
	for(i=0;i<jobtr.trannum;i++)
	{
		if(!strcmp(jobtr.mems[i].tstr,str))
			return(jobtr.mems[i].track);
	}
	return(0);
}

int GetTrkLoc(int tid)
{
	int i;
	if(tid&1)
	{
		if(tid>(station.dhgdnum*2-1))
			i=-1;
		else
			i=(tid-1);
	}
	else
	{
		if(tid>(station.shgdnum*2))
			i=-1;
		else
		{
			i=(station.dhgdnum+3)/4;
			i=i*8;
			i+=tid-2;
		}
	}
	return(i);
}

int GetTrkEngage(int tid)
{
	int i;
	i=GetTrkLoc(tid);
	if(i<0)
		return(1);
	return(GetBit(station.tracks[i/8],i%8,0));
}

int GetTrkOpen(int tid)
{
	int i;
	i=GetTrkLoc(tid);
	if(i<0)
		return(0);
	return(GetBit(station.tracks[i/8],7-(i%8),0));
}

int GetSigLoc(int sid)
{
	int i;
	if(sid<=0)
		return(-1);
	if(sid&1)
	{
		if(sid<=(station.dhdcnum*2-1))
			i=sid-1;
		else if(sid<=((station.dhdcnum+station.dhlcnum)*2-1))
		{
			i=(station.dhdcnum+3)/4+(station.shdcnum+3)/4;
			i=i*8;
			i+=2*(sid-(2*station.dhdcnum+1));
		}
		else
			i=-1;
	}
	else
	{
		if(sid<=(station.shdcnum*2))
		{
			i=(station.dhdcnum+3)/4;
			i=i*8;
			i+=sid-2;
		}
		else if(sid<=((station.shdcnum+station.shlcnum)*2))
		{
			i=(station.dhdcnum+3)/4+(station.shdcnum+3)/4+(station.dhlcnum+1)/2;
			i=i*8;
			i+=2*(sid-(2*station.shdcnum+2));
		}
		else
			i=-1;
	}
	
	return(i);
}

int GetSigProp(int id)
{
	int i;
	unsigned char ret;
	ret=0;
	if(id<=0)
		return(ret);
	i=GetSigLnkLoc(id);
	if(i<0)
		return(ret);
	if(plnks[i].direction!=LINK_DRCT_UP)
		ret|=PROPERTY_XX;
	if(plnks[i].type==5)
	{
		if(plnks[i].character==1 || plnks[i].character==2 || plnks[i].character==3)
			ret|=PROPERTY_JT;
		else if(plnks[i].character==4)
			ret|=PROPERTY_FJ;
		else if(plnks[i].character==5)
			ret|=PROPERTY_ZJ;
		ret|=PROPERTY_XN;
	}
	else if(plnks[i].type==1)
	{
		if(plnks[i].character==13)
			ret|=PROPERTY_FJ;
		else if(plnks[i].character==11)
			ret|=PROPERTY_ZJ;
	}
	return(ret);
}

int IsBackSignal(int sgid)
{
	int i;
	i=GetSigLnkLoc(sgid);
	if(i<0)
		return(0);
	if(plnks[i].type==5 && plnks[i].character==8)
		return(1);
	return(0);
}

int IsGudaoXhj(int id)
{
	int i;
	int node;
	if(id<=0)
		return(0);
	i=GetSigLnkLoc(id);
	if(i<0)
		return(0);
	if(plnks[i].direction!=1)
	{
		node=plnks[i].upd-1;
		for(i=0;i<2;i++)
		{
			if(node<0)
				return(0);
			if(plnks[node].type==1 || plnks[node].type==4)
			{
				return(0);
			}
			else if(plnks[node].type==3)
				return(1);
			node=plnks[node].upd-1;
		}
	}
	else
	{
		node=plnks[i].downd-1;
		for(i=0;i<2;i++)
		{
			if(node<0)
				return(0);
			if(plnks[node].type==1 || plnks[node].type==4)
			{
				return(0);
			}
			else if(plnks[node].type==3)
				return(1);
			node=plnks[node].downd-1;
		}
	}
	return(0);
}

int GetGdTrack(int gid)
{
	if(gid<=0)
		return(0);
	return(plnks[plnkhead->gdstart+gid-1].devid);
}

int IsTrkGudao(int id)
{
	int i;
	if(id<=0)
		return(0);
	for(i=0;i<plnkhead->gdnum;i++)
	{
		if(plnks[plnkhead->gdstart+i].devid==id)
			return(i+1);
	}
	return(0);
}

int IsRtGudao(ROUTE *rt)
{
	int i;
	if(0==rt->id || rt->fhjl.jlnum<=0)
		return(0);
	i=IsTrkGudao(rt->base[rt->fhjl.jlnum-1].tracks[rt->base[rt->fhjl.jlnum-1].tracknum-1]);
	return(i);
}

int GetGdLength(int trkid)
{
	int i;
	if(trkid<=0)
		return(0);
	for(i=0;i<plnkhead->gdnum;i++)
	{
		if(plnks[plnkhead->gdstart+i].devid==trkid)
			return(plnks[plnkhead->gdstart+i].length);
	}
	return(0);
}

unsigned char GetLightDrct(int lt)
{
	//unsigned char ret;
	int i;
	if(lt<=0)
		return(0xff);
	i=GetSigProp(lt);
	if(i&PROPERTY_XX)
		return(DRCTXX);
	else
		return(DRCTSX);
}

unsigned char GetBsRtProperty(ROUTE *rt,int bid)
{
	int i;
	unsigned char ret;
	ret=0;
	if(0==rt->fhjl.jlnum)
		return(ret);
	i=rt->base[bid].end;
	ret=GetSigProp(i)&0x70;
	return(ret);
}

/*unsigned char GetRtProperty(ROUTE *rt)
{
	int i;
	unsigned char ret;
	ret=0;
	if(0==rt->fhjl.jlnum)
		return(ret);
	i=rt->base[rt->fhjl.jlnum-1].tracks[rt->base[rt->fhjl.jlnum-1].tracknum-1];
	if(IsTrkGudao(i))//存车线
	{
		if(GetTrkEngage(i))
			ret|=0x80;
		//printf("i=%d,ret=%x ",i,ret);
	}
	if(16==i)	//尽头线
		ret|=0x40;
	switch(i)		//集中区
	{
	case 7:
	case 24:
		if(DRCTSX==train.trend)
			ret|=0x10;
		break;
	case 126:
	case 130:
	case 143:
	case 144:
		if(DRCTXX==train.trend)
			ret|=0x10;
		break;
	default:
		break;
	}

	switch(i)		//站界
	{
	case 7:
		if(DRCTSX==train.trend)
			ret|=0x20;
		break;
	case 126:
	case 130:
		if(DRCTXX==train.trend)
			ret|=0x20;
		break;
	default:
		break;
	}

	return(ret);
}*/

unsigned char GetRtDrct(ROUTE *rt)
{
	return(GetLightDrct(rt->start));
}

int IsLcOpen(int cl)
{
	if(cl>1 && cl<7)//if(cl>2 && cl<7)//debug
		return(1);
	else
		return(0);
}

void SetTrkColor(int tkid,unsigned char color)
{
	int i,j,offset;
	unsigned char data;
	
	if(tkid<=0)
		return;
	if(tkid&1)
	{
		i=(tkid-1)>>1;
		offset=i>>1;
	}
	else
	{
		i=(tkid>>1)-1;
		offset=(station.dhgdnum+1)>>1;
		offset+=i>>1;
	}
	
	j=(i&1)<<2;
	data=station.showtra[offset]&(0x0f<<j);
	data>>=j;
	if(data!=TKRED)
	{
		station.showtra[offset]&=0xf0>>j;
		station.showtra[offset]|=color<<j;
	}
}

#define Get2Map(b) ((station.signals[b>>3]>>(b&0x07))&0x03)
#define Get4Map(b) ((station.signals[b>>3]>>(b&0x07))&0x0f)
#define GetMapLock(b) ((station.signals[b>>3]>>(b&0x07))&0x02)
#define GetMapEngage(b) ((station.signals[b>>3]>>(b&0x07))&0x01)

int GetSwiNext(int id,int direction)
{
	int i;
	unsigned char c;
	i=plnks[id].swmap-8;
	if(i<0)
		return(-1);
	c=Get2Map(i);
	if(direction==LINK_DRCT_UP)
	{
		if(c==1)//f
			return(plnks[id].upf-1);
		else if(c==2)//d
			return(plnks[id].upd-1);
		else
			return(-1);
	}
	else if(direction==LINK_DRCT_DOWN)
	{
		if(c==1)//f
			return(plnks[id].downf-1);
		else if(c==2)//d
			return(plnks[id].downd-1);
		else
			return(-1);
	}
	else
		return(-1);
}

int GetNextNode(int id,int direction)
{
	int ret;
	unsigned char c;
	if(direction==LINK_DRCT_UP)
	{
		if(plnks[id].type==4)
			ret=GetSwiNext(id,direction);
		else if(plnks[id].type>0 && plnks[id].type<6)
			ret=plnks[id].upd-1;
		else
			return(-1);
	}
	else if(direction==LINK_DRCT_DOWN)
	{
		if(plnks[id].type==4)
			ret=GetSwiNext(id,direction);
		else if(plnks[id].type>0 && plnks[id].type<6)
			ret=plnks[id].downd-1;
		else
			return(-1);
	}
	else
		return(-1);
	if(ret<0)
		return(-1);
	if(plnks[ret].type==4)
	{
		if(id==GetSwiNext(ret,(~direction)&0x03))
			return(ret);
		else
			return(-1);
	}
	else
		return(ret);
}

int GetNextTrk(int id,int direction)
{
	int node;
	int i;
	node=GetNextNode(id,direction);
	for(i=0;i<3;i++)
	{
		if(node<0)
			return(-1);
		if(plnks[node].type==2 || plnks[node].type==3 || plnks[node].type==4)
			return(node);
		if(plnks[node].type==1)
		{
			if((plnks[node].character==2 || plnks[node].character==3) && plnks[node].direction==direction)
				return(-1);
		}
		node=GetNextNode(node,direction);
	}
	return(-1);
}

void ClearLcColor(void)
{
	unsigned char c;
	int i;
	int stoff,shoff;
	int byte,bit;
	for(i=0;i<station.dhgdnum;i++)
	{
		byte=i>>2;
		bit=(i&0x03)<<1;
		c=(station.tracks[byte]>>bit)&0x03;
		if(!c)
		{
			byte=i>>1;
			bit=(i&0x01)<<2;
			if(((station.showtra[byte]>>bit)&0x0f)==TKGREEN)
			{
				station.showtra[byte]&=0xf0>>bit;
			}
		}
	}
	stoff=(station.dhgdnum+3)/4;
	shoff=(station.dhgdnum+1)/2;
	for(i=0;i<station.shgdnum;i++)
	{
		byte=stoff+(i>>2);
		bit=(i&0x03)<<1;
		c=(station.tracks[byte]>>bit)&0x03;
		if(!c)
		{
			byte=shoff+(i>>1);
			bit=(i&0x01)<<2;
			if(((station.showtra[byte]>>bit)&0x0f)==TKGREEN)
			{
				station.showtra[byte]&=0xf0>>bit;
			}
		}
	}
	/*for(i=0;i<(plnkhead->wcnum+plnkhead->gdnum+plnkhead->swnum);i++)
	{
		j=plnkhead->wcstart+i;
		if(plnks[j].map>7)
		{
			k=plnks[j].map-8;
			if(!Get2Map(k))
				ClearGreen(plnks[j].devid);
		}
	}*/
}

void CheckLcSignal(int id)
{
	int j,k;
	int track;
	if((plnks[id].character==2 || plnks[id].character==3) && plnks[id].map>7)
	{
		j=plnks[id].map-8;
		if(IsLcOpen(Get4Map(j)))
		{
			track=GetNextTrk(id,plnks[id].direction);
			while(track>=0)
			{
				k=plnks[track].map;
				if(k<8)
					break;
				k-=8;
				if(!GetMapLock(k))
					break;
				SetTrkColor(plnks[track].devid,TKGREEN);
				track=GetNextTrk(track,plnks[id].direction);
			}
		}
	}
}

void SetLcColor(void)
{
	int i;
	int lcstart,lcend;
	ClearLcColor();
	lcstart=station.dhdcnum;
	lcend=lcstart+station.dhlcnum;
	for(i=lcstart;i<lcend;i++)
	{
		CheckLcSignal(i);
	}
	lcstart=station.dhdcnum+station.dhlcnum+station.shdcnum;
	lcend=lcstart+station.shlcnum;
	for(i=lcstart;i<lcend;i++)
	{
		CheckLcSignal(i);
	}
}

void SearchWhite(int trkid)
{
	int start,end;
	int node;
	int i,j,k;
	int direction;
	unsigned char c;
	if(trkid<=0)
		return;
	if(train.g93trend==0x0a)
		direction=1;
	else if(train.g93trend==0x8a)
		direction=2;
	else
		return;
	i=GetTrkLnkLoc(trkid);
	if(i<0)
		return;
	
	/*if(IsSignalOpen(sgid))
	{
		node=GetNextNode(i,direction);
		while(node>=0)
		{
			if(plnks[node].type==2 || plnks[node].type==3 || plnks[node].type==4)
			{
				k=plnks[node].map;
				if(k<8)
					break;
				k-=8;
				c=Get2Map(k);
				if(c!=2)
					break;
				SetTrkColor(plnks[node].devid,TKWHITE);
			}
			else if(plnks[node].type==1)
			{
				if(plnks[node].direction==direction && !IsSignalOpen(plnks[node].devid))
					break;
			}
			node=GetNextNode(node,direction);
		}
	}*/
	node=GetNextNode(i,direction);
	while(node>=0)
	{
		if(plnks[node].type==2 || plnks[node].type==3 || plnks[node].type==4)
		{
			k=plnks[node].map;
			if(k<8)
				break;
			k-=8;
			if(!GetMapEngage(k))
				break;
		}
		else if(plnks[node].type==1 || plnks[node].type==5)
		{
			if(plnks[node].devid==train.forlight)
				break;
		}
		node=GetNextNode(node,direction);

⌨️ 快捷键说明

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