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

📄 pcieboardtestdlg.cpp

📁 PCI的一个测试程序,可以测试PCI driver和BOARD的功能.
💻 CPP
字号:
// PCIEBoardTestDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "PCIEBoardTest.h"
#include "testfunc.h"
#include "PageDevice.h"
#include "PageTest.h"
#include "Pagedebug.h"
#include "PageChart.h"
#include "PCIEBoardTestDlg.h"
#include ".\pcieboardtestdlg.h"
#include "AboutDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CPCIEBoardTestDlg 对话框



CPCIEBoardTestDlg::CPCIEBoardTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPCIEBoardTestDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    m_pUserAddress_d2h = NULL;
    m_uUserAddressLen_d2h = 0;
    m_pUserAddress_h2d = NULL;
    m_uUserAddressLen_h2d = 0;

    m_iLogSeq = 0;

    for(int i=0; i<CHART_DATA_TOTAL; ++i)
    {
        m_uChartDataSize[i] = 0;
        m_pChartData[i] = NULL;
    }
}

CPCIEBoardTestDlg::~CPCIEBoardTestDlg()
{
    for(int i=0; i<CHART_DATA_TOTAL; ++i)
    {
        if (m_pChartData[i])
        {
            delete[] m_pChartData[i];
        }
    }
}

void CPCIEBoardTestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_TAB1, m_TabCtrl);
    DDX_Control(pDX, IDC_LIST_LOG, m_lstLog);
}

BEGIN_MESSAGE_MAP(CPCIEBoardTestDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
    ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTcnSelchangeTab1)
    ON_WM_TIMER()
    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
    ON_COMMAND(ID_APP_EXIT, OnAppExit)
//    ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_WM_SIZE()
ON_NOTIFY(TCN_SELCHANGING, IDC_TAB1, OnTcnSelchangingTab1)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_APP_CLEARLOG, OnAppClearlog)
END_MESSAGE_MAP()


// CPCIEBoardTestDlg 消息处理程序

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

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

    m_hDevHandle = INVALID_HANDLE_VALUE;
    m_strDevInfor = "";

	// TODO: 在此添加额外的初始化代码
    m_TabCtrl.InsertItem(0, "Device");
    m_TabCtrl.InsertItem(1, "Debug");
    m_TabCtrl.InsertItem(2, "Test");
    m_TabCtrl.InsertItem(3, "Graph");
	
    m_PageDevice.Create(IDD_PAGE_DEVICE, GetDlgItem(IDC_TAB1));
    m_PageDebug.Create(IDD_PAGE_DEBUG, GetDlgItem(IDC_TAB1));
    m_PageTest.Create(IDD_PAGE_SUMMARY, GetDlgItem(IDC_TAB1));
    m_PageChart.Create(IDD_PAGE_CHART, GetDlgItem(IDC_TAB1));

    m_TabCtrl.SetCurSel(0);

    SetTimer(1, 500, NULL);

    if (m_MainMenu.LoadMenu(IDR_MENU_MAIN))
    {
        SetMenu(&m_MainMenu);
    }

    m_bFirstTimer = TRUE;

	ReadINI();

	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CPCIEBoardTestDlg::ReadINI()
{
	CString	 strCurrDir;
	char     szFile[MAX_PATH];
	int      i;

	GetModuleFileName(NULL,szFile,MAX_PATH);

	for(i=strlen(szFile)-1;i>0 &&szFile[i]!='\\';i--);
		
	szFile[i]=0;

	strCurrDir = szFile;
	
	iItemCount = 1;

    // load config
    for(i=0; i<sizeof(iItemSize)/sizeof(iItemSize[0]); ++i)
    {
        CString strKeyName;

		strKeyName.Format("SIZE%d", i+1);
		iItemSize[i] = GetPrivateProfileInt("DEVICE", strKeyName, -1, strCurrDir + "\\PCIEBOARDTESTER.INI");

		if (iItemSize[i] != -1)
		{
			iItemCount = i+1;
		}
		else
		{
			iItemSize[i] = 0x20;
			break;
		}
    }

	// 
	SKIP_APP_INTERRUPTED = GetPrivateProfileInt("DEVICE", "SKIP_APP_INTERRUPTED", 0, strCurrDir + "\\PCIEBOARDTESTER.INI");
    SKIP_APP_PARAM       = GetPrivateProfileInt("DEVICE", "SKIP_APP_PARAM", 10, strCurrDir + "\\PCIEBOARDTESTER.INI");

}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CPCIEBoardTestDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		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;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CPCIEBoardTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CPCIEBoardTestDlg::UpdatePage()
{
    switch(m_TabCtrl.GetCurSel())
    {
    case 0:
        // Device
        m_PageDevice.ShowWindow(SW_SHOW);
        m_PageDebug.ShowWindow(SW_HIDE);
        m_PageTest.ShowWindow(SW_HIDE);
        m_PageChart.ShowWindow(SW_HIDE);
        break;

    case 1:
        // Debug
        m_PageDevice.ShowWindow(SW_HIDE);
        m_PageDebug.ShowWindow(SW_SHOW);
        m_PageTest.ShowWindow(SW_HIDE);
        m_PageChart.ShowWindow(SW_HIDE);
        break;

    case 2:
        // Test
        m_PageDevice.ShowWindow(SW_HIDE);
        m_PageDebug.ShowWindow(SW_HIDE);
        m_PageTest.ShowWindow(SW_SHOW);
        m_PageChart.ShowWindow(SW_HIDE);
        break;
    
    case 3:
        // Graph
        m_PageDevice.ShowWindow(SW_HIDE);
        m_PageDebug.ShowWindow(SW_HIDE);
        m_PageTest.ShowWindow(SW_HIDE);
        m_PageChart.ShowWindow(SW_SHOW);
        break;
    }
}

void CPCIEBoardTestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    UpdatePage();

    *pResult = 0;
}


HANDLE  CPCIEBoardTestDlg::GetDeviceHandle()
{
    return m_hDevHandle;
}

void    CPCIEBoardTestDlg::GetDeviceInfor(CString& p_strDevInfor)
{
    p_strDevInfor = m_strDevInfor;
}

void    CPCIEBoardTestDlg::SetDeviceHandle(HANDLE p_hDevHandle)
{
    m_hDevHandle = p_hDevHandle;
}

void    CPCIEBoardTestDlg::SetDeviceInfor(CString& p_strDevInfor)
{
    m_strDevInfor = p_strDevInfor;
}

void CPCIEBoardTestDlg::OnTimer(UINT nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    UpdatePage();

    if (m_bFirstTimer)
    {
        CRect   rectTab;
        CRect   rectTabItem;

        m_TabCtrl.GetClientRect(rectTab);
        m_TabCtrl.GetItemRect(0, rectTabItem);

        rectTab.top = rectTabItem.bottom + 1;
        rectTab.bottom --;
        rectTab.left ++;
        rectTab.right --;


        m_PageTest.MoveWindow(rectTab);
        m_PageChart.MoveWindow(rectTab);

        CRect   rectDevicePage;
        CRect   rectDebugPage;

        CSize   sizeDiff;

        m_PageDevice.GetClientRect(rectDevicePage);
        sizeDiff.cx = (rectTab.Width() - rectDevicePage.Width()) / 2;
        sizeDiff.cy = (rectTab.Height() - rectDevicePage.Height()) / 2;

        rectDevicePage = rectTab;
        rectDevicePage.left   += sizeDiff.cx;
        rectDevicePage.right  -= sizeDiff.cx;
        rectDevicePage.top    += sizeDiff.cy;
        rectDevicePage.bottom -= sizeDiff.cy;
        m_PageDevice.MoveWindow(rectDevicePage);

        /*
        m_PageDebug.GetClientRect(rectDebugPage);
        sizeDiff.cx = (rectTab.Width() - rectDebugPage.Width()) / 2;
        sizeDiff.cy = (rectTab.Height() - rectDebugPage.Height()) / 2;
        rectDebugPage.left   += sizeDiff.cx;
        rectDebugPage.right  += sizeDiff.cx;
        rectDebugPage.top    += sizeDiff.cy + rectTab.top;
        rectDebugPage.bottom += sizeDiff.cy + rectTab.top;
        */
        m_PageDebug.MoveWindow(rectTab);

        m_lstLog.SetExtendedStyle(m_lstLog.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
        m_lstLog.InsertColumn(0, "Seq", LVCFMT_LEFT, 80);
        m_lstLog.InsertColumn(1, "Time", LVCFMT_LEFT, 200);
        m_lstLog.InsertColumn(2, "Log", LVCFMT_LEFT, 560);

        m_bFirstTimer = FALSE;

        m_PageTest.RefreshSizeList();
	}

    CDialog::OnTimer(nIDEvent);
}

void CPCIEBoardTestDlg::OnBnClickedCancel()
{
    // TODO: 在此添加控件通知处理程序代码
    OnCancel();
}

void *  CPCIEBoardTestDlg::GetUserVirtualBuffer_d2h()
{
    return m_pUserAddress_d2h;
}
ULONG   CPCIEBoardTestDlg::GetUserVirtualBufferLen_d2h()
{
    return m_uUserAddressLen_d2h;
}

void *  CPCIEBoardTestDlg::GetUserVirtualBuffer_h2d()
{
    return m_pUserAddress_h2d;
}
ULONG   CPCIEBoardTestDlg::GetUserVirtualBufferLen_h2d()
{
    return m_uUserAddressLen_h2d;
}

void    CPCIEBoardTestDlg::SetBufferAddress_d2h(void *pAddress_d2h, void *pPhysicalAddress_d2h, ULONG uLen)
{
    m_pUserAddress_d2h     = pAddress_d2h;
    m_pPhysicalAddress_d2h = pPhysicalAddress_d2h;
    m_uUserAddressLen_d2h  = uLen;
}

void    CPCIEBoardTestDlg::SetBufferAddress_h2d(void *pAddress_h2d, void *pPhysicalAddress_h2d, ULONG uLen)
{
    m_pUserAddress_h2d     = pAddress_h2d;
    m_pPhysicalAddress_h2d = pPhysicalAddress_h2d;
    m_uUserAddressLen_h2d  = uLen;
}

void *  CPCIEBoardTestDlg::GetPhysicalBuffer_d2h()
{
    return m_pPhysicalAddress_d2h;
}

void *  CPCIEBoardTestDlg::GetPhysicalBuffer_h2d()
{
    return m_pPhysicalAddress_h2d;
}

void    CPCIEBoardTestDlg::SetChartData(int ChartType, int Size, TPOINT * pChartData)
{
    if (ChartType < 0 || ChartType >= CHART_DATA_TOTAL)
    {
        return;
    }

    if (m_pChartData[ChartType] && m_uChartDataSize[ChartType])
    {
        delete[] m_pChartData[ChartType];
        m_pChartData[ChartType] = NULL;
        m_uChartDataSize[ChartType] = 0;
    }

    if (Size > 0 && pChartData)
    {
        m_pChartData[ChartType] = new TPOINT[Size];

        for(int i=0; i<Size; ++i)
        {
            *(m_pChartData[ChartType] + i) = pChartData[i];
        }

        m_uChartDataSize[ChartType] = Size;
    }
}

// mode: 0 clear h2d, 1 clear d2h, 2 all clear
void    CPCIEBoardTestDlg::ClearChartData(int mode)
{
    for(int i=0; i<CHART_DATA_TOTAL; ++i)
    {
        if (mode == 0 && (i == CHART_D2H_PERF_NS || i == CHART_D2H_DONE_NS || i == CHART_D2H_APP_NS || i == CHART_FULL_APP_NS))
        {
            continue;
        }
        if (mode == 1 && (i == CHART_H2D_PERF_NS || i == CHART_H2D_DONE_NS || i == CHART_H2D_APP_NS || i == CHART_FULL_APP_NS))
        {
            continue;
        }

        if (m_uChartDataSize[i] && m_pChartData[i])
        {
            delete[] m_pChartData[i];
            m_pChartData[i] = NULL;

            m_uChartDataSize[i] = 0;
        }
    }
}


void CPCIEBoardTestDlg::OnAppExit()
{
    // TODO: 在此添加命令处理程序代码
    OnOK();
}

//void CPCIEBoardTestDlg::OnBnClickedOk()
//{
//    // TODO: 在此添加控件通知处理程序代码
//    OnOK();
//}

void CPCIEBoardTestDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
    CRect   rectClient;
    CRect   rectLogWindow;
    CRect   rectTabCtrl;

    if (!IsWindow(m_TabCtrl.GetSafeHwnd()) || !IsWindow(m_lstLog.GetSafeHwnd()))
        return;

    GetClientRect(rectClient);

    m_lstLog.GetWindowRect(rectLogWindow);
    ScreenToClient(rectLogWindow);

    int     iLogHeight = rectLogWindow.Height();
    rectLogWindow.left   = rectClient.left;
    rectLogWindow.right  = rectClient.right;
    rectLogWindow.bottom = rectClient.bottom;
    rectLogWindow.top    = rectLogWindow.bottom - iLogHeight;

    m_lstLog.MoveWindow(rectLogWindow);

    rectTabCtrl = rectClient;

    rectTabCtrl.bottom = rectLogWindow.top - 20;
    m_TabCtrl.MoveWindow(rectTabCtrl);
}

void CPCIEBoardTestDlg::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: 在此添加控件通知处理程序代码
    if (GetDeviceHandle() == INVALID_HANDLE_VALUE && m_TabCtrl.GetCurSel() == 0)
    {
        MessageBox("Please connect device at first!");
        *pResult = 1;
    }
    else
    {
        *pResult = 0;
    }
    //*pResult = 0;
}

void CPCIEBoardTestDlg::Log(const char *p_szLogInfor)
{
    m_iLogSeq++;

    CString     strSeq;
    CString     strTime;
    CString     strLog;
    SYSTEMTIME  timeNow;
    CSize       sizeScroll;

    strSeq.Format("%d", m_iLogSeq);

    GetLocalTime(&timeNow);

    strTime.Format("%02d/%02d/%04d %02d:%02d:%02d.%03d", 
        timeNow.wMonth, timeNow.wDay, timeNow.wYear, 
        timeNow.wHour, timeNow.wMinute, timeNow.wSecond, 
        timeNow.wMilliseconds);

    strLog = p_szLogInfor;

	int		i = m_lstLog.InsertItem (m_lstLog.GetItemCount(), strSeq);
    m_lstLog.SetItemText(i, 1, strTime);
    m_lstLog.SetItemText(i, 2, strLog);

    sizeScroll.cx = 0;
    sizeScroll.cy = 20;

    m_lstLog.Scroll(sizeScroll);

	while(m_lstLog.GetItemCount() > 5000)
	{
		m_lstLog.DeleteItem(0);
	}
}

void CPCIEBoardTestDlg::OnAppAbout()
{
    // TODO: 在此添加命令处理程序代码
    CAboutDlg   dlg;

    dlg.DoModal();
}


void CPCIEBoardTestDlg::OnAppClearlog()
{
	// TODO: 在此添加命令处理程序代码
	m_lstLog.DeleteAllItems();
}

⌨️ 快捷键说明

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