📄 rtmdemodlg.cpp
字号:
// RtmDemoDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RtmDemo.h"
#include "RtmDemoDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRtmDemoDlg dialog
CRtmDemoDlg::CRtmDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CRtmDemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CRtmDemoDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_dport=_T("0x37a");
m_aport=_T("0x2f8");
m_dmask = _T("0x4");
m_arange = _T("0xffff");
m_bdbyte = 0;
m_babyte = 0;
m_bdoutput = TRUE;
m_baoutput = TRUE;
m_dquantum = 500;
m_aquantum = 500;
bStartStop = 0;
m_pciiItem = -1;
m_resiItem = -1;
m_tmresolution = 200;
}
void CRtmDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_listpci);
DDX_Control(pDX, IDC_LIST2, m_listres);
DDX_Text(pDX,IDC_DEDIT_PORT,m_dport);
DDX_Text(pDX,IDC_AEDIT_PORT,m_aport);
DDX_Text(pDX,IDC_DEDIT_MASK,m_dmask);
DDX_Text(pDX,IDC_AEDIT_RANGE,m_arange);
DDX_Text(pDX,IDC_DEDIT_QUANTUM,m_dquantum);
DDX_Text(pDX,IDC_AEDIT_QUANTUM,m_aquantum);
DDX_Text(pDX,IDC_RTM_DEBUG,m_bdebug);
//{{AFX_DATA_MAP(CRtmDemoDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRtmDemoDlg, CDialog)
//{{AFX_MSG_MAP(CRtmDemoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_EN_CHANGE(IDC_DEDIT_MASK, OnChangeDeditMask)
ON_BN_CLICKED(IDSTARTTIMER, OnStarttimer)
ON_BN_CLICKED(IDSTOPTIMER, OnStoptimer)
ON_BN_CLICKED(IDC_ARADIO_OUTPUT, OnAradioOutput)
ON_BN_CLICKED(IDC_DRADIO_INPUT, OnDradioInput)
ON_BN_CLICKED(IDC_DRADIO_OUTPUT, OnDradioOutput)
ON_BN_CLICKED(IDC_ARADIO_INPUT, OnAradioInput)
ON_WM_TIMER()
ON_WM_CLOSE()
ON_CBN_SELCHANGE(IDC_COMBO_D_SIZE,OnSelDChangeCombo)
ON_CBN_SELCHANGE(IDC_COMBO_A_SIZE,OnSelAChangeCombo)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1,OnSelChangePCIList)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST2,OnSelChangePCIResList)
ON_BN_CLICKED(IDC_ABOUT, OnAbout)
ON_BN_CLICKED(IDC_BUTTON_PCIREAD, OnButtonPciread)
ON_BN_CLICKED(IDC_BUTTON_PCIWRITE, OnButtonPciwrite)
ON_BN_CLICKED(IDC_BUTTON_ASSIGN_RES, OnButtonAssignRes)
ON_BN_CLICKED(IDC_BUTTON_RELEASE, OnButtonReleaseRes)
ON_BN_CLICKED(IDC_RTM_DEBUG, OnRtmDebug)
ON_BN_CLICKED(IDC_BUTTON_UPDATEPCI, OnButtonUpdatepci)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CRtmDemoDlg::SetCombobox(CComboBox* pBox)
{
ASSERT(pBox != NULL);
if (pBox != NULL)
{
pBox->AddString(_T("byte"));
pBox->AddString(_T("word"));
pBox->AddString(_T("dword"));
pBox->SetCurSel(0);
}
}
/////////////////////////////////////////////////////////////////////////////
// CRtmDemoDlg message handlers
char pcibuff[0x4000] = {0};
BOOL CRtmDemoDlg::OnInitDialog()
{
int count;
char buff[10];
CDialog::OnInitDialog();
((CButton *)GetDlgItem(IDC_DRADIO_OUTPUT))->SetCheck(1);
((CButton *)GetDlgItem(IDC_ARADIO_OUTPUT))->SetCheck(1);
((CButton *)GetDlgItem(IDC_RTM_DEBUG))->SetCheck(0);
CComboBox* pBox;
pBox = (CComboBox*) GetDlgItem(IDC_COMBO_D_SIZE);
SetCombobox(pBox);
pBox = (CComboBox*) GetDlgItem(IDC_COMBO_A_SIZE);
SetCombobox(pBox);
pBox = (CComboBox*) GetDlgItem(IDC_COMBO_RW_SIZE);
SetCombobox(pBox);
FillListCtrl();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
if(RTXEntry(0))
{
sprintf(buff,"%d us",GetQuantum());//pfGetQuantum());
SetDlgItemText(IDC_RTM_TIMER,buff);
count = ScanPci(pcibuff);
if(count)
{
FillPCI(pcibuff,count);
}
}
else
::MessageBox(NULL,_T("RTM drive is not installed"),_T("RTM"),MB_OK);
((CButton *)GetDlgItem(IDSTARTTIMER))->SetFocus();
return FALSE;//TRUE; // return TRUE unless you set the focus to a control
}
void CRtmDemoDlg::FillPCI(char *pcib,int count)
{
int iItem;
LV_ITEM lvItem;
char buffstr[32];
PCIINFO *pci;
pci = (PCIINFO *)pcib;
m_listpci.DeleteAllItems();
for (iItem = 0; iItem < count; iItem++)
{
lvItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
lvItem.state = 0;
lvItem.stateMask = 0;
lvItem.iImage = 0;
lvItem.lParam = (long)pci;
lvItem.iItem = iItem;
lvItem.iSubItem = 0;
sprintf(buffstr,"%d",pci->bus);
lvItem.pszText =(LPTSTR)buffstr;
m_listpci.InsertItem(&lvItem);
sprintf(buffstr,"%d",pci->slot.u.bits.DeviceNumber);
m_listpci.SetItemText(iItem, 1,buffstr);
sprintf(buffstr,"%d",pci->slot.u.bits.FunctionNumber);
m_listpci.SetItemText(iItem, 2,buffstr);
sprintf(buffstr,"%x",pci->pcidata.VendorID);
m_listpci.SetItemText(iItem, 3,buffstr);
sprintf(buffstr,"%x",pci->pcidata.DeviceID);
m_listpci.SetItemText(iItem, 4,buffstr);
if(!iItem)
{
FillPciResource(pci);
if(pci->pcidata.VendorID ==0x8086)
PCIButtonEnable(FALSE);
else
PCIButtonEnable(TRUE);
}
pci++;
}
}
void CRtmDemoDlg::FillPciResource(PCIINFO *pci)
{
PPCI_COMMON_CONFIG pciData = &pci->pcidata;
char buffstr[32];
unsigned addr;
int i = 0;
int nmax = 0;
int nirq =0;
int iItem = 0;
LV_ITEM lvItem;
m_listres.DeleteAllItems();
if(pciData->HeaderType == PCI_DEVICE_TYPE || pciData->HeaderType == PCI_MULTIFUNCTION){
nmax = PCI_MAX_BAR;
nirq = pciData->u.type0.InterruptLine;
}
else
if(pciData->HeaderType == PCI_BRIDGE_TYPE){
nirq = pciData->u.type1.InterruptLine;
nmax = 2;
}
for(iItem = 0;iItem<nmax;iItem++)
{
addr = pciData->u.type0.BaseAddresses[iItem];
if(!addr) continue;
lvItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
lvItem.state = 0;
lvItem.stateMask = 0;
lvItem.iImage = 0;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.pszText =(LPTSTR)"";
lvItem.lParam = (long)pciData;
m_listres.InsertItem(&lvItem);
if((addr & 0x1))
{
m_listres.SetItemText(i,0,"Port");
addr &= 0xfffffffc;
}
else
{
m_listres.SetItemText(i,0,"Memory");
addr &= 0xfffffff0;
}
addr &= 0xfffffffe;
sprintf(buffstr,"%x",addr);
lvItem.pszText =(LPTSTR)buffstr;
m_listres.SetItemText(i,1,buffstr);
sprintf(buffstr,"%x",pci->BaseAddressesSize[iItem]);
lvItem.pszText =(LPTSTR)buffstr;
m_listres.SetItemText(i,2,buffstr);
i++;
}
if(nirq)
{
lvItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
lvItem.state = 0;
lvItem.stateMask = 0;
lvItem.iImage = 0;
lvItem.iItem = i;
lvItem.iSubItem = 0;
lvItem.pszText =(LPTSTR)"";
lvItem.lParam = (long)pciData;
m_listres.InsertItem(&lvItem);
m_listres.SetItemText(i,0,"IRQ");
m_listres.SetItemText(i,3,buffstr);
sprintf(buffstr,"%d",nirq);
lvItem.pszText =(LPTSTR)buffstr;
m_listres.SetItemText(i,3,buffstr);
}
m_listres.UpdateData(TRUE);
}
void CRtmDemoDlg::FillListCtrl()
{
CRect rect;
// insert two columns (REPORT mode) and modify the new header items
m_listpci.GetWindowRect(&rect);
m_listpci.InsertColumn(0, _T("Bus"), LVCFMT_LEFT,rect.Width() * 1/7, 0);
m_listpci.InsertColumn(1, _T("DevNo"), LVCFMT_LEFT,rect.Width() * 1/7, 1);
m_listpci.InsertColumn(2, _T("Function"), LVCFMT_LEFT,rect.Width() * 1/7, 1);
m_listpci.InsertColumn(3, _T("VendorID"), LVCFMT_LEFT,rect.Width() * 1/4, 1);
m_listpci.InsertColumn(4, _T("DeviceID"), LVCFMT_LEFT,rect.Width() * 1/4, 1);
m_listpci.SetExtendedStyle(LVS_EX_FULLROWSELECT );//| LVS_EX_FLATSB);
m_listres.GetWindowRect(&rect);
m_listres.InsertColumn(0, _T("Type"), LVCFMT_LEFT,rect.Width() * 4/18, 0);
m_listres.InsertColumn(1, _T("Address"), LVCFMT_LEFT,rect.Width() * 4/15, 0);
m_listres.InsertColumn(2, _T("Size"), LVCFMT_LEFT,rect.Width() * 4/15, 1);
m_listres.InsertColumn(3, _T("Number"), LVCFMT_LEFT,rect.Width() * 4/23, 0);
m_listres.SetExtendedStyle(LVS_EX_FULLROWSELECT );//| LVS_EX_FLATSB);
}
void CRtmDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -