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

📄 batttestdlg.cpp

📁 一个通过USB->UART读取C8051F060的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// BattTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "BattTest.h"
#include "BattTestDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Control(pDX, IDC_TIP2, m_wndTip2);
	DDX_Control(pDX, IDC_TIP1, m_wndTip1);
	DDX_Control(pDX, IDC_TIP3, m_wndTip3);
	DDX_Control(pDX, IDC_TIPS_CAPTION, m_wndCaption);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


double _Max(double a, double b)  
{
		if (a>b)
			return a;
		else
			return b;
}

double _Min(double a, double b)  
{
		if (a<b)
			return a;
		else
			return b;
}

double   GetMaxValFromArray(double dbValue[], ULONG nWfmSize)
{
		double  dfMax = -1000.0;		
		for (ULONG j=0; j<nWfmSize; j++)
		{
				dfMax = ::_Max(dbValue[j], dfMax);
		}		
		return dfMax;
}

double   GetMinValFromArray(double dbValue[], ULONG nWfmSize)
{
		double  dfMin = 1000.0;		
		for (ULONG j=0; j<nWfmSize; j++)
		{
				dfMin = ::_Min(dbValue[j], dfMin);
		}		
		return dfMin;
}




static  CCriticalSection g_critSec;
#define _USE_SYNC()  CSyncHelper __STmpSyncObj_(&g_critSec);

#define  ARRAYMAXCOUNT  7372800	    //2通道6分钟的点数
static   double   g_sACPlotValue[ARRAYMAXCOUNT];
static   double   g_sDCPlotValue[ARRAYMAXCOUNT];
#define  USECHNLNUM   2

#if  0
class  CMemManage
{
public:
	CMemManage():m_pACPlotValue(NULL), m_pDCPlotValue(NULL){;}
	virtual ~CMemManage(){this->FreeBuff();}
    
	void   InitMem()
	{
			this->AllocateBuff();
	}

	double  *GetACBuff()
	{
			return m_pACPlotValue;
	}

	double  *GetDCBuff()
	{
			return m_pDCPlotValue;
	}
protected:
	void   AllocateBuff()
	{
			this->FreeBuff();
			//
			m_pACPlotValue = (double *)malloc(sizeof(double)*ARRAYMAXCOUNT);
			m_pDCPlotValue = (double *)malloc(sizeof(double)*ARRAYMAXCOUNT);
	}
	
	void   FreeBuff()
	{
			if (m_pACPlotValue != NULL)
			{
					::free(m_pACPlotValue);
					m_pACPlotValue = NULL;
			}
			if (m_pDCPlotValue != NULL)
			{
					::free(m_pDCPlotValue);
					m_pDCPlotValue = NULL;
			}
	}
private:
	double   *m_pACPlotValue;
	double   *m_pDCPlotValue;
};
static  CMemManage  g_sMemManager;
#endif



//////////////////////////////////////////////////////////////////////////////////////
#define  XAXISMAXVAL    1800000
static   LONG    g_nXPots  = -1;		//Current Position
static   LONG    g_sStartIndex = 0;		//Left-Point Index
static   LONG    g_sEndIndex   = -1;	//Right-Point Index
static   int     g_nChnlNo = USECHNLNUM;
static   UINT    g_sDelta  = XAXISMAXVAL;
static   UINT    g_sLockStartIndex= 0;	//锁定光标在数组中的位置
static   UINT    g_sLockEndIndex  = -1;	//锁定光标在数组中的位置
static   BOOL    g_nStartTag = FALSE;
static   BOOL    g_bZoom     = FALSE;
static   long    XPos  = 0;
static   long    YPos  = 0;
static   BOOL    g_bCurveTrack = TRUE;
static   long    g_nXPos = 0;	//Down
static   long    g_nYPos = 0;	//Down
static   long    g_nUpXPos = 0;	//Up
static   long    g_nUpYPos = 0;	//Up
static   BOOL    g_bRightKeyTag = FALSE;
static   double  g_sOldCursor1 = 2000.0;
static   double  g_sOldCursor2 = 80000.0;
static   char    szFmt[32];
static   char    szFmt1[32];
static   char    szFmt2[32];
static   double  xVal = 0.0;
static   double  yVal = 0.0;
static   BOOL    g_bCursor1 = FALSE;
static   BOOL    g_bCursor2 = FALSE;
static   BOOL    g_bRunOnce = FALSE;
static   CString  g_strDisplayFile;



/////////////////////////////////////////////////////////////////////////
#pragma  comment(lib, "analysis.lib")
#include "analysis.h"
#define  _USERHIGHPASS
#define  QCoeff_3  3
#define  QCoeff_5  5
#define  QCoeff_7  7
const  double  QCoeff_3Dot[QCoeff_3] = {0.12, 0.78, 0.10};
const  double  QCoeff_5Dot[QCoeff_5] = {0.06, 0.09, 0.68, 0.11, 0.06};
//const  double  QCoeff_7Dot[QCoeff_7] = {0.05, 0.10, 0.18, 0.35, 0.17, 0.09, 0.06};
//const  double  QCoeff_7Dot[QCoeff_7] = {0.07, 0.12, 0.19, 0.25, 0.19, 0.11, 0.07};
//const  double  QCoeff_7Dot[QCoeff_7] = {0.09, 0.11, 0.17, 0.26, 0.17, 0.11, 0.09};
const  double  QCoeff_7Dot[QCoeff_7] = {0.14, 0.14, 0.14, 0.16, 0.14, 0.14, 0.14};

//加权平均算法
void   _BaseQArith(double  InArray[7], double QArray[], int nQNum/*加权点数*/)
{
		///////////////////////////////////////////////////////////////////////////////////////
		//根据权数计算单个值
		switch(nQNum) 
		{
		case QCoeff_3:
			InArray[1] = InArray[0]*QArray[0]+InArray[1]*QArray[1]+InArray[2]*QArray[2];
			break;
		case QCoeff_5:
			InArray[2] = InArray[0]*QArray[0]+InArray[1]*QArray[1]+InArray[2]*QArray[2]+InArray[3]*QArray[3]+InArray[4]*QArray[4];
			break;
		case QCoeff_7:
			InArray[3] = InArray[0]*QArray[0]+InArray[1]*QArray[1]+InArray[2]*QArray[2]+InArray[3]*QArray[3]+	\
						 InArray[4]*QArray[4]+InArray[5]*QArray[5]+InArray[6]*QArray[6];
			break;
		default:
			break;
		}
}

BOOL   BatSys_CalcQValue(double  Array[], ULONG nArrayLen, int nMaxNum = QCoeff_7/*加权点数*/)
{		
		int		nQNum = 0;
		ULONG   nIter = 0;
		double  *pActualQArray = NULL;
		int     nPrePos = 4;
		///////////////////////////////////////////////////////////////////////////////////////
		//不够计算加权算法则退出
		if (nArrayLen < QCoeff_7)
			return FALSE;

		///////////////////////////////////////////////////////////////////////////////////////
		//开始计算
		while(nIter++ <= nArrayLen)
		{
				if (nIter == 1)	//跳过第一个数
					continue;
				
				//其他用7点加权平均
				nQNum     = QCoeff_7;
				pActualQArray = (double  *)QCoeff_7Dot;
				nPrePos	  = 4;
				if (nIter == 2)	//第2个数
				{
					nQNum   = QCoeff_3;
					pActualQArray = (double  *)QCoeff_3Dot;
					nPrePos = 2;
				}
				if (nIter == 3)	//第3个数
				{
					nQNum   = QCoeff_5;
					pActualQArray = (double  *)QCoeff_5Dot;
					nPrePos = 3;
				}
				if (nIter == nArrayLen-2)	//倒数第3个数,97
				{
					nQNum   = QCoeff_5;
					pActualQArray = (double  *)QCoeff_5Dot;
					nPrePos = 2;
				}
				if (nIter == nArrayLen-1)	//倒数第2个数, 98
				{
					nQNum   = QCoeff_3;
					pActualQArray = (double  *)QCoeff_3Dot;
					nPrePos = 1;
				}
				if (nIter == nArrayLen)		//最后一个
				{
						Array[nIter-1] = 0.0f;
						Array[nIter-2] = 0.0f;
						break;
				}
				//
				_BaseQArith((double *)&Array[nIter-nPrePos], pActualQArray, nQNum/*加权点数*/);
		}
		
		return  TRUE;
}


//////////////////////////////////////////////////////////////////////////////////////
//
void     ShowRangeGraph(CCalWfmGraph *pDlg, UINT nPlotStartPt, LONG nPlotNum)
{
		double* dbValue[USECHNLNUM];
		ULONG   arrWfmSize[USECHNLNUM];
		if (pDlg == NULL)
			return ;
		if (nPlotNum+nPlotStartPt>= ARRAYMAXCOUNT)
			return;

		ZeroMemory(dbValue[0], nPlotNum*sizeof(double));
		ZeroMemory(dbValue[1], nPlotNum*sizeof(double));

		pDlg->ClearData();
		::memcpy(dbValue[0], &g_sACPlotValue[nPlotStartPt], nPlotNum*sizeof(double));
		::memcpy(dbValue[1], &g_sDCPlotValue[nPlotStartPt], nPlotNum*sizeof(double));
		
		//绘制曲线
		pDlg->PlotY(dbValue, arrWfmSize, USECHNLNUM);
}

class   CCurveHelper
{
public:
	CCurveHelper():m_pGraph(NULL), m_fFireLvl(0.0), 
					m_nFirePos(0), m_bImmdUpdate(FALSE)
	{
		  ZeroMemory(maxValue, sizeof(double)*USECHNLNUM);
		  ZeroMemory(minValue, sizeof(double)*USECHNLNUM);
	}

	virtual ~CCurveHelper()
	{
		  m_pGraph = NULL;
	}

	void   AcceptGraph(CCalWfmGraph  *pGraph)
	{
		  m_pGraph = pGraph;
	}

	//绘制曲线
	virtual void   DisplayData(double *dbValue[], ULONG arrWfmSize[], int nCount/*通道数目*/)
	{
			if (arrWfmSize[0] <=1000 || arrWfmSize[1] <=1000)
				return;
			
			::ZeroMemory(minValue, sizeof(double)*USECHNLNUM);
			maxValue[0] = -1000;
			maxValue[1] = -1000;

			if (m_pGraph != NULL && m_bImmdUpdate)
			{
#ifdef  _USERWINDOW
					//加窗
					::FlatTopWin(dbValue[0], arrWfmSize[0]);
					::FlatTopWin(dbValue[1], arrWfmSize[1]);
#endif

#ifdef  _USERLOWPASS
					TRACE2("目前运行在 File文件名 = %s, Line Num行数= %d.\n", __FILE__, __LINE__);
					//低通滤波
					::Bw_LPF(dbValue[0], arrWfmSize[0], 10*1000, 2000, 5, dbValue[0]);
#elif   defined(_USERBYPASS)	//带通滤波					
					::Bw_BPF (dbValue[0], arrWfmSize[0], 10*1000, 20, 2000, 3, dbValue[0]);
#elif   defined(_USERHIGHPASS)	//高通滤波
					::Bw_HPF (dbValue[0], arrWfmSize[0], 10*1000, 20, 1, dbValue[0]);
					//通过增益gain = 1/0.878 (与高通节数有关, 1节 = 0.878, 3节=(0.935)0.961)
					for (ULONG j=0; j < arrWfmSize[0]; j++)
					{		
							/*	
								50mV时50Hz-1.11, 100Hz-1.11, 150Hz -1.11
								10mV时90Hz-0.94, 150Hz-0.945, 200Hz-0.94
								30mV时150Hz-1.10, 100Hz-1.09, 50Hz -0.923
							*/
							dbValue[0][j]  /= 0.878f;	//(100Hz,0.936; 150Hz频率较高时, 好像衰减稍大,0.933较小)
							
							if (dbValue[0][j] > 0.0017f)
								dbValue[0][j] -= 0.0022;
							else  if (dbValue[0][j] < -0.0017f)
								dbValue[0][j] += 0.0022;

							if (dbValue[0][j] >2.0) 
								dbValue[0][j] = 2.0;
					}
					::BatSys_CalcQValue(dbValue[0], arrWfmSize[0]);	
/////////////////////////////////////////////////////////////
#if  0	//用于计量使用
					double   dblDf;
					double   freqpeak, powerpeak;
					WindowConst windowConstants;
					::AutoPowerSpectrum(dbValue[0], arrWfmSize[0], 1.0/(10*1000), g_sAutoPowerSpec, &dblDf);
					::ScaledWindowEx (dbValue[0], arrWfmSize[0], 0, GAUSSIAN, &windowConstants);
					::PowerFrequencyEstimate (g_sAutoPowerSpec, arrWfmSize[1], -1.0, windowConstants, dblDf, 5, &freqpeak, &powerpeak);
					::Bw_BPF (dbValue[0], arrWfmSize[0], 10*1000, freqpeak-0.5, freqpeak+0.5, 3, dbValue[0]);
#endif
#endif
					//////////////////////////////////////////////////////////////////////////
					//剔除前1000个点
					arrWfmSize[0] -= 1000;
					arrWfmSize[1] -= 1000;
					g_sLockEndIndex = arrWfmSize[0];

					::memcpy(g_sACPlotValue, &dbValue[0][1000], arrWfmSize[0]*sizeof(double));
					::memcpy(g_sDCPlotValue, &dbValue[1][1000], arrWfmSize[1]*sizeof(double));
					::memcpy(dbValue[0], g_sACPlotValue, arrWfmSize[0]*sizeof(double));
					::memcpy(dbValue[1], g_sDCPlotValue, arrWfmSize[1]*sizeof(double));
					
					m_pGraph->PlotY(dbValue, arrWfmSize, nCount);					
					int  nMaxIndex = 0, nMinIndex =0;
					::MaxMin1D (g_sACPlotValue, arrWfmSize[0], &maxValue[0], &nMaxIndex, &minValue[0], &nMinIndex);
					::MaxMin1D (g_sDCPlotValue, arrWfmSize[1], &maxValue[1], &nMaxIndex, &minValue[1], &nMinIndex);
			}
			
			//查找索引
			for(ULONG nPos = arrWfmSize[1]; nPos > 0; nPos--)
			{
					if (dbValue[1][nPos-1] > m_fFireLvl)
					{
							m_nFirePos = nPos;
							break;
					}
			}
	}

	//求得最大值/最小值
	virtual void   GetMaxMin(double maxVal[], double minVal[], int nChnlNum)
	{
			maxVal[0] = maxValue[0];
			maxVal[1] = maxValue[1];

			minVal[0] = minValue[0];
			minVal[1] = minValue[1];
	}

	virtual void   SetFireLvl(float fFireLvl, BOOL bImmdUpdate = TRUE)
	{
			m_fFireLvl    = fFireLvl;
			m_bImmdUpdate = bImmdUpdate;
	}

	//求得最后一个21.5的索引号
	virtual ULONG  GetFirePosInd()
	{
			return  m_nFirePos;
	}

private:
	CCalWfmGraph  *m_pGraph;
	double    maxValue[USECHNLNUM];
	double    minValue[USECHNLNUM];
	float     m_fFireLvl;
	ULONG     m_nFirePos;
	BOOL	  m_bImmdUpdate;
};

//显示某单个数据
static   CCurveHelper  g_sCurveHelper;
void	fpDisplayHistData(double *dbValue[], ULONG arrWfmSize[], int nCount/*数目*/)
{
		g_sCurveHelper.DisplayData(dbValue, arrWfmSize, nCount);
}

//得出最大值/最小值
void	_fpGetMaxMin(double maxValue[], double minValue[], int nChnlNum)
{
		g_sCurveHelper.GetMaxMin(maxValue, minValue, nChnlNum);
}






///////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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