📄 pagedebug.cpp
字号:
// PageDebug.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 "DlgInput2.h"
// CPageDebug 对话框
IMPLEMENT_DYNAMIC(CPageDebug, CDialog)
CPageDebug::CPageDebug(CWnd* pParent /*=NULL*/)
: CDialog(CPageDebug::IDD, pParent)
, m_strDMABuffer1(_T(""))
, m_strDMABuffer2(_T(""))
, m_strDMABufferInfor1(_T(""))
, m_strDMABufferInfor2(_T(""))
, m_strDMABufferAddress1(_T(""))
, m_strDMABufferAddress2(_T(""))
, m_strDMABufferData1(_T(""))
, m_strDMABufferData2(_T(""))
, m_strREGBufferInfor(_T(""))
, m_strREGAddress(_T(""))
, m_strREGData(_T(""))
{
}
CPageDebug::~CPageDebug()
{
}
void CPageDebug::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_DMA_BUFFER1, m_strDMABuffer1);
DDX_Text(pDX, IDC_EDIT_DMA_BUFFER2, m_strDMABuffer2);
DDX_Control(pDX, IDC_LIST_REGS, m_lbREGs);
DDX_Text(pDX, IDC_STATIC_BUFFER1_INFOR, m_strDMABufferInfor1);
DDX_Text(pDX, IDC_STATIC_BUFFER2_INFOR, m_strDMABufferInfor2);
DDX_Text(pDX, IDC_EDIT_ADDRESS1, m_strDMABufferAddress1);
DDX_Text(pDX, IDC_EDIT_ADDRESS2, m_strDMABufferAddress2);
DDX_Text(pDX, IDC_EDIT_DATA1, m_strDMABufferData1);
DDX_Text(pDX, IDC_EDIT_DATA2, m_strDMABufferData2);
DDX_Text(pDX, IDC_STATIC_REGBUFFER_INFOR, m_strREGBufferInfor);
DDX_Text(pDX, IDC_EDIT_REGADDRESS, m_strREGAddress);
DDX_Text(pDX, IDC_EDIT_REGDATA, m_strREGData);
}
BEGIN_MESSAGE_MAP(CPageDebug, CDialog)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_BTN_REFRESH_DMA_BUFFER1, OnBnClickedBtnRefreshDmaBuffer1)
ON_BN_CLICKED(IDC_BTN_REFRESH_DMA_BUFFER2, OnBnClickedBtnRefreshDmaBuffer2)
ON_BN_CLICKED(IDC_BTN_WRITE_DMABUFFER_1, OnBnClickedBtnWriteDmabuffer1)
ON_BN_CLICKED(IDC_BTN_WRITE_DMABUFFER_2, OnBnClickedBtnWriteDmabuffer2)
ON_BN_CLICKED(IDC_BTN_WRITE_REGBUFFER, OnBnClickedBtnWriteRegbuffer)
ON_BN_CLICKED(IDC_BTN_REFRESH_REG, OnBnClickedBtnRefreshReg)
ON_WM_SIZE()
END_MESSAGE_MAP()
// CPageDebug 消息处理程序
void CPageDebug::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
// OnCancel();
}
int CPageDebug::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: /r(0, 100, NULL);
return 0;
}
void CPageDebug::OnBnClickedBtnRefreshDmaBuffer1()
{
// TODO: 在此添加控件通知处理程序代码
CombineHex2Str((BYTE *)(GetDlg()->GetUserVirtualBuffer_h2d()), MIN(GetDlg()->GetUserVirtualBufferLen_h2d(), MAX_DMA_BUFFER_VIEWLEN), m_strDMABuffer1);
m_strDMABufferInfor1.Format("Phy Addr: 0x%08X Virtual: 0x%08X", GetDlg()->GetPhysicalBuffer_h2d(), GetDlg()->GetUserVirtualBuffer_h2d());
UpdateData(FALSE);
}
void CPageDebug::OnBnClickedBtnRefreshDmaBuffer2()
{
// TODO: 在此添加控件通知处理程序代码
CombineHex2Str((BYTE *)(GetDlg()->GetUserVirtualBuffer_d2h()), MIN(GetDlg()->GetUserVirtualBufferLen_d2h(), MAX_DMA_BUFFER_VIEWLEN), m_strDMABuffer2);
m_strDMABufferInfor2.Format("Phy Addr: 0x%08X Virtual: 0x%08X", GetDlg()->GetPhysicalBuffer_d2h(), GetDlg()->GetUserVirtualBuffer_d2h());
UpdateData(FALSE);
}
void CPageDebug::CombineHex2Str(BYTE * p_pHexData, int p_iDataLen, CString& p_strInfor)
{
char *pBuffer;
char *p;
int size = (9 + 48 + 2 + 2) * (p_iDataLen/16 + 1);
if (p_iDataLen <= 0 || !p_pHexData)
{
p_strInfor = "00000000:";
return;
}
pBuffer = new char[size + 1];
if (pBuffer)
{
p = pBuffer;
for(int i=0; i<p_iDataLen; ++i)
{
if ((i & 0x0F) == 0)
{
if(i)
{
*p++ = 0x0d;
*p++ = 0x0a;
}
p += sprintf(p, "%08X:", i);
}
if ((i & 0x0F) == 8)
{
*p++ = ' ';
*p++ = '-';
}
p += sprintf(p, " %02X", p_pHexData[i]);
}
*p = 0;
p_strInfor = pBuffer;
delete[] pBuffer;
}
else
{
p_strInfor = "00000000:";
}
}
void CPageDebug::OnBnClickedBtnWriteDmabuffer1()
{
// TODO: 在此添加控件通知处理程序代码
// 需要输入:地址、数据
UpdateData();
int i;
ULONG uAddr = 0;
ULONG uData = 0;
if (m_strDMABufferAddress1.GetLength() == 0)
{
MessageBox("Must Input Address!");
GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
return;
}
if (m_strDMABufferData1.GetLength() == 0)
{
MessageBox("Must Input Data!");
GetDlgItem(IDC_EDIT_DATA1)->SetFocus();
return;
}
for(i=0; i<m_strDMABufferAddress1.GetLength(); ++i)
{
char ch = m_strDMABufferAddress1.GetAt(i);
if (ch >= '0' && ch <= '9')
{
uAddr <<= 0x04;
uAddr += ch - '0';
}
else if (ch >= 'a' && ch <= 'f')
{
uAddr <<= 0x04;
uAddr += ch - 'a' + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
uAddr <<= 0x04;
uAddr += ch - 'A' + 10;
}
else
{
MessageBox("Must Input HEX data!");
GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
return;
}
}
uData = 0;
for(i=0; i<m_strDMABufferData1.GetLength(); ++i)
{
char ch = m_strDMABufferData1.GetAt(i);
if (ch >= '0' && ch <= '9')
{
uData <<= 0x04;
uData += ch - '0';
}
else if (ch >= 'a' && ch <= 'f')
{
uData <<= 0x04;
uData += ch - 'a' + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
uData <<= 0x04;
uData += ch - 'A' + 10;
}
else
{
MessageBox("Must Input HEX data!");
GetDlgItem(IDC_EDIT_DATA1)->SetFocus();
return;
}
}
if (uAddr >= GetDlg()->GetUserVirtualBufferLen_h2d())
{
CString strInfor;
strInfor.Format("Address Overflow! MAX 0x%08X!", GetDlg()->GetUserVirtualBufferLen_h2d());
MessageBox(strInfor);
GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
return;
}
if (uAddr & 0x03)
{
MessageBox("Addr must align32!");
GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
return;
}
//write
*(PULONG)((PUCHAR)GetDlg()->GetUserVirtualBuffer_h2d() + uAddr) = uData;
if (MessageBox("Write DMA Buffer for Host2Dev?", "", MB_YESNO | MB_DEFBUTTON2) == IDYES)
{
OnBnClickedBtnRefreshDmaBuffer1();
}
return;
}
void CPageDebug::OnBnClickedBtnWriteDmabuffer2()
{
// TODO: 在此添加控件通知处理程序代码
// 需要输入:地址、数据
UpdateData();
int i;
ULONG uAddr = 0;
ULONG uData = 0;
if (m_strDMABufferAddress2.GetLength() == 0)
{
MessageBox("Must Input Address!");
GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
return;
}
if (m_strDMABufferData2.GetLength() == 0)
{
MessageBox("Must Input Data!");
GetDlgItem(IDC_EDIT_DATA2)->SetFocus();
return;
}
for(i=0; i<m_strDMABufferAddress2.GetLength(); ++i)
{
char ch = m_strDMABufferAddress2.GetAt(i);
if (ch >= '0' && ch <= '9')
{
uAddr <<= 0x04;
uAddr += ch - '0';
}
else if (ch >= 'a' && ch <= 'f')
{
uAddr <<= 0x04;
uAddr += ch - 'a' + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
uAddr <<= 0x04;
uAddr += ch - 'A' + 10;
}
else
{
MessageBox("Must Input HEX data!");
GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
return;
}
}
uData = 0;
for(i=0; i<m_strDMABufferData2.GetLength(); ++i)
{
char ch = m_strDMABufferData2.GetAt(i);
if (ch >= '0' && ch <= '9')
{
uData <<= 0x04;
uData += ch - '0';
}
else if (ch >= 'a' && ch <= 'f')
{
uData <<= 0x04;
uData += ch - 'a' + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
uData <<= 0x04;
uData += ch - 'A' + 10;
}
else
{
MessageBox("Must Input HEX data!");
GetDlgItem(IDC_EDIT_DATA2)->SetFocus();
return;
}
}
if (uAddr >= GetDlg()->GetUserVirtualBufferLen_d2h())
{
CString strInfor;
strInfor.Format("Address Overflow! MAX 0x%08X!", GetDlg()->GetUserVirtualBufferLen_d2h());
MessageBox(strInfor);
GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
return;
}
if (uAddr & 0x03)
{
MessageBox("Addr must align32!");
GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
return;
}
//write
*(PULONG)((PUCHAR)GetDlg()->GetUserVirtualBuffer_d2h() + uAddr) = uData;
if (MessageBox("Refresh DMA Buffer for Dev2Host?", "", MB_YESNO | MB_DEFBUTTON2) == IDYES)
{
OnBnClickedBtnRefreshDmaBuffer2();
}
return;
}
void CPageDebug::OnBnClickedBtnWriteRegbuffer()
{
// TODO: 在此添加控件通知处理程序代码
// 需要输入:地址、数据
ULONG uBuffer[3];
Test_GetRegAddress(GetDlg()->GetDeviceHandle(), uBuffer);
ULONG uREGLen = uBuffer[2];
UpdateData();
int i;
ULONG uAddr = 0;
ULONG uData = 0;
for(i=0; i<m_strREGAddress.GetLength(); ++i)
{
char ch = m_strREGAddress.GetAt(i);
if (ch >= '0' && ch <= '9')
{
uAddr <<= 0x04;
uAddr += ch - '0';
}
else if (ch >= 'a' && ch <= 'f')
{
uAddr <<= 0x04;
uAddr += ch - 'a' + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
uAddr <<= 0x04;
uAddr += ch - 'A' + 10;
}
else
{
MessageBox("Must Input HEX data!");
GetDlgItem(IDC_EDIT_REGADDRESS)->SetFocus();
return;
}
}
uData = 0;
for(i=0; i<m_strREGData.GetLength(); ++i)
{
char ch = m_strREGData.GetAt(i);
if (ch >= '0' && ch <= '9')
{
uData <<= 0x04;
uData += ch - '0';
}
else if (ch >= 'a' && ch <= 'f')
{
uData <<= 0x04;
uData += ch - 'a' + 10;
}
else if(ch >= 'A' && ch <= 'F')
{
uData <<= 0x04;
uData += ch - 'A' + 10;
}
else
{
MessageBox("Must Input HEX data!");
GetDlgItem(IDC_EDIT_REGDATA)->SetFocus();
return;
}
}
if (uAddr >= uREGLen)
{
CString strInfor;
strInfor.Format("Address Overflow! MAX 0x%08X!", uREGLen);
MessageBox(strInfor);
GetDlgItem(IDC_EDIT_REGADDRESS)->SetFocus();
return;
}
if (uAddr & 0x03)
{
MessageBox("Addr must align32!");
GetDlgItem(IDC_EDIT_REGADDRESS)->SetFocus();
return;
}
//write
if (Test_WriteREG(GetDlg()->GetDeviceHandle(), uAddr, uData))
{
MessageBox("Write REG OK!");
}
else
{
MessageBox("Write REG Failed!");
}
return;
}
void CPageDebug::OnBnClickedBtnRefreshReg()
{
// TODO: 在此添加控件通知处理程序代码
ULONG uBuffer[3];
Test_GetRegAddress(GetDlg()->GetDeviceHandle(), uBuffer);
m_strREGBufferInfor.Format("Physical Addr: 0x%08X\nLogical Addr: 0x%08X\n Len: 0x%08X bytes", uBuffer[0], uBuffer[1], uBuffer[2]);
UpdateData(FALSE);
ULONG uData;
CString strTemp;
m_lbREGs.ResetContent();
// 最多显示16K
for(int i=0; i<16 * 1024 / sizeof(ULONG); ++i)
{
if (Test_ReadREG(GetDlg()->GetDeviceHandle(), i * sizeof(ULONG), uData))
{
strTemp.Format("%08X: %08X", i * sizeof(ULONG), uData);
m_lbREGs.AddString(strTemp);
}
else
{
break;
}
}
}
void CPageDebug::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -