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

📄 batttestdlg.cpp

📁 一个通过USB->UART读取C8051F060的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		pCursor = sCursors.Item(2);
		pBtn2->SetCheck(FALSE);
		pCursor.SetVisible(pBtn2->GetCheck()?true:false);
		
		g_bCurveTrack = TRUE;
		g_bRunOnce    = FALSE;
#endif
}

///////////////////////////////////////////////////////////////////////////////////////
//波形线的可视性
void CBattTestDlg::OnPlotVisible() 
{
	    CNiPlots  sPlots= m_Dlg.GetPlots();
		CButton *pBtn = (CButton *)GetDlgItem(IDC_PLOT1);
		CNiPlot pPlot = sPlots.Item(1);
		pPlot.SetVisible(pBtn->GetCheck()?true:false);
		if (pBtn->GetCheck())
			g_nChnlNo = 1;
		
		//
		pBtn =  (CButton *)GetDlgItem(IDC_PLOT2);
		pPlot = sPlots.Item(2);
		pPlot.SetVisible(pBtn->GetCheck()?true:false);
		if (pBtn->GetCheck())
			g_nChnlNo = 2;
}

HBRUSH CBattTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
		HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);		
		pDC->SetBkMode(TRANSPARENT);
		switch(nCtlColor) 
		{
		case CTLCOLOR_BTN:
		case CTLCOLOR_STATIC:
			if (pWnd->GetSafeHwnd() == m_wndMaxMin1.GetSafeHwnd()   ||
				pWnd->GetSafeHwnd() == m_wndMaxMin2.GetSafeHwnd()   ||
				pWnd->GetSafeHwnd() == m_wndMaxMin3.GetSafeHwnd()   ||
				pWnd->GetSafeHwnd() == m_wndMaxMin4.GetSafeHwnd()   ||
				pWnd->GetSafeHwnd() == m_wndMeas1.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas2.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas3.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas4.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndPP1.GetSafeHwnd()    ||
				pWnd->GetSafeHwnd() == m_wndPP2.GetSafeHwnd()    ||
				pWnd->GetSafeHwnd() == m_wndPP3.GetSafeHwnd()    ||
				pWnd->GetSafeHwnd() == m_wndPP4.GetSafeHwnd()    ||
				pWnd->GetSafeHwnd() == m_wndMeasT1.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndMeasT2.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndMeasT3.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndMeasT4.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas12.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas22.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas32.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeas42.GetSafeHwnd()  ||
				pWnd->GetSafeHwnd() == m_wndMeasT12.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndMeasT22.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndMeasT32.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndMeasT42.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndDeltaT1.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndDeltaT2.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndDeltaT3.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_wndDeltaT4.GetSafeHwnd()
				)
			{
					pDC->SetTextColor(RGB(0, 4, 5));
					hbr  = (HBRUSH)m_brushBk1.GetSafeHandle();
			}
			if (pWnd->GetSafeHwnd() == m_ckCur1.GetSafeHwnd() ||
				pWnd->GetSafeHwnd() == m_ckCur2.GetSafeHwnd())
			{
					pDC->SetTextColor(RGB(190, 164, 28));
			}
			break;
		}
		
		return hbr;
}

UINT    fpThreadDisplay(LPVOID pData)
{
		pfnCallBack fpShowData = (pfnCallBack)pData;
		
		if (g_strDisplayFile.GetLength() >10)
			g_sDataStream.ContShowData(fpShowData, (LPCTSTR)g_strDisplayFile/*某个文件*/);
		
		return 1;
}

void CBattTestDlg::OnOpenTest() 
{
		//选择文件
		#if 1
				static CFileDialog dlg(TRUE, _T("dat"), _T("myfile.dat"),
									   OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
									   _T("历史文件 (*.dat)|*.dat|All Files (*.*)|*.*||"), this );
		
				char pstrPath[APPPATHLEN];
				::pltCurrentPath(pstrPath, APPPATHLEN);
				::memcpy(pstrPath, ::strcat(pstrPath, LPCTSTR("\\Data\\")), 256);
				
				//Set the directory where the file open dialog will start from.
				dlg.m_ofn.lpstrInitialDir = (LPCTSTR)pstrPath;

				//Set the title for the file open dialog.
				dlg.m_ofn.lpstrTitle = _T("打开历史测试文件");
				dlg.DoModal();
		#endif
		
		//开始显示数据
		g_strDisplayFile = dlg.GetPathName();
		if (g_strDisplayFile.GetLength() >1)
		{
				m_LockZeroBtn.EnableWindow(TRUE);
				m_btnReport.EnableWindow(TRUE);
				
				double maxValue[USECHNLNUM];
				double minValue[USECHNLNUM];

				//设定激活电压门限
				g_sCurveHelper.SetFireLvl(this->GetFireLvlVal());
				g_sDataStream.ContShowData(fpDisplayHistData, (LPCTSTR)g_strDisplayFile/*某个文件*/);				
				
				//计算最大值/最小值
				::_fpGetMaxMin(maxValue, minValue, USECHNLNUM);
				
				//显示激活时间点
				ULONG  nMaxPos = g_sCurveHelper.GetFirePosInd();
				this->SetFireVal(nMaxPos/10000.0);
				
				//显示最大值/最小值
				this->ShowCalcValue(maxValue, minValue);
				
				//显示峰峰值
				char   szFmt[128];
				::sprintf(szFmt, "%.4f", ::fabs(maxValue[0]-minValue[0]));
				m_wndPP1.SetWindowText(szFmt);
		}
}

//显示最大值/最小值
void   CBattTestDlg::ShowCalcValue(double maxValue[2],  double minValue[2], int nCount)
{
		char   szFmt[32];

		::sprintf(szFmt, "%.3f/%.3f(V)", maxValue[0], minValue[0]);		
		m_wndMaxMin1.SetWindowText(szFmt);
		::sprintf(szFmt, "%.3f/%.3f(V)", maxValue[1], minValue[1]);
		m_wndMaxMin2.SetWindowText(szFmt);
}


//光标测量
void CBattTestDlg::OnCursorChange(long FAR* CursorIndex, VARIANT FAR* XPos, VARIANT FAR* YPos, BOOL FAR* bTracking) 
{
		CNiCursors sCursors= m_Dlg.GetCursors();
		CNiCursor  sCursor1 = sCursors.Item(1);
		CNiCursor  sCursor2 = sCursors.Item(2);
		CNiCursor  sCursor3 = sCursors.Item(3);
		CNiCursor  sCursor4 = sCursors.Item(4);

		::sprintf(szFmt2, "%.3f", (sCursor2.GetXPosition()-sCursor1.GetXPosition())/10000.0);
		if (*CursorIndex == 1)	//Left Cursor
		{
				xVal = sCursor1.GetXPosition();
				yVal = sCursor1.GetYPosition();
				
				::sprintf(szFmt, "%.3f", xVal/10000.0);
				::sprintf(szFmt1, "%.4f", yVal);
				//if (g_nChnlNo == 1)			//交流通道
				{
						m_wndMeasT1.SetWindowText(szFmt);	//时间			
						m_wndMeas1.SetWindowText(szFmt1);	//幅值						
						m_wndDeltaT1.SetWindowText(szFmt2); //时间差
				}
				
				sCursor3.SetXPosition(sCursor1.GetXPosition());
				yVal = sCursor3.GetYPosition();
				::sprintf(szFmt1, "%.4f", yVal);
				//else if (g_nChnlNo == 2)	//直流通道
				{
						m_wndMeasT2.SetWindowText(szFmt);	//时间			
						m_wndMeas2.SetWindowText(szFmt1);	//幅值						
						m_wndDeltaT2.SetWindowText(szFmt2); //时间差
				}
		}
		if (*CursorIndex == 2)	//Right Cursor
		{
				xVal = sCursor2.GetXPosition();
				yVal = sCursor2.GetYPosition();
				//
				::sprintf(szFmt, "%.3f", xVal/10000.0);
				::sprintf(szFmt1, "%.4f", yVal);
				//if (g_nChnlNo == 1)			//交流通道
				{
						m_wndMeasT12.SetWindowText(szFmt);	//时间			
						m_wndMeas12.SetWindowText(szFmt1);	//幅值
						//时间差
						m_wndDeltaT1.SetWindowText(szFmt2);
				}
				//
				sCursor4.SetXPosition(sCursor2.GetXPosition());
				yVal = sCursor4.GetYPosition();
				::sprintf(szFmt1, "%.4f", yVal);
				//else if (g_nChnlNo == 2)	//直流通道
				{
						m_wndMeasT22.SetWindowText(szFmt);	//时间			
						m_wndMeas22.SetWindowText(szFmt1);	//幅值
						//时间差
						m_wndDeltaT2.SetWindowText(szFmt2);
				}
		}

		//////////////////////////////////////////////////////////////////////
		//记忆光标位置
		CButton *pBtn1 =  (CButton *)GetDlgItem(IDC_MEASCURVE1);		
		CNiCursor   pCursor = sCursors.Item(1);		
		if (pBtn1->GetCheck())
		{
				g_sOldCursor1 = pCursor.GetXPosition();
		}
		
		CButton *pBtn2 =  (CButton *)GetDlgItem(IDC_MEASCURVE1);
		pCursor = sCursors.Item(2);		
		if (pBtn2->GetCheck())
		{
				g_sOldCursor2 = pCursor.GetXPosition();
		}
}

BOOL CAboutDlg::OnInitDialog() 
{
		CDialog::OnInitDialog();
		
#if 1
		m_CapFont.CreatePointFont(160, "宋体");
		m_TipFont.CreatePointFont(120, "宋体");
		//
		m_wndTip1.SetFont(&m_TipFont);
		m_wndTip2.SetFont(&m_TipFont);
		m_wndTip3.SetFont(&m_TipFont);
		m_wndCaption.SetFont(&m_CapFont);
#endif		
				
		return TRUE;  // return TRUE unless you set the focus to a control
					  // EXCEPTION: OCX Property Pages should return FALSE
}



/*****************************************************************/
/* 输出的供外部使用.											 */
/*****************************************************************/
void   _FillIndxDataPt(float sElapse, int nTotalRows, UINT IndPtArr[])
{
		if ((UINT(sElapse*40*1024)-1) <= 0)
			return ;

		for (int j=0; j<nTotalRows; j++)
		{
				UINT  nArrIndx = UINT((sElapse*(j+1))*10*1024)-1;
				IndPtArr[j]    = nArrIndx;
		}
}

#include "RptOptDlg.h"
#include "WordRpt\FTWordRpt.h"
#pragma  comment(lib, "WordRpt.lib")
#define  WORDTITLE   _T("热电池自旋放电测试报告")

static   ReportVisInfo    g_sReportVisInfo;
void CBattTestDlg::OnReportBtn() 
{
		char   szDateFmt[64];
		char   szFmt[64];

	    CFTWordRpt       g_sWordRptObj;
		COleDateTime     sOleDt;

		///////////////////////////////////////////////////////////////////////////////
		//1.存储图片文件
		CRect  rc;
		char pstrPath[APPPATHLEN];
		m_Dlg.GetClientRect(rc);
		::pltCurrentPath(pstrPath, 256);
		CString   strFile = CString(pstrPath) + _T("\\TempBits.bmp");
		m_Dlg.SavePic(rc, strFile);
		
		///////////////////////////////////////////////////////////////////////////////
		//2.选项
		CRptOptDlg    dlg(&g_sReportVisInfo, NULL);
		if (dlg.DoModal() == IDCANCEL)
			return ;
		
		///////////////////////////////////////////////////////////////////////////////
		//3.生成WORD文件
		if (::strlen((LPCTSTR)g_strDisplayFile) <=8)
		{
				TRACE1("文件长度 = %d.\n", ::strlen((LPCTSTR)g_strDisplayFile));
				::AfxMessageBox("请先打开测试的波形文件");
				return;
		}
		if (g_sReportVisInfo.sElapse<0.001)
		{
				::AfxMessageBox("实时电压间隔应大于0.1秒");
				return;
		}
		
		//////////////////////////////////////////////////////////////////////////////
		//4.计算实时电压间隔时间
#ifdef   _USECALCTIMEMODE
		int nTotalRows = int(g_sGlobalArgInfo.fTotalTime/g_sReportVisInfo.sElapse);
#else
		int nTotalRows = g_sDataStream.FetchSize((LPCTSTR)g_strDisplayFile) / (g_sReportVisInfo.sElapse*10*1024);
#endif
		if (nTotalRows <= 1)
		{
				::AfxMessageBox("未能设定采集器的读取时间!");
				return ;
		}
		g_sWordRptObj.InitEnv(g_sReportVisInfo.bPlotVis, pstrPath+CString("\\TempBits.bmp"), g_sReportVisInfo.bFeatureVis, 
							  g_sReportVisInfo.bDataTableVis, WORDTITLE, nTotalRows/*行*/);
		
		if (g_sReportVisInfo.bFeatureVis)
		{
				sOleDt = COleDateTime::GetCurrentTime();
				::sprintf(szDateFmt, "%d-%d-%d %d:%d:%d", sOleDt.GetYear(), sOleDt.GetMonth(), sOleDt.GetDay(), 
						 sOleDt.GetHour(), sOleDt.GetMinute(), sOleDt.GetSecond());
				
				//得到激活时间等特征参数?
				CString  szFmt;
				m_wndFireTm.GetWindowText(szFmt);
				float fFireTime = ::atof(szFmt.GetBuffer(32));
				g_sWordRptObj.FillBattHeader(g_sReportVisInfo.szFmt, szDateFmt, fFireTime/*激活时间*/, 
											32.0/*max*/, 1.02/*min*/, 120.5/*work time*/);				
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////
		//5.填充实时电压表
		if (g_sReportVisInfo.bDataTableVis)
		{
				TRACE2("当前文件 = %s, 当前行 = %d.\n",__FILE__, __LINE__);
				double *dbDCValue[2], *dbACValue[2];
				
				UINT  *IndPtArr   = new UINT[nTotalRows];
				dbDCValue[0] = new double[nTotalRows];
				dbACValue[0] = new double[nTotalRows];
				dbDCValue[1] = new double[nTotalRows];
				dbACValue[1] = new double[nTotalRows];
				
				//
				::_FillIndxDataPt(g_sReportVisInfo.sElapse, nTotalRows, IndPtArr);
				g_sDataStream.FetchRealData(nTotalRows, IndPtArr, (double **)dbDCValue, (double **)dbACValue, (LPCTSTR)g_strDisplayFile/*某个文件*/);

				for(int h=0; h<nTotalRows; h++)
					g_sWordRptObj.FillRealTbl(g_sReportVisInfo.sElapse*(h+1), dbDCValue[0][h], dbACValue[0][h], dbDCValue[1][h], dbACValue[1][h]);
				
				delete[]  IndPtArr;
				delete[]  dbDCValue[0];
				delete[]  dbACValue[0];
				delete[]  dbDCValue[1];
				delete[]  dbACValue[1];
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////
		//6.
		::sprintf(szFmt, "\\测试报告\\%d-%d-%d_%d-%d-%d.doc", sOleDt.GetYear(), sOleDt.GetMonth(), 
				  sOleDt.GetDay(), sOleDt.GetHour(), sOleDt.GetMinute(), sOleDt.GetSecond());
		CString strAppFile  = CString(pstrPath)+CString(szFmt);
		g_sWordRptObj.SaveRpt(FALSE, strAppFile);
}

//平移时移动光标
void CBattTestDlg::OnPanGraph() 
{
		::ShiftCursor(&m_Dlg);
}

//设定电池激活时间
void CBattTestDlg::SetFireVal(float fFireVal)
{
		char  szFmt[24];
		::sprintf(szFmt, "%.2f", fFireVal);
		m_wndFireTm.SetWindowText(szFmt);
}

//改变显示
void CBattTestDlg::OnChangeFireVlt() 
{
		//1.设定激活电压门限
		g_sCurveHelper.SetFireLvl(this->GetFireLvlVal(), FALSE);
		g_sDataStream.ContShowData(fpDisplayHistData, (LPCTSTR)g_strDisplayFile/*某个文件*/);				
		
		//2.显示激活时间点
		ULONG  nMaxPos = g_sCurveHelper.GetFirePosInd();
		this->SetFireVal(nMaxPos/10000.0);
}

#include "ChgAxisDlg.h"
void CBattTestDlg::OnChgYAxis() 
{
		CChgAxisDlg   dlg(&m_Dlg, NULL);
		dlg.DoModal();
}

//锁定零时刻
void     ShowRangeGraph1(CCalWfmGraph *pDlg, UINT nPlotStartPt, LONG nPlotNum)
{
		double* dbValue[USECHNLNUM];
		ULONG arrWfmSize[USECHNLNUM];
		if (pDlg == NULL)
			return ;
		pDlg->ClearData();

		arrWfmSize[0] = nPlotNum;
		arrWfmSize[1] = nPlotNum;
		dbValue[0] = &g_sACPlotValue[nPlotStartPt];
		dbValue[1] = &g_sDCPlotValue[nPlotStartPt];

		//绘制曲线
		pDlg->PlotY(dbValue, arrWfmSize, USECHNLNUM);
}

void CBattTestDlg::OnZero()
{
		//不满足锁定条件则退出
		if (g_sLockEndIndex < 0)
			return ;
		
		//移动光标
		CNiCursors sCursors = m_Dlg.GetCursors();
		CNiCursor  sCursor1 = sCursors.Item(1);
		
		/////////////////////////////////////////////////////////
		//得到当前索引号
		g_sLockStartIndex = max((LONG)sCursor1.GetXPosition(), 0);		
		if (g_sLockStartIndex >= g_sLockEndIndex)
			return ;
		
		::ShowRangeGraph1(&m_Dlg, g_sLockStartIndex, g_sLockEndIndex-g_sLockStartIndex);
}

⌨️ 快捷键说明

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