📄 pcieboardtestdlg.cpp
字号:
// PCIEBoardTestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "PCIEBoardTest.h"
#include "testfunc.h"
#include "PageDevice.h"
#include "PageTest.h"
#include "Pagedebug.h"
#include "PageChart.h"
#include "PCIEBoardTestDlg.h"
#include ".\pcieboardtestdlg.h"
#include "AboutDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CPCIEBoardTestDlg 对话框
CPCIEBoardTestDlg::CPCIEBoardTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPCIEBoardTestDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pUserAddress_d2h = NULL;
m_uUserAddressLen_d2h = 0;
m_pUserAddress_h2d = NULL;
m_uUserAddressLen_h2d = 0;
m_iLogSeq = 0;
for(int i=0; i<CHART_DATA_TOTAL; ++i)
{
m_uChartDataSize[i] = 0;
m_pChartData[i] = NULL;
}
}
CPCIEBoardTestDlg::~CPCIEBoardTestDlg()
{
for(int i=0; i<CHART_DATA_TOTAL; ++i)
{
if (m_pChartData[i])
{
delete[] m_pChartData[i];
}
}
}
void CPCIEBoardTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TAB1, m_TabCtrl);
DDX_Control(pDX, IDC_LIST_LOG, m_lstLog);
}
BEGIN_MESSAGE_MAP(CPCIEBoardTestDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnTcnSelchangeTab1)
ON_WM_TIMER()
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_COMMAND(ID_APP_EXIT, OnAppExit)
// ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_WM_SIZE()
ON_NOTIFY(TCN_SELCHANGING, IDC_TAB1, OnTcnSelchangingTab1)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_APP_CLEARLOG, OnAppClearlog)
END_MESSAGE_MAP()
// CPCIEBoardTestDlg 消息处理程序
BOOL CPCIEBoardTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
m_hDevHandle = INVALID_HANDLE_VALUE;
m_strDevInfor = "";
// TODO: 在此添加额外的初始化代码
m_TabCtrl.InsertItem(0, "Device");
m_TabCtrl.InsertItem(1, "Debug");
m_TabCtrl.InsertItem(2, "Test");
m_TabCtrl.InsertItem(3, "Graph");
m_PageDevice.Create(IDD_PAGE_DEVICE, GetDlgItem(IDC_TAB1));
m_PageDebug.Create(IDD_PAGE_DEBUG, GetDlgItem(IDC_TAB1));
m_PageTest.Create(IDD_PAGE_SUMMARY, GetDlgItem(IDC_TAB1));
m_PageChart.Create(IDD_PAGE_CHART, GetDlgItem(IDC_TAB1));
m_TabCtrl.SetCurSel(0);
SetTimer(1, 500, NULL);
if (m_MainMenu.LoadMenu(IDR_MENU_MAIN))
{
SetMenu(&m_MainMenu);
}
m_bFirstTimer = TRUE;
ReadINI();
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CPCIEBoardTestDlg::ReadINI()
{
CString strCurrDir;
char szFile[MAX_PATH];
int i;
GetModuleFileName(NULL,szFile,MAX_PATH);
for(i=strlen(szFile)-1;i>0 &&szFile[i]!='\\';i--);
szFile[i]=0;
strCurrDir = szFile;
iItemCount = 1;
// load config
for(i=0; i<sizeof(iItemSize)/sizeof(iItemSize[0]); ++i)
{
CString strKeyName;
strKeyName.Format("SIZE%d", i+1);
iItemSize[i] = GetPrivateProfileInt("DEVICE", strKeyName, -1, strCurrDir + "\\PCIEBOARDTESTER.INI");
if (iItemSize[i] != -1)
{
iItemCount = i+1;
}
else
{
iItemSize[i] = 0x20;
break;
}
}
//
SKIP_APP_INTERRUPTED = GetPrivateProfileInt("DEVICE", "SKIP_APP_INTERRUPTED", 0, strCurrDir + "\\PCIEBOARDTESTER.INI");
SKIP_APP_PARAM = GetPrivateProfileInt("DEVICE", "SKIP_APP_PARAM", 10, strCurrDir + "\\PCIEBOARDTESTER.INI");
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CPCIEBoardTestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CPCIEBoardTestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CPCIEBoardTestDlg::UpdatePage()
{
switch(m_TabCtrl.GetCurSel())
{
case 0:
// Device
m_PageDevice.ShowWindow(SW_SHOW);
m_PageDebug.ShowWindow(SW_HIDE);
m_PageTest.ShowWindow(SW_HIDE);
m_PageChart.ShowWindow(SW_HIDE);
break;
case 1:
// Debug
m_PageDevice.ShowWindow(SW_HIDE);
m_PageDebug.ShowWindow(SW_SHOW);
m_PageTest.ShowWindow(SW_HIDE);
m_PageChart.ShowWindow(SW_HIDE);
break;
case 2:
// Test
m_PageDevice.ShowWindow(SW_HIDE);
m_PageDebug.ShowWindow(SW_HIDE);
m_PageTest.ShowWindow(SW_SHOW);
m_PageChart.ShowWindow(SW_HIDE);
break;
case 3:
// Graph
m_PageDevice.ShowWindow(SW_HIDE);
m_PageDebug.ShowWindow(SW_HIDE);
m_PageTest.ShowWindow(SW_HIDE);
m_PageChart.ShowWindow(SW_SHOW);
break;
}
}
void CPCIEBoardTestDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
UpdatePage();
*pResult = 0;
}
HANDLE CPCIEBoardTestDlg::GetDeviceHandle()
{
return m_hDevHandle;
}
void CPCIEBoardTestDlg::GetDeviceInfor(CString& p_strDevInfor)
{
p_strDevInfor = m_strDevInfor;
}
void CPCIEBoardTestDlg::SetDeviceHandle(HANDLE p_hDevHandle)
{
m_hDevHandle = p_hDevHandle;
}
void CPCIEBoardTestDlg::SetDeviceInfor(CString& p_strDevInfor)
{
m_strDevInfor = p_strDevInfor;
}
void CPCIEBoardTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UpdatePage();
if (m_bFirstTimer)
{
CRect rectTab;
CRect rectTabItem;
m_TabCtrl.GetClientRect(rectTab);
m_TabCtrl.GetItemRect(0, rectTabItem);
rectTab.top = rectTabItem.bottom + 1;
rectTab.bottom --;
rectTab.left ++;
rectTab.right --;
m_PageTest.MoveWindow(rectTab);
m_PageChart.MoveWindow(rectTab);
CRect rectDevicePage;
CRect rectDebugPage;
CSize sizeDiff;
m_PageDevice.GetClientRect(rectDevicePage);
sizeDiff.cx = (rectTab.Width() - rectDevicePage.Width()) / 2;
sizeDiff.cy = (rectTab.Height() - rectDevicePage.Height()) / 2;
rectDevicePage = rectTab;
rectDevicePage.left += sizeDiff.cx;
rectDevicePage.right -= sizeDiff.cx;
rectDevicePage.top += sizeDiff.cy;
rectDevicePage.bottom -= sizeDiff.cy;
m_PageDevice.MoveWindow(rectDevicePage);
/*
m_PageDebug.GetClientRect(rectDebugPage);
sizeDiff.cx = (rectTab.Width() - rectDebugPage.Width()) / 2;
sizeDiff.cy = (rectTab.Height() - rectDebugPage.Height()) / 2;
rectDebugPage.left += sizeDiff.cx;
rectDebugPage.right += sizeDiff.cx;
rectDebugPage.top += sizeDiff.cy + rectTab.top;
rectDebugPage.bottom += sizeDiff.cy + rectTab.top;
*/
m_PageDebug.MoveWindow(rectTab);
m_lstLog.SetExtendedStyle(m_lstLog.GetExtendedStyle() | LVS_EX_FULLROWSELECT);
m_lstLog.InsertColumn(0, "Seq", LVCFMT_LEFT, 80);
m_lstLog.InsertColumn(1, "Time", LVCFMT_LEFT, 200);
m_lstLog.InsertColumn(2, "Log", LVCFMT_LEFT, 560);
m_bFirstTimer = FALSE;
m_PageTest.RefreshSizeList();
}
CDialog::OnTimer(nIDEvent);
}
void CPCIEBoardTestDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
OnCancel();
}
void * CPCIEBoardTestDlg::GetUserVirtualBuffer_d2h()
{
return m_pUserAddress_d2h;
}
ULONG CPCIEBoardTestDlg::GetUserVirtualBufferLen_d2h()
{
return m_uUserAddressLen_d2h;
}
void * CPCIEBoardTestDlg::GetUserVirtualBuffer_h2d()
{
return m_pUserAddress_h2d;
}
ULONG CPCIEBoardTestDlg::GetUserVirtualBufferLen_h2d()
{
return m_uUserAddressLen_h2d;
}
void CPCIEBoardTestDlg::SetBufferAddress_d2h(void *pAddress_d2h, void *pPhysicalAddress_d2h, ULONG uLen)
{
m_pUserAddress_d2h = pAddress_d2h;
m_pPhysicalAddress_d2h = pPhysicalAddress_d2h;
m_uUserAddressLen_d2h = uLen;
}
void CPCIEBoardTestDlg::SetBufferAddress_h2d(void *pAddress_h2d, void *pPhysicalAddress_h2d, ULONG uLen)
{
m_pUserAddress_h2d = pAddress_h2d;
m_pPhysicalAddress_h2d = pPhysicalAddress_h2d;
m_uUserAddressLen_h2d = uLen;
}
void * CPCIEBoardTestDlg::GetPhysicalBuffer_d2h()
{
return m_pPhysicalAddress_d2h;
}
void * CPCIEBoardTestDlg::GetPhysicalBuffer_h2d()
{
return m_pPhysicalAddress_h2d;
}
void CPCIEBoardTestDlg::SetChartData(int ChartType, int Size, TPOINT * pChartData)
{
if (ChartType < 0 || ChartType >= CHART_DATA_TOTAL)
{
return;
}
if (m_pChartData[ChartType] && m_uChartDataSize[ChartType])
{
delete[] m_pChartData[ChartType];
m_pChartData[ChartType] = NULL;
m_uChartDataSize[ChartType] = 0;
}
if (Size > 0 && pChartData)
{
m_pChartData[ChartType] = new TPOINT[Size];
for(int i=0; i<Size; ++i)
{
*(m_pChartData[ChartType] + i) = pChartData[i];
}
m_uChartDataSize[ChartType] = Size;
}
}
// mode: 0 clear h2d, 1 clear d2h, 2 all clear
void CPCIEBoardTestDlg::ClearChartData(int mode)
{
for(int i=0; i<CHART_DATA_TOTAL; ++i)
{
if (mode == 0 && (i == CHART_D2H_PERF_NS || i == CHART_D2H_DONE_NS || i == CHART_D2H_APP_NS || i == CHART_FULL_APP_NS))
{
continue;
}
if (mode == 1 && (i == CHART_H2D_PERF_NS || i == CHART_H2D_DONE_NS || i == CHART_H2D_APP_NS || i == CHART_FULL_APP_NS))
{
continue;
}
if (m_uChartDataSize[i] && m_pChartData[i])
{
delete[] m_pChartData[i];
m_pChartData[i] = NULL;
m_uChartDataSize[i] = 0;
}
}
}
void CPCIEBoardTestDlg::OnAppExit()
{
// TODO: 在此添加命令处理程序代码
OnOK();
}
//void CPCIEBoardTestDlg::OnBnClickedOk()
//{
// // TODO: 在此添加控件通知处理程序代码
// OnOK();
//}
void CPCIEBoardTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CRect rectClient;
CRect rectLogWindow;
CRect rectTabCtrl;
if (!IsWindow(m_TabCtrl.GetSafeHwnd()) || !IsWindow(m_lstLog.GetSafeHwnd()))
return;
GetClientRect(rectClient);
m_lstLog.GetWindowRect(rectLogWindow);
ScreenToClient(rectLogWindow);
int iLogHeight = rectLogWindow.Height();
rectLogWindow.left = rectClient.left;
rectLogWindow.right = rectClient.right;
rectLogWindow.bottom = rectClient.bottom;
rectLogWindow.top = rectLogWindow.bottom - iLogHeight;
m_lstLog.MoveWindow(rectLogWindow);
rectTabCtrl = rectClient;
rectTabCtrl.bottom = rectLogWindow.top - 20;
m_TabCtrl.MoveWindow(rectTabCtrl);
}
void CPCIEBoardTestDlg::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
if (GetDeviceHandle() == INVALID_HANDLE_VALUE && m_TabCtrl.GetCurSel() == 0)
{
MessageBox("Please connect device at first!");
*pResult = 1;
}
else
{
*pResult = 0;
}
//*pResult = 0;
}
void CPCIEBoardTestDlg::Log(const char *p_szLogInfor)
{
m_iLogSeq++;
CString strSeq;
CString strTime;
CString strLog;
SYSTEMTIME timeNow;
CSize sizeScroll;
strSeq.Format("%d", m_iLogSeq);
GetLocalTime(&timeNow);
strTime.Format("%02d/%02d/%04d %02d:%02d:%02d.%03d",
timeNow.wMonth, timeNow.wDay, timeNow.wYear,
timeNow.wHour, timeNow.wMinute, timeNow.wSecond,
timeNow.wMilliseconds);
strLog = p_szLogInfor;
int i = m_lstLog.InsertItem (m_lstLog.GetItemCount(), strSeq);
m_lstLog.SetItemText(i, 1, strTime);
m_lstLog.SetItemText(i, 2, strLog);
sizeScroll.cx = 0;
sizeScroll.cy = 20;
m_lstLog.Scroll(sizeScroll);
while(m_lstLog.GetItemCount() > 5000)
{
m_lstLog.DeleteItem(0);
}
}
void CPCIEBoardTestDlg::OnAppAbout()
{
// TODO: 在此添加命令处理程序代码
CAboutDlg dlg;
dlg.DoModal();
}
void CPCIEBoardTestDlg::OnAppClearlog()
{
// TODO: 在此添加命令处理程序代码
m_lstLog.DeleteAllItems();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -