⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daview.cpp

📁 AD 数据采集卡基本的采集界面
💻 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 + -