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

📄 adwaveview.cpp

📁 AD 数据采集卡基本的采集界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ADWaveView.cpp : implementation file
//

#include "stdafx.h"
#include "Sys.h"
#include "ADWaveView.h"
#include "MainFrm.h"
#include "ADStatusView.h"
#include "ParaCfgView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////
extern PCI2006_PARA_AD ADPara;
extern int m_ProcessGraphicMode;
extern BOOL m_FirstScreenStop;
extern BOOL m_BounceStop;
extern int  m_ScreenVolume;
extern int  m_TriggerVolt;
extern int ChannelCount; 
extern int m_MiddleLsb;
extern int  m_TriggerVolt;
extern float m_AnalyzeAllCount;
extern UINT m_OverLimitCount;
extern int m_ProcessMoveVolt;
extern BOOL m_bProgress;

extern CADStatusView* pADStatusView;
extern CParaCfgView* pParaCfgView;
///////////////////////
int STEP;
static CPoint pointxy[32][8192];
extern int Center, PerY;
extern CRect ClientRect;
extern float middle1;

extern int CurrentIndex;
extern SHORT ADBuffer[MAX_SEGMENT][16384];
extern BOOL bDrawing;
extern BOOL bDeviceADRun;
extern ULONG nLoopSize;
extern BOOL bDataProcessing;
extern int DrawIndex;
extern int Volt_Range;
/////////////////////////////////////////////////////////////////////////////
// 计算频率
BOOL bMeasureFreq=FALSE;  // 是否计算频率
int StartX, EndX;    // 测频率
/////////////////////////////////////////////////////////////////////////////
// CADWaveView
//#include "graph\grview.h"

IMPLEMENT_DYNCREATE(CADWaveView, CScrollView)

CADWaveView::CADWaveView()
{
	ChannelCount=1;
	m_Draw=false;
	Offset=0;
	m_oldPoint.x =m_oldPoint.y =-1;

	CurrentProgress=0;  // 置采集进度条起值为0
	Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
	m_ScaleH_Width=20;
	m_ScaleV_Width=30;
}

CADWaveView::~CADWaveView()
{
}


BEGIN_MESSAGE_MAP(CADWaveView, CScrollView)
	//{{AFX_MSG_MAP(CADWaveView)
	ON_WM_MOUSEMOVE()
	ON_WM_KEYDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_SIZE()
	ON_WM_NCCALCSIZE()
	ON_WM_NCPAINT()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CADWaveView drawing
COLORREF pColor[]=
{
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 0..3通道颜色
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 4..7通道颜色
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 8..11通道颜色
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 12..15通道颜色	
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 16..19通道颜色
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 20..23通道颜色
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 24..27通道颜色
	RGB(176,15,172),
	RGB(170,21,33),
	RGB(22,158,169),
	RGB(4,187,109),
//------------ 28..31通道颜色	
};

void CADWaveView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CADDoc* pDoc = (CADDoc*)GetDocument();
	pDoc->m_hWndWave=m_hWnd;   // 取得视图句柄,以便在DOC中的线程使用
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	const SIZE conPSize={200,1};
	const SIZE conLSize={20,1};
	sizeTotal.cx = 0; 
	sizeTotal.cy = 0;
	SetScrollSizes(MM_TEXT, sizeTotal);

}

void CADWaveView::OnDraw(CDC* pDC)
{
	
	
	//CDocument* pDoc = GetDocument();
	// TODO: add draw code here
	if (m_ProcessGraphicMode==1)
	{	
		UpdateFrame(pDC);
		int		nDrawMode;
		nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
		pDC->MoveTo(m_oldPoint.x,0);
		pDC->LineTo(m_oldPoint.x,ClientRect.Height());	
		pDC->SetROP2(nDrawMode);		
	}
	
	if(m_ProcessMoveVolt!=1) 
	{
		AnalyzeAccurate();  // 分析数据精度
	}
}

/////////////////////////////////////////////////////////////////////////////
// CADWaveView diagnostics

#ifdef _DEBUG
void CADWaveView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CADWaveView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}
#endif //_DEBUG


BOOL CADWaveView::UpdateFrame(CDC* pDC)
{
	bDataProcessing = TRUE; // 表示正在处理数据,采集或处理线程不应该操作此段缓冲区	
	OldPen = pDC->SelectObject(&Pen);	
	PerY=ClientRect.Height()/ChannelCount; 
	middle1=(float)((((m_ScreenVolume)/VOLT_RANGE)*LSB_COUNT)/(PerY-5));//每像素对应的码值    
	
	Center=(int)(PerY/2.0);
	for(j=0; j<ChannelCount; j++)
	{
		x=ClientRect.left;
		for(i=0; (i<ClientRect.Width())&&(i<(int)nLoopSize); i++)	
		{
			pointxy[j][i].x=x+i;
			switch(Volt_Range) //电压处理方式 1:正负5伏 2:正负10伏 3:0至5伏 4:0至2.5伏
			{
			case RANGE_N5000_TO_P5000:
			case RANGE_N10000_TO_P10000:
				pointxy[j][i].y=(int)((Center)-(int)(((((((ADBuffer[DrawIndex][j+i*ChannelCount]^0x2000)&0x3FFF)-LSB_HALF)-m_MiddleLsb)))/middle1));
				break;
			case RANGE_0_TO_P5000:
			case RANGE_0_TO_P2500:
				pointxy[j][i].y=(int)((Center)-(int)(((((((ADBuffer[DrawIndex][j+i*ChannelCount]^0x2000)&0x3FFF)-LSB_HALF)-m_MiddleLsb)))/middle1));
				break;
			}


		}
		Center+=PerY;
		pDC->Polyline(pointxy[j], i-1);
	}
	pDC->SelectObject(OldPen);
	bDataProcessing = FALSE; // 表示数据已处理完,采集或处理线程可以操作此段缓冲区
	return TRUE;
}


void CADWaveView::AnalyzeAccurate()//精度分析
{
	int m_TemporyVolt;
	CString StrAllCount;
	CString StrOverCount;
	CString StrOverRatio;
	int m_TriggerLsb;
	m_TriggerLsb=(int)(m_TriggerVolt*(LSB_COUNT/VOLT_RANGE));
	for(ULONG i=0;i<ReadSizeWords;i++)
	{
		m_TemporyVolt=(int)((((ADBuffer[CurrentIndex][i]^0x2000)&0x3FFF)-LSB_HALF)-m_MiddleLsb);
		if(m_TemporyVolt>m_TriggerLsb)
		{
			m_OverLimitCount=m_OverLimitCount+1;	 
		}
		if(m_TemporyVolt<(-m_TriggerLsb))
		{
			m_OverLimitCount=m_OverLimitCount+1;	
		}
	}
	m_AnalyzeAllCount=m_AnalyzeAllCount+ReadSizeWords;
	StrAllCount.Format("%3.2e",m_AnalyzeAllCount);
	StrOverCount.Format("%d",m_OverLimitCount);
	StrOverRatio.Format("%4.4f",m_OverLimitCount*100/m_AnalyzeAllCount);
	StrOverRatio=StrOverRatio+"%";
	pADStatusView->m_nAnalyzeCount.SetWindowText(StrAllCount);
	pADStatusView->m_nOverRange.SetWindowText(StrOverCount);
	pADStatusView->m_nOverRatio.SetWindowText(StrOverRatio);
}


BOOL CADWaveView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	//cs.style=cs.style^WS_HSCROLL;

	return CScrollView::PreCreateWindow(cs);
}


void CADWaveView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(lHint==2)  // 如果是波形方式,就执行父类的OnUpdate来调用其OnDraw
	{		
		CScrollView::OnUpdate(pSender, lHint, pHint);
	}
} 

void CADWaveView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nChar)
	{
		case VK_LEFT:
			CurrentX--; 
			break;
		case VK_RIGHT:
			CurrentX++;
			break;
		case VK_UP:
			CurrentY--;
			break;
		case VK_DOWN:
			CurrentY++;
			break;
	}
	
	SetCursorPos(CurrentX, CurrentY); 
	CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CADWaveView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	bMeasureFreq = TRUE;
	StartX=point.x;	
	SetCapture();
	PointXY[0]=point;
	PointXY[1]=point;
	PointXY[2]=point;
	PointXY[3]=point;
	PointXY[4]=point;
	int		nDrawMode;
	CDC*	pDC=GetDC();
	
	nDrawMode=pDC->SetROP2(R2_NOTXORPEN);
	
	pDC->MoveTo(m_oldPoint.x,0);
	pDC->LineTo(m_oldPoint.x,ClientRect.Height());
	pDC->MoveTo(point.x,0);
	pDC->LineTo(point.x,ClientRect.Height());
	pDC->SetROP2(nDrawMode);
	m_Draw=FALSE;
	m_oldPoint=point;

	CScrollView::OnLButtonDown(nFlags, point);
}


void CADWaveView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	bMeasureFreq = FALSE;
	GetCursorPos(&CurrentPoint);
	CurrentX=CurrentPoint.x;  CurrentY=CurrentPoint.y;  // 用于键盘移动光标

	int nMode;
	CClientDC dc(this);
	CPen pen,*oldPen;
	pen.CreatePen(PS_DOT ,1,RGB(0,0,0));
	oldPen=dc.SelectObject(&pen);
	nMode=dc.SetROP2(R2_XORPEN);
	
	dc.Polyline (PointXY,5);
	
	dc.SetROP2(nMode);
	dc.SelectObject(oldPen);
	
	::ReleaseCapture();
		
	CScrollView::OnLButtonUp(nFlags, point);
}

void CADWaveView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	HCURSOR m_WaveCursor;
	CString str;		

	CClientDC dc(this);
	m_WaveCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);
	// 显示十字光标
	
	SetCursor(m_WaveCursor);
	CRect rect;
	GetClientRect(&rect);
	int nScreen=(rect.Height()/ChannelCount);
	nScreen=point.y%nScreen;

	CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄		
		
	CEdit* pEditVolt=(CEdit*)(pShow->m_wndShowStatus1).GetDlgItem(IDC_EDIT_Volt); 
	int Lsb=(int)((nScreen)*middle1);
	float m_CurrentVolt=(float)(m_ScreenVolume/2-Lsb*(VOLT_RANGE/LSB_COUNT));
	str.Format("%7.2f", m_CurrentVolt); 
	pEditVolt->SetWindowText(str);
	CEdit* pEditOffset=(CEdit*)(pShow->m_wndShowStatus1).GetDlgItem(IDC_EDIT_Offset); 
	int Count=Offset+point.x;  // 偏移总点数
	str.Format("%d", Count);
	pEditOffset->SetWindowText(str);
	
	// 取得频率值
	pParaCfgView->m_Frequency.GetWindowText(str);
	int Frequence=strtol(str,NULL, 10);
	CEdit* pPerTime=(CEdit*)(pShow->m_wndShowStatus1.GetDlgItem(IDC_EDIT_PerTime)); 
	float PerTime=(float)(1000000.0/(Frequence/ChannelCount));  // 单位时间
	str.Format("%7.2f", PerTime);
	pPerTime->SetWindowText(str);  // 置单位时间框
	
	CEdit* pCountTime=(CEdit*)(pShow->m_wndShowStatus1.GetDlgItem(IDC_EDIT_CountTime)); 
	float CountTime=PerTime*Count;  // 求总时间		
	str.Format("%7.2f", CountTime);
	pCountTime->SetWindowText(str);  // 置单位时间框
	if(bMeasureFreq)
	{	
		int nMode;		
/*		pen.CreatePen(PS_DOT ,1,RGB(0,0,0));
//------------------------------------------------------------------------
		nMode=dc.SetROP2(R2_XORPEN);
		oldPen=dc.SelectObject(&pen);
		dc.Polyline (PointXY,5);
		
		PointXY[1]=CPoint(point.x,PointXY[0].y) ;
		PointXY[2]=CPoint(point.x,point.y);

⌨️ 快捷键说明

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