📄 pagechart.cpp
字号:
// PageChart.cpp : 实现文件
//
#include "stdafx.h"
#include "PCIEBoardTest.h"
#include "TestFunc.h"
#include "PageChart.h"
#include ".\pagechart.h"
#include "freq.h"
#include "testfunc.h"
#include "PageDevice.h"
#include "Pagedebug.h"
#include "Pagetest.h"
#include "PCIEBoardTestDlg.h"
// CPageChart 对话框
IMPLEMENT_DYNAMIC(CPageChart, CDialog)
CPageChart::CPageChart(CWnd* pParent /*=NULL*/)
: CDialog(CPageChart::IDD, pParent)
{
}
CPageChart::~CPageChart()
{
}
void CPageChart::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PROGRESS_CHART, m_prgChartRefresh);
}
BEGIN_MESSAGE_MAP(CPageChart, CDialog)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BTN_CHART_START, OnBnClickedBtnChartStart)
END_MESSAGE_MAP()
// CPageChart 消息处理程序
void CPageChart::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
// OnCancel();
}
int CPageChart::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CRect ClientRect;
GetClientRect(ClientRect);
for(int i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
{
m_ChartWnd[i].Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, ClientRect, this, 0);
m_ChartWnd[i].SetLayers(8, 6);
m_ChartWnd[i].SetAxresName("Transfer size(Kbytes)", "Transfer Rate(Mbyte/s)");
}
m_ChartWnd[0].SetTitle("CPU Single DWORD Read (Card -> System)");
m_ChartWnd[1].SetTitle("CPU Single DWORD Write (System -> Card)");
m_ChartWnd[2].SetTitle("DMA-Based Burst Read (Card -> System)");
m_ChartWnd[3].SetTitle("DMA-Based Burst Write (System -> Card)");
SetTimer(0, 100, NULL);
return 0;
}
void CPageChart::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CRect ClientRect;
CRect ButtonRect;
CRect PrgRect;
CRect ChartRect[4];
int i;
GetClientRect(ClientRect);
if (GetDlgItem(IDC_BTN_CHART_START) == NULL)
return;
GetDlgItem(IDC_BTN_CHART_START)->GetWindowRect(ButtonRect);
ScreenToClient(ButtonRect);
m_prgChartRefresh.GetWindowRect(PrgRect);
ScreenToClient(PrgRect);
PrgRect.right = ClientRect.right - 10;
m_prgChartRefresh.MoveWindow(PrgRect);
ClientRect.top = ButtonRect.bottom + 4;
ClientRect.bottom -= 4;
ClientRect.left += 4;
ClientRect.right -= 4;
for(i=0; i<sizeof(ChartRect)/sizeof(ChartRect[0]); ++i)
ChartRect[i] = ClientRect;
ChartRect[0].right = (ChartRect[0].left + ChartRect[0].right ) / 2 - 2;
ChartRect[0].bottom = (ChartRect[0].top + ChartRect[0].bottom) / 2 - 2;
ChartRect[1].left = (ChartRect[1].left + ChartRect[1].right ) / 2 + 2;
ChartRect[1].bottom = (ChartRect[1].top + ChartRect[1].bottom) / 2 - 2;
ChartRect[2].right = (ChartRect[2].left + ChartRect[2].right ) / 2 - 2;
ChartRect[2].top = (ChartRect[2].top + ChartRect[2].bottom) / 2 + 2;
ChartRect[3].left = (ChartRect[3].left + ChartRect[3].right ) / 2 + 2;
ChartRect[3].top = (ChartRect[3].top + ChartRect[3].bottom) / 2 + 2;
for(i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
m_ChartWnd[i].MoveWindow(ChartRect[i]);
}
void CPageChart::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnTimer(nIDEvent);
m_prgChartRefresh.SetPos(0);
KillTimer(0);
}
void CPageChart::OnBnClickedBtnChartStart()
{
// TODO: 在此添加控件通知处理程序代码
int i;
__int64 i64Start;
__int64 i64End;
ULONG TimeElapse[7];
ULONG uData;
TPOINT * pPoint[3];
int iCount[3];
int CPUTest[6] = {128, 256, 512, 1024, 2048, 8192};
int DMATest[] = {8, 16, 32, 64, 128, 256, 512, 1024, 2048, 3072, 4096, 5000, 5500, 6000, 6300}; // COUNT for size = 0x20 DWORD
m_prgChartRefresh.SetPos(0);
m_prgChartRefresh.SetRange(0, sizeof(CPUTest) / sizeof(CPUTest[0]) * 2 + sizeof(DMATest)/sizeof(DMATest[0]) * 2);
int prgPos = 0;
for(i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
m_ChartWnd[i].ClearChart();
//
iCount[0] = iCount[1] = sizeof(CPUTest)/sizeof(CPUTest[0]);
pPoint[0] = new TPOINT[iCount[0]];
pPoint[1] = new TPOINT[iCount[1]];
// CPU Single DWORD Read(Card -> System)
ULONG uAddr = 0x18;
// ReadREG
for(i=0; i<sizeof(CPUTest)/sizeof(CPUTest[0]); ++i)
{
// use this ULONG to do test
// unsigned int Reserved1; // 0x18
m_prgChartRefresh.SetPos(prgPos);
CString strInfor;
strInfor.Format("Read REG at 0x%08x for %d DWORDs.", uAddr, CPUTest[i]);
GetDlg()->Log(strInfor);
GetCurrentTSC(i64Start);
Test_ReadREG(GetDlg()->GetDeviceHandle(), uAddr, uData, &TimeElapse[0], CPUTest[i]/sizeof(ULONG));
GetCurrentTSC(i64End);
TimeElapse[0] = TimeElapse[0] / (nCPUFreq / 1000.0);
TimeElapse[1] = (i64End - i64Start) / (nCPUFreq / 1000.0);
(pPoint[0] + i)->x = CPUTest[i];
(pPoint[0] + i)->y = CPUTest[i] / (TimeElapse[0] / (1000.0 * 1000 * 1000)); // BPS
(pPoint[1] + i)->x = CPUTest[i];
(pPoint[1] + i)->y = CPUTest[i] / (TimeElapse[1] / (1000.0 * 1000 * 1000)); // BPS
++prgPos;
}
m_ChartWnd[0].AddChart(RGB(0, 0, 255), "Driver", iCount[0], pPoint[0]);
m_ChartWnd[0].AddChart(RGB(0, 255, 0), "GUI", iCount[1], pPoint[1]);
// CPU Single DWORD Write(System -> Card)
// WriteREG
for(i=0; i<sizeof(CPUTest)/sizeof(CPUTest[0]); ++i)
{
// use this ULONG to do test
// unsigned int Reserved1; // 0x18
m_prgChartRefresh.SetPos(prgPos);
CString strInfor;
strInfor.Format("Write REG at 0x%08x for %d DWORDs.", uAddr, CPUTest[i]);
GetDlg()->Log(strInfor);
GetCurrentTSC(i64Start);
Test_WriteREG(GetDlg()->GetDeviceHandle(), uAddr, uData, &TimeElapse[0], CPUTest[i]/sizeof(ULONG));
GetCurrentTSC(i64End);
TimeElapse[0] = TimeElapse[0] / (nCPUFreq / 1000.0);
TimeElapse[1] = (i64End - i64Start) / (nCPUFreq / 1000.0);
(pPoint[0] + i)->x = CPUTest[i];
(pPoint[0] + i)->y = CPUTest[i] * 1000.0 * 1000 * 1000 / TimeElapse[0]; // BPS
(pPoint[1] + i)->x = CPUTest[i];
(pPoint[1] + i)->y = CPUTest[i] * 1000.0 * 1000 * 1000 / TimeElapse[1]; // BPS
++prgPos;
}
m_ChartWnd[1].AddChart(RGB(0, 0, 255), "Driver", iCount[0], pPoint[0]);
m_ChartWnd[1].AddChart(RGB(0, 255, 0), "GUI", iCount[1], pPoint[1]);
delete[] pPoint[0];
delete[] pPoint[1];
pPoint[0] = pPoint[1] = NULL;
// DMA Test:
iCount[0] = iCount[1] = iCount[2] = sizeof(DMATest)/sizeof(DMATest[0]);
pPoint[0] = new TPOINT[iCount[0]];
pPoint[1] = new TPOINT[iCount[1]];
pPoint[2] = new TPOINT[iCount[2]];
// DMA Read(Card -> System)
for(i=0; i<sizeof(DMATest)/sizeof(DMATest[0]); ++i)
{
m_prgChartRefresh.SetPos(prgPos);
Test_Dev2Host(GetDlg()->GetDeviceHandle(), iDeviceWriteSize, DMATest[i], 0xA55AA55A, TimeElapse);
if (TimeElapse[1] == 0)
{
AfxMessageBox("DMA Failed!");
delete[] pPoint[0];
delete[] pPoint[1];
delete[] pPoint[2];
return;
}
(pPoint[0] + i)->x = DMATest[i] * sizeof(ULONG) * iDeviceWriteSize;
(pPoint[0] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[0]; // BPS
(pPoint[1] + i)->x = (pPoint[0] + i)->x;
(pPoint[1] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[1]; // BPS
(pPoint[2] + i)->x = (pPoint[0] + i)->x;
(pPoint[2] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[2]; // BPS
++prgPos;
}
m_ChartWnd[2].AddChart(RGB(255, 0, 0), "Hardware", iCount[0], pPoint[0]);
m_ChartWnd[2].AddChart(RGB(0, 0, 255), "Driver", iCount[1], pPoint[1]);
m_ChartWnd[2].AddChart(RGB(0, 255, 0), "GUI", iCount[2], pPoint[2]);
// DMA Read(System -> Card)
for(i=0; i<sizeof(DMATest)/sizeof(DMATest[0]); ++i)
{
m_prgChartRefresh.SetPos(prgPos);
Test_Host2Dev(GetDlg()->GetDeviceHandle(), iDeviceReadSize, DMATest[i] * 0x20 / iDeviceReadSize, TimeElapse);
if (TimeElapse[1] == 0)
{
AfxMessageBox("DMA Failed!");
delete[] pPoint[0];
delete[] pPoint[1];
delete[] pPoint[2];
return;
}
(pPoint[0] + i)->x = DMATest[i] * sizeof(ULONG) * 0x20;
(pPoint[0] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[0]; // BPS
(pPoint[1] + i)->x = (pPoint[0] + i)->x;
(pPoint[1] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[1]; // BPS
(pPoint[2] + i)->x = (pPoint[0] + i)->x;
(pPoint[2] + i)->y = (pPoint[0] + i)->x * 1000.0 * 1000 * 1000 / TimeElapse[2]; // BPS
++prgPos;
}
m_prgChartRefresh.SetPos(prgPos);
m_ChartWnd[3].AddChart(RGB(255, 0, 0), "Hardware", iCount[0], pPoint[0]);
m_ChartWnd[3].AddChart(RGB(0, 0, 255), "Driver", iCount[1], pPoint[1]);
m_ChartWnd[3].AddChart(RGB(0, 255, 0), "GUI", iCount[2], pPoint[2]);
delete[] pPoint[0];
delete[] pPoint[1];
delete[] pPoint[2];
pPoint[0] = pPoint[1] = pPoint[2] = NULL;
// 刷新显示
for(i=0; i<sizeof(m_ChartWnd)/sizeof(m_ChartWnd[0]); ++i)
m_ChartWnd[i].Invalidate();
m_prgChartRefresh.SetPos(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -