📄 usbwaveview.cpp
字号:
// USBWaveView.cpp : implementation file
//
#include "stdafx.h"
#include "USB.h"
#include "USBWaveView.h"
#include "UserDef.h"
#include "main.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//--------------------------------------------------------------------------
extern int m_ProcessGraphicMode;
extern WORD ADBuffer[MAX_SEGMENT][16384]; // 缓冲队列
extern BOOL m_FirstScreenStop;
extern BOOL m_BounceStop;
extern int m_BounceCount;
extern int m_ScreenVolume;
extern int m_TriggerVolt;
extern int nChannelCount;
extern int m_MiddleLsb[32];
extern int m_TriggerVolt;
extern float m_AnalyzeAllCount;
extern UINT m_OverLimitCount;
extern int m_ProcessMoveVolt;
extern BOOL m_bProgress;
extern Control_Mode m_Control; //控制参数传输
extern int m_nDrawPointNum;
extern BOOL bDeviceRun;
extern float VoltRange;
///////////////////////
int STEP;
static CPoint pointxy[32][8192];
extern int Center, PerY;
extern CRect ClientRect;
extern float middle1;
extern BOOL bDataProcessing;
extern int CurrentIndex;
extern int DrawIndex;
BOOL bWaveRedraw=FALSE;
//--------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CUSBWaveView
IMPLEMENT_DYNCREATE(CUSBWaveView, CScrollView)
CUSBWaveView::CUSBWaveView()
{
nChannelCount=1;
m_Draw=false;
Offset=0;
//CurrentProgress=0; // 置采集进度条起值为0
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
PerY=ClientRect.Height()/nChannelCount;
middle1=(float)((((m_ScreenVolume)/VoltRange)*LSB_COUNT)/(PerY-2));//每像素对应的码值
}
CUSBWaveView::~CUSBWaveView()
{
}
BEGIN_MESSAGE_MAP(CUSBWaveView, CScrollView)
//{{AFX_MSG_MAP(CUSBWaveView)
ON_WM_KEYDOWN()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUSBWaveView drawing
/////////////////////////////////////////////////////////////////////////////
// CUSBWaveView diagnostics
#ifdef _DEBUG
void CUSBWaveView::AssertValid() const
{
CScrollView::AssertValid();
}
void CUSBWaveView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CUSBWaveView message handlers
void CUSBWaveView::OnDraw(CDC* pDC)
{
if (m_ProcessGraphicMode==1)
{
UpdateFrame(pDC);
}
// TODO: add draw code here
}
BOOL CUSBWaveView::UpdateFrame(CDC *pDC)
{
bDataProcessing = TRUE; // 表示正在处理数据,采集或处理线程不应该操作此段缓冲区
OldPen = pDC->SelectObject(&Pen);
PerY=ClientRect.Height()/nChannelCount;
middle1=(float)((((m_ScreenVolume)/VoltRange)*LSB_COUNT)/(PerY-2));//每像素对应的码值
Center=(int)(PerY/2.0);
if(!bDeviceRun) DrawIndex=m_oldIndex; //如果停止采集则使用上一屏数据
m_oldIndex=DrawIndex;//保存本次索引号以便停止时使用
for(j=0; j<nChannelCount; j++)
{
x=ClientRect.left;
for(i=0; (i<ClientRect.Width()) && (i<m_nDrawPointNum); i++)
{
pointxy[j][i].x=x+i;
pointxy[j][i].y=(int)(Center-(int)(((((ADBuffer[DrawIndex][j+i*nChannelCount])^0x2000)&0x3fff)-LSB_HALF-m_MiddleLsb[j])/middle1));
}
Center+=PerY;
pDC->Polyline(pointxy[j], i-2);
}
pDC->SelectObject(OldPen);
if(bWaveRedraw)
{
CurrentIndex++;
if(CurrentIndex==MAX_SEGMENT) CurrentIndex=0;
}
bWaveRedraw=FALSE;
bDataProcessing = FALSE; // 表示数据已处理完,采集或处理线程可以操作此段缓冲区
return TRUE;
}
void CUSBWaveView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
if(lHint==2) // 如果是波形方式,就执行父类的OnUpdate来调用其OnDraw
{
bWaveRedraw=TRUE;
CScrollView::OnUpdate(pSender, lHint, pHint);
}
}
void CUSBWaveView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
CUSBDoc* pDoc = (CUSBDoc*)GetDocument();
pDoc->m_hWndWave=m_hWnd; // 取得视图句柄,以便在DOC中的线程使用
}
BOOL CUSBWaveView::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 CUSBWaveView::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 CUSBWaveView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
GetClientRect(&ClientRect);
PerY=ClientRect.Height()/nChannelCount;
middle1=(float)((((m_ScreenVolume)/VoltRange)*LSB_COUNT)/(PerY));//每像素对应的码值
// TODO: Add your message handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -