📄 usbadcserverdlg.cpp
字号:
// 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 + -