📄 exa06view.cpp
字号:
// exa06View.cpp : implementation of the CExa06View class
//
#include "stdafx.h"
#include "exa06.h"
#include "exa06Doc.h"
#include "exa06View.h"
#include "COMctrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CEvent InsertCompelte;
extern bool ThreadWorking;
#define ID_TIMER 1
IMPLEMENT_DYNCREATE(CExa06View, CScrollView)
BEGIN_MESSAGE_MAP(CExa06View, CScrollView)
//{{AFX_MSG_MAP(CExa06View)
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_STOP, OnStop)
ON_WM_TIMER()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_COMMAND(ID_DATASEARCH, OnDatasearch)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CExa06View, CScrollView)
//{{AFX_EVENTSINK_MAP(CExa06View)
ON_EVENT(CExa06View, IDC_DATACOM_MSCOMM, 1 /* OnComm */, OnCommDatacom, VTS_NONE)
ON_EVENT(CExa06View, IDC_CTRLCOM_MSCOMM, 1 /* OnComm */, OnCommCtrlcom, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
CExa06View::CExa06View()
{
// TODO: add construction code here
m_bCtrlCOMCreated = 0;
m_bDataCOMCreated = 0;
m_AlreadyOpen = false;
vScrollPos = 0;
hScrollPos = 0;
}
CExa06View::~CExa06View()
{
}
BOOL CExa06View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
void CExa06View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
#ifdef _DEBUG
void CExa06View::AssertValid() const
{
CScrollView::AssertValid();
}
void CExa06View::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CExa06Doc* CExa06View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CExa06Doc)));
return (CExa06Doc*)m_pDocument;
}
#endif //_DEBUG
//////////////////////////////////////////////////////////////////////////////////////
//////Drawing
void CExa06View::OnDraw(CDC* pDC)
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(pDoc->m_backgroundset == 1)
{
BITMAP bm;
CBitmap *pBitmap = &pDoc->m_background;
pBitmap->GetBitmap(&bm);
pDoc->m_BackgroundSize.cx = bm.bmWidth;
pDoc->m_BackgroundSize.cx = bm.bmHeight;
SetScrollSizes(MM_TEXT,CSize(bm.bmWidth,bm.bmHeight));
pDC->SetMapMode(MM_TEXT);
OnPrepareDC(pDC);
CDC memDC;
memDC.CreateCompatibleDC (pDC);
CBitmap* pOldBitmap = memDC.SelectObject (pBitmap);
pDC->BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject (pOldBitmap);
//加入点的位置,显示
/* CString str;
structbuffer temp[4];
int i = 1;
pDoc->Lock.Lock();
if(pDoc->ListBuffer.GetCount()>=4)
{
POSITION pos = pDoc->ListBuffer.GetTailPosition();
if(!pDoc->ListBuffer.IsEmpty())
{
temp[0] = pDoc->ListBuffer.GetTail();
while(i<4)
{
temp[i] = pDoc->ListBuffer.GetPrev(pos);
i++;
}
}
else
{
for(i=0;i<4;i++)
{
temp[i].CurChannel = i;
for(int j=0;j<pDoc->PointPerChannel;j++)
{
temp[i].buffer[j] = 0;
}
}
}
pDoc->Lock.Unlock();
*/ CString str;
pDoc->drawLock.Lock();
for(int i=0;i<4;i++)
{
for(int j=0;j<pDoc->PointPerChannel;j++)
{
str.Format("T:%.1f",pDoc->tempdraw[i].buffer[j]);
if(pDoc->tempdraw[i].alarm ==1)
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(pDoc->PointPos[pDoc->tempdraw[i].CurChannel*pDoc->PointPerChannel+j].x,
pDoc->PointPos[pDoc->tempdraw[i].CurChannel*pDoc->PointPerChannel+j].y,
str);
}
}
pDoc->drawLock.Unlock();
//在上面加入点的位置盒显示
}
}
///////////////////////about COM: setting , send and receive/////////////////////
int CExa06View::SetCtrlCOM(CString str)
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//TODO
//判断端口号
int port;
if(!str.CompareNoCase("COM1"))
port = 1;
else if(!str.CompareNoCase("COM2"))
port = 2;
else if(!str.CompareNoCase("COM3"))
port = 3;
else if(!str.CompareNoCase("COM4"))
port = 4;
else if(!str.CompareNoCase("COM5"))
port = 5;
else if(!str.CompareNoCase("COM6"))
port = 6;
else
port = 0;
if(port == 0)
{
MessageBox("非法的控制端口","错误!",MB_ICONERROR);
return 2; //port set error
}
//判断串口是否存在以及是否被占用
HANDLE m_hCom;
m_hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
if(m_hCom == INVALID_HANDLE_VALUE)
{
MessageBox("控制端口不存在或以被占用","",MB_ICONINFORMATION);
return 3; //port invalide
}
CloseHandle(m_hCom);
//生成一个串口控件
if(m_bCtrlCOMCreated == 0)
{
pDoc->m_CtrlCOM.Create(NULL,0,CRect(0,0,0,0),this,IDC_CTRLCOM_MSCOMM); //??????
m_bCtrlCOMCreated = 1;
}
if(pDoc->m_CtrlCOM.GetPortOpen()) //如果串口是打开的,则行关闭串口
pDoc->m_CtrlCOM.SetPortOpen(FALSE);
//参数设置
pDoc->m_CtrlCOM.SetCommPort(port);
pDoc->m_CtrlCOM.SetInBufferSize(1024); //?????
pDoc->m_CtrlCOM.SetOutBufferSize(1024); //?????
pDoc->m_CtrlCOM.SetInputLen(0); //读全部字符
pDoc->m_CtrlCOM.SetInputMode(1); //二进制方式
pDoc->m_CtrlCOM.SetRThreshold(1);
pDoc->m_CtrlCOM.SetSettings("9600,n,8,1");
if(!pDoc->m_CtrlCOM.GetPortOpen()) //如果串口没有打开则打开
pDoc->m_CtrlCOM.SetPortOpen(TRUE); //打开串口
else
{
MessageBox("打开控制端口失败!","错误!",MB_ICONERROR);
return 1; //open COM error
}
pDoc->m_CtrlCOM.GetInput();
MessageBox("控制端口打开成功","成功",MB_ICONINFORMATION);
return 0;
}
int CExa06View::SetDataCOM(CString str)
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//TODO
//判断端口号
int port;
if(!str.CompareNoCase("COM1"))
port = 1;
else if(!str.CompareNoCase("COM2"))
port = 2;
else if(!str.CompareNoCase("COM3"))
port = 3;
else if(!str.CompareNoCase("COM4"))
port = 4;
else if(!str.CompareNoCase("COM5"))
port = 5;
else if(!str.CompareNoCase("COM6"))
port = 6;
else
port = 0;
if(port == 0)
{
MessageBox("非法的数据端口","错误!",MB_ICONERROR);
return 2; //port set error
}
//判断串口是否存在以及是否被占用
HANDLE m_hCom;
m_hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL);
if(m_hCom == INVALID_HANDLE_VALUE)
{
MessageBox("数据端口不存在或以被占用","",MB_ICONINFORMATION);
return 3; //port invalide
}
CloseHandle(m_hCom);
//生成一个串口控件
if(m_bDataCOMCreated == 0)
{
pDoc->m_DataCOM.Create(NULL,0,CRect(0,0,0,0),this,IDC_DATACOM_MSCOMM); //??????
m_bDataCOMCreated = 1;
}
if(pDoc->m_DataCOM.GetPortOpen()) //如果串口是打开的,则行关闭串口
pDoc->m_DataCOM.SetPortOpen(FALSE);
//参数设置
pDoc->m_DataCOM.SetCommPort(port);
pDoc->m_DataCOM.SetInBufferSize(1024); //?????
pDoc->m_DataCOM.SetOutBufferSize(1024); //?????
pDoc->m_DataCOM.SetInputLen(0); //读全部字符
pDoc->m_DataCOM.SetInputMode(1); //二进制方式
pDoc->m_DataCOM.SetRThreshold(1);
pDoc->m_DataCOM.SetSettings("115200,n,8,1");
if(!pDoc->m_DataCOM.GetPortOpen()) //如果串口没有打开则打开
pDoc->m_DataCOM.SetPortOpen(TRUE); //打开串口
else
{
MessageBox("打开数据端口失败!","错误!",MB_ICONERROR);
return 1; //open COM error
}
pDoc->m_DataCOM.GetInput();
MessageBox("数据端口打开成功","成功",MB_ICONINFORMATION);
return 0;
}
//when data comes , windows will call this function
void CExa06View::OnCommDatacom()
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_DataCOM.GetCommEvent()==2)
{
Sleep(50);
pDoc->GetData(); //put the data in DataInWithHead[64]
if(pDoc->CheckData() == false)//check the data in DataInWitHead[64]
{
AfxMessageBox("校验和错误");
pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
return ;
}
if(pDoc->AddToDataList() != 0)
{
AfxMessageBox("串口数据错误");
pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
return;
}
if(pDoc->datacont<20)
{
pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
Sleep(30);
pDoc->datacont++;
}
else
{
pDoc->SendTo51();
//AfxMessageBox("after com data");
}
}
}
void CExa06View::OnCommCtrlcom()
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_CtrlCOM.GetCommEvent()==2)
{
//AfxMessageBox("in com ctrl");
if(pDoc->ctrlcont<=4)
{
pDoc->m_DataCOM.SetOutput(COleVariant(pDoc->m_SendRequireHEX));
pDoc->ctrlcont++;
pDoc->datacont = 0;
Invalidate();
}
else
{
Invalidate();
InsertCompelte.SetEvent();
}
}
}
////////////////////////////STARTING SYSTEM////////////////////////////
void CExa06View::OnStart()
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//TODO HERE
//打开并设置数据和控制端口
if(m_AlreadyOpen == false)
{
int dataport,ctrlport;
dataport = SetDataCOM(pDoc->CtrlPort);
ctrlport = SetCtrlCOM(pDoc->DataPort);
if((dataport==0)&&(ctrlport!=0)){
pDoc->m_DataCOM.SetPortOpen(FALSE);
return;
}
if((dataport!=0)&&(ctrlport==0)){
pDoc->m_CtrlCOM.SetPortOpen(FALSE);
return;
}
if((dataport!=0)&&(ctrlport!=0))
return;
m_AlreadyOpen = true;
}
else
{
MessageBox("请先停止监控","",MB_ICONWARNING);
}
SetTimer(ID_TIMER,pDoc->SamNormHZ*1000,NULL);
pDoc->DataCOMClosed = false;
ThreadWorking = true;
AfxBeginThread((AFX_THREADPROC)InsertDB,pDoc);
pDoc->SendTo51();
}
/////////////////////////////SYSTEM STOPPED//////////////////////////////////
void CExa06View::OnStop()
{
CExa06Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(m_AlreadyOpen == true)
{
KillTimer(ID_TIMER);
ThreadWorking = false;
pDoc->DataCOMClosed = true;
pDoc->m_DataCOM.SetPortOpen(FALSE);
pDoc->m_CtrlCOM.SetPortOpen(FALSE);
m_AlreadyOpen = false;
MessageBox("监控已停止","",MB_ICONWARNING);
}
else
{
MessageBox("监控尚未开始","",MB_ICONWARNING);
}
}
void CExa06View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CExa06Doc* pDoc = GetDocument();
pDoc->SendTo51();
pDoc->ctrlcont = 0;
// AfxMessageBox("in ontime");
CScrollView::OnTimer(nIDEvent);
}
void CExa06View::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if(nSBCode == SB_THUMBPOSITION || nSBCode == SB_THUMBTRACK)
vScrollPos = nPos;
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CExa06View::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if(nSBCode == SB_THUMBPOSITION || nSBCode == SB_THUMBTRACK)
hScrollPos = nPos;
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CExa06View::OnDatasearch()
{
// TODO: Add your command handler code here
WinExec("odbc1.exe",SW_SHOWMAXIMIZED);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -