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

📄 no_sdram_daqdlg.cpp

📁 fpga开发pci的verilog
💻 CPP
字号:
// NO_SDRAM_DAQDlg.cpp : implementation file
//

#include "stdafx.h"
#include "NO_SDRAM_DAQ.h"
#include "NO_SDRAM_DAQDlg.h"
#include "afxmt.h"
#include "process.h"
#include "iostream.h"
#include "fstream.h"

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


#define buf_len 223*16
#define FileLength  1024
U8 buffer[buf_len];
U8 ReceiveFlag;
CNO_SDRAM_DAQDlg*  pMainDlg = NULL;
FILE *fp = NULL;
FILE *errorfp = NULL;
BOOL Exam;
BOOL stopexam;
BOOL stopexam1;
BOOL stopexam2;
int WrongNum;

/////////////////////////////////////////////////////////////////////////////
// CNO_SDRAM_DAQDlg dialog

CNO_SDRAM_DAQDlg::CNO_SDRAM_DAQDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNO_SDRAM_DAQDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNO_SDRAM_DAQDlg)
	m_DMASIZE = _T("");
	m_TRANSFERTIME = _T("");
	m_ExamStatus = _T("");
	m_FileLen = _T("");
	m_SecondWrongNum = _T("");
	m_status = _T("");
	m_ThirdWrongNum = _T("");
	m_WrongNum = _T("");
	m_FirstWrongNum = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CNO_SDRAM_DAQDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNO_SDRAM_DAQDlg)
	DDX_Text(pDX, IDC_EDIT_DMASIZE, m_DMASIZE);
	DDX_Text(pDX, IDC_EDIT_TRANSFERTIME, m_TRANSFERTIME);
	DDX_Text(pDX, IDC_ExamStatic, m_ExamStatus);
	DDX_Text(pDX, IDC_FileLen, m_FileLen);
	DDX_Text(pDX, IDC_SecondWrongNum, m_SecondWrongNum);
	DDX_Text(pDX, IDC_status, m_status);
	DDX_Text(pDX, IDC_ThirdWrongNum, m_ThirdWrongNum);
	DDX_Text(pDX, IDC_WrongNum, m_WrongNum);
	DDX_Text(pDX, IDC_FirstWrongNum, m_FirstWrongNum);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CNO_SDRAM_DAQDlg, CDialog)
	//{{AFX_MSG_MAP(CNO_SDRAM_DAQDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_Start_Receive, OnStartReceive)
	ON_BN_CLICKED(IDC_Start_Save, OnStartSave)
	ON_BN_CLICKED(IDC_Stop_Save, OnStopSave)
	ON_BN_CLICKED(IDC_Stop_Receive, OnStopReceive)
	ON_BN_CLICKED(IDC_Start_Exam, OnStartExam)
	ON_BN_CLICKED(IDC_Stop_Exam, OnStopExam)
	ON_BN_CLICKED(IDC_RESET, OnReset)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNO_SDRAM_DAQDlg message handlers

BOOL CNO_SDRAM_DAQDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_DMASIZE.Format("%d",buf_len);
	GetDlgItem(IDC_Start_Receive)->EnableWindow(TRUE);
	GetDlgItem(IDC_Start_Save)->EnableWindow(FALSE);
	GetDlgItem(IDC_Stop_Receive)->EnableWindow(FALSE);
	GetDlgItem(IDC_Stop_Save)->EnableWindow(FALSE);
	
	Device.BusNumber = (U8)-1;
	Device.SlotNumber = (U8)-1;
	//	Device.DeviceId = (U16)-1;
	//	Device.VendorId = (U16)-1; 
	Device.SerialNumber[0] ='\0'; 
	
	Device.VendorId = 0x10b5; // PLX Vendor ID
	Device.DeviceId = 0x5406; // PCI9054
	
	rc = PlxPciDeviceOpen(
		&Device,
		&hDevice
		); 
	if (rc == ApiSuccess)
		m_status.Format("成功打开PCI&LVDS卡 ");
	else 
		m_status.Format("无法打开PCI&LVDS卡 ");
	UpdateData(0);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CNO_SDRAM_DAQDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CNO_SDRAM_DAQDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
//----采集--------------------------------------------------------------------------
UINT OnRecieveMT(LPVOID pParam)
{
	CNO_SDRAM_DAQDlg* pObject = (CNO_SDRAM_DAQDlg*)pParam;
	if(pObject == NULL)
		return 1;
	pObject->OnRecieveT();
	return 0;
}

void CNO_SDRAM_DAQDlg::OnStartReceive() 
{
	// TODO: Add your control notification handler code here
	AfxBeginThread(OnRecieveMT,this);	
}

void CNO_SDRAM_DAQDlg::OnRecieveT()
{
	// TODO: Add your control notification handler code here
		// No search criteria, select all devices
	GetDlgItem(IDC_Start_Receive)->EnableWindow(FALSE);
	GetDlgItem(IDC_Start_Save)->EnableWindow(TRUE);
	GetDlgItem(IDC_Stop_Receive)->EnableWindow(TRUE);
	
	DWORD EventStatus;
	framecount = 0;
	int i = 0;
	WaitIntr = 1;
	b_write = 0;

	ReceiveFlag = 0xF0;
	rc = PlxBusIopWrite(hDevice,IopSpace1,0x00001000,TRUE,&ReceiveFlag,1,BitSize8); 

	if(rc == ApiSuccess)
	{
		m_status.Format("PlxBusIopWrite成功");
	}
	else
	{
		m_status.Format("PlxBusIopWrite失败");
	}
	SetDlgItemText(IDC_status,m_status);
	
	memset(
		&DmaDesc,
		0,
		sizeof(DMA_CHANNEL_DESC)
		);
	
	// Set up DMA configuration structure
	DmaDesc.EnableReadyInput         = 1;
	DmaDesc.EnableBTERMInput         = 0;
	DmaDesc.EnableIopBurst           = 1;
	DmaDesc.EnableWriteInvalidMode   = 0;
	DmaDesc.EnableDmaEOTPin          = 0;
	DmaDesc.DmaStopTransferMode      = AssertBLAST;
	DmaDesc.HoldIopAddrConst         = 1;
	DmaDesc.DemandMode               = 0;
	DmaDesc.EnableTransferCountClear = 0;
	DmaDesc.WaitStates               = 0;
	DmaDesc.IopBusWidth              = 2;   // 32-bit

	DmaDesc.DmaChannelPriority       = Rotational;

	rc = PlxDmaSglChannelOpen(
								hDevice,
								PrimaryPciChannel0,
								&DmaDesc
								);
	if (rc == ApiSuccess)
		m_status.Format("成功打开DMA通道0");
	else
		m_status.Format("无法打开DMA通道0");
	SetDlgItemText(IDC_status,m_status);

	DmaData.u.UserVa = (U32)buffer;
	DmaData.LocalAddr = 0x00008000;
	DmaData.TransferCount = sizeof(buffer);
	DmaData.LocalToPciDma = 1;// Local to PCI
	DmaData.TerminalCountIntr = 0;

	while(WaitIntr)	
	{
		memset(
			&buffer,
			0,
			sizeof(buffer)
			);
		
		// Clear INTR descriptor structure
		memset(
				&PlxInterrupt,
				0,
				sizeof(PLX_INTR)
				);
		
		rc=PlxIntrStatusGet(hDevice,&PlxInterrupt);

		PlxInterrupt.PciDmaChannel0 = 1;
		PlxInterrupt.PciMainInt = 1;
		PlxInterrupt.IopToPciInt = 1;

		rc = PlxIntrAttach(
				hDevice,
				PlxInterrupt,
				&hInterruptEvent
				);

		rc = PlxIntrEnable(
				hDevice,
				&PlxInterrupt
				);

		EventStatus = WaitForSingleObject(
					hInterruptEvent,
					INFINITE
					);
		switch(EventStatus)
		{
		case WAIT_OBJECT_0:
			flag = 1;
			m_status.Format("获取中断");
			break;
		case WAIT_TIMEOUT:
			flag = 0;
			m_status.Format("等待超时");
			break;
		case WAIT_FAILED:
			flag = 0;
			m_status.Format("等待失败");
			break;
		default:
			flag = 0;
			break;
		}
		SetDlgItemText(IDC_status,m_status);
		
		if(flag == 1)
		{
			rc = PlxDmaSglTransfer(
									hDevice,
									PrimaryPciChannel0,
									&DmaData,
									0 // Wait for completion
									);
			if (rc == ApiSuccess)
			{	i++;
				m_status.Format("成功进行DMA传输");
				m_TRANSFERTIME.Format("%d\n",i);
				if(b_write)
				{
					FIFODATA.Write(buffer,buf_len);
					m_status.Format("成功进行数据保存");
				}
			}
			else if(rc == ApiDmaInProgress)
			{				
				m_status.Format("ApiDmaInProgress");
			}
			else if(rc == ApiDmaChannelInvalid)
			{				
				m_status.Format("ApiDmaChannelInvalid");
			}
			else if(rc == ApiPciTimeout)
			{				
				m_status.Format("ApiPciTimeout");
			}
			else
				m_status.Format("没有进行DMA传输");
			SetDlgItemText(IDC_EDIT_TRANSFERTIME,m_TRANSFERTIME);
			SetDlgItemText(IDC_status,m_status);	
		}
		else break;
	}
}

void CNO_SDRAM_DAQDlg::OnStartSave() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_Start_Save)->EnableWindow(FALSE);
	GetDlgItem(IDC_Stop_Save)->EnableWindow(TRUE);
	GetDlgItem(IDC_Start_Exam)->EnableWindow(FALSE);
	
	b_write = 1;
	FIFODATA.Open("OnDMARead.dat",CFile::modeCreate|CFile::modeWrite,NULL);
	m_status.Format("开始保存");
	SetDlgItemText(IDC_status,m_status);	
}

void CNO_SDRAM_DAQDlg::OnStopSave() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_Start_Save)->EnableWindow(TRUE);
	GetDlgItem(IDC_Stop_Save)->EnableWindow(FALSE);
	GetDlgItem(IDC_Start_Exam)->EnableWindow(TRUE);
	
	b_write = 0;
	if(FIFODATA)
		FIFODATA.Close();
	m_status.Format("停止保存");
	SetDlgItemText(IDC_status,m_status);	
}

void CNO_SDRAM_DAQDlg::OnStopReceive() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_Start_Receive)->EnableWindow(TRUE);
	GetDlgItem(IDC_Stop_Receive)->EnableWindow(FALSE);
	GetDlgItem(IDC_Start_Save)->EnableWindow(FALSE);
	
	WaitIntr = 0;
	
	ReceiveFlag = 0x0F;
	rc = PlxBusIopWrite(hDevice,IopSpace1,0x00001000,TRUE,&ReceiveFlag,1,BitSize8); 
	
	rc = PlxDmaSglChannelClose(
								hDevice,
								PrimaryPciChannel0
								);
	if (rc != ApiSuccess)
	{
		// Reset the device if a DMA is in-progress
		PlxPciBoardReset(hDevice);
		// Attempt to close again
		rc =	PlxDmaSglChannelClose(
			hDevice,
			PrimaryPciChannel0
			);
		if (rc != ApiSuccess)
		{	// ERROR - Unable to close DMA channel
			m_status.Format("DMA通道未打开");
			UpdateData(0);
		}
	}
	
	m_status.Format("停止DMA传输");
	SetDlgItemText(IDC_status,m_status);	
}
//-----检查-----------------------------------------------------------------------------------------
UINT OnExamFileMT(LPVOID pParam)
{
	CNO_SDRAM_DAQDlg* pObject = (CNO_SDRAM_DAQDlg*)pParam;
	if(pObject == NULL)
		return 1;
	pObject->OnExamFileT();
	return 0;
}

void CNO_SDRAM_DAQDlg::OnStartExam() 
{
	// TODO: Add your control notification handler code here
	AfxBeginThread(OnExamFileMT,this);
}

void CNO_SDRAM_DAQDlg::OnExamFileT()
{
	// TODO: Add your control notification handler code here
	U32 DataToExam[FileLength];
	WrongNum = 0;
	Exam = 1;
	stopexam = 1;
	stopexam1 = 1;
	stopexam2 = 1;
	int ExamingWord;

	fp = fopen("OnDMARead.dat","rb");
	errorfp = fopen("Error.dat","wb");

	if(fp)
		m_ExamStatus.Format("成功打开文件");
	else
		m_ExamStatus.Format("无法打开文件");
	SetDlgItemText(IDC_ExamStatic,m_ExamStatus);

	fseek(fp,0,SEEK_END);
	int FL = ftell(fp)/1024; 
	if(FL >= 1024)
		m_FileLen.Format(_T("%d MB"),FL/1024);
	else
		m_FileLen.Format(_T("%d KB"),FL);
	
	if(FL == 0)
	{
		m_ExamStatus.Format("文件为空");
		SetDlgItemText(IDC_ExamStatic,m_ExamStatus);
		Exam = 0;
	}

	fseek(fp,0,SEEK_SET);
	SetDlgItemText(IDC_FileLen,m_FileLen);

	int j = 0;
	int i = 1;
	int ReadLength;

	if(FL*1024/4 >= FileLength)
		ReadLength = FileLength;
	else
		ReadLength = FL*1024/4;
	
	bool myEOF;

	while(!feof(fp) && Exam)
	{
		if(i==ReadLength)
			j++;
		fread(DataToExam,sizeof(U32),ReadLength,fp);
		for(i=1; i<ReadLength; i++)
		{	
			ExamingWord = (i + j*ReadLength)/4;
			if(ExamingWord*16/1024 < FL)
				myEOF = 0;
			else
				myEOF = 1;
			if((DataToExam[i]-DataToExam[i-1])!=1)
			{
				if(!myEOF)
				{
				WrongNum++;
				m_WrongNum.Format(_T("%d"),WrongNum);
				SetDlgItemText(IDC_WrongNum,m_WrongNum);
				fprintf(errorfp,"第%5d次错误在:\t第%10d行(0x%10x)\t第%10d字节\n",WrongNum,ExamingWord,ExamingWord,ExamingWord*16);
				}
			}
			if(WrongNum == 1 && stopexam)
			{
				if(!myEOF)
				{
				m_FirstWrongNum.Format("第%d(0x%x)行",ExamingWord,ExamingWord);
				stopexam = 0;
				SetDlgItemText(IDC_FirstWrongNum,m_FirstWrongNum);
				}
				else
					WrongNum--;
			}
			else if(WrongNum == 2 && stopexam1)
			{
				if(!myEOF)
				{
				m_SecondWrongNum.Format("第%d(0x%x)行",ExamingWord,ExamingWord);
				stopexam1 = 0;
				SetDlgItemText(IDC_SecondWrongNum,m_SecondWrongNum);
				}
				else
					WrongNum--;
			}
			else if(WrongNum == 3 && stopexam2)
			{
				if(!myEOF)
				{
				m_ThirdWrongNum.Format("第%d(0x%x)行",ExamingWord,ExamingWord);
				stopexam2 = 0;
				SetDlgItemText(IDC_ThirdWrongNum,m_ThirdWrongNum);
				}
				else
					WrongNum--;
			}
		}
/*		
		if(Exam)
		{
			m_ExamStatus.Format("正在检查文件");
			SetDlgItemText(IDC_ExamStatic,m_ExamStatus);
		}
*/		if(feof(fp))
		{
			m_ExamStatus.Format("检查完成");
			SetDlgItemText(IDC_ExamStatic,m_ExamStatus);
			if(WrongNum == 0)
			{
				m_WrongNum.Format(_T("%d"),WrongNum);
				SetDlgItemText(IDC_WrongNum,m_WrongNum);
				m_FirstWrongNum.Format("没有错误");
				m_SecondWrongNum.Format("没有错误");
				m_ThirdWrongNum.Format("没有错误");
				SetDlgItemText(IDC_FirstWrongNum,m_FirstWrongNum);
				SetDlgItemText(IDC_SecondWrongNum,m_SecondWrongNum);
				SetDlgItemText(IDC_ThirdWrongNum,m_ThirdWrongNum);
			}
		}
	}
	fclose(fp);
	fclose(errorfp);
}

void CNO_SDRAM_DAQDlg::OnStopExam() 
{
	// TODO: Add your control notification handler code here
	Exam = 0;
	m_ExamStatus.Format("停止检查");
	SetDlgItemText(IDC_ExamStatic,m_ExamStatus);
	if(fp)
		fclose(fp);	
}

void CNO_SDRAM_DAQDlg::OnReset() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_Start_Receive)->EnableWindow(TRUE);
	GetDlgItem(IDC_Start_Save)->EnableWindow(FALSE);
	GetDlgItem(IDC_Stop_Receive)->EnableWindow(FALSE);
	GetDlgItem(IDC_Stop_Save)->EnableWindow(FALSE);
	
	WaitIntr = 0;
	
	m_FileLen.Format(_T(""));
	SetDlgItemText(IDC_FileLen,m_FileLen);
	WrongNum = 0;
	m_WrongNum.Format(_T(""));
	SetDlgItemText(IDC_WrongNum,m_WrongNum);
	m_FirstWrongNum.Format(_T(""));
	SetDlgItemText(IDC_FirstWrongNum,m_FirstWrongNum);
	m_SecondWrongNum.Format(_T(""));
	SetDlgItemText(IDC_SecondWrongNum,m_SecondWrongNum);
	m_ThirdWrongNum.Format(_T(""));
	SetDlgItemText(IDC_ThirdWrongNum,m_ThirdWrongNum);
	m_ExamStatus.Format("复位检查");
	SetDlgItemText(IDC_ExamStatic,m_ExamStatus);

	memset(&buffer,0,sizeof(buffer));
	
	rc = PlxDmaSglChannelClose(
								hDevice,
								PrimaryPciChannel0
								);
	if (rc != ApiSuccess)
	{	
		m_status.Format("无法停止DMA");
		SetDlgItemText(IDC_status,m_status);	
	}
	
	PlxPciBoardReset(hDevice);
	m_status.Format("成功复位PCI&LVDS卡");
	m_TRANSFERTIME.Format("%d\n",0);
	SetDlgItemText(IDC_EDIT_TRANSFERTIME,m_TRANSFERTIME);
	SetDlgItemText(IDC_status,m_status);	
}

⌨️ 快捷键说明

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