📄 batttestdlg.cpp
字号:
// 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 + -