📄 pagetest.cpp
字号:
// 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 + -