📄 msgdetaildoc.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 + -