📄 eachitemdoc.cpp
字号:
// EachItemDoc.cpp : CEachItemDoc 类的实现
//
#include "stdafx.h"
#include "WspProcess.h"
#include "EachItemDoc.h"
#include "CurveView.h"
#include "ConnectDlg.h"
#include "ClientSocket.h"
#include "ClientThread.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CEachItemDoc
IMPLEMENT_DYNCREATE(CEachItemDoc, CDocument)
BEGIN_MESSAGE_MAP(CEachItemDoc, CDocument)
//{{AFX_MSG_MAP(CEachItemDoc)
ON_COMMAND(ID_CONNECT, OnConnect)
ON_UPDATE_COMMAND_UI(ID_CONNECT, OnUpdateConnectUI)
ON_COMMAND(ID_SEND, OnSend)
ON_UPDATE_COMMAND_UI(ID_SEND, OnUpdateSendUI)
ON_COMMAND(ID_STOP, OnStopSend)
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStopSendUI)
ON_COMMAND(ID_DISCONNECT, OnDisconnect)
ON_UPDATE_COMMAND_UI(ID_DISCONNECT, OnUpdateDisconnectUI)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CEachItemDoc 构造/销毁
CEachItemDoc::CEachItemDoc()
{
// TODO:在此添加一次性构造代码
m_bConnected = FALSE;
m_bData = FALSE;
// m_pClientSocket = NULL;
m_pClientThread = NULL;
// m_dCommStatus = ; //进行通信时,curveview的状态
m_iComNo = 1;
m_strServerIP = _T("127.0.0.1");
m_DataType = TYPE_FLOAT;
}
CEachItemDoc::~CEachItemDoc()
{
if(m_pClientThread)delete m_pClientThread;
}
BOOL CEachItemDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO:在此添加重新初始化代码
// (SDI 文档将重用该文档)
return TRUE;
}
// CEachItemDoc 序列化
void CEachItemDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO:在此添加存储代码
}
else
{
// TODO:在此添加加载代码
}
}
// CEachItemDoc 诊断
#ifdef _DEBUG
void CEachItemDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CEachItemDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// CEachItemDoc 命令
void CEachItemDoc::SendOpenCom()
{
// TODO: Add your command handler code here
CPkg *pkg = new CPkg();
pkg->MsgFlag = ASKOPENCOM;
pkg->datatype = m_DataType;
pkg->uComNo = m_iComNo;
m_sendQueue.Add(pkg);
m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
m_dCommStatus = ASKOPENCOM;
}
double CEachItemDoc::GetPkgValue(CPkg* pkg)
{
/* double value;
switch(pkg->datatype)
{
case TYPE_CHAR:
value = (double)(pkg->data.d_char);
break;
case TYPE_INT:
value = (double)(pkg->data.d_int);
break;
case TYPE_LONG:
value = (double)(pkg->data.d_long);
break;
case TYPE_FLOAT:
value = (double)(pkg->data.d_float);
break;
default:
value = (double)(pkg->data.d_double);
break;
}
return value;*/
return (double)(pkg->data.d_float);
}
void CEachItemDoc::Receive(int i, CPkg* pkg)//SPLINEDATA pkg)
{
int iPort = pkg->uComNo;
switch (pkg->MsgFlag)
{
case ANSOPENCOM : //回答已打开COM口
if(m_dCommStatus == ASKOPENCOM && iPort == m_iComNo)
{
m_bConnected=TRUE;
AfxMessageBox("Connected Success!please send data!");
m_dCommStatus = CONN_COM;
}
else
{
AfxMessageBox("收到的ANSOPENCOM报文与当前状态不配!");
}
break;
case ANSCLOSECOM : //回答已关闭COM口
if (m_dCommStatus == ASKCLOSECOM && iPort == m_iComNo)
{
m_dCommStatus = NO_COM; //状态改为未连接COM口状态
m_bConnected = FALSE;
// delete m_pClientThread;
m_pClientThread = NULL;
// delete m_pClientSocket;
// m_pClientSocket = NULL;
}
else
{
AfxMessageBox("收到的ANSCLOSECOM报文与当前状态不配!");
}
break;
case ANSMODIFYCOM: //回答已修改COM口设置
if (m_dCommStatus == ASKMODIFYCOM && iPort == m_iComNo)
{
}
else
{
AfxMessageBox("ANSMODIFYCOM error!");
}
break;
case ANSPREPSEND: //处于准备传送数据
if (m_dCommStatus == ASKSEND)
{
m_dCommStatus = SENDDATA; //状态改为传送数据状态
m_bData=TRUE;
}
else
{
AfxMessageBox("收到的ANSPREPSEND报文与当前状态不配!");
}
break;
case MESG: //处于正常传送数据
if (m_dCommStatus == SENDDATA || m_dCommStatus == ASKSTOP)
{
m_bData = TRUE;
double tValue = GetPkgValue(pkg);
/* srand((unsigned)time( NULL ));
int t1 = 50 + rand() % 37;
static int t2 = 0;
t2 = (t2 + 5) % 360;
double theta = PiV * t2 / ConstV;
m_graph.AddValue(i, (double)((t1 + 111 * (int)(sin(theta))) % 100 ));*/
tValue = (int)tValue % 100;
m_graph.AddValue(i, tValue);
UpdateAllViews(NULL);
}
else
{
CString temp;
temp.Format("%u MESG error!",m_dCommStatus);
AfxMessageBox(temp);
}
break;
case ANSSTOP: //处于停止传送数据
if (m_dCommStatus == ASKSTOP)
{
m_dCommStatus = PAUSE;
m_bData = FALSE;
AfxMessageBox("STOPSEND!");
CRealTime *pGraph = &m_graph;
pGraph->EndRealDraw();
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos != NULL)
{
pView = GetNextView(pos);
if(pView->IsKindOf(RUNTIME_CLASS(CCurveView)))
break;
}
CScrollBar *pXScrollBar = &(((CCurveView*)pView)->m_xScrollBar);
CScrollBar *pYScrollBar = &(((CCurveView*)pView)->m_yScrollBar);
int nMin, nMax;
nMin = pGraph->m_nXTicks;
nMax = pGraph->m_nPage * pGraph->m_nXTicks + pGraph->m_nTick;
if(nMax > nMin)
{
pXScrollBar->SetScrollRange(nMin, nMax);
pXScrollBar->SetScrollPos(nMax);
}
else
{
pXScrollBar->EnableWindow(FALSE);
}
pYScrollBar->EnableWindow(TRUE);
}
else
{
AfxMessageBox("STOPSEND error!");
}
break;
default:
break;
}
}
void CEachItemDoc::SetComDataType(CString strDataType)
{
if (strDataType == _T("double"))
{
m_DataType = TYPE_DOUBLE;
}
else if (strDataType == _T("char"))
{
m_DataType = TYPE_CHAR;
}
else if (strDataType == _T("int"))
{
m_DataType = TYPE_INT;
}
else if (strDataType == _T("float"))
{
m_DataType = TYPE_FLOAT;
}
else if (strDataType == _T("long"))
{
m_DataType = TYPE_LONG;
}
}
void CEachItemDoc::OnConnect()
{
if(m_pClientThread != NULL)
{
AfxMessageBox("数据端已连接!");
return;
}
//建立一个CConnectDlg对话框,用于输入被请求的服务器的ip地址,COM口,数据类型
CConnectDlg dlg;
if(dlg.DoModal() != IDOK) return; //如果输入未确认,则返回
m_strServerIP = dlg.m_strIpAddress; //保存地址
m_iComNo = dlg.m_nComNo + 1; //保存COM口号
SetComDataType(dlg.m_strDataType); //取出并保存输入的COM口的数据类型
POSITION pos = GetFirstViewPosition();
CView* pView;
while (pos != NULL)
{
pView = GetNextView(pos);
if(pView->IsKindOf(RUNTIME_CLASS(CCurveView)))break;
}
m_pClientThread = new CClientThread(&m_recvQueue, &m_sendQueue, pView, m_strServerIP);
if(! m_pClientThread->CreateThread())
{
AfxMessageBox(_T("failing to Create Client Thread!"));
delete m_pClientThread;
m_pClientThread = NULL;
}
// m_pClientSocket->ListenEx(&m_queue, pView);
SendOpenCom(); // 请求打开COM口
}
void CEachItemDoc::OnUpdateConnectUI(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_bConnected);
}
//当按下“请求传送数据”键时,执行该函数
void CEachItemDoc::OnSend()
{
if( m_dCommStatus == CONN_COM)
{
CPkg *pkg = new CPkg();
pkg->MsgFlag = ASKSEND;
pkg->datatype = m_DataType;
pkg->uComNo = m_iComNo;
m_sendQueue.Add(pkg);
m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
m_dCommStatus = ASKSEND;
m_graph.RestoreRealDraw();
}
}
void CEachItemDoc::OnUpdateSendUI(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bConnected && (!m_bData));
}
//当按下“请求暂停传送数据”键时,执行该函数,
void CEachItemDoc::OnStopSend()
{
// if( m_dCommStatus == SENDDATA)
if(m_bData)
{
CPkg *pkg = new CPkg();
pkg->MsgFlag = ASKSTOP;
pkg->datatype = m_DataType;
pkg->uComNo = m_iComNo;
m_sendQueue.Add(pkg);
m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
m_dCommStatus = ASKSTOP;
}
}
void CEachItemDoc::OnUpdateStopSendUI(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bConnected && m_bData);
}
/*
//当按下“请求关闭COM口”键时,执行该函数,
void CEachItemDoc::OnAskCloseCom()
{
if( m_dCommStatus != NO_COM)
{
m_cPkg.MsgFlag = ASKCLOSECOM;
m_pClientSocket->SendPkg(&m_cPkg);
m_dCommStatus = ASKCLOSECOM;
}
}*/
//当按下“请求断开与数据服务端的连接”键时,执行该函数,
void CEachItemDoc::OnDisconnect()
{
if(m_dCommStatus == CONN_COM || m_dCommStatus == PAUSE)
// if(m_dCommStatus != NO_COM)
{
CPkg *pkg = new CPkg();
pkg->MsgFlag = ASKCLOSECOM;
pkg->datatype = m_DataType;
pkg->uComNo = m_iComNo;
m_sendQueue.Add(pkg);
m_pClientThread->PostThreadMessage(WM_ONSEND, 0, 0);
m_dCommStatus = ASKCLOSECOM;
}
}
void CEachItemDoc::OnUpdateDisconnectUI(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bConnected);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -