?? canmonitorview.cpp
字號:
// CanMonitorView.cpp : CCanMonitorView 類的實現
//
#include "stdafx.h"
#include "CanMonitor.h"
#include "CanMonitorDoc.h"
#include "CanMonitorView.h"
#include "ControlCAN.h"
#include "CanCardDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
UINT CanSnifferThread( LPVOID pParam );
unsigned int CanCardType = 0x0;
unsigned int CanCardIndex = 0x0;
unsigned int CanCardPort = 0x0;
unsigned int CanPortTseg0 = 0x0;
unsigned int CanPortTseg1 = 0x0;
unsigned int CanPortFltType = 0x0;
unsigned int CanPortWorkMode = 0x0;
unsigned int CanPortAcc = 0x0;
unsigned int CanPortMask = 0x0ffffffff;
// CCanMonitorView
IMPLEMENT_DYNCREATE(CCanMonitorView, CListView)
BEGIN_MESSAGE_MAP(CCanMonitorView, CListView)
ON_COMMAND(ID_CAPTURE_RUN, &CCanMonitorView::OnCaptureRun)
ON_UPDATE_COMMAND_UI(ID_CAPTURE_RUN, &CCanMonitorView::OnUpdateCaptureRun)
ON_COMMAND(ID_EDIT_CLEAR, &CCanMonitorView::OnEditClear)
END_MESSAGE_MAP()
// CCanMonitorView 構造/析構
CCanMonitorView::CCanMonitorView()
: m_menuFlag(0)
, m_iIndex(0)
{
// TODO: 在此處添加構造代碼
m_menuFlag = 0;
m_iIndex = 0;
}
CCanMonitorView::~CCanMonitorView()
{
m_menuFlag = 0;
}
BOOL CCanMonitorView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此處通過修改
// CREATESTRUCT cs 來修改窗口類或樣式
cs.style |= LVS_REPORT;
return CListView::PreCreateWindow(cs);
}
void CCanMonitorView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl& theListCtrl = GetListCtrl();
DWORD dwStyle = theListCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;
dwStyle |= LVS_EX_GRIDLINES;
theListCtrl.SetExtendedStyle(dwStyle);
theListCtrl.InsertColumn(0,_T("消息序號"),LVCFMT_CENTER,80);
theListCtrl.InsertColumn(1,_T("CAN標識"),LVCFMT_CENTER,120);
theListCtrl.InsertColumn(2,_T("時間戳"),LVCFMT_CENTER,120);
theListCtrl.InsertColumn(3,_T("遠程幀"),LVCFMT_CENTER,80);
theListCtrl.InsertColumn(4,_T("擴展幀"),LVCFMT_CENTER,80);
theListCtrl.InsertColumn(5,_T("幀長度"),LVCFMT_CENTER,65);
theListCtrl.InsertColumn(6,_T("幀數據"),LVCFMT_CENTER,230);
for(int idx=0;idx<1000;idx++)
{
theListCtrl.InsertItem(idx,_T(" "));
}
// TODO: 調用 GetListCtrl() 直接訪問 ListView 的列表控件,
// 從而可以用項填充 ListView。
}
// CCanMonitorView 診斷
#ifdef _DEBUG
void CCanMonitorView::AssertValid() const
{
CListView::AssertValid();
}
void CCanMonitorView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CCanMonitorDoc* CCanMonitorView::GetDocument() const // 非調試版本是內聯的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCanMonitorDoc)));
return (CCanMonitorDoc*)m_pDocument;
}
#endif //_DEBUG
// CCanMonitorView 消息處理程序
void CCanMonitorView::OnCaptureRun()
{
if(m_menuFlag == 0)
{
CanCardDlg theDlg;
if(theDlg.DoModal() == IDOK)
{
CanCardType = theDlg.m_iCanCardType;
CanCardIndex = theDlg.m_iCanCardIndex;
CanCardPort = theDlg.m_iCanCardPort;
CanPortTseg0 = theDlg.m_iCanBitTseg0;
CanPortTseg1 = theDlg.m_iCanBitTseg1;
CanPortFltType = theDlg.m_iCanFltMode;
CanPortWorkMode = theDlg.m_iCanWorkMode;
CanPortAcc = theDlg.m_iCanFltAcc;
CanPortMask = theDlg.m_iCanFltMask;
}
else
{
return ;
}
m_menuFlag = 1;
AfxBeginThread(CanSnifferThread,this);
}
else
{
m_menuFlag = 0;
}
// TODO: 在此添加命令處理程序代碼
}
void CCanMonitorView::OnUpdateCaptureRun(CCmdUI *pCmdUI)
{
if(m_menuFlag == 0)
{
pCmdUI->SetText(_T("啟動(&S)"));
}
else
{
pCmdUI->SetText(_T("停止(&S)"));
}
// TODO: 在此添加命令更新用戶界面處理程序代碼
}
UINT CanSnifferThread( LPVOID pParam )
{
CCanMonitorView* pView = (CCanMonitorView*) pParam;
CListCtrl& theListCtrl = pView->GetListCtrl();
VCI_CAN_OBJ frameinfo[500];
VCI_ERR_INFO errinfo;
VCI_INIT_CONFIG init_config;
int len = 1;
CString str;
init_config.AccCode = CanPortAcc;
init_config.AccMask = CanPortMask;
init_config.Filter = CanPortFltType;
init_config.Mode = CanPortWorkMode;
init_config.Timing0 = CanPortTseg0;
init_config.Timing1 = CanPortTseg1;
if(VCI_OpenDevice(CanCardType,CanCardIndex,0)!=STATUS_OK)
{
AfxMessageBox(_T("打開設備失敗!"));
return 0;
}
if(VCI_InitCAN(CanCardType,CanCardIndex,CanCardPort,&init_config)!=STATUS_OK)
{
AfxMessageBox(_T("初始化CAN失敗!"));
VCI_CloseDevice(CanCardType,CanCardIndex);
return 0;
}
if(VCI_ResetCAN(CanCardType,CanCardIndex,CanCardPort)!=1)
{
AfxMessageBox(_T("CAN控制器復位失敗!"));
VCI_CloseDevice(CanCardType,CanCardIndex);
return 0;
}
if(VCI_StartCAN(CanCardType,CanCardIndex,CanCardPort)!=1)
{
AfxMessageBox(_T("CAN控制器啟動失敗!"));
VCI_CloseDevice(CanCardType,CanCardIndex);
return 0;
}
while( pView->m_menuFlag == 1 )
{
len=VCI_Receive(CanCardType,CanCardIndex,CanCardPort,frameinfo,500,600);
if(len<=0)
{
VCI_ReadErrInfo(CanCardType,CanCardIndex,CanCardPort,&errinfo);
}
else
{
for(int i=0;i<len;i++)
{
str.Format(_T("%04d"),pView->m_iIndex);
theListCtrl.SetItemText(pView->m_iIndex,0,str);
str.Format(_T("%08x"),frameinfo[i].ID);
theListCtrl.SetItemText(pView->m_iIndex,1,str);
if(frameinfo[i].TimeFlag == 0)
{
str.Format(_T("無時間信息"));
}
else
{
str.Format(_T("%08x"),frameinfo[i].TimeStamp);
}
theListCtrl.SetItemText(pView->m_iIndex,2,str);
if(frameinfo[i].RemoteFlag == 0)
{
str.Format(_T("數據幀"));
}
else
{
str.Format(_T("遠程幀"));
}
theListCtrl.SetItemText(pView->m_iIndex,3,str);
if(frameinfo[i].ExternFlag == 0)
{
str.Format(_T("標準幀"));
}
else
{
str.Format(_T("擴展幀"));
}
theListCtrl.SetItemText(pView->m_iIndex,4,str);
str.Format(_T("%02d"),frameinfo[i].DataLen);
theListCtrl.SetItemText(pView->m_iIndex,5,str);
str.Empty();
for(int j=0;j<frameinfo[i].DataLen;j++)
{
CString strTmp;
strTmp.Format(_T("%02x "),frameinfo[i].Data[j]);
str+=strTmp;
}
theListCtrl.SetItemText(pView->m_iIndex,6,str);
pView->m_iIndex ++;
if(pView->m_iIndex>=1000)pView->m_iIndex = 0;
}
}
}
VCI_CloseDevice(CanCardType,CanCardIndex);
return 1;
}
void CCanMonitorView::OnEditClear()
{
// TODO: 在此添加命令處理程序代碼
CListCtrl& theListCtrl = GetListCtrl();
for(int i=0;i<1000;i++)
{
for(int j=0;j<7;j++)
{
theListCtrl.SetItemText(i,j,_T(" "));
}
}
m_iIndex = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -