📄 testusbcedlg.cpp
字号:
// TestUsbCeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestUsbCe.h"
#include "TestUsbCeDlg.h"
#include "Public.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestUsbCeDlg dialog
bool bconnectState = FALSE; //网络连接状态
const int deviceCode=20080810;
const int USB_BUF_LEN = 16384;
BYTE *pFileData = new BYTE[USB_BUF_LEN];
BYTE *pUSBBuf = new BYTE[USB_BUF_LEN];
CTestUsbCeDlg::CTestUsbCeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestUsbCeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestUsbCeDlg)
// 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_pReadProc = NULL;
}
void CTestUsbCeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestUsbCeDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestUsbCeDlg, CDialog)
//{{AFX_MSG_MAP(CTestUsbCeDlg)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestUsbCeDlg message handlers
HANDLE g_hUsbDev = NULL;
BOOL g_exit = FALSE;
#define BUFLEN 512
//------------------------------------------------
// Command define
// Run: 0xfe, 0xfe, 0xfe
// Exit: 0xff, 0xff, 0xff
//------------------------------------------------
BOOL WriteUsb(BYTE* data, int len)
{
DWORD dwRet = 0;
BOOL bRet = WriteFile(g_hUsbDev, data, BUFLEN, &dwRet, NULL);
if( bRet && dwRet )
return TRUE;
else
return FALSE;
}
UINT ReadProc(LPVOID param)
{
CTestUsbCeDlg* pDlg = (CTestUsbCeDlg*)param;
DWORD dwLen = 1024;
DWORD dwRet = 0;
int len=0;
len=100;
while( !g_exit )
{
BOOL bRet = ReadFile(g_hUsbDev, pUSBBuf, BUFLEN, &dwRet, NULL);
if( bRet )
{
TRACE(_T("Call Back OnRead!\r\n"));
if(pUSBBuf[0] != 0x68 ) //非正常数据包|| buf[len-1] != 0x16
{
;//return 0;
}
CString timeStr;
CTime thetime = CTime::GetCurrentTime();
timeStr.Format(_T("C:%2X_L:%d %02d:%02d"),pUSBBuf[6],dwLen,
thetime.GetMinute(),thetime.GetSecond());
//pDlg->SetDlgItemText(IDC_STA_TIME,timeStr);
switch(pUSBBuf[6])
{
case 0x01:
//pDlg->SetConnUsbState();
pDlg->UsbCommand(0x01,8);
break;
case 0x32:
pDlg->m_intFileSerialNum= pUSBBuf[7];
pDlg->UsbCommand(0x32,11);
break;
case 0x33:
pDlg->SaveApplication(pUSBBuf,dwLen);
break;
case 0x34:
pDlg->RenewApplication(pUSBBuf,dwLen);
break;
case 0x60:
break;
default:
break;
}
}
}
return 10;
}
BOOL CTestUsbCeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// 界面设置
MoveWindow(0,0,320,240);
SetCursorPos(320,240);
// TODO: Add extra initialization here
DirectoryCheck(DIR_PATH + _T("\\APPLICATION"),TRUE);
DirectoryCheck(DIR_PATH + _T("\\SYSTEM"),TRUE);
g_hUsbDev = CreateFile(
_T("RUB1:"), //LPCTSTR lpFileName,
GENERIC_READ|GENERIC_WRITE, //DWORD dwDesiredAccess,
0, //DWORD dwShareMode,
NULL, //LPSECURITY_ATTRIBUTES lpSecurityAttributes,
OPEN_EXISTING, //DWORD dwCreationDispostion,
FILE_ATTRIBUTE_NORMAL, //DWORD dwFlagsAndAttributes,
NULL //HANDLE hTemplateFile
);
if( g_hUsbDev == INVALID_HANDLE_VALUE )
{
g_hUsbDev = NULL;
TRACE(_T("Open usb device error.\n"));
return FALSE;
}
m_pReadProc = AfxBeginThread(ReadProc, this);
if( m_pReadProc == NULL )
{
AfxMessageBox(_T("AfxBeginThread error"));
return FALSE;
}
else
{
TRACE(_T("AfxBeginThread succeed.\n"));
}
BYTE cmd[3] = { 0xfe, 0xfe, 0xfe };
WriteUsb(cmd, 3);
SetTimer(1,1000,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestUsbCeDlg::OnDestroy()
{
CDialog::OnDestroy();
g_exit = TRUE;
if( m_pReadProc )
{
//---------------------------
// follow code is use for exit ReadUsbThread
BYTE cmd[3] = { 0xff, 0xff, 0xff };
WriteUsb(cmd, 3);
//---------------------------
WaitForSingleObject(m_pReadProc->m_hThread, 500);
m_pReadProc = NULL;
}
if( g_hUsbDev )
{
CloseHandle(g_hUsbDev);
g_hUsbDev = NULL;
}
if(pUSBBuf != NULL)
{
delete[]pUSBBuf;
pUSBBuf = NULL;
}
if(pFileData != NULL)
{
delete[]pFileData;
pFileData = NULL;
}
}
BOOL CTestUsbCeDlg::PreTranslateMessage(MSG* pMsg)
{
CString str;
BYTE out[BUFLEN];
BOOL bRet;
int i = 0;
switch( pMsg->message )
{
case WM_KEYDOWN:
str.Format(_T("Key down, KeyValue = %d\n"), pMsg->wParam);
TRACE(str);
switch(pMsg->wParam)
{
case KEY_BACK:
UsbCommand(0x01,8);
keyValue =1;
break;
case KEY_LEFT:
PostMessage(WM_CLOSE, 0, 0);
keyValue =2;
break;
case KEY_UP:
for( i = 0; i < BUFLEN; i++ )
out[i] = 2*i;
bRet = WriteUsb(out, BUFLEN);
if( bRet )
{
TRACE(_T("Write data succeed, len = %d.\n"), BUFLEN);
}
else
{
TRACE(_T("Write data error, error code is= %d.\n"), GetLastError());
}
keyValue =3;
break;
case KEY_FAST:
UpdateApplication();
break;
case KEY_DOWN:
keyValue =4;
break;
case KEY_RIGHT:
keyValue =5;
break;
case KEY_FUN:
keyValue =6;
break;
case KEY_OK:
keyValue =7;
break;
case KEY_0:
//ReadRFID();
keyValue =0;
break;
case KEY_1:
keyValue =0;
break;
case KEY_2:
keyValue =0;
break;
case KEY_3:
keyValue =0;
break;
case KEY_4:
keyValue =0;
break;
case KEY_5:
keyValue =0;
break;
case KEY_6:
keyValue =0;
break;
case KEY_7:
keyValue =0;
break;
case KEY_8:
keyValue =0;
break;
case KEY_9:
keyValue =0;
break;
case KEY_M:
keyValue =0; //. *
break;
case KEY_J:
keyValue =0; //#
break;
default:
break;
}
break;
case WM_KEYUP:
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CTestUsbCeDlg::SetConnUsbState()
{
// 更换图片
((CStatic*)GetDlgItem(IDC_PIC_CONN))->SetBitmap(NULL);
m_bmpConn.DeleteObject();
m_bmpConn.LoadBitmap(IDB_BITMAP1);
bconnectState = TRUE;
}
void CTestUsbCeDlg::UsbCommand(BYTE usbCommand, int usbLength)
{
BOOL bRet;
pFileData[0]=0x68;
pFileData[1]=deviceCode/1000000;
pFileData[2]=(deviceCode%1000000)/10000;
pFileData[3]=(deviceCode%10000)/100;
pFileData[4]=deviceCode%100;
pFileData[5]=0x68;
pFileData[6]=usbCommand;
switch(usbCommand)
{
case 0x01: //连接设备
break;
case 0x32:
pFileData[7]=0x01;
pFileData[8]=(BYTE)(m_intFileSerialNum>>0); //发送文件编码
pFileData[9]=(BYTE)(m_intFileSerialNum>>8);
if(appFile.Open(_T("\\My Documents\\temp.txt"),CFile::modeWrite|CFile::modeCreate))
{
appFile.Close();
}
break;
case 0x33:
pFileData[7]=uReceive;
break;
case 0x34:
pFileData[7]=uReceive;
case 0x60: //获取设备信息
break;
default:
break;
}
pFileData[usbLength-1]=0x16;
bRet = WriteUsb(pFileData, usbLength);
if (bRet)
{
TRACE(_T("Send OK!"));
}
else
{
TRACE(_T("Send Error!"));
}
}
void CTestUsbCeDlg::SaveApplication(PBYTE buf,DWORD len)
{
int length;
if(!appFile.Open(_T("\\My Documents\\temp.txt"),CFile::modeWrite))
{
uReceive = 0;
UsbCommand(0x33,9);
return;
}
length = Byte4ToInt(&buf[9]);
appFile.SeekToEnd();
appFile.Write(&buf[15],length-16);
appFile.Close();
uReceive = 1;
Sleep(4);
UsbCommand(0x33,9);
}
void CTestUsbCeDlg::RenewApplication(PBYTE buf,DWORD len)
{
int fileLength;
int programLength;
BYTE p[6];
BOOL bRet;
memcpy(p,&buf[9],4);
programLength = Byte4ToInt(p);
switch(m_intFileSerialNum)
{
case 1:
m_strFileName=_T("\\NandFlash\\APPLICATION\\AnGang.exe");
break;
case 2:
m_strFileName=_T("\\NandFlash\\Device.bmp");
break;
default:
m_strFileName.Format(_T("EC%d.txt"),m_intFileSerialNum);
break;
}
if(appFile.Open(_T("\\My Documents\\temp.txt"),CFile::modeRead))
{
fileLength = appFile.GetLength();
appFile.Close();
if(fileLength == programLength)
{
bRet = CopyFile(_T("\\My Documents\\temp.txt"),m_strFileName,FALSE);
if(bRet)
{
uReceive = 1;
bRet = DeleteFile(_T("\\My Documents\\temp.txt"));
}
else
{
uReceive = 0;
}
}
else
{
bRet = DeleteFile(_T("\\My Documents\\temp.txt"));
uReceive = 0;
}
}
else
{
uReceive = 0;
}
UsbCommand(0x34,9);
}
void CTestUsbCeDlg::IntTo4Byte(char *p,int nIndex)
{
p[0] = static_cast<char>(nIndex>>0);
p[1] = static_cast<char>(nIndex>>8);
p[2] = static_cast<char>(nIndex>>16);
p[3] = static_cast<char>(nIndex>>24);
}
int CTestUsbCeDlg::Byte4ToInt(const BYTE *p)
{
int result;
result = (p[0]<<0)+(p[1]<<8)+(p[2]<<16)+(p[3]<<24);
return result;
}
int CTestUsbCeDlg::Byte2ToInt(const BYTE *p)
{
int result;
result = p[1]<<8;
result += p[0];
return result;
}
void CTestUsbCeDlg::MainGoDirection()
{
TRACE(_T("MainGoDirection.\n"));
}
void CTestUsbCeDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetConnUsbState();
}
void CTestUsbCeDlg::UpdateApplication() //更新应用程序。
{
PROCESS_INFORMATION pi;
BOOL bRet = CreateProcess(_T("\\Windows\\StartUp.exe"), _T("\\Windows\\cplmain.cpl,13"),
NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
if(bRet)
{
PostMessage(WM_CLOSE,0,0);
}
}
void CTestUsbCeDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TimeDisplay();
CDialog::OnTimer(nIDEvent);
}
void CTestUsbCeDlg::TimeDisplay()
{
CString timeStr;
CTime thetime = CTime::GetCurrentTime();
timeStr.Format(_T("%02d-%02d %02d:%02d:%02d"),
thetime.GetMonth(),thetime.GetDay(),thetime.GetHour(),
thetime.GetMinute(),thetime.GetSecond());
if(lastSecond != thetime.GetSecond())
{
SetDlgItemText(IDC_Time,timeStr);
}
lastSecond = thetime.GetSecond();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -