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