📄 nbbclass.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// File name: nbbclass.cpp
// This file define the functions used in new bb
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "nbbclass.h"
extern BOOLEAN isyxbw(INT8U portno);
extern void getyxbw(yx_bw_tt *ptr,INT8U portno);
extern BOOLEAN issoe(INT8U portno);
extern void getsoe(SOE1 *ptr,BYTE portno);
void CNbb::initial(BYTE portn)
{
int i;
nportno=portn;
dataque.start=0;
dataque.next=0;
dataque.count=0;
dataque.size=1024;
for(i=0;i<MAXPORTNO;i++)
{
protectbuf[i].tstart = 0;
protectbuf[i].tnext = 0;
protectbuf[i].tcount = 0;
protectbuf[i].tsize = 1024;
protectbuf[i].rstart = 0;
protectbuf[i].rnext = 0;
protectbuf[i].rcount = 0;
protectbuf[i].rsize = 1024;
//protect_handover_t type is defined in common.h
porttgap[i]=0;
step_1[i]=OFF; //used in nbb A D1 D2 E
step_2[i]=OFF; //used in nbb A D1 D2 E
step_3[i]=OFF; //used in nbb A D1 D2 E
step_4[i]=OFF; //used in nbb A D1 D2 E
step_5[i]=OFF; //used in nbb A D1 D2 E
step_6[i]=OFF; //used in nbb A D1 D2 E
step_7[i]=OFF; //used in nbb A D1 D2 E
step_8[i]=OFF; //used in nbb A D1 D2 E
framea[i]=OFF; //used in main.cpp
frameb[i]=OFF; //used in main.cpp
framec[i]=OFF; //used in main.cpp
framed1[i]=OFF; //used in main.cpp
framed2[i]=OFF; //used in main.cpp
framee[i]=OFF; //used in main.cpp
framep[i]=OFF; //used in main.cpp
}//for(i=0;i<8;i++)
for(i=0;i<16;i++)DC_sample_yx[i]=0; //for save yx come from DC sample case defined in nbbclass.h
DC_sample_state=STATE0;//for flag the DC sample yx collect state defined in nbbclass.h
}//void CNbb::initial(BYTE portn)
void CNbb::send_packet(BYTE *pointer)
{
int i;
for(i=0;i<0x06;i++)
{
comput(*pointer,nportno);
disptbuf((*pointer)&0xff,nportno);
pointer++;
}//for(i=0;i<0x06;i++)
}//void CNbb::send_packet(BYTE* pointer)
BYTE CNbb::get_crc_code(BYTE *pointer)
{
BYTE temp=0;
BYTE *byte_ptr;
byte_ptr=pointer;
for(int i=0;i<5;i++) { temp = nbbcrctable[((*byte_ptr)^temp)&0xff]; byte_ptr++; }//for(i=0;i<5;i++)
temp=(~temp)&0xff;
return(temp);
}//BYTE CNbb::get_crc_code( BYTE *pointer)
BOOLEAN CNbb::packet_crc_check(BYTE *pointer)
{
if(*(pointer+5)==get_crc_code(pointer))return(TRUE); else return(FALSE);
}//BOOLEAN CNbb::packet_crc_check(BYTE *pointer)
void CNbb::settimeproccess(BYTE* pointer)
{
BYTE temp;
struct date d;
struct time t;
time_t* timer1;
time_t* timer2;
if((packet_crc_check(pointer))&&((*(pointer+2)==0x02)))
{
if((packet_crc_check(pointer))&&(packet_crc_check(pointer))&&(*(pointer+6)==0xee)&&(*(pointer+12)==0xef))
{
d.da_year=(*(pointer+16))&0xff;
if (d.da_year>80)d.da_year+=1900;
else d.da_year+=2000;
if(d.da_year>2100)d.da_year=2100;
if(d.da_year<1900)d.da_year=1900;
d.da_mon=(char)((*(pointer+15))&0x0f);
if(d.da_mon>12)d.da_mon=12;
if(d.da_mon<=0)d.da_mon=1;
d.da_day=(char)((*(pointer+14))&0x1f);
if(d.da_day>31)d.da_day=31;
if(d.da_day<=0)d.da_day=1;
t.ti_hour=(unsigned char)((*(pointer+13))&0x1f);
if(t.ti_hour>23)t.ti_hour=23;
t.ti_min=(unsigned char)((*(pointer+10))&0x3f);
if(t.ti_min>59)t.ti_min=59;
t.ti_sec=(unsigned char)((*(pointer+9))&0x3f);
if(t.ti_sec>59)t.ti_sec=59;
t.ti_hund=((*(pointer+8))&0x03)<<8+((*(pointer+7))&0xff)/10;
if(t.ti_hund>99)t.ti_hund=99;
if((nportno==COM1)||(nportno==COM2))
{
porttgap[nportno]=0;
setdate(&d);
settime(&t);
}//if(nportno==PORT1)
else
{
porttgap[nportno]=0;
}//else
}//if((packet_crc_check(pointer))&&(packet_crc_check(pointer)))
}//if((packet_crc_check(pointer))&&((*(pointer+2)==0x02)))
}//void CNbb::settimeproccess(BYTE* pointer)
void CNbb::adjusttime(struct date d,struct time t)
{
struct date d1;
struct time t1;
time_t* timer1;
time_t* timer2;
/*
time(timer1); //local rtu
setdate(&d);
settime(&t);
time(timer2); //port
stime(timer1);
*timer2+=porttgap[nportno];
time(timer1);
stime(timer2); //local
getdate(&d1);
gettime(&t1);
stime(timer1); //local
adjporttime.year=d1.da_year;
adjporttime.month=d1.da_mon;
adjporttime.day=d1.da_day;
adjporttime.hour=t1.ti_hour;
adjporttime.minute=t1.ti_min;
adjporttime.second=t1.ti_sec;
adjporttime.mil_second=t1.ti_hund*10;
*/
adjporttime.year=d.da_year;
adjporttime.month=d.da_mon;
adjporttime.day=d.da_day;
adjporttime.hour=t.ti_hour;
adjporttime.minute=t.ti_min;
adjporttime.second=t.ti_sec;
//adjporttime.mil_second=t.ti_hund*10;
adjporttime.mil_second=t.ti_hund;
}//void CNbb::adjusttime(d,t)
void CNbb::ykctlprocess(BYTE* pointer)
{
BYTE type;
BYTE fun_code;
BOOLEAN ok_flag=FALSE;
BYTE temp1,temp2,temp3,temp4,temp5;
unsigned int switch_no,switch_no_bin;
if((packet_crc_check(pointer))&&((*(pointer+2))==0x03)&&(((*(pointer+1))==0x61)||((*(pointer+1))==0xc2)||((*(pointer+1))==0xb3)))
{
if(packet_crc_check(pointer+6))
{
if(((*(pointer+7))==0xcc)||((*(pointer+7))==0x33)||((*(pointer+7))==0xaa)||((*(pointer+7))==0x55))
{
if((*(pointer+8))!=0xff)//bin
{
if((((*(pointer+7)))==((*(pointer+9))))
&&(((*(pointer+8)))==((*(pointer+10)))))
{
temp1=*(pointer+8);
if(temp1<64)
{
fun_code=*(pointer+6);
type=*(pointer+7);
switch_no=switch_no_bin=*(pointer+8);
ok_flag=TRUE;
}//if(temp1<64)
}//if((((*(pointer+7)))==((*(pointer+9))))
}//if((*(pointer+8))!=0xff)
else//bcd
{
temp1=temp2=*(pointer+9);
temp1&=0x0f;
if(temp1<10)
{
temp2&=0xf0;
temp2>>=0x04;
if(temp2<10)
{
temp3=temp4=*(pointer+10);
temp3&=0x0f;
if(temp3<10)
{
temp4&=0xf0;
temp4>>=0x04;
if(temp4<10)
{
temp5=temp4*1000+temp3*100+temp2*10+temp1;
if((temp5>0)&&(temp5<64))
{
fun_code=*(pointer+6);
type=*(pointer+7);
switch_no=(*(pointer+10))&0xff;
switch_no<<=0x08;
switch_no+=(*(pointer+9))&0xff;
switch_no_bin=temp5;
ok_flag=TRUE;
}//if((temp5>0)&&(temp5<64))
}//if(temp4<10)
}//if(temp3<10)
}//if(temp2<10)
}//if(temp1<10)
}//else
}//if(((*(pointer+7))==0xcc)||((*(pointer+7))==0x33)
}//if(packet_crc_check(pointer+6))
if((ok_flag==FALSE)&&(packet_crc_check(pointer+12)))
{
if(((*(pointer+13))==0xcc)||((*(pointer+13))==0x33)||((*(pointer+13))==0xaa)||((*(pointer+13))==0x55))
{
if((*(pointer+14))!=0xff)//bin
{
if((((*(pointer+13)))==((*(pointer+15))))&&(((*(pointer+14)))==((*(pointer+16)))))
{
temp1=*(pointer+14);
if(temp1<64)
{
fun_code=*(pointer+12);
type=*(pointer+13);
switch_no=switch_no_bin=*(pointer+14);
ok_flag=TRUE;
}//if(temp1<64)
}//if((((*(pointer+13)))==((*(pointer+15))))
}//if((*(pointer+14))!=0xff)
else//bcd
{
temp1=temp2=*(pointer+15);
temp1&=0x0f;
if(temp1<10)
{
temp2&=0xf0;
temp2>>=0x04;
if(temp2<10)
{
temp3=temp4=*(pointer+16);
temp3&=0x0f;
if(temp3<10)
{
temp4&=0xf0;
temp4>>=0x04;
if(temp4<10)
{
temp5=temp4*1000+temp3*100+temp2*10+temp1;
if((temp5>0)&&(temp5<64))
{
fun_code=*(pointer+12);
type=*(pointer+13);
switch_no=(*(pointer+16))&0xff;
switch_no<<=0x08;
switch_no+=(*(pointer+15))&0xff;
switch_no_bin=temp5;
ok_flag=TRUE;
}//if((temp5>0)&&(temp5<64))
}//if(temp4<10)
}//if(temp3<10)
}//if(temp2<10)
}//if(temp1<10)
}//else
}//if(((*(pointer+13))==0xcc)||((*(pointer+13))==0x33)
}//if((ok_flag==FALSE)&&(packet_crc_check(pointer+12)))
if((ok_flag==FALSE)&&(packet_crc_check(pointer+18)))
{
if(((*(pointer+19))==0xcc)||((*(pointer+19))==0x33)||((*(pointer+19))==0xaa)||((*(pointer+19))==0x55))
{
if((*(pointer+20))!=0xff)//bin
{
if((((*(pointer+19)))==((*(pointer+21))))&&(((*(pointer+20)))==((*(pointer+22)))))
{
temp1=*(pointer+20);
if(temp1<64)
{
fun_code=*(pointer+18);
type=*(pointer+19);
switch_no=switch_no_bin=*(pointer+20);
ok_flag=TRUE;
}//if((temp1>0)&&(temp1<64))
}//if((((*(pointer+19)))==((*(pointer+21))))
}//if((*(pointer+20))!=0xff)
else//bcd
{
temp1=temp2=*(pointer+21);
temp1&=0x0f;
if(temp1<10)
{
temp2&=0xf0;
temp2>>=0x04;
if(temp2<10)
{
temp3=temp4=*(pointer+22);
temp3&=0x0f;
if(temp3<10)
{
temp4&=0xf0;
temp4>>=0x04;
if(temp4<10)
{
temp5=temp4*1000+temp3*100+temp2*10+temp1;
if((temp5>0)&&(temp5<64))
{
fun_code=*(pointer+18);
type=*(pointer+19);
switch_no=(*(pointer+22))&0xff;
switch_no<<=0x08;
switch_no+=(*(pointer+21))&0xff;
switch_no_bin=temp5;
ok_flag=TRUE;
}//if((temp5>0)&&(temp5<64))
}//if(temp4<10)
}//if(temp3<10)
}//if(temp2<10)
}//if(temp1<10)
}//else
}//if(((*(pointer+19))==0xcc)||((*(pointer+19))==0x33)
}//if((ok_flag==FALSE)&&(packet_crc_check(pointer+18)))
}//if((packet_crc_check(pointer))&&((*(pointer+2))==0x03)
if(ok_flag==TRUE)
{
if((fun_code==0xe0)&&(ykoper.ykstate==YKSNONE)&&(ykoper.ykcmdint==YKINONE)
&&(ykoper.ykcheckresult==YKRNONE)&&(ykoper.ykexeman==YKMNONE)
&&((type==0xcc)||(type==0x33)))
{
ykoper.ykobj=switch_no_bin;
ykoper.ykcmd=type;
ykoper.ykcmdint=type;
ykoper.ykfrom=nportno;
ykoper.preseterr=YKPNONE;
// if(port_set[8].ext_flag==TRUE)
{
if((ykoper.ykobj==(datasource.board_yk+hardwareset[0].xk4*4+1))
||(ykoper.ykobj==(datasource.board_yk+hardwareset[0].xk4*4+3)))
{
if(ykoper.ykcmd==YKCCLOSE)
{
ykoper.ykobj=switch_no_bin-1;
ykoper.ykcmd=YKCTRIP;
ykoper.ykcmdint=YKCTRIP;
}//if(ykoper.ykcmd==YKCCLOSE)
}//if((ykoper.ykobj==(datasource.board_yk+hardwareset[0].xk4*4+1))
}//if(port_set[8].ext_flag==TRUE)
}//if((fun_code==0xe0)&&(ykoper.ykstate==YKSNONE)&&(ykoper.ykcmdint==YKINONE)
if((fun_code==0xe2)&&(type==0xaa)&&(ykoper.ykstate!=YKSNONE)
&&(ykoper.ykcmdint==YKINONE)&&(ykoper.ykcheckresult==YKROK)
&&(ykoper.ykexeman!=YKMNONE))
{
ykoper.ykcmdint=YKIEXEC;
ykoper.ykcheckresult=YKRNONE;
ykoper.ykfrom=YKFNONE;
}//if((fun_code==0xe2)&&(type==0xaa)&&(ykoper.ykstate!=YKSNONE)
if((fun_code==0xe3)&&(type==0x55)&&(ykoper.ykstate!=YKSNONE)
&&(ykoper.ykcmdint==YKINONE)&&(ykoper.ykcheckresult==YKROK)
&&(ykoper.ykexeman!=YKMNONE))
{
ykoper.ykcmdint=YKIESC;
ykoper.ykcheckresult=YKRNONE;
ykoper.ykfrom=YKFNONE;
}//if((fun_code==0xe3)&&(type==0x55)&&(ykoper.ykstate!=YKSNONE)
}//if(ok_flag==TRUE)
}//void CNbb::ykctlprocess(BYTE* pointer)
void CNbb::protectprocess(BYTE* pointer)
{
int i,j;
int temp1,temp2;
if(port_set[nportno].ext_flag==TRUE)
{
temp1=((*(pointer+2))&0xff); //frame word num
temp2=((*(pointer+4))&0xff);
for(i=0;i<temp1;i++)
{
if(packet_crc_check(pointer+6+i*6))
{
for(j=0;j<4;j++)
{
protectbuf[temp2].rbuf[protectbuf[temp2].rnext]=(*(pointer+7+i*6+j))&0xff;
protectbuf[temp2].rnext++;
if(protectbuf[temp2].rnext>=protectbuf[temp2].rsize)
protectbuf[temp2].rnext=0;
protectbuf[temp2].rcount++;
if(protectbuf[temp2].rcount>protectbuf[temp2].rsize)
{
protectbuf[temp2].rcount=protectbuf[temp2].rsize;
protectbuf[temp2].rstart++;
if(protectbuf[temp2].rstart>=protectbuf[temp2].rsize)
protectbuf[temp2].rstart=0;
}//if(protectbuf[temp2].rcount>protectbuf[temp2].rsize)
}//for(j=0;j<4;j++)
}//if(packet_crc_check(pointer+6+i*6))
}//for(i=0;i<temp1;i++)
}//if(port_set[nportno].ext_flag==TRUE)
}
void CNbb::identify_packet(BYTE* pointer)
{
if((packet_crc_check(pointer))&&((*pointer)==0x71))
{
switch(*(pointer+1))
{
case 0x61: case 0xc2: case 0xb3:
ykctlprocess(pointer); break;
case 0x7a: settimeproccess(pointer); break;
case 0xf7: case 0xf9: case 0xfc: case 0xfd: case 0xfe: case 0xff:
protectprocess(pointer); break;
}//switch(*pointer)
}//if(packet_crc_check(pointer))
}//void CNbb::identify_packet(BYTE* pointer)
void CNbb::putdata(BYTE data)
{
dataque.buf[dataque.next++]=data&0xff;
if(dataque.next>=dataque.size)dataque.next=0;
dataque.count++;
if(dataque.count>dataque.size)
{
dataque.count=dataque.size;
dataque.start++;
if(dataque.start>=dataque.size)dataque.start=0;
}//if(dataque.count>dataque.size)
}//void CNbb::putdata(BYTE data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -