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

📄 pagetest.cpp

📁 PCI的一个测试程序,可以测试PCI driver和BOARD的功能.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PageTest.cpp : 实现文件
//

#include "stdafx.h"
#include "PCIEBoardTest.h"
#include "testfunc.h"
#include "PageDevice.h"

#include "PageDebug.h"
#include "PageTest.h"
#include "PageChart.h"
#include "PCIEBoardTestDlg.h"
#include ".\pagetest.h"

#define LOG_RESULT

// CPageTest 对话框

IMPLEMENT_DYNAMIC(CPageTest, CDialog)
CPageTest::CPageTest(CWnd* pParent /*=NULL*/)
	: CDialog(CPageTest::IDD, pParent)
	, m_uSingleCount(100)
    , m_uMultiCount_Min(100)
    , m_uMultiCount_Max(200)
    , m_strPattern(_T("AA55AA55"))
    , m_iSingleSize(0)
    , m_iMultiSizeMin(0)
    , m_iMultiSizeMax(0)
	, m_iSingleSize_DevWrite(0)
	, m_iMultiSizeMin_DevWrite(0)
	, m_iMultiSizeMax_DevWrite(0)
{
}

CPageTest::~CPageTest()
{
}

void CPageTest::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_SUMMARY, m_lvSummary);
	DDX_Control(pDX, IDC_RADIO_MODE_SINGLE, m_Check_SingleCount_Test);
	DDX_Text(pDX, IDC_EDIT_SINGLE_COUNT, m_uSingleCount);
	DDX_Text(pDX, IDC_EDIT_MULTI_COUNT_MIN, m_uMultiCount_Min);
	DDX_Text(pDX, IDC_EDIT_MULTI_COUNT_MAX, m_uMultiCount_Max);
	DDX_Text(pDX, IDC_EDIT_PATTERN, m_strPattern);
	DDX_Control(pDX, IDC_PROGRESS_TEST, m_prgTest);
	DDX_Text(pDX, IDC_STATIC_SINGLE_INFOR, m_iSingleSize);
	DDX_Text(pDX, IDC_STATIC_MULTI_INFOR1, m_iMultiSizeMin);
	DDX_Text(pDX, IDC_STATIC_MULTI_INFOR2, m_iMultiSizeMax);
	DDX_Control(pDX, IDC_COMBO_PACKETSIZE, m_listPacketSize);
	DDX_Text(pDX, IDC_STATIC_SINGLE_INFOR_DRVWRITE, m_iSingleSize_DevWrite);
	DDX_Text(pDX, IDC_STATIC_MULTI_INFOR1_DEVWRITE, m_iMultiSizeMin_DevWrite);
	DDX_Text(pDX, IDC_STATIC_MULTI_INFOR2_DEVWRITE, m_iMultiSizeMax_DevWrite);
}


BEGIN_MESSAGE_MAP(CPageTest, CDialog)
    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
    ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
    ON_BN_CLICKED(IDC_BTN_TEST_H2D, OnBnClickedBtnTestH2d)
    ON_BN_CLICKED(IDC_BTN_TEST_D2H, OnBnClickedBtnTestD2h)
    ON_BN_CLICKED(IDC_BTN_TEST_FULL, OnBnClickedBtnTestFull)
    ON_BN_CLICKED(IDC_RADIO_MODE_SINGLE, OnBnClickedRadioModeSingle)
    ON_BN_CLICKED(IDC_RADIO_MODE_RANGE, OnBnClickedRadioModeRange)
    ON_WM_CREATE()
    ON_WM_TIMER()
    ON_WM_SIZE()
    ON_EN_CHANGE(IDC_EDIT_SINGLE_COUNT, OnEnChangeEditSingleCount)
    ON_EN_CHANGE(IDC_EDIT_MULTI_COUNT_MIN, OnEnChangeEditMultiCountMin)
    ON_EN_CHANGE(IDC_EDIT_MULTI_COUNT_MAX, OnEnChangeEditMultiCountMax)
    ON_CBN_SELCHANGE(IDC_COMBO_PACKETSIZE, OnCbnSelchangeComboPacketsize)
END_MESSAGE_MAP()


// CPageTest 消息处理程序

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

int CPageTest::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  在此添加您专用的创建代码
    SetTimer(0, 100, NULL);


    return 0;
}


void CPageTest::DisplaySummary()
{
    // TODO: 在此添加控件通知处理程序代码
    ULONG           uChartDataSize[CHART_DATA_TOTAL];
    TPOINT *        pChartData[CHART_DATA_TOTAL];
    int             i;
    int             j;
    int             s;

    int             BYTES;
    int             count;
    int             perf;
    int             done;
    int             app;
    double          bps_perf;
    int             bps_perf_unit;      // 0 - Bps, 1 - KBps, 2 - MBps, 3 - GBps
    double          bps_done;
    int             bps_done_unit;
    double          bps_app;
    int             bps_app_unit;

    CString         strSize;
    CString         strPerf;
    CString         strDone;
    CString         strApp;
    CString         strBpsPerf;
    CString         strBpsDone;
    CString         strBpsApp;


    for(i=0; i<CHART_DATA_TOTAL; ++i)
    {
        uChartDataSize[i] = GetDlg()->m_uChartDataSize[i];
        pChartData[i]     = GetDlg()->m_pChartData[i];
    }

    int     Total = MAX(uChartDataSize[CHART_H2D_PERF_NS], uChartDataSize[CHART_D2H_PERF_NS]);
    CString strMode = "Read";

    for(j=0; j<2*Total; ++j)
    {
        i = j / 2;
        s = j & 1;

        if(s == 0)
        {
            if(!(pChartData[CHART_H2D_PERF_NS] && pChartData[CHART_H2D_DONE_NS]))
                continue;

            count = (pChartData[CHART_H2D_PERF_NS] + i)->x;
            perf  = (pChartData[CHART_H2D_PERF_NS] + i)->y;
            done  = (pChartData[CHART_H2D_DONE_NS] + i)->y;

            if (pChartData[CHART_H2D_APP_NS ])
                app   = (pChartData[CHART_H2D_APP_NS ] + i)->y;
            else if (pChartData[CHART_FULL_APP_NS ])
                app   = (pChartData[CHART_FULL_APP_NS] + i)->y;
            else
                continue;

            strMode = "Read";

			BYTES = sizeof(DWORD) * iDeviceReadSize * count;
        }

        if(s == 1)
        {
            if (!(pChartData[CHART_D2H_PERF_NS] && pChartData[CHART_D2H_DONE_NS]))
                continue;

            count = (pChartData[CHART_D2H_PERF_NS] + i)->x;
            perf  = (pChartData[CHART_D2H_PERF_NS] + i)->y;
            done  = (pChartData[CHART_D2H_DONE_NS] + i)->y;

            if (pChartData[CHART_D2H_APP_NS ])
                app   = (pChartData[CHART_D2H_APP_NS ] + i)->y;
            else if (pChartData[CHART_FULL_APP_NS ])
                app   = (pChartData[CHART_FULL_APP_NS] + i)->y;
            else
                continue;

            strMode = "Write";

			BYTES = sizeof(DWORD) * iDeviceWriteSize * count;
        }



        // bps_perf
        if (perf == 0)
        {
            bps_perf = -1;
        }
        else
        {
            CalculateBPS(BYTES, perf, bps_perf, bps_perf_unit);
        }
        // bps_done
        if (done == 0)
        {
            bps_done = -1;
        }
        else
        {
            CalculateBPS(BYTES, done, bps_done, bps_done_unit);
        }

        // bps_app
        if (app == 0)
        {
            bps_app = -1;
        }
        else
        {
            CalculateBPS(BYTES, app, bps_app, bps_app_unit);
        }


        strSize.Format("%d", BYTES);
        strPerf.Format("%d", perf);
        strDone.Format("%d", done);
        strApp.Format("%d", app);
        
        strBpsPerf.Format("%.2f", bps_perf);
        strBpsPerf += GetUnitStr(bps_perf_unit);
        strBpsDone.Format("%.2f", bps_done);
        strBpsDone += GetUnitStr(bps_done_unit);
        strBpsApp.Format("%.2f", bps_app);
        strBpsApp += GetUnitStr(bps_app_unit);


        if (m_lvSummary.GetItemCount() > i)
        {
            m_lvSummary.SetItemText(i, 0, strMode);
        }
        else
        {
            m_lvSummary.InsertItem(i, strMode);
        }
        m_lvSummary.SetItemText(i, 1, strSize);
        m_lvSummary.SetItemText(i, 2, strPerf);
        m_lvSummary.SetItemText(i, 3, strDone);
        m_lvSummary.SetItemText(i, 4, strApp);
        m_lvSummary.SetItemText(i, 5, strBpsPerf);
        m_lvSummary.SetItemText(i, 6, strBpsDone);
        m_lvSummary.SetItemText(i, 7, strBpsApp);
    }

	i = j/2;

    while(m_lvSummary.GetItemCount() > i)
    {
        m_lvSummary.DeleteItem(i);
    }
}

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

    m_prgTest.SetPos(0);
    
    m_lvSummary.InsertColumn(0, "Mode ", LVCFMT_LEFT, 60);
    m_lvSummary.InsertColumn(1, "Size(Bytes)", LVCFMT_LEFT, 100);
    m_lvSummary.InsertColumn(2, "Perf(ns)", LVCFMT_LEFT, 78);
    m_lvSummary.InsertColumn(3, "DrvTsc(ns)", LVCFMT_LEFT, 140);
    m_lvSummary.InsertColumn(4, "App (ns)", LVCFMT_LEFT, 78);
    m_lvSummary.InsertColumn(5, "Bps(Perf)", LVCFMT_LEFT, 120);
    m_lvSummary.InsertColumn(6, "Bps(DrvTsc)", LVCFMT_LEFT, 120);
    m_lvSummary.InsertColumn(7, "Bps(App )", LVCFMT_LEFT, 120);

    m_lvSummary.SetExtendedStyle(m_lvSummary.GetExtendedStyle() | LVS_EX_FULLROWSELECT);

	RefreshDeviceSize();

    CDialog::OnTimer(nIDEvent);

    KillTimer(0);
}


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

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

    if (!IsWindow(m_lvSummary.GetSafeHwnd()) || !GetDlgItem(IDC_BTN_DEVICEREAD_SUMMARY))
        return;

    GetDlgItem(IDC_BTN_DEVICEREAD_SUMMARY)->GetWindowRect(rectButton);
    GetClientRect(rectClient);

    ScreenToClient(rectButton);

    rectClient.left += 5;
    rectClient.right -= 5;
    rectClient.bottom -= 5;
    rectClient.top = rectButton.bottom + 5;

    if (IsWindow(m_lvSummary.GetSafeHwnd()))
        m_lvSummary.MoveWindow(rectClient);

}


void CPageTest::OnBnClickedBtnTestH2d()
{
    // TODO: 在此添加控件通知处理程序代码
    BOOL    bOK = TRUE;

    TestInfor("");

    if (GetDlg()->GetDeviceHandle() == INVALID_HANDLE_VALUE)
    {
        MessageBox("No Device Open!");
        return ;
    }

    UpdateData();

    UINT    Count[2];
    UINT    i;
    UINT    j;

    if (m_Check_SingleCount_Test.GetCheck())
    {
        // single test mode
        Count[0] = Count[1] = m_uSingleCount;
        if (Count[1] * sizeof(DWORD) * iDeviceReadSize > GetDlg()->GetUserVirtualBufferLen_h2d())
        {
            MessageBox("Count too large!");
            GetDlgItem(IDC_EDIT_SINGLE_COUNT)->SetFocus();
            return;
        }

        if (Count[0] < 1)
        {
            MessageBox("Count Must >= 1!");
            GetDlgItem(IDC_EDIT_SINGLE_COUNT)->SetFocus();
            return;
        }
    }
    else
    {
        // multi test mode
        Count[0] = m_uMultiCount_Min;
        Count[1] = m_uMultiCount_Max;

        if (Count[0] > Count[1])
        {
            MessageBox("Count Reversed!");
            GetDlgItem(IDC_EDIT_MULTI_COUNT_MIN)->SetFocus();
            return;
        }

        if (Count[1] * sizeof(DWORD) * iDeviceReadSize > GetDlg()->GetUserVirtualBufferLen_h2d())
        {
            MessageBox("Count too large!");
            GetDlgItem(IDC_EDIT_MULTI_COUNT_MAX)->SetFocus();
            return;
        }

        if (Count[0] < 1)
        {
            MessageBox("Count Must >= 1!");
            GetDlgItem(IDC_EDIT_MULTI_COUNT_MAX)->SetFocus();
            return;
        }
    }

    // Total 3 summary datas
    TPOINT *pChartData[CHART_H2D_APP_NS - CHART_H2D_PERF_NS + 1];
    for(i=0; i<sizeof(pChartData)/sizeof(pChartData[0]); ++i)
    {
        pChartData[i] = new TPOINT[Count[1] - Count[0] + 1];
    }

    m_prgTest.SetRange(0, Count[1] - Count[0] + 1);

    ULONG   TimeElapse[3];
#ifdef  LOG_RESULT
    FILE   *fp = fopen("log_h2d.txt", "w");
    fprintf(fp, "Seq\tPerf\tDrv_Tsc\tInt_Tsc\tApp_Tsc\n");
#endif
    for(i=Count[0]; i<=Count[1]; ++i)
    {
        m_prgTest.SetPos(i - Count[0]);

        Test_Host2Dev(GetDlg()->GetDeviceHandle(), iDeviceReadSize, i, TimeElapse);

        if (TimeElapse[1] == 0)
        {
            bOK = FALSE;
            AfxMessageBox("DMA Failed!");
            break;
        }

        for(j=0; j<sizeof(pChartData)/sizeof(pChartData[0]); ++j)
        {
            (pChartData[j] + i - Count[0])->x = i;
            (pChartData[j] + i - Count[0])->y = TimeElapse[j];   
        }

#ifdef  LOG_RESULT
        fprintf(fp, "%d\t%d\t%d\t%d\n", i, TimeElapse[0], TimeElapse[1], TimeElapse[2]);
        fflush(fp);
        TRACE("h2d count = %d: %d, %d, %d\n", i, TimeElapse[0], TimeElapse[1], TimeElapse[2]);
#endif
    }

    // Reset it at last
    Test_Reset(GetDlg()->GetDeviceHandle());

    m_prgTest.SetPos(Count[1] - Count[0] + 1);

#ifdef  LOG_RESULT
    fclose(fp);
#endif

    // 将数据传入全局数据区,并发送更新事件
    GetDlg()->ClearChartData();

    if (bOK)
    {
        GetDlg()->SetChartData(CHART_H2D_PERF_NS, Count[1] - Count[0] + 1, pChartData[0]);
        GetDlg()->SetChartData(CHART_H2D_DONE_NS, Count[1] - Count[0] + 1, pChartData[1]);
        GetDlg()->SetChartData(CHART_H2D_APP_NS , Count[1] - Count[0] + 1, pChartData[2]);
    }

    // free
    for(i=0; i<sizeof(pChartData)/sizeof(pChartData[0]); ++i)
    {
        delete[] pChartData[i];
    }

    m_prgTest.SetPos(0);
    TestInfor("You can see the transfer result by refreshing dma buffer in debug page.");

    DisplaySummary();
}

void CPageTest::OnBnClickedBtnTestD2h()
{
    // TODO: 在此添加控件通知处理程序代码
    TestInfor("");
    BOOL    bOK = TRUE;

⌨️ 快捷键说明

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