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

📄 usbadcserverdlg.cpp

📁 USB设备在人体工学接口模式驱动的设备读写通讯程序.在TMS32F103上测试通过
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// USBADCserverDlg.cpp : implementation file
//

#include "stdafx.h"		//需要定义   #define	WINVER 0x0500


//////
#include "WinApi\hidsdi++.h"
#include "WinApi\hid.h"
#include "WinApi\setupapi.h"
#include "WinApi\usb100.h"
#include "ini.h"

#include "DBT.h"

#include "USBADCserver.h"
#include "USBADCserverDlg.h"

#include "time.h"
#include <process.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

typedef		unsigned long		u32;
typedef		unsigned short		u16;
typedef		unsigned char		u8;


#define		TIMER_CLOCK				1
#define		TIMER_DEVICE			2
#define		TIMER_AUTOS				3
#define		TIMER_RECV				4

#define		TIME_CLOCK				1000
#define		TIME_DEVICE				200
#define		TIME_RECV				200

#define		IN_REPORTS_NUM				1024

//////
GUID		pGuid;
HANDLE		hHidDevice;
HIDP_CAPS	pDevCapabilities;

HANDLE		hWriteThread;
DWORD		WriteThreadId;


BYTE		InputReport[IN_REPORTS_NUM][1024];
BYTE		OutputReport[1024];

#define		FILE_MAX_SIZE		((DWORD)128*1024*1024)
#define		FILE_PAGE_SIZE		((DWORD)16*1024)
BYTE		FileBuffer[FILE_MAX_SIZE + 2];
DWORD		FilePos;

DWORD		dReportsSent	=0;
DWORD		dReportsRecv	=0;

BOOL		WRITE_ROPRT = FALSE;
BOOL		ThreadOpened= FALSE;
BOOL		bThreadGoing= FALSE ;
BOOL		bAutoClear	= FALSE;

CFile		pDataFile;

u16			StringToHex(u8 *str,u8 *hex,u16 len);

/**********************************************************************************************************************/
#define IDM_RECV_DATA    (WM_USER + 1)
#define IDM_SEND_DATA    (WM_USER + 2)

void __cdecl RecvThreadFunction(HANDLE hHidDevice);

/**********************************************************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
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()

/////////////////////////////////////////////////////////////////////////////
// CUSBADCserverDlg dialog

CUSBADCserverDlg::CUSBADCserverDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CUSBADCserverDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUSBADCserverDlg)
	m_vSend		= _T("");
	m_vRecv		= _T("");
	m_vUsbName = _T("");
	m_vUsbsn	= _T("");
	m_vClock	= _T("");
	m_vAutoC	= FALSE;
	m_vAutoS	= FALSE;
	m_iPeriod	= 1000;
	m_vCntr		= _T("0");
	m_vCnts		= _T("0");
	m_bRfile = FALSE;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUSBADCserverDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUSBADCserverDlg)
	DDX_Control(pDX, IDC_CHECK_RFILE, m_cRfile);
	DDX_Control(pDX, IDC_CNT_SENT, m_cCnts);
	DDX_Control(pDX, IDC_CNT_RECV, m_cCntr);
	DDX_Control(pDX, IDC_EDIT_PERIOD, m_cPeriod);
	DDX_Control(pDX, IDC_CHECK_AUTOS, m_cAutoS);
	DDX_Control(pDX, IDC_CHECK_AUTOC, m_cAutoC);
	DDX_Control(pDX, IDC_SENT, m_cSend);
	DDX_Control(pDX, IDC_RECV, m_cRecv);	
	DDX_Text(pDX, IDC_SENT, m_vSend);
	DDX_Text(pDX, IDC_RECV, m_vRecv);
	DDX_Control(pDX, IDC_USB_STATE, m_cUsbState);
	DDX_Control(pDX, IDC_USB_SN, m_cUsbsn);
	DDX_Control(pDX, IDC_CLOCK, m_cClock);
	DDX_Text(pDX, IDC_USB_STATE, m_vUsbName);
	DDX_Text(pDX, IDC_USB_SN, m_vUsbsn);
	DDX_Text(pDX, IDC_CLOCK, m_vClock);	
	DDX_Check(pDX, IDC_CHECK_AUTOC, m_vAutoC);
	DDX_Check(pDX, IDC_CHECK_AUTOS, m_vAutoS);
	DDX_Text(pDX, IDC_EDIT_PERIOD, m_iPeriod);
	DDX_Text(pDX, IDC_CNT_RECV, m_vCntr);
	DDX_Text(pDX, IDC_CNT_SENT, m_vCnts);
	DDX_Check(pDX, IDC_CHECK_RFILE, m_bRfile);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CUSBADCserverDlg, CDialog)
	//{{AFX_MSG_MAP(CUSBADCserverDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_MESSAGE(IDM_RECV_DATA, OnReceivedData)
	ON_BN_CLICKED(IDC_BTN_MANUAL, OnBtnManual)
	ON_BN_CLICKED(IDC_BTN_SFILE, OnBtnSfile)
	ON_BN_CLICKED(IDC_CHECK_RFILE, OnCheckRfile)
	ON_BN_CLICKED(IDC_BTN_RCLR, OnBtnRclear)
	ON_BN_CLICKED(IDC_CHECK_AUTOS, OnCheckAutos)
	ON_BN_CLICKED(IDC_CHECK_AUTOC, OnCheckAutoc)
	ON_BN_CLICKED(IDC_BTN_CLEAR, OnBtnClear)
	ON_BN_CLICKED(IDC_OK, OnOk)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUSBADCserverDlg message handlers

BOOL CUSBADCserverDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 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

	//////
	DEV_BROADCAST_DEVICEINTERFACE filter = {0};
	filter.dbcc_size = sizeof(filter);
	filter.dbcc_devicetype  = DBT_DEVTYP_DEVICEINTERFACE;

	HidD_GetHidGuid(&pGuid);
	filter.dbcc_classguid = pGuid;
	RegisterDeviceNotification(m_hWnd,(PVOID)&filter,DEVICE_NOTIFY_WINDOW_HANDLE);
	//////

	//CreateThreadWR();

	SetTimer(TIMER_CLOCK,TIME_CLOCK,NULL);	
	SetTimer(TIMER_DEVICE,TIME_DEVICE,NULL);
	SetTimer(TIMER_RECV,TIME_RECV,NULL);

	bThreadGoing	 = TRUE;
	ThreadOpened = FALSE;
	for(long i=0;i<FILE_MAX_SIZE;i++)FileBuffer[i]=0;
	FilePos = 0;
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CUSBADCserverDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CUSBADCserverDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CUSBADCserverDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
void CUSBADCserverDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default

	switch(nIDEvent){
		case TIMER_CLOCK	:		//更新时钟
							SYSTEMTIME st;
							GetLocalTime(&st);
							m_vClock.Format("%04d年%02d月%02d日\r\n\r\n%02d:%02d:%02d",
									st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);	
							m_cClock.SetWindowText(m_vClock);
		break;	
		case TIMER_DEVICE	:		//检查设备状态							
							RefreshDevice();
							m_cUsbsn.SetWindowText(m_vUsbsn);
							m_cUsbState.SetWindowText(m_vUsbName);
							
		break;
		case TIMER_AUTOS	:
							OnBtnManual();
		break;
		case TIMER_RECV		:
							if(m_vRold != m_vRecv){
								m_cRecv.SetWindowText(m_vRecv);
								m_vRold = m_vRecv;
							}
							m_vCntr.Format("%d",dReportsRecv);
							m_cCntr.SetWindowText(m_vCntr);
		break;
	
	}
		
	CDialog::OnTimer(nIDEvent);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
void CUSBADCserverDlg::RefreshDevice()
{
	char	Product[256];
	CString	Prod,tmpString;
	CString	DevicePath,DeviceSN;

	HDEVINFO hDevInfo;
	hDevInfo = SetupDiGetClassDevs(&pGuid,NULL,NULL,DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

	if(hDevInfo != INVALID_HANDLE_VALUE){
		DWORD DevIndex;
		SP_INTERFACE_DEVICE_DATA	ifData;
		ifData.cbSize = sizeof(ifData);

		for(DevIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&pGuid,DevIndex,&ifData);++DevIndex){
			DWORD needed;
			SetupDiGetDeviceInterfaceDetail(hDevInfo,&ifData,NULL,0,&needed,NULL);
			
			PSP_INTERFACE_DEVICE_DETAIL_DATA	detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)new BYTE[needed];
			detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

⌨️ 快捷键说明

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