📄 testdlg.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 + -