📄 station.c
字号:
}
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 + -