📄 djk.c
字号:
{
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 + -