📄 daview.cpp
字号:
// DAView.cpp : implementation file
//
#include "stdafx.h"
#include "Sys.h"
#include "DAView.h"
#include "DADoc.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
WORD DigitValue[8192];
DWORD FrequenceDA=50000;
UINT WriteDAThread0(PVOID pPara); // 读数据线程
CRect m_PictureRect;
POINT pointxy[4096];
BOOL DisplayFlag;
#define WM_DRAWPICTURE WM_USER+1
/////////////////////////////////////////////////////////////////////////////
// CDAView
UINT IDC_EDIT_Cycle[]=
{//正弦波周期点
IDC_EDIT_Cycle0,IDC_EDIT_Cycle1
};
UINT IDC_CHECK_WaveDA[]=
{//只输出恒定值
IDC_CHECK_Wave0,IDC_CHECK_Wave1
};
UINT IDC_EDIT_Value[]=
{//恒定值
IDC_EDIT_Value0,IDC_EDIT_Value1
};
UINT IDC_PICTURE_WAVE[]=
{//波形显示图
IDC_PICTURE0,IDC_PICTURE1
};
UINT IDC_BUTTON_StartDA[]=
{//开始输出
IDC_BUTTON_StartWriteDA0,IDC_BUTTON_StartWriteDA1
};
UINT IDC_BUTTON_StopDA[]=
{//停止输出
IDC_BUTTON_StopWriteDA0,IDC_BUTTON_StopWriteDA1
};
UINT IDC_SPIN_Cycle[]=
{
IDC_SPIN_Cycle0,IDC_SPIN_Cycle1
};
UINT IDC_SPIN_Value[]=
{
IDC_SPIN_Value0,IDC_SPIN_Value1
};
#define m_pEdit_Cycle(nNum) ((CEdit*)GetDlgItem(IDC_EDIT_Cycle[nNum])) //正弦波周期点
#define m_pCheck_Wave(nNum) ((CButton*)GetDlgItem(IDC_CHECK_WaveDA[(nNum)]))//只输出恒定值
#define m_pEdit_Value(nNum) ((CEdit*)GetDlgItem(IDC_EDIT_Value[(nNum)]))//恒定值
#define m_pButton_Start(nNum) ((CButton*)GetDlgItem(IDC_BUTTON_StartDA[(nNum)]))//开始输出按钮
#define m_pButton_Stop(nNum) ((CButton*)GetDlgItem(IDC_BUTTON_StopDA[(nNum)]))//停止输出按钮
#define m_pPictrue(nNum) ((CStatic*)GetDlgItem(IDC_PICTURE_WAVE[(nNum)]))//波形显示图
#define m_pSpinValue(nNum) ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_Value[(nNum)]))
#define m_pSpinCycle(nNum) ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_Cycle[(nNum)]))
IMPLEMENT_DYNCREATE(CDAView, CFormView)
CDAView::CDAView()
: CFormView(CDAView::IDD)
{
//{{AFX_DATA_INIT(CDAView)
//}}AFX_DATA_INIT
//DisplayFlag=FALSE;
m_WriteDAThread0=NULL;
m_Cycle=128; // 默认周期为128点
m_Value=32768;
DeviceID = 0;
bStart = FALSE;
}
CDAView::~CDAView()
{
}
void CDAView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDAView)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDAView, CFormView)
//{{AFX_MSG_MAP(CDAView)
ON_BN_CLICKED(IDC_BUTTON_StartWriteDA0, OnBUTTONStartWriteDA0)
ON_EN_CHANGE(IDC_EDIT_Cycle0, OnChangeEDITCycle0)
ON_BN_CLICKED(IDC_BUTTON_StopWriteDA0, OnBUTTONStopWriteDA0)
ON_EN_CHANGE(IDC_EDIT_Value0, OnChangeEDITValue0)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHECK_Wave0, OnCHECKWave0)
ON_BN_CLICKED(IDC_CHECK_Wave1, OnCHECKWave1)
ON_EN_CHANGE(IDC_EDIT_Cycle1, OnChangeEDITCycle1)
ON_EN_CHANGE(IDC_EDIT_Value1, OnChangeEDITValue1)
ON_BN_CLICKED(IDC_BUTTON_StartWriteDA1, OnBUTTONStartWriteDA1)
ON_MESSAGE(WM_DRAWPICTURE,OnDrawPicture)
ON_BN_CLICKED(IDC_BUTTON_StopWriteDA1, OnBUTTONStopWriteDA1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDAView diagnostics
#ifdef _DEBUG
void CDAView::AssertValid() const
{
CFormView::AssertValid();
}
void CDAView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
void CDAView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
for(int i=0;i<2;i++)
{
m_pEdit_Cycle(i)->SetWindowText("128");
m_pSpinCycle(i)->SetRange32(1,65535);
m_pSpinCycle(i)->SetBuddy(m_pEdit_Cycle(i));
m_pSpinCycle(i)->SetPos(m_Cycle);
m_pEdit_Value(i)->SetWindowText("2048");
m_pSpinValue(i)->SetRange32(0,4096);
m_pSpinValue(i)->SetBuddy(m_pEdit_Value(i));
m_pSpinValue(i)->SetPos(m_Value);
m_pButton_Start(i)->EnableWindow(TRUE);
m_pButton_Stop(i)->EnableWindow(FALSE);
m_pSpinValue(i)->EnableWindow(FALSE);
m_pEdit_Value(i)->EnableWindow(FALSE);
m_Para[i].m_bConstant = FALSE;
}
}
/////////////////////////////////////////////////////////////////////////////
// CDAView message handlers
UINT WriteDAThread0(PVOID pPara) // 读数据线程
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
PTHREAD_PARA m_pPara = (PTHREAD_PARA)pPara;
int i=0, k=0;
double t=0;
// 初始化DA部件
PCI2006_InitDevProDA(m_pPara->m_hDevice, PCI2006_RESET_MODE_NEGATIVE,m_pPara->DAChannelNum);
while(m_pPara->m_bDeviceRun)
{
if(m_pPara->m_bConstant )//如果是恒定值
PCI2006_WriteDevProDA(m_pPara->m_hDevice, m_pPara->m_DigitValue ,m_pPara->DAChannelNum);
else
PCI2006_WriteDevProDA(m_pPara->m_hDevice, m_pPara->m_pWaveValue[i],m_pPara->DAChannelNum);
i=(i+1)%m_pPara->m_nWriteDADataPointCount ;
// 如果需要延时,请加入下列代码
for(k=0; k<10000; k++)
{
t=t+0.5;
}
}
return TRUE;
}
UINT WriteDAThread1(PVOID pPara) // 读数据线程
{
CSysApp *pApp=(CSysApp *)AfxGetApp();
PTHREAD_PARA m_pPara = (PTHREAD_PARA)pPara;
ULONG i=0, k=0;
double t=0;
// 初始化DA部件
PCI2006_InitDevProDA(m_pPara->m_hDevice, PCI2006_RESET_MODE_NEGATIVE,m_pPara->DAChannelNum);
while(m_pPara->m_bDeviceRun)
{
if(m_pPara->m_bConstant )//如果是恒定值
PCI2006_WriteDevProDA(m_pPara->m_hDevice, m_pPara->m_DigitValue ,m_pPara->DAChannelNum);
else
PCI2006_WriteDevProDA(m_pPara->m_hDevice, m_pPara->m_pWaveValue[i],m_pPara->DAChannelNum);
i=(i+1)%m_pPara->m_nWriteDADataPointCount ;
// 如果需要延时,请加入下列代码
for(k=0; k<10000; k++)
{
t=t+0.5;
}
}
return TRUE;
}
void CDAView::OnBUTTONStartWriteDA0()
{
// TODO: Add your control notification handler code here
CDADoc* pDoc = (CDADoc*)GetDocument();
CSysApp *pApp=(CSysApp *)AfxGetApp();
m_Para[0].m_hDevice= pApp->m_hDevice;
m_Para[0].m_bDeviceRun=TRUE;
m_Para[0].DAChannelNum =0;
DisplayFlag=TRUE;
m_WriteDAThread0=AfxBeginThread(WriteDAThread0,(LPVOID)&m_Para[0], THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_WriteDAThread0->m_bAutoDelete=false;
m_WriteDAThread0->ResumeThread(); // 启动采集线程ReadThread
m_pButton_Start(0)->EnableWindow(FALSE);
m_pButton_Stop(0)->EnableWindow(TRUE);
bStart=TRUE;
}
void CDAView::OnBUTTONStopWriteDA0()
{
// TODO: Add your control notification handler code here
// 终止绘图线程
m_Para[0].m_bDeviceRun=FALSE;
if(m_WriteDAThread0)
{
WaitForSingleObject(m_WriteDAThread0->m_hThread, 1000);//INFINITE); // 等待子线程停止
}
if(m_WriteDAThread0)
{
m_WriteDAThread0->ExitInstance();
m_WriteDAThread0=NULL;
}
m_pButton_Start(0)->EnableWindow(TRUE);
m_pButton_Stop(0)->EnableWindow(FALSE);
bStart=FALSE;
}
void CDAView::OnChangeEDITCycle0()
{
OnEditCycle(0);
}
void CDAView::OnChangeEDITValue0()
{
OnEditValue(0);
}
void CDAView::OnPaint()
{
CPaintDC dc(this); // device context for painting
PostMessage(WM_DRAWPICTURE,0,0);
PostMessage(WM_DRAWPICTURE,1,0);
}
void CDAView::OnDrawPicture(WPARAM wParam,LPARAM lParam)
{
CRect rect;
int nNum=(int)wParam;
m_pPictrue(nNum)->GetClientRect(&rect);
rect.top++;
rect.left ++;
rect.bottom --;
rect.right--;
CDC* pDC=m_pPictrue(nNum)->GetDC();
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
pDC->FillRect(&rect,&brush);
double middle=4096.0/(rect.Height());
if(!m_Para[nNum].m_bConstant )//正弦波
{
POINT PointXY[1000];
for(int i=0;i<rect.Width();i++)
{
PointXY[i].x =i;
PointXY[i].y=(int)( m_Para[nNum].m_pWaveValue[i]/middle)+1;
}//画波形
pDC->Polyline(PointXY,rect.Width());
}
else
{//恒定值
int y=(int)((4095-m_Para[nNum].m_DigitValue) /middle+1);
pDC->MoveTo(rect.left ,y);
pDC->LineTo(rect.right ,y);
}
}
void CDAView::OnEditCycle(int nNum)
{
int i, k;
CString str;
m_pEdit_Cycle(nNum)->GetWindowText(str);
k = (int)strtol(str,NULL,10);
if(k<1)
{
str.Format("%d",0);
m_pEdit_Cycle(nNum)->SetWindowText(str);
return;
}
if(k>4096)
{
str.Format("%d",4096);
m_pEdit_Cycle(nNum)->SetWindowText(str);
return;
}
m_Cycle=k;
for(i=0; i<4096; i++)
{
m_Para[nNum].m_pWaveValue[i] =(WORD)(sin(6.28*i/m_Cycle)*2048+2047);
}
m_Para[nNum].m_nWriteDADataPointCount =4096 - 4096%m_Cycle;
PostMessage(WM_DRAWPICTURE,nNum,0);
}
void CDAView::OnEditValue(int nNum)
{
CString str;
int nValue;
m_pEdit_Value(nNum)->GetWindowText(str);
nValue=strtol(str,NULL,10);
if(nValue<0)
{
str.Format("%d",0);
m_pEdit_Cycle(nNum)->SetWindowText(str);
return;
}
if(nValue>4095)
{
str.Format("%d",4095);
m_pEdit_Value(nNum)->SetWindowText(str);
return;
}
m_Para[nNum].m_DigitValue =nValue;
PostMessage(WM_DRAWPICTURE,nNum,0);
}
void CDAView::OnCheckWave(int nNum)
{
int nPos;
CString str;
m_Para[nNum].m_bConstant = m_pCheck_Wave(nNum)->GetCheck();
if(m_Para[nNum].m_bConstant)
{
m_pEdit_Value(nNum)->GetWindowText(str);//获得恒定值
nPos=strtol(str,NULL,10);
m_pEdit_Cycle(nNum)->EnableWindow(FALSE);
m_pSpinCycle(nNum)->EnableWindow(FALSE);
m_pEdit_Value(nNum)->EnableWindow(TRUE);
m_pSpinValue(nNum)->EnableWindow(TRUE);
}
else
{
m_pEdit_Cycle(nNum)->GetWindowText(str);//获得正弦波周期点
nPos=strtol(str,NULL,10);
m_pEdit_Cycle(nNum)->EnableWindow(TRUE);
m_pSpinCycle(nNum)->EnableWindow(TRUE);
m_pEdit_Value(nNum)->EnableWindow(FALSE);
m_pSpinValue(nNum)->EnableWindow(FALSE);
}
PostMessage(WM_DRAWPICTURE,nNum,0);
}
void CDAView::OnCHECKWave0()
{
OnCheckWave(0);
}
void CDAView::OnCHECKWave1()
{
OnCheckWave(1);
}
void CDAView::OnChangeEDITCycle1()
{
OnEditCycle(1);
}
void CDAView::OnChangeEDITValue1()
{
OnEditValue(1);
}
void CDAView::OnBUTTONStartWriteDA1()
{
// TODO: Add your control notification handler code here
CDADoc* pDoc = (CDADoc*)GetDocument();
CSysApp *pApp=(CSysApp *)AfxGetApp();
m_Para[1].m_hDevice= pApp->m_hDevice;
m_Para[1].m_bDeviceRun=TRUE;
m_Para[1].DAChannelNum =1;
DisplayFlag=TRUE;
m_WriteDAThread1=AfxBeginThread(WriteDAThread0,(LPVOID)&m_Para[1], THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_WriteDAThread1->m_bAutoDelete=false;
m_WriteDAThread1->ResumeThread(); // 启动采集线程ReadThread
m_pButton_Start(1)->EnableWindow(FALSE);
m_pButton_Stop(1)->EnableWindow(TRUE);
}
void CDAView::OnBUTTONStopWriteDA1()
{
// TODO: Add your control notification handler code here
// 终止绘图线程
m_Para[1].m_bDeviceRun=FALSE;
if(m_WriteDAThread1)
{
WaitForSingleObject(m_WriteDAThread1->m_hThread, 1000);//INFINITE); // 等待子线程停止
}
if(m_WriteDAThread1)
{
m_WriteDAThread1->ExitInstance();
m_WriteDAThread1=NULL;
}
m_pButton_Start(1)->EnableWindow(TRUE);
m_pButton_Stop(1)->EnableWindow(FALSE);
bStart=FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -