📄 svinapdisp.cpp
字号:
/*****************************************************
Update History:
2000.06.14:增加防范措施
******************************************************/
#include "stdafx.h"
#include <windows.h>
extern unsigned char *dispbuf,*recbuf;
extern unsigned char UDTlen;
extern unsigned short displen;
extern void procSourcePARAdisp(BYTE dfldno);
extern void procNULL(unsigned char dfldno);
extern char procsequencetag(unsigned char dfldno);
extern void procsbasicpara(unsigned char dfldno);
extern void procmoredatadisp(WORD len);
void procinteger(BYTE dfldno)
{ BYTE li;
*dispbuf++=dfldno; //tag
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+1; //li
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+2;
*dispbuf++=li*8;
if(li==1) *dispbuf++=*recbuf++;
else if(li==2)
{*dispbuf++=*(recbuf+1);
*dispbuf++=*recbuf;
recbuf+=2;
}
else if(li==3)
{*dispbuf++=*(recbuf+2);
*dispbuf++=*(recbuf+1);
*dispbuf++=*recbuf;
recbuf+=3;
}
else if(li==4)
{*dispbuf++=*(recbuf+3);
*dispbuf++=*(recbuf+2);
*dispbuf++=*(recbuf+1);
*dispbuf++=*recbuf;
recbuf+=4;
}
*dispbuf++=0xcc;
displen+=li+11;
}
void procCase(BYTE dfldno)
{ BYTE li;
*dispbuf++=dfldno; //tag
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+1; //li
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
if((*recbuf&0x80)==0) {recbuf+=2;li-=2;} //expand
else {recbuf++;li--;}
*dispbuf++=dfldno+2;
*dispbuf++=8;
*dispbuf++=(*recbuf)&0x7f;
recbuf+=li;
*dispbuf++=0xcc;
displen+=12;
}
void procINAPCHGADDR(unsigned char dfldno) //P49-50
{ unsigned char li,i,code;
//ADDR TAG
*dispbuf++=dfldno;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR LI
*dispbuf++=dfldno+1;
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
UDTlen-=li+2;
//ADDR IN
*dispbuf++=dfldno+2;
*dispbuf++=8;
code=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR SIGNAL
if((code&0x7f)==9)
{
*dispbuf++=dfldno+3;
*dispbuf++=32;
for(i=0;i<2;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
recbuf+=li-3;
}
else if((code&0x7f)==10)
{
*dispbuf++=dfldno+3;
*dispbuf++=11*4;
for(i=0;i<6;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
recbuf+=li-7;
}
else
{li--;
*dispbuf++=dfldno+3;
if((code&0x80)==0x80) //there is fill,odd
*dispbuf++=li*8-4;
else *dispbuf++=li*8;
for(i=0;i<li;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
displen+=li+15; //li*2+22;
}//else
}
void procINAPADDR(unsigned char dfldno) //P49-50
{ unsigned char li,i,code;
//ADDR TAG
*dispbuf++=dfldno;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR LI
*dispbuf++=dfldno+1;
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
UDTlen-=li+2;
//ADDR IN
*dispbuf++=dfldno+2;
*dispbuf++=8;
code=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR SIGNAL
li-=2;
recbuf++;
*dispbuf++=dfldno+3;
if((code&0x80)==0x80) //there is fill,odd
*dispbuf++=li*8-4;
else *dispbuf++=li*8;
for(i=0;i<li;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
displen+=li+15; //li*2+22;
}
void ProcAdditionalCharg(BYTE dfldno)
{ BYTE indeffmt;
indeffmt=procsequencetag(dfldno); //附加费 sequence
procsbasicpara(dfldno+2); //附加费值
procsbasicpara(dfldno+5); //附加费类型
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void ProcAdjustRate(BYTE dfldno)
{ BYTE indeffmt;
indeffmt=procsequencetag(dfldno); //计费调整率 sequence
procsbasicpara(dfldno+2); //计费调整率值
procsbasicpara(dfldno+5); //计费调整率类型
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void procBearer(BYTE dfldno) //承载者
{ BYTE li,i,code;
//承载者 TAG
*dispbuf++=dfldno;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//承载者 LI
*dispbuf++=dfldno+1;
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
UDTlen-=li+2;
//承载者的选择
*dispbuf++=dfldno+2;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//承载者ID
code=*recbuf++;
li-=3;
*dispbuf++=dfldno+3;
*dispbuf++=code*4;
code/=2;code++;
for(i=0;i<code;i++) *dispbuf++=*(recbuf+i);
*dispbuf++=0xcc;
recbuf+=li;
displen+=code+12;
}
void procLegID(BYTE dfldno)
{ BYTE indeffmt;
indeffmt=procsequencetag(dfldno); //LEGID sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+2); //发方ID
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+5); //收方ID
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void ProcSendingInfo(BYTE dfldno,BYTE dfldno2) //要发送的信息
{ BYTE indeffmt0,indeffmt,indeffmt2,indeffmt3,indeffmt4,li,len;
indeffmt0=procsequencetag(dfldno2); //要发送的信息 sequence
//“要发送的信息”选择“带内信息”“信号音”“显示信息”
if((*recbuf&0x3f)==0x20)//选择“带内信息”
{indeffmt=procsequencetag(dfldno); //带内信息 sequence
//“消息ID”选择“基本消息ID”“文本”“基本消息ID组”“可变消息”
if((*recbuf&0x3f)==0x20)//“消息ID”
{indeffmt2=procsequencetag(dfldno+2); //消息ID sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+4); //基本消息ID
else if((*recbuf&0x3f)==0x21) //“文本”
{indeffmt3=procsequencetag(dfldno+7); //文本 sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+9); //消息内容
if((*recbuf&0x3f)==1) procsbasicpara(dfldno+12); //属性
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//“文本”
else if((*recbuf&0x3f)==0x3d) //“基本消息ID组”
{indeffmt3=procsequencetag(dfldno+13); //基本消息ID组
while((*recbuf&0x3f)==2) procsbasicpara(dfldno+4); //基本消息ID
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//“基本消息ID组”
else if((*recbuf&0x3f)==0x3e) //“可变消息”
{indeffmt3=procsequencetag(dfldno+17); //可变消息sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+4); //基本消息ID
if((*recbuf&0x3f)==0x21)//可变部分
{if(*(recbuf+1)<=0x80) li=*(recbuf+1);
else li=*(recbuf+2);
indeffmt4=procsequencetag(dfldno+19); //可变部分sequence
if(indeffmt4!=0)//indefinite formatt
{
while(*(WORD *)recbuf!=0)
{
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+21); //整数
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+24); //数字
else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+27); //时间
else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+30); //日期
else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+33); //价格
else
{
procmoredatadisp(UDTlen); //add by 2000.06.14
UDTlen = 0;
return;
}
}//while
recbuf+=2;UDTlen-=2;
}//indefinite formatt
else//short\long format
{
while(li!=0)
{len=UDTlen;
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+21); //整数
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+24); //数字
else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+27); //时间
else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+30); //日期
else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+33); //价格
if(len>UDTlen)
{len-=UDTlen; li-=len;}
else
{
procmoredatadisp(UDTlen); //add by 2000.06.14
UDTlen = 0;
return;
}
}//while
}//short\long format
}//可变部分
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//“可变消息”
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
}////“消息ID”
//重复次数
if((*recbuf&0x3f)==1) procsbasicpara(dfldno+36); //重复次数
//持续时间
if((*recbuf&0x3f)==2) procsbasicpara(dfldno+39); //持续时间
//时间间隔
if((*recbuf&0x3f)==3) procsbasicpara(dfldno+42); //时间间隔
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}//选择“带内信息”
else if((*recbuf&0x3f)==0x21)//选择“信号音”
{indeffmt=procsequencetag(dfldno+45); //信号音 sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+47); //信号音ID
if((*recbuf&0x3f)==1) procsbasicpara(dfldno+39); //持续时间
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}//选择“信号音”
else if((*recbuf&0x1f)==2) //选择“显示信息”
procsbasicpara(dfldno+50);
if(indeffmt0!=0) {recbuf+=2;UDTlen-=2;}
}
void ProcExpand(BYTE dfldno) //“扩展”,P63
{ BYTE indeffmt,indeffmt2;
indeffmt=procsequencetag(dfldno); //扩展 sequence
while(*recbuf==0x30 && UDTlen>2 && UDTlen<255)//扩展域
{indeffmt2=procsequencetag(dfldno+2);//扩展域 sequence
procsbasicpara(dfldno+4); //类型
procsbasicpara(dfldno+7); //准则
procsbasicpara(dfldno+10); //值
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
}//扩展域
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void procResourceID(BYTE dfldno)//"资源ID"
{ BYTE indeffmt,indeffmt2;
indeffmt=procsequencetag(dfldno); // 资源ID sequence
//"资源ID"选择“设备群ID”“设备群成员ID”“中继群ID”
if((*recbuf&0x3f)==0x21)//选择“设备群ID”
{indeffmt2=procsequencetag(dfldno+2); // 设备群ID sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+4); //选择“中继群ID”
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+7); //选择“单个设备ID”
else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+10); //选择“搜索群”
else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+13); //选择“路由索引”
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
}//选择“设备群ID”
else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+16); //设备群成员ID
else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+19); //中继群ID
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void procINAPdisp(BYTE oc,BYTE compt)
{ BYTE indeffmt,indeffmt2,indeffmt3,indeffmt4,li,len;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -