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

📄 shiftcalfrmdlg.cpp

📁 此为某测试平台的上位机软件部分
💻 CPP
字号:
// TestPltDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ShiftCalFrm.h"
#include "ShiftCalFrmDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTestPltDlg dialog
CShiftCalFrmDlg::CShiftCalFrmDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CShiftCalFrmDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestPltDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CShiftCalFrmDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CShiftCalFrmDlg)
	DDX_Control(pDX, IDC_RESULT_EDIT, m_wndResult);
	DDX_Control(pDX, IDC_AVG_EDIT, m_wndAvg);
	DDX_Control(pDX, IDC_CALCHNL_COMBO, m_cbChnl);
	DDX_Control(pDX, IDC_UINT_WIN, m_wndUint);
	DDX_Control(pDX, IDC_MEAS_LIST, m_lstResult);
	DDX_Control(pDX, IDC_STDVAL_EDIT, m_wndStd);
	DDX_Control(pDX, IDC_CALTREE, m_CalTree);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CShiftCalFrmDlg, CDialog)
	//{{AFX_MSG_MAP(CShiftCalFrmDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_ONCEMEAS_BTN, OnOnceMeas)
	ON_BN_CLICKED(IDC_REMEAS_BTN, OnRemeas)
	ON_BN_CLICKED(ID_CALOK, OnCalOk)
	ON_BN_CLICKED(ID_CALCANCEL, OnCalCancel)
	ON_NOTIFY(TVN_SELCHANGED, IDC_CALTREE, OnSelchangedCalTree)
	ON_COMMAND(ACCEL_COMMIT_DLG, OnCalOk)
	ON_COMMAND(ACCEL_EXIT_DLG, OnCalCancel)
	ON_COMMAND(ACCEL_ONCEMEAS_DLG, OnOnceMeas)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestPltDlg message handlers
UINT   fp_ThreadFunc(LPVOID pData)
{
		CTreeCtrl *pTree= static_cast<CTreeCtrl *>(pData);
		
		::Sleep(600);		
		HTREEITEM  htRoot =  pTree->GetFirstVisibleItem();
		pTree->SelectItem(htRoot);

		return 0;
}
BOOL CShiftCalFrmDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_hAccel = ::LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_ACCEL));

	// Set the icon for this dialog.  The framework does this automatically
	// when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	m_wndStd.ModifyFlags(CAMSNumericEdit::AddDecimalAfterMaxWholeDigits, 0);
	m_wndStd.SetWindowText("0.00");

	m_imageList.Create(16, 16, TRUE, 2, 2);
	HICON  hTreeIcon = ::AfxGetApp()->LoadIcon(IDI_UNK_ICON);
	m_imageList.Add(hTreeIcon);	


	m_CalTree.SetImageList(&m_imageList, LVSIL_NORMAL);
	HTREEITEM  htItem =  m_CalTree.InsertItem("自整角旋变信号 校验", 0, 0);
	m_CalTree.SetItemData(htItem, 1);

	HTREEITEM  htDmmItem =  m_CalTree.InsertItem("万用表 校验", 0, 0);
		htItem =  m_CalTree.InsertItem("直流电压", htDmmItem);
		m_CalTree.SetItemData(htItem, 2);
		htItem =  m_CalTree.InsertItem("直流电流", htDmmItem);
		m_CalTree.SetItemData(htItem, 3);
		htItem =  m_CalTree.InsertItem("交流电压", htDmmItem);
		m_CalTree.SetItemData(htItem, 4);
		htItem =  m_CalTree.InsertItem("交流电流", htDmmItem);
		m_CalTree.SetItemData(htItem, 5);
		htItem =  m_CalTree.InsertItem("电阻", htDmmItem);
		m_CalTree.SetItemData(htItem, 6);
	m_CalTree.Expand(htDmmItem, TVE_EXPAND);

	htItem =  m_CalTree.InsertItem("示波器通道 校验", 0, 0);
	m_CalTree.SetItemData(htItem, 7);
	m_CalTree.SetItemHeight(28);
	
	::AfxBeginThread(fp_ThreadFunc, &m_CalTree);

	//
	m_lstResult.InsertColumn(1, "测量次数", LVCFMT_CENTER, 90);
	m_lstResult.InsertColumn(2, "测量值", LVCFMT_LEFT, 115);
	m_lstResult.InsertColumn(3, "标准值", LVCFMT_LEFT, 115);
	
	char  szFmt[32];
	for (int h=0; h<3; h++)
	{
			::sprintf(szFmt, "%d", h+1);
			int  nListItem = m_lstResult.InsertItem(h, szFmt);
			m_lstResult.SetItem(nListItem, 1, LVIF_TEXT, "0.0", -1, LVIS_SELECTED, -1, -1);
			m_lstResult.SetItem(nListItem, 2, LVIF_TEXT, "0.0", -1, LVIS_SELECTED, -1, -1);
	}
	ListView_SetExtendedListViewStyle(m_lstResult.GetSafeHwnd(), LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// 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 CShiftCalFrmDlg::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();
	}
}

BOOL CShiftCalFrmDlg::PreTranslateMessage(MSG* pMsg)
{
		if (WM_KEYFIRST <= pMsg->message &&WM_KEYLAST >= pMsg->message)
		{
				if (pMsg->wParam == 190 || (pMsg->wParam >= 48 && pMsg->wParam <= 57))
				{
						return   CDialog::PreTranslateMessage(pMsg);
				}
				::TranslateAccelerator(this->GetSafeHwnd(), m_hAccel,pMsg);
				return   TRUE;
		}

		return CDialog::PreTranslateMessage(pMsg);
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CShiftCalFrmDlg::OnQueryDragIcon()
{
		return (HCURSOR) m_hIcon;
}

void CShiftCalFrmDlg::OnCalOk()
{
		
		this->EndDialog(1);
}

void CShiftCalFrmDlg::OnCalCancel() 
{
		m_imageList.DeleteTempMap();

		this->EndDialog(1);
}

static  int  g_nMeasType = 0;
void CShiftCalFrmDlg::OnSelchangedCalTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
		NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
		HTREEITEM  ht = m_CalTree.GetSelectedItem();
		if (ht == NULL)
			return ;

		int nData= m_CalTree.GetItemData(ht);
		g_nMeasType = nData;
		this->SwitchResource(nData);


		*pResult = 0;
}

//改变界面资源
void   CShiftCalFrmDlg::SwitchResource(int nData)
{
		char  szFmt[32];
		m_cbChnl.ResetContent();

		switch(nData) {
		case 0x01:	//自整角旋变
			{
					m_cbChnl.EnableWindow(TRUE);
					for (int h=0; h<8; h++)
					{
						::sprintf(szFmt, " CH%d ", h+1);
						m_cbChnl.AddString(szFmt);
					}
					m_wndStd.SetMaxWholeDigits(2);
					m_wndStd.SetMaxDecimalPlaces(1);
					m_wndUint.SetWindowText("(°)");
			}
			break;
		case 0x02:	//万用表-直流电压
			{
					m_cbChnl.EnableWindow(FALSE);
					m_cbChnl.AddString(" CH1 ");
					m_wndStd.SetMaxWholeDigits(1);
					m_wndStd.SetMaxDecimalPlaces(1);
					m_wndUint.SetWindowText("(V)");	//V
			}
			break;
		case 0x03:	//万用表-直流电流
			{
					m_cbChnl.EnableWindow(FALSE);
					m_cbChnl.AddString(" CH1 ");
					m_wndStd.SetMaxWholeDigits(1);
					m_wndStd.SetMaxDecimalPlaces(1);
					m_wndUint.SetWindowText("(mA)");	//mA
			}
			break;
		case 0x04:	//万用表-交流电压
			{
					m_cbChnl.EnableWindow(FALSE);
					m_cbChnl.AddString(" CH1 ");
					m_wndStd.SetMaxWholeDigits(1);
					m_wndStd.SetMaxDecimalPlaces(1);
					m_wndUint.SetWindowText("(V)");	//V
			}
			break;
		case 0x05:	//万用表-交流电流
			{
					m_cbChnl.EnableWindow(FALSE);
					m_cbChnl.AddString(" CH1 ");
					m_wndStd.SetMaxWholeDigits(1);
					m_wndStd.SetMaxDecimalPlaces(1);
					m_wndUint.SetWindowText("(mA)");	//mA
			}
			break;
		case 0x06:	//万用表-电阻
			{
					m_cbChnl.EnableWindow(FALSE);
					m_cbChnl.AddString(" CH1 ");
					m_wndStd.SetMaxWholeDigits(4);
					m_wndStd.SetMaxDecimalPlaces(0);
					m_wndUint.SetWindowText("(M)");	//Ω
			}
			break;
		case 0x07:	//示波器
			{
					m_cbChnl.EnableWindow(TRUE);
					m_cbChnl.AddString(" CH1 ");
					m_cbChnl.AddString(" CH2 ");
					m_wndStd.SetMaxWholeDigits(1);
					m_wndStd.SetMaxDecimalPlaces(2);
					m_wndUint.SetWindowText("(V)");
			}
			break;
		default:
			break;
		}
		
		m_cbChnl.SetCurSel(0);
}









//////////////////////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////////////////////
#define   MAX75SDCHNLNUM  8
#define   MAXSCOPECHNLNUM  2
typedef  struct   _tagMeasResult
{
		float   Meas[3];
		float   Avg;
		BOOL    bPass;
}CalMeasResult;
struct   _tagCalInfo
{
		CalMeasResult    _75SDInfo[MAX75SDCHNLNUM];		//75SD旋变信号
		
		CalMeasResult    _DMM_DCVOL;		//直流电压信号
		CalMeasResult    _DMM_ACVOL;		//交流电压信号
		CalMeasResult    _DMM_DCCURR;		//直流电流信号
		CalMeasResult    _DMM_ACCURR;		//交流电流信号
		CalMeasResult    _DMM_OM;			//电阻信号
		
		CalMeasResult    ScopeInfo[MAXSCOPECHNLNUM];	//示波器通道信息
}g_CalMiscInfo;
static   int      g_nMeasTimes = 0;
static   float    fArrMeasValue[3];
#define  ALTER_LISTCTRL_ITEM_Result(pUIObject, Row, Col, szFmt)	\
	{LVITEM       item;	\
	item.mask		=   LVIF_TEXT;	\
	item.iItem		=   Row;	\
	item.iSubItem   =   Col;	\
	item.pszText    =   szFmt;	\
	pUIObject->SetItem(&item);}

#define   _GETRESULT(Result)  Result?_T("正常"):_T("失败")

float   _CalibHWMeas(int nMeasType, int nChnl, int nTimes);
void    _AdjustResult(int nMeasType, int nChnl, BOOL bResult, float Avg);

void CShiftCalFrmDlg::OnRemeas()
{
		g_nMeasTimes = 0;
		m_wndResult.SetWindowText("待定");
		m_lstResult.SetItemState(0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
}

void CShiftCalFrmDlg::OnOnceMeas()
{
		char   szFmt[32];
		float  fMeasValue = 0.0;
		if (g_nMeasTimes >= 3)
			return ;

		//得到标准值
		CString   rStdVal;
		m_wndStd.GetWindowText(rStdVal);
		float fStandard = ::atof((LPCTSTR)rStdVal);

		m_lstResult.SetItemState(g_nMeasTimes, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);		
		CListCtrl  *pLstCtrl = &m_lstResult;
		int nChnlNo = m_cbChnl.GetCurSel();
		TRACE1(">>>选择通道 = %d.\n", nChnlNo);

		//1.读取测量值
		fMeasValue = ::_CalibHWMeas(g_nMeasType, nChnlNo, g_nMeasTimes);		
		fArrMeasValue[g_nMeasTimes] = fMeasValue;

		//2.显示结果
		::sprintf(szFmt, "%.2f", fMeasValue);
		ALTER_LISTCTRL_ITEM_Result(pLstCtrl, g_nMeasTimes++, 2, szFmt)
		ALTER_LISTCTRL_ITEM_Result(pLstCtrl, g_nMeasTimes, 1, (LPSTR)(LPCTSTR)rStdVal)

		//3.计算均值
		if (g_nMeasTimes == 3)
		{
				fMeasValue = 0.0f;
				for (int g=0; g<3; g++)
				{
						fMeasValue += fArrMeasValue[g];
				}
				
				//显示结果
				::sprintf(szFmt, "%.2f", fMeasValue/3.0);
				m_wndAvg.SetWindowText(szFmt);
				
				//显示结论
				m_wndResult.SetWindowText(_GETRESULT(fMeasValue/3.0 < 0.90));
				::_AdjustResult(g_nMeasType, nChnlNo, fMeasValue/3.0 < 0.90/*结论*/, fMeasValue/3.0/*均值*/);
		}
}


/////////////////////////////////////////////////////////////////////////////////////
// 以下实现实际的测量工作。
//
/////////////////////////////////////////////////////////////////////////////////////
#define  SCOPEMAXRESOURCE   "PXI"
#define  DMMMAXRESOURCE   "PXI"
#define  _75SDRESOURCE   1

#include "../BoardDrv\PxiHDDrv.h"
#pragma  comment(lib, "../debug/BoardDrv.lib")
BOOL   AfxInitPXIHW(void)
{		
		BOOL  bInitHW = TRUE;		
		TRY
		{				
				//75SD
				bInitHW |= NMDriver_75SD::_75SD_Init(_75SDRESOURCE);				
				//DMM
				bInitHW |= NMDriver_DMM::_DMM_Init(DMMMAXRESOURCE);				
				//示波器卡
				bInitHW |= NMDriver_Scope::_Scope_Init(SCOPEMAXRESOURCE);
				NMDriver_Scope::_Scope_Config();
		}
		CATCH_ALL(e)
		{
				return  FALSE;
		}
		END_CATCH_ALL
		
		return bInitHW;
}

//释放PXI模块资源
void   AfxReleaseHW(void)
{
		//75SD
		NMDriver_75SD::_75SD_Close();
		//DMM
		NMDriver_DMM::_DMM_Close();		
		//示波器卡
		NMDriver_Scope::_Scope_Close();
}

float   _CalibHWMeas(int nMeasType, int nChnl, int nTimes)
{
		float   fMeas = 0.0;

		switch(nMeasType) 
		{
		case 0x01:	//自整角旋变
			{
					fMeas = NMDriver_75SD::_75SD_GetAngle(nChnl);
					g_CalMiscInfo._75SDInfo[nChnl].Meas[nChnl] = fMeas;
			}
			break;
		case 0x02:	//万用表-直流电压
			{
					NMDriver_DMM::_DMM_DCVoltMode();					
					fMeas = NMDriver_DMM::_DMM_Measure();
					g_CalMiscInfo._DMM_DCVOL.Meas[nChnl] = fMeas;
			}
			break;
		case 0x03:	//万用表-直流电流
			{
					NMDriver_DMM::_DMM_DCCurrMode();
					g_CalMiscInfo._DMM_DCCURR.Meas[nChnl] = fMeas;
			}
			break;
		case 0x04:	//万用表-交流电压
			{
					NMDriver_DMM::_DMM_ACVoltMode();
					g_CalMiscInfo._DMM_ACVOL.Meas[nChnl] = fMeas;
			}
			break;
		case 0x05:	//万用表-交流电流
			{
					NMDriver_DMM::_DMM_ACCurrMode();
					g_CalMiscInfo._DMM_ACCURR.Meas[nChnl] = fMeas;
			}
			break;
		case 0x06:	//万用表-电阻
			{
					NMDriver_DMM::_DMM_ResiMode();
					g_CalMiscInfo._DMM_OM.Meas[nChnl] = fMeas;
			}
			break;
		case 0x07:	//示波器
			{
					fMeas = NMDriver_Scope::_Scope_Fetch(nChnl);
					g_CalMiscInfo.ScopeInfo[nChnl].Meas[nChnl] = fMeas;
			}
			break;
		}

		return  fMeas;
}

//赋值
void   _AdjustResult(int nMeasType, int nChnl, BOOL bResult, float Avg)
{
		switch(nMeasType) 
		{
		case 0x01:	//自整角旋变
			{
					g_CalMiscInfo._75SDInfo[nChnl].bPass = bResult;
					g_CalMiscInfo._75SDInfo[nChnl].Avg   = Avg;
			}
			break;
		case 0x02:	//万用表-直流电压
			{
					g_CalMiscInfo._DMM_DCVOL.bPass = bResult;;		//直流电压信号
					g_CalMiscInfo._DMM_DCVOL.Avg   = Avg;
			}
			break;
		case 0x03:	//万用表-直流电流
			{
					g_CalMiscInfo._DMM_DCCURR.bPass = bResult;;		//直流电流信号
					g_CalMiscInfo._DMM_DCCURR.Avg   = Avg;
			}
			break;
		case 0x04:	//万用表-交流电压
			{
					g_CalMiscInfo._DMM_ACVOL.bPass = bResult;;		//交流电压信号
					g_CalMiscInfo._DMM_ACVOL.Avg   = Avg;
			}
			break;
		case 0x05:	//万用表-交流电流
			{
					g_CalMiscInfo._DMM_ACCURR.bPass = bResult;;		//交流电流信号
					g_CalMiscInfo._DMM_ACCURR.Avg   = Avg;
			}
			break;
		case 0x06:	//万用表-电阻
			{
					g_CalMiscInfo._DMM_OM.bPass = bResult;;			//电阻信号
					g_CalMiscInfo._DMM_OM.Avg   = Avg;
			}
			break;
		case 0x07:	//示波器
			{
					g_CalMiscInfo.ScopeInfo[nChnl].bPass = bResult;
					g_CalMiscInfo.ScopeInfo[nChnl].Avg   = Avg;
			}
			break;
		}
}

⌨️ 快捷键说明

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