📄 no_sdram_daqdlg.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 + -