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