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