📄 liuqiuliangview.cpp
字号:
// liuqiuliangView.cpp : implementation of the CLiuqiuliangView class
//
#include "stdafx.h"
#include "liuqiuliang.h"
#include "liuqiuliangDoc.h"
#include "liuqiuliangView.h"
#include "CyAPI.h"
#include "cyioctl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
CCyControlEndPoint *ept; //定义控制端点
CFile mFile; //文件
UINT ReadThreadLoop( LPVOID params ) { //线程处理
bool okin;
CLiuqiuliangView* pView;
pView = (CLiuqiuliangView*)params;
OVERLAPPED inOvLap;
LONG inlen=1024;
PUCHAR inData = new UCHAR[1024]; //数据缓冲区
unsigned short* nData =new unsigned short[512];
ZeroMemory(inData,sizeof(UCHAR)*inlen);
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
// ept->TimeOut = 0;
int epCnt=pView->USBDevice->EndPointCount();
pView->InEndpt=pView->USBDevice->EndPoints[1];
pView->InEndpt->TimeOut = 1000;
for (;pView->ReadThreadLooping ;) //循环
{
okin = pView->InEndpt-> XferData(inData,inlen);
int j =0;
for(int i=0;i<512;i++)
{
nData[i] = inData[j];
j++;
nData[i] += inData[j]<<8;
j++;
}
//异步读数据
// UCHAR *inContext = ept->BeginDataXfer(inData,inlen,&inOvLap);
// ept->WaitForXfer(&inOvLap,200);
// okin = ept->FinishDataXfer(inData,inlen, &inOvLap,inContext);
if (okin) //如果读取成功,则保存数据
{
// mFile.SeekToEnd();
// mFile.Write(inData,inlen);
pView->m_pCanvas->DrawBack(RGB(0,0,0));
pView->m_pCanvas->DrawXGrid(RGB(255,255,255),10);
pView->m_pCanvas->DrawYGrid(RGB(255,255,255),10);
// pView->InvalidateRect(&pView->m_rcDraw,FALSE);
pView->m_pCanvas->SetXRange(0, 512);
pView->m_pCanvas->SetYRange(0, 65536);
pView->m_pCanvas->DrawPoly(nData,512, RGB(255,255,0), 0);
pView->InvalidateRect(&pView->m_rcDraw,FALSE);
// pView->UpdateData(FALSE);
}
}
//结束Start
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0xAB; //请求码
ept->Value = 0;
ept->Index = 0;
PUCHAR buf=new UCHAR[2];
ZeroMemory(buf, 2);
LONG buflen = 2;
buf[0]=0xAB;
buf[1]=0x00; //结束Start
ept->XferData(buf,buflen);
CloseHandle(inOvLap.hEvent);
delete [] inData;
delete [] nData;
delete buf;
pView->ReadThread = NULL; //线程结束
pView->USBDevice->Close(); //关闭USB设备
// mFile.Flush(); //关闭文件
// mFile.Close();
return true;
}
/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView
IMPLEMENT_DYNCREATE(CLiuqiuliangView, CFormView)
BEGIN_MESSAGE_MAP(CLiuqiuliangView, CFormView)
//{{AFX_MSG_MAP(CLiuqiuliangView)
ON_BN_CLICKED(IDC_BUTTON_DRAW, OnButtonDraw)
ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_BN_CLICKED(IDC_BUTTON_SENDDATA, OnButtonSenddata)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView construction/destruction
CLiuqiuliangView::CLiuqiuliangView()
: CFormView(CLiuqiuliangView::IDD)
{
//{{AFX_DATA_INIT(CLiuqiuliangView)
m_nData = 0;
m_nCounter = 0;
//}}AFX_DATA_INIT
// TODO: add construction code here
m_pCanvas = new CCoordinate();
DataArray = new unsigned char[512];
}
CLiuqiuliangView::~CLiuqiuliangView()
{
USBDevice->Close(); //关闭USB设备
delete m_pCanvas;
delete DataArray;
}
void CLiuqiuliangView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLiuqiuliangView)
DDX_Control(pDX, IDC_EDIT_DATACOUNTER, m_editCounter);
DDX_Control(pDX, IDC_EDIT_DATA, m_editData);
DDX_Text(pDX, IDC_EDIT_DATA, m_nData);
DDX_Text(pDX, IDC_EDIT_DATACOUNTER, m_nCounter);
//}}AFX_DATA_MAP
}
BOOL CLiuqiuliangView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CLiuqiuliangView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
/* ((CWnd *)GetDlgItem(IDC_PICTURE))->GetWindowRect(&m_rcDraw);
ScreenToClient(&m_rcDraw);
m_pCanvas->InitRect(&m_rcDraw);
m_pCanvas->DrawBack(RGB(0,0,0));//pDoc->waveBkColor);
m_pCanvas->DrawXGrid(RGB(255,255,255),0);
m_pCanvas->DrawYGrid(RGB(255,255,255),0);*/
((CWnd *)GetDlgItem(IDC_PICTURE))->GetWindowRect(&m_rcDraw);
ScreenToClient(&m_rcDraw);
m_rcDraw.left += 5;
m_rcDraw.right -=5;
m_rcDraw.top += 5;
m_rcDraw.bottom -= 5;
m_pCanvas->InitRect(&m_rcDraw);
m_pCanvas->DrawBack(RGB(0,0,0));
m_pCanvas->DrawXGrid(RGB(255,255,255),10);
m_pCanvas->DrawYGrid(RGB(255,255,255),10);
m_nData = 0;
m_nCounter = 0;
UpdateData(FALSE);
m_editData.SetWindowText("");
m_editData.SetFocus();
m_editCounter.SetReadOnly(TRUE);
ReadThread=NULL;
USBDevice = new CCyUSBDevice(m_hWnd); //USB设备
ept = USBDevice->ControlEndPt; //USB控制端点
m_bStart = FALSE;
OutEndpt=USBDevice->EndPoints[2];
OutEndpt->TimeOut = 1000;
}
/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView printing
BOOL CLiuqiuliangView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLiuqiuliangView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLiuqiuliangView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CLiuqiuliangView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView diagnostics
#ifdef _DEBUG
void CLiuqiuliangView::AssertValid() const
{
CFormView::AssertValid();
}
void CLiuqiuliangView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CLiuqiuliangDoc* CLiuqiuliangView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLiuqiuliangDoc)));
return (CLiuqiuliangDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView message handlers
void CLiuqiuliangView::OnButtonDraw()
{
// TODO: Add your control notification handler code here
/* if(m_nCounter>1)
{
int max = -10000;//求出输入数据的最大值
int min = 10000;
for(int i =0;i<m_nCounter;i++)
{
if(DataArray[i]>max)
max = DataArray[i];
if(DataArray[i]<min)
min = DataArray[i];
}
m_pCanvas->SetXRange(0, m_nCounter);
m_pCanvas->SetYRange(min, max);
m_pCanvas->DrawPoly(DataArray, m_nCounter, RGB(255,255,0), 0);
InvalidateRect(&m_rcDraw,FALSE);
m_nCounter = 0;
UpdateData(FALSE);
m_editData.SetWindowText("");
}*/
m_bStart = !m_bStart;
if(m_bStart)
{
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0xAB; //请求码
ept->Value = 0;
ept->Index = 0;
PUCHAR buf=new UCHAR[2];
ZeroMemory(buf, 2);
LONG buflen = 2;
buf[0]=0xAB;
buf[1]=0x01; //启动Start
ept->XferData(buf,buflen); //自定义数据传输
delete buf;
}
else
{
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0xAB; //请求码
ept->Value = 0;
ept->Index = 0;
PUCHAR buf=new UCHAR[2];
ZeroMemory(buf, 2);
LONG buflen = 2;
buf[0]=0xAB;
buf[1]=0x00; //结束Start
ept->XferData(buf,buflen);
delete buf;
}
// mFile.Open("FileRecevieTest.txt",CFile::modeWrite|CFile::modeCreate);
//打开文件
// mFile.SetLength(0); //文件清空
}
void CLiuqiuliangView::OnButtonSave()
{
// TODO: Add your control notification handler code here
if(USBDevice->IsOpen()) //USB是否打开
SetDlgItemText(IDC_STATIC,"USB设备已经连接!");
else
SetDlgItemText(IDC_STATIC,"未连接USB设备!");
int vID,pID;
CString str;
vID=USBDevice->VendorID; //读取VID
pID=USBDevice->ProductID; //读取PID
str.Format("VendorID=0x%x",vID);
SetDlgItemText(IDC_STATIC1,str);
str.Format("ProductID=0x%x",pID);
SetDlgItemText(IDC_STATIC2,str);
PCHAR dn=new CHAR[256];
dn=USBDevice->DeviceName; //读取设备名称
str.Format("设备名称:%s",dn);
SetDlgItemText(IDC_STATIC3,str);
}
/*void CLiuqiuliangView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd* pWnd=GetDlgItem(IDC_PICTURE);
CDC* pControlDC = pWnd->GetDC();
// pWnd->Invalidate();
// pWnd->UpdateWindow();
// pControlDC->SelectStockObject(WHITE_BRUSH);
// pControlDC->Rectangle(0,0,10,10);
DisplayCanvas(pControlDC);
pWnd->ReleaseDC(pControlDC);
// Do not call CFormView::OnPaint() for painting messages
}*/
void CLiuqiuliangView::DisplayCanvas(CDC* pDC)
{
m_pCanvas->BitBlt(pDC,&m_rcDraw);
}
void CLiuqiuliangView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
DisplayCanvas(pDC);
}
void CLiuqiuliangView::OnButtonClear()
{
// TODO: Add your control notification handler code here
/* m_pCanvas->DrawBack(RGB(0,0,0));
m_pCanvas->DrawXGrid(RGB(255,255,255),10);
m_pCanvas->DrawYGrid(RGB(255,255,255),10);
InvalidateRect(&m_rcDraw,FALSE);*/
if (ReadThread)
{
ReadThreadLooping = false;
ReadThread=NULL; //线程结束
SetDlgItemText(IDC_EDIT1,"传输完毕!");
}
else
{
if (USBDevice->IsOpen()) { //检测USB是否打开
ReadThreadLooping = true;
ReadThread = AfxBeginThread(ReadThreadLoop, this); //开启线程
SetDlgItemText(IDC_EDIT1,"正在传输!");
}
}
}
void CLiuqiuliangView::OnButtonSenddata()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
char bytes=m_nData;
long len =512;
for(int i=0;i<len;i++)
DataArray[i]=bytes;
bool okout = OutEndpt->XferData(DataArray,len);
if(okout)
MessageBox("ok");
else
MessageBox("out failed");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -