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

📄 testdlg.cpp

📁 用VC编写的完整采样程序
💻 CPP
字号:
// TestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Test.h"
#include "TestDlg.h"
#include "ParameterDlg.h"

#include <conio.h>
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

int m_nHour,m_nMinute,m_nSecond;

UINT TestThread(LPVOID pParam)
{   
	CTestDlg* pDlg=(CTestDlg*)pParam;

	int freq;
	freq=pDlg->m_nFreq*pDlg->scale;
    
	for(pDlg->m_nPointNum=0; pDlg->m_nPointNum <pDlg->NumberTotal;pDlg->m_nPointNum++)
	{
//		pDlg->m_arrayVolt[pDlg->m_nPointNum]=pDlg->Sample(0);
		pDlg->m_arrayVolt[pDlg->m_nPointNum]=500*(1+sin(100*rand()));
		pDlg->m_wndTest.nRange=pDlg->m_nRange;//hyq
		pDlg->m_wndTest.SetPos(0,pDlg->m_arrayVolt[pDlg->m_nPointNum]); 
		pDlg->m_wndTest.DrawSpike(pDlg->m_nPointNum);//,pDlg->m_nRange);
		if(pDlg->m_nflag)  
	   		break;
	
		Sleep(1000/freq);
	}
    AfxGetMainWnd()->PostMessage(WM_COMMAND,IDC_STOP);		
	return 0;
}
//////////////////////////////////////

const char fileDialogFilter[]= 
    "数据文件(*.dat)|*.dat|文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||";
const char fileDialogExt[]="dat";
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestDlg dialog

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestDlg)
	m_strChannel = _T("");
	m_strFeedback = _T("");
	m_strFreq = _T("");
	m_strRange = _T("");
	m_strTestTime = _T("");
	m_strTimeTotal = _T("");
	m_strNumber = _T("");
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestDlg)
	DDX_Text(pDX, IDC_CHANNEL_EDIT, m_strChannel);
	DDX_Text(pDX, IDC_FEEDBACK_EDIT, m_strFeedback);
	DDX_Text(pDX, IDC_FREQ_EDIT, m_strFreq);
	DDX_Text(pDX, IDC_RANGE_EDIT, m_strRange);
	DDX_Text(pDX, IDC_TESTTIME_EDIT, m_strTestTime);
	DDX_Text(pDX, IDC_TIMETOTAL_EDIT, m_strTimeTotal);
	DDX_Text(pDX, IDC_NUMTOTAL_EDIT, m_strNumber);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
	//{{AFX_MSG_MAP(CTestDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_EXIT, OnExit)
	ON_BN_CLICKED(IDC_PAUSE, OnPause)
	ON_BN_CLICKED(IDC_PARAMETER, OnParameter)
	ON_BN_CLICKED(IDC_START, OnStart)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	ON_BN_CLICKED(IDC_SAVE, OnSave)
	ON_BN_CLICKED(IDC_CALIBRATION, OnCalibration)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestDlg message handlers

BOOL CTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_arrayVolt.SetSize(300000,-1);
	IsStart=true;
	IsSave=false;
	m_nflag=1;
	m_nCalibrationNum=0;

/*	FILE *fp;
	if(fp=fopen("StartSet.dat","r"))
	{
      fscanf(fp,"Freq=%d\nRange=%d\nHour=%d\nMinute=%d\nSecond=%d\nPort=%d\nScale=%f",
	          &m_nFreq,&m_nRange,&m_nHour,&m_nMinute,&m_nSecond,&m_nPort,&scale);
	  m_nTimeTotal=m_nHour*3600+m_nMinute*60+m_nSecond;
	  NumberTotal=m_nTimeTotal*m_nFreq;
	}
    else
*/	{
      m_nPort=528;
	  m_nFreq=50;	
	  m_nRange=5000;
	  m_nHour=0;
	  m_nMinute=0;
	  m_nSecond=10;
	  scale=1;
	  NumberTotal=(m_nHour*3600+m_nMinute*60+m_nSecond)*m_nRange;
	}
    
//	m_nTimeTotal=1000;	
    time[1]=0;
	time[2]=0;
	GetDlgItem(IDC_START)->EnableWindow(FALSE);
	GetDlgItem(IDC_PAUSE)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
	IsCalibration=false;
	m_strFreq.Format("%d",m_nFreq);
	m_strRange.Format("%d",m_nRange);
