gusucode.com > 一个用于远场涡流检测的数据采集系统的界面编程 > 一个用于远场涡流检测的数据采集系统的界面编程/vc/pulseeddyView.cpp

    // pulseeddyView.cpp : implementation of the CPulseeddyView class
//

#include "stdafx.h"
#include "pulseeddy.h"
#include "math.h"
#include "C:\Art\PCI2000\INCLUDE\PCI2000.H" 
#include "pulseeddySet.h"
#include "pulseeddyDoc.h"
#include "pulseeddyView.h"

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

HANDLE hEvent;
HANDLE hFileObject;
#define MAX_SEGMENT 32
#define Pi 3.14
int  m=0;
int km;
int  zerotime1;
int jj=0;
int ggd;
int waveflag;
float avemax1,avemax2,avemax3,avemax4,avemax5,avemax6,avemax7,avemax8;
int perx,pery;
int maxduan;
int maxdian;
int zijie;
int MB;
int m_Height;
int m_Width;
float maxzhi1;
float yuanzhi;
float maxzhi=0;
int  SAMPLEDIAN=2048;
WORD InUserRegion[MAX_SEGMENT][2048]; // 缓冲队列
CString strNewFileName;
float InUser[4096];
float InUser1[2048];
float   Real[2048];
float   Imag[2048];
int CurrentIndex; // AD数据处理线程当前缓冲区索引号
int CurrentIndex1=0; 
int ReadIndex;    // AD数据采集线程当前缓冲区索引号
int SegmentCounts; // 记录共有多少段缓冲区没有来得及处
PCI2000_PARA_AD Para;
float max1=0;
float m1;
float FuZhi[1024];
UINT ReadThread(PVOID hWnd);//数据线程
UINT DrawWindowProc(PVOID hWnd);
/////////////////////////////////////////////////////////////////////////////
// CPulseeddyView

IMPLEMENT_DYNCREATE(CPulseeddyView, CRecordView)

BEGIN_MESSAGE_MAP(CPulseeddyView, CRecordView)
	//{{AFX_MSG_MAP(CPulseeddyView)
	ON_BN_CLICKED(IDC_BEGSAM, OnBegsam)
	ON_BN_CLICKED(IDC_STOPSAM, OnStopsam)
	ON_BN_CLICKED(IDC_TIMEBO, OnTimebo)
	ON_BN_CLICKED(IDC_TEPIN, OnTepin)
	ON_BN_CLICKED(IDC_MAXVAL, OnMaxval)
	ON_BN_CLICKED(IDC_MAXVALTIME, OnMaxvaltime)
	ON_BN_CLICKED(IDC_ZEROTIME, OnZerotime)
	ON_BN_CLICKED(IDC_PINPUTU, OnPinputu)
	ON_BN_CLICKED(IDC_CUNPAN, OnCunpan)
	ON_BN_CLICKED(IDC_PHASETU, OnPhasetu)
	ON_WM_TIMER()
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_STOPWAVE, OnStopwave)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPulseeddyView construction/destruction

CPulseeddyView::CPulseeddyView()
	: CRecordView(CPulseeddyView::IDD)
{
	//{{AFX_DATA_INIT(CPulseeddyView)
	m_pSet = NULL;
	m_shutongdao = 1;
	m_motongdao = 1;
	m_pinlv = 100000;
	m_zengyi = 1;
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CPulseeddyView::~CPulseeddyView()
{
}

void CPulseeddyView::DoDataExchange(CDataExchange* pDX)
{
	CRecordView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPulseeddyView)
	DDX_Control(pDX, IDC_EDIT5, m_ctrlPicture);
	//DDX_Control(pDX, IDC_LIST1, m_shuzixianshi);
	DDX_Text(pDX, IDC_EDIT1, m_shutongdao);
	DDX_Text(pDX, IDC_EDIT2, m_motongdao);
	DDX_Text(pDX, IDC_EDIT3, m_pinlv);
	DDX_Text(pDX, IDC_EDIT4, m_zengyi);
	//}}AFX_DATA_MAP
}

BOOL CPulseeddyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs


	return CRecordView::PreCreateWindow(cs);
}

void CPulseeddyView::OnInitialUpdate()
{
	m_pSet = &GetDocument()->m_pulseeddySet;
	CRecordView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	
    m_bFirstCreateDeviceFile=TRUE;  // 一开始,为第一次创建文件对象
}

/////////////////////////////////////////////////////////////////////////////
// CPulseeddyView printing

BOOL CPulseeddyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CPulseeddyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CPulseeddyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CPulseeddyView diagnostics

#ifdef _DEBUG
void CPulseeddyView::AssertValid() const
{
	CRecordView::AssertValid();
}

void CPulseeddyView::Dump(CDumpContext& dc) const
{
	CRecordView::Dump(dc);
}

CPulseeddyDoc* CPulseeddyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPulseeddyDoc)));
	return (CPulseeddyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPulseeddyView database support
CRecordset* CPulseeddyView::OnGetRecordset()
{
	return m_pSet;
}


/////////////////////////////////////////////////////////////////////////////                                                                                                                                               
// CPulseeddyView message handlers

void CPulseeddyView::OnBegsam() 
{
	// TODO: Add your control notification handler code here
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
    m_ReadThread=AfxBeginThread(ReadThread,NULL, THREAD_PRIORITY_ABOVE_NORMAL, 0, CREATE_SUSPENDED);
    m_ReadThread->m_bAutoDelete=false;  
	m_DrawWindowThread=AfxBeginThread(DrawWindowProc,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    m_DrawWindowThread->m_bAutoDelete=false;   
    hEvent = PCI2000_CreateSystemEvent();
	UpdateData(TRUE);
	int DeviceID = 0;    
    PCI2000_PARA_AD Para; 
	bDeviceRun=1;
	app->k_run1=1;
	km=0;
	ggd=0;
	app->kb=0;
	MB=0;
	Para.FirstChannel = m_shutongdao;
	Para.LastChannel =m_motongdao;
	Para.Frequence = m_pinlv;
	Para.Gains = m_zengyi;
	Para.TriggerMode = PCI2000_IN_TRIGGER;
	hDevice =PCI2000_CreateDevice(DeviceID);
	if(hDevice==INVALID_HANDLE_VALUE)	
	{ 		
		MessageBox("创建设备对象失败...","提醒您...", MB_ICONSTOP);		
	}
	CString      RootDir;
	TCHAR  exeFullPath[MAX_PATH] ;
    GetModuleFileName(NULL,exeFullPath,MAX_PATH);
    RootDir=(const char*)exeFullPath;
	CString      sPath;
	int        nPos;
	nPos=RootDir.ReverseFind ('\\');
	sPath=RootDir.Left (nPos);
	strNewFileName=sPath+_T("\\Data.txt");
    CProgressCtrl* pMB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS2_MB));
    CProgressCtrl* pKB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS1_KB));  
    CEdit* pWroteMB=(CEdit*)(GetDlgItem(IDC_MB));
    CEdit* pWroteKB=(CEdit*)(GetDlgItem(IDC_KB));  
	ULONG DiskFreeBytes=PCI2000_GetDiskFreeBytes(strNewFileName.Left(3)); 
	ULONG m_RemainMB=(ULONG)(DiskFreeBytes/(1024*1024*2));  
	CString str;
    if(m_RemainMB<2) 
	{
		MessageBox("硬盘剩余空间不足2M,存盘操作不能进行...","提醒您...",MB_ICONSTOP);
		return;
	}
	
	pMB->SetRange32(0,10);
	pMB->SetPos(0);
	pKB->SetRange(0,512);             
	pKB->SetPos(0);
	pWroteMB->SetWindowText("0");
	pWroteKB->SetWindowText("0");
	if(!m_bFirstCreateDeviceFile)
	{  
		if(!PCI2000_ReleaseFile(hFileObject))
		{
			MessageBox("释放文件对象失败...","提醒您...",MB_ICONSTOP);
		}
	} 
    hFileObject = PCI2000_CreateFileObject(hDevice, strNewFileName, PCI2000_modeCreate|PCI2000_modeWrite);  // 创建文件对象
	app->k_hFileObject=hFileObject;
	if(hFileObject == INVALID_HANDLE_VALUE)
	{
		MessageBox("创建文件对象失败...","提醒您...",MB_ICONSTOP);
		
	}	
	m_bFirstCreateDeviceFile=FALSE;  
	if(!PCI2000_InitDeviceProAD(hDevice, &Para))
	{	
		MessageBox("不明确的初始化错误...","提醒您...");
	} 
	app->k_hDevice=hDevice;
	app->k_run=1;
	BOOL bDeviceRun=TRUE; 
	ULONG LinearAddr, PhysAddr;
    if(!PCI2000_GetDeviceAddr(hDevice, &LinearAddr,&PhysAddr,0))
	{
		AfxMessageBox("baibai");
	}
	PCI2000_WriteRegisterULong(hDevice, LinearAddr,0x290,0x0000);
    m_ReadThread->ResumeThread();  
	m_DrawWindowThread->ResumeThread(); 
	SetTimer(1,10,NULL);
	
}

UINT ReadThread(PVOID hWnd)  
{
	int DeviceID = 0;
	HANDLE  hDevice;
	HANDLE hFileObject;
    CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
	hDevice=app->k_hDevice;
	
    ReadIndex = 0;
	SegmentCounts = 0;
	int bDeviceRun;
	
	while(app->k_run)  
	{   
		long   PerLsbVolt;
        PerLsbVolt =10000.0/4096;
		bDeviceRun=app->k_run;	
		
		while(TRUE)
		{
			if(PCI2000_GetDevStatusAD_Half(hDevice))		
			{
				break;
			}
			else
			{
				
				Sleep(1);
			}
		}
		if(!PCI2000_ReadDeviceProAD_Half(hDevice, InUserRegion[ReadIndex], SAMPLEDIAN))//2048//  // 从设备上读取8192个字的数据
		{
			AfxMessageBox("读数据出错...");
			return FALSE;
		}
		
		SetEvent(hEvent);			
		ReadIndex++;
		if(ReadIndex==MAX_SEGMENT) 
		{
			
			ReadIndex=0;
			
			
		}
		SegmentCounts++;
		
		
	}
	
	if(!PCI2000_ReleaseDeviceProAD(hDevice))
	{
		AfxMessageBox("释放AD部件失败");
	}
	
	if(!PCI2000_ReleaseDevice(hDevice)) 
	{
		AfxMessageBox("关闭设备失败...");
	}    
	AfxMessageBox("数据采集完毕,可以分析处理!");	
	return 1;
}
UINT DrawWindowProc(PVOID hWnd)  
{
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
	int i, j;
	int h=0;
	CurrentIndex=0;
	HANDLE  hDevice;
	HANDLE hFileObject;
	hDevice=app->k_hDevice;
	hFileObject=app->k_hFileObject;
	while(app->k_run)  
	{
		WaitForSingleObject(hEvent, INFINITE);
		j=SegmentCounts;
		for(i=0; i<j; i++)  
		{	
			PCI2000_WriteFile(hFileObject, InUserRegion[CurrentIndex],4096); 
			CurrentIndex++;
            h++;
			app->zijie=h;
            app->kb++;
			if(CurrentIndex==MAX_SEGMENT) 
			{
				CurrentIndex=0;
			}
		}
		SegmentCounts=SegmentCounts-j;
		if(SegmentCounts<0) SegmentCounts=0;
	}
	
	return TRUE;
}
void CPulseeddyView::OnStopsam() 
{
	// TODO: Add your control notification handler code here
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
    app->k_run=0;
	app->k_stop1=2;
	KillTimer(1);
	
}


void CPulseeddyView::OnTimebo() 
{
	// TODO: Add your control notification handler code here
	SetTimer(2,50,NULL);
	km=0;
	yuanzhi=0;
	waveflag=1;
	
}
void CPulseeddyView::OnStopwave() 
{
	// TODO: Add your control notification handler code here
     KillTimer(2);
	
}
void CPulseeddyView::OnTepin() 
{
	// TODO: Add your control notification handler code here
	int     N=SAMPLEDIAN;
    float   PerLsbVolt =10000.0/4096;
	int     a1=0;
	///////////////////////
	m_pSet->MoveFirst();
	CString nn;
	for(int b=0;b<SAMPLEDIAN/2;b++)
	{
       Real[b]=m_pSet->m_IData;
	   Imag[b]=0;
       m_pSet->MoveNext();
	}
	
	///////////////////////
	//**倒序
	
	int   Lh=N/2;
	int   j=Lh,N1=N-2;	
	for(int i=1;i<=N1;i++)
	{
		if(i<j)//**交换数据,包括实部和虚部
		{
			float a1,a2;
			a1=Real[i];
			a2=Imag[i];
			Real[i]=Real[j];
			Imag[i]=Imag[j];
			Real[j]=a1;
			Imag[j]=a2;
		}
		int t;
		t=Lh;
		while(j>=t)//**求解倒序值
		{
			j=j-t;
			t/=2;	
		}

		j+=t;
	}



	//**FFT变换
	int    B;
    int   M;
	if(SAMPLEDIAN/2==1024)
		M=10;
    else if(SAMPLEDIAN/2==2048)
		M=11;
    else if(SAMPLEDIAN/2==4096)
		M=12;
    else if(SAMPLEDIAN/2==8192)
		M=13;
	int   m_H;
	for(int L=1;L<=M;L++)//**循环M次
	{
		B=(int)pow(2,L-1);
		for(int J=0;J<=B-1;J++)//**旋转因子的个数对应蝶形运算
		{
			int  P;
			P=(int)pow(2,M-L)*J;//**旋转因子指数的计算
			for(int k=J;k<N-1;k+=(int)pow(2,L))
			{
				float   WReal,WImag;
				float   c,s,arg;
				int     k2;
				k2=k+B;//**蝶形的第二个坐标
				arg=(float)(2*Pi*P)/N;
				c=(float)cos(arg);
				s=(float)sin(arg);

				WReal=Real[k2]*c-Imag[k2]*s;
				WImag=Imag[k2]*c+Real[k2]*s;
				//**实现同址运算
				Real[k2]=Real[k]-WReal;
				Imag[k2]=Imag[k]-WImag;

				Real[k]=Real[k]+WReal;
				Imag[k]=Imag[k]+WImag;

			}
		
		}
	
	}
/////////////////////////////////////
    	
	for( i=0;i<SAMPLEDIAN/2;i++)
		FuZhi[i]=0;
	for(int k=0;k<SAMPLEDIAN/2;k++)
	{
		FuZhi[k]=(float)sqrt(Real[k]*Real[k]+Imag[k]*Imag[k]);
		float nn=FuZhi[k];
		if(max1<=nn)
		{
			max1=nn;
			m_H=k;
		}
	}
	float    h;
	h=2*(m_H/SAMPLEDIAN)*m_pinlv;
    m_H=m_H*10;
	char str[500];
	CString string;
	sprintf(str, "特征频率点的时间为:%dus 特征频率为:%fhz ",m_H,h);	 
	string=string+str;   
	MessageBox(string,"提醒您...");		
}

void CPulseeddyView::OnMaxval() 
{
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();	
	m_pSet->MoveFirst();
	float  maxval=0; 
	for(int b=0;b<app->zijie;b++)
	{
       if(maxval<(m_pSet->m_RData))
	   {
		   maxval=m_pSet->m_RData;
	       maxduan=b;
	   }
	    m_pSet->MoveNext();
	}
    char str[500];
	CString string;
	sprintf(str, "磁场垂直分量的最大值为:%fmv ",maxval );	 
	string=string+str;   
	MessageBox(string,"提醒您...");
}

void CPulseeddyView::OnMaxvaltime() 
{
	// TODO: Add your control notification handler code here
    m_File.Open(strNewFileName, PCI2000_modeRead);
	int dian=maxduan*4096;
    m_File.Seek(dian,CFile::begin);  
	m_File.Read(m_InUserRegion,2048*2);
    float   PerLsbVolt;
	PerLsbVolt =10000.0/4096;
	for(int b1=0;b1<SAMPLEDIAN;b1++)
	{
		float  c1= ((m_InUserRegion[b1]&0x0FFF)*PerLsbVolt-5000);//0x800
		InUser[b1]=c1;	
	}
	float  maxvalue=0;
	for(int j=0;j<2048;j++)
	{
		if(maxvalue<=InUser[j])
		{
			maxvalue=InUser[j];
		    maxdian=j;
		}
		else 
			maxvalue=maxvalue;
	}
	for(int k=(maxdian-30);k<maxdian;k++)
	{
	   if(abs(InUser[k+1]-InUser[k])>=20)
	   {
          zerotime1=k;
		  break;
	   }

	}
	int zhi=(maxdian-zerotime1)*10;
	m_File.Close();
	char str[500];
	CString string;
	sprintf(str, "最大值出现的时间为:%dus ",zhi);	 
	string=string+str;   
	MessageBox(string,"提醒您...");
	
}

void CPulseeddyView::OnZerotime() 
{
	// TODO: Add your control notification handler code here

	int  zerotime2=0;
	int  zerotime;
    for(int k=maxdian;k<SAMPLEDIAN;k++)
	{
	 if(InUser[k]<=0)
	 {
	      zerotime2=k;
		  break;
	 }
	}
	zerotime=(zerotime2-zerotime1)*10;
	char str[500];
	sprintf(str, "过零点的时间为:%dus",zerotime);	 
	MessageBox(str,"提醒您...");
	
}

void CPulseeddyView::OnPinputu() 
{
	// TODO: Add your control notification handler code here
	float  PerLsbVolt = 10000/4096; 
    static CPoint pointxy[32][2048];
    int ChannelCount=1;
    int  Center=100;
	CDC* pDC=m_ctrlPicture.GetDC();
	CRect ClientRect;
	m_ctrlPicture.GetClientRect(&ClientRect);  
		
	CBrush brwhite(RGB(255,255,255));
	CBrush*poldbrush=NULL;
	poldbrush=pDC->SelectObject(&brwhite);
	pDC->Rectangle(ClientRect);
	pDC->SelectObject(poldbrush);
	
	
	CPen penred(PS_SOLID,1,RGB(255,0,0));
	CPen*poldpen=NULL;
	poldpen= pDC->SelectObject(&penred);
	////////////////////////////////////////
	//画坐标轴
	//x轴
	    pDC->MoveTo(0,100);
	    pDC->LineTo(ClientRect.Width()+1,100);
	    pDC->LineTo(ClientRect.Width()-5,105);
        pDC->MoveTo(ClientRect.Width()+1,100);
        pDC->LineTo(ClientRect.Width()-5,95);
		pDC->SetTextColor(RGB(255,0,0));
        pDC->TextOut(2,105,"0");
    	pDC->TextOut(ClientRect.Width()-30,105,"频率");
	//Y轴
        pDC->MoveTo(0,105);
        pDC->LineTo(0,0);
        pDC->LineTo(5,5);
        pDC->MoveTo(0,0);
        pDC->MoveTo(0,5);
        pDC->TextOut(5,5,"幅值");
		pDC->TextOut(250,150,"频谱图");
	////////////////////////////////////////
	int k=0;
	for(int j=0; j<ChannelCount; j++)
	{
		int x=ClientRect.left;
		pointxy[j][0].x=ClientRect.left;
		pointxy[j][0].y=(int)(Center-80*(FuZhi[k]/max1));
		
		for(int i=1; i<=ClientRect.Width(); i++)	
		{  				
			pointxy[j][i].x=x+i;
			int nn=(int)(SAMPLEDIAN/ClientRect.Width());
			if(nn>=1)
		    	k=k+nn;
			else
				k=k+1;
			pointxy[j][i].y=(int)(Center-80*(FuZhi[k]/max1));
			
		} 		
	
		pDC->Polyline(pointxy[j], ClientRect.Width()+1);
	}
	pDC->SelectObject(poldpen);	
}
void CPulseeddyView::OnPhasetu() 
{
	// TODO: Add your control notification handler code here

    float  PerLsbVolt = 10000/4096; 
    static CPoint pointxy[32][2048];
    int ChannelCount=1;
    int  Center=100;
	CDC* pDC=m_ctrlPicture.GetDC();
	CRect ClientRect;
	m_ctrlPicture.GetClientRect(&ClientRect);  
	
	
	CBrush brwhite(RGB(255,255,255));
	CBrush*poldbrush=NULL;
	poldbrush=pDC->SelectObject(&brwhite);
	pDC->Rectangle(ClientRect);
	pDC->SelectObject(poldbrush);
	
	
	CPen penred(PS_SOLID,1,RGB(255,0,0));
	CPen*poldpen=NULL;
	poldpen= pDC->SelectObject(&penred);
	////////////////////////////////////////
	//画坐标轴
	//x轴
	    pDC->MoveTo(0,100);
	    pDC->LineTo(ClientRect.Width()+1,100);
	    pDC->LineTo(ClientRect.Width()-5,105);
        pDC->MoveTo(ClientRect.Width()+1,100);
        pDC->LineTo(ClientRect.Width()-5,95);
		pDC->SetTextColor(RGB(255,0,0));
        pDC->TextOut(2,105,"0");
    	pDC->TextOut(ClientRect.Width()-30,105,"时间");
	//Y轴
        pDC->MoveTo(0,105);
        pDC->LineTo(0,0);
        pDC->LineTo(5,5);
        pDC->MoveTo(0,0);
        pDC->MoveTo(0,5);
        pDC->TextOut(5,5,"相位");
		pDC->TextOut(250,150,"相位图");
	////////////////////////////////////////
		float	phase[2048],max=0;	
    	for(int i=0;i<SAMPLEDIAN;i++)
		  phase[i]=0;
	for(int k=0;k<SAMPLEDIAN;k++)
	{
		phase[k]=atan(Imag[k]/Real[k]);
		if(Real[k]>=0&&Imag[k]>=0)
		{
		}
		if(Real[k]>0&&Imag[k]<0)
		{
			
		}
		if(Real[k]<0&&Imag[k]<0)
		{
			phase[k]=phase[k]-3.1416;
		}
		if(Real[k]<0&&Imag[k]>0)
		{
			phase[k]=phase[k]+3.1416;
		}
		
		if(max<phase[k])
		{
			max=phase[k];
		}
	}
		/////////////////////////////////
	k=0;
    for(int j=0; j<ChannelCount; j++)
	{
		int x=ClientRect.left;
		pointxy[j][0].x=ClientRect.left;
		pointxy[j][0].y=(int)(Center-80*(phase[k]/max));
		
		for(int i=1; i<=ClientRect.Width(); i++)	
		{  				
			pointxy[j][i].x=x+i;
			int nn=(int)(SAMPLEDIAN/ClientRect.Width());
			if(nn>=1)
		    	k=k+nn;
			else
				k=k+1;
			pointxy[j][i].y=(int)(Center-80*(phase[k]/max));
			
		} 		
		pDC->Polyline(pointxy[j], ClientRect.Width()+1);
	}
	pDC->SelectObject(poldpen);
    CurrentIndex1++;
	if(CurrentIndex1==MAX_SEGMENT) CurrentIndex1=0;

	
}

void CPulseeddyView::OnCunpan() 
{
	// TODO: Add your control notification handler code here
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
	int kk;
	if(!m_bFirstCreateDeviceFile)
	{
		if(!PCI2000_ReleaseFile(hFileObject))
		{
			MessageBox("关闭文件失败","提醒您...");
		}
		else
			m_bFirstCreateDeviceFile=TRUE; 
	}
	
	for(int k=0;k<app->zijie;k++)
	{
		kk=4096*m;
		if(kk==0)
		{
			m_File.Open(strNewFileName, PCI2000_modeRead);
			m_pSet->MoveFirst();
			while(	!m_pSet->IsEOF())
			{
				m_pSet->Delete();
				m_pSet->MoveNext();
			}
			m_pSet->MoveFirst();
		}
		m_File.Seek(kk,CFile::begin);  
		m_File.Read(m_InUserRegion,2048*2);
		//int    k=0;
		//float   f1=0;
		float   PerLsbVolt;
		PerLsbVolt =10000.0/4096;
		
		for(int b1=0;b1<SAMPLEDIAN;b1++)
		{
			float  c1= ((m_InUserRegion[b1]&0x0FFF)*PerLsbVolt-5000);//0x800
			InUser[b1]=c1;	
		}
		
		float  maxvalue=0;
		for(int j=0;j<2048;j++)
		{
			if(maxvalue<=InUser[j])
				maxvalue=InUser[j];
			else 
				maxvalue=maxvalue;
		}
		m_pSet->AddNew();
		m_pSet->m_RData=maxvalue;
		m_pSet->m_ID=m;
		m_pSet->Update();
		m_pSet->MoveNext();
		m++;
	}
	m_File.Close();
	/*CString      sPath;
	int        nPos;
	CString   FileAddress,name;
	name=strNewFileName;
	nPos=name.ReverseFind ('\\');
	sPath=name.Left (nPos);
	FileAddress=sPath+_T("\\Data1.txt");

		m_pSet->MoveFirst();
	for(int i=0;i<app->zijie;i++)
	{
		
		InUser[i]=m_pSet->m_RData;
		m_pSet->MoveNext();
	}
	CFile writefile(FileAddress,CFile::modeCreate|CFile::modeWrite);
    for( i=0;i<1;i++)
	{
	   int zz=app->zijie;
	   writefile.Write(InUser,zz*sizeof(float));
	}
	///////////////////////////////////////////////////////////////////////////
	writefile.Close();*/

	CString      sPath;
	int        nPos;
	CString   FileAddress,name;
	name=strNewFileName;
	nPos=name.ReverseFind ('\\');
	sPath=name.Left (nPos);
	FileAddress=sPath+_T("\\Data1.dat");
	CFile writefile(FileAddress,CFile::modeCreate|CFile::modeWrite);
    for( int i=0;i<1;i++)
	{
	   writefile.Write(InUser,2048*sizeof(float));
	}
	writefile.Close();

    MessageBox("存盘完毕!","提醒您...");
	m=0;
}


void CPulseeddyView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
	float   PerLsbVolt;
	PerLsbVolt =10000.0/4096;
	int  Center=150;
	CDC* pDC=m_ctrlPicture.GetDC();	
	if(nIDEvent==2)
	{
		huifangwave();
	}
	if(nIDEvent==1)
	{
		if(km==0)
		{	
			yuanzhi=0;
			CRect ClientRect;
			m_ctrlPicture.GetClientRect(&ClientRect);  
			
			CBrush brwhite(RGB(255,255,255));
			CBrush*poldbrush=NULL;
			poldbrush=pDC->SelectObject(&brwhite);
			pDC->Rectangle(ClientRect);
			pDC->SelectObject(poldbrush);
			m_Height=ClientRect.Height();
			m_Width=ClientRect.Width();
			pery=(int)(m_Height/10);
			perx=(int)(m_Width/20);
			int y1=pery;
			int x1=perx;
			
			for(int i=0;i<10;i++)
			{
				pDC->MoveTo(0,y1);
				pDC->LineTo(m_Width,y1);
				y1+=pery;
				
			}
			for( i=0;i<20;i++)
			{
				pDC->MoveTo(x1,0);
				pDC->LineTo(x1,m_Height);
				x1+=perx;
				
			}
			Sleep(500);
		}
		
		for(int b1=0;b1<SAMPLEDIAN;b1++)
		{
			float  c1= ((InUserRegion[CurrentIndex][b1]&0x0FFF)*PerLsbVolt-5000);//0x800
			InUser1[b1]=c1;	
		}
		
		for(int j=0;j<2048;j++)
		{
			if(maxzhi<=InUser1[j])
				maxzhi=InUser1[j];
			else 
				maxzhi=maxzhi;
		}
		
		ggd++;
		if(ggd==1)
			avemax1=maxzhi;
		if(ggd==2)
			avemax2=maxzhi+avemax1;
		if(ggd==3)
			avemax3=maxzhi+avemax2;
		if(ggd==4)
			avemax4=maxzhi+avemax3;
		if(ggd==5)
		{
			avemax5=maxzhi+avemax4;
		}
		if(ggd==6)
		{
			avemax6=maxzhi+avemax5;
		}
		if(ggd==7)
		{
			avemax7=maxzhi+avemax6;
		}
		if(ggd==8)
		{
			maxzhi=(maxzhi+avemax7)/20;
			
		}
		if(km==0)
		{
			maxzhi1=maxzhi;
		}
		if(ggd==8)
		{
			
			CPen penred(PS_SOLID,1,RGB(255,0,0));
			CPen*poldpen=NULL;
			poldpen= pDC->SelectObject(&penred);
			maxzhi=maxzhi-maxzhi1;
			float jnjn=maxzhi;
			pDC->MoveTo(km,150-yuanzhi);
			km++;
			pDC->LineTo(km,150-maxzhi);
			yuanzhi=maxzhi;
			maxzhi=0;
			ggd=0;
			if(km>=m_Width)
				km=0;
			pDC->SelectObject(poldpen);
		}
		jindu();
	}
	CRecordView::OnTimer(nIDEvent);
}

void CPulseeddyView::OnPaint() 
{
	CPaintDC dc(this); 
	CWnd*pWnd=GetDlgItem(IDC_EDIT5);
	CDC*pDC=pWnd->GetDC();
	pWnd->Invalidate();
	pWnd->UpdateWindow();
	CRect ClientRect;
	m_ctrlPicture.GetClientRect(&ClientRect);  
	m_Height=ClientRect.Height();
	m_Width=ClientRect.Width();
	pery=(int)(m_Height/10);
	perx=(int)(m_Width/20);
	int y1=pery;
	int x1=perx;
	
	for(int i=0;i<10;i++)
	{
		pDC->MoveTo(0,y1);
		pDC->LineTo(m_Width,y1);
		y1+=pery;
		
	}
	for( i=0;i<20;i++)
	{
		pDC->MoveTo(x1,0);
		pDC->LineTo(x1,m_Height);
		x1+=perx;
		
	}
}

void CPulseeddyView::jindu()
{
	CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
	CProgressCtrl* pMB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS2_MB));
	CProgressCtrl* pKB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS1_KB)); 
	CEdit* pWroteMB=(CEdit*)(GetDlgItem(IDC_MB));
	CEdit* pWroteKB=(CEdit*)(GetDlgItem(IDC_KB));   
	CString str;
	if(app->kb>=512)  
	{
		MB++; 
		pMB->SetPos(MB);  
		str.Format("%d",MB);
		pWroteMB->SetWindowText(str);
		app->kb=0;  
	}
	
	pKB->SetPos(app->kb);
	str.Format("%d",app->kb);
	pWroteKB->SetWindowText(str);  	
	
}
void CPulseeddyView::huifangwave()
{
    CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp();
	CDC* pDC=m_ctrlPicture.GetDC();	
	if(waveflag==1&&km==0)
	{
		m_pSet->MoveFirst();
		CRect ClientRect;
		m_ctrlPicture.GetClientRect(&ClientRect);  
		
		CBrush brwhite(RGB(255,255,255));
		CBrush*poldbrush=NULL;
		poldbrush=pDC->SelectObject(&brwhite);
		pDC->Rectangle(ClientRect);
		pDC->SelectObject(poldbrush);
		m_Height=ClientRect.Height();
		m_Width=ClientRect.Width();
		pery=(int)(m_Height/10);
		perx=(int)(m_Width/20);
		int y1=pery;
		int x1=perx;
		
		for(int i=0;i<10;i++)
		{
			pDC->MoveTo(0,y1);
			pDC->LineTo(m_Width,y1);
			y1+=pery;
			
		}
		for( i=0;i<20;i++)
		{
			pDC->MoveTo(x1,0);
			pDC->LineTo(x1,m_Height);
			x1+=perx;
			
		}

	}
	avemax1=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax2=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax3=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax4=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax5=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax6=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax7=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	avemax8=m_pSet->m_RData;
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	//m_pSet->MoveNext();
	maxzhi=(avemax1+avemax2+avemax3+avemax4+avemax5+avemax6+avemax7+avemax8)/10;
	if(km==0)
		maxzhi1=maxzhi;
	
	CPen penred(PS_SOLID,1,RGB(255,0,0));
	CPen*poldpen=NULL;
	poldpen= pDC->SelectObject(&penred);
	maxzhi=(maxzhi-maxzhi1)/2;
	float mm=maxzhi;
	pDC->MoveTo(km,150-yuanzhi);
	km++;
	int kk=km;
	pDC->LineTo(km,150-maxzhi);
	yuanzhi=maxzhi;
	maxzhi=0;
	pDC->SelectObject(poldpen);
	if(km>=m_Width)
	{
		km=0;
		waveflag=2;
		CRect ClientRect;
		m_ctrlPicture.GetClientRect(&ClientRect);  
		
		CBrush brwhite(RGB(255,255,255));
		CBrush*poldbrush=NULL;
		poldbrush=pDC->SelectObject(&brwhite);
		pDC->Rectangle(ClientRect);
		pDC->SelectObject(poldbrush);
		m_Height=ClientRect.Height();
		m_Width=ClientRect.Width();
		pery=(int)(m_Height/10);
		perx=(int)(m_Width/20);
		int y1=pery;
		int x1=perx;
		
		for(int i=0;i<10;i++)
		{
			pDC->MoveTo(0,y1);
			pDC->LineTo(m_Width,y1);
			y1+=pery;
			
		}
		for( i=0;i<20;i++)
		{
			pDC->MoveTo(x1,0);
			pDC->LineTo(x1,m_Height);
			x1+=perx;
			
		}
	}
	Sleep(50);	
	int dd=km*30;
	int ff=(app->zijie)-dd;
    if(ff<30)
	{
	 KillTimer(2);
	 MessageBox("波形回放完毕!","提醒您...");
	}
	
}