⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hidusbview.cpp

📁 USB 通用驱动程序
💻 CPP
字号:
// HIDUSBView.cpp : CHIDUSBView 类的实现
//

#include "stdafx.h"
#include "HIDUSB.h"

#include "HIDUSBDoc.h"
#include "HIDUSBView.h"
#include ".\hidusbview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#include "commandmgr\commgr.h"


// CHIDUSBView

IMPLEMENT_DYNCREATE(CHIDUSBView, CView)

BEGIN_MESSAGE_MAP(CHIDUSBView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_COMMAND(ID_RUN, OnRun)
	ON_COMMAND(ID_STOP, OnStop)
	ON_COMMAND(ID_KEY_VALUE_TEST, OnKeyValueTest)
	ON_COMMAND(ID_DEVICE_OUTPUT_TEST, OnDeviceOutputTest)
END_MESSAGE_MAP()

// CHIDUSBView 构造/析构

CHIDUSBView::CHIDUSBView() : m_pThread(NULL), m_pComMgr(NULL), m_bHasRun(false)
{
	// TODO: 在此处添加构造代码

}

CHIDUSBView::~CHIDUSBView()
{
	if(m_pComMgr != NULL)
	{
		delete m_pComMgr;

		m_pComMgr = NULL;
	}
}




BOOL CHIDUSBView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式

	return CView::PreCreateWindow(cs);
}


// CHIDUSBView 绘制

void CHIDUSBView::OnDraw(CDC* /*pDC*/)
{
	CHIDUSBDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
}


// CHIDUSBView 打印

BOOL CHIDUSBView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CHIDUSBView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印前添加额外的初始化
}

void CHIDUSBView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印后添加清除过程
}


// CHIDUSBView 诊断

#ifdef _DEBUG
void CHIDUSBView::AssertValid() const
{
	CView::AssertValid();
}

void CHIDUSBView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CHIDUSBDoc* CHIDUSBView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHIDUSBDoc)));
	return (CHIDUSBDoc*)m_pDocument;
}
#endif //_DEBUG



#define TEST_BEGIN_CHECK()			if(m_pComMgr != NULL){		\
		::MessageBox(NULL, "The program has already been running!", "Attention", MB_OK);	\
		m_bHasRun = false;				\
		return;		\
	}				\
	m_pComMgr = new ComManager();		\
	if(m_pComMgr == NULL)	{			\
		::MessageBox(NULL, "Error occurred during initialization: lack of memory!", "Fatal Error", MB_OK);	\
		m_bHasRun = false;				\
		return;		\
	}				\
	if(!m_pComMgr->CmdInit())	{		\
		delete m_pComMgr;				\
		m_pComMgr = NULL;				\
		m_bHasRun = false;				\
		return;							\
	}


// CHIDUSBView 消息处理程序

void CHIDUSBView::OnRun()
{
	// TODO: 在此添加命令处理程序代码
	if(m_bHasRun)
	{
		::MessageBox(NULL, "The programming has been running!", "Warning", MB_OK);

		return;
	}

	m_bHasRun = true;

	TEST_BEGIN_CHECK();

	::MessageBox(NULL, "Program starts!", "Attention", MB_OK);

	m_pThread = AfxBeginThread(&USBCommunicate, this);
}



UINT CHIDUSBView::USBCommunicate(LPVOID lpArg)
{
	CHIDUSBView *pView = (CHIDUSBView*)lpArg;

	ComManager *pComMgr = pView->m_pComMgr;

	while(TRUE)
	{
		if(!pComMgr->ReceiveCmdAndSendRespond())
		{
			::MessageBox(NULL, "The program exits abnormally", "Warning", MB_OK);

			AfxEndThread(pView->m_pThread->m_nThreadID, TRUE);
		}
		else
			Sleep(10);
	}

	return TRUE;
}



void CHIDUSBView::OnStop()
{
	// TODO: 在此添加命令处理程序代码
	if(m_pThread)
	{
		::TerminateThread(m_pThread->m_hThread, m_pThread->m_nThreadID);

		m_pThread->Delete();

		m_pThread = NULL;
	}

	if(m_pComMgr)
	{
		if(!m_pComMgr->EndCmdTransfer())
		{
			::MessageBox(NULL, "The USB communication cannot be terminated now! Please try again later!", "Warning", MB_OK);

			return;
		}

		delete m_pComMgr;

		m_pComMgr = NULL;
	}

	m_bHasRun = false;

	::MessageBox(NULL, "This program stops!", "Attendtion", MB_OK);
}


#include "KeyReceptDlg.h"


void CHIDUSBView::OnKeyValueTest()
{
	// TODO: 在此添加命令处理程序代码
	if(m_bHasRun)
	{
		::MessageBox(NULL, "The programming has been running!", "Warning", MB_OK);

		return;
	}

	m_bHasRun = true;

	CKeyReceptDlg dlg;

	dlg.DoModal();

	m_bHasRun = false;
}



void CHIDUSBView::OnDeviceOutputTest()
{
	// TODO: 在此添加命令处理程序代码
	if(m_bHasRun)
	{
		::MessageBox(NULL, "The programming has been running!", "Warning", MB_OK);

		return;
	}

	m_bHasRun = true;

	// Add dlg.DoModal() here

	m_bHasRun = false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -