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

📄 pagetest.cpp

📁 PCI的一个测试程序,可以测试PCI driver和BOARD的功能.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    if (GetDlg()->GetDeviceHandle() == INVALID_HANDLE_VALUE)
    {
        MessageBox("No Device Open!");
        return ;
    }

    UpdateData();

    UINT    Count[2];
    UINT    i;
    UINT    j;
    ULONG   uPattern = 0;

    // pattern check
    if (m_strPattern.GetLength() == 0)
    {
        MessageBox("Please Input the Pattern");
        GetDlgItem(IDC_EDIT_PATTERN)->SetFocus();
        return ;
    }

    for(i=0; i<m_strPattern.GetLength(); ++i)
    {
        char ch = m_strPattern.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uPattern <<= 0x04;
            uPattern += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uPattern <<= 0x04;
            uPattern += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uPattern <<= 0x04;
            uPattern += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Pattern Must be HEX data!");
            GetDlgItem(IDC_EDIT_PATTERN)->SetFocus();
            return;
        }

    }



    if (m_Check_SingleCount_Test.GetCheck())
    {
        // single test mode
        Count[0] = Count[1] = m_uSingleCount;
        if (Count[1] * sizeof(DWORD) * iDeviceWriteSize > GetDlg()->GetUserVirtualBufferLen_d2h())
        {
            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) * iDeviceWriteSize > GetDlg()->GetUserVirtualBufferLen_d2h())
        {
            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_D2H_APP_NS - CHART_D2H_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_d2h.txt", "w");
    fprintf(fp, "Seq\tPerf\tDrv_Tsc\tApp_Tsc\n");
#endif
    for(i=Count[0]; i<=Count[1]; ++i)
    {
        m_prgTest.SetPos(i - Count[0]);

        Test_Dev2Host(GetDlg()->GetDeviceHandle(), iDeviceWriteSize, i, uPattern, TimeElapse);

        if (TimeElapse[1] == 0)
        {
            AfxMessageBox("DMA Failed");
            bOK = FALSE;
            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("d2h 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_D2H_PERF_NS, Count[1] - Count[0] + 1, pChartData[0]);
        GetDlg()->SetChartData(CHART_D2H_DONE_NS, Count[1] - Count[0] + 1, pChartData[1]);
        GetDlg()->SetChartData(CHART_D2H_APP_NS , Count[1] - Count[0] + 1, pChartData[2]);
    }

    // 删除内存分配
    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::OnBnClickedBtnTestFull()
{
    // TODO: 在此添加控件通知处理程序代码
    TestInfor("");
    BOOL    bOK = TRUE;

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

    UpdateData();

    UINT    Count[2];
    UINT    i;
    ULONG   uPattern = 0;

    // pattern check
    if (m_strPattern.GetLength() == 0)
    {
        MessageBox("Please Input the Pattern");
        GetDlgItem(IDC_EDIT_PATTERN)->SetFocus();
        return ;
    }
    for(i=0; i<m_strPattern.GetLength(); ++i)
    {
        char ch = m_strPattern.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uPattern <<= 0x04;
            uPattern += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uPattern <<= 0x04;
            uPattern += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uPattern <<= 0x04;
            uPattern += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Pattern Must be HEX data!");
            GetDlgItem(IDC_EDIT_PATTERN)->SetFocus();
            return;
        }

    }



    if (m_Check_SingleCount_Test.GetCheck())
    {
        // single test mode
        Count[0] = Count[1] = m_uSingleCount;
        if (Count[1] * sizeof(DWORD) * iDeviceWriteSize > GetDlg()->GetUserVirtualBufferLen_d2h() || 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) * iDeviceWriteSize > GetDlg()->GetUserVirtualBufferLen_d2h() || 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_DATA_TOTAL];
    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[5];

    for(i=Count[0]; i<=Count[1]; ++i)
    {
        m_prgTest.SetPos(i - Count[0]);

        Test_Full(GetDlg()->GetDeviceHandle(), iDeviceWriteSize, i, uPattern, iDeviceReadSize, i, TimeElapse);

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

        (pChartData[CHART_H2D_PERF_NS] + i - Count[0])->x = i;
        (pChartData[CHART_H2D_PERF_NS] + i - Count[0])->y = TimeElapse[0];      // h2d perf
        (pChartData[CHART_H2D_DONE_NS] + i - Count[0])->x = i;
        (pChartData[CHART_H2D_DONE_NS] + i - Count[0])->y = TimeElapse[1];      // h2d done tsc
        (pChartData[CHART_D2H_PERF_NS] + i - Count[0])->x = i;
        (pChartData[CHART_D2H_PERF_NS] + i - Count[0])->y = TimeElapse[2];      // d2h perf
        (pChartData[CHART_D2H_DONE_NS] + i - Count[0])->x = i;
        (pChartData[CHART_D2H_DONE_NS] + i - Count[0])->y = TimeElapse[3];      // d2h done tsc
        (pChartData[CHART_FULL_APP_NS] + i - Count[0])->x = i;
        (pChartData[CHART_FULL_APP_NS] + i - Count[0])->y = TimeElapse[4];      // full app 

#ifdef  LOG_RESULT
        TRACE("full count = %d: %d, %d, %d, %d, %d\n", i, TimeElapse[0], TimeElapse[1], TimeElapse[2], TimeElapse[3], TimeElapse[4]);
#endif
    }

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

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

    GetDlg()->ClearChartData();

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

    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::OnBnClickedRadioModeSingle()
{
    // TODO: 在此添加控件通知处理程序代码
    GetDlgItem(IDC_EDIT_SINGLE_COUNT)->EnableWindow(TRUE);
    GetDlgItem(IDC_EDIT_MULTI_COUNT_MIN)->EnableWindow(FALSE);
    GetDlgItem(IDC_EDIT_MULTI_COUNT_MAX)->EnableWindow(FALSE);
}

void CPageTest::OnBnClickedRadioModeRange()
{
    // TODO: 在此添加控件通知处理程序代码
    GetDlgItem(IDC_EDIT_SINGLE_COUNT)->EnableWindow(FALSE);
    GetDlgItem(IDC_EDIT_MULTI_COUNT_MIN)->EnableWindow(TRUE);
    GetDlgItem(IDC_EDIT_MULTI_COUNT_MAX)->EnableWindow(TRUE);
}

void CPageTest::SetModeCheck(int mode)
{
    m_Check_SingleCount_Test.SetCheck(!mode);

    GetDlgItem(IDC_EDIT_SINGLE_COUNT)->EnableWindow(!mode);
    GetDlgItem(IDC_EDIT_MULTI_COUNT_MIN)->EnableWindow(mode);
    GetDlgItem(IDC_EDIT_MULTI_COUNT_MAX)->EnableWindow(mode);
}

void CPageTest::OnEnChangeEditSingleCount()
{
    // TODO:  如果该控件是 RICHEDIT 控件,则它将不会
    // 发送该通知,除非重写 CDialog::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    RefreshDeviceSize();
}

void CPageTest::OnEnChangeEditMultiCountMin()
{
    // TODO:  如果该控件是 RICHEDIT 控件,则它将不会
    // 发送该通知,除非重写 CDialog::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    RefreshDeviceSize();
}

void CPageTest::OnEnChangeEditMultiCountMax()
{
    // TODO:  如果该控件是 RICHEDIT 控件,则它将不会
    // 发送该通知,除非重写 CDialog::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码
    RefreshDeviceSize();
}

void CPageTest::TestInfor(const char *p_szInfor)
{
    GetDlgItem(IDC_STATIC_TEST_INFOR)->SetWindowText(p_szInfor);
}

void CPageTest::RefreshSizeList()
{
    int     i;

    m_listPacketSize.Clear();

    for(i=0; i<iItemCount; ++i)
    {
        CString strTemp;

        strTemp.Format("%d", iItemSize[i]);

        m_listPacketSize.AddString(strTemp);

        m_listPacketSize.SetItemData(i, iItemSize[i]);
    }

    m_listPacketSize.SetCurSel(0);

    iDeviceReadSize = m_listPacketSize.GetItemData(0);
}

void CPageTest::OnCbnSelchangeComboPacketsize()
{
    // TODO: 在此添加控件通知处理程序代码
    iDeviceReadSize = m_listPacketSize.GetItemData(m_listPacketSize.GetCurSel());

    RefreshDeviceSize();
}

void CPageTest::RefreshDeviceSize()
{
    CString strTemp;
    strTemp.Format("%d", iDeviceReadSize);

    GetDlgItem(IDC_STATIC_PACKETSIZE)->SetWindowText(strTemp);

    UpdateData();

    m_iSingleSize          = sizeof(DWORD) * iDeviceReadSize * m_uSingleCount;
	m_iSingleSize_DevWrite = sizeof(DWORD) * iDeviceWriteSize * m_uSingleCount;

    m_iMultiSizeMin = sizeof(DWORD) * iDeviceReadSize * m_uMultiCount_Min;
    m_iMultiSizeMax = sizeof(DWORD) * iDeviceReadSize * m_uMultiCount_Max;

	m_iMultiSizeMin_DevWrite = sizeof(DWORD) * iDeviceWriteSize * m_uMultiCount_Min;
    m_iMultiSizeMax_DevWrite = sizeof(DWORD) * iDeviceWriteSize * m_uMultiCount_Max;

    UpdateData(FALSE);
}

⌨️ 快捷键说明

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