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

📄 nbbclass.cpp

📁 基于PC104平台
💻 CPP
📖 第 1 页 / 共 4 页
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                 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 + -