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

📄 djk.c

📁 LINUX的简单应用
💻 C
📖 第 1 页 / 共 5 页
字号:
{
	int i;
	if(0x8a==train.g93trend)
	{
		if(*forlt)
		{
			if(DRCTSX==GetLightDrct(*forlt))
			{
				i=*forlt;
				*forlt=*revlt;
				*revlt=i;
			}
		}
		else if(*revlt)
		{
			if(DRCTXX==GetLightDrct(*revlt))
			{
				i=*forlt;
				*forlt=*revlt;
				*revlt=i;
			}
		}
	}
	else
	{
		if(*forlt)
		{
			if(DRCTXX==GetLightDrct(*forlt))
			{
				i=*forlt;
				*forlt=*revlt;
				*revlt=i;
			}
		}
		else if(*revlt)
		{
			if(DRCTSX==GetLightDrct(*revlt))
			{
				i=*forlt;
				*forlt=*revlt;
				*revlt=i;
			}
		}
	}
	
	return(*forlt);
}

void my_int(void)
{
}

void ClearMe(void)
{
	KillRoute(&routepre);
	KillRoute(&route1);
	slide=0;
	train.routelen=0;
	train.curhook=0;
	train.lightcolor=0x55;
	joblist.jobid=0;
	joblist.hooknum=0;
	joblist.curhook=0;
	train.curhook=0;
	train.revlight=0;
	train.prelight=0;
	train.passrevlt=0;
	train.reversedis=-1;
	train.passrevdis=-1;
	train.isingudao=0;
	train.length=-1;
	train.jldelay=0;
	train.area=0;
	train.signalstate=0;
	CacTrainLength(4);//clear
	//CacJoinLength(4);//clear
#ifdef HAVEDAOCHA
	CheckOutDc(3);//clear
#endif
}

unsigned char Sum_Check(unsigned char *data,int len)
{
unsigned char ret;
int i;
	ret=data[0];
	for(i=1;i<len;i++)
		ret+=data[i];
	return ret;
}

unsigned int Crc_Check(unsigned char *ptr, unsigned char size)
{
	int i; unsigned char j;									
    unsigned char bit_temp;
	unsigned char crc_result[2];
     /*bit calculate  */
     /*  procedure of calculate CRC  */
    unsigned char * ptrt;									
    unsigned char ch_temp;
    ptrt = ptr;
     /*  clear crc buffer    */
    crc_result[0] = 0;
    crc_result[1] = 0;
     /*  transfer useful data to temp data buffer    */
    for(i=0;i<size;i++)
    {
		ch_temp = *ptrt++;
		/*  XOR the first bit   */
		bit_temp = crc_result[0] ^ ch_temp;
		bit_temp = bit_temp & 0x80;
		/*  left shift crc result buffer    */
		crc_result[0] = crc_result[0] << 1;
		if((crc_result[1] & 0x80) == 0x80)
		{
			crc_result[0] = crc_result[0] | 0x01;
		}
		crc_result[1] = crc_result[1] << 1;
		/*  after XOR, if the first bit is '1'  */
		if(bit_temp == 0x80)
		{
			/*  XOR crc result buffer and Generator polynomial  */
			crc_result[0] = crc_result[0] ^ 0x10;
			// CRC_HIGH     0x10
			//CRC
			crc_result[1] = crc_result[1] ^ 0x21;
			// CRC_LOW      0x21		//CRC

		}
		for(j=0;j<7;j++)
		{
			ch_temp = ch_temp << 1;
			/*  XOR the first bit   */
			bit_temp = crc_result[0] ^ ch_temp;
			bit_temp =bit_temp & 0x80;
			/*  left shift crc result buffer    */
			crc_result[0] = crc_result[0] << 1;
			if((crc_result[1] & 0x80) == 0x80)
			{
				crc_result[0] = crc_result[0] | 0x01;
			}
			crc_result[1] = crc_result[1] << 1;
			/*  after XOR, if the first bit is '1'  */
			if(bit_temp == 0x80)
			{
				/*  XOR crc result buffer and Generator polynomial  */
				crc_result[0] = crc_result[0] ^ 0x10;
				// CRC_HIGH     0x10		//CRC
				crc_result[1] = crc_result[1] ^ 0x21;
				// CRC_LOW      0x21		//CRC
			}
			
		 }
	}
	i=crc_result[1];
	i<<=8;
	i|=crc_result[0];
	return(i);
}

unsigned char GetBit(unsigned char data,int src,int dst)
{
	data>>=src;
	data&=0x01;
	data<<=dst;
	return(data);
}

unsigned char Get2Bit(unsigned char data,int src,int dst)
{
	data>>=src;
	data&=0x03;
	data<<=dst;
	return(data);
}

void SetTkWhite(int tkid)
{
	int i,j;
	unsigned char data;
	
	if(tkid<0)
		return;
	if(tkid&1)
	{
		i=(tkid-1)/2;
		data=station.showtra[i/2]&(0x0f<<(4*(i&1)));
		data>>=4*(i&1);
		if(data==TKBLUE)//data!=TKRED && data!=TKGREEN)
		{
			station.showtra[i/2]&=0xf0>>(4*(i&1));
			station.showtra[i/2]|=TKWHITE<<(4*(i&1));
		}
	}
	else
	{
		j=(station.dhgdnum+1)/2;
		i=tkid/2-1;
		data=station.showtra[j+i/2]&(0x0f<<(4*(i&1)));
		data>>=4*(i&1);
		if(data==TKBLUE)//data!=TKRED && data!=TKGREEN)
		{
			station.showtra[j+i/2]&=0xf0>>(4*(i&1));
			station.showtra[j+i/2]|=TKWHITE<<(4*(i&1));
		}
	}
}

unsigned char CheckTkColor(unsigned char src,unsigned char dest)
{
	/*if(id==23)
	{
		port_puts("before is:",10,com2);
		port_puts(&src,1,com2);
		port_puts(",",1,com2);
		port_puts(&dest,1,com2);
		port_puts("   ",3,com2);
	}*/
	dest&=0x0f;
	if(src&TKRED)
	{
		dest=TKRED;
	}
	else if(src&0x02)//lock?
	{
		if(dest!=TKWHITE && dest!=TKGREEN)
		{
			dest=TKBLUE;
		}
	}
	else
	{
		if(dest!=TKGREEN)
		{
			
				dest=TKDEFUALT;
		
		}
	}
	/*if(id==23)
	{
		port_puts("after  is:",10,com2);
		port_puts(&src,1,com2);
		port_puts(",",1,com2);
		port_puts(&dest,1,com2);
		port_puts("   ",3,com2);
	}*/
	return(dest);
}

void TransTkColor(void)
{
	int i,j,k,m;
	unsigned char c,thiscolor;
	SetLcColor();
	for(i=0;i<station.dhgdnum;i++)
	{
		c=Get2Bit(station.tracks[i/4],2*(i%4),0);
		j=4*(i%2);
		thiscolor=CheckTkColor(c,station.showtra[i/2]>>j);
		station.showtra[i/2]&=0x0f<<(4-j);
		station.showtra[i/2]|=thiscolor<<j;
	}
	k=(station.dhgdnum+3)/4;
	m=(station.dhgdnum+1)/2;
	for(i=0;i<station.shgdnum;i++)
	{
		c=Get2Bit(station.tracks[k+i/4],2*(i%4),0);
		j=4*(i%2);
		thiscolor=CheckTkColor(c,station.showtra[m+i/2]>>j);
		station.showtra[m+i/2]&=0x0f<<(4-j);
		station.showtra[m+i/2]|=thiscolor<<j;
	}
}

void ClearAllWhite(void)
{
	int i;
	for(i=0;i<((station.dhgdnum+1)/2+(station.shgdnum+1)/2);i++)
	{
		if((station.showtra[i]&0x0f)==TKWHITE)
		{
			station.showtra[i]&=0xf0;
		}
		if((station.showtra[i]>>4)==TKWHITE)
		{
			station.showtra[i]&=0x0f;
		}
	}
	TransTkColor();
}

void GetRtColor(unsigned char engageid)
{
	static unsigned char svengageid;
	int i,j;
	if(0==routepre.id)
	{
		if(!svengageid)
			ClearAllWhite();
	}
	else if((train.trend==DRCTXX && train.g93trend!=0x0a) || (train.trend==DRCTSX && train.g93trend!=0x8a))
	{
		ClearAllWhite();
		for(i=0;i<routepre.fhjl.jlnum;i++)
		{
			for(j=0;j<routepre.base[i].tracknum;j++)
			{
				SetTkWhite(routepre.base[i].tracks[j]);
			}
		}
	}
	SearchWhite(train.curtrack);
	svengageid=engageid;
}

void CheckConfirm(int cmd,unsigned char spd)
{
	unsigned char c;
	switch(cmd)
	{
	case 1:
		if(0==train.isingudao)
		{
			needconfirm=0;
			return;
		}
		if(spd>1)
		{
			needconfirm&=0x7f;
			needconfirm|=0x04;//速度已经超过1
			return;
		}
		if(!(needconfirm&0x04))
			return;
		needconfirm&=0xfb;
		if(train.isingudao&0x80)//存车线
		{
			if(!(train.isingudao&0x20))
				needconfirm|=0x80;
			else if((needconfirm&0x03)<2)
				needconfirm|=0x80;
		}
		else
		{
			if(train.isingudao&0x20)//已经手动确认
				needconfirm=0;
			else if(train.isingudao&0x10)//已经自动确认
			{
				//if( (train.g93trend==0x8a && (train.isingudao&0x02)==0) ||
				//	(train.g93trend==0x0a && (train.isingudao&0x02)!=0))
				needconfirm=0x80;
			}
		}
		break;
	case 2:
		if(train.isingudao&0x80)//存车线
		{
			c=needconfirm&0x03;
			if(c<2)
			{
				c++;
				needconfirm&=0xfc;
				needconfirm|=c;
			}
		}
		needconfirm&=0x7f;
		break;
	default:
		break;
	}
}

int GetDrtSame(void)
{
	//printf("rt=%d,train=%d\n",train.trend,train.g93trend);
	if(0==train.g93trend)
		return 1;
	if(0==routepre.id && 0!=train.forlight)
		train.trend=GetLightDrct(train.forlight);
	if(DRCTSX==train.trend && 0x0a==train.g93trend)
		return 1;
	if(DRCTXX==train.trend && 0x8a==train.g93trend)
		return 1;
	return 0;
}

int GetDistance(void)
{
	//if(1==train.netstate || 2==train.netstate)
		train.distance=train.g93dis;
	//else
	//	train.distance=-1;
	return(train.distance);
	/*int i,j;
	if(0==routepre.id || 0==GetDrtSame())
	{
		train.distance=train.g93dis;
	}
	else if(0==(routepre.state&0x08))
	{
		if(IsRtGudao(&routepre))
		{
			i=routepre.fhjl.jlnum-1;
			j=routepre.base[i].length;
			train.distance=train.routelen;
			if(0==train.gudaodis)
			{
				train.distance=0xffff;
			}
			else
			{
				train.distance=train.distance-j;
				train.distance=train.distance+train.gudaodis;
			}
		}
		else
		{
			train.distance=train.routelen;
		}
	}
	else
	{
		if(0==train.gudaodis)
		{
			train.distance=0xffff;
		}
		else if(IsRtGudao(&routepre))
		{
			if(routepre.fhjl.jlnum>1)
				i=routepre.base[0].length;
			else
				i=train.gudaodis;
			j=routepre.fhjl.jlnum-1;
			j=routepre.base[j].length;
			train.distance=train.routelen-j;
			train.distance=train.distance+train.gudaodis;
			train.distance=train.distance-(i-train.g93dis);
		}
		else
		{
			i=routepre.base[0].length;
			train.distance=train.routelen-(i-train.g93dis);
		}
	}
	return(train.distance);*/
}

/*void ShowInfor(int id)
{
	static int cerror[2]={0,0}; //clear 0xffff error
	static unsigned char nextid[4]={3,3,3,3};
	static unsigned char sendid=0;
	int i;
	unsigned char lsstr[255];
	unsigned long value;
	//if(1==id)
	//printf("At&L%d,%d,%d,%d,sendid=%d\n",nextid[0],nextid[1],nextid[2],nextid[3],sendid);
	if(0==id)
	{
		//printf("%d,%d,%d,%d,cmd=%d,sendid=%d\n",nextid[0],nextid[1],nextid[2],nextid[3],id,sendid);
		id=nextid[0];
		for(i=0;i<3;i++)
			nextid[i]=nextid[i+1];
		nextid[3]=3;
		if(sendid>0)
			sendid--;
	}
	else
	{
		for(i=0;i<4;i++)
		{
			if(id==nextid[i])
			{
				break;
			}
		}
		if(4==i)
		{
			nextid[sendid]=id;
			if(sendid<3)
				sendid++;
		}
		return;
	}
	
	switch(id)
	{
	case 1:
		lsstr[0]='&';
		lsstr[1]='L';
		lsstr[2]=20;
		lsstr[3]=train.curroute;
		lsstr[4]=route1.id&0xff;
		lsstr[5]=route1.id>>8;
		for(i=0;i<8;i++)
		{
			lsstr[6+i]=station.tracks[i];
			lsstr[14+i]=station.signals[i];
		}
		i=23;
		//lsstr[22]=Sum_Check(lsstr,22);
		//rs485_puts(lsstr,23,com4);
		//printf("checkl=%x\n",lsstr[19]);
		break;
	case 2:
		//if(rcvstr[1]>250)
		//	return;
		lsstr[0]='&';
		lsstr[1]='W';
		
		memcpy(lsstr+2,&joblist,joblist.len+1);
		i=joblist.len+3;
		//lsstr[i-1]=Sum_Check(lsstr,i-1);
		//rs485_puts(lsstr,i,com4);
		//com4->data[5+i]=Sum_Check(rcvstr,len);
		//len++;

		break;
	case 3:
		lsstr[0]='&';
		lsstr[1]='X';
		lsstr[2]=24;
		lsstr[3]=train.lightcolor;
		lsstr[4]=train.speed;
		lsstr[5]=train.distance&0xff;
		lsstr[6]=train.distance>>8;
		if(-1==train.distance)
		{
			if(-1!=cerror[0])
			{
				lsstr[5]=cerror[0]&0xff;
				lsstr[6]=cerror[0]>>8;
				if(-1!=cerror[1])
				{
					cerror[1]=-1;
				}
				else
				{
					cerror[0]=-1;
				}
			}
			//Show_Io(14,0);
		}
		else
		{
			cerror[0]=train.distance;
			cerror[1]=train.distance;
		}
		lsstr[7]=train.curhook;
		lsstr[8]=train.curtrack;
		lsstr[9]=train.error;
		
		
		
		lsstr[20]=train.g93limit;//train.limit;
		lsstr[21]=train.planesignal;
		lsstr[21]|=train.point<<5;
		lsstr[22]=train.netstate;
		lsstr[23]=train.brake&0xe0;
		lsstr[23]|=train.direction&0x0f;
		lsstr[23]|=(train.direction>>3)&0x10;
		lsstr[24]=train.isingudao;
		lsstr[25]=train.length;
		i=27;
		//lsstr[26]=Sum_Check(lsstr,26);
		//rs485_puts(lsstr,27,com4);
		//printf("checkx=%x\n",lsstr[19]);
		break;
	case 4:
		//if(!gps.valid)
		//	return;
		lsstr[0]='&';
		lsstr[1]='T';
		lsstr[2]=7;
		lsstr[3]=gps.year;
		lsstr[4]=gps.month;
		lsstr[5]=gps.day;
		lsstr[6]=gps.hour;
		lsstr[7]=gps.minute;
		lsstr[8]=gps.second;
		i=10;
		//lsstr[9]=Sum_Check(lsstr,9);
		//rs485_puts(lsstr,10,com4);
		break;
	default:
		return;
	}

	if(xsqrcvok)
	{
		lsstr[1]|=0x80;
		xsqrcvok=0;
	}
	lsstr[i-1]=Sum_Check(lsstr,i-1);
	rs485_puts(lsstr,i,com4);
}*/

void Join_Net(void)
{
	unsigned int k;
	sendstr[3]='I';
	sendstr[4]=11;
	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.curtrack;
	sendstr[12]=train.curtrack>>8;
	sendstr[13]=0x0a;
	k=Crc_Check(sendstr,14);
	sendstr[14]=k&0xff;
	sendstr[15]=k>>8;
	//for(k=0;k<10;k++)
	//	memcpy(com1->out.buffer+k*16,sendstr,16);
	//com1->out.read_index=0;
	//com1->out.write_index=160;
	//port_send(com1);
	port_puts(sendstr,16,com1);
}

void Quit_Net(unsigned char id)
{

⌨️ 快捷键说明

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