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

📄 station.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 3 页
字号:
	}
	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&0x01)
				break;
			if(c&0x02)
				SetTrkColor(plnks[node].devid,TKWHITE);
			else
				break;
		}
		else if(plnks[node].type==1 || plnks[node].type==5)
		{
			if(plnks[node].devid==train.forlight || plnks[node].direction==direction)
				break;
		}
		node=GetNextNode(node,direction);
	}
}

int GetRouteInfor(BASEROUTE *pbase)
{
	int i;
	TYPE_BRT *pfbrt;
	if(!pbase->start || !pbase->end)
		return(0);
	if(GetLightDrct(pbase->start)==DRCTXX)
	{
		for(i=pbrthead->upnum;i<(pbrthead->upnum+pbrthead->downnum);i++)
		{
			pfbrt=(TYPE_BRT *)(pbrts+pbrthead->rtlocs[i]);
			if(pfbrt->start==pbase->start && pfbrt->end==pbase->end)
			{
				pbase->length=pfbrt->length;
				return(1);
			}
		}
	}
	else
	{
		for(i=0;i<pbrthead->upnum;i++)
		{
			pfbrt=(TYPE_BRT *)(pbrts+pbrthead->rtlocs[i]);
			if(pfbrt->start==pbase->start && pfbrt->end==pbase->end)
			{
				pbase->length=pfbrt->length;
				return(1);
			}
		}
	}
	return(0);
}

int GetJoinRoute(int *track,int *node,BASEROUTE *pbase,int direction)
{
	BASEROUTE sbase;
	int i,j,k;
	int snode,engage,prenode;
	if(*track<=0)
		return(0);
	if(direction==0x0a)
		direction=LINK_DRCT_UP;
	else if(direction==0x8a)
		direction=LINK_DRCT_DOWN;
	else
		return(0);
	if(*node<0)
	{
		i=GetTrkLnkLoc(*track);
		if(i<0)
			return(0);
		*node=i;
	}
	k=plnks[*node].map-8;
	if(k<0)
		return(0);
	sbase.start=0;
	sbase.end=0;
	if(!GetMapEngage(k))
		return(0);
	engage=1;
	snode=GetNextNode(*node,direction);
	prenode=*node;
	while(snode>=0)
	{
		if(plnks[snode].type==1 || plnks[snode].type==5)
		{
			if(plnks[snode].direction==direction)
			{
				sbase.end=plnks[snode].devid;
				if(!engage)
					break;
			}
		}
		else if(plnks[snode].type==2 || plnks[snode].type==3 || plnks[snode].type==4)
		{
			k=plnks[snode].map-8;
			if(k>=0)
			{
				if(GetMapEngage(k))
				{
					if(engage)
					{
						*node=snode;
						*track=plnks[snode].devid;
					}
					if(sbase.end)
					{
						sbase.start=sbase.end;
						sbase.end=0;
					}
				}
				else
				{
					engage=0;
					if((plnks[prenode].type==1 || plnks[prenode].type==5) && plnks[prenode].direction==direction)
					{
						break;
					}
				}
			}
		}
		prenode=snode;
		snode=GetNextNode(snode,direction);
	}
	if(sbase.start && sbase.end)
	{
		if(sbase.start!=pbase->start || sbase.end!=pbase->end)
		{
			memcpy(pbase,&sbase,sizeof(BASEROUTE));
			GetRouteInfor(pbase);
			return(1);
		}
	}
	return(0);
}

#ifdef HAVEDAOCHA
int GetRtLimit(int rtno)
{
	int i,whatdc;
	dclimit.dcnum=0;
	if(0==routepre.id || rtno<0)
		return(0);
	whatdc=0;
	for(i=0;i<routepre.fhjl.jlnum;i++)
	{
		if(routepre.base[i].start==SG_D8 && (routepre.base[i].id==136 || routepre.base[i].id==137))
		{
			whatdc=SG_D8;
			break;
		}
		//else if(routepre.base[i].start==SG_D6)
		//{
		//	whatdc=SG_D6;
		//	break;
		//}
	}
	
	switch(whatdc)
	{
	case SG_D8:
		dclimit.dclight[0]=SG_D8;
		dclimit.dclen[0]=10;
		dclimit.dcnum=1;
		break;
	case SG_D6:
		dclimit.dclight[0]=SG_D6;
		dclimit.dclen[0]=40;
		dclimit.dcnum=1;
		break;
	default:
		break;
	}
	return(whatdc);
	
}
#endif

void InitBaseRoute(BASEROUTE *brt,unsigned int id)
{
    unsigned int i;
	unsigned int loc;
	if(id<pbrthead->upstart || id>(pbrthead->downstart+pbrthead->downnum-1))
		return;
	loc=pbrthead->rtlocs[id-pbrthead->upstart];
	memcpy(&i,&pbrts[loc],2);
	if(i!=id)
		return;
	brt->tracknum=pbrts[loc+3];
	if(brt->tracknum>8)
		brt->tracknum=8;
	memcpy(&brt->start,pbrts+loc+4,2);
	memcpy(&brt->end,pbrts+loc+6,2);
	memcpy(&brt->length,pbrts+loc+8,2);
	memcpy(brt->tracks,pbrts+loc+10,2*brt->tracknum);
	memcpy(brt->tracklen,pbrts+loc+10+2*brt->tracknum,2*brt->tracknum);
	
	if(GetSigProp(brt->end)&PROPERTY_JT)				//尽头线
		brt->length-=10;	
}

void GetMrt(FHJL *pfh,int id)
{
	int i;
	if(id<pmrthead->start || id>(pmrthead->start+pmrthead->num-1))
		return;
	pfh->jlnum=0;
	id=id-pmrthead->start;
	for(i=0;i<8;i++)
	{
		pfh->jl[pfh->jlnum++]=pmrts[id].brt;
		if(pmrts[id].mrt<=pmrthead->brtend)
		{
			if(pfh->jlnum<8)
				pfh->jl[pfh->jlnum++]=pmrts[id].mrt;
			break;
		}
		id=pmrts[id].mrt-pmrthead->start;
	}
}

void InitFhRoute(ROUTE *rt,unsigned int id)
{
	int i,j;
	if(id<pmrthead->start || id>(pmrthead->start+pmrthead->num-1))
		return;
	rt->fhjl.jlnum=0;
	GetMrt(&rt->fhjl,id);
	for(j=0;j<rt->fhjl.jlnum;j++)
	{
		InitBaseRoute(&rt->base[j],rt->fhjl.jl[j]);
	}
	rt->start=rt->base[0].start;
	rt->end=rt->base[rt->fhjl.jlnum-1].end;
	rt->id=id;
}

int CreateRoute(ROUTE *rt,unsigned int id)
{
	rt->id=0;
	rt->fhjl.length=0;
	rt->fhjl.jlnum=0;
	if(id<=pmrthead->brtend)
	{
		rt->id=id;
		rt->fhjl.jlnum=1;
		rt->fhjl.jl[0]=id;
		InitBaseRoute(&rt->base[0],id);
		rt->fhjl.length=rt->base[0].length;
		rt->start=rt->base[0].start;
		rt->end=rt->base[0].end;
	}
	else
	{
		InitFhRoute(rt,id);
	}
	rt->state=GetBsRtProperty(rt,rt->fhjl.jlnum-1);
	return(rt->id);
}

void KillRoute(ROUTE *rt)
{
	rt->id=0;
	rt->fhjl.length=0;
	rt->state=0;
	rt->fhjl.jlnum=0;
}

int GetRelation(ROUTE *rt1,ROUTE *rt2)
{
	int i,j,k;
	if(0==rt1->id)
		return(0);
	if(0xffff==rt1->id && 0!=rt2->id && 0xffff!=rt2->id)
		return(1);
	if(0==rt2->id || 0xffff==rt2->id || rt2->fhjl.jlnum<1)
		return(0);
	//printf("route1.id=%d,routepre.id=%d\n",rt1->id,rt2->id);
	if(rt1->fhjl.jl[rt1->fhjl.jlnum-1]!=rt2->fhjl.jl[rt2->fhjl.jlnum-1])
	{
		if(rt1->fhjl.jl[0]!=rt2->fhjl.jl[0])
			return(0);//头尾都不同
		else
			return(2);//头相同,尾不同
	}
	k=0;
	for(i=0;i<rt1->fhjl.jlnum;i++)
	{
		for(j=0;j<rt2->fhjl.jlnum;j++)
		{
			if(rt1->fhjl.jl[i]==rt2->fhjl.jl[j])
			{
				k++;
				break;
			}
		}
	}
	if(k==rt1->fhjl.jlnum)
		return(1);	//尾相同,1包含于2中
	else
		return(0);
}

int CheckOutGd(unsigned int engageid)
{
	ROUTE ert;
	if((!engageid) || (!train.isingudao))
		return 0;
	CreateRoute(&ert,engageid);
	if(!IsTrkGudao(ert.base[0].tracks[ert.base[0].tracknum-1]))
	{
		if(train.isingudao&0x80)
			train.length=-1;
		train.isingudao=0;
		return 1;
	}
	else
		return 0;
}

#ifdef HAVEDAOCHA
void CheckOutDc(int cmd)
{
	int i,j;
	static int passltdis[5]={0,0,0,0,0};
	static int dcintrk[5]={0,0,0,0,0};
	static unsigned char dctrkeng[5]={0,0,0,0,0};
	static unsigned char passstate[5]={0,0,0,0,0};
	static int lrtid=0;
	switch(cmd)
	{
	case 0://init
		if(routepre.id==0 || lrtid==routepre.id)
			return;
		if(!GetRtLimit(routepre.id))
		{
			if(savedl.dcnum)
			{
				j=0;
				for(i=0;i<savedl.dcnum;i++)
				{
					if(dcintrk[i] && !GetTrkEngage(dcintrk[i]))
					{
						G93_ShowInfor(5,i+1);
						j++;
					}
				}
				if(j==savedl.dcnum)
					savedl.dcnum=0;
			}
			return;
		}
		lrtid=routepre.id;
		memset(&savedl,0,15);
		for(i=0;i<dclimit.dcnum;i++)
		{
			for(j=0;j<savedl.dcnum;j++)
			{
				if(dclimit.dclight[i]==savedl.dclight[j])
					break;
			}
			if(j==savedl.dcnum)
			{
				savedl.dclight[savedl.dcnum]=dclimit.dclight[i];
				savedl.dclen[savedl.dcnum]=dclimit.dclen[i];
				switch(savedl.dclight[savedl.dcnum])
				{
				case SG_D8:
					dcintrk[savedl.dcnum]=TK_2T20DG;
					break;
				case SG_D6:
					dcintrk[savedl.dcnum]=TK_4T12DG;
					break;
				default:
					break;
				}
				savedl.dcnum++;
			}
			else
			{
				if(dclimit.dclen[i]>savedl.dclen[j])
					savedl.dclen[j]=dclimit.dclen[i];
			}
		}
		memset(passltdis,0,10);
		memset(passstate,0,5);
		dclimit.dcnum=0;
		port_puts("savedl.dcnum=",13,com2);
		port_puts((unsigned char *)&savedl.dcnum,2,com2);
		break;
	case 1://when the signal is closed,set the displacement of the signal point
		for(i=0;i<savedl.dcnum;i++)
		{
			if(savedl.dclight[i] && (!IsSignalOpen(savedl.dclight[i])) && (!passstate[i]))
			{
				passltdis[i]=train.displacement;
				if(!passltdis[i])
					passltdis[i]=1;
				passstate[i]=1;
				port_puts("clear light",11,com2);
			}
			if(dcintrk[i] && !GetTrkEngage(dcintrk[i]) && dctrkeng[i])
			{
				G93_ShowInfor(5,i+1);
				passltdis[i]=0;
				port_puts("clear track",11,com2);
				for(j=0;j<savedl.dcnum;j++)
				{
					if(passltdis[j])
						break;
				}
				if(j==savedl.dcnum)
				{
					lrtid=0;
					savedl.dcnum=0;
					port_puts("all dc cleared",14,com2);
				}
			}
			if(dcintrk[i])
			{
				dctrkeng[i]=GetTrkEngage(dcintrk[i]);
			}
		}
		break;
	case 2://the dis between signal and now point reach the dclen?
		for(i=0;i<savedl.dcnum;i++)
		{
			if(passltdis[i])
			{
				if(abs(train.displacement-passltdis[i])>savedl.dclen[i])
				{
					G93_ShowInfor(5,i+1);
					passltdis[i]=0;
					dcintrk[i]=0;
					port_puts("dc clear is ok",14,com2);
					for(j=0;j<savedl.dcnum;j++)
					{
						if(passltdis[j])
							break;
					}
					if(j==savedl.dcnum)
					{
						lrtid=0;
						savedl.dcnum=0;
						port_puts("all dc cleared",14,com2);
					}
				}
			}
		}
		break;
	case 3://clear data
		memset(&savedl,0,15);
		memset(passltdis,0,10);
		memset(dcintrk,0,10);
		memset(dctrkeng,0,5);
		memset(passstate,0,5);
		lrtid=0;
		break;
	default:
		break;
	}
}
#endif

void UniteRoute(ROUTE *rtarget,ROUTE *rsource)
{
	int i;
	rtarget->fhjl.jlnum=1;
	for(i=0;i<rsource->fhjl.jlnum;i++)
	{
		rtarget->fhjl.jl[1+i]=rsource->fhjl.jl[i];
		memcpy(&rtarget->base[1+i],&rsource->base[i],sizeof(BASEROUTE));
		rtarget->fhjl.jlnum++;
		rtarget->end=rsource->base[i].end;
		if(i>=6)
			break;
	}
}

void RouteChange(unsigned int curid,unsigned int engageid,int ltpre,int ltcur)
{
int i,j,k;
ROUTE lsroute;
	CheckOutGd(engageid);
	if(0!=engageid && 0==curid)
		curid=0xffff;
	if(0==engageid && 0xffff==curid)
		curid=0;
	if(curid==route1.id)
	{
		if(curid!=0xffff || routepre.id==engageid)
			return;
	}
	if(curid==0)/////////////////////2004.6.16为防止卡死壳信息慢加防护!
	{
		if(route1.id!=0 && route1.id!=0xffff)
		{
			if(train.speed>0 && train.forlight==route1.end && train.prelight==route1.start)
			{
				curid=0xffff;
				engageid=route1.id;
			}
		}
	}/////////////////////2004.6.16为防止卡死壳信息慢加防护i
	if(0xffff==curid)
	{
		if(0xffff!=route1.id || engageid!=routepre.id)//ui
		{
			CreateRoute(&routepre,engageid);
			routepre.state|=0x08;
			j=route1.id;
			i=0;
		
			if(route1.id!=engageid)
			{
				if(ltpre==routepre.start && ltcur==routepre.end)
					G93_ShowInfor(4,0xff);
				else
					G93_ShowInfor(11,0xff);
			}
			else
			{
				if(IsTrkGudao(route1.base[0].tracks[route1.base[0].tracknum-1]))
					train.routelen=route1.fhjl.length;//train.gudaodis;
				else
					train.routelen=route1.fhjl.length;
				i=0xff;
				G93_ShowInfor(4,i);
			}
			KillRoute(&route1);
			//port_puts("03\n",3,com2);
			if(IsTrkGudao(routepre.base[0].tracks[routepre.base[0].tracknum-1]))
			{
				train.isingudao=routepre.state&0x8d;//还未转向,还未确认,还未自动确认,上行
				if(0x8a==train.g93trend)
					train.isingudao|=0x02;
				if(GetTrkEngage(routepre.base[0].tracks[routepre.base[0].tracknum-1]))
					train.isingudao|=0x80;
				//else if(train.gudaodis==1)
				//	train.isingudao|=0x80;
				if(0!=joblist.jobid && train.curhook!=0 && train.curhook<=joblist.hooknum)
					G93_ShowInfor(9,1);
			}
			else
				train.isingudao=0;
#ifdef HAVEDAOCHA
			G93_ShowInfor(5,0);
#endif
		}
		route1.id=0xffff;
		train.trend=GetRtDrct(&routepre);
	}
	else if(0==curid)
	{
		if(!(routepre.state&0x08))
			ClearAllWhite();
		if((0!=route1.id && 0xffff!=route1.id) || slide)
		{
			train.routelen-=route1.fhjl.length;
			G93_ShowInfor(11,0xff);
			//G93_ShowInfor(8,route1.start);
			//printf("sinal closed! ");
		}
		KillRoute(&route1);
		KillRoute(&routepre);
	}
	else
	{
		if(curid!=route1.id)
		{
			if(0==route1.id)
			{
				//KillRoute(&routepre);
				//CacTrainLength(4);
				CreateRoute(&routepre,curid);
				CreateRoute(&route1,curid);
				train.routelen=route1.fhjl.length;
				train.trend=GetRtDrct(&route1);
				/*if(0==train.g93trend)
				{
					if(DRCTSX==train.trend)
						train.g93trend=0x0a;
					else if(DRCTXX==train.trend)
						train.g93trend=0x8a;
				}*/
			}
			else
			{
				if(0xffff==route1.id)
				{
					CreateRoute(&routepre,curid);
					CreateRoute(&route1,curid);
					train.routelen+=route1.fhjl.length;
					train.trend=GetRtDrct(&route1);
					routepre.state&=0xf7;
				}
				else
				{
					j=routepre.state;
					CreateRoute(&routepre,route1.id);
					CreateRoute(&route1,curid);
					i=GetRelation(&route1,&routepre);
					if(1==i)//尾相同,1包含于2中
					{
						routepre.state|=0x08;
						if(IsTrkGudao(routepre.base[0].tracks[routepre.base[0].tracknum-1]))
						{
							train.isingudao=routepre.state&0x8d;//还未转向,还未确认,还未自动确认,上行
							if(0x8a==train.g93trend)
								train.isingudao|=0x02;
							if(GetTrkEngage(routepre.base[0].tracks[routepre.base[0].tracknum-1]))
								train.isingudao|=0x80;
							//else if(train.gudaodis==1)
							//	train.isingudao|=0x80;
						}
						else
							train.isingudao=0;
						train.routelen=routepre.fhjl.length;
					}
					else if(2==i)//头相同,尾不同
					{
						train.routelen-=routepre.fhjl.length;
						train.routelen+=route1.fhjl.length;
						/*for(k=0;k<routepre.fhjl.jlnum;k++)
						{
							if(routepre.fhjl.jl[k]==route1.fhjl.jl[route1.fhjl.jlnum-1])
								G93_ShowInfor(8,route1.end);
							if(k>=4)
								break;
						}*/
						CreateRoute(&routepre,route1.id);
						routepre.state=j;
					}
					else//头尾都不同
					{
						if(engageid!=0 && engageid==routepre.fhjl.jl[0])
						{
							UniteRoute(&routepre,&route1);
							routepre.state|=0x08;
							if(IsTrkGudao(routepre.base[0].tracks[routepre.base[0].tracknum-1]))
							{
								train.isingudao=routepre.state&0x8d;//还未转向,还未确认,还未自动确认,上行
								if(0x8a==train.g93trend)
									train.isingudao|=0x02;
								if(GetTrkEngage(routepre.base[0].tracks[routepre.base[0].tracknum-1]))
									train.isingudao|=0x80;
							}
							else
								train.isingudao=0;
						}
						else
						{
							CreateRoute(&routepre,route1.id);
							train.routelen=route1.fhjl.length;
							routepre.state&=0xf7;
						}
					}
					train.trend=GetRtDrct(&routepre);
				}
			}
			//printf("route%d.length=%d,base0=%d\n",route1.id,route1.fhjl.length,route1.base[0].id);
			G93_ShowInfor(4,0xff);
			//port_puts("04\n",3,com2);
#ifdef HAVEDAOCHA
			G93_ShowInfor(5,0);
#endif
		}
	}
	GetRtColor(engageid);
	GetDistance();
#ifdef HAVEDAOCHA
	if(routepre.id>0 && engageid==0)
		CheckOutDc(0);
#endif
	//printf("curid=%d,route1.id=%d,distance=%d\n",curid,route1.id,train.distance);
}

⌨️ 快捷键说明

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