//	m_strTimeTotal.Format("%d",m_nTimeTotal);
//  m_strTimeTotal.Format("H:%d M:%d S:%d",m_nHour,m_nMinute,m_nSecond);
//	m_strChannel.Format("%d",1);
	UpdateData(FALSE);

	m_wndTest.nRange=m_nRange;
	m_wndTest.SubclassDlgItem(IDC_TEST_CTRL,this);
	m_wndTest.Add(RGB(255,0,0),1);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

HCURSOR CTestDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BEGIN_EVENTSINK_MAP(CTestDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTestDlg)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTestDlg::OnStart() 
{
	CTestDlg* pDlg=this;
	if(IsStart)
	{
		if((IsSave)&&(!IsCalibration))
		{
			int result;
			result=MessageBox(" 是否将刚采集的数据存盘?",
					  "警告!",MB_YESNO);
	        if(result==IDYES)
				Save();
		}
		////////////////////////////
		m_nCalibrationNum=0;//hyq
		RunTestThread();
		IsStart=false;
//		scale=1;//hyq
		if(!IsCalibration)
		  IsSave=true;
	}
	else
	{   
		SetTimer(0,m_nFreq,NULL);
		time[2]=CTime::GetCurrentTime();
		ResumeThread(m_hThreadWorker);
		GetDlgItem(IDC_START)->EnableWindow(FALSE);
		GetDlgItem(IDC_PAUSE)->EnableWindow(TRUE);		
	}
    if(!IsCalibration)
	{
		m_strTimeTotal.Format("H:%d M:%d S:%d",m_nHour,m_nMinute,m_nSecond);
	    m_strChannel.Format("%d",1);
        UpdateData(FALSE);
	}
}

void CTestDlg::OnPause() 
{
	time[1]=CTime::GetCurrentTime();
    KillTimer(0);
	m_strNumber.Format("%d",m_nPointNum);
	UpdateData(FALSE);
	SetDlgItemText(IDC_START,"继续");
	SuspendThread(m_hThreadWorker);
	GetDlgItem(IDC_PAUSE)->EnableWindow(FALSE);
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
	
}

void CTestDlg::OnStop() 
{
	IsStart=true;
	IsCalibration=false;
	m_nflag=1;
	time[1]=0;
	time[2]=0;
	KillTimer(0);
	m_strNumber.Format("%d",m_nPointNum);
	UpdateData(FALSE);
	SetDlgItemText(IDC_START,"采样");
	GetDlgItem(IDC_PAUSE)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_START)->EnableWindow(TRUE);
	
}


void CTestDlg::OnParameter() 
{
	CParameterDlg dlg;
	dlg.m_nFreqSpin=m_nFreq;
	dlg.m_nRangeSpin=m_nRange;
	dlg.m_nHourSpin=m_nHour;
	dlg.m_nMinuteSpin=m_nMinute;
	dlg.m_nSecondSpin=m_nSecond;

	if(m_nPort==544)
      dlg.m_nPortSpin=220;
	else 
	  dlg.m_nPortSpin=210;
	if(dlg.DoModal()==IDOK)
	{
		UpdateData(TRUE);
		m_nFreq=dlg.m_nFreqSpin;
    	m_nRange=dlg.m_nRangeSpin;
		m_nHour=dlg.m_nHourSpin;
	    m_nMinute=dlg.m_nMinuteSpin;
	    m_nSecond=dlg.m_nSecondSpin;

		m_wndTest.nRange=m_nRange;//hyq
		m_wndTest.InvalidateCtrl();//hyq
		m_wndTest.RangeChange();//hyq

		if(dlg.m_nPortSpin==220)
            m_nPort=544;
		else m_nPort=528;
		m_nTimeTotal=dlg.m_nHourSpin*3600+
		         dlg.m_nMinuteSpin*60+
				 dlg.m_nSecondSpin;
		NumberTotal=m_nTimeTotal*m_nFreq;
	}

	FILE *fp;
	fp=fopen("StartSet.dat","w");
	fprintf(fp,"Freq=%d\nRange=%d\nHour=%d\nMinute=%d\nSecond=%d\nPort=%d\nScale=%f",
		m_nFreq,m_nRange,m_nHour,m_nMinute,m_nSecond,m_nPort,scale);
	fclose(fp);
	
	m_strFreq.Format("%d",m_nFreq);
	m_strRange.Format("%d",m_nRange);
	m_strTimeTotal.Format("H:%d M:%d S:%d",dlg.m_nHourSpin,
		                   dlg.m_nMinuteSpin,dlg.m_nSecondSpin);
	UpdateData(FALSE);
}

void CTestDlg::OnSave() 
{	
	if(IsSave)
	   Save();
	else
		MessageBox("无数据可存,请先采样!","信息");
}

void CTestDlg::Save() 
{
	SuspendThread(m_hThreadWorker);
		
	CString filePathName,fileName;
	CFileDialog fileDialog(FALSE,".dat",NULL,
		  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,fileDialogFilter);
	
	if(fileDialog.DoModal()==IDOK)
	{
		CString oldPathName(filePathName);
		filePathName=fileDialog.GetPathName();
		fileName=filePathName+".dat";
	
		FILE *fs;	
		if ((fs=fopen(filePathName,"w+"))==NULL)
		{
            AfxMessageBox("Temp File open error.");
	  	}	

		for (int i=0;i<m_nPointNum;i++)
				fprintf(fs,"%5d%6d\n",m_nFreq,m_arrayVolt[i]);
    	fclose(fs);
	}
	ResumeThread(m_hThreadWorker);
}


void CTestDlg::OnExit() 

{
		if(IsSave)
	{
		int result;
	    result=MessageBox("请将文件存盘,否则下次启动将清空数据!\n\n     是否将刚采集的数据存盘?\n",
					  "警告!",MB_YESNO);
	    if(result==IDYES)
			Save();
	}
	CDialog::OnOK();
}

void CTestDlg::OnTimer(UINT nIDEvent) 
{
    time[3]=CTime::GetCurrentTime();
	CTimeSpan t1=time[1]-time[0];
    CTimeSpan t2=time[3]-time[2];
	m_strTestTime.Format("%d",t1+t2);
	if((IsCalibration)&&((t1+t2)==1))
	{  
	   AfxGetMainWnd()->PostMessage(WM_COMMAND,IDC_STOP);	
	   IsCalibration=false;
	}
	m_strFeedback.Format("%d",m_arrayVolt[m_nPointNum]);
    m_strNumber.Format("%d",m_nPointNum);
	UpdateData(FALSE);
	CDialog::OnTimer(nIDEvent);
}

void CTestDlg::OnCalibration() 
{
	if(m_nCalibrationNum)
		scale*=(m_nFreq/(m_nPointNum/1.0));
	if(m_nflag==1)
	{
	  IsCalibration=true;    
	  m_nCalibrationNum++;
	  time[1]=0;
	  time[2]=0;
	  RunTestThread();
	}
	else
	{
		MessageBox("请终止采样以后再进行频率校正!","信息");
	}
	
}

int CTestDlg::Sample(int ch)
{
	int i,j;
	int datal,datah,data;
	float value;
	int base=m_nPort;
	ch=0;
	int volt;

	_outp(base,ch);
	for(i=0;i<3;i++)
	{
		_outp((base+2),0);
		do
		{
			j=_inp(base);
			j=j&1;
		}while(j!=0);
	}

	datal=_inp(base+2);
	datah=_inp(base+3);
	datah=datah&0x3;
	data=datah*256+datal;

	value=float((float)data*5.000/1023.0);
	volt=(int)(value*1000);
	if (volt>=5000)
		volt=5000;
	if (volt<=0)
		volt=0;

	return volt;
}


void CTestDlg::RunTestThread()
{
	CTestDlg* pDlg=this;
	m_wndTest.clear();		
	SetTimer(0,m_nFreq,NULL);
	m_nflag=0;
	time[0]=CTime::GetCurrentTime();
	CWinThread* pWinThread=
	  AfxBeginThread((AFX_THREADPROC)TestThread,(LPVOID)pDlg);
	m_hThreadWorker=pWinThread->m_hThread;
	GetDlgItem(IDC_START)->EnableWindow(FALSE);
    GetDlgItem(IDC_PAUSE)->EnableWindow(TRUE);
	GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -