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

📄 msgdetaildoc.cpp

📁 七号信令解码器
💻 CPP
字号:
// MsgDetailDoc.cpp : implementation of the CMsgDetailDoc class
//

#include "stdafx.h"
#include "MsgDetail.h"

#include "MsgDetailDoc.h"

#include "ylfFilteMsg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMsgDetailDoc

IMPLEMENT_DYNCREATE(CMsgDetailDoc, CDocument)

BEGIN_MESSAGE_MAP(CMsgDetailDoc, CDocument)
	//{{AFX_MSG_MAP(CMsgDetailDoc)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMsgDetailDoc construction/destruction

CMsgDetailDoc::CMsgDetailDoc()
{
	msgList.SetMsgType(1);

}

CMsgDetailDoc::~CMsgDetailDoc()
{
}

BOOL CMsgDetailDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}

void ChangTimeFormat(bool isSystem,unsigned char* pbuf)
{
/*系统时间格式(5)=小时(1)+分(1)+秒(1)+毫秒(2)
改为   仪表时间格式(2)=总分数(2)+总毫秒(2)
*/
	if(isSystem)
	{
		int summ=pbuf[2]+pbuf[3]*256;
		int sms=pbuf[4]+pbuf[5]*256;
    	pbuf[1]=summ/60;
		pbuf[2]=summ%60;
		pbuf[3]=sms/1000;
		pbuf[4]=(sms%1000)%256;
		pbuf[5]=(sms%1000)/256;
	}
	else
	{
		int summ=pbuf[1]*60+pbuf[2];
		int sms=pbuf[3]*1000+pbuf[4]+pbuf[5]*256;
    	pbuf[1]=0;
		pbuf[2]=summ%256;
		pbuf[3]=summ/256;
		pbuf[4]=sms%256;
		pbuf[5]=sms/256;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMsgDetailDoc serialization
CArchive& AFXAPI operator>>(CArchive& ar, CShowMsgList& msgList)
{
	int count;
	int len;
	ar>>count;
	CShowMsg* pMsg;
	msgList.DeleteAllItem();
	for(int i=0;i<count;i++)
	{
		pMsg=new CShowMsg;
		ar.Read(&pMsg->mshowmsg,sizeof(CShowMsg::showmsg));
		ar>>len;
		pMsg->mshowmsg.pBuf=new BYTE[len];
		ar.Read(pMsg->mshowmsg.pBuf,len);
		msgList.m_list.AddTail(pMsg);
	}
	return ar;
}
CArchive& AFXAPI operator<<(CArchive& ar, CShowMsgList& msgList)
{
	CString fileName=ar.GetFile()->GetFileName();
	if(fileName.GetLength()>4&&fileName.Right(4)==".msg")
	{
		int count=msgList.GetCount();
		int len;
		ar<<count;
		CShowMsg* pMsg;
		for(int i=0;i<count;i++)
		{
			pMsg=msgList.GetItemFromIndex(i);
			ar.Write(&pMsg->mshowmsg,sizeof(CShowMsg::showmsg));
			len=pMsg->mshowmsg.pBuf[0]+pMsg->mshowmsg.pBuf[1]*256+2;
			ar<<len;
			ar.Write(pMsg->mshowmsg.pBuf,len);
		}
	}
	else
	{
		char buf[6]="CSM08";
		unsigned char msgbuf[0xffff];
		unsigned char* pmsg=msgbuf;
		ar.Write(buf,5);
		int count=msgList.GetCount();
		int len,off=0,block=0;
		pmsg[off++]=0xff;
		pmsg[off++]=0xff;
		off+=2;//len
		off+=5;//time
		int sumlen=5;
		CShowMsg* pMsg;
		for(int i=0;i<count;i++)
		{
			pMsg=msgList.GetItemFromIndex(i);
			len=pMsg->mshowmsg.pBuf[0]+pMsg->mshowmsg.pBuf[1]*256+2;
			if(sumlen+len>0x2000-100||pmsg+off+len>msgbuf+0xffff-50)//一块已满
			{
				block++;
				pmsg[2]=sumlen%256;
				pmsg[3]=sumlen/256;
				memset(&pmsg[4],0,5);
				pmsg[off]=0xaa;
				//开始新的块
				off=0;
				sumlen=5;
				pmsg=msgbuf+0x2000*block;
				pmsg[off++]=0xff;
				pmsg[off++]=0xff;
				off+=2;//len
				off+=5;//time
				if(block==8)
				{
					ar.Write(msgbuf,0xffff);
					//开始新的4K
					off=0;
					sumlen=5;
					pmsg=msgbuf;
					block=0;
					pmsg[off++]=0xff;
					pmsg[off++]=0xff;
					off+=2;//len
					off+=5;//time
				}
			}
			memcpy(&msgbuf[off],pMsg->mshowmsg.pBuf,len);
			ChangTimeFormat(true,msgbuf+off+2);
			off+=len;
			sumlen+=len;
		}
		if(sumlen>5)
		{
			pmsg[2]=sumlen%256;
			pmsg[3]=sumlen/256;
			memset(&pmsg[4],0,5);
			pmsg[off]=0xaa;
			ar.Write(msgbuf,0x2000*block+sumlen+5);
		}

	}
	return ar;
}

void CMsgDetailDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		ar<<msgList;
	}
	else
	{
		CString fileName=ar.GetFile()->GetFileName();
		if(fileName.GetLength()>4&&fileName.Right(4)==".msg")
		{
			ar>>msgList;
		}
		else
		{
			char buf[10];
			msgList.DeleteAllItem();
			buf[5]=0;
			ar.Read(buf,5);
			int msgFmg=0;
			if(strcmp(buf,"YLF01")==0)
			{
				msgFmg=0;
				AddFromYlfMsgFile(ar,msgList);
			}
			else if(strcmp(buf,"CSM08")==0)
			{
				msgFmg=0;
				AddFromInsMsgFile(ar,msgList);
			}
			else if(strcmp(buf,"SS7SV")==0)
			{
				msgFmg=1;
				AddFromSysMsgFile(ar,msgList);
			}
			else if(strcmp(buf,"busy*")==0)
			{
				msgFmg=1;
				BusySysMsgFile(ar);
			}
			else
			{
				AfxMessageBox("文件格式错");
			}
		}
	}
}

/////////////////////////////////////////////////////////////////////////////
// CMsgDetailDoc diagnostics

#ifdef _DEBUG
void CMsgDetailDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CMsgDetailDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMsgDetailDoc commands

void CMsgDetailDoc::OnFileNew() 
{
}

void CMsgDetailDoc::AddFromInsMsgFile(CArchive& ar, CShowMsgList& msgList)
{
	char buf[6];
	unsigned char msgbuf[0xffff];
	unsigned char* pbuf;
	unsigned char* pend;
	int ncount=0;
	int maxMsgCount=2000;
	int nerror=0;
	for(int j=0;j<20;++j)	
	{
		unsigned short len,oldlen,off=0,dir;
		unsigned char block,*hisptr,code,c,mode,w2M;

		int numbyte=ar.Read(msgbuf,0xffff);
		if(numbyte<0xffff)break;

		pbuf=&msgbuf[0];
		if(*(unsigned short *)pbuf!=0xffff) 
			continue;
		block=msgbuf[8191]+1;
		if(block>8) //in instrument
			continue;

		for(c=0;c<block;c++)
		 {
			pbuf=&msgbuf[c*8192];
			if(*(unsigned short *)pbuf !=0xffff) 
				continue;
			if(*(unsigned short *)(pbuf+2)<=5) //#define initreclen 5
					continue;
			off= 9;	//#define initrecoff 9 ??
			pbuf+=off;       //hisptr-->message length
			while(*pbuf!=0xaa && off<8100) //#define maxreclen 8100
			{ 

				//原始仪表格式
				len=*(unsigned short *)pbuf;
				mode = len>>12;
				len &= 0x0fff;
				len+=2;
				if(len>286 || len<0 || *(pbuf+len-1)!=0xee)	//消息长度合法且LI>0,2001.01.13 by LHG
				{	
					break;
				}
				*((unsigned short *)pbuf)=len-2;
				ChangTimeFormat(false,pbuf+2);
				if(!msgList.Add(pbuf))
				{
					//AfxMessageBox("格式有错!");
					//return;
					nerror++;
				}
				pbuf+=len;
				off+=len;
			}//while
		}
	}
}

void CMsgDetailDoc::AddFromSysMsgFile(CArchive& ar, CShowMsgList& msgList)
{
	char buf[6];
	unsigned char msgbuf[0xffff];
	unsigned char* pbuf;
	unsigned char* pend;
	int ncount=0;
	int maxMsgCount=2000;
	int pos=0;
	int p;
	int len;
	int count=0;
	while(1)
	{
		int numbyte=ar.Read(msgbuf,0xffff);
        if(numbyte<0xffff)break;
		if(*(unsigned short *)msgbuf!=0xffff) 
			break;
		int len = *(msgbuf+2) + *(msgbuf+3)*256;
		pos=4;

		if(len<=100) 
			break;
		if(msgbuf[pos+len]!=0xaa)
		{
			TRACE("\r\n数据包没有以0xaa结尾len=%d",len);
			break;
		}
		p=pos;
		pos+=len;
		while(p<pos-2)//一个数据包中的消息
		{
			len=256*msgbuf[p+1]+msgbuf[p]+2;
			if(len<10||len>300||p+len>pos)
			{
				TRACE("\r\n消息长度不合理len=%d",len);
				break;
			}
			if(msgbuf[p+len-1]!=0xee)
			{
				TRACE("\r\n消息没有以0xee结尾len=%d",len);
				break;
			}
			msgList.Add(msgbuf+p);
			p+=len;
			//if(count++>10000)return;
		}
	}
}
#include "ylfBusySysMsgFile.h"
void CMsgDetailDoc::BusySysMsgFile(CArchive& ar)
{
	int len=0;
	BusySysMsgList.Clear();
	len=ar.GetFile()->GetLength()-5;
	if(len%200!=0||len<=0)
	{
		AfxMessageBox("文件格长有错");
		return;
	}

	BusySysMsgList.NewBuffer(len);
	ar.Read(BusySysMsgList.GetBuffer(),len);
	BusySysMsgList.LoadEnd();
	return;
}

void CMsgDetailDoc::AddFromYlfMsgFile(CArchive &ar, CShowMsgList &msgList)
{
	unsigned char msgBuf[MAX_MSG_BUF];
	unsigned char* pbuf;
	unsigned char* pend;
    int numbyte;
	int msglen;
	ylfFilteMsg::ReadConfig();
	int count=0;

	while((numbyte=ar.Read(&msglen,4))>0)
	{
		if(msglen<=5||msglen>MAX_MSG_BUF)break;

		int numbyte=ar.Read(msgBuf,msglen-4);
		if(numbyte!=msglen-4)break;


		int pos=0;
		int p;
		int len;
		while(pos<msglen-8)//数据包
		{
		//	curRack=256*msgBuf[pos+3]+msgBuf[pos+2];
			len=256*msgBuf[pos+1]+msgBuf[pos];
			p=pos+4;
			pos+=len;
			if(len<MIN_MSG_LEN||pos>msglen)
			{
			//	ylfCommon::BigError(VIEW_REALMSG,"\r\n采集%d,数据包长度不合法len=%d",curRack+1,len);
				break;
			}
			if(msgBuf[pos-1]!=0xaa)
			{
				//ylfCommon::BigError(VIEW_REALMSG,"\r\n采集%d,数据包没有以0xaa结尾len=%d",curRack+1,len);
				break;
			}
			while(p<pos-2)//一个数据包中的消息
			{
				len=256*msgBuf[p+1]+msgBuf[p]+2;
				if(len<MIN_MSG_LEN||len>MAX_MSG_LEN||p+len>pos)
				{
					//ylfCommon::BigError(VIEW_REALMSG,"\r\n采集%d,消息长度不合理len=%d",curRack+1,len);
					break;
				}
				if(msgBuf[p+len-1]!=0xee)
				{
					//ylfCommon::BigError(VIEW_REALMSG,"\r\n采集%d,消息没有以0xee结尾len=%d",curRack+1,len);
					break;
				}
				if(ylfFilteMsg::IsFiltMsg(msgBuf+p,len))
				{
					msgList.Add(msgBuf+p);
					count++;
				}

				if(count>10000)return;
				//ProcEveryMsg(p,len);
				p+=len;
			}
		}
	}
	/*
	for(int i=0;i<ylfFilteMsg::count;i++)
	{
		msgList.Add(ylfFilteMsg::GetMsgBuf(i));
	}*/


}

⌨️ 快捷键说明

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