📄 djk.c
字号:
k|=rcvstr[15];
//printf("receive distance=%d\n",k);
//if(k>=0)
{
if(0xfff==k)
senddis=0;
else if(k>10)
{
if(k!=train.gudaodis)
{
train.gudaodis=k;
//printf("gudao=%d\n",train.gudaodis);
GetDistance();
}
}
else if(k==0 || k==1)
train.gudaodis=k;
else
train.gudaodis=0;
//printf("distance=%d\n",k);
}
train.gdfordis=rcvstr[17]>>4;
train.gdfordis<<=8;
train.gdfordis|=rcvstr[16];
if(haveslide)
{
if(!rtbeenchg)
{
G93_ShowInfor(11,0xff);
}
}//2005.11.4
//train.distance=rcvstr[i+8];
//train.distance|=((unsigned int)(rcvstr[i+7]&0xc0))<<2;
//Show_Io(7,1);
sendstr[3]='Z';
sendstr[4]=22;
sendstr[5]=station.stationno;
sendstr[6]=station.stationno>>8;
sendstr[7]=station.yardno;
sendstr[8]=train.nolo;
sendstr[9]=train.nomid;
sendstr[10]=train.nohi;
sendstr[11]=train.id;
sendstr[12]=train.forlight;
sendstr[13]=train.curhook&0x3f;
if(0xaa==train.lightcolor)
sendstr[13]|=0x40;
sendstr[14]=train.curroute;
sendstr[15]=train.fortrack;
sendstr[16]=train.fortrack>>8;
sendstr[17]=train.speed;
sendstr[18]=abs(train.displacement);
if(0x8a==train.g93trend)//
sendstr[19]=0;//
else
sendstr[19]=0x80;//
if(train.displacement<0)
sendstr[19]|=0x20;
sendstr[19]|=(abs(train.displacement)>>8)&0x1f;
if(senddis)
{
//printf("zgddis=%d ",train.zgddis);
sendstr[20]=train.zgddis&0xff;
sendstr[21]=train.zgddis>>3;
sendstr[21]&=0xe0;
if(senddis==2)
sendstr[19]|=0x40;//手动确认
//printf("distance sent!\n");
}
else
{
sendstr[20]=train.g93forltdis&0xff;
sendstr[21]=train.g93forltdis>>3;
sendstr[21]&=0xe0;
}
//printf("dirct=%x\n",sendstr[17]);
if(train.error&G93ERROR)
sendstr[21]|=0x08;
else if(train.error&DSERROR)
sendstr[21]|=0x10;
else if(train.error&XSQERROR)
sendstr[21]|=0x18;
if(train.brake)
{
if(train.brake&0x80)//紧急
{
sendstr[21]|=0x07;
}
else if(train.brake&0x40)//常用
{
sendstr[21]|=0x06;
}
else if(train.brake&0x20)//卸载
{
sendstr[21]|=0x05;
}
else if(train.brake&0x08)//解锁
{
sendstr[21]|=0x04;
}
else if(train.brake&0x04)//警惕
{
sendstr[21]|=0x02;
}
}
//sendstr[21]|=(train.brake>>5)&0x07;
sendstr[22]=train.g93limit&0x3f;
if(affirmdc)
sendstr[22]|=0x80;
if(senddis==1)
sendstr[22]|=0x40;//自动确认
sendstr[23]=(train.forlight>>5)&0xf8;
sendstr[23]|=(train.curroute>>8)&0x07;
sendstr[24]=train.planesignal;
k=Crc_Check(sendstr,25);
sendstr[25]=k;
sendstr[26]=k>>8;
//if(train.id>1)
// DelaySend(1);
//else
port_puts(sendstr,27,com1);
//port_puts(sendstr,27,com2);
DebugData(1,1,27,sendstr);
//printf("dirct=%x\n",sendstr[17]);
/*outstr[0]='S';
outstr[1]=':';
outstr[2]=0;
for(i=0;i<(5+sendstr[4]);i++)
{
sprintf(ostr,"%x ",sendstr[i]);
strcat(outstr,ostr);
}
sprintf(ostr,"\n");
strcat(outstr,ostr);
printf("%s",outstr); //--------------modify*/
}
if(slide)
{
if(GetPass(slidetimer,timer)>3000)
slide=0;
}//2006.3hsw
//Check_TrackJoin();
//ShowInfor(1);
}
/*for(i=0;i<2+rcvstr[1];i++)
printf("%x ",rcvstr[i]);
printf("\n");*/
}
int Wireless_Rcv(void)
{
static unsigned int Com1_Timer=0;
static unsigned char Com1_State=0;
static unsigned int Wireless_Timer=0,Join_Timer=0;
static unsigned char joining=0;
unsigned char rcvstr[256];
unsigned char c;
unsigned int i,j,k;
//DelaySend(0);
DelayJoin(0);//入网延迟时间,100ms
if(1==train.netstate)
{
if(joining)
{
if(GetPass(Join_Timer,timer)>=30000)//30s
{
joining++;
Join_Timer=timer;
}
if(joining>=5)//5*30s 入网不成工,取消入网
{
train.netstate=0;
joining=0;
CheckJoinState(4,0);
}
}
else
{
joining=1;
Join_Timer=timer;
}
}
else
{
joining=0;
}
i=port_getlen(com1);
if(i>0)
{
if(i!=Com1_State)
{
Show_Io(0,20);
Com1_State=i;
Com1_Timer=timer;
}
}
if(Com1_State)
{
if(GetPass(Com1_Timer,timer)>=30 || port_getlen(com1)>=255)
{
i=port_getlen(com1);
//printf("%d ",i);
DebugData(1,0,i,com1->in.buffer);
//port_puts(com1->in.buffer,i,com2);
//printf("%d\n",i);
if(i>255)
i=255;
//for(j=0;j<i;j++)
// printf("data%x ",com1->in.buffer[j]);
//printf("\n");
if(i>=4)
{
if(0xef==com1->in.buffer[0] && station.radiochannel==com1->in.buffer[1]
&& station.radiochannel==com1->in.buffer[2] &&
station.radiochannel==com1->in.buffer[3])
{
CheckStation(2,0);//转换频道成功
}
for(c=0;c<(i-5);c++)
{
if('A'==com1->in.buffer[c] && 'T'==com1->in.buffer[c+1] && '&'==com1->in.buffer[c+2])
{
j=com1->in.buffer[c+4];
//j=j+2;
if(j>250)
j=250;
if((i-c)>3 && (i-c)>=j)
{
k=Crc_Check(com1->in.buffer+c,j+3);
if((k&0xff)==com1->in.buffer[c+j+3] && (k>>8)==com1->in.buffer[c+j+4])
{
memcpy(rcvstr,com1->in.buffer+c+3,j+8);
Wireless_Timer=timer;
Wireless_Analyse(rcvstr);
}
}
c+=j+4;
}
}
}
port_clear(com1);
Com1_State=0;
Com1_Timer=timer;
train.error&=~DTERROR;
}
}
else
{
i=GetPass(Com1_Timer,timer);
if(i>=30000)
{
port_clear(com1);
Com1_State=0;
Com1_Timer=timer;
train.error|=DTERROR;
}
}
i=GetPass(Wireless_Timer,timer);
if(i>4000)
{
//port_clear(com1);
//Com1_State=0;
Wireless_Timer=timer;
if(1==train.netstate)
{
//if(random(2))
Join_Net();
}
}
i=GetPass(Station_Timer,timer);
if(i>10000)//tong xin duan kai 10s ji lu yi ci 电台10s故障
{
Station_Timer=timer;
train.lightcolor=0x55;
memset(station.signals,0,station.radiodatanum);
memset(station.showtra,0,(station.dhgdnum+1)/2+(station.shgdnum+1)/2);
//memset(&station.signals[0],0,10); //信号
//memset(&station.tracks[0],0,16); //占用区段信息
//memset(&station.daochas[0],0,13);
if(!StationError)
SaveState(5);
StationError=1;
//ShowInfor(1);
}
i=GetPass(Route_Timer,timer);
if(i>10000 && 1!=train.netstate)
{
Route_Timer=timer;
//if(0xaa==train.lightcolor)
// G93_ShowInfor(8,train.forlight);
//ClearMe();
//train.distance=-1;
if(0==train.netstate)
{
train.length=-1;
}
if(2==train.netstate || 3==train.netstate)
{
//RouteChange(0,train.curroute,0,0);
KillRoute(&route1);
KillRoute(&routepre);
ClearMe();
ClearAllWhite();
train.length=-1;
train.netstate=0;
gooutstation=0;
SaveState(4);//地面退网,地面不给发送控制信息
}
//ShowInfor(1);
}
return(0);
}
void PointChange(int pid)
{
int i;
SavePoint(pid);
if(StationError) //如果与地面主机通讯失败,将不再入网
{
train.point=pid;
return;
}
//printf("pointchange!%d\n",pid);
if(2!=train.netstate)
train.curtrack=station.entrances[pid-1].track;
CheckDistance(1,station.entrances[pid-1].disp);
if(0x0a==train.g93trend)
{
if(station.entrances[pid-1].upaction==POINT_ACTION_JOIN)
{
if(1!=train.netstate && 2!=train.netstate)
{
train.netstate=1;
train.forlight=station.entrances[pid-1].upsignal;
CheckJoinState(1,pid);
G93_ShowInfor(10,pid);
}
}
else if(station.entrances[pid].upaction==POINT_ACTION_QUIT)
{
if(1==train.netstate || 2==train.netstate)
train.netstate=3*train.netstate-3;
}
if(station.entrances[pid-1].upaction==POINT_ACTION_END ||
station.entrances[pid-1].upaction==POINT_ACTION_ENDPREP)
{
selfcontrol=0xc0;
if(train.netstate!=2)
{
train.forlight=station.entrances[pid-1].upsignal;
train.revlight=station.entrances[pid-1].downsignal;
}
G93_ShowInfor(10,pid);
}
else
{
selfcontrol=0;
}
if(station.entrances[pid-1].upaction==POINT_ACTION_PREPARE ||
station.entrances[pid-1].upaction==POINT_ACTION_ENDPREP)
{
if(!shouldjoin)
{
shouldjoin=0x81;
if(2!=train.netstate)
{
train.forlight=station.entrances[pid-1].upsignal;
train.revlight=station.entrances[pid-1].downsignal;
CacJoinLength(1);
Check_ShouldJoin(0);
}
}
}
else
{
shouldjoin=0;
}
}
else if(0x8a==train.g93trend)
{
if(station.entrances[pid-1].downaction==POINT_ACTION_JOIN)
{
if(1!=train.netstate && 2!=train.netstate)
{
train.netstate=1;
train.forlight=station.entrances[pid-1].downsignal;
CheckJoinState(1,pid);
G93_ShowInfor(10,pid);
}
}
else if(station.entrances[pid].downaction==POINT_ACTION_QUIT)
{
if(1==train.netstate || 2==train.netstate)
train.netstate=3*train.netstate-3;
}
if(station.entrances[pid-1].downaction==POINT_ACTION_END ||
station.entrances[pid-1].downaction==POINT_ACTION_ENDPREP)
{
selfcontrol=0xc1;
if(train.netstate!=2)
{
train.forlight=station.entrances[pid-1].downsignal;
train.revlight=station.entrances[pid-1].upsignal;
}
G93_ShowInfor(10,pid);
}
else
{
selfcontrol=0;
}
if(station.entrances[pid-1].downaction==POINT_ACTION_PREPARE ||
station.entrances[pid-1].downaction==POINT_ACTION_ENDPREP)
{
if(!shouldjoin)
{
shouldjoin=0x80;
if(2!=train.netstate)
{
train.forlight=station.entrances[pid-1].downsignal;
train.revlight=station.entrances[pid-1].upsignal;
CacJoinLength(1);
Check_ShouldJoin(0);
}
}
}
else
{
shouldjoin=0;
}
}
train.point=pid;
}
int GetPoint(unsigned char *data)
{
int i,j;
j=data[14];
for(i=0;i<station.entrancenum;i++)
{
if(j==station.entrances[i].id)
return(i+1);
}
return(0);
}
void ChangeChannel(int cid)
{
unsigned char data[10];
int i;
data[0]=0x55;//Sync
data[1]=5;//len
data[2]=0xE0;//cmd
data[3]=cid;//package
data[4]=cid;
data[5]=cid;
data[6]=data[0]^data[1]^data[2]^data[3]^data[4]^data[5];//check_xor
port_puts(data,7,com1);
}
void CheckStation(int cmd,int data)
{
static int ChnToChg=0;
static int PointId=0;
static unsigned char RadioState=0;
static unsigned char AllowChg=0;
static unsigned int RadioTimer=0,RdSendTimer=0,RdDelayTimer=0;
int i,j;
switch(cmd)
{
case 1://开始转换频道
ChnToChg=station.radiochannel;
PointId=data;
AllowChg=1;
RdDelayTimer=timer;
break;
case 2://转换频道成功
ChnToChg=0;
AllowChg=0;
break;
case 3://接受到站场信息
if(PointId)
{
PointChange(PointId);
PointId=0;
}
break;
case 0:
i=port_getlen(com1);
if(RadioState!=i)
{
RadioState=i;
RadioTimer=timer;
}
if(GetPass(RadioTimer,timer)>20)
{
RadioTimer=timer;
if(AllowChg)
{
AllowChg=0;
port_clear(com1);
ChangeChannel(station.radiochannel);
RdSendTimer=timer;
}
}
if(ChnToChg)
{
if(!AllowChg)
{
if(GetPass(RdSendTimer,timer)>300)
{
RdSendTimer=timer;
AllowChg=1;
}
}
}
if(PointId)
{
if(GetPass(RdDelayTimer,timer)>6000)
{
RdDelayTimer=timer;
ChnToChg=0;
PointId=0;
AllowChg=0;
}
}
break;
default:
break;
}
}
int Com4_Proc(void)
{
static unsigned int Com4_Timer=0,Com4_State=0,Point_Timer=0,Stop_Timer=0;
static unsigned char StopSame=0;
static unsigned char PrePoint=0;
unsigned int i,j,k,n;
unsigned char c;
unsigned char Com4_Data[20];
CheckStation(0,0);
i=port_getlen(com4);
if(i>0)
{
if(i!=Com4_State)
{
if(!Com4_State)
Show_Io(3,20);
Com4_State=i;
Com4_Timer=timer;
}
}
if(Com4_State)
{
if(GetPass(Com4_Timer,timer)>=10 || port_getlen(com4)>=200)
{
i=port_getlen(com4);
//port_puts(com4->in.buffer,i,com2);//debug
DebugData(4,0,i,com4->in.buffer);
if(i>20)
i=20;
port_gets(Com4_Data,i,com4);
if(i>=7 && 0xff==Com4_Data[0] && 0xff==Com4_Data[1] && 0xff==Com4_Data[2] && 0x7e==Com4_Data[3])
{
j=Com4_Data[4];
n=0;
if(j==1 || j==12)
{
k=Crc_Check(Com4_Data,j+5);
if((k&0xff)==Com4_Data[j+5] && (k>>8)==Com4_Data[j+6])
n=1;
}
if(n)
{
if(j==1)
{
if(Com4_Data[5]==0xaa)
{
Show_Io(0x13,20);
Point_Timer=timer;
if(train.error&DSERROR)
SaveState(8);//应答器恢复记录事件,,有联络信息
train.error&=~DSERROR;
}
}
else
{
k=Com4_Data[6];
k<<=8;
k|=Com4_Data[5];
if(k!=station.stationno)
{
if(ResetStation(k))
{
StationError=1;
CheckStation(1,GetPoint(Com4_Data));
}
}
k=GetPoint(Com4_Data);
if(k)
{ //printf("point=%d\n",k);
if(k!=PrePoint || 0==StopSame)
{
PointChange(k);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -