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

📄 paracfgview.cpp

📁 AD 数据采集卡基本的采集界面
💻 CPP
字号:
// ParaCfgView.cpp : implementation file
//

#include "stdafx.h"
#include "Sys.h"
#include "ParaCfgView.h"
#include "ADWaveView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CParaCfgView
extern PCI2006_PARA_AD ADPara;
extern int  m_ProcessDigitalMode;
extern int  m_ProcessGraphicMode;
extern BOOL m_FirstScreenStop;
extern int  m_AnalyzeChannel;
extern int m_UpperLimit;
extern int m_LowerLimit;
extern int  m_ScreenVolume;
extern int  m_TriggerVolt;
extern BOOL bDeviceADRun;
extern WORD m_DAData;
BOOL bShowOutTriggerFlag=FALSE;
BOOL bShowFIFOStatus = FALSE;
BOOL bWrite = FALSE;
IMPLEMENT_DYNCREATE(CParaCfgView, CFormView)
CParaCfgView::CParaCfgView()
	: CFormView(CParaCfgView::IDD)
{
	CountItem=0;
	//{{AFX_DATA_INIT(CParaCfgView)
	//}}AFX_DATA_INIT
}

CParaCfgView::~CParaCfgView()
{
}

void CParaCfgView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CParaCfgView)
	DDX_Control(pDX, IDC_EDIT_OutTriggerVolt, m_OutTriggerVolt);
	DDX_Control(pDX, IDC_EDIT_GroupInterval, m_GroupInterval);
	DDX_Control(pDX, IDC_EDIT_Frequence, m_Frequency);
	DDX_Control(pDX, IDC_COMBO_ADMode, m_ComBo_ADMode);
	DDX_Control(pDX, IDC_COMBO_OutDigitAnalog, m_ComBo_OutDigitAnalog);
	DDX_Control(pDX, IDC_COMBO_ClockSource, m_ComBo_ClockSource);
	DDX_Control(pDX, IDC_COMBO_ChannelCount, m_ComBo_ChannelCount);
	DDX_Control(pDX, IDC_COMBO_TriggerSource, m_TriggerSource);
	DDX_Control(pDX, IDC_COMBO_TriggerEdge, m_TriggerEdge);
	DDX_Control(pDX, IDC_CHANNEL, m_List);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CParaCfgView, CFormView)
	//{{AFX_MSG_MAP(CParaCfgView)
	ON_BN_CLICKED(IDC_DELETECHANNEL, OnDeletechannel)
	ON_EN_CHANGE(IDC_EDIT_Frequence, OnChangeEDITFrequence)
	ON_CBN_SELCHANGE(IDC_COMBO_TriggerEdge, OnSelchangeCOMBOTriggerEdge)
	ON_CBN_SELCHANGE(IDC_COMBO_TriggerSource, OnSelchangeCOMBOTriggerSource)	
	ON_BN_CLICKED(IDC_ADDCHANNEL, OnAddchannel)
	ON_CBN_SELCHANGE(IDC_COMBO_ChannelCount, OnSelchangeCOMBOChannelCount)
	ON_CBN_SELCHANGE(IDC_COMBO_ADMode, OnSelchangeCOMBOADMode)
	ON_CBN_SELCHANGE(IDC_COMBO_ClockSource, OnSelchangeCOMBOClockSource)
	ON_CBN_SELCHANGE(IDC_COMBO_OutDigitAnalog, OnSelchangeCOMBOOutDigitAnalog)
	ON_EN_CHANGE(IDC_EDIT_GroupInterval, OnChangeEDITGroupInterval)
	ON_EN_CHANGE(IDC_EDIT_OutTriggerVolt, OnChangeEDITOutTriggerVolt)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CParaCfgView diagnostics

#ifdef _DEBUG
void CParaCfgView::AssertValid() const
{
	CFormView::AssertValid();
}
 
void CParaCfgView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CParaCfgView message handlers

void CParaCfgView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	m_List.InsertColumn(0,"序号",LVCFMT_LEFT,36,70);//设置ListCtrl表头
	m_List.InsertColumn(1,"通道",LVCFMT_LEFT,50,70);
	m_List.InsertColumn(2,"增益",LVCFMT_LEFT,70,70);
	CString str;

	if(ADPara.ChannelCount ==0)
		ADPara.ChannelCount=1;

	DWORD type=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES|
		LVS_EX_HEADERDRAGDROP | LVS_EX_TRACKSELECT;	//设置listCtrl控件
	m_List.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,0,LPARAM(type));	

	if(ADPara.ADMode==PCI2006_GROUP_MODE)//初始化采集方式
	{
		m_ComBo_ADMode.SetCurSel(1);	//分组采集
		m_GroupInterval.EnableWindow(TRUE);

	}
	else
	{
		m_ComBo_ADMode.SetCurSel(0);	//连续采集
			m_GroupInterval.EnableWindow(FALSE);

	}

	for(int i=0;i<(int)ADPara.ChannelCount ;i++)//初始化ListCtrl
	{
		str.Format("%d",i);
		m_List.InsertItem (i,str);		
		str.Format("%d",ADPara.ChannelArray[i].ADChannel);
		m_List.SetItemText(i,1,str);

		switch(ADPara.ChannelArray[i].ADGains)
		{
		case PCI2006_1MULT_GAINS:
			str.Format("1倍");
			break;
		case PCI2006_10MULT_GAINS:
			str.Format("10/2倍");
			break;
		case PCI2006_100MULT_GAINS:
			str.Format("100/4倍");
			break;
		case PCI2006_1000MULT_GAINS:
			str.Format("1000/8倍");
			break;
		}
		
		m_List.SetItemText(i,2,str);
	}	

	m_ComBo_ChannelCount.SetCurSel(ADPara.ChannelCount -1);

	str.Format("%d",ADPara.Frequency );
	m_Frequency.SetWindowText(str);	//初始化采样频率

	str.Format("%d",ADPara.GroupInterval);
	m_GroupInterval.SetWindowText(str);

	m_OutTriggerVolt.SetWindowText("0.00"); // 将触发电压置初值

	if(ADPara.ClockSource==PCI2006_IN_CLOCK)//时钟选择
		m_ComBo_ClockSource.SetCurSel(0);//内部时钟	
	else
		m_ComBo_ClockSource.SetCurSel(1);//外部时钟

	if(ADPara.OutDigitAnalog == PCI2006_ANALOG_TRIGGER)//初始化外触发方式
	{
		m_ComBo_OutDigitAnalog.SetCurSel(0);//模拟
		m_OutTriggerVolt.EnableWindow(TRUE);
	}
	else
	{
		m_ComBo_OutDigitAnalog.SetCurSel(0);//数字
		m_OutTriggerVolt.EnableWindow(FALSE);
	}

	if(ADPara.TriggerSource==PCI2006_IN_TRIGGER)	//初始化触发方式
	{
		m_TriggerSource.SetCurSel(0);	//内触发
		m_TriggerEdge.EnableWindow(FALSE);//关闭外触发沿设定
		m_ComBo_OutDigitAnalog.EnableWindow(FALSE);//关闭外触发方式设定
		m_OutTriggerVolt.EnableWindow(FALSE);//触发电压
	}
	else
	{
		m_TriggerSource.SetCurSel(1);	//外触发
		m_TriggerEdge.EnableWindow(TRUE);//打开外触发沿设定
		m_ComBo_OutDigitAnalog.EnableWindow(TRUE);//打开外触发方式设定
		m_OutTriggerVolt.EnableWindow(TRUE);//触发电压

	}

	if(ADPara.OutTriggerEdge==PCI2006_RISING_EDGE)//初始化外触发沿
		m_TriggerEdge.SetCurSel(0);		//上升
	else
		m_TriggerEdge.SetCurSel(1);		//下降
	
	CountItem=(int)ADPara.ChannelCount ;	//初始化通道数量
	m_ComBo_ChannelCount.SetCurSel(CountItem-1);

	// TODO: Add your specialized code here and/or call the base class
}

void CParaCfgView::OnAddchannel() 
{//添加通道数,快捷键为 +
	// TODO: Add your control notification handler code here
	CountItem=m_List.GetItemCount();
	if(CountItem>=MAX_CHANNELCOUNT) return;
	CString str;
	str.Format("%d",CountItem);
	m_List.InsertItem(CountItem,str);
	m_List.SetItemText(CountItem,1,str);
	m_List.SetItemText(CountItem,2,"1倍");
	m_List.SetCheck(CountItem);
	ReadPara();
}

void CParaCfgView::ReadPara()//读取ListCtrl数据到Para变量中
{
	if (bDeviceADRun)//开始数据采集标志
	{
		return;//如果开始数据采集 ,不再重新赋值
	}
	CString str;
	int num,tmpNum;//中间变量
	int channelcount=0;//计算通道总数
	int CheckNum=0;	//计算通道总数,同步采集使用
	m_List.UpdateData(TRUE);
	m_List.RedrawWindow();

	for (int i=0;i<m_List.GetItemCount();i++)
	{
		str=m_List.GetItemText(i,1);//读取ListCtrl数据
		num=(int)strtol(str,NULL,10);//把ListCtrl中的字符串转换为数字
		ADPara.ChannelArray[i].ADChannel=num;//设定通道号

		str=m_List.GetItemText(i,2);		
		tmpNum=strtol(str,NULL,10);

		switch(tmpNum)
		{
			case 1:
				//str.Format("%d",ADPara.Gains[ChannelArray.ChannelArray [i].ADChannel[j]]);
				num=PCI2006_1MULT_GAINS;
				break;
			case 10:
				num=PCI2006_10MULT_GAINS;
				break;
			case 100:
				num=PCI2006_100MULT_GAINS;
				break;			
			case 1000:
				num=PCI2006_1000MULT_GAINS;
				break;			
		}
		ADPara.ChannelArray[i].ADGains =num;//设定增益
		channelcount++;// 通道总数增加
	}

	ADPara.ChannelCount =channelcount;//赋值通道总数
	m_ComBo_ChannelCount.SetCurSel(channelcount-1);//(在下拉列表中)显示通道数量 
	CSysApp* pApp=(CSysApp*)AfxGetApp();	
	CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pApp->m_pADDoc->m_hWndWave));
	pWaveView->DrawRulerVEX ();
}
void CParaCfgView::Sort()//排序ListCtrl中的序号
{
	int i;CString str;
	for(i=0;i<m_List.GetItemCount();i++)
	{
		str.Format ("%d",i);
		m_List.SetItemText(i,0,str);
	}
}

void CParaCfgView::OnDeletechannel() //删除ListCtrl中的数据,快捷键为Del
{
	// TODO: Add your control notification handler code here
	int num=0,nItem[MAX_CHANNELCOUNT];

	POSITION pos = m_List.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{//获取选定通道
			nItem[num] = m_List.GetNextSelectedItem(pos);
			num++;
			// you could do your own processing on nItem here
		}
		for(int i=num;i>=0;i--)
		{//删除选定通道
			m_List.DeleteItem(nItem[i]);
		}
	}

	CountItem=m_List.GetItemCount();//获取通道数量

	if(m_List.GetItemCount()<=0)
	{//通道数量不能为0 如果为零添加一个通道
		OnAddchannel();
		return;
	}
	Sort();
	ReadPara();
}

void CParaCfgView::OnChangeEDITGroupInterval() 
{
	// TODO: Add your control notification handler code here

	CString str;
	DWORD OldInterval=ADPara.GroupInterval;
	if((OldInterval<1)||(OldInterval>MAX_FREQUENCE)) 
	{
		OldInterval=2;//如果原始频率不再范围内 
		ADPara.GroupInterval=OldInterval;//赋新值
	}
	m_GroupInterval.GetWindowText(str);
	ADPara.GroupInterval=(DWORD)strtoul(str,NULL,10);
	if((ADPara.GroupInterval<1)||(ADPara.GroupInterval>MAX_FREQUENCE))
	{
		str.Format("%d之间", MAX_FREQUENCE);
		str="间隔时间在1与"+str;
		MessageBox(str,"提醒您...",MB_ICONSTOP);
		ADPara.GroupInterval=OldInterval;
		str.Format("%d",OldInterval);
		m_GroupInterval.SetWindowText(str);

	}
}

void CParaCfgView::OnChangeEDITFrequence() 
{
	CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_Frequence);
	CString str;
	pEdit->GetWindowText(str);
	DWORD OldFrequency=ADPara.Frequency;
	if((OldFrequency<1)||(OldFrequency>MAX_FREQUENCE)) 
	{
		OldFrequency=25000;//如果原始频率不再范围内 
		ADPara.Frequency=OldFrequency;//赋新值
	}
	ADPara.Frequency=strtol(str,NULL, 10);
	if((ADPara.Frequency<1)||ADPara.Frequency>MAX_FREQUENCE)
	{
		str.Format("%dHz之间", MAX_FREQUENCE);
		str="采样频率应在1Hz与"+str;
		MessageBox(str,"提醒您...",MB_ICONSTOP);
		ADPara.Frequency=OldFrequency;
		str.Format("%d",OldFrequency);
		pEdit->SetWindowText(str);
	} 
	CSysApp* pApp=(CSysApp*)AfxGetApp();
	CADWaveView* pWaveView=(CADWaveView*)(CWnd::FromHandle(pApp->m_pADDoc->m_hWndWave));
	pWaveView->DrawRulerHEx();	
}


void CParaCfgView::OnChangeEDITOutTriggerVolt() 
{
	// TODO: Add your control notification handler code here
	CString str;
	m_OutTriggerVolt.GetWindowText(str);
	DOUBLE oldDAData=m_DAData;
	DOUBLE nOutTriggerVolt=(DOUBLE)strtod(str,NULL);
	m_DAData = (WORD)(nOutTriggerVolt/(20000.0/4096)+2048);

}

void CParaCfgView::OnSelchangeCOMBOTriggerEdge() 
{
	// TODO: Add your control notification handler code here
	CComboBox* pBox=(CComboBox*)GetDlgItem(IDC_COMBO_TriggerEdge);
	switch(pBox->GetCurSel())
	{
		case 0:
			ADPara.OutTriggerEdge =PCI2006_RISING_EDGE;// 外触发上升沿触发方式
			break;
		case 1:
			ADPara.OutTriggerEdge =PCI2006_FALLING_EDGE;// 外触发下降沿触发方式
			break;
	}
}

void CParaCfgView::OnSelchangeCOMBOTriggerSource() 
{
	// TODO: Add your control notification handler code here
	CComboBox* pBox=(CComboBox*)GetDlgItem(IDC_COMBO_TriggerSource);
	switch(pBox->GetCurSel())
	{
		case 0:
			ADPara.TriggerSource = PCI2006_IN_TRIGGER;// 内触发方式
			m_TriggerEdge.EnableWindow(FALSE);//关闭外触发沿设定
			m_ComBo_OutDigitAnalog.EnableWindow(FALSE);//关闭外触发方式设定
			m_OutTriggerVolt.EnableWindow(FALSE);

			break;
		case 1:
			ADPara.TriggerSource =PCI2006_OUT_TRIGGER ;// 外触发方式
			m_TriggerEdge.EnableWindow(TRUE);//打开外触发沿设定
			m_ComBo_OutDigitAnalog.EnableWindow(TRUE);//打开外触发方式设定
			if(ADPara.OutDigitAnalog ==PCI2006_ANALOG_TRIGGER )//模拟
				m_OutTriggerVolt.EnableWindow(TRUE);
			else
				m_OutTriggerVolt.EnableWindow(FALSE);

			break;
	}
}

void CParaCfgView::OnSelchangeCOMBOChannelCount() 
{//通道总数列表框
	// TODO: Add your control notification handler code here
	int channelCount=m_ComBo_ChannelCount.GetCurSel()+1;//获取选择的通道数量
	int loop=channelCount-m_List.GetItemCount();//计算用户选择通道数量和原来通道数量的差异
	if(loop<0)//如果 用户选择减少通道
	{
		while(channelCount!=m_List.GetItemCount())
			m_List.DeleteItem(channelCount);//删除通道,直到和用户选择的通道数量相同
	}
	else
		if(loop>0)//如果 用户选择增加通道
		{
			for(;loop>0;loop--)
				OnAddchannel();
		}
	ReadPara();
}

void CParaCfgView::OnSelchangeCOMBOADMode() 
{//采集模式
	// TODO: Add your control notification handler code here

	switch(m_ComBo_ADMode.GetCurSel())
	{
		case 0://连续采集
			ADPara.ADMode=PCI2006_SEQUENCE_MODE;
			m_GroupInterval.EnableWindow(FALSE);//禁止间隔时间输入
			break;
		case 1://分组采集
			ADPara.ADMode=PCI2006_GROUP_MODE;
			m_GroupInterval.EnableWindow(TRUE);
			break;
	}
}

void CParaCfgView::OnSelchangeCOMBOClockSource() 
{
	// TODO: Add your control notification handler code here
	switch(m_ComBo_ClockSource.GetCurSel())
	{
		case 0://内部时钟
			ADPara.ClockSource =PCI2006_IN_CLOCK;
			break;
		case 1://外部时钟
			ADPara.ClockSource =PCI2006_OUT_CLOCK;
			break;
	}
}

void CParaCfgView::OnSelchangeCOMBOOutDigitAnalog() 
{
	// TODO: Add your control notification handler code here
	switch(m_ComBo_OutDigitAnalog.GetCurSel())
	{
		case 0://模拟方式
			ADPara.OutDigitAnalog =PCI2006_ANALOG_TRIGGER ;
			m_OutTriggerVolt.EnableWindow(TRUE);
			break;
		case 1://数字方式
			ADPara.OutDigitAnalog =PCI2006_DIGIT_TRIGGER ;
			m_OutTriggerVolt.EnableWindow(FALSE);
			break;
	}
}

void CParaCfgView::EnableWindows(BOOL Flag)
{
	m_Frequency.EnableWindow(Flag);
	m_TriggerSource.EnableWindow(Flag);//触发方式

	m_ComBo_ChannelCount.EnableWindow(Flag);//通道总数
	m_ComBo_ClockSource.EnableWindow(Flag);//采样频率
	
	if(Flag==TRUE)
	{
		if(ADPara.TriggerSource == PCI2006_OUT_TRIGGER)//如果是外触发
		{
			m_TriggerEdge.EnableWindow(Flag);//外触发沿
			m_ComBo_OutDigitAnalog.EnableWindow(Flag);//外触发方式
			
			if(ADPara.ADMode ==PCI2006_SEQUENCE_MODE)
				m_GroupInterval.EnableWindow(Flag);//间隔时间输入

			if(ADPara.OutDigitAnalog ==PCI2006_ANALOG_TRIGGER)
				m_OutTriggerVolt.EnableWindow(Flag);//触发电压

		}
	}
	else
	{
		m_GroupInterval.EnableWindow(Flag);//禁止间隔时间输入
		m_TriggerEdge.EnableWindow(Flag);//外触发沿
		m_ComBo_OutDigitAnalog.EnableWindow(Flag);//外触发方式

		m_OutTriggerVolt.EnableWindow(Flag);//触发电压
	}
	m_ComBo_ADMode.EnableWindow(Flag);//采集方式
	m_List.EnableWindow(Flag);//通道列表	
}

void CParaCfgView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(lHint==1||lHint==2) return;
	CView::OnUpdate(pSender, lHint, pHint);	
}

⌨️ 快捷键说明

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