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

📄 djk.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -