📄 protocalbase.cpp
字号:
// ProtocalBase.cpp: implementation of the CProtocalBase class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RTUSim.h"
#include "ProtocalBase.h"
#include "MSComm.h"
#include "RTUSimDlg.h"
#include "SOERec.h"
#include "FaultRec.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CProtocalBase::CProtocalBase(void * pMainDlg)
{
m_pmsComm = NULL;
m_pMainDlg = (CRTUSimDlg *)pMainDlg;
}
CProtocalBase::~CProtocalBase()
{
}
/*****************************************************************
** Explan:
** 输 入: 无
** 输 出: 无
** 功能描述:
//规约解释
//解释完毕不要忘记删除已经解释的命令
//响应可以放置到m_baOutBuffer中
//调用SendRespons进行数据的发送
//大家在写自己的Explan时,只需要将命令解释完毕后把响应放到输出缓冲区内,然后调用基类的Explan
//如果存在无法解释的命令,需要将无效命令数据删除,不要进行基类Explan的调用
** 全局变量:
** 调用模块: SendRespons
** 作 者: 李佰国
** 日 期: 2003.05.07
** 修 改:
** 日 期:
** 版本: 0.1
****************************************************************/
void CProtocalBase::Explain()
{
SendRespons();
}
/*****************************************************************
** ReciveData:
** 输 入:
CByteArray &baData:新接收到的命令数据
** 输 出: 无
** 功能描述:
将命令缓存到命令缓冲区,调用Explan进行解释
** 全局变量:
** 调用模块: Explan
** 作 者: 李佰国
** 日 期: 2003.05.07
** 修 改:
** 日 期:
** 版本: 0.1
****************************************************************/
void CProtocalBase::ReciveData(CByteArray &baData)
{
for(int i = 0; i < baData.GetSize(); i++)
{
m_baInBuffer.Add(baData[i]);
}
CByteArray baTmp;
baTmp.Copy(m_baDigital);
Explain();
CheckStateChange(baTmp, m_baDigital);
}
/*****************************************************************
** SendRespons:
** 输 入: 无
** 输 出: 无
** 功能描述:
将输出缓冲区的内容发送
** 全局变量:
** 调用模块:无
** 作 者: 李佰国
** 日 期: 2003.05.07
** 修 改:
** 日 期:
** 版本: 0.1
****************************************************************/
void CProtocalBase::SendRespons()
{
COleVariant vData;
vData = m_baOutBuffer;
if(IsWindow(*m_pMainDlg))
{
m_pMainDlg->DisplayData(false, m_baOutBuffer);
}
if(m_pmsComm != NULL)
{
if(m_pmsComm->GetPortOpen())
{
m_pmsComm->SetOutput(vData);
m_baOutBuffer.RemoveAll();
}
}
}
/*****************************************************************
** SetComm:
** 输 入:
CMSComm *pmsComm:规约需要使用的串口指针
** 输 出: 无
** 功能描述:
设置规约需要使用的串口指针
** 全局变量:
** 调用模块:无
** 作 者: 李佰国
** 日 期: 2003.05.07
** 修 改:
** 日 期:
** 版本: 0.1
****************************************************************/
void CProtocalBase::SetComm(CMSComm *pmsComm)
{
if(pmsComm != NULL)
{
if(pmsComm->GetPortOpen())
{
m_pmsComm = pmsComm;
}
}
}
void CProtocalBase::CheckStateChange(CByteArray & baOld, CByteArray & baNow)
{
if(baOld.GetSize() == baNow.GetSize())
{
for(int i = 0; i< baOld.GetSize(); i++)
{
if(baNow[i] != baOld[i])
{
BYTE bMask = 1;
for(int j = 0; j < 8; j++)
{
if((baOld[i] & (bMask << j)) != (baNow[i] & (bMask << j)))
{
CSOERec * pSOE = new CSOERec;
pSOE->m_uDigitalNO = i * 8 + j;
pSOE->m_bOpened = (baOld[i] & (j * 2 + 1));
GetSystemTime(&pSOE->m_stTime);
m_paSOE.Add(pSOE);
if(m_pMainDlg != NULL)
{
m_pMainDlg->ChangeState();
}
}
}
}
}
}
}
void CProtocalBase::SetMainWnd(void *pMainDlg)
{
m_pMainDlg = (CRTUSimDlg *)pMainDlg;
SetComm(&m_pMainDlg->m_msComm);
}
void CProtocalBase::DoAFault()
{
return;
}
void CProtocalBase::DoBFault()
{
return;
}
void CProtocalBase::DoCFault()
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